04-06章 過(guò)濾數(shù)據(jù)

第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 的行,輸出:

屏幕快照 2018-05-27 08.32.33.png

注意
同時(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;
屏幕快照 2018-05-27 08.52.12.png

不匹配檢查
列出所有不是供應(yīng)商 DLL01 制造的產(chǎn)品:

SELECT vend_id, prod_name FROM Products
WHERE vend_id <> 'DLL01';
屏幕快照 2018-05-27 08.56.58.png

注意:何時(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;
屏幕快照 2018-05-27 10.51.33.png

空值檢查
在創(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;
屏幕快照 2018-05-27 10.58.20.png

第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à)格。


屏幕快照 2018-05-27 11.03.13.png

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';
屏幕快照 2018-05-27 11.06.50.png

求值順序
需要列出價(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;
屏幕快照 2018-05-27 11.11.10.png

上面結(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;
屏幕快照 2018-05-27 11.17.33.png

將前兩個(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;
屏幕快照 2018-05-27 11.26.02.png

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;
屏幕快照 2018-05-27 11.32.56.png

第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%'
屏幕快照 2018-05-27 12.25.46.png

在執(zhí)行這條子句時(shí)污秆,將檢索任意以 Fish 起頭的詞劈猪。%告訴 DBMS 接受 Fish 之后的任意字符,不管它有多少字符良拼。

通配符可在搜索模式中的任意位置使用战得,并且可以使用多個(gè)通配符。例子使用兩個(gè)通配符庸推,它們位于模式的兩端:

SELECT prod_id, prod_name FROM Products
WHERE prod_name LIKE '%bean bag%';
屏幕快照 2018-05-27 12.30.15.png

注意
包括 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';
屏幕快照 2018-05-27 12.40.46.png

下面 SELECT 語(yǔ)句使用%通配符爽锥,返回三行產(chǎn)品:

SELECT prod_id, prod_name FROM Products
WHERE prod_name LIKE '% inch teddy bear';
屏幕快照 2018-05-27 12.43.25.png

方括號(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;
屏幕快照 2018-05-27 12.49.26.png

此語(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 使用通配符的技巧

  1. 如果其他操作符能達(dá)到相同的目的棚放,應(yīng)該使用其他操作符。
  2. 確實(shí)需要使用通配符時(shí)馅闽,不要把它們用在搜索模式的開(kāi)始處飘蚯,會(huì)非常慢。
  3. 如果通配符放錯(cuò)地方福也,不會(huì)返回想要的數(shù)據(jù)局骤。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市暴凑,隨后出現(xiàn)的幾起案子庄涡,更是在濱河造成了極大的恐慌,老刑警劉巖搬设,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異撕捍,居然都是意外死亡拿穴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門忧风,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)默色,“玉大人,你說(shuō)我怎么就攤上這事狮腿⊥仍祝” “怎么了呕诉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吃度。 經(jīng)常有香客問(wèn)我甩挫,道長(zhǎng),這世上最難降的妖魔是什么椿每? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任伊者,我火速辦了婚禮,結(jié)果婚禮上间护,老公的妹妹穿的比我還像新娘亦渗。我一直安慰自己,他們只是感情好汁尺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布法精。 她就那樣靜靜地躺著,像睡著了一般痴突。 火紅的嫁衣襯著肌膚如雪搂蜓。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天苞也,我揣著相機(jī)與錄音洛勉,去河邊找鬼。 笑死如迟,一個(gè)胖子當(dāng)著我的面吹牛收毫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播殷勘,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼此再,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了玲销?” 一聲冷哼從身側(cè)響起输拇,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贤斜,沒(méi)想到半個(gè)月后策吠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瘩绒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年猴抹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锁荔。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蟀给,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情跋理,我是刑警寧澤择克,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站前普,受9級(jí)特大地震影響肚邢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜汁政,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一道偷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧记劈,春花似錦勺鸦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至刽射,卻和暖如春军拟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背誓禁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工懈息, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摹恰。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓辫继,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親俗慈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子姑宽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. SQL 簡(jiǎn)介 SQL 的目標(biāo) 理想情況下,數(shù)據(jù)庫(kù)語(yǔ)言應(yīng)允許用戶: 建立數(shù)據(jù)庫(kù)和關(guān)系結(jié)構(gòu) 完成基本數(shù)據(jù)管理任務(wù)...
    板藍(lán)根plank閱讀 2,347評(píng)論 0 11
  • 表 存儲(chǔ)在表中的數(shù)據(jù)是同一種類型的數(shù)據(jù)或清單闺阱。 數(shù)據(jù)庫(kù)中的表有為一個(gè)名字來(lái)標(biāo)識(shí)自己炮车。 表具有一些特性,這些特性定義...
    蛐蛐囍閱讀 1,314評(píng)論 0 7
  • SQL與MySQL簡(jiǎn)介 數(shù)據(jù)庫(kù)基礎(chǔ) 從SQL的角度來(lái)看酣溃,數(shù)據(jù)庫(kù)就是一個(gè)以某種有組織的方式存儲(chǔ)的數(shù)據(jù)集合瘦穆。我們可以采...
    heming閱讀 3,080評(píng)論 1 8
  • 感謝各位厚愛(ài),持續(xù)關(guān)注曼烘焙赊豌。接下來(lái)曼烘焙將與kidsclub聯(lián)手难审,為各位愛(ài)美食的美人辣媽帶來(lái)更多有愛(ài)有溫度的美味...
    NPC王小曼閱讀 309評(píng)論 0 0
  • 姓名:周英 單位:深圳市蔚藍(lán)時(shí)代商業(yè)管理有限公司昆明分公司 【日精進(jìn)打卡第32天】 【知~學(xué)習(xí)】 《六項(xiàng)精進(jìn)》2遍...
    止住旳淚囦閱讀 165評(píng)論 0 0