(课堂笔记)Oracle 聚合函数与 GROUP BY 分组查询

本文总结了Oracle中聚合函数与GROUP BY分组查询的核心知识点。


主要内容包括:

1)常用聚合函数(SUM/MAX/MIN/AVG/COUNT)的使用及NULL值处理;

2)GROUP BY语法结构和分组查询示例;

3)HAVING子句与WHERE的区别;

4)SQL语句执行顺序;

5)COUNT不同写法的区别;

6)常见错误分析及综合练习。


重点强调了WHERE与HAVING的应用场景、非分组字段的使用限制以及COUNT的性能优化建议,并提供了典型例题和自测题帮助理解。


(课堂笔记)Oracle 聚合函数与GROUP BY分组查询


以下是根据你提供的课堂内容,整理出的**《聚合函数与GROUP BY分组查询》复习笔记**,结构清晰、便于学生复习和记忆:


📌 一、聚合函数(对多行数据进行汇总计算)

函数 作用 说明
SUM(列) 求和 对数值列求和
MAX(列) 最大值 忽略NULL
MIN(列) 最小值 忽略NULL
AVG(列) 平均值 忽略NULL
COUNT(列) 计数 忽略NULL
COUNT(*) / COUNT(1) 总行数 不忽略NULL

空值(NULL)不参与聚合计算


📌 二、基础使用示例

sql

复制代码
SELECT 
  SUM(SAL) AS 总薪资,
  MAX(SAL) AS 最高薪资,
  MIN(SAL) AS 最低薪资,
  AVG(SAL) AS 平均薪资,
  COUNT(SAL) AS 员工个数
FROM EMP;

📌 三、GROUP BY 分组查询

语法结构:

sql

复制代码
SELECT 
  分组字段,
  聚合值
FROM 表
GROUP BY 分组字段;

示例:每个部门的平均薪资

sql

复制代码
SELECT 
  DEPTNO,
  SUM(SAL) AS 总薪资,
  AVG(SAL) AS 平均薪资
FROM EMP
GROUP BY DEPTNO;

📌 四、HAVING 子句(对组进行过滤)

HAVING 用于过滤聚合值(如总数、平均值等)
WHERE 用于过滤行数据,不能用于聚合值

示例:只显示人数 >= 4 的部门

sql

复制代码
SELECT 
  DEPTNO,
  SUM(SAL) AS 总薪资,
  MAX(SAL) AS 最高薪资
FROM EMP
GROUP BY DEPTNO
HAVING COUNT(1) >= 4;

📌 五、执行顺序(非常重要)

sql

复制代码
FROM     -- 1. 读取表
WHERE    -- 2. 行过滤(不能使用聚合)
GROUP BY -- 3. 分组
HAVING   -- 4. 组过滤(可以使用聚合)
SELECT   -- 5. 输出字段
ORDER BY -- 6. 排序

⚠️ 非分组字段、非聚合值,不能出现在 SELECT 中


📌 六、COUNT 的区别(面试常见)

写法 说明 是否忽略NULL
COUNT(1) 常数列,统计行数
COUNT(*) 统计所有行
COUNT(列名) 只统计该列非NULL的行

✅ 性能建议:若只统计行数,推荐使用 COUNT(1)


📌 七、综合练习(含 WHERE + GROUP BY + HAVING + ORDER BY)

题目:

筛选 1981 年入职且薪资 ≥ 1000 的员工,按部门分组,

显示部门总薪资、最高薪资,

且部门统计人数 ≥ 3,结果按部门编号升序。

答案:

sql

复制代码
SELECT 
  DEPTNO,
  SUM(SAL) AS 总薪资,
  MAX(SAL) AS 最高薪资
FROM EMP
WHERE TO_CHAR(HIREDATE, 'YYYY') = '1981' 
  AND SAL >= 1000
GROUP BY DEPTNO
HAVING COUNT(EMPNO) >= 3
ORDER BY DEPTNO;

📌 八、常见错误提醒

错误写法 原因
SELECT 非分组字段 该字段不在 GROUP BY 中,也不是聚合值
WHERE 中使用聚合函数 WHERE 在分组前执行,无法识别聚合
HAVING 中不用聚合 纯字段过滤应放在 WHERE 中

📌 九、复习自测题

sql

复制代码
-- 排除 20号部门经理 和 10号文员
-- 按入职年份分组
-- 显示最高薪资、最低薪资
-- 要求该年入职人数 ≥ 2
-- 按年份升序

参考答案:

sql

复制代码
SELECT 
  TO_CHAR(HIREDATE, 'YYYY') AS YEAR,
  MAX(SAL) AS 最高薪资,
  MIN(SAL) AS 最低薪资
FROM EMP
WHERE NOT (DEPTNO = 20 AND JOB = 'MANAGER' 
        OR DEPTNO = 10 AND JOB = 'CLERK')
GROUP BY TO_CHAR(HIREDATE, 'YYYY')
HAVING COUNT(EMPNO) >= 2
ORDER BY YEAR;
相关推荐
资讯第一线5 小时前
SQL Server工具:WinToolsPlus 之 SQL Server 日志清理/Suspect/质疑/置疑/可疑/单用户等 修复
数据库·oracle
蓝鸟19747 小时前
Oracle 19c JSON_OBJECT 完全实战指南|嵌套、多行多列数组合并、空值踩坑、医保报文落地
数据库·oracle·json_arrayagg·多行转json数组·sql实战踩坑·数据库json拼装·json_object
一个天蝎座 白勺 程序猿7 小时前
SQL Server数据迁移金仓性能优化实战:从慢SQL到系统瓶颈,一套组合拳打下来
sql·oracle·性能优化·kingbasees
其实防守也摸鱼1 天前
VS Code Git 工作树:解锁多分支并行开发新体验
数据库·git·安全·oracle·架构·自动化
ERD Online1 天前
MySQL/Oracle/PG/SQLServer 存量库一键逆向成关系图
mysql·oracle·sqlserver
奇树谦2 天前
《现代 Key-Value 数据库原理:从 B+Tree 到 LSM Tree》-第三篇:LMDB 深度解析二
数据库·oracle·lsm-tree
提笔了无痕2 天前
Agent 上下文管理详解、Context设计与构建
数据库·oracle·agent·context
沉下去,苦磨练!2 天前
Human‑in‑the‑Loop
数据库·oracle
小黑技术栈2 天前
web前端基础到入门——14day
前端·数据库·oracle
todoitbo3 天前
把发票台账接进 Codex:KingbaseES MCP 的一次只读风险排查实践
数据库·oracle·codex·kingbasees·mcp