SELECT
column1,
(SELECT aggregate_col FROM table2 WHERE table2.id = table1.id) AS derived_col
FROM table1;
SELECT 列表中SELECT d.column1, d.derived_col
FROM (
SELECT id, aggregate_col AS derived_col
FROM table2
WHERE condition
) AS d
JOIN table1 t ON t.id = d.id;
FROM 子句中AS d)d.column)| 特性 | 標量子查詢 | 派生表 |
|---|---|---|
| 位置 | SELECT 列表 / WHERE 條件 | FROM 子句 |
| 返回結果 | 單值(1行1列) | 結果集(N行M列) |
| 別名要求 | 列別名(可選) | 表別名(必須) |
| 引用方式 | 直接作為列值 | 通過表別名.列名 |
| 相關性 | 常為相關子查詢 | 通常為非相關(獨立執行) |
| 性能特點 | 逐行執行,大數據集慎用 | 可物化/索引,優化器處理靈活 |
此處「臨時表」指派生表產生的邏輯中間結果集,而非物理臨時表(CREATE TEMPORARY TABLE)。它:
查詢每個部門最高薪資的員工:
-- 派生表方案(推薦)
SELECT e.name, e.salary, d.dept_name
FROM employee e
JOIN (
SELECT dept_id, MAX(salary) AS max_sal
FROM employee
GROUP BY dept_id
) AS dm ON e.dept_id = dm.dept_id AND e.salary = dm.max_sal
JOIN department d ON e.dept_id = d.id;
-- 標量子查詢方案(效率較低)
SELECT e.name, e.salary, d.dept_name
FROM employee e
JOIN department d ON e.dept_id = d.id
WHERE e.salary = (
SELECT MAX(salary) FROM employee WHERE dept_id = e.dept_id
);
FROM (subquery) AS alias 模式