?? 博客主頁(yè):博主鏈接
?? 本文由 M malloc 原創(chuàng),首發(fā)于 CSDN??
?? 學(xué)習(xí)專(zhuān)欄推薦:LeetCode刷題集!
?? 歡迎點(diǎn)贊 ?? 收藏 ?留言 ?? 如有錯(cuò)誤敬請(qǐng)指正!
?? 未來(lái)很長(zhǎng),值得我們?nèi)Ρ几案篮玫纳?
??MySQL的前情介紹
??大家好呀,今天是我第N次寫(xiě)MySQL,也是最近才學(xué)習(xí)MySQL,也想著記錄一下自己的學(xué)習(xí)過(guò)程,并且分享給大家尼!
??本章詳情
??本文章將講授如何組合WHERE子句以建立功能更強(qiáng)的更高級(jí)的搜索條件。以及學(xué)習(xí)如何使用NOT和IN操作符。
??組合WHERE子句
前言
??在上一篇文章中介紹的所有WHERE子句在過(guò)濾數(shù)據(jù)時(shí)使用的都是單一的條件。為了進(jìn)行更強(qiáng)的過(guò)濾控制,MySOL允許給出多個(gè)WHERE子句。這些子句可以?xún)煞N方式使用:以AND子句的方式或OR子句的方式使用。
??AND操作符
??操作符(operator) 用來(lái)聯(lián)結(jié)或改變WHERE子中的子句的關(guān)鍵字。也稱(chēng)為邏輯操作符 (logicaloperator)
舉例說(shuō)明
??為了通過(guò)不止一個(gè)列進(jìn)行過(guò)濾,可使用AND操作符給WHERE子句附加條件。下面我將舉出一個(gè)例子:
輸入
SELECT prod_id,prod_price, prod_name FROM products
WHERE vend_id = 1003 AND prod_price = 10;
分析
??此SQL語(yǔ)句檢索由供應(yīng)商1003制造且價(jià)格小于等于10美元的所有產(chǎn)品的名稱(chēng)和價(jià)格。這條SELECT語(yǔ)句中的WHERE子句包含兩個(gè)條件,并且用AND關(guān)鍵字聯(lián)結(jié)它們。AND指示DBMS只返回滿(mǎn)足所有給定條件的行。如果某個(gè)產(chǎn)品由供應(yīng)商1003制造,但它的價(jià)格高于10美元,則不檢索它。類(lèi)似,如果產(chǎn)品價(jià)格小于10美元,但不是由指定供應(yīng)商制造的也不被檢索。這條SQL語(yǔ)產(chǎn)生的輸出如下:
輸出
??AND 用在WHERE子句中的關(guān)鍵字,用來(lái)指示檢索滿(mǎn)足所有給定條件的行。
??在上述例子中,使用了只包含一個(gè)關(guān)鍵字AND的語(yǔ)句,把兩個(gè)過(guò)濾條件組合在一起。還可以添加多個(gè)過(guò)濾條件,每添加一條就要使用一個(gè)AND。
??OR操作符
??OR操作符與AND操作符不同,它指示MySOL檢索匹配任一條件的行。
??下面我將講述一個(gè)實(shí)際的例子,來(lái)進(jìn)行講解:
輸入
SELECT prod_name,prod_price FROM products
WHERE vend_id = 1002 OR vend_id = 1003;
分析
?此SQL語(yǔ)句檢索由任一個(gè)指定供應(yīng)商制造的所有產(chǎn)品的產(chǎn)品名和價(jià)格。OR操作符告訴DBMS匹配任一條件而不是同時(shí)匹配兩個(gè)條件。如果這里使用的是AND操作符,則沒(méi)有數(shù)據(jù)返回(此時(shí)創(chuàng)建的WHERE子句不會(huì)檢索到匹配的產(chǎn)品)。這條SQL語(yǔ)產(chǎn)生的輸出如下:
輸出
結(jié)論
??OR WHERE子句中使用的關(guān)鍵字,用來(lái)表示檢索匹配任一給定條件的行。
??計(jì)算次序
??WHERE可包含任意數(shù)目的AND和OR操作符。允許兩結(jié)合以進(jìn)行復(fù)雜和高級(jí)的過(guò)濾
??但是,組合AND和OR帶來(lái)了一個(gè)有趣的問(wèn)題。為了說(shuō)明這個(gè)問(wèn)題,來(lái)看一個(gè)例子。假如需要列出價(jià)格為10美元(含)以上且由1002或1003制造的所有產(chǎn)品。下面的SELECT語(yǔ)使用AND和OR操作符的組合建立了一個(gè)WHERE子句:
輸入
SELECT prod_name,prod_price FROM products
WHERE vend_id = 1002 OR vend_id = 1003 AND prod_price >= 10;
輸出
分析
??根據(jù)上面的結(jié)果。返回的行中有兩行價(jià)格小于10美元,顯然返回的行未按預(yù)期的進(jìn)行過(guò)濾。為什么會(huì)這樣呢?原因在于計(jì)算的次序。SQL(像多數(shù)語(yǔ)言一樣)在處理OR操作符前,優(yōu)先處理AND操作符。當(dāng)SQL看到上述WHERE子句時(shí),它理解為由供應(yīng)商1003制造的任何價(jià)格為10美元(含)以上的產(chǎn)品,或者由供應(yīng)商1002制造的任何產(chǎn)品,而不管其價(jià)格如何。換句話(huà)說(shuō),由于AND在計(jì)算次序中優(yōu)先級(jí)更高操作符被錯(cuò)誤地組合了。
解決上述問(wèn)題的辦法
此問(wèn)題的解決方法是使用圓括號(hào)明確地分組相應(yīng)的操作符。請(qǐng)看下面的SELECT語(yǔ)句及輸出:
輸入
SELECT prod_name,prod_price FROM products
WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price = 10;
輸出
分析
??這條SELECT語(yǔ)句與前一條的唯一差別是,這條語(yǔ)句中,前兩個(gè)條件用圓括號(hào)括了起來(lái)。因?yàn)?strong>圓括號(hào)具有較AND或OR操作符高的計(jì)算次序,DBMS首先過(guò)濾圓括號(hào)內(nèi)的OR條件。這時(shí),SQL語(yǔ)句變成了選擇由供應(yīng)商1002或1003制造的且價(jià)格都在10美元(含)以上的任何產(chǎn)品,這正是我們所希望的。
??在WHERE子句中使用圓括號(hào)
總結(jié)
??在WHERE子句中使用圓括號(hào) 任何時(shí)候使用具有AND和OR操作符的WHERE子句,都應(yīng)該使用圓括號(hào)明確地分組操作符。不要過(guò)分依賴(lài)默認(rèn)計(jì)算次序,即使它確實(shí)是你想要的東西也是如此。使用圓括號(hào)沒(méi)有什么壞處,它能消除歧義。
??IN操作符
前言
圓括號(hào)在WHERE子句中還有另外一種用法。IN操作符用來(lái)指定條件范圍,范圍中的每個(gè)條件都可以進(jìn)行匹配。IN取合法值的由逗號(hào)分隔的清單,全都括在圓括號(hào)中。下面的例子說(shuō)明了這個(gè)操作符:
輸入
SELECT prod_name,prod_price FROM products
WHERE vend_id IN (1002,1003)
ORDER BY prod_name
輸出
分析
此SELECT語(yǔ)句檢索供應(yīng)商1002和1003制造的所有產(chǎn)品。IN操作符后跟由逗號(hào)分隔的合法值清單,整個(gè)清單必須括在圓括號(hào)中。
??如果你認(rèn)為IN操作符完成與OR相同的功能,那么你的這種猜測(cè)是對(duì)的。下面的SQL語(yǔ)句完成與上面的例子相同的工作:
輸入
SELECT prod_name, prod_price FROM products
WHERE vend_id = 1002 OR vend_id = 1003
ORDER BY prod_name;
輸出
既然這樣也能解決此類(lèi)問(wèn)題,那么我們?yōu)槭裁匆褂肐N操作符?其有點(diǎn)具體如下。
- 在使用長(zhǎng)的合法選項(xiàng)清單時(shí),IN操作符的語(yǔ)法更清楚且更直觀。
- 在使用IN時(shí),計(jì)算的次序更容易管理(因?yàn)槭褂玫牟僮鞣?
- IN操作符一般比OR操作符清單執(zhí)行更快
- IN的最大優(yōu)點(diǎn)是可以包含其他SELECT語(yǔ)句,使得能夠更動(dòng)態(tài)地建立WHERE子句。(之后我們會(huì)進(jìn)行深入的講解)
總結(jié)
??IN WHERE子句中用來(lái)指定要匹配值的清單的關(guān)鍵字,功能與OR相當(dāng)。
??NOT操作符
前言
??WHERE子句中的NOT操作符有且只有一個(gè)功能,那就是否定它之后所跟的任何條件。
??例子精講
NOT
NOT WHERE子句中用來(lái)否定后跟條件的關(guān)鍵字
下面的例子說(shuō)明NOT的使用。為了列出除1002和1003之外的所有供應(yīng)商制造的產(chǎn)品,可編寫(xiě)如下的代碼:
輸入
SELECT prod_name,prod_price FROM products
WHERE vend_id NOT IN (1002,1003)
ORDER BY prod_name;
輸出
分析
??這里的NOT否定跟在它之后的條件,因此,MySQL不是匹配1002和1003的vend id,而是匹配1002和1003之外供應(yīng)商的vend_id。
??為什么使用NOT?
?對(duì)于簡(jiǎn)單的WHERE子句,使用NOT確實(shí)沒(méi)有什么優(yōu)勢(shì)。但在更復(fù)雜的子句中,NOT是非常有用的。例如,在與IN操作符聯(lián)合使用時(shí),NOT使找出與條件列表不匹配的行非常簡(jiǎn)單。
MySQL中的NOT
MySQL中的NOT MySOL支持使用NOT對(duì)IN、BETWEEN和EXISTS子句取反,這與多數(shù)其他DBMS允許使用NOT對(duì)各種條件取反有很大的差別。
??如何鞏固學(xué)習(xí)
提示:在學(xué)習(xí)的過(guò)程中,我們需要先自行進(jìn)行思考,而不是一遇到不會(huì)的就放棄思考直接看答案,如果最后遇到真的不會(huì)的題目,我們可以適當(dāng)?shù)倪M(jìn)行觀看答案,看自己的思路是否正確,在作出正確的判斷
??本文小結(jié)
本文章介紹了如何用SELECT語(yǔ)句的WHERE子句過(guò)濾返回的數(shù)據(jù)。我們學(xué)習(xí)了如何對(duì)相等、不相等、大于、小于、值的范圍以及NULL值等進(jìn)行測(cè)試。
好啦今日的分享到這里就結(jié)束啦,我是愛(ài)你們的M malloc希望可以幫助到你們噢,最后別忘記三連啦!!
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-492485.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-492485.html
到了這里,關(guān)于【MySQL】一文帶你了解數(shù)據(jù)過(guò)濾的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!