-- 高級數據過濾 關鍵詞:WHERE子句 | NOT 和IN 操作符 -- 組合WHERE子句 (給出多個WHERE子句。有兩種使用方式:以AND子句或OR子句的方式使用) -- AND操作符(相當於給WHERE子句添加了附加條件)SELECT prod_id,prod_price,prod_na ...
-- 高級數據過濾 關鍵詞:WHERE子句 | NOT 和IN 操作符
-- 組合WHERE子句 (給出多個WHERE子句。有兩種使用方式:以AND子句或OR子句的方式使用)
-- AND操作符(相當於給WHERE子句添加了附加條件)
SELECT prod_id,prod_price,prod_name
FROM Products
WHERE vend_id = 'DLL01' AND prod_price <=4;
-- 因為只有一個AND子句,最多有兩個過濾條件,可以增加多個過濾條件,每個條件間都要使用AND關鍵字
-- OR操作符(檢索匹配任一條件的行,在DBMS中,在第一個條件滿足時,不管第二個條件是否滿足,相應的行都被檢索出來)
SELECT prod_name,prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
-- 求值順序(AND和OR兩者結合可以進行複雜高級的過濾)(WHERE子句中可以包含任意數目的AND和OR操作符)
SELECT prod_name,prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
AND prod_price >= 10;
我們會發現輸出的結果並非達到我們的預期,原因就是SQL在處理OR操作符的時候,優先處理AND操作符,導致操作符被錯誤的組合成價格在10美元以上的BRS01以及任意價格的DLL01,導致輸出錯誤的結果。
解決方法是使用圓括弧對操作符進行明確分組。
SELECT prod_name,prod_price
FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
AND prod_price >= 10;
-- IN操作符(用來指定條件範圍,範圍中的每個條件都可以進行匹配)(由一組逗號分隔、括在圓括弧中的合法值)
SELECT prod_name,prod_price
FROM Products
WHERE vend_id IN ('DLL01','BRES01')
ORDER BY prod_name;
-----------------------
SELECT prod_name,prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
ORDER BY prod_name;
在這裡發現使用IN操作符和OR操作符輸出的結果大致相當(書中兩個表結果完全相同,可能是DBMS的不同導致的差異,也可能是表的外部連接的影響)。但是可以發現IN操作符的優點大概如下:
1.IN操作符的語法更清楚,更直觀。
2.IN在與(AND/OR)操作符混合使用的時候,求值順序更容易管理。
3.IN操作符一般比一組OR操作符執行得更快。
4.IN操作符最大的優點是可以包含其他SELECT語句,能夠更動態地簡歷WHERE字句。
-- NOT操作符(特點:從不單獨使用;用在過濾的條件前後都可以)(功能:WHERE子句中用來否定其後條件的關鍵字)
SELECT prod_name
FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;
等同於
SELECT prod_name
FROM Products
WHERE vend_id <> 'DLL01'
ORDER BY prod_name;
在簡單的WHERE子句中NOT優勢並不明顯,但是在更加複雜的子句中,NOT非常有用。比如和IN操作符聯合使用,可以非常簡單地找出與條件列表不匹配的行。