Q:什么是關(guān)系型數(shù)據(jù)庫(kù)匀归?
【拓展】簡(jiǎn)述關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)
關(guān)系型數(shù)據(jù)庫(kù)(Relational DataBase Management System)迫悠,簡(jiǎn)稱 RDBMS边锁。說(shuō)起關(guān)系型數(shù)據(jù)庫(kù)递宅,我們腦海中會(huì)立即浮現(xiàn)出 Oracle、MySQL港华、SQLServer 等數(shù)據(jù)庫(kù)脾歇,這些都是我們常用的關(guān)系型數(shù)據(jù)庫(kù)。
關(guān)系型數(shù)據(jù)庫(kù)逗旁,是指采用了關(guān)系模型來(lái)組織數(shù)據(jù)的數(shù)據(jù)庫(kù)嘿辟,其以行和列的形式存儲(chǔ)數(shù)據(jù),以便于用戶理解片效,關(guān)系型數(shù)據(jù)庫(kù)這一系列的行和列被稱為表红伦,一組表組成了數(shù)據(jù)庫(kù)。用戶通過(guò)查詢來(lái)檢索數(shù)據(jù)庫(kù)中的數(shù)據(jù)淀衣,而查詢是一個(gè)用于限定數(shù)據(jù)庫(kù)中某些區(qū)域的執(zhí)行代碼昙读。關(guān)系模型可以簡(jiǎn)單理解為二維表格模型,而一個(gè)關(guān)系型數(shù)據(jù)庫(kù)就是由二維表及其之間的關(guān)系組成的一個(gè)數(shù)據(jù)組織膨桥。
關(guān)系型數(shù)據(jù)庫(kù)最大的特點(diǎn)就是在其關(guān)系這個(gè)詞蛮浑,它可以保存數(shù)據(jù)庫(kù)中的各種關(guān)系。那么這個(gè)關(guān)系如何理解呢只嚣?我們就拿公司這個(gè)組織來(lái)講吧陵吸。
在公司里,我們有部門(mén)介牙、小組壮虫、員工這幾個(gè)實(shí)體,而這幾個(gè)實(shí)體之間都是有一定關(guān)系的。例如:一個(gè)部門(mén)能有多個(gè)小組囚似,一個(gè)小組有多個(gè)員工剩拢,所以部門(mén)和小組之間的關(guān)系是N:N的關(guān)系。于此類(lèi)似饶唤,小組與員工也是N:N的關(guān)系徐伐。
關(guān)系型數(shù)據(jù)庫(kù)的發(fā)展歷程
在1979年,Larry Ellison 使用匯編和C語(yǔ)言主導(dǎo)開(kāi)發(fā)了第一個(gè)商用關(guān)系型數(shù)據(jù)庫(kù) Oracle募狂。在此之后的接近16年內(nèi)的時(shí)間办素,Oracle 數(shù)據(jù)庫(kù)一路奔跑,成為了世界上最流行的關(guān)系型數(shù)據(jù)庫(kù)祸穷。
在1989年性穿,微軟(Microsoft)也發(fā)布了一個(gè)關(guān)系型數(shù)據(jù)庫(kù) SQL Server,但其同樣也是一個(gè)收費(fèi)的商業(yè)型數(shù)據(jù)庫(kù)雷滚。
直到1995年需曾,瑞典公司MySQL AB發(fā)布了 MySQL 數(shù)據(jù)庫(kù)的第一個(gè)版本,從此終結(jié)了關(guān)系型數(shù)據(jù)庫(kù)只能用 Oracle祈远、SQL Server 這些收費(fèi)軟件的神話呆万。
在 MySQL 誕生后,因?yàn)槠溟_(kāi)源车份、免費(fèi)的特性谋减,所以其得到了眾多中小使用者的擁護(hù),其用戶量增長(zhǎng)迅猛扫沼。而在這期間逃顶,MySQL的主人也幾易其手。
在2008年充甚,Sun 公司收購(gòu)了 MySQL AB 公司,同時(shí)也獲得了 MySQL 數(shù)據(jù)庫(kù)的管理權(quán)霸褒。在 2010 年的時(shí)候伴找,Oracle 公司收購(gòu)了 Sun 公司,獲得了 MySQL 的管理權(quán)废菱。
而就在 Oracle 收購(gòu) Sun 公司的當(dāng)天技矮,因?yàn)閾?dān)心被 Oracle 收購(gòu)后MySQL的前景會(huì)受到限制,被稱為 MySQL 之父的 Michael Widenius fork 了 MySQL 的一個(gè)分支殊轴,啟動(dòng)了 MariaDB 項(xiàng)目衰倦。
果不其然,在被收購(gòu)不久后旁理,MySQL隨即推出了相關(guān)的收費(fèi)版本樊零。雖然原來(lái)的免費(fèi)版本仍然可以使用,但在可預(yù)見(jiàn)的未來(lái),Oracle 投入到 MySQL 中的精力可能很有限驻襟。畢竟Oracle是一個(gè)商業(yè)公司夺艰,也是要養(yǎng)家糊口的。
現(xiàn)在我們可以了解到現(xiàn)在主流關(guān)系型數(shù)據(jù)庫(kù)的誕生和發(fā)展概況沉衣,主要可以分為下面幾個(gè)階段:
- 1979年郁副,Oracle 數(shù)據(jù)庫(kù)誕生;
- 1989年豌习,SQL Server 數(shù)據(jù)庫(kù)誕生存谎;
- 1995年,MySQL 數(shù)據(jù)庫(kù)誕生肥隆;
……
Q:你認(rèn)為的關(guān)系型數(shù)據(jù)庫(kù)的市場(chǎng)份額排名既荚?
https://db-engines.com/en/ranking
Q:為什么使用Oracle?
MySQL這么好巷屿,為什么還有人用Oracle固以?
為什么大部分公司的數(shù)據(jù)庫(kù)系統(tǒng)仍然要用Oracle?我認(rèn)為Oracle之所以能占有這么大的市場(chǎng)份額嘱巾,是因?yàn)槠湓诤A繑?shù)據(jù)的處理上更具有優(yōu)勢(shì)憨琳,并且能提供一整套的數(shù)據(jù)存儲(chǔ)解決方案。
在一些非常大的企業(yè)里旬昭,這些企業(yè)通常擁有龐大的資金能力篙螟,所以它們會(huì)選擇用錢(qián)購(gòu)買(mǎi)解決方案,而不是自己雇傭人員使用 MySQL 去維護(hù)(當(dāng)然現(xiàn)在也有很多大廠傾向去Oracle而使用MySQL)问拘。
總的來(lái)說(shuō)遍略,Oracle比起MySQL具有下面的優(yōu)點(diǎn):
- 眾多的數(shù)據(jù)庫(kù)特性,能滿足企業(yè)的多樣性需求骤坐;
- 海量數(shù)據(jù)處理的優(yōu)勢(shì)绪杏,性能高(保持開(kāi)放平臺(tái)下TPC-D和TPC-C世界記錄);
- 一整套數(shù)據(jù)解決方案纽绍;
-
更加安全(最高認(rèn)證級(jí)別的ISO標(biāo)準(zhǔn)認(rèn)證)
……
因?yàn)镺racle有上面這些特性蕾久,所以O(shè)racle更加適合那些大型企業(yè)。因?yàn)檫@些企業(yè)資金充足拌夏,能承擔(dān)得起Oracle的昂貴費(fèi)用僧著。另一方面,這些企業(yè)的數(shù)據(jù)量也是非常龐大障簿,它們更注重?cái)?shù)據(jù)的安全性和高效存儲(chǔ)盹愚,并且關(guān)心的出現(xiàn)問(wèn)題的時(shí)候能快速解決,Oracle提供的一系列服務(wù)正好符合它們的需求站故。在國(guó)內(nèi)皆怕,金融機(jī)構(gòu)、政府部門(mén)、銀行端逼、醫(yī)院等機(jī)構(gòu)常選擇使用Oracle朗兵。
而對(duì)于一些中小型企業(yè)或者個(gè)人使用者來(lái)說(shuō),一方面Oracle軟件非常笨重顶滩,另一方面Oracle授權(quán)費(fèi)用昂貴余掖,對(duì)于它們來(lái)說(shuō)無(wú)法承受。而它們的數(shù)據(jù)庫(kù)又恰好不是特別大礁鲁,所以對(duì)于這些使用者來(lái)說(shuō)盐欺,使用MySQL已經(jīng)能夠解決它們的需求了。那么也就無(wú)需去付費(fèi)使用Oracle的數(shù)據(jù)庫(kù)了仅醇。如果單純從(關(guān)系型)數(shù)據(jù)庫(kù)性能來(lái)進(jìn)行比較的話冗美,Oracle無(wú)疑是最牛逼的,畢竟Oracle比MySQL誕生早了10多年析二,歷史地位在這里擺著呢粉洼,所以學(xué)習(xí)掌握Oracle是很有必要的。
Oracle常用的數(shù)據(jù)庫(kù)字段類(lèi)型如下:
字段類(lèi)型 | 中文說(shuō)明 | 限制條件 | 其他說(shuō)明 |
---|---|---|---|
CHAR | 固定長(zhǎng)度字符串 | 最大長(zhǎng)度2000 bytes | |
VARCHAR2 | 可變長(zhǎng)度的字符串 | 最大長(zhǎng)度4000 bytes | 可做索引的最大長(zhǎng)度749 |
NCHAR | 根據(jù)字符集而定的固定長(zhǎng)度字符串 | 最大長(zhǎng)度2000 bytes | |
NVARCHAR2 | 根據(jù)字符集而定的可變長(zhǎng)度字符串 | 最大長(zhǎng)度4000 bytes | |
DATE | 日期(日-月-年) | DD-MM-YY(HH-MM-SS) | 無(wú)千蟲(chóng)問(wèn)題 |
TIMESTAMP | 時(shí)間戳 | 可存儲(chǔ)時(shí)區(qū)和秒的小數(shù)位 | 0-9位小數(shù)叶摄,默認(rèn)是6位 |
LONG | 超長(zhǎng)字符串 | 最大長(zhǎng)度2G(231-1) | |
RAW | 固定長(zhǎng)度的二進(jìn)制數(shù)據(jù) | 最大長(zhǎng)度2000 bytes | 可存放多媒體圖象聲音等 |
LONG RAW | 可變長(zhǎng)度的二進(jìn)制數(shù)據(jù) | 最大長(zhǎng)度2G | 同上 |
BLOB | 二進(jìn)制數(shù)據(jù) | 最大長(zhǎng)度4G | |
CLOB | 字符數(shù)據(jù) | 最大長(zhǎng)度4G | |
NCLOB | 根據(jù)字符集而定的字符數(shù)據(jù) | 最大長(zhǎng)度4G | |
BFILE | 存放在數(shù)據(jù)庫(kù)外的二進(jìn)制數(shù)據(jù) | 最大長(zhǎng)度4G | |
ROWID | 數(shù)據(jù)表中記錄的唯一行號(hào) | 10 bytes | ********.****.****格式属韧,*為0或1 |
NROWID | 二進(jìn)制數(shù)據(jù)表中記錄的唯一行號(hào) | 最大長(zhǎng)度4000 bytes | |
NUMBER(P,S) | 數(shù)字類(lèi)型 P為總位數(shù),S為小數(shù)位數(shù) | ||
DECIMAL(P,S) | 數(shù)字類(lèi)型 P為總位數(shù)蛤吓,S為小數(shù)位數(shù) | ||
INTEGER | 整數(shù)類(lèi)型 | 小的整數(shù) | |
FLOAT | 浮點(diǎn)數(shù)類(lèi)型 | NUMBER(38)宵喂,雙精度 | |
REAL | 實(shí)數(shù)類(lèi)型 | NUMBER(63),精度更高 |
補(bǔ)充:varchar和varchar2區(qū)別
- varchar是標(biāo)準(zhǔn)sql里面的会傲。 varchar2是Oracle提供的獨(dú)有的數(shù)據(jù)類(lèi)型锅棕;
- varchar對(duì)于漢字占兩個(gè)字節(jié),對(duì)于英文是一個(gè)字節(jié)淌山,占的內(nèi)存新懔恰;varchar2當(dāng)字符集為UTF-8時(shí)泼疑,一個(gè)中文占三個(gè)字節(jié)德绿,當(dāng)字符集為ZHS16GBK時(shí),一個(gè)中文占兩個(gè)字節(jié)王浴;
- varchar對(duì)空串不處理,varchar2將空串當(dāng)做null來(lái)處理梅猿;
- varchar存放固定長(zhǎng)度的字符串氓辣,最大長(zhǎng)度是2000,varchar2是存放可變長(zhǎng)度的字符串袱蚓,最大長(zhǎng)度是4000钞啸;
- 如果是要跟換不同的數(shù)據(jù)庫(kù),例如mysql,那么就用varchar体斩,如果就用oracle梭稚,那么用varchar2比較好一點(diǎn)。
- MySQL查詢語(yǔ)句中可以沒(méi)有from絮吵,Oracle 必須有弧烤;
eg:MySQL查詢當(dāng)前時(shí)間:SELECT NOW();
Oracle查詢當(dāng)前時(shí)間:SELECT SYSDATE FROM DUAL;
- MySQL使用單引號(hào)和雙引號(hào)表示字符,Oracle只能使用單引號(hào)(sql標(biāo)準(zhǔn)中也是使用單引號(hào)表示字符)蹬敲;
- MySQL分頁(yè)使用
limit offset
暇昂,Oracle分頁(yè)得借助rownum
關(guān)鍵字; - MySQL自動(dòng)增長(zhǎng)auto_increment伴嗡,Oracle使用序列代替急波;
- MySQL 和Oracle
group by
語(yǔ)法不同;
……
其他資料:
Oracle和MySQL的函數(shù)對(duì)比和常用區(qū)別
Oracle 高效分頁(yè)查詢SQL
Oracle數(shù)據(jù)庫(kù)查詢高效分頁(yè)
TODO 處理海量數(shù)據(jù)Oracle和MySQL的性能比較瘪校?