CodeGym /課程 /SQL SELF /邏輯運算子 (AND, OR, NOT):條件組合

邏輯運算子 (AND, OR, NOT):條件組合

SQL SELF
等級 2 , 課堂 2
開放

邏輯運算子就是幫你把查詢裡的條件組合起來,讓你可以更靈活地篩選資料。你大概在寫程式語言時就遇過這些東西了。如果把查詢比喻成信箱的垃圾郵件過濾程式,那邏輯運算子就像是決定信件要進「垃圾郵件」還是留在「收件匣」的規則。

SQL 是一個很常用來查資料或分析資料的工具。邏輯運算子(ANDORNOT)可以讓你在一個查詢裡組合多個條件,這樣就能回答更複雜的問題,比如:

  • 哪些學生超過 18 歲 而且 成績是 "A"?
  • 哪些商品屬於「電子產品」「家用電器」?
  • 哪些客戶沒買過東西

來看看 SQL 裡三個主要的邏輯運算子:

  1. AND:兩個條件都要成立。
  2. OR:只要有一個條件成立就好。
  3. 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:條件反向

如果 ANDOR 是讓條件成立,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" 的學生,就可以組合 ANDOR

組合語法

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 執行邏輯運算子的順序是這樣:

  1. NOT
  2. AND
  3. OR

你可以用括號來改變執行順序。沒加括號的話,結果可能會跟你想的不一樣喔!

範例:有括號跟沒括號的比較

這個查詢會發生什麼事?

SELECT name, age, grade
FROM students
WHERE age > 18 AND grade = 'A' OR grade = 'B';

這個查詢會選出:

  1. 超過 18 歲 而且 成績是 "A" 的學生。
  2. 成績是 "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" 的學生。括號真的會改變一切!

使用邏輯運算子的常見錯誤

  1. 忘記加括號。這很容易讓結果跟你預期的不一樣,尤其是 ANDOR 混用時。
  2. NOT 的時候沒搞清楚到底會排除哪些資料。
  3. 邏輯運算子用錯。比如該用 OR 結果用了 AND,或反過來。
  4. 條件太複雜。太長的條件串一堆 ANDORNOT 又沒加註解,會讓查詢很難懂。

這些運算子就是寫複雜查詢的基礎啦。現在你已經可以寫出不只會動,還能精準找到你要的資料的查詢囉!

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION