MySQL--數據過濾(AND、OR、IN、NOT操作符)


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對各種條件取反有很大的差別。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM