邏輯運算子就是幫你把查詢裡的條件組合起來,讓你可以更靈活地篩選資料。你大概在寫程式語言時就遇過這些東西了。如果把查詢比喻成信箱的垃圾郵件過濾程式,那邏輯運算子就像是決定信件要進「垃圾郵件」還是留在「收件匣」的規則。
SQL 是一個很常用來查資料或分析資料的工具。邏輯運算子(AND、OR、NOT)可以讓你在一個查詢裡組合多個條件,這樣就能回答更複雜的問題,比如:
- 哪些學生超過 18 歲 而且 成績是 "A"?
- 哪些商品屬於「電子產品」或「家用電器」?
- 哪些客戶沒買過東西?
來看看 SQL 裡三個主要的邏輯運算子:
AND:兩個條件都要成立。OR:只要有一個條件成立就好。NOT:把條件反過來(否定)。
運算子 AND:兩個條件都要成立
AND 運算子可以讓你指定,只有當兩個條件都成立時,這一列資料才會被選出來。
語法
SELECT 欄位1, 欄位2
FROM 表格
WHERE 條件1 AND 條件2;
範例 1:篩選超過 18 歲 而且 成績是 "A" 的學生
假設我們有一個 students 表:
| id | name | age | grade |
|---|---|---|---|
| 1 | Alex | 20 | A |
| 2 | Maria | 19 | B |
| 3 | Otto | 17 | A |
| 4 | Anna | 22 | A |
查詢:
SELECT name, age, grade
FROM students
WHERE age > 18 AND grade = 'A';
結果:
| name | age | grade |
|---|---|---|
| Alex | 20 | A |
| Anna | 22 | A |
範例 2:篩選部門是 "HR" 而且 薪水超過 50000 的員工
SELECT name, department, salary
FROM employees
WHERE department = 'HR' AND salary > 50000;
運算子 OR:只要有一個條件成立
OR 運算子用在你想選出只要有一個條件成立的資料列時。
語法
SELECT 欄位1, 欄位2
FROM 表格
WHERE 條件1 OR 條件2;
範例 1:篩選成績是 "A" 或 "B" 的學生
SELECT name, age, grade
FROM students
WHERE grade = 'A' OR grade = 'B';
結果:
| name | age | grade |
|---|---|---|
| Alex | 20 | A |
| Maria | 19 | B |
| Otto | 17 | A |
| Anna | 22 | A |
範例 2:商品屬於「電子產品」或價格小於 100
products 表:
| product_id | name | category | price |
|---|---|---|---|
| 1 | 電視 | 電子產品 | 300 |
| 2 | 熨斗 | 家用電器 | 50 |
| 3 | 智慧型手機 | 電子產品 | 700 |
| 4 | 熱水壺 | 家用電器 | 80 |
SELECT name, category, price
FROM products
WHERE category = '電子產品' OR price < 100;
結果:
| name | category | price |
|---|---|---|
| 電視 | 電子產品 | 300 |
| 熨斗 | 家用電器 | 50 |
| 熱水壺 | 家用電器 | 80 |
| 智慧型手機 | 電子產品 | 700 |
運算子 NOT:條件反向
如果 AND 跟 OR 是讓條件成立,NOT 就是反過來:它會選出那些不符合條件的資料列。
語法
SELECT 欄位1, 欄位2
FROM 表格
WHERE NOT 條件;
範例 1:篩選沒有成績 "A" 的學生
SELECT name, age, grade
FROM students
WHERE NOT grade = 'A';
結果:
| name | age | grade |
|---|---|---|
| Maria | 19 | B |
範例 2:選出不屬於「電子產品」類別的商品
SELECT name, category, price
FROM products
WHERE NOT category = '電子產品';
邏輯運算子的組合
你可以把邏輯運算子組合起來,做出更複雜的條件。比如你想選出超過 18 歲 而且 成績是 "A" 或 "B" 的學生,就可以組合 AND 跟 OR。
組合語法
SELECT 欄位1, 欄位2
FROM 表格
WHERE (條件1 AND 條件2) OR 條件3;
範例:超過 18 歲且成績 "A" 或 成績 "B" 的學生
SELECT name, age, grade
FROM students
WHERE (age > 18 AND grade = 'A') OR grade = 'B';
結果:
| name | age | grade |
|---|---|---|
| Alex | 20 | A |
| Anna | 22 | A |
| Maria | 19 | B |
運算子的執行優先順序
要記得,SQL 執行邏輯運算子的順序是這樣:
NOTANDOR
你可以用括號來改變執行順序。沒加括號的話,結果可能會跟你想的不一樣喔!
範例:有括號跟沒括號的比較
這個查詢會發生什麼事?
SELECT name, age, grade
FROM students
WHERE age > 18 AND grade = 'A' OR grade = 'B';
這個查詢會選出:
- 超過 18 歲 而且 成績是 "A" 的學生。
- 成績是 "B" 的學生。
運算子的執行優先順序會讓結果跟加括號一樣:
SELECT name, age, grade
FROM students
WHERE (age > 18 AND grade = 'A') OR (grade = 'B');
但如果你加了括號:
SELECT name, age, grade
FROM students
WHERE age > 18 AND (grade = 'A' OR grade = 'B');
這樣就只會選出超過 18 歲而且成績是 "A" 或 "B" 的學生。括號真的會改變一切!
使用邏輯運算子的常見錯誤
- 忘記加括號。這很容易讓結果跟你預期的不一樣,尤其是
AND跟OR混用時。 - 用
NOT的時候沒搞清楚到底會排除哪些資料。 - 邏輯運算子用錯。比如該用
OR結果用了AND,或反過來。 - 條件太複雜。太長的條件串一堆
AND、OR、NOT又沒加註解,會讓查詢很難懂。
這些運算子就是寫複雜查詢的基礎啦。現在你已經可以寫出不只會動,還能精準找到你要的資料的查詢囉!
GO TO FULL VERSION