Chapter1:了解SQL
數(shù)據(jù)類型兼容
數(shù)據(jù)類型及其名稱是SQL不兼容的一個(gè)主要原因。雖然大多數(shù)基本數(shù)據(jù)類型得到了一致的支持,但是很多高級(jí)的數(shù)據(jù)類型卻沒有。更糟的是,偶爾會(huì)有相同的數(shù)據(jù)類型在不同的DBMS中具有不同的名稱。對(duì)此用戶毫無辦法,重要的是在創(chuàng)建表結(jié)構(gòu)時(shí)要記住這些差異。
主鍵(primary key)
主鍵用來表示一個(gè)特定的列。表中的任何一列都可以成為主鍵,只要它具有以下條件:
- 任意兩行都不具有相同的主鍵值;
- 每一行必須具有一個(gè)主鍵值(主鍵列不允許NULL值);
- 主鍵列中的值不允許修改或更新
- 主鍵值不能重用(如果某行從表中刪除,它的主鍵不能賦給以后的新行)
Chapter2:檢索數(shù)據(jù)
SELECT DISTINCT vend_id, prod_price
FROM Products
LIMIT 3 OFFSET 4;
SQL語句和大小寫
SQL語句不區(qū)分大小寫,因此SELECT與select是相同的。同樣,寫成Select也沒有關(guān)系。許多SQL開發(fā)人員喜歡對(duì)SQL關(guān)鍵字使用大寫,而對(duì)列名和表名使用小寫,這樣做使得代碼更易于閱讀和調(diào)試。不過,一定要認(rèn)識(shí)到,SQL不區(qū)分大小寫,但是表名、列名和值可能有所不同(這依賴于具體的DBMS及其設(shè)置)。
當(dāng)心逗號(hào)
在選擇多列時(shí),一定要在列名之間加上逗號(hào),但最后一個(gè)列名后不加。如果在最后一個(gè)列名之后加了逗號(hào),就會(huì)出現(xiàn)錯(cuò)誤。
數(shù)據(jù)表示
SQL語句一般返回原始的、無格式的數(shù)據(jù)。數(shù)據(jù)的格式化是表示問題,而不是檢索問題。因此,表示一般在顯示數(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 語句中最后一條子句。如果它不是最后的子句,將會(huì)出現(xiàn)錯(cuò)誤信息。通常, ORDER BY 子句中使用的列將是為現(xiàn)實(shí)而選擇的列。但是,實(shí)際上用非檢索列排序數(shù)據(jù)是完全合法的。ORDER BY 子句還可以通過多列進(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:過濾數(shù)據(jù)
WHERE 子句操作符
| 操作符 | 說明 | 操作符 | 說明 |
|---|---|---|---|
| = | 等于 | > | 大于 |
| <> | 不等于 | >= | 大于等于 |
| != | 不等于 | !> | 不大于 |
| < | 小于 | BETWEEN | 在指定的兩個(gè)值之間 |
| <= | 小于等于 | IS NULL | 為NULL值 |
| !< | 不小于 |
字符串比較
SELECT vend_id, prod_name
FROM Products
WHERE vennd_id != 'DLL01'
提示:WHERE 子句中,單引號(hào)用來限定字符串。如果將值與字符串類型的列比較,就需要限定引號(hào)。而用來與數(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匹配范圍中所有的值,包括開始值和結(jié)束值。
空值檢查
在創(chuàng)建表時(shí),表的設(shè)計(jì)人員可以指定其中的列能否不包含值。在一個(gè)列不包含值時(shí),成其包含空值NULL。
確定值是否為空值不能簡單的檢查是否=NULL。SELECT語句中有一個(gè)特殊的WHERE子句,可用來檢查具有NULL值得列。這個(gè)WHERE子句時(shí)IS NULL子句。
SELECT cust_name
FROM Customers
WHERE cust_email IS NULL
注意:NULL和非匹配
通過過濾選擇不包含指定值的所有行時(shí),你可能希望返回含有NULL值的列。但是,這做不到。因?yàn)閡nknown有特殊的含義,數(shù)據(jù)庫不知道它們是否匹配,所以在進(jìn)行匹配過濾時(shí)不會(huì)返回這些結(jié)果。
過濾數(shù)據(jù)時(shí),一定要驗(yàn)證被過濾列中含NULL的行的確出現(xiàn)在返回?cái)?shù)據(jù)中。
Chapter5:高級(jí)數(shù)據(jù)過濾
AND
用在WHERE子句中的關(guān)鍵字,用來檢索滿足所有給定條件的行。
OR
用在WHERE子句中的關(guān)鍵字,用來檢索匹配任意給定條件的行。
IN
IN 操作符用來指定條件范圍,范圍中的每個(gè)條件都可以進(jìn)行匹配 。IN 取一組由逗號(hào)分隔、括在圓括號(hào)中的合法值。
IN 操作符的優(yōu)點(diǎn):
- 在有很多合法項(xiàng)時(shí), IN 操作符的語法更清楚,更直觀。
- 在與其他AND 和 OR 操作符組合使用 IN 時(shí)求值順序更容易管理。
- IN 操作符一般比一組OR操作符執(zhí)行的更快。
- IN 操作符可以包含其它 SELECT 語句,能夠更動(dòng)態(tài)地建立WHERE子句。
NOT
WHERE 子句中用來否定其后條件的關(guān)鍵字。
分析:為什么使用 NOT ?
在與 IN 操作符聯(lián)合使用時(shí), NOT 可以非常簡單的找出與條件列表不匹配的行。
Chapter6:用通配符進(jìn)行過濾
通配符只能用于文本字段(字符串),非文本數(shù)據(jù)類型字段不能使用通配符搜索。
%
%表示任何字符出現(xiàn)任意次數(shù)。%看起來好像可以匹配任何東西i,但是有個(gè)例外,那就是NULL。子句WHERE prod_name LIKE '%' 不會(huì)匹配NULL的行。
_
_剛好匹配一個(gè)字符,不能多也不能少。
[]
[]用來指定一個(gè)字符集,它必須匹配指定位置的一個(gè)字符。
通配符使用技巧
- 不要過度使用通配符。在其他操作符可以達(dá)到相同目的時(shí),應(yīng)使用其他操作符。
- 確定需要使用操作符時(shí),盡量不要把它們用在搜索模式的開始處。把通配符放在開始處,搜索起來最慢。