数据库基础篇 《8. 聚合函数》

news/2024/12/31 5:44:37/

目录

1. 聚合函数介绍

1.1 AVG和SUM函数

1.2 MIN和MAX函数

1.3 COUNT函数

2. GROUP BY

2.1 基本使用

2.2 使用多个列分组

2.3 GROUP BY中使用WITH ROLLUP

3. HAVING

3.1 基本使用

3.2 WHERE和HAVING的对比  

4. SELECT的执行过程

4.1 查询的结构

4.2 SELECT执行顺序

4.3 SQL的执行原理

 5 聚合函数课后练习

1.where子句可否使用组函数进行过滤?

2.查询公司员工工资的最大值,最小值,平均值,总和

3.查询各job_id的员工工资的最大值,最小值,平均值,总和

4.选择具有各个job_id的员工人数

5.查询员工最高工资和最低工资的差距(DIFFERENCE)

6.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内

7.查询所有部门的名字,location_id,员工数量和平均工资,并按平均工资降序

8.查询每个工种、每个部门的部门名、工种名和最低工资


1. 聚合函数介绍

 聚合函数不能嵌套调用比如不能出现类似“AVG(SUM(字段名称))”形式的调用

1.1 AVGSUM函数

可以对 数值型数据 使用 AVG SUM 函数。
SELECT AVG(salary), MAX(salary),MIN(salary), SUM(salary)
FROM employees
WHERE job_id LIKE '%REP%';

1.2 MINMAX函数

可以对 任意数据类型 的数据使用 MIN MAX 函数。
SELECT MIN(hire_date), MAX(hire_date)
FROM employees;

1.3 COUNT函数

COUNT(*) 返回表中记录总数,适用于 任意数据类型
SELECT COUNT(*)
FROM employees
WHERE department_id = 50;
COUNT(expr) 返回 expr 不为空 的记录总数。
SELECT COUNT(commission_pct)
FROM employees
WHERE department_id = 50;

除了COUNT()其他的函数都是默认过滤空值的,AVG() = SUM()/ COUNT()

因此求平均奖金率类似的问题,可以采用:

# 错误
SELECT AVG(commission_pct) FROM employees
# 正确
SELECT SUM(commission_pct) / COUNT(commission_pct) FROM employees
# 正确
SELECT AVG(IFNULL(commission_pct, 0)) FROM employees

2. GROUP BY

2.1 基本使用

可以使用GROUP BY子句将表中的数据分成若干组  

SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
明确: WHERE一定放在FROM后面
SELECT 列表中所有未包含在组函数中的列都应该包含在 GROUP BY 子句中
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;

SELECT AVG(salary)
FROM employees
GROUP BY department_id;

2.2 使用多个列分组

SELECT department_id dept_id, job_id, SUM(salary)
FROM employees
GROUP BY department_id, job_id;

SELECT中出现的非组函数的字段必须声明在GROUP BY当中,但GROUP BY中声明的字段不一定需要放在SELECT当中

GROUP BY声明在FROM,WHERE后面,ORDER BY,LIMIT前面

2.3 GROUP BY中使用WITH ROLLUP

使用 WITH ROLLUP 关键字之后,在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录的总和,即统计记录数量
SELECT department_id,AVG(salary)
FROM employees
WHERE department_id > 80
GROUP BY department_id WITH ROLLUP;
注意:
当使用 ROLLUP 时,不能同时使用 ORDER BY 子句进行结果排序,即 ROLLUP ORDER BY 是互相排斥的。

3. HAVING

3.1 基本使用

SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000 ;

非法使用聚合函数 : 不能在 WHERE 子句中使用聚合函数。如下:

SELECT department_id, AVG(salary)
FROM employees
WHERE AVG(salary) > 8000
GROUP BY department_id;

 3.2 WHEREHAVING的对比  

4. SELECT的执行过程

4.1 查询的结构

#方式1:
SELECT ...,....,...
FROM ...,...,....
WHERE 多表的连接条件
AND 不包含组函数的过滤条件
GROUP BY ...,...
HAVING 包含组函数的过滤条件
ORDER BY ... ASC/DESC
LIMIT ...,...
#方式2:
SELECT ...,....,...
FROM ... JOIN ...
ON 多表的连接条件
JOIN ...
ON ...
WHERE 不包含组函数的过滤条件
AND/OR 不包含组函数的过滤条件
GROUP BY ...,...
HAVING 包含组函数的过滤条件
ORDER BY ... ASC/DESC
LIMIT ...,...
#其中:
#(1)from:从哪些表中筛选
#(2)on:关联多表查询时,去除笛卡尔积
#(3)where:从表中筛选的条件
#(4)group by:分组依据
#(5)having:在统计结果中再次筛选
#(6)order by:排序
#(7)limit:分页

4.2 SELECT执行顺序

你需要记住 SELECT 查询时的两个顺序:
1. 关键字的顺序是不能颠倒的:
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... LIMIT...

2.SELECT 语句的执行顺序(在 MySQL Oracle 中,SELECT 执行顺序基本相同)

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT 的字段 -> DISTINCT -> ORDER BY -> LIMIT

比如你写了一个 SQL 语句,那么它的关键字顺序和执行顺序是下面这样的:  

SELECT DISTINCT player_id, player_name, count(*) as num # 顺序 5
FROM player JOIN team ON player.team_id = team.team_id # 顺序 1
WHERE height > 1.80 # 顺序 2
GROUP BY player.team_id # 顺序 3
HAVING num > 2 # 顺序 4
ORDER BY num DESC # 顺序 6
LIMIT 2 # 顺序 7

4.3 SQL的执行原理

 5 聚合函数课后练习

1.where子句可否使用组函数进行过滤?

No!

2.查询公司员工工资的最大值,最小值,平均值,总和

SELECT MAX(salary), MIN(salary), AVG(salary), SUM(salary)
FROM employees;

3.查询各job_id的员工工资的最大值,最小值,平均值,总和

SELECT job_id, MAX(salary), MIN(salary), AVG(salary), SUM(salary)
FROM employees
GROUP BY job_id;

4.选择具有各个job_id的员工人数

SELECT job_id, COUNT(*)
FROM employees
GROUP BY job_id;

5.查询员工最高工资和最低工资的差距(DIFFERENCE

SELECT MAX(salary), MIN(salary), MAX(salary) - MIN(salary) DIFFERENCE
FROM employees;

6.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内

7.查询所有部门的名字,location_id,员工数量和平均工资,并按平均工资降序

SELECT department_name, location_id, COUNT(employee_id), AVG(salary) avg_sal
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
GROUP BY department_name, location_id
ORDER BY avg_sal DESC;

8.查询每个工种、每个部门的部门名、工种名和最低工资

SELECT department_name,job_id,MIN(salary)
FROM departments d LEFT JOIN employees e
ON e.`department_id` = d.`department_id`
GROUP BY department_name,job_id

http://www.ppmy.cn/news/48503.html

相关文章

qt中信号和槽机制

文章目录 信号与槽机制实现 点击按钮 关闭窗口的案例 自定义信号槽自定义信号自定义槽函数触发自定义的信号案例:请老师吃饭 断开信号当槽函数遇到重载的时候拓展 信号与槽机制 connect(信号的发送者, 发送的具体信号,信号的接受者&#xff0…

【移动端网页布局】移动端网页布局基础概念 ④ ( 物理像素 | 物理像素比 | 代码示例 - 100 像素在 PC浏览器 / 移动端浏览器 显示效果 )

文章目录 一、物理像素 / 物理像素比二、代码示例 - 100 像素在 PC浏览器 / 移动端浏览器 显示效果 一、物理像素 / 物理像素比 移动端 网页开发 与 PC 端开发有很多不同之处 , 在图片处理方向需要采用 二倍图 / 三倍图 / 多倍图 方式进行图片处理 ; 图片处理的方式与如下的 物…

基于html+css的图片展示15

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

数据库系统-索引

一、什么是索引 字典中的目录,就是生活中的索引 **索引:**定义在存储表基Table础之上,有助于无需检查所有记录而快速定位所需记录的一种辅助存储结构,由一些列存储在磁盘上的索引项index etries组成,每一个索引项又由…

2023年最强手机远程控制横测:ToDesk、向日葵、Airdroid三款APP免Root版本

前言 随着远程办公和远程协作的日益普及,跨设备、系统互通的远程控制软件已经成为职场人士不可或缺的工具之一。在国内,向日葵和ToDesk是最著名的远程控制软件;而在国外,则有微软远程桌面、AirDroid、TeamViewer、AnyDesk、Parse…

Nginx安装

版本区别 常用版本分为四大阵营 Nginx开源版 http://nginx.org/Nginx plus 商业版 https://www.nginx.comopenresty http://openresty.org/cn/Tengine http://tengine.taobao.org/ 安装步骤 上传nginx压缩包到指定目录 /usr/local/nginx 解压缩 tar zxvf nginx-1.21.6.t…

图书馆管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设!!! 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址:https://download.csdn.net/download/qq_50954361/87682509 更多系统资源库…

GEE:计算两幅影像之间的RMSE(Root Mean Squared Error,均方根误差)以比较影像相似度

本文将介绍在GEE (Google Earth Engine) 平台中计算两幅影像均方根误差RMSE和均方误差MSE的代码。 RMSE(Root Mean Squared Error,均方根误差)是一种用于评估预测值或估计值与真实观测值之间误差的统计指标。它广泛应用于各种领域,包括地理信息系统(GIS)、遥感、气象学、…