首页/数据/SQL 速查/SELECT 列表里的子查询
本包目录(311 条)

SELECT 列表里的子查询

在结果列里内嵌标量子查询得到附加信息(计数、最新值):可读性好,但逻辑上逐行执行,行数大时优先改 JOIN 或窗口函数。

SQL 速查数据更新于 2026-10-12

示例

示例
SELECT u.id, u.name,
       (SELECT COUNT(*) FROM orders o WHERE o.user_id = u.id) AS order_cnt,
       (SELECT MAX(o.created_at) FROM orders o WHERE o.user_id = u.id) AS last_order
FROM users u
WHERE u.status = 1;

JOIN 改写

JOIN 改写
SELECT u.id, u.name, t.cnt, t.last_order
FROM users u
LEFT JOIN (
    SELECT user_id, COUNT(*) AS cnt, MAX(created_at) AS last_order
    FROM orders
    GROUP BY user_id
) t ON t.user_id = u.id
WHERE u.status = 1;
求值逻辑上每行执行一次子查询
改写LEFT JOIN + GROUP BY 一次算完
空值无匹配时子查询返回 NULL,可 COALESCE 兜底

易错点

  • 外层 100 万行时列表里两个子查询就是 200 万次查找,务必先缩小外层结果
  • 改写成 JOIN 后核对 LEFT JOIN 补 NULL 与聚合口径是否与原子查询一致

数据来源与参考

  • MySQL 8.0 Reference Manual · Scalar Subqueries
  • PostgreSQL Documentation · Scalar Subqueries
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌