关于sql面试积累
1.找出所有“每一门课成绩都 > 80”的学生(即该学生所有课程成绩均 > 80,只要有一门 ≤ 80 就不算)。
SELECT student
FROM t1
GROUP BY student
HAVING MIN(score) > 80;
重要的知识点:
HAVING关键字
HAVING 最常见的用法是跟在 GROUP BY 之后,对分组后的聚合结果再做过滤,但它也可以在没有 GROUP BY 的情况下单独使用,只要查询里存在聚合函数即可。如果既没有 GROUP BY,也没有聚合函数,直接使用 HAVING 会报错。
SELECT student
FROM t1
GROUP BY student
HAVING MIN(score) > 80;
有GROUP BY时只看那些 组的聚合结果满足条件 的组。
SELECT COUNT(*) AS total_rows
FROM t1
HAVING COUNT(*) > 10;
无GROUP BY时整张表被视为“一个大组”,HAVING 对这个聚合结果进行筛选
常见关键字的执行顺序
- FROM – 组装数据源(表、视图、子查询、JOIN)
- ON – JOIN 条件过滤
- JOIN – 生成中间结果集
- WHERE – 对行级数据进行过滤
- GROUP BY – 分组
- HAVING – 对分组后的聚合结果再过滤
- SELECT – 计算列表达式、去重(DISTINCT)
- ORDER BY – 排序
- LIMIT / OFFSET-- 截取行(MySQL/PG 语法,SQL Server 用 TOP/FETCH)
“从哪来 → 先过滤行 → 再分组 → 再过滤组 → 再计算列 → 再排序 → 再分页”
对应:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
SELECT dept, AVG(salary) AS avg_s
FROM emp
WHERE hire_date >= '2020-01-01'
GROUP BY dept
HAVING AVG(salary) > 8000
ORDER BY avg_s DESC
LIMIT 5;