目錄
- 一、組合 WHERE 子句
- 1.1 AND 運算子
- 1.2 OR 運算子
- 1.3 求值順序
- 二、IN 運算子
- 三、NOT 運算子
- 四、小結
本文介紹如何用 AND 和 OR 運算子組合成 WHERE 子句以建立功能更強、更高級的搜索條件,我們還介紹了如何使用 NOT 和 IN 運算子,
一、組合 WHERE 子句
在 如何使用 SQL WHERE 過濾回傳的資料 中介紹的所有 WHERE 子句在過濾資料時使用的都是單一的條件,
為了進行更強的過濾控制,SQL 允許給出多個 WHERE 子句,這些子句有兩種使用方式,即以 AND 子句或 OR 子句的方式使用,
運算子(operator)
用來聯結或改變
WHERE子句中的子句的關鍵字,也稱為邏輯運算子(logical operator),
1.1 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子句之后,
1.2 OR 運算子
OR 運算子與 AND 運算子正好相反,它指示 DBMS 檢索匹配任一條件的行,
事實上,許多 DBMS 在 OR WHERE 子句的第一個條件得到滿足的情況下,就不再計算第二個條件了(在第一個條件滿足時,不管第二個條件是否滿足,相應的行都將被檢索出來),
請看如下的 SELECT 陳述句:
SELECT prod_name, prod_price
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子句中使用的關鍵字,用來表示檢索匹配任一給定條件的行,
1.3 求值順序
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子句,都應該使用圓括號明確地分組運算子,不要過分依賴默認求值順序,即使它確實如你希望的那樣,使用圓括號沒有什么壞處,它能消除歧義,
二、IN 運算子
IN 運算子用來指定條件范圍,范圍中的每個條件都可以進行匹配,IN 取一組由逗號分隔、括在圓括號中的合法值,下面的例子說明了這個運算子,
SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ('DLL01','BRS01')
ORDER BY prod_name;
輸出:
prod_name prod_price
------------------- ----------
12 inch teddy bear 8.9900
18 inch teddy bear 11.9900
8 inch teddy bear 5.9900
Bird bean bag toy 3.4900
Fish bean bag toy 3.4900
Rabbit bean bag toy 3.4900
Raggedy Ann 4.9900
此 SELECT 陳述句檢索由供應商 DLL01 和 BRS01 制造的所有產品,IN 運算子后跟由逗號分隔的合法值,這些值必須括在圓括號中,
你可能會猜測 IN 運算子完成了與 OR 相同的功能,恭喜你猜對了!下面的 SQL 陳述句完成與上面的例子相同的作業,
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
ORDER BY prod_name;
輸出:
prod_name prod_price
------------------- ----------
12 inch teddy bear 8.9900
18 inch teddy bear 11.9900
8 inch teddy bear 5.9900
Bird bean bag toy 3.4900
Fish bean bag toy 3.4900
Rabbit bean bag toy 3.4900
Raggedy Ann 4.9900
為什么要使用 IN 運算子?其優點如下,
- 在有很多合法選項時,
IN運算子的語法更清楚,更直觀, - 在與其他
AND和OR運算子組合使用IN時,求值順序更容易管理, IN運算子一般比一組OR運算子執行得更快(在上面這個合法選項很少的例子中,你看不出性能差異),IN的最大優點是可以包含其他SELECT陳述句,能夠更動態地建立WHERE子句,SQL 如何使用子查詢 對此進行詳細介紹,
IN
WHERE子句中用來指定要匹配值的清單的關鍵字,功能與OR相當,
三、NOT 運算子
WHERE 子句中的 NOT 運算子有且只有一個功能,那就是否定其后所跟的任何條件,因為 NOT 從不單獨使用(它總是與其他運算子一起使用),所以它的語法與其他運算子有所不同,
NOT 關鍵字可以用在要過濾的列前,而不僅是在其后,
NOT
WHERE子句中用來否定其后條件的關鍵字,
下面的例子說明 NOT 的用法,為了列出除 DLL01 之外的所有供應商制造的產品,可撰寫如下的代碼,
SELECT prod_name
FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;
輸出:
prod_name
------------------
12 inch teddy bear
18 inch teddy bear
8 inch teddy bear
King doll
Queen doll
這里的 NOT 否定跟在其后的條件,因此,DBMS 不是匹配 vend_id 為 DLL01,而是匹配非 DLL01 之外的所有東西,
上面的例子也可以使用 <> 運算子來完成,如下所示,
SELECT prod_name
FROM Products
WHERE vend_id <> 'DLL01'
ORDER BY prod_name;
輸出:
prod_name
------------------
12 inch teddy bear
18 inch teddy bear
8 inch teddy bear
King doll
Queen doll
為什么使用 NOT?對于這里的這種簡單的 WHERE 子句,使用 NOT 確實沒有什么優勢,但在更復雜的子句中,NOT 是非常有用的,
例如,在與 IN 運算子聯合使用時,NOT 可以非常簡單地找出與條件串列不匹配的行,
說明:MariaDB 中的
NOTMariaDB 支持使用
NOT否定IN、BETWEEN和EXISTS子句,大多數 DBMS 允許使用NOT否定任何條件,
四、小結
本文介紹了如何用 AND 和 OR 運算子組合成 WHERE 子句以建立功能更強、更高級的搜索條件,還介紹了如何明確地管理求值順序,以及如何使用 NOT 和 IN 運算子,
原文鏈接:https://www.developerastrid.com/sql/sql-and-or-in-not/
(完)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/466073.html
標籤:SQL Server
