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

SQL 進階教程:子查詢 (嵌套 SELECT) 完整指南與 IN 操作符最佳實踐

     編輯:關於SqlServer

子查詢 允許將一個 SELECT 的結果作為另一個查詢的輸入值,可出現在 WHERE、FROM、SELECT 列表中。本文聚焦 WHERE 子句中的標量與多值子查詢,並解決「單值預期卻返回多值」的經典運行時錯誤。

子查詢基礎語法

-- 找出與 Brazil 同區域的所有國家
SELECT name FROM bbc 
WHERE region = (SELECT region FROM bbc WHERE name = 'Brazil');

外層查詢預期子查詢返回**單一標量值** (此處為 'Americas')。

經典陷阱:子查詢返回多行導致運行時錯誤

若表中存在兩筆 name='Brazil' 但 region 不同 (如 'Americas', 'Europe'),子查詢返回兩值。外層 WHERE region = ('Americas', 'Europe') 為**非法語法**,拋出運行時錯誤 (非編譯錯誤)。

解決方案:使用 IN 操作符支援多值比較

-- 安全寫法:無論 Brazil 有幾筆記錄皆不報錯
SELECT name FROM bbc 
WHERE region IN (SELECT region FROM bbc WHERE name = 'Brazil');

IN 接受列表值,完美解決「單值 vs 多值」不確定性問題。**最佳實踐:除非業務邏輯絕對保證單行,否則優先使用 IN 而非 =。**

實戰範例集

1. 標量比較:人口多於俄羅斯的國家

SELECT name FROM bbc
WHERE population > (SELECT population FROM bbc WHERE name = 'Russia');

2. 多值比較:印度與伊朗所在區域的所有國家完整資訊

SELECT * FROM bbc
WHERE region IN (SELECT region FROM bbc WHERE name IN ('India', 'Iran'));

3. 運算式比較:人均 GDP 超過英國的歐洲國家

SELECT name FROM bbc
WHERE region = 'Europe' 
  AND gdp/population > (SELECT gdp/population FROM bbc WHERE name = 'United Kingdom');

子查詢出現位置擴展 (補充)

位置名稱回傳要求範例
WHERE巢狀子查詢標量 (單值) 或列表 (配合 IN/EXISTS/ANY/ALL)WHERE col > (SELECT ...)
FROM衍生表 / 內聯檢視資料表結果集 (需別名)FROM (SELECT ... ) AS t
SELECT 列表標量子查詢單一值 (單行單列)SELECT col, (SELECT ...) AS extra

效能提示

  • 關聯子查詢 (外層欄位用於內層 WHERE) 可能逐行執行,大數據量下優先改寫為 JOIN 或 APPLY。
  • EXISTS / NOT EXISTS 通常優於 IN / NOT IN (尤其含 NULL 時)。
  • 確保子查詢欄位有適當索引。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved