SQL WHERE 子句完整攻略:從入門到精通的資料篩選術(實戰範例+檢查清單)

更新 發佈閱讀 15 分鐘

寫給所有正在學習 SQL 的夥伴們

嗨,我是 Leon(亮之) 👋

今天想跟大家分享一個讓我在凌晨 2 點突然開竅的 SQL 技巧。

那天,我盯著電腦螢幕,手上有一個包含 1200 萬筆客戶資料的資料庫。老闆需要「住在台北、上個月消費超過 3000 元的客戶名單」,而且明天早上就要。

當時的我,感覺就像在大海撈針一樣無助。

直到我真正理解了 WHERE 子句的威力,才發現原來篩選資料可以這麼精準、這麼優雅。

今天這篇文章,我會把這幾年踩過的坑、學到的技巧,毫無保留地分享給你。

這篇文章你會學到:

  • WHERE 子句的基本語法與核心概念
  • 6 種比較運算子的實戰應用
  • AND/OR 混用的致命陷阱(90% 的人都會踩到)
  • LIKE 萬用字元的模式比對技巧
  • NULL 值處理的正確方式
  • 實戰範例與練習題

準備好了嗎?讓我們開始這趟 SQL 之旅 🚀


什麼是 WHERE 子句?

想像一下,你在夜市逛街。

每個攤位都在叫賣,但你只想找「賣雞排的攤位」。你的大腦會自動過濾掉賣飲料的、賣衣服的,只留下符合條件的攤位。

WHERE 子句就是 SQL 的過濾器。

它會檢查資料庫裡的每一筆資料:

  • 符合條件?✅ 通過
  • 不符合條件?❌ 過濾掉

基本語法:

SELECT 欄位1, 欄位2
FROM 資料表名稱
WHERE 條件;

重要觀念:

WHERE 會逐筆檢查每一列資料。如果條件為 TRUE,該列就會被選取;如果是 FALSE 或 NULL,就會被過濾掉。

這個概念看似簡單,但理解它對於寫出正確的查詢至關重要。


六大比較運算子:你的基本工具箱 🔧

學 SQL 就像學料理,你得先認識基本的調味料。

1. 等於 (=)

SELECT * FROM employees
WHERE department = '業務部';

找出完全符合的資料。記住:文字要加單引號 '文字',數字不用 salary = 50000

2. 不等於 (<> 或 !=)

SELECT * FROM orders
WHERE status <> '已取消';

排除特定值,找出「除了這個以外的所有資料」。

3-4. 大於/小於 (> 和 <)

SELECT * FROM products WHERE price > 1000;
SELECT * FROM students WHERE age < 18;

5-6. 大於等於/小於等於 (>= 和 <=)

SELECT * FROM employees
WHERE salary >= 30000 AND salary <= 60000;

新手最常犯的錯誤 ⚠️

錯誤: WHERE category = Electronics(忘記加引號)

正確: WHERE category = 'Electronics'

SQL 會把沒加引號的當成欄位名稱,不是值。這個錯誤我當年也犯過無數次 😅


AND、OR、NOT:組合條件的藝術 🎨

這裡是最精彩的部分,也是最容易出錯的地方。

AND 運算子:同時滿足所有條件

SELECT * FROM employees
WHERE department = '業務部'
AND salary > 40000
AND hire_date >= '2020-01-01';

所有條件都要是 TRUE 才會被選取。把 AND 想成「而且」,越加越嚴格。

OR 運算子:至少滿足一個條件

SELECT * FROM employees
WHERE department = '業務部'
OR department = '行銷部'
OR department = '客服部';

至少一個條件是 TRUE 就會被選取。把 OR 想成「或者」,越加越寬鬆。

90% 的人都會踩的坑:混用 AND/OR 不加括號

這是我去年浪費 3 小時才找到的 bug:

❌ 這樣寫會出問題:

SELECT * FROM products
WHERE category = '3C產品'
OR category = '電腦'
AND price < 5000;

你以為的意思:

「找出價格低於 5000 元的 3C 產品或電腦」

SQL 實際理解的意思:

「找出所有 3C 產品(不管價格)+ 價格低於 5000 元的電腦」

結果你會看到 50000 元的 MacBook 也出現在「5000 元以下」的查詢結果裡 😱

為什麼? 因為 AND 的優先權比 OR 高!

✅ 正確寫法:永遠加括號

WHERE (category = '3C產品' OR category = '電腦')
AND price < 5000;

我的黃金守則: 只要混用 AND/OR,就加括號。每一次,沒有例外。

凌晨 2 點 debug 的你會感謝現在的自己 🙏


LIKE:模糊搜尋的魔法 🔍

有時候你不知道確切的值,只知道部分資訊。這時候就需要 LIKE。

百分比符號 (%) - 代表任意長度的字元

-- 開頭是「張」
WHERE name LIKE '張%'
-- 符合:張三、張小明、張家豪

-- 結尾是「有限公司」
WHERE company_name LIKE '%有限公司'
-- 符合:台積電有限公司、鴻海有限公司

-- 包含「資訊」
WHERE department LIKE '%資訊%'
-- 符合:資訊部、資訊技術部、管理資訊部

底線符號 (_) - 代表單一字元

-- 手機格式:09XX-XXX-XXX
WHERE phone LIKE '09__-___-___'

-- 4 碼產品代碼,開頭是 A
WHERE product_code LIKE 'A___'
-- 符合:A001ABCDA999

效能警告 ⚠️

這是很多教學不會告訴你的事:

開頭使用 % 的模式(LIKE '%搜尋%')無法使用索引,在大型資料表上會非常慢。

快速: LIKE '張%'(可以使用索引)

緩慢: LIKE '%張%'(全表掃描)

在正式環境要謹慎使用開頭萬用字元。


NULL 陷阱:為什麼 = NULL 永遠不會有結果? 🕳️

這是每個 SQL 初學者都會遇到的噩夢。包括我。

❌ 這樣寫是錯的(而且會浪費你很多時間):

SELECT * FROM employees
WHERE manager_id = NULL;
-- 永遠返回 0 筆資料,即使真的有 NULL 值!

✅ 永遠使用 IS NULL:

SELECT * FROM employees
WHERE manager_id IS NULL;

進階技巧:讓你的查詢更優雅 ✨

掌握基礎後,這些技巧會讓你的 SQL 更專業。

BETWEEN:範圍查詢

與其這樣寫:

WHERE price >= 1000 AND price <= 5000

不如用 BETWEEN:

WHERE price BETWEEN 1000 AND 5000

更簡潔對吧?日期也可以用:

WHERE order_date BETWEEN '2025-01-01' AND '2025-12-31'

IN:多個值的選擇

與其這樣寫:

WHERE status = '待處理' 
OR status = '處理中'
OR status = '已出貨'

用 IN 更清楚:

WHERE status IN ('待處理', '處理中', '已出貨')

也可以用 NOT IN:

WHERE department NOT IN ('業務部', '行銷部')

三個你會犯的錯誤(以及如何避免) 🚨

錯誤 #1:在 WHERE 中使用欄位別名

❌ 這樣不行:

SELECT 
price * 1.1 AS price_with_tax
FROM products
WHERE price_with_tax > 1000;
-- 錯誤:'price_with_tax' 不存在

為什麼? SQL 執行順序:

  1. FROM(確定資料表)
  2. WHERE(篩選資料)
  3. SELECT(選擇欄位)

WHERE 在 SELECT 之前執行,所以別名還不存在。

✅ 正確做法:重複計算

WHERE price * 1.1 > 1000

錯誤 #2:忘記在文字加引號

我現在還是偶爾會犯這個錯:

WHERE category = Electronics

WHERE category = 'Electronics'

錯誤 #3:忽略大小寫敏感性

根據資料庫設定,這可能會或不會配對到 'SMITH' 或 'smith':

WHERE last_name = 'Smith'

強制不分大小寫比對:

WHERE LOWER(last_name) = 'smith'

快速參考:WHERE vs HAVING

很多人會問我這個問題。簡單版本:

WHERE 在分組前篩選個別資料列:

SELECT department, COUNT(*)
FROM employees
WHERE salary > 40000 -- 先篩選個別員工
GROUP BY department;

HAVING 在聚合後篩選群組:

SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING COUNT(*) > 10; -- 篩選群組

記憶法:

  • WHERE 用於欄位值
  • HAVING 用於聚合結果(COUNT、SUM、AVG)

實戰練習:你能找出幾個問題? 🎯

這個查詢有多個問題。你能找出幾個?

SELECT * FROM products
WHERE category = Electronics
OR price < 1000
AND in_stock = NULL
AND created_date = '2025-10-19';

提示:至少有 4 個以上的問題!

往下滾動看答案...

.

.

.

找到的問題:

  1. Electronics 缺少引號 → 應該是 'Electronics'
  2. ❌ 混用 AND/OR 沒加括號
  3. ❌ 使用 = NULL → 應該用 IS NULL
  4. ❌ 使用 SELECT *(小問題,但正式環境應避免)
  5. ❌ 日期比較可能需要範圍(如果 created_date 包含時間)

你找到幾個?


你的 WHERE 子句檢查清單 📋

在按下執行鍵之前,先檢查這些:

✅ 黃金守則:

  1. 文字要加單引號:'文字'
  2. 使用 IS NULL,永遠不要用 = NULL
  3. 混用 AND/OR?加括號
  4. LIKE 開頭用 % 很慢 — 謹慎使用
  5. WHERE 在 SELECT 之前執行 — 不能用欄位別名

✅ 常用模式:

  • 精確配對:WHERE column = 'value'
  • 多個值:WHERE column IN ('a', 'b', 'c')
  • 範圍:WHERE column BETWEEN x AND y
  • 部分配對:WHERE column LIKE 'pattern%'
  • 找出空值:WHERE column IS NULL

寫在最後 💭

還記得文章開頭那個凌晨 2 點的任務嗎?

最後我用一個簡單的 WHERE 子句就解決了:

SELECT customer_name, total_spent
FROM customers
WHERE city = '台北市'
AND total_spent > 3000
AND last_order_date >= '2025-09-01';

3 行 SQL。47 筆結果。老闆滿意。任務完成。

這就是掌握 WHERE 子句的力量。

接下來學什麼?

如果你覺得這篇文章有幫助,接下來我會分享:

  • LeetCode Databse 解決心得:LeetCode 題目解決體會
  • SQL JOIN 完全指南:如何結合多個資料表
  • 子查詢精通術:查詢中的查詢
  • 效能優化秘訣:讓你的查詢飛起來

實戰練習題 📝

試著寫出以下查詢:

  1. 找出所有在台北或高雄的客戶
  2. 找出價格在 1000-5000 元之間的產品
  3. 找出 2020 年後入職且薪水超過 50000 的員工
  4. 找出名字包含「資訊」的部門
  5. 找出沒有主管的員工

歡迎在留言區分享你的答案!我會一一回覆 😊


如果這篇文章對你有幫助... 🙏

請幫我:

  • 👏 按個喜歡(你的鼓勵是我寫作的動力)
  • 💬 在留言區分享你的學習心得或疑問
  • 🔄 分享給正在學 SQL 的朋友
  • ⭐ 追蹤我的方格子,不錯過新文章

你的每一個互動,都是支持我繼續創作的能量 ❤️

延伸閱讀


關於作者

我是 Leon(亮之),一個熱愛分享技術知識的工程師,Notion軟體愛好者。專注於用最淺顯易懂的方式,講解程式設計與資料庫的核心概念。

如果你也在學習 SQL、Python、資料科學或者Notion軟體的技巧,歡迎追蹤我的方格子,一起成長!

有任何問題或建議,歡迎在留言區告訴我,我會盡快回覆 😊

留言
avatar-img
留言分享你的想法!
avatar-img
Leon Wong 282
3會員
11內容數
Hi,我是 Leon Wong(亮之)——電腦科學與開發愛好者,也是 Notion 重度使用者。如果你想更高效地學習與創作,這裡會是你的實用資源。
Leon Wong 282的其他內容
2025/10/19
SQL 是程式開發人員必學的工具,但新手常常會犯一些常見的錯誤,例如使用 `= NULL` 而不是 `IS NULL`,或是忘記為字串加上引號。本文將整理 7 個最常見的 SQL 錯誤,分析錯誤原因並提供正確的解法,幫助你避免走冤枉路,大幅提升開發效率。
2025/10/19
SQL 是程式開發人員必學的工具,但新手常常會犯一些常見的錯誤,例如使用 `= NULL` 而不是 `IS NULL`,或是忘記為字串加上引號。本文將整理 7 個最常見的 SQL 錯誤,分析錯誤原因並提供正確的解法,幫助你避免走冤枉路,大幅提升開發效率。
2025/10/16
上週,我花了 20 分鐘在 Word 裡排版一份文件。標題調得漂漂亮亮,項目符號排列整齊,字體大小都恰到好處。按下傳送鍵,信心滿滿地等待同事回覆。 結果呢? 「欸,你傳的檔案格式跑掉了耶。」同事傳來訊息,還附上一張慘不忍睹的截圖——我的精心排版完全崩潰,看起來就像綁匪的恐嚇信。 我知道你一定也
2025/10/16
上週,我花了 20 分鐘在 Word 裡排版一份文件。標題調得漂漂亮亮,項目符號排列整齊,字體大小都恰到好處。按下傳送鍵,信心滿滿地等待同事回覆。 結果呢? 「欸,你傳的檔案格式跑掉了耶。」同事傳來訊息,還附上一張慘不忍睹的截圖——我的精心排版完全崩潰,看起來就像綁匪的恐嚇信。 我知道你一定也
2025/10/15
你剛發現 Markdown 這個東西,每個人都說它「很簡單」,但你盯著那些星號、井字號和括號,完全不知道從何下手。 同事隨口提到他所有文件都用 Markdown 寫。你喜歡的技術部落格用它。GitHub 上到處都是 README 檔案。但當你試著自己學習時,那些文件讓人頭昏腦脹,教學又假設你已經懂
2025/10/15
你剛發現 Markdown 這個東西,每個人都說它「很簡單」,但你盯著那些星號、井字號和括號,完全不知道從何下手。 同事隨口提到他所有文件都用 Markdown 寫。你喜歡的技術部落格用它。GitHub 上到處都是 README 檔案。但當你試著自己學習時,那些文件讓人頭昏腦脹,教學又假設你已經懂
看更多
你可能也想看
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
※ 語法 SELECT select_list FROM table_name​ ※ 解析順序 From:從哪裡拿? SELECT:要 "拿什麼" 資料? ※ 使用場景: Single column(單一欄位): Multiple column(多個欄位): All colu
Thumbnail
※ 語法 SELECT select_list FROM table_name​ ※ 解析順序 From:從哪裡拿? SELECT:要 "拿什麼" 資料? ※ 使用場景: Single column(單一欄位): Multiple column(多個欄位): All colu
Thumbnail
在進行SQL查詢邏輯更改時,需要適當地使用SubQuery和join來達到新的排序需求。本文將介紹原本的撈取邏輯、需求以及如何使用SubQuery來解決新的排序需求。
Thumbnail
在進行SQL查詢邏輯更改時,需要適當地使用SubQuery和join來達到新的排序需求。本文將介紹原本的撈取邏輯、需求以及如何使用SubQuery來解決新的排序需求。
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
最近有新的訂閱者加入, 想趁這個機會再分享一次學習心法與建議給第一次練習的讀者、同學們。 如果你本身已經很熟練演算法,那隨機挑題目練習ok,可以測試觀念是否正確,並且驗證寫code的效率與正確程度。 如果是剛畢業或還在學,以前沒有打過程式競賽。 想開始有系統地增強演算法&資料結構的能力
Thumbnail
最近有新的訂閱者加入, 想趁這個機會再分享一次學習心法與建議給第一次練習的讀者、同學們。 如果你本身已經很熟練演算法,那隨機挑題目練習ok,可以測試觀念是否正確,並且驗證寫code的效率與正確程度。 如果是剛畢業或還在學,以前沒有打過程式競賽。 想開始有系統地增強演算法&資料結構的能力
Thumbnail
日前在LINE社群,有網友提出一個問題,要把資料進行分析,用日期來計算出將對應的資料。 原始資料,密密麻麻的數據,都看不清楚了 放大一點點 要把這些資料不同『料號』的各種『狀態』依據『日期』進行分析。 有興趣可以下載試著挑戰看看:檔案下載 作法有很多種,當然也可以用函數處
Thumbnail
日前在LINE社群,有網友提出一個問題,要把資料進行分析,用日期來計算出將對應的資料。 原始資料,密密麻麻的數據,都看不清楚了 放大一點點 要把這些資料不同『料號』的各種『狀態』依據『日期』進行分析。 有興趣可以下載試著挑戰看看:檔案下載 作法有很多種,當然也可以用函數處
Thumbnail
題目敘述 題目會給定兩個輸入。 第一個輸入是關鍵字清單products,第二個是使用者輸入的字串searchWord。 要求我們實現關鍵字搜尋建議系統,使用者每輸入一個字元就推薦一次。 推薦時,優先返回字典序(Lecial order)最接近的關鍵字,最多不要超過三個關鍵字。 題目的原文
Thumbnail
題目敘述 題目會給定兩個輸入。 第一個輸入是關鍵字清單products,第二個是使用者輸入的字串searchWord。 要求我們實現關鍵字搜尋建議系統,使用者每輸入一個字元就推薦一次。 推薦時,優先返回字典序(Lecial order)最接近的關鍵字,最多不要超過三個關鍵字。 題目的原文
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News