MySQL必知必會七:數據過濾

7.1 組合WHERE子句

MySQL允許給出多個WHERE子句。這些子句可以兩種方式使用:以AND子句的方式或OR子句的方式使用。

操作符(operator) 用來聯結或改變WHERE子句中的子句的關鍵字。也稱爲邏輯操作符( logical operator) 。

7.1.1 AND操作符

mysql> SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10;
+---------+------------+----------------+
| prod_id | prod_price | prod_name      |
+---------+------------+----------------+
| FB      |      10.00 | Bird seed      |
| FC      |       2.50 | Carrots        |
| SLING   |       4.49 | Sling          |
| TNT1    |       2.50 | TNT (1 stick)  |
| TNT2    |      10.00 | TNT (5 sticks) |
+---------+------------+----------------+
  • 分析:此SQL語句檢索由供應商1003製造且價格小於等於10美元的所有產品的名稱和價格。這條SELECT語句中的WHERE子句包含兩個條件,並且用AND關鍵字聯結它們。

AND:用在WHERE子句中的關鍵字,用來指示檢索滿足所有給定條件的行。

上述例子中使用了只包含一個關鍵字AND的語句,把兩個過濾條件組
合在一起。還可以添加多個過濾條件,每添加一條就要使用一個AND。

7.1.2 OR操作符

OR操作符與AND操作符不同,它指示MySQL檢索匹配任一條件的行。

mysql> SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003;
+----------------+------------+
| prod_name      | prod_price |
+----------------+------------+
| Fuses          |       3.42 |
| Oil can        |       8.99 |
| Detonator      |      13.00 |
| Bird seed      |      10.00 |
| Carrots        |       2.50 |
| Safe           |      50.00 |
| Sling          |       4.49 |
| TNT (1 stick)  |       2.50 |
| TNT (5 sticks) |      10.00 |
+----------------+------------+
  • 分析:此SQL語句檢索由任一個指定供應商製造的所有產品的產品名和價格。 OR操作符告訴DBMS匹配任一條件而不是同時匹配兩個條件。

OR:WHERE子句中使用的關鍵字,用來表示檢索匹配任一給定條件的行。

7.1.3 計算次序

假如需要列出價格爲10美元(含)以上且由1002或1003製造的所有產品。下面的SELECT語句使用AND和OR操作符的組合建立了一個WHERE子句:

mysql> SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003 AND prod_price >= 10;
+----------------+------------+
| prod_name      | prod_price |
+----------------+------------+
| Fuses          |       3.42 |
| Oil can        |       8.99 |
| Detonator      |      13.00 |
| Bird seed      |      10.00 |
| Safe           |      50.00 |
| TNT (5 sticks) |      10.00 |
+----------------+------------+
  • 分析:返回的行中有兩行價格小於10美元,SQL(像多數語言一樣)在處理OR操作符前,優先處理AND操作符。當SQL看到上述WHERE子句時,它理解爲由供應商1003製造的任何價格爲10美元(含)以上的產品,或者由供應商1002製造的任何產品,而不管其價格如何。換句話說,由於AND在計算次序中優先級更高,操作符被錯誤地組合了。

此問題的解決方法是使用圓括號明確地分組相應的操作符。請看下面的SELECT語句及輸出:

mysql> SELECT prod_name, prod_price FROM products WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;
+----------------+------------+
| prod_name      | prod_price |
+----------------+------------+
| Detonator      |      13.00 |
| Bird seed      |      10.00 |
| Safe           |      50.00 |
| TNT (5 sticks) |      10.00 |
+----------------+------------+
  • 分析:這條SELECT語句與前一條的唯一差別是,這條語句中,前兩個條件用圓括號括了起來。因爲圓括號具有較AND或OR操作符高的計算次序,DBMS首先過濾圓括號內的OR條件。

在WHERE子句中使用圓括號 任何時候使用具有AND和OR操作符的WHERE子句,都應該使用圓括號明確地分組操作符。不要過分依賴默認計算次序,即使它確實是你想要的東西也是如此。使用圓括號沒有什麼壞處,它能消除歧義。

7.2 IN操作符

IN:WHERE子句中用來指定要匹配值的清單的關鍵字,功能與OR相當。

mysql> SELECT prod_name, prod_price FROM products WHERE vend_id IN (1002,1003) ORDER BY prod_name;
+----------------+------------+
| prod_name      | prod_price |
+----------------+------------+
| Bird seed      |      10.00 |
| Carrots        |       2.50 |
| Detonator      |      13.00 |
| Fuses          |       3.42 |
| Oil can        |       8.99 |
| Safe           |      50.00 |
| Sling          |       4.49 |
| TNT (1 stick)  |       2.50 |
| TNT (5 sticks) |      10.00 |
+----------------+------------+
  • 分析:此SELECT語句檢索供應商1002和1003製造的所有產品。 IN操作符後跟由逗號分隔的合法值清單,整個清單必須括在圓括號中。

爲什麼要使用IN操作符?其優點具體如下。

  • 在使用長的合法選項清單時, IN操作符的語法更清楚且更直觀。
  • 在使用IN時,計算的次序更容易管理(因爲使用的操作符更少)。
  • IN操作符一般比OR操作符清單執行更快。
  • IN的最大優點是可以包含其他SELECT語句,使得能夠更動態地建立WHERE子句。

7.3 NOT操作符

WHERE子句中的NOT操作符有且只有一個功能,那就是否定它之後所跟的任何條件。
NOT:WHERE子句中用來否定後跟條件的關鍵字。

mysql> SELECT prod_name, prod_price FROM products WHERE vend_id NOT IN (1002,1003) ORDER BY prod_name;
+--------------+------------+
| prod_name    | prod_price |
+--------------+------------+
| .5 ton anvil |       5.99 |
| 1 ton anvil  |       9.99 |
| 2 ton anvil  |      14.99 |
| JetPack 1000 |      35.00 |
| JetPack 2000 |      55.00 |
+--------------+------------+
  • 分析:這裏的NOT否定跟在它之後的條件,因此, MySQL不是匹配1002和 1003 的 vend_id , 而 是匹配1002和1003之外供應商的vend_id。

MySQL中的NOT:MySQL支持使用NOT對IN、 BETWEEN和EXISTS子句取反,這與多數其他DBMS允許使用NOT對各種條件取反有很大的差別。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章