关于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 对这个聚合结果进行筛选

常见关键字的执行顺序

  1. FROM -- 组装数据源(表、视图、子查询、JOIN)
  2. ON -- JOIN 条件过滤
  3. JOIN -- 生成中间结果集
  4. WHERE -- 对行级数据进行过滤
  5. GROUP BY -- 分组
  6. HAVING -- 对分组后的聚合结果再过滤
  7. SELECT -- 计算列表达式、去重(DISTINCT)
  8. ORDER BY -- 排序
  9. 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;
相关推荐
ST.J几秒前
SQL与数据库笔记
数据库·笔记·sql
jllws11 小时前
数据库原理及应用_数据库管理和保护_第5章数据库的安全性_理论部分
数据库
2302_809798321 小时前
【Redis】缓存的穿透、击穿和雪崩
数据库·redis·缓存
花哥码天下3 小时前
MySQL事务日志类型及作用解析
数据库·mysql
手握风云-3 小时前
MySQL数据库精研之旅第十七期:深度拆解事务核心(下)
数据库·mysql
亮子AI3 小时前
【PostgreSQL】如何实现主从复制?
数据库·postgresql
杏花春雨江南3 小时前
可重复读 是否“100%”地解决幻读?
数据库·mysql
曹牧3 小时前
Oracle:select top 5
数据库·sql·oracle
小蒜学长3 小时前
django全国小米su7的行情查询系统(代码+数据库+LW)
java·数据库·spring boot·后端