前面提到,WHERE 篩選條件可以有效減少資料量,讓後續運算更快。
那除了 =(等於)之外,還有哪些好用的篩選條件呢?
這篇文章會介紹幾個常用的布林運算子,讓你的 WHERE 條件更靈活。
什麼是布林運算?
WHERE 篩選條件的本質是什麼?
就是判斷每一筆資料「符合」或「不符合」條件。
符合,就留下來。
不符合,就過濾掉。
這種只有「符合」或「不符合」兩種結果的運算,在程式設計中叫做布林運算。
「符合」用 true(真)表示,「不符合」用 false(假)表示。
用表格理解布林運算
假設有一張會員表單:
| id | 姓 | 名 |
|---|---|---|
| 1 | 王 | 小明 |
| 2 | 陳 | 大華 |
| 3 | 王 | 小美 |
| 4 | 林 | 志明 |
當你寫:
SELECT * FROM 會員 WHERE 姓 = '王'資料庫會對每一筆資料做布林運算:
| id | 姓 | 名 | 姓 = ‘王’ 的結果 |
|---|---|---|---|
| 1 | 王 | 小明 | true ✓ 留下 |
| 2 | 陳 | 大華 | false ✗ 過濾 |
| 3 | 王 | 小美 | true ✓ 留下 |
| 4 | 林 | 志明 | false ✗ 過濾 |
最後輸出的結果只有 id 1 和 id 3。
布林運算子
前面學過的 =(等於)就是一個布林運算子。
它會比對兩邊的值是否相等,然後回傳 true 或 false。
接下來介紹更多好用的布林運算子,讓你的 WHERE 條件更靈活。
AND、OR、NOT:組合多個條件
AND:兩個條件都要符合
WHERE 姓 = '王' AND 名 = '小明'姓要是「王」,而且名要是「小明」,兩個條件都符合,才會被篩選出來。
用表格來看會更清楚:
| id | 姓 | 名 | 姓 = ‘王’ | 名 = ‘小明’ | AND 結果 |
|---|---|---|---|---|---|
| 1 | 王 | 小明 | true | true | true ✓ 留下 |
| 2 | 陳 | 大華 | false | false | false ✗ 過濾 |
| 3 | 王 | 小美 | true | false | false ✗ 過濾 |
| 4 | 林 | 小明 | false | true | false ✗ 過濾 |
AND 的規則是:兩個條件都是 true,結果才是 true。
OR:其中一個條件符合就好
WHERE 姓 = '陳' OR 姓 = '黃'姓是「陳」或姓是「黃」,只要符合其中一個,就會被篩選出來。
用表格來看:
| id | 姓 | 名 | 姓 = ‘陳’ | 姓 = ‘黃’ | OR 結果 |
|---|---|---|---|---|---|
| 1 | 王 | 小明 | false | false | false ✗ 過濾 |
| 2 | 陳 | 大華 | true | false | true ✓ 留下 |
| 3 | 黃 | 小美 | false | true | true ✓ 留下 |
| 4 | 林 | 志明 | false | false | false ✗ 過濾 |
OR 的規則是:只要其中一個條件是 true,結果就是 true。
小心 AND 和 OR 的混淆
日常生活中,AND 和 OR 的用法常常很混亂。
舉個例子,老闆說:「請你幫我挑出姓陳跟姓黃的人。」
聽起來像是 AND,但仔細想想:會有人同時姓陳又姓黃嗎?
不會。
所以老闆的意思其實是 OR:姓陳或姓黃。
-- 錯誤寫法:不會有人同時姓陳又姓黃
WHERE 姓 = '陳' AND 姓 = '黃'
-- 正確寫法:姓陳或姓黃
WHERE 姓 = '陳' OR 姓 = '黃'寫 SQL 的時候,要把邏輯想清楚,不要被日常用語搞混。
IS NULL、IS NOT NULL:判斷空值
有時候我們需要篩選出「沒有填資料」的欄位。
舉個例子,假設會員表單有一個「結婚對象」欄位:
| id | 姓名 | 結婚對象 |
|---|---|---|
| 1 | 小明 | 小美 |
| 2 | 大華 | NULL |
| 3 | 志偉 | NULL |
| 4 | 小芳 | 大雄 |
id 2 和 id 3 的「結婚對象」是 NULL,代表沒有填資料(可能是未婚)。
如果老闆說:「幫我找出還沒結婚的人。」
你可能會想:用 = NULL 不就好了?
= NULL 不會得到你要的結果
-- 這樣寫不會得到你要的結果
WHERE 結婚對象 = NULL但這樣寫是錯的。
NULL 是一個特殊的值,它代表「未知」或「不存在」。
NULL 有一個很奇怪的特性:任何 NULL 都不等於任何 NULL。
甚至 NULL = NULL 的結果也不是 true,而是 NULL。
所以用 = NULL 來篩選,永遠篩選不到任何資料。
用 IS NULL 和 IS NOT NULL
要判斷空值,必須用專門的運算子 IS。
為什麼要用 IS 而不是 =?
= 是「比較兩個值是否相等」,它會回傳 true 或 false。
但 NULL 代表「未知」,你沒辦法拿一個值去跟「未知」比較。
所以 = NULL 的結果永遠是 NULL,不是 true 也不是 false。
IS 則是專門用來「確認是不是 NULL」的運算子。
它不是在比較值,而是在問:「這個欄位是不是 NULL?」
| 運算子 | 用途 | 範例 |
|---|---|---|
= | 比較兩個值是否相等 | WHERE 姓 = '王' |
IS | 確認是不是 NULL | WHERE 結婚對象 IS NULL |
回到前面的會員表單:
| id | 姓名 | 結婚對象 |
|---|---|---|
| 1 | 小明 | 小美 |
| 2 | 大華 | NULL |
| 3 | 志偉 | NULL |
| 4 | 小芳 | 大雄 |
-- 篩選出還沒結婚的人(結婚對象是 NULL)
WHERE 結婚對象 IS NULL
-- 結果:大華、志偉
-- 篩選出已經結婚的人(結婚對象不是 NULL)
WHERE 結婚對象 IS NOT NULL
-- 結果:小明、小芳IN:一次比對多個值
如果老闆說:「請你挑出姓張、姓李、姓周、姓吳的人。」
你會怎麼寫?
用 OR 的話:
WHERE 姓 = '張' OR 姓 = '李' OR 姓 = '周' OR 姓 = '吳'一直 OR 下去,很麻煩,也很容易出錯。
這時候可以用 IN:
WHERE 姓 IN ('張', '李', '周', '吳')簡潔多了。
IN 後面接一組值,用圓括號包起來,用逗點隔開。
只要欄位的值符合其中任何一個,就會被篩選出來。
LIKE:模糊比對字串
前面學的 = 是精確比對,字串要完全一樣才算符合。
但有時候你只記得部分內容,怎麼辦?
這時候可以用 LIKE 做模糊比對。
萬用字元:%
% 代表「0 到多個任意字元」。
舉個例子:
-- 找出 email 是 @gmail.com 結尾的人
WHERE email LIKE '%@gmail.com'% 在 @gmail.com 前面,表示前面可以是任意字元。
所以 john@gmail.com、mary123@gmail.com 都會被篩選出來。
LIKE 的各種用法
| 寫法 | 意思 | 符合的例子 |
|---|---|---|
LIKE '志%' | 以「志」開頭 | 志明、志偉、志強 |
LIKE '%明' | 以「明」結尾 | 志明、小明、大明 |
LIKE '%志%' | 包含「志」 | 志明、明志、立志偉 |
LIKE '%志%明%' | 包含「志」且「志」在「明」前面 | 志明、志大明、阿志小明 |
萬用字元:_(底線)
_ 代表「剛好 1 個任意字元」。
舉個例子:
-- 找出名字是「志X明」的人(中間剛好一個字)
WHERE 名字 LIKE '志_明'這樣會篩選出「志大明」、「志小明」,但不會篩選出「志明」或「志大大明」。
% 和 _ 的差別
| 萬用字元 | 意思 | 範例 |
|---|---|---|
% | 0 到多個任意字元 | 志% 符合「志」、「志明」、「志大明」 |
_ | 剛好 1 個任意字元 | 志_ 符合「志明」、「志偉」,但不符合「志」或「志大明」 |
LIKE 的實際應用
假設客人打電話來說:「我買了一個什麼什麼風扇,想查一下訂單。」
他不記得完整的商品名稱,只記得有「風扇」兩個字。
這時候你可以這樣查:
WHERE 商品名稱 LIKE '%風扇%'這樣就能找出所有商品名稱包含「風扇」的訂單。
LIKE 在日常查詢中非常好用,請務必熟悉它的用法。
小結
這篇文章介紹了 WHERE 常用的篩選條件:
- 布林運算:篩選條件的結果只有
true或false - AND、OR、NOT:組合多個條件,小心日常用語的混淆
- IS NULL、IS NOT NULL:判斷空值,不能用
= NULL - IN:一次比對多個值,比一堆 OR 簡潔
- LIKE:模糊比對字串,用
%代表任意字元,用_代表一個字元
熟悉這些篩選條件,你就能更靈活地從資料庫中篩選出你要的資料。