MySQL允許給出多個WHERE子句。這些子句可以兩種方式使用:以AND子句的方式或OR子句的方式使用。
1、組合WHERE子句
1.1 AND操作符
SELECT prod_id,prod_price,prod_name FROM products WHERE vend_id=1003 AND prod_price<=10;
此SQL語句檢索由供應商1003制造且價格小於等於10美元的所有產品的名稱和價格。這條SELECT語句中的WHERE子句包含兩個條件,並且用AND關鍵字聯結它們。 AND指示DBMS只返回滿足所有給定條件的行。
AND 用在WHERE子句中的關鍵字,用來指示檢索滿足所有給定條件的行。
上述例子中使用了只包含一個關鍵字AND的語句,把兩個過濾條件組合在一起。還可以添加多個過濾條件,每添加一條就要使用一個AND。
1.2 OR操作符
OR操作符與AND操作符不同,它指示MySQL檢索匹配任一條件的行。
SELECT prod_name,prod_price FROM products WHERE vend_id=1002 OR vend_id =1003;
此SQL語句檢索由任一個指定供應商制造的所有產品的產品名和價格。 OR操作符告訴DBMS匹配任一條件而不是同時匹配兩個條件。
OR WHERE子句中使用的關鍵字,用來表示檢索匹配任一給定條件的行。
1.3 計算次序
WHERE可包含任意數目的AND和OR操作符。允許兩者結合以進行復雜和高級的過濾。
SQL(像多數語言一樣)在處理OR操作符前,優先處理AND操作符。
案例1:假如需要列出價格為10美元(含)以上且由1002或1003制造的所有產品。下面的SELECT語句使用AND和OR操作符的組合建立了一個WHERE子句。
SELECT prod_name,prod_price FROM products WHERE vend_id=1002 OR vend_id=1003 AND prod_price>=10; --返回的行中有兩行價格小於10美元,顯然,返回的行未按預期的進行過濾。為什么會這樣呢?原因在於計算的次序。 SQL(像多數語言一樣)在處理OR操作符前,優先處理AND操作符。當SQL看到上述WHERE子句時,它理解為由供應商1003制造的任何價格為10美元(含)以上的產品,或者由供應商1002制造的任何產品,而不管其價格如何。換句話說,由於AND在計算次序中優先級更高,操作符被錯誤地組合了。
所以,上述語句是錯誤的。因為操作符優先級,所以要解決這個問題,要使用圓括號明確地分組相應的操作符。以下才是正確寫法。
SELECT prod_name,prod_price FROM products WHERE (vend_id=1002 OR vend_id=1003) AND prod_price>=10;
這條SELECT語句與前一條的唯一差別是,這條語句中,前兩個條件用圓括號括了起來。因為圓括號具有較AND或OR操作符高的計算次序, DBMS首先過濾圓括號內的OR條件。這時, SQL語句變成了選擇由供應商1002或1003制造的且價格都在10美元(含)以上的任何產品,這正是我們所希望的。
在WHERE子句中使用圓括號 任何時候使用具有AND和OR操作符的WHERE子句,都應該使用圓括號明確地分組操作符。不要過分依賴默認計算次序,即使它確實是你想要的東西也是如此。使用圓括號沒有什么壞處,它能消除歧義。
2、IN操作符
圓括號在WHERE子句中還有另外一種用法。 IN操作符用來指定條件范圍,范圍中的每個條件都可以進行匹配。 IN取合法值的由逗號分隔的清單,全都括在圓括號中。
IN WHERE子句中用來指定要匹配值的清單的關鍵字,功能與OR相當。
SELECT prod_name,prod_price FROM products WHERE vend_id IN(1002,1003) ORDER BY prod_name;
此SELECT語句檢索供應商1002和1003制造的所有產品。 IN操作符后跟由逗號分隔的合法值清單,整個清單必須括在圓括號中。
為什么要使用IN操作符?其優點具體如下。
①在使用長的合法選項清單時, IN操作符的語法更清楚且更直觀。
②在使用IN時,計算的次序更容易管理(因為使用的操作符更少)。
③IN操作符一般比OR操作符清單執行更快。
④IN的最大優點是可以包含其他SELECT語句,使得能夠更動態地建立WHERE子句。
3、NOT操作符
WHERE子句中的NOT操作符有且只有一個功能,那就是否定它之后所跟的任何條件。
NOT WHERE子句中用來否定后跟條件的關鍵字。
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 之 外 供 應 商 的vend_id。
MySQL中的 NOT MySQL 支 持 使 用 NOT 對 IN 、 BETWEEN 和EXISTS子句取反,這與多數其他DBMS允許使用NOT對各種條件取反有很大的差別。