首页/数据/SQL 速查/子查询中 ORDER BY 与 LIMIT 的语义

子查询中 ORDER BY 与 LIMIT 的语义

子查询里“排序取前 N 行”只有搭配 LIMIT 才确定;不带 LIMIT 的 ORDER BY 在优化层可能被忽略,不能依赖它。

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

标量子查询取一条

标量子查询取一条
SELECT u.id, u.name,
       (SELECT o.amount
        FROM orders o
        WHERE o.user_id = u.id
        ORDER BY o.created_at DESC, o.id DESC
        LIMIT 1) AS last_amount
FROM users u
WHERE u.id <= 50;
规则ORDER BY 与 LIMIT 搭配才有确定的“前 N 行”
标量子查询必须保证 LIMIT 1,否则多行报错
排序稳定性时间相同时用主键做次级排序键

易错点

  • “每用户取最近一单”用标量子查询要逐用户执行,用户多时慢,用窗口函数一次算完
  • 只写 ORDER BY 不写 LIMIT 的子查询排序语义无效,别依赖外层顺序

数据来源与参考

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