目標:
5.1 組合WHERE子句
5.2 IN操作符
5.3 NOT操作符
這一課講授如何組合 WHERE 子句以建立功能更強淑翼、更高級的搜索條件。我們還將學習如何使用 NOT 和 IN 操作符。
5.1 組合WHERE子句
為了進行更強的過濾控制,SQL 允許給出多個 WHERE 子句。這些子句有兩種使用方式佑刷,即以 AND 子句或 OR 子句的方式使用忘闻。
操作符(operator)用來聯(lián)結或改變 WHERE 子句中的子句的關鍵字钝计,也稱為邏輯操作符(logical operator)
5.1.1 AND操作符
SELECT prod_id,prod_price,prod_name
FROM products
WHERE vend_id='DLL01' AND prod_price<=4;
輸出:
AND?用在 WHERE 子句中的關鍵字,用來指示檢索滿足所有給定條件的行齐佳。
5.1.2 OR 操作符
SELECT prod_id,prod_price,prod_name
?FROM products
?WHERE vend_id='DLL01' OR OR vend_id='BRS01';
輸出:
OR WHERE 子句中使用的關鍵字私恬,用來表示檢索匹配任一給定條件的行。
5.1.3 求值順序
()>AND>OR
SELECT prod_price,vend_id
FROM products
WHERE (vend_id='DLL01' OR vend_id='BRS01') AND prod_price>=10;
輸出:
SELECT prod_price,vend_id
FROM products
WHERE vend_id='DLL01' OR vend_id='BRS01' AND prod_price>=10;
輸出:
5.2 IN操作符
IN 操作符?用來指定條件范圍炼吴,范圍中的每個條件都可以進行匹配本鸣。IN 取一組由逗號分隔、括在圓括號中的合法值硅蹦。
SELECT prod_name,prod_price
FROM products
WHERE vend_id IN ('DLL01','BRS01')
ORDER BY prod_name;
輸出:
為什么要使用 IN 操作符荣德?其優(yōu)點如下。?
1.在有很多合法選項時童芹,IN 操作符的語法更清楚涮瞻,更直觀。?
2.在與其他 AND 和 OR 操作符組合使用 IN 時假褪,求值順序更容易管理署咽。?
3.IN 操作符一般比一組 OR 操作符執(zhí)行得更快(在上面這個合法選項很少的例子中,你看不出性能差異)生音。?
4. IN 的最大優(yōu)點是可以包含其他 SELECT 語句宁否,能夠更動態(tài)地建立WHERE 子句。
IN?WHERE 子句中用來指定要匹配值的清單的關鍵字久锥,功能與 OR 相當家淤。
5.3 NOT操作符
1. NOT? ?WHERE 子句中用來否定其后條件的關鍵字。
2. 因為 NOT 從不單獨使用(它總是與其他操作符一起使用)瑟由,所以它的語法與其他操作符有所不同絮重。NOT 關鍵字可以用在要過濾的列前冤寿,而不僅是在其后。
SELECT prod_name
FROM products
WHERE NOT vend_id='DLL01'
ORDER BY prod_name;
輸出:
5.4 小結
本節(jié)課學習了WHERE子句結合AND和OR操作符進行高級篩選青伤,以及如何使用IN 和NOT 操作符督怜。
WHERE NOT?vend_id='DLL01'
WHERE?vend_id?IN?('DLL01','BRS01')
-- ----------------------------------
-- ----------------第5課 高級數(shù)據(jù)篩選 WHERE AND OR IN NOT----------------------------------
-- ----------------------------------
-- 5.1.1 AND操作符
SELECT prod_id,prod_price,prod_name
FROM products
WHERE vend_id='DLL01' AND prod_price<=4;
-- 5.1.2 OR操作符
SELECT prod_id,prod_price,prod_name
FROM products
WHERE vend_id='DLL01' OR vend_id='BRS01';
-- 5.1.3 求值順序 AND>OR
SELECT prod_price,vend_id
FROM products
WHERE (vend_id='DLL01' OR vend_id='BRS01') AND prod_price>=10;
SELECT prod_price,vend_id
FROM products
WHERE vend_id='DLL01' OR vend_id='BRS01' AND prod_price>=10;
-- 5.2 IN操作符
SELECT prod_name,prod_price
FROM products
WHERE vend_id IN ('DLL01','BRS01')
ORDER BY prod_name;
-- 5.3 NOT操作符
SELECT prod_name
FROM products
WHERE NOT vend_id='DLL01'
ORDER BY prod_name;
挑戰(zhàn)題:
答案:https://forta.com/books/0135182794/challenges/
1. 編寫 SQL 語句,從 Vendors 表中檢索供應商名稱(vend_name)狠角,僅返回加利福尼亞州的供應商(這需要按國家[USA]和州[CA]進行過濾号杠,沒準其他國家也存在一個加利福尼亞州)。提示:過濾器需要匹配字符串丰歌。
SELECT vend_name
FROM Vendors
WHERE vend_country = 'USA' AND vend_state = 'CA';
2. 編寫 SQL 語句姨蟋,查找所有至少訂購了總量 100 個的 BR01、BR02 或BR03 的訂單立帖。你需要返回 OrderItems 表的訂單號(order_num)眼溶、產品 ID(prod_id)和數(shù)量,并按產品 ID 和數(shù)量進行過濾晓勇。提示:根據(jù)編寫過濾器的方式堂飞,可能需要特別注意求值順序。48 | 第 5 課 高級數(shù)據(jù)過濾
SELECT order_num,prid_id,quantity
FROM orderitems
WHERE prod_id IN('BR01','BR02','BR03') AND quantity>=100;
3. 現(xiàn)在绑咱,我們回顧上一課的挑戰(zhàn)題绰筛。編寫 SQL 語句,返回所有價格在 3美元到 6美元之間的產品的名稱(prod_name)和價格(prod_price)描融。使用 AND铝噩,然后按價格對結果進行排序。
SELECT prod_name,prod_price
FROM products
WHERE prod_price>=3 AND prod_price<=6
ORDER BY prod_price;
4. 下面的 SQL 語句有問題嗎窿克?(嘗試在不運行的情況下指出薄榛。)
SELECT vend_name
FROM Vendors
ORDER BY vend_name
WHERE vend_country = 'USA' AND vend_state = 'CA';
SELECT vend_name
FROM Vendors
WHERE vend_country = 'USA' AND vend_state = 'CA'
ORDER BY vend_name;