目錄匯總:SQL 零基礎入門教程
使用 WHERE 子句 中介紹的所有 WHERE 子句在過濾數據時使用的都是單一的條件。為了進行更強的過濾控制,SQL 允許給出多個 WHERE 子句。這些子句有兩種使用方式,即以 AND 子句或 OR 子句的方式使用。
操作符(operator)
用來聯結或改變 WHERE 子句中的子句的關鍵字,也稱為邏輯操作符(logical operator)。
一、AND 操作符
要通過不止一個列進行過濾,可以使用 AND
操作符給 WHERE
子句附加條件。下面的代碼給出了一個例子:
輸入▼
SELECT prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= 4;
分析▼
此 SQL 語句檢索由供應商 DLL01 制造且價格小於等於 4 美元的所有產品的名稱和價格。這條 SELECT
語句中的 WHERE
子句包含兩個條件,用 AND
關鍵字聯結在一起。AND
指示 DBMS 只返回滿足所有給定條件的行。如果某個產品由供應商 DLL01 制造,但價格高於 4 美元,則不檢索它。類似地,如果產品價格小於 4 美元,但不是由指定供應商制造的也不被檢索。這條 SQL 語句產生的輸出如下:
輸出▼
prod_id prod_price prod_name
------- ---------- --------------------
BNBG02 3.4900 Bird bean bag toy
BNBG01 3.4900 Fish bean bag toy
BNBG03 3.4900 Rabbit bean bag toy
AND
用在
WHERE
子句中的關鍵字,用來指示檢索滿足所有給定條件的行。
這個例子只包含一個 AND
子句,因此只有兩個過濾條件。可以增加多個過濾條件,每個條件間都要使用 AND
關鍵字。
說明:沒有
ORDER BY
子句為了節省空間,也為了減少你的輸入,我在很多例子里省略了 ORDER BY 子句。因此,你的輸出完全有可能與教程中的輸出不一致。雖然返回行的數量總是對的,但它們的順序可能不同。當然,如果你願意也可以加上一個
ORDER BY
子句,它應該放在WHERE
子句之后。
二、OR 操作符
OR
操作符與 AND
操作符正好相反,它指示 DBMS 檢索匹配任一條件的行。事實上,許多 DBMS 在 OR WHERE
子句的第一個條件得到滿足的情況下,就不再計算第二個條件了(在第一個條件滿足時,不管第二個條件是否滿足,相應的行都將被檢索出來)。
請看如下的 SELECT
語句:
輸入▼
SELECT prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
分析▼
此 SQL 語句檢索由任一個指定供應商制造的所有產品的產品名和價格。OR
操作符告訴 DBMS 匹配任一條件而不是同時匹配兩個條件。如果這里使用的是 AND
操作符,則沒有數據返回(因為會創建沒有匹配行的 WHERE
子句)。這條 SQL 語句產生的輸出如下:
輸出▼
prod_name prod_price
------------------- ----------
Fish bean bag toy 3.4900
Bird bean bag toy 3.4900
Rabbit bean bag toy 3.4900
8 inch teddy bear 5.9900
12 inch teddy bear 8.9900
18 inch teddy bear 11.9900
Raggedy Ann 4.9900
OR
WHERE
子句中使用的關鍵字,用來表示檢索匹配任一給定條件的行。
三、求值順序
WHERE
子句可以包含任意數目的 AND
和 OR
操作符。允許兩者結合以進行復雜、高級的過濾。
但是,組合 AND
和 OR
會帶來了一個有趣的問題。為了說明這個問題,來看一個例子。假如需要列出價格為 10 美元及以上,且由 DLL01 或 BRS01 制造的所有產品。下面的 SELECT
語句使用組合的 AND
和 OR
操作符建立了一個 WHERE
子句:
輸入▼
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
AND prod_price >= 10;
輸出▼
prod_name prod_price
------------------- ----------
Fish bean bag toy 3.4900
Bird bean bag toy 3.4900
Rabbit bean bag toy 3.4900
18 inch teddy bear 11.9900
Raggedy Ann 4.9900
分析▼
請看上面的結果。返回的行中有 4 行價格小於 10 美元,顯然,返回的行未按預期的進行過濾。為什么會這樣呢?原因在於求值的順序。SQL(像多數語言一樣)在處理 OR
操作符前,優先處理 AND
操作符。當 SQL 看到上述 WHERE
子句時,它理解為:由供應商 BRS01 制造的價格為 10 美元以上的所有產品,以及由供應商 DLL01 制造的所有產品,而不管其價格如何。換句話說,由於 AND
在求值過程中優先級更高,操作符被錯誤地組合了。
此問題的解決方法是使用圓括號對操作符進行明確分組。請看下面的 SELECT
語句及輸出:
輸入▼
SELECT prod_name, prod_price
FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
AND prod_price >= 10;
輸出▼
prod_name prod_price
------------------- ----------
18 inch teddy bear 11.9900
分析▼
這條 SELECT
語句與前一條的唯一差別是,將前兩個條件用圓括號括了起來。因為圓括號具有比 AND
或 OR
操作符更高的優先級,所以 DBMS 首先過濾圓括號內的 OR
條件。這時,SQL 語句變成了選擇由供應商 DLL01 或 BRS01 制造的且價格在 10 美元及以上的所有產品,這正是我們希望的結果。
提示:在
WHERE
子句中使用圓括號任何時候使用具有
AND
和OR
操作符的WHERE
子句,都應該使用圓括號明確地分組操作符。不要過分依賴默認求值順序,即使它確實如你希望的那樣。使用圓括號沒有什么壞處,它能消除歧義。
請參閱
(完)