AND 與 OR 用於 WHERE 子句中組合多個條件。AND 要求所有條件皆真;OR 要求至少一條件為真。掌握優先級與括號分組是撰寫正確查詢的關鍵。
| 條件 A | 條件 B | A AND B | A OR B |
|---|---|---|---|
| TRUE | TRUE | TRUE | TRUE |
| TRUE | FALSE | FALSE | TRUE |
| FALSE | TRUE | FALSE | TRUE |
| FALSE | FALSE | FALSE | FALSE |
| NULL | TRUE | NULL | TRUE |
| NULL | FALSE | FALSE | NULL |
| NULL | NULL | NULL | NULL |
關鍵: SQL 為三值邏輯(TRUE、FALSE、NULL/UNKNOWN)。AND 遇 FALSE 短路為 FALSE;OR 遇 TRUE 短路為 TRUE;涉及 NULL 時結果可能為 UNKNOWN,導致列被過濾。
NOTANDOR預設: AND 優先於 OR 執行。建議永遠使用括號明確分組,避免誤解與維護困難。
+----+--------------+---------------------------+-------+---------+ | id | name | url | alexa | country | +----+--------------+---------------------------+-------+---------+ | 1 | Google | https://www.google.cm/ | 1 | USA | | 2 | 淘寶 | https://www.taobao.com/ | 13 | CN | | 3 | 菜鳥教程 | https://www.runoob.com/ | 4689 | CN | | 4 | 微博 | https://weibo.com/ | 20 | CN | | 5 | Facebook | https://www.facebook.com/ | 3 | USA | +----+--------------+---------------------------+-------+---------+
SELECT * FROM Websites WHERE country = 'CN' AND alexa > 50;
輸出結果:

符合:淘寶(alexa=13? 不 >50)、菜鳥教程(4689>50)、微博(20? 不>50) → 僅菜鳥教程。
SELECT * FROM Websites WHERE country = 'USA' OR country = 'CN';
輸出結果:

排除 IND (stackoverflow),其餘 5 筆皆符合。
SELECT * FROM Websites WHERE alexa > 15 AND (country = 'CN' OR country = 'USA');
輸出結果:

邏輯:alexa > 15 且 (CN 或 USA)。Google(alexa=1) 被排除;Facebook(3) 被排除;其餘 4 筆符合。
-- 等同於 country = 'USA' OR country = 'CN'
WHERE country IN ('USA', 'CN');
IN 更簡潔、效能較佳(優化器易轉為半連結),建議取代多個 OR。
WHERE (A AND B) OR C 而非 WHERE A AND B OR C。WHERE col = 'value' OR col IS NULL 需額外處理 NULL,否則 col = 'value' 對 NULL 列回傳 UNKNOWN,整個 OR 可能為 UNKNOWN 而非 TRUE。