Z
ZHANK
编程在线教程SQL 教程派生表与标量子查询
子查询与CTE

派生表与标量子查询

在 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 通常更快,因为只扫描一次表。