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

SQL 教程 (5):子查詢 (Subquery) 與 IN 操作符實戰 — 避免多值導致錯誤

     編輯:關於SqlServer

子查詢 (Subquery) 可用於 WHERE、FROM、SELECT 列。本文聚焦 WHERE 子句中的標準子查詢,重點解決「子查詢回傳多值導致外層 = 比較報錯」的經典陷阱,並示範 IN 解決方案。

基本形式

SELECT name FROM bbc WHERE region =
  (SELECT region FROM bbc WHERE name = 'Brazil');

外層查詢「與巴西同區域的國家」。子查詢預期回傳單值 ('Americas')。

陷阱:子查詢回傳多值

若表中有兩筆 name='Brazil' (如一筆 Americas、一筆 Europe),子查詢回傳 ('Americas', 'Europe'),外層 region = (...) 發生執行期錯誤 (Subquery returns more than 1 value)。

解決方案:使用 IN 操作符

SELECT name FROM bbc WHERE region IN
  (SELECT region FROM bbc WHERE name = 'Brazil');

IN 接受多值列表,無論子查詢回傳 0/1/多行均安全執行。

三大實戰範例

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'));

子查詢回傳多區域,外層必須用 IN。

3. 人均 GDP 超過英國的歐洲國家

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

關鍵原則

  • 子查詢用於 =, >, <, <> 等純量比較時,必須保證單值 (或加 TOP 1 / 聚合函數)。
  • 不確定單值時,一律改用 IN (或 EXISTS),消除執行期錯誤風險。
  • IN 亦可用於 SELECT 列 (純量子查詢) 與 FROM 子句 (衍生表)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved