第4章 過(guò)濾數(shù)據(jù)
4.1 WHERE 子句
根據(jù)需要提取表數(shù)據(jù)的子集,需要指定搜索條件(search criteria)及志。
- 在 SELECT 語(yǔ)句中昆稿,數(shù)據(jù)根據(jù) WHERE 子句中指定的搜索條件進(jìn)行過(guò)濾。
- WHERE 子句在表名(FROM 子句)之后給出荷腊。
SELECT prod_name, prod_price FROM Products
WHERE prod_price = 3.49;
分析
這條語(yǔ)句從 products 表中檢索兩個(gè)列绍移,但不返回所有行悄窃,只返回 prod_price 值為 3.49 的行,輸出:
注意
同時(shí)使用 ORDER BY 和 WHERE 子句時(shí)蹂窖,ORDER BY 應(yīng)位于 WHERE 之后轧抗,否則將出錯(cuò)。
4.2 WHERE 子句操作符
操作符 | 說(shuō)明 | 操作符 | 說(shuō)明 |
---|---|---|---|
= | 等于 | > | 大于 |
<> | 不等于 | >= | 大于等于 |
!= | 不等于 | !> | 不大于 |
< | 小于 | BETWEEN | 在指定的兩個(gè)值之間 |
<= | 小于等于 | IS NULL | 為NULL值 |
!< | 不小于 |
檢查單個(gè)值
列出所有價(jià)格小于等于 10 美元的產(chǎn)品瞬测。
SELECT prod_name, prod_price FROM Products
WHERE prod_price <= 10;
不匹配檢查
列出所有不是供應(yīng)商 DLL01 制造的產(chǎn)品:
SELECT vend_id, prod_name FROM Products
WHERE vend_id <> 'DLL01';
注意:何時(shí)使用引號(hào)
上述 WHERE 子句中的條件横媚,有的值括在單引號(hào)內(nèi),而有的值未括起來(lái)涣楷。
- 單引號(hào)用來(lái)限定字符串分唾。
- 將值與字符串類型的列進(jìn)行比較,就要限定引號(hào)狮斗。
- 將值與數(shù)值列進(jìn)行比較绽乔,不用引號(hào)。
范圍值檢索
要檢查某個(gè)范圍的值碳褒,使用 BETWEEN 操作符折砸。其語(yǔ)法與其他 WHERE 子句的操作符稍有不同看疗,因?yàn)樗枰獌蓚€(gè)值,即范圍的開(kāi)始值和結(jié)束值睦授。
例如两芳,BETWEEN 操作符可用來(lái)檢索價(jià)格在 5 美元和 10 美元之間的所有產(chǎn)品,或在指定的開(kāi)始日期和結(jié)束日期之間的所有日期去枷。
SELECT prod_name, prod_price FROM Products
WHERE prod_price BETWEEN 5 AND 10;
空值檢查
在創(chuàng)建表時(shí)怖辆,表設(shè)計(jì)人員可以指定其中的列能否不包含值。在一個(gè)列不包含值時(shí)删顶,稱其包含空值 NULL竖螃。確定值是否為 NULL,用 IS NULL 子句逗余。
SELECT prod_name FROM Products
WHERE prod_price IS NULL;
這條語(yǔ)句返回所有沒(méi)有價(jià)格(空 prod_price 字段特咆,不是價(jià)格為 0)的產(chǎn)品。
但是录粱,Customers 表包含具有 NULL 值的列:如果沒(méi)有電子郵件地址腻格,則 cust_email 列將包含 NULL 值:
SELECT cust_name FROM Customers
WHERE cust_email IS NULL;
第5章 高級(jí)數(shù)據(jù)過(guò)濾
5.1 組合 WHERE 子句
SQL 允許給出多個(gè) WHERE 子句,這些子句有兩種使用方式啥繁,即以 AND 子句或 OR 子句的方式使用菜职。
AND 操作符
SELECT prod_id, prod_price, prod_name FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= 4;
此 SQL 語(yǔ)句檢索由供應(yīng)商 DLL01 制造且價(jià)格小于等于 4 美元的所有產(chǎn)品的名稱和價(jià)格。
OR 操作符
許多 DBMS 在 OR WHERE 子句的第一個(gè)條件得到滿足的情況下输虱,就不再計(jì)算第二個(gè)條件了(在第一個(gè)條件滿足時(shí)些楣,不管第二個(gè)條件是否滿足,相應(yīng)的行都將被檢索出來(lái))宪睹。
SELECT prod_name, prod_price FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
求值順序
需要列出價(jià)格為10美元及以上,且由 DLL01 或 BRS01 制造的所有產(chǎn)品蚕钦。
SELECT prod_name, prod_price FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
AND prod_price >= 10;
上面結(jié)果返回的行中有 4 行價(jià)格小于 10 美元亭病,原因在于求值的順序。
- SQL 在處理 OR 操作符前嘶居,優(yōu)先處理 AND 操作符罪帖。
- SQL 理解 WHERE 子句為:由供應(yīng)商 BRS01 制造的價(jià)格為 10 美元以上的所有產(chǎn)品,以及由供應(yīng)商 DLL01 制造的所有產(chǎn)品邮屁,而不管其價(jià)格如何整袁。
- 由于 AND 在求值過(guò)程中優(yōu)先級(jí)更高,操作符被錯(cuò)誤地組合佑吝。
此問(wèn)題的解決方法是使用圓括號(hào)對(duì)操作符進(jìn)行明確分組:
SELECT prod_name, prod_price FROM Products
WHERE (vend_id = 'DLL01' OR vend_id= 'BRS01')
AND prod_price >= 10;
將前兩個(gè)條件用圓括號(hào)括起來(lái)坐昙,因?yàn)閳A括號(hào)具有比 AND 或 OR 操作符更高的求值順序,所以 DBMS 首先過(guò)濾圓括號(hào)內(nèi)的 OR 條件芋忿。
注意
任何時(shí)候使用具有 AND 和 OR 操作符的 WHERE 子句炸客,都要使用圓括號(hào)分組操作符疾棵。
5.2 IN 操作符
IN 操作符用來(lái)指定條件范圍,一組由逗號(hào)分隔括在圓括號(hào)中的合法值痹仙,范圍中的每個(gè)條件都可以進(jìn)行匹配是尔,與 OR 功能相同。
SELECT prod_name, prod_price FROM Products
WHERE vend_id IN ('DLL01', 'BRS01')
ORDER BY prod_name;
IN 操作符的優(yōu)點(diǎn)
- IN 操作符的語(yǔ)法更清楚直觀开仰。
- 在與其他 AND 和 OR 操作符組合使用 IN 時(shí)拟枚,求值順序更容易管理。
- IN 操作符一般比一組 OR 操作符執(zhí)行得更快众弓。
- IN 可以包含其他 SELECT 語(yǔ)句恩溅, 能夠更動(dòng)態(tài)地建立 WHERE 子句。
5.3 NOT 操作符
WHERE 子句中的 NOT 操作符只有一個(gè)功能田轧,否定其后所跟的任何條件暴匠。列出除 DLL01 之外的所有供應(yīng)商制造的產(chǎn)品:
SELECT prod_name FROM Products
WHERE NOT vend_id= 'DLL01' ORDER BY prod_name;
第6章 用通配符進(jìn)行過(guò)濾
6.1 LIKE 操作符
通配符(wildcard)用來(lái)匹配值的一部分的特殊字符。
搜索模式(search pattern)由字面值傻粘、通配符或兩者組合構(gòu)成的搜索條件每窖。
通配符實(shí)際上是 SQL 的 WHERE 子句中有特殊含義的字符。為在搜索子句中使用通配符弦悉,必須使用 LIKE 操作符窒典。LIKE 指示 DBMS,后跟的搜索模式利用通配符匹配而不是簡(jiǎn)單的相等匹配進(jìn)行比較稽莉。
百分號(hào)(%)通配符
在搜索串中瀑志,%表示任何字符出現(xiàn)任意次數(shù)。要找出所有以詞 Fish 開(kāi)頭的產(chǎn)品:
SELECT prod_id, prod_name FROM Products
WHERE prod_name LIKE 'Fish%'
在執(zhí)行這條子句時(shí)污秆,將檢索任意以 Fish 起頭的詞劈猪。%告訴 DBMS 接受 Fish 之后的任意字符,不管它有多少字符良拼。
通配符可在搜索模式中的任意位置使用战得,并且可以使用多個(gè)通配符。例子使用兩個(gè)通配符庸推,它們位于模式的兩端:
SELECT prod_id, prod_name FROM Products
WHERE prod_name LIKE '%bean bag%';
注意
包括 Access 在內(nèi)的許多 DBMS 都用空格來(lái)填補(bǔ)字段的內(nèi)容常侦。
例如,如果某列有 50 個(gè)字符贬媒,而存儲(chǔ)的文本為 Fish bean bag toy(17 個(gè)字符)聋亡,則為填滿該列需要在文本后附加 33 個(gè)空格。這樣做一般對(duì)數(shù)據(jù)及其使用沒(méi)有影響际乘,但是可能對(duì)上述 SQL語(yǔ)句有負(fù)面影響坡倔。
子句WHERE prod_name LIKE 'F%y'
只匹配以 F 開(kāi)頭以 y 結(jié)尾的 prod_name。如果值后面跟空格,則不是以 y 結(jié)尾致讥,所以 Fish bean bag toy 就不會(huì)檢索出來(lái)仅仆。
解決辦法:給搜索模式再增加一個(gè)%號(hào),'F%y%'
還匹配 y 之后的字符或空格垢袱。
注意
通配符%不能匹配 NULL墓拜,子句WHERE prod_name LIKE '%'
不匹配產(chǎn)品名稱為 NULL 的行。
下劃線(_)通配符
下劃線的用途與%一樣请契,但只匹配單個(gè)字符咳榜,而不是多個(gè)字符。
SELECT prod_id, prod_name FROM Products
WHERE prod_name LIKE '__ inch teddy bear';
下面 SELECT 語(yǔ)句使用%通配符爽锥,返回三行產(chǎn)品:
SELECT prod_id, prod_name FROM Products
WHERE prod_name LIKE '% inch teddy bear';
方括號(hào)([ ])通配符
方括號(hào)([])通配符用來(lái)指定一個(gè)字符集涌韩,它必須匹配指定位置(通配符的位置)的一個(gè)字符。目前只有 Access 和 SQL Server 支持集合氯夷。
例如找出所有名字以 J 或 M 起頭的聯(lián)系人:
SELECT cust_contact FROM Customers
WHERE cust_contact LIKE '[JM]%' ORDER BY cust_contact;
此語(yǔ)句的 WHERE 子句中的模式為'[JM]%'臣樱,這一搜索模式使用了兩個(gè)不同的通配符。[JM]匹配方括號(hào)中任意一個(gè)字符腮考,它也只能匹配單個(gè)字符雇毫。
此通配符可以用前綴字符(脫字號(hào))來(lái)否定。例如踩蔚,查詢以 J 和 M 之外的任意字符起頭的任意聯(lián)系人名:
SELECT cust_contact FROM Customers
WHERE cust_contact LIKE '[^JM]%' ORDER BY cust_contact;
也可以使用 NOT 操作符得出類似的結(jié)果:
SELECT cust_contact FROM Customers
WHERE NOT cust_contact LIKE '[JM]%' ORDER BY cust_contact;
6.2 使用通配符的技巧
- 如果其他操作符能達(dá)到相同的目的棚放,應(yīng)該使用其他操作符。
- 確實(shí)需要使用通配符時(shí)馅闽,不要把它們用在搜索模式的開(kāi)始處飘蚯,會(huì)非常慢。
- 如果通配符放錯(cuò)地方福也,不會(huì)返回想要的數(shù)據(jù)局骤。