MySQL資料庫:資料過濾
阿新 • • 發佈:2018-12-20
組合WHERE子句
WHERE子句在過濾資料時使用的都是單一的條件。為了進行更強的過濾控制, MySQL允許給出多個WHERE子句。這些子句可以兩種方式使用:以AND子句的方式或OR子句的方式使用。
操作符(operator) 用來聯結或改變WHERE子句中的子句的關鍵字。也稱為邏輯操作符( logical operator) 。
AND操作符
為了通過不止一個列進行過濾,可使用AND操作符給WHERE子句附加條件。
- SELECT vend_id,prod_price FROM products WHERE vend_id = ‘DLL01’ AND prod_price = 3.49;
OR操作符
OR操作符與AND操作符不同,它指示MySQL檢索匹配任一條件的行.
分析:此SQL語句檢索由任一個指定供應商製造的所有產品的產品名和價格。 OR操作符告訴DBMS匹配任一條件而不是同時匹配兩個條件。如果這裡使用的是AND操作符,則沒有資料返回(此時建立
的WHERE子句不會檢索到匹配的產品)。
- SELECT vend_id FROM products WHERE vend_id = ‘DLL01’ OR vend_id =‘BRS01’;
- SELECT vend_id FROM products WHERE vend_id = ‘DLL01’ AND vend_id =‘BRS01’;
計算次序
WHERE可包含任意數目的AND和OR操作符。允許兩者結合以進行復雜和高階的過濾。
需要列出價格為3.49美元(含)以上且由1002或1003製造的所有產品。下面的SELECT語句使用AND和OR操作符的組合建立了一個WHERE子句:
原因在於計算的次序。 SQL(像多數語言一樣)在處理OR操作符前,優先處理AND操作符。當SQL看到上述WHERE子句時,它理解為由供應商DLL01製造的任何價格為5.99美元(含)以上的產品,或者由供應商BRS01製造的任何產品,而不管其價格如何。換句話說,由於AND在計算次序中優先順序更高,操作符被錯誤地組合了
錯誤例項
- SELECT vend_id,prod_name,prod_price FROM products WHERE vend_id = ‘DLL01’ OR vend_id =‘BRS01’ AND prod_price >= 5.99;
解決方法是使用圓括號明確地分組相應的操作符
前兩個條件用圓括號括了起來。因為圓括號具有較AND或OR操作符高的計算次序, DBMS首先過濾圓括號內的OR條件。這時, SQL語句變成了選擇由供應商DLL01或BRS01製造的且價格都在5.99美元(含)以上的任何產品
- SELECT vend_id,prod_name,prod_price FROM products WHERE (vend_id = ‘DLL01’ OR vend_id =‘BRS01’) AND prod_price >= 5.99;
注意:在WHERE子句中使用圓括號 任何時候使用具有AND和OR操作符的WHERE子句,都應該使用圓括號明確地分組操作符。不要過分依賴預設計算次序,即使它確實是你想要的東西也是如此。使用圓括號沒有什麼壞處,它能消除歧義。
IN操作符
IN操作符用來指定條件範圍,範圍中的每個條件都可以進行匹配。 IN取合法值的由逗號分隔的清單,全都括在圓括號中。
注意:IN和OR的左右差不多 優點: 1在使用長的合法選項清單時, IN操作符的語法更清楚且更直觀。 2 在使用IN時,計算的次序更容易管理(因為使用的操作符更少)。 3 IN操作符一般比OR操作符清單執行更快。 4 IN的最大優點是可以包含其他SELECT語句,使得能夠更動態地建 立WHERE子句。
NOT操作符
WHERE子句中的NOT操作符有且只有一個功能,那就是否定它之後所跟的任何條件。
MySQL不是匹配DLL01和 BRS01的 vend_id , 而 是 匹 配DLL01和 BRS01之 外 供 應 商 的vend_id。
- SELECT vend_id,prod_name,prod_price FROM products WHERE vend_id NOT in (‘DLL01’,‘BRS01’) ORDER BY prod_name;