首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> SQL 基礎

SQL WHERE 子句完整教學:過濾條件語法、運算子對照與文字/數值比較差異

     編輯:SQL 基礎

SQL WHERE 子句完整教學


WHERE 子句用於從資料表中篩選符合條件的資料列。它是 SELECT、UPDATE、DELETE 等指令的核心,決定操作影響的範圍。


基本語法

SELECT column_name, column_name
FROM table_name
WHERE column_name operator value;
  • operator 為比較運算子(=、<>、>、< 等)。
  • 可組合 AND、OR、NOT 形成複合條件。

演示資料庫:RUNOOB 範例資料

Websites 表

+----+--------------+---------------------------+-------+---------+
| 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     |
+----+--------------+---------------------------+-------+---------+

實戰範例

範例 1:文字欄位比較 - country='CN'

SELECT * FROM Websites WHERE country = 'CN';

輸出結果:

回傳淘寶、菜鳥教程、微博 3 筆。

範例 2:數值欄位比較 - id=1

SELECT * FROM Websites WHERE id = 1;

輸出結果:

關鍵差異: 文字值需單引號 'CN',數值不加引號 1。加引號可能導致隱含轉型與索引失效。


WHERE 常用運算子完整對照

運算子描述範例
=等於id = 1
<> / !=不等於status <> 'deleted'
>大於alexa > 100
<小於price < 500
>=大於等於age >= 18
<=小於等於stock <= 10
BETWEEN範圍內(含邊界)created_at BETWEEN '2024-01-01' AND '2024-12-31'
LIKE模式匹配name LIKE 'Google%'
IN多值匹配country IN ('CN', 'US')
IS NULL為 NULLdeleted_at IS NULL
IS NOT NULL不為 NULLemail IS NOT NULL
EXISTS子查詢存在EXISTS (SELECT 1 FROM orders WHERE user_id = u.id)

文字 vs 數值比較最佳實務

  • 文字:單引號 'text',大小寫敏感度視 Collation。
  • 數值:不加引號,避免隱含轉型導致索引失效。
  • 日期:單引號 '2024-01-01',格式建議 ISO 8601 YYYY-MM-DD。
  • 參數化查詢:應用程式務必使用參數綁定,防止 SQL 注入與型別錯誤。

進階:WHERE 中的子查詢

SELECT * FROM Products
WHERE category_id IN (SELECT id FROM Categories WHERE parent_id = 0);

子查詢回傳單欄位結果集作為 IN 清單,動態決定過濾條件。


效能關鍵:SARGable 條件

SARGable(Search ARGument Able)條件可利用索引搜尋。反例:

  • WHERE YEAR(created_at) = 2024 → 函數運算導致全表掃描。改為 WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01'。
  • WHERE col + 1 > 10 → 運算導致索引失效。改為 WHERE col > 9。
  • WHERE UPPER(name) = 'GOOGLE' → 改用 WHERE name = 'Google' COLLATE utf8mb4_bin 或功能索引。

原則:讓欄位「裸露」在運算子左側,右側為常數/參數。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved