派生表与标量子查询
在 FROM 和 SELECT 中使用子查询
派生表与标量子查询
子查询不只能在 WHERE 里,还能在 FROM 和 SELECT 中——就像一张临时表或一个计算值。
学完本章你将: 掌握派生表、标量子查询、子查询在 SELECT 中。
派生表 —— 子查询在 FROM 中
把子查询结果当作一张临时表继续查询:
sql
-- 每个城市的用户数
SELECT city, cnt
FROM (
SELECT city, COUNT(*) AS cnt
FROM users
GROUP BY city
) AS city_stats
WHERE cnt > 3;
-- 必须给子查询起别名(AS city_stats)
标量子查询 —— 子查询在 SELECT 中
返回单个值的子查询,放在 SELECT 中当一列:
sql
SELECT name, age,
(SELECT AVG(age) FROM users) AS 平均年龄,
age - (SELECT AVG(age) FROM users) AS 与平均差
FROM users;
子查询在 SELECT 中 —— 常和 JOIN 对比
sql
-- 方式 1:子查询
SELECT name,
(SELECT COUNT(*) FROM orders WHERE user_id = u.id) AS 订单数
FROM users u;
-- 方式 2:LEFT JOIN + GROUP BY(数据量大时更快)
SELECT u.name, COUNT(o.id) AS 订单数
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name;
💡 子查询 vs JOIN: 子查询直观易读,适合小数据量。数据量大时 JOIN + GROUP BY 通常更快,因为只扫描一次表。