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

SQL IN 操作符完整教學:多值匹配語法與實戰範例

     編輯:SQL 基礎

SQL IN 操作符完整教學


IN 操作符核心概念

IN 允許在 WHERE 子句中指定多個離散值,等同於多個 OR 串接,但語法更簡潔、可讀性更高。也常搭配子查詢使用(WHERE col IN (SELECT ...))。


基本語法

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ...);
  • 值清單可包含數值、字串、日期等,類型需與欄位相容。
  • 字串值需用單引號包裹。
  • NOT IN 為反向匹配。

演示資料庫: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     |
| 7  | stackoverflow| https://stackoverflow.com/ | 0     | IND     |
+----+--------------+---------------------------+-------+---------+

實戰範例

範例:選取 name 為 'Google' 或 '菜鳥教程' 的網站

SELECT * FROM Websites
WHERE name IN ('Google', '菜鳥教程');

輸出結果:


進階應用

1. 搭配子查詢(動態值清單)

SELECT * FROM Orders
WHERE CustomerID IN (SELECT CustomerID FROM Customers WHERE Country = 'USA');

子查詢回傳的單欄位結果集作為 IN 清單,避免硬編碼值。

2. NOT IN 排除特定值

SELECT * FROM Products
WHERE CategoryID NOT IN (1, 5, 9);

3. 效能考量

  • IN 清單過長(超過數百個值)可能影響執行計畫,考慮改用 JOIN 或臨時表。
  • NOT IN 若子查詢結果含 NULL,整個條件會變成 UNKNOWN 導致無資料回傳,建議改用 NOT EXISTS。

IN vs OR vs JOIN 比較

寫法優點缺點
IN (v1, v2, ...)簡潔、靜態清單易維護清單過長效能下降
col = v1 OR col = v2 ...無清單長度限制冗長、易出錯、難維護
JOIN 子查詢/臨時表動態清單、大量值效能佳語法較複雜

最佳實務建議

  • 靜態少量值(< 50)用 IN 清單。
  • 動態或大量值用子查詢 IN (SELECT ...) 或 JOIN。
  • 避免 NOT IN 含 NULL 子查詢,改用 NOT EXISTS。
  • 搭配索引:被查詢欄位應有索引以加速查找。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved