組合WHERE子句
為了進(jìn)行更強(qiáng)的過(guò)濾控制,MySQL允許給出多個(gè)WHERE子句。這些子句可以兩種方式使用:以AND子句或OR子句的方式使用。
操作符(operator)用來(lái)聯(lián)結(jié)或改變WHERE子句中的子句的關(guān)鍵字。也稱(chēng)為邏輯操作符(logical operator)。
AND操作符
為了通過(guò)不止一個(gè)列進(jìn)行過(guò)濾,可使用AND操作符給WHERE子句附加條件。
SELECT prod_id, prod_price, prod_nameFROM productsWHERE vend_id=1003 AND prod_price<10;
此SQL語(yǔ)句檢索由供應(yīng)商為1003且價(jià)格小于10元的所有產(chǎn)品的名稱(chēng)和價(jià)格。AND 用在WHERE子句中的關(guān)鍵字,用來(lái)指示檢索滿足所有給定條件的行。
OR操作符
OR操作符與AND操作符不同,它指示MySQL檢索匹配任一條件的行。
SELECT prod_price, prod_nameFROM productsWHERE vend_id=1002 OR vend_id=1003;
此SQL語(yǔ)句檢索由任一個(gè)指定供應(yīng)商1002或1003的所有產(chǎn)品的產(chǎn)品名和價(jià)格。OR WHERE子句中使用的關(guān)鍵字,用來(lái)表示檢索匹配任一給定條件的行。
計(jì)算次序
WHERE可包含任意數(shù)目的AND和OR操作符。允許兩者結(jié)合進(jìn)行復(fù)雜和高級(jí)的過(guò)濾。
SELECT prod_price, prod_nameFROM productsWHERE vend_id=1002 OR vend_id=1003 AND prod_price > 10;
SQL在處理OR操作符前,優(yōu)先處理AND操作符。當(dāng)SQL看到上述WHERE子句時(shí),它理解為由供應(yīng)商1003制造的任何價(jià)格為10元以上的產(chǎn)品,或者由供應(yīng)商1002制造的任何產(chǎn)品,而不管其價(jià)格如何。換句話說(shuō),由于AND在計(jì)算次序中優(yōu)先級(jí)更高,操作符被錯(cuò)誤地組合了。此問(wèn)題的解決方法是使用圓括號(hào)明確地分組相應(yīng)的操作符。
SELECT prod_price, prod_nameFROM productsWHERE (vend_id=1002 OR vend_id=1003) AND prod_price > 10;
在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)中。
SELECT prod_price, prod_nameFROM productsWHERE vend_id IN (1002, 1003) AND prod_price > 10;
此SELECT語(yǔ)句檢索供應(yīng)商1002和1003的所有產(chǎn)品。IN操作符后跟由逗號(hào)分隔的合法值清單,整個(gè)清單必須括在圓括號(hào)中。IN WHERE子句中用來(lái)指定要匹配值的清單的關(guān)鍵字,功能與OR 相當(dāng)。
為什么要使用IN操作符?
NOT操作符
WHERE子句中的NOT操作符有且只有一個(gè)功能,那就是否定它之后所跟的任何條件。
SELECT prod_price, prod_nameFROM productsWHERE vend_id NOT IN (1002, 1003);
這里的NOT否定跟在它之后的條件,因此,MySQL不是匹配1002和1003的vend_id , 而是匹配1002和1003之外供應(yīng)商的vend_id。在與IN操作符聯(lián)合使用時(shí),NOT使找出與條件列表不匹配的行非常簡(jiǎn)單。
MySQL中的NOTMySQL支持使用NOT對(duì)IN、BETWEEN和 EXISTS子句取反,這與多數(shù)其他DBMS允許使用NOT對(duì)各種條件取反有很大的差別。