|
對(duì)于一名程序員而言,數(shù)據(jù)庫(kù)是最基本的知識(shí)之一,但是很多開(kāi)發(fā)者對(duì)于數(shù)據(jù)庫(kù)的了解僅限于使用上面,對(duì)于其內(nèi)部的很多定義和知識(shí),并不是十分清楚,那么,我們就來(lái)看一看數(shù)據(jù)庫(kù)的一些相關(guān)知識(shí)吧。 一、SQL標(biāo)準(zhǔn)有幾個(gè)版本 SQL(Structure Query Language)結(jié)構(gòu)化查詢語(yǔ)言是數(shù)據(jù)庫(kù)的核心語(yǔ)言,所有的結(jié)構(gòu)化數(shù)據(jù)庫(kù)都離不開(kāi)SQL語(yǔ)言的幫助,從誕生到現(xiàn)在,SQL標(biāo)準(zhǔn)發(fā)生了一系列變化。其歷史沿革如下。 1986年,ANSI X3.135-1986,ISO/IEC 9075:1986,SQL-86 1989年,ANSI X3.135-1989,ISO/IEC 9075:1989,SQL-89 1992年,ANSI X3.135-1992,ISO/IEC 9075:1992,SQL-92(SQL2) 1999年,ISO/IEC 9075:1999,SQL:1999(SQL3) 2003年,ISO/IEC 9075:2003,SQL:2003 2008年,ISO/IEC 9075:2008,SQL:2008 2011年,ISO/IEC 9075:2011,SQL:2011 2016年ISO又對(duì)SQL標(biāo)準(zhǔn)做了補(bǔ)充修訂。 二、Catalog和Schema的區(qū)別是什么 很多人建了數(shù)據(jù)庫(kù)之后,就只對(duì)表進(jìn)行操作,對(duì)于數(shù)據(jù)庫(kù)的一些結(jié)構(gòu)一知半解,尤其是很多人其實(shí)不明白Schema到底是個(gè)啥意思。下面我們具體來(lái)看一看。 Catalog直譯為產(chǎn)品目錄或編目,包含所有數(shù)據(jù)庫(kù)自有的Schema和用戶自建的Schema。 Schema直譯為模式,可以理解為表空間,所有的數(shù)據(jù)庫(kù)對(duì)象(表、視圖、字段等)都包含在Schema里。 所以對(duì)于一個(gè)很容易重名的字段,例如用戶ID,他的完全限定名稱就是catalog名.schema名.表名.用戶ID。這樣就保證了命名不會(huì)沖突。 在SQL標(biāo)準(zhǔn)的規(guī)定里面,Catalog包含Schema,還包含外部服務(wù)器信息、和外部數(shù)據(jù)封裝信息。而實(shí)際上各大關(guān)系數(shù)據(jù)庫(kù)廠商并沒(méi)有嚴(yán)格按歸標(biāo)準(zhǔn)來(lái)執(zhí)行,而且相互之間有很大差異。 例如: 在MySQL里面,用server instance來(lái)取代catalog,作為數(shù)據(jù)庫(kù)的集合。而database==schema==catalog,作為數(shù)據(jù)表空間。 在Oracle里面,server instance== database ==catalog,而Schema則是數(shù)據(jù)庫(kù)里的表空間,與用戶賬戶相關(guān)聯(lián)。 在Postgresql里面,Server instance == db cluster是一系列數(shù)據(jù)庫(kù)的集合,database==catalog,是db cluster中的一個(gè)獨(dú)立數(shù)據(jù)庫(kù),schema則是database中的一個(gè)命名空間,可以讓用戶與其它用戶的數(shù)據(jù)區(qū)別開(kāi)來(lái)。在Postgresql里,對(duì)一個(gè)對(duì)象的完全限定是通過(guò)database.schema.object來(lái)實(shí)現(xiàn)的。 三、SQL語(yǔ)言包括幾個(gè)類(lèi)型 SQL語(yǔ)言大家都會(huì)寫(xiě),但是其中分成幾個(gè)部分,可能很多人就不是很清楚了。尤其是指針控制指令,可能一些人在自己的程序員生涯中壓根就沒(méi)接觸下。下面我們具體來(lái)看一看SQL語(yǔ)言包括的幾個(gè)類(lèi)型吧。 1、數(shù)據(jù)查詢語(yǔ)言(DQL: Data Query Language):例如select <字段> from <表> where <條件> 2、數(shù)據(jù)操縱語(yǔ)言(DML:Data Manipulation Language):例如Insert、Update、Delete 3、事務(wù)處理語(yǔ)言(DPL:Transaction Processing Language):例如BEGIN TRANSACTION、COMMIT和ROLLBACK 4、數(shù)據(jù)控制語(yǔ)言(DCL:Data Control Language):例如Grant、Revoke 5、數(shù)據(jù)定義語(yǔ)言(DDL:Data Definition Language):例如Create、Drop 6、指針控制語(yǔ)言(Cursor Control Language, CCL):例如DECLARE CURSOR、FETCH INTO和UPDATE WHERE CURRENT
四、SQL語(yǔ)言中有幾種數(shù)據(jù)類(lèi)型 數(shù)據(jù)類(lèi)型大家都很清楚,但是在標(biāo)準(zhǔn)定義中的數(shù)據(jù)類(lèi)型,尤其是Interval類(lèi)型,可能很多人就不了解了。 SQL語(yǔ)言中包含三大類(lèi)數(shù)據(jù)類(lèi)型:預(yù)定義數(shù)據(jù)類(lèi)型、構(gòu)造數(shù)據(jù)類(lèi)型和自定義數(shù)據(jù)類(lèi)型。 其中預(yù)定義數(shù)據(jù)類(lèi)型包括7種類(lèi)型:數(shù)值、字符串、二進(jìn)制串、布爾、日期、間隔、XML。 五、Limit關(guān)鍵字是所有數(shù)據(jù)庫(kù)通用的嗎 Limit關(guān)鍵字是很多人常用的,但是換了數(shù)據(jù)庫(kù),這個(gè)關(guān)鍵字還能正常使用嗎?答案是否定的。 Limit關(guān)鍵字并不是所有數(shù)據(jù)庫(kù)通用的,Sql server選擇前n條就是select top n。 六、MySQL里面的utf8字符集是“UTF-8”嗎? 很多初學(xué)者建數(shù)據(jù)庫(kù)的時(shí)候,想當(dāng)然就把字符集指定為utf8了,然后可能就會(huì)出現(xiàn)一些亂碼問(wèn)題,在中文互聯(lián)網(wǎng)界,可能問(wèn)題更容易出現(xiàn),為什么呢? 事實(shí)上,MySQL里面的utf8編碼并不是真正的UTF-8,而另外的utf8mb4才是真正的UTF-8編碼,因此使用MySQL或MariaDB的時(shí)候,一定要把字符集設(shè)置成utf8mb4,否則可能會(huì)出現(xiàn)亂碼問(wèn)題。 為什么會(huì)出現(xiàn)這個(gè)問(wèn)題嗎?原因在于早期MySQL開(kāi)發(fā)的時(shí)候,由于節(jié)省空間以及效率等問(wèn)題,將utf8字符集限制為3個(gè)字節(jié),而實(shí)際最新的UTF-8規(guī)范使用1到4個(gè)字節(jié),這就導(dǎo)致MySQL的utf8字符集無(wú)法兼容4個(gè)字節(jié)的編碼,最后在MySQL 5.5.3以后的版本中,發(fā)布了utf8mb4字符集來(lái)解決這個(gè)問(wèn)題。所以對(duì)于使用者來(lái)講,utf8字符集只用于兼容早期的數(shù)據(jù)庫(kù),而新開(kāi)發(fā)者都應(yīng)該使用utf8mb4字符集。 以上就是一些數(shù)據(jù)庫(kù)的相關(guān)知識(shí),大家之前都了解嗎? 活在信息時(shí)代的其它文章: 程序員必備技能之?dāng)?shù)據(jù)庫(kù)的一點(diǎn)小事 Google Docs的神奇bug,只需要重復(fù)幾下這個(gè)常用單詞就會(huì)崩潰 大數(shù)據(jù)最主要的三個(gè)工程問(wèn)題,弄懂之后年薪百萬(wàn)不是夢(mèng) |
|
|