子查詢(Subquery)是一個 SELECT 陳述式嵌入另一個陳述式,可用於 WHERE、FROM、SELECT 清單。本文專注 WHERE 子句應用與常見陷阱。
SELECT name FROM bbc
WHERE region = (SELECT region FROM bbc WHERE name = 'Brazil')
作用:找出與巴西同區域的所有國家。
若表中有兩筆 name='Brazil' 但 region 不同,子查詢回傳 ('Americas','Europe'),外層 region = (...) 將報錯。
SELECT name FROM bbc
WHERE region IN (SELECT region FROM bbc WHERE name = 'Brazil')
IN 可安全處理零值、單值、多值三種情況。
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'))
SELECT name FROM bbc
WHERE region = 'Europe'
AND gdp/population > (SELECT gdp/population FROM bbc WHERE name = 'United Kingdom')
| 類型 | 回傳 | 常用運算子 | 範例位置 |
|---|---|---|---|
| 標量子查詢 | 單一值 | =, >, <, <> | WHERE, SELECT 清單 |
| 資料列子查詢 | 單列多欄 | =, IN | WHERE |
| 資料表子查詢 | 多列多欄 | IN, EXISTS | WHERE, FROM |
EXISTS 通常優於 IN(特別是外層大表、內層小表)掌握 IN/EXISTS 處理多值、標量與資料表子查詢的區別,即能寫出正確且高效的子查詢。