寫給所有正在學習 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___'
-- 符合:A001、ABCD、A999
效能警告 ⚠️
這是很多教學不會告訴你的事:
開頭使用 % 的模式(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 執行順序:
- FROM(確定資料表)
- WHERE(篩選資料)
- 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 個以上的問題!
往下滾動看答案...
.
.
.
找到的問題:
- ❌
Electronics缺少引號 → 應該是'Electronics' - ❌ 混用 AND/OR 沒加括號
- ❌ 使用
= NULL→ 應該用IS NULL - ❌ 使用
SELECT *(小問題,但正式環境應避免) - ❌ 日期比較可能需要範圍(如果 created_date 包含時間)
你找到幾個?
你的 WHERE 子句檢查清單 📋
在按下執行鍵之前,先檢查這些:
✅ 黃金守則:
- 文字要加單引號:
'文字' - 使用
IS NULL,永遠不要用= NULL - 混用 AND/OR?加括號
- LIKE 開頭用
%很慢 — 謹慎使用 - 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 完全指南:如何結合多個資料表
- 子查詢精通術:查詢中的查詢
- 效能優化秘訣:讓你的查詢飛起來
實戰練習題 📝
試著寫出以下查詢:
- 找出所有在台北或高雄的客戶
- 找出價格在 1000-5000 元之間的產品
- 找出 2020 年後入職且薪水超過 50000 的員工
- 找出名字包含「資訊」的部門
- 找出沒有主管的員工
歡迎在留言區分享你的答案!我會一一回覆 😊
如果這篇文章對你有幫助... 🙏
請幫我:
- 👏 按個喜歡(你的鼓勵是我寫作的動力)
- 💬 在留言區分享你的學習心得或疑問
- 🔄 分享給正在學 SQL 的朋友
- ⭐ 追蹤我的方格子,不錯過新文章
你的每一個互動,都是支持我繼續創作的能量 ❤️
延伸閱讀
關於作者
我是 Leon(亮之),一個熱愛分享技術知識的工程師,Notion軟體愛好者。專注於用最淺顯易懂的方式,講解程式設計與資料庫的核心概念。
如果你也在學習 SQL、Python、資料科學或者Notion軟體的技巧,歡迎追蹤我的方格子,一起成長!
有任何問題或建議,歡迎在留言區告訴我,我會盡快回覆 😊













