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)講吧。
在公司里,我們有部門、小組、員工這幾個(gè)實(shí)體,而這幾個(gè)實(shí)體之間都是有一定關(guān)系的。例如:一個(gè)部門能有多個(gè)小組,一個(gè)小組有多個(gè)員工,所以部門和小組之間的關(guān)系是N:N的關(guān)系。于此類似,小組與員工也是N:N的關(guān)系。
關(guān)系型數(shù)據(jù)庫(kù)的發(fā)展歷程
在1979年,Larry Ellison 使用匯編和C語(yǔ)言主導(dǎo)開發(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)槠溟_源、免費(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ù)見的未來(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ì)選擇用錢購(gòu)買解決方案,而不是自己雇傭人員使用 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ì),性能高(保持開放平臺(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)、政府部門、銀行、醫(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ù)字段類型如下:
| 字段類型 | 中文說(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ú)千蟲問(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ù)字類型 P為總位數(shù),S為小數(shù)位數(shù) | ||
| DECIMAL(P,S) | 數(shù)字類型 P為總位數(shù),S為小數(shù)位數(shù) | ||
| INTEGER | 整數(shù)類型 | 小的整數(shù) | |
| FLOAT | 浮點(diǎn)數(shù)類型 | NUMBER(38),雙精度 | |
| REAL | 實(shí)數(shù)類型 | NUMBER(63),精度更高 |
補(bǔ)充:varchar和varchar2區(qū)別
- varchar是標(biāo)準(zhǔn)sql里面的。 varchar2是Oracle提供的獨(dú)有的數(shù)據(jù)類型;
- 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ǔ)句中可以沒有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的性能比較?