Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

網站會不定期發佈技術筆記、職場心得相關的內容,歡迎關注本站!

網站
首頁關於我部落格
部落格
分類系列文

© 新人日誌. All rights reserved. 2020-present.

本文為「SQL 資料庫新手村」系列第 34 篇

SQL SELECT 入門:WHERE 常用的篩選條件

最後更新:2026年1月19日資料庫

前面提到,WHERE 篩選條件可以有效減少資料量,讓後續運算更快。

那除了 =(等於)之外,還有哪些好用的篩選條件呢?

這篇文章會介紹幾個常用的布林運算子,讓你的 WHERE 條件更靈活。

什麼是布林運算?

WHERE 篩選條件的本質是什麼?

就是判斷每一筆資料「符合」或「不符合」條件。

符合,就留下來。

不符合,就過濾掉。

這種只有「符合」或「不符合」兩種結果的運算,在程式設計中叫做布林運算。

「符合」用 true(真)表示,「不符合」用 false(假)表示。

用表格理解布林運算

假設有一張會員表單:

id姓名
1王小明
2陳大華
3王小美
4林志明
姓王
名小明
姓陳
名大華
姓王
名小美
姓林
名志明

當你寫:

SELECT * FROM 會員 WHERE 姓 = '王'

資料庫會對每一筆資料做布林運算:

id姓名姓 = ‘王’ 的結果
1王小明true ✓ 留下
2陳大華false ✗ 過濾
3王小美true ✓ 留下
4林志明false ✗ 過濾
姓王
名小明
姓 = ‘王’ 的結果true ✓ 留下
姓陳
名大華
姓 = ‘王’ 的結果false ✗ 過濾
姓王
名小美
姓 = ‘王’ 的結果true ✓ 留下
姓林
名志明
姓 = ‘王’ 的結果false ✗ 過濾

最後輸出的結果只有 id 1 和 id 3。

布林運算子

前面學過的 =(等於)就是一個布林運算子。

它會比對兩邊的值是否相等,然後回傳 true 或 false。

接下來介紹更多好用的布林運算子,讓你的 WHERE 條件更靈活。

AND、OR、NOT:組合多個條件

AND:兩個條件都要符合

WHERE 姓 = '王' AND 名 = '小明'

姓要是「王」,而且名要是「小明」,兩個條件都符合,才會被篩選出來。

用表格來看會更清楚:

id姓名姓 = ‘王’名 = ‘小明’AND 結果
1王小明truetruetrue ✓ 留下
2陳大華falsefalsefalse ✗ 過濾
3王小美truefalsefalse ✗ 過濾
4林小明falsetruefalse ✗ 過濾
姓王
名小明
姓 = ‘王’true
名 = ‘小明’true
AND 結果true ✓ 留下
姓陳
名大華
姓 = ‘王’false
名 = ‘小明’false
AND 結果false ✗ 過濾
姓王
名小美
姓 = ‘王’true
名 = ‘小明’false
AND 結果false ✗ 過濾
姓林
名小明
姓 = ‘王’false
名 = ‘小明’true
AND 結果false ✗ 過濾

AND 的規則是:兩個條件都是 true,結果才是 true。

OR:其中一個條件符合就好

WHERE 姓 = '陳' OR 姓 = '黃'

姓是「陳」或姓是「黃」,只要符合其中一個,就會被篩選出來。

用表格來看:

id姓名姓 = ‘陳’姓 = ‘黃’OR 結果
1王小明falsefalsefalse ✗ 過濾
2陳大華truefalsetrue ✓ 留下
3黃小美falsetruetrue ✓ 留下
4林志明falsefalsefalse ✗ 過濾
姓王
名小明
姓 = ‘陳’false
姓 = ‘黃’false
OR 結果false ✗ 過濾
姓陳
名大華
姓 = ‘陳’true
姓 = ‘黃’false
OR 結果true ✓ 留下
姓黃
名小美
姓 = ‘陳’false
姓 = ‘黃’true
OR 結果true ✓ 留下
姓林
名志明
姓 = ‘陳’false
姓 = ‘黃’false
OR 結果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小芳大雄
姓名小明
結婚對象小美
姓名大華
結婚對象NULL
姓名志偉
結婚對象NULL
姓名小芳
結婚對象大雄

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確認是不是 NULLWHERE 結婚對象 IS NULL
用途比較兩個值是否相等
範例WHERE 姓 = '王'
用途確認是不是 NULL
範例WHERE 結婚對象 IS NULL

回到前面的會員表單:

id姓名結婚對象
1小明小美
2大華NULL
3志偉NULL
4小芳大雄
姓名小明
結婚對象小美
姓名大華
結婚對象NULL
姓名志偉
結婚對象NULL
姓名小芳
結婚對象大雄
-- 篩選出還沒結婚的人(結婚對象是 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 個任意字元志_ 符合「志明」、「志偉」,但不符合「志」或「志大明」
意思0 到多個任意字元
範例志% 符合「志」、「志明」、「志大明」
意思剛好 1 個任意字元
範例志_ 符合「志明」、「志偉」,但不符合「志」或「志大明」

LIKE 的實際應用

假設客人打電話來說:「我買了一個什麼什麼風扇,想查一下訂單。」

他不記得完整的商品名稱,只記得有「風扇」兩個字。

這時候你可以這樣查:

WHERE 商品名稱 LIKE '%風扇%'

這樣就能找出所有商品名稱包含「風扇」的訂單。

LIKE 在日常查詢中非常好用,請務必熟悉它的用法。

小結

這篇文章介紹了 WHERE 常用的篩選條件:

  1. 布林運算:篩選條件的結果只有 true 或 false
  2. AND、OR、NOT:組合多個條件,小心日常用語的混淆
  3. IS NULL、IS NOT NULL:判斷空值,不能用 = NULL
  4. IN:一次比對多個值,比一堆 OR 簡潔
  5. LIKE:模糊比對字串,用 % 代表任意字元,用 _ 代表一個字元

熟悉這些篩選條件,你就能更靈活地從資料庫中篩選出你要的資料。

上一篇SQL SELECT 入門:理解資料庫的運算方式
下一篇SQL SELECT 入門:用 ORDER BY 排序資料
目前還沒有留言,成為第一個留言的人吧!

發表留言

留言將在審核後顯示。

資料庫

目錄

  • 什麼是布林運算?
  • 用表格理解布林運算
  • 布林運算子
  • AND、OR、NOT:組合多個條件
  • AND:兩個條件都要符合
  • OR:其中一個條件符合就好
  • 小心 AND 和 OR 的混淆
  • IS NULL、IS NOT NULL:判斷空值
  • = NULL 不會得到你要的結果
  • 用 IS NULL 和 IS NOT NULL
  • IN:一次比對多個值
  • LIKE:模糊比對字串
  • 萬用字元:%
  • LIKE 的各種用法
  • 萬用字元:_(底線)
  • % 和 _ 的差別
  • LIKE 的實際應用
  • 小結