IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL第七章(聚合函数) -> 正文阅读

[大数据]MySQL第七章(聚合函数)

一.常见的聚合函数介绍

1.1 什么是聚合函数

聚合函数作用于一组数据, 并对一组数据返回一个值, 也就是输入一组数据的集合,输出的是单个值

1.2 AVG (求平均函数) 和 SUM函数

注意: 这两个函数只适用于数值类型的变量

例题1: 求员工工资的平均数和总数

SELECT AVG(salary), SUM(salary)
FROM employees e 
/*
 AVG(salary)|SUM(salary)|
-----------+-----------+
6461.682243|   691400.0|
 */

1.3 MIN 和 MAX函数

注意: 使用于字符串类型(根据UTF-8比较规则), 日期类型, 数值类型

例题2: 求员工工资中的最大值和最小值

SELECT MAX(salary), MIN(salary) 
FROM employees e
/*
 MAX(salary)|MIN(salary)|
-----------+-----------+
    24000.0|     2100.0|
 */

#求姓名和入职时间

SELECT MAX(last_name), MIN(last_name), MAX(hire_date), MIN(hire_date)
FROM employees e 
/*
 MAX(last_name)|MIN(last_name)|MAX(hire_date)|MIN(hire_date)|
--------------+--------------+--------------+--------------+
Zlotkey       |Abel          |    2000-04-21|    1987-06-17|
 */

1.4 COUNT函数

作用: 计算指定字段在查询结构中出现的个数 (用来统计个数的)

例题3: 统计表中总人数
可用三种方式来实现
方式一: COUNT (*) 意思用 * 来代替一条数据
方式二: COUNT (1) 意思用 1 来代替一条数据
方式三: COUNT (具体字段) ----> 注意:这种方式是不统计包含NULL的

效率: 方式1 = 方式2 > 方式3

#已知:commission_pct(奖金)72个员工的奖金为NULL

SELECT COUNT(last_name), COUNT(1), COUNT(*), COUNT(commission_pct)
FROM employees e 
/*
 COUNT(last_name)|COUNT(1)|COUNT(*)|COUNT(commission_pct)|
----------------+--------+--------+---------------------+
             107|     107|     107|                   35|
 */

公式: AVG = SUM / COUNT

SELECT AVG(salary), SUM(salary)/COUNT(salary)
FROM employees e 
/*
 AVG(salary)|SUM(salary)/COUNT(salary)|
-----------+-------------------------+
6461.682243|              6461.682243|
 */

例题4: 查询公司中平均奖金率

#错误的
SELECT AVG(commission_pct)
FROM employees e 
/*
 AVG(commission_pct)|
-------------------+
           0.222857|
 */


#正确的(没奖金的人头也要算)
SELECT AVG(IFNULL(commission_pct,0)), 
SUM(commission_pct)/COUNT(IFNULL(commission_pct,0)) AS '平均奖金'
FROM employees e 
/*
 AVG(IFNULL(commission_pct,0))|平均奖金    |
-----------------------------+--------+
                     0.072897|0.072897|
 */

二.GROUP BY (分组)

2.1 基本使用

例题5: 查询各个工种的平均工资

SELECT job_id, AVG(salary)
FROM employees e 
GROUP BY job_id

2.2 使用多个列分组

例题5: 查询各个部门号和工种的平均工资

SELECT department_id, job_id, AVG(salary)
FROM employees e 
GROUP BY department_id, job_id
#或者
SELECT job_id, department_id, AVG(salary)
FROM employees e 
GROUP BY job_id, department_id 

上面两种方式,比如先按性别分再按班级分 和 先按班级分再按性别分是一样的

注意: SELECT中出现的非组函数的字段必须声明在GROUP BY 中
反之, GROUP BY中声明的字段不一定得出现在SELECT中

#错误示例
SELECT job_id, department_id, AVG(salary)
FROM employees e 
GROUP BY job_id

#其中, GROUP BY中缺少了SELECT中的department_id

2.3 GROUP 中使用 WITH ROLLUP

SELECT department_id, AVG(salary)
FROM employees e 
GROUP BY department_id WITH ROLLUP
/*
 department_id|AVG(salary) |
-------------+------------+
             |      7000.0|
           10|      4400.0|
           20|      9500.0|
           30|      4150.0|
           40|      6500.0|
           50| 3475.555556|
           60|      5760.0|
           70|     10000.0|
           80| 8955.882353|
           90|19333.333333|
          100|      8600.0|
          110|     10150.0|
             | 6461.682243|
 */

注意: 我们发现在GROUP 中使用 WITH ROLLUP结果会在最后多一行汇总

所以当使用WITH ROLLUP时,不能同时使用ORDER BY自居进行结果排序,因为最后的汇总结果会扰乱排序

三.HAVING

3.1 基本使用

例题6: 查询各个部门中最高工资比10000高的部门信息

#错误示例
SELECT department_id, MAX(salary)
FROM employees e 
WHERE MAX(salary) > 10000
GROUP BY department_id 

#正确示范
SELECT department_id, MAX(salary)
FROM employees e 
GROUP BY department_id
HAVING MAX(salary) > 10000

要求1: 如果过滤条件中使用了聚合函数, 则必须使用HAVING来替换WHERE, 否则报错
要求2: HAVING必须声明在 GROUP BY的后面
要求3: 我们使用HAVING的前提是SQL中使用了GROUP BY

3.2 WHERE和HAVING的对比

例题7: 查询部门id为10,20,30,40的部门中工资高于10000的部门信息

#方式一
SELECT department_id, MAX(salary)
FROM employees e 
WHERE department_id IN(10,20,30,40)
GROUP BY department_id 
HAVING MAX(salary) > 10000;
#方式二
SELECT department_id, MAX(salary)
FROM employees e 
GROUP BY department_id 
HAVING MAX(salary) > 10000 AND department_id IN(10,20,30,40);

方式一执行效率高于方式二
根据情况结合使用

四.SELECT的执行过程

4.1 查询的结构

SQL99语法:
SELECT …,…,(存在聚合函数)
FROM …(LEFT / RIGHT) JOIN … ON 多表的连接条件
(LEFT / RIGHT) JOIN … ON…
WHERE 不包含聚合函数的过滤条件
GROUP BY …,…,…
HAVING 包含聚合函数的过滤条件
ORDER BY …,…,…(ASC / DESC)
LIMIT …,…

4.2 SELECT执行顺序

FROM -> JOIN ON -> WHERE-> GROUP BY-> HVING -> SELECT -> DISTINCT
->ORDER BY -> LIMIT

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:41:07  更:2022-10-17 12:43:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/19 0:44:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码