查询拥有10+订单用户的最短SQL语句(MySQL/PostgreSQL)
问题解答:找出拥有10+订单的用户的最短SQL语句
语法兼容性说明
以下所有写法同时兼容MySQL和PostgreSQL,均属于标准SQL的通用子集,无需做语法适配。
核心需求梳理
我们需要返回所有在Orders表中拥有10个及以上订单的user_id。这里要明确:若Users表中存在无任何订单的用户,这类用户不在需求范围内,无需返回。
常见候选方案及正确性判断
我先假设两种开发者常写的方案,逐一分析:
方案1:关联双表后分组筛选
SELECT u.user_id FROM Users u JOIN Orders o ON u.user_id=o.user_id GROUP BY u.user_id HAVING COUNT(*)>=10;
- 正确性:结果是正确的,但存在冗余。因为
Users表仅含user_id,而有10+订单的用户必然存在于Orders表中,完全不需要关联Users表,徒增查询开销且语句更长。
方案2:直接从Orders表分组筛选
SELECT user_id FROM Orders GROUP BY user_id HAVING COUNT(*)>=10;
- 正确性:完全正确!既满足需求,又避免了不必要的表关联,语句长度也大幅缩短。不过还有更极致的压缩空间。
字符数最少的极致写法
要压缩字符数,我们可以利用SQL的语法省略规则(同时保证语法合法):
- 去掉非必要空格:SQL允许关键字间仅保留单个空格,甚至部分场景下可连写(不过为了基本可读性,保留必要空格即可)
- 无需替换
COUNT(*):COUNT(*)是统计行数的最短写法,替换为COUNT(1)或COUNT(order_id)字符数相同甚至更多
极致压缩版(兼容两种数据库,兼顾可读性与最短字符):
SELECT user_id FROM Orders GROUP BY user_id HAVING COUNT(*)>=10
(注:最后的分号在多数SQL客户端属于可选语法,去掉可再省1个字符)
额外补充
如果需求强制要求返回Users表中存在的用户(哪怕无订单,但本需求不涉及),方案1才会有意义,但对于当前需求来说,方案2及压缩版是最优解——既短又高效。
内容的提问来源于stack exchange,提问作者John Morah
相关产品推荐
相关产品推荐

