WHERE 條件篩選
WHERE — 過濾你要的資料
比喻:WHERE 就像篩金子的篩子 ⛏️
你從河裡撈了一堆沙子和石頭(所有資料), WHERE 就是那個篩子,只讓符合條件的金子(資料)通過。
基本比較運算子
SELECT * FROM Students
WHERE Age = 20; -- ← 年齡「等於」20 的學生
逐行解析:
SELECT * FROM Students -- 從 Students 表取所有欄位
WHERE Age = 20; -- 但只要 Age 等於 20 的那些列
-- 注意:SQL 用 = 而不是 ==
所有比較運算子
WHERE Age = 20 -- 等於
WHERE Age != 20 -- 不等於(也可以寫 <>)
WHERE Age > 20 -- 大於
WHERE Age >= 20 -- 大於等於
WHERE Age < 20 -- 小於
WHERE Age <= 20 -- 小於等於
AND、OR、NOT — 組合條件
-- AND:兩個條件都要成立
SELECT * FROM Students
WHERE Age >= 20 -- ← 條件 1:年齡 >= 20
AND Email LIKE '%@gmail%'; -- ← 條件 2:Email 包含 @gmail
逐行解析:
WHERE Age >= 20 -- 第一個篩選條件
AND Email LIKE '%@gmail%' -- AND = 而且,兩個都要成立才會被選中
-- 只有「年齡>=20 且 用 gmail」的學生才會出現
-- OR:其中一個條件成立就行
SELECT * FROM Students
WHERE Age = 20 -- ← 20 歲
OR Age = 22; -- ← 或 22 歲
-- 20 歲或 22 歲的學生都會被選中
-- NOT:反轉條件
SELECT * FROM Students
WHERE NOT Age = 20; -- ← 不是 20 歲的(等同 Age != 20)
BETWEEN — 範圍查詢
SELECT * FROM Students
WHERE Age BETWEEN 20 AND 22; -- ← 20 到 22 歲之間(包含頭尾)
逐行解析:
WHERE Age BETWEEN 20 AND 22 -- 等同於 Age >= 20 AND Age <= 22
-- BETWEEN 是「包含邊界」的
-- 20, 21, 22 歲都符合
IN — 列表查詢
SELECT * FROM Students
WHERE Age IN (20, 21, 25); -- ← 年齡是 20 或 21 或 25 的
逐行解析:
WHERE Age IN (20, 21, 25) -- 等同於 Age=20 OR Age=21 OR Age=25
-- IN 比寫一堆 OR 更簡潔
-- 括號裡可以放很多值
LIKE — 模糊比對
-- % 代表「任意字元,任意個數」
SELECT * FROM Students
WHERE Name LIKE '小%'; -- ← 名字以「小」開頭的
-- 小明 ✓, 小華 ✓, 大明 ✗
SELECT * FROM Students
WHERE Email LIKE '%@gmail.com'; -- ← Email 結尾是 @gmail.com
-- _ 代表「任意一個字元」
SELECT * FROM Students
WHERE Name LIKE '小_'; -- ← 「小」後面剛好一個字
-- 小明 ✓, 小華 ✓, 小美美 ✗
IS NULL / IS NOT NULL
-- 檢查空值(NULL)
SELECT * FROM Students
WHERE Email IS NULL; -- ← 沒有填 Email 的學生
SELECT * FROM Students
WHERE Email IS NOT NULL; -- ← 有填 Email 的學生
⚠️ 重要: NULL 不能用
= NULL,必須用IS NULL!WHERE Email = NULL -- ❌ 永遠不會回傳結果! WHERE Email IS NULL -- ✅ 正確寫法
條件優先順序
-- 容易搞混的情況
SELECT * FROM Students
WHERE Age = 20 OR Age = 22
AND Email LIKE '%@gmail%';
-- ⚠️ AND 優先於 OR!上面等同於:
-- Age = 20 OR (Age = 22 AND Email LIKE '%@gmail%')
-- 不是 (Age = 20 OR Age = 22) AND Email LIKE '%@gmail%'
-- ✅ 用括號明確表達意圖
SELECT * FROM Students
WHERE (Age = 20 OR Age = 22)
AND Email LIKE '%@gmail%';
小結
| 語法 | 用途 | 範例 |
|---|---|---|
=, !=, >, < |
比較 | Age > 20 |
AND, OR, NOT |
邏輯組合 | Age > 20 AND Age < 30 |
BETWEEN |
範圍 | Age BETWEEN 20 AND 30 |
IN |
列表 | Age IN (20, 21, 22) |
LIKE |
模糊比對 | Name LIKE '小%' |
IS NULL |
空值檢查 | Email IS NULL |