Chapter1:了解SQL
數(shù)據(jù)類(lèi)型兼容
數(shù)據(jù)類(lèi)型及其名稱(chēng)是SQL不兼容的一個(gè)主要原因。雖然大多數(shù)基本數(shù)據(jù)類(lèi)型得到了一致的支持,但是很多高級(jí)的數(shù)據(jù)類(lèi)型卻沒(méi)有。更糟的是褐健,偶爾會(huì)有相同的數(shù)據(jù)類(lèi)型在不同的DBMS中具有不同的名稱(chēng)。對(duì)此用戶(hù)毫無(wú)辦法澜汤,重要的是在創(chuàng)建表結(jié)構(gòu)時(shí)要記住這些差異蚜迅。
主鍵(primary key)
主鍵用來(lái)表示一個(gè)特定的列。表中的任何一列都可以成為主鍵俊抵,只要它具有以下條件:
- 任意兩行都不具有相同的主鍵值谁不;
- 每一行必須具有一個(gè)主鍵值(主鍵列不允許NULL值);
- 主鍵列中的值不允許修改或更新
- 主鍵值不能重用(如果某行從表中刪除务蝠,它的主鍵不能賦給以后的新行)
Chapter2:檢索數(shù)據(jù)
SELECT DISTINCT vend_id, prod_price
FROM Products
LIMIT 3 OFFSET 4;
SQL語(yǔ)句和大小寫(xiě)
SQL語(yǔ)句不區(qū)分大小寫(xiě)拍谐,因此SELECT與select是相同的烛缔。同樣馏段,寫(xiě)成Select也沒(méi)有關(guān)系。許多SQL開(kāi)發(fā)人員喜歡對(duì)SQL關(guān)鍵字使用大寫(xiě)践瓷,而對(duì)列名和表名使用小寫(xiě)院喜,這樣做使得代碼更易于閱讀和調(diào)試。不過(guò)晕翠,一定要認(rèn)識(shí)到喷舀,SQL不區(qū)分大小寫(xiě)砍濒,但是表名、列名和值可能有所不同(這依賴(lài)于具體的DBMS及其設(shè)置)硫麻。
當(dāng)心逗號(hào)
在選擇多列時(shí)爸邢,一定要在列名之間加上逗號(hào),但最后一個(gè)列名后不加拿愧。如果在最后一個(gè)列名之后加了逗號(hào)杠河,就會(huì)出現(xiàn)錯(cuò)誤。
數(shù)據(jù)表示
SQL語(yǔ)句一般返回原始的浇辜、無(wú)格式的數(shù)據(jù)券敌。數(shù)據(jù)的格式化是表示問(wèn)題,而不是檢索問(wèn)題柳洋。因此待诅,表示一般在顯示數(shù)據(jù)的應(yīng)用程序中規(guī)定。通常很少直接使用實(shí)際檢索出的數(shù)據(jù)熊镣。
使用通配符
一般而言卑雁,除非你確實(shí)需要表中的每一列,否則最好別使用*通配符轧钓,因?yàn)闄z索不需要的列會(huì)降低檢索的性能序厉。
檢所不同的值
DISTINCT關(guān)鍵字必須直接放在列名前面,而且不能部分使用DISTICT毕箍,DISTINCT關(guān)鍵字作用與所有列弛房,不僅僅是跟在其后的那一列。
限制結(jié)果
LIMIT 3 OFFSET 4 --返回從第3行起的四個(gè)數(shù)據(jù)
LIMIT 3,4 --同上
LIMIT 0 OFFSET 1 --返回從第0行
第一個(gè)被檢索的行是第0行而柑,而不是第1行文捶。
注釋
-- 行內(nèi)注釋
# 單行注釋
/* 多行注釋 */
Chapter3:排序檢索數(shù)據(jù)
SELECT prod_name
FROM Products
ORDER BY prod_name DESC;
/*等價(jià)于*/
SELECT prod_name
FROM Products
ORDER BY 1;
注意:
在指定 ORDER BY 子句時(shí),應(yīng)該保證它是 SELECT 語(yǔ)句中最后一條子句媒咳。如果它不是最后的子句粹排,將會(huì)出現(xiàn)錯(cuò)誤信息。通常涩澡, ORDER BY 子句中使用的列將是為現(xiàn)實(shí)而選擇的列顽耳。但是,實(shí)際上用非檢索列排序數(shù)據(jù)是完全合法的妙同。ORDER BY 子句還可以通過(guò)多列進(jìn)行排序射富。此外, ORDER BY 還支持按相對(duì)位置進(jìn)行排序粥帚。這種排序方法的好處是不用重新輸入列名胰耗,但它也有缺點(diǎn)。首先芒涡,不明確給出列名有可能造成錯(cuò)用列名排序柴灯。其次卖漫,在對(duì)SELECT 清單進(jìn)行更改時(shí)容易錯(cuò)誤地對(duì)數(shù)據(jù)進(jìn)行排序(忘記ORDER BY 子句做相應(yīng)的改動(dòng))。最后赠群,如果進(jìn)行排序的列不在 SELECT 清單中羊始,顯然不能使用這項(xiàng)技術(shù)。
DESC 關(guān)鍵字用于指定降序排列查描。 這個(gè)關(guān)鍵字只應(yīng)用于直接位于其前面的列名店枣,如果想在多個(gè)列上進(jìn)行降序排列,必須對(duì)對(duì)每一列指定 DESC 關(guān)鍵字叹誉。
Chapter4:過(guò)濾數(shù)據(jù)
WHERE 子句操作符
操作符 | 說(shuō)明 | 操作符 | 說(shuō)明 |
---|---|---|---|
= | 等于 | > | 大于 |
<> | 不等于 | >= | 大于等于 |
!= | 不等于 | !> | 不大于 |
< | 小于 | BETWEEN | 在指定的兩個(gè)值之間 |
<= | 小于等于 | IS NULL | 為NULL值 |
!< | 不小于 |
字符串比較
SELECT vend_id, prod_name
FROM Products
WHERE vennd_id != 'DLL01'
提示:WHERE 子句中鸯两,單引號(hào)用來(lái)限定字符串。如果將值與字符串類(lèi)型的列比較长豁,就需要限定引號(hào)钧唐。而用來(lái)與數(shù)值列比較的值不用引號(hào)。
數(shù)值比較
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10
提示:在使用BETWEEN時(shí)匠襟,必須指定兩個(gè)值——所需范圍的低端值和高端值钝侠。這兩個(gè)值必須用AND關(guān)鍵字分隔。BETWEEN匹配范圍中所有的值酸舍,包括開(kāi)始值和結(jié)束值帅韧。
空值檢查
在創(chuàng)建表時(shí),表的設(shè)計(jì)人員可以指定其中的列能否不包含值啃勉。在一個(gè)列不包含值時(shí)忽舟,成其包含空值NULL。
確定值是否為空值不能簡(jiǎn)單的檢查是否=NULL淮阐。SELECT語(yǔ)句中有一個(gè)特殊的WHERE子句叮阅,可用來(lái)檢查具有NULL值得列。這個(gè)WHERE子句時(shí)IS NULL子句泣特。
SELECT cust_name
FROM Customers
WHERE cust_email IS NULL
注意:NULL和非匹配
通過(guò)過(guò)濾選擇不包含指定值的所有行時(shí)浩姥,你可能希望返回含有NULL值的列。但是状您,這做不到勒叠。因?yàn)閡nknown有特殊的含義,數(shù)據(jù)庫(kù)不知道它們是否匹配膏孟,所以在進(jìn)行匹配過(guò)濾時(shí)不會(huì)返回這些結(jié)果眯分。
過(guò)濾數(shù)據(jù)時(shí),一定要驗(yàn)證被過(guò)濾列中含NULL的行的確出現(xiàn)在返回?cái)?shù)據(jù)中骆莹。
Chapter5:高級(jí)數(shù)據(jù)過(guò)濾
AND
用在WHERE子句中的關(guān)鍵字颗搂,用來(lái)檢索滿(mǎn)足所有給定條件的行担猛。
OR
用在WHERE子句中的關(guān)鍵字幕垦,用來(lái)檢索匹配任意給定條件的行丢氢。
IN
IN 操作符用來(lái)指定條件范圍,范圍中的每個(gè)條件都可以進(jìn)行匹配 先改。IN 取一組由逗號(hào)分隔疚察、括在圓括號(hào)中的合法值。
IN 操作符的優(yōu)點(diǎn):
- 在有很多合法項(xiàng)時(shí)仇奶, IN 操作符的語(yǔ)法更清楚貌嫡,更直觀(guān)。
- 在與其他AND 和 OR 操作符組合使用 IN 時(shí)求值順序更容易管理该溯。
- IN 操作符一般比一組OR操作符執(zhí)行的更快岛抄。
- IN 操作符可以包含其它 SELECT 語(yǔ)句,能夠更動(dòng)態(tài)地建立WHERE子句狈茉。
NOT
WHERE 子句中用來(lái)否定其后條件的關(guān)鍵字夫椭。
分析:為什么使用 NOT ?
在與 IN 操作符聯(lián)合使用時(shí)氯庆, NOT 可以非常簡(jiǎn)單的找出與條件列表不匹配的行蹭秋。
Chapter6:用通配符進(jìn)行過(guò)濾
通配符只能用于文本字段(字符串),非文本數(shù)據(jù)類(lèi)型字段不能使用通配符搜索堤撵。
%
%表示任何字符出現(xiàn)任意次數(shù)仁讨。%看起來(lái)好像可以匹配任何東西i,但是有個(gè)例外实昨,那就是NULL洞豁。子句WHERE prod_name LIKE '%' 不會(huì)匹配N(xiāo)ULL的行。
_
_剛好匹配一個(gè)字符荒给,不能多也不能少族跛。
[]
[]用來(lái)指定一個(gè)字符集,它必須匹配指定位置的一個(gè)字符锐墙。
通配符使用技巧
- 不要過(guò)度使用通配符礁哄。在其他操作符可以達(dá)到相同目的時(shí),應(yīng)使用其他操作符溪北。
- 確定需要使用操作符時(shí)桐绒,盡量不要把它們用在搜索模式的開(kāi)始處。把通配符放在開(kāi)始處之拨,搜索起來(lái)最慢茉继。