子查詢 (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)。
SELECT name FROM bbc WHERE region IN (SELECT region FROM bbc WHERE name = 'Brazil');
IN 接受多值列表,無論子查詢回傳 0/1/多行均安全執行。
SELECT name FROM bbc WHERE population > (SELECT population FROM bbc WHERE name = 'Russia');
子查詢保證單值 (俄國唯一),可用 > 比較。
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 / 聚合函數)。EXISTS),消除執行期錯誤風險。IN 亦可用於 SELECT 列 (純量子查詢) 與 FROM 子句 (衍生表)。