【MySQL】聚合函数:汇总、分组数据

文章目录

  • 学习目标
  • MAX()、MIN()、AVG()、SUM()、COUNT()
  • COUNT(*) 得到所有记录条目
  • DISTINCT去重
  • 练习1(使用UNION , SUM, BETEEN AND)
  • GROUP BY子句
  • 练习2(使用sum,group by, join on, join using)
  • HAVING子句分组筛选
  • WITH ROLLUP运算符

学习目标

  • 掌握常用的聚合函数:COUNT, MAX, MIN, SUM, AVG
  • 掌握GROUP BY和HAVING子句的用法
  • 掌握Where和HAVING的区别
    • where用在group by之前,having用在group by之后
  • 带GROUP BY的SQL怎么优化?
    • 未查询到,日后补充
  • COUNT(1), COUNT(*), COUNT(字段)那种效率是最好的?
    • 结论:count(*) = count(1) > count(主键字段) > count(字段)

MAX()、MIN()、AVG()、SUM()、COUNT()

SELECT MAX(invoice_total) AS highest,MIN(invoice_total) AS lowest,AVG(invoice_total) AS average,SUM(invoice_total) AS total,COUNT(invoice_total) AS num
FROM invoices

运行结果

COUNT(*) 得到所有记录条目

  • 聚合函数只运行非空行,如果列中有空值,不会被算在函数内
  • 如果想得到表格中的所有记录条目,使用COUNT(*)
  • select count(name) from t_order,意思是统计t_order表中,name字段不为null的记录有多少个,如果某条记录的name字段为null,就不会被统计进去。
  • select count(1) from t_order,意思是1这个表达式不为null的记录有多少个。1这个表达式就是单纯数字,它永远都不是null,所以这条语句,就是在统计t_order表中有多少个记录
-- 一个没有空行,一个有空行,结果不同
SELECT MAX(payment_date) AS latest,COUNT(invoice_total) AS num,COUNT(payment_date) AS count_of_paymentsCOUNT(*) AS total_records
FROM invoices

在这里插入图片描述

DISTINCT去重

SELECT MAX(invoice_total) AS highest,MIN(invoice_total) AS lowest,AVG(invoice_total) AS average,SUM(invoice_total * 1.1) AS total,-- client_id中有重复的,结果7COUNT(client_id) AS num-- 可用distinc去重,结果3COUNT(DISTINCT  client_id) AS num
FROM invoices
WHERE invoice_date > '2019-07-01';

练习1(使用UNION , SUM, BETEEN AND)

  • 练习:汇总2019上半年、下半年以及整年的数据。
  • 使用UNION , SUM, BETEEN AND
SELECT'First half of 2019' AS date_range,SUM(invoice_total) AS total_sales,SUM(payment_total) AS total_payments,SUM(invoice_total - payment_total) AS what_we_expect
FROM invoices
WHERE invoice_date BETWEEN '2019-01-01' AND '2019-06-30'
UNION
SELECT'Second half of 2019' AS date_range,SUM(invoice_total) AS total_sales,SUM(payment_total) AS total_payments,SUM(invoice_total - payment_total) AS what_we_expect
FROM invoices
WHERE invoice_date BETWEEN '2019-07-01' AND '2019-12-31'
UNION
SELECT'Total' AS date_range,SUM(invoice_total) AS total_sales,SUM(payment_total) AS total_payments,SUM(invoice_total - payment_total) AS what_we_expect
FROM invoices
WHERE invoice_date BETWEEN '2019-01-01' AND '2019-12-31'

运行结果:
在这里插入图片描述

GROUP BY子句

  • 按列分组数据
  • GROUP BY子句永远在from和where子句之后,在order by之前
  • st的口诀:select, from, where, having, group by, order by
把sum按照client_id分组
还可以排序
还可以添加筛选条件
selectclient_id,sum(invoice_total) as total_sales
from invoices
where invoice_date >= '2019-07-01'
group by client_id
order by total_sales desc
  • 多列分组数据
-- 多列分组
selectstate,city,sum(invoice_total) as total_sales
-- 连接两个表
from invoices i
JOIN clients using (client_id)
-- 每个state和city的组合
group by state, city

练习2(使用sum,group by, join on, join using)

-- 按支付日期、支付方式分组计算payment_total的总值
select p.date,pm.name,sum(payment_total) as 'total_payments'
from invoices i
join payments p using (invoice_id)
join payment_methods pm on p.payment_method = pm.payment_method_id
group by p.date, payment_method

运行结果
在这里插入图片描述

HAVING子句分组筛选

  • 使用场景
-- 按clientid把totalsales分组后,想获得total大于500的客户。怎么办呢?
-- 此时不能在from后面用where totalsales> 500,因为此时total_sales的结果还没有
select client_id,sum(invoice_total) as total_sales
from invoices
group by client_id
  • 用HAVING子句,在分组之后筛选数据
select client_id,sum(invoice_total) as total_sales
from invoices
group by client_id
-- 在group by后用having,此时把大于500的筛选出来了
having total_sales > 500

运行结果
在这里插入图片描述

  • having子句的复合搜索,用and写一个复合搜索条件
select client_id,sum(invoice_total) as total_sales,count(*) as number_of_invoices
from invoices
group by client_id
-- 想筛选total_sales大于500且发票数量大于5的,用and连接
having total_sales > 500 and number_of_invoices > 5

运行结果
在这里插入图片描述

  • having子句中筛选的列,一定是在select中出现的。而where则没有这样的限制。

  • 练习
    找到位于VA的,消费总额大于100的顾客

use sql_store;
select customer_id,sum(unit_price * quantity) as total_price
from customers cjoin orders o using (customer_id)join order_items using (order_id)
where state = 'VA'
group by customer_id
having total_   price > 100

WITH ROLLUP运算符

  • 对group by的结果再进行汇总
select client_id,sum(invoice_total) as total_sales
from invoices
group by client_id with rollup

运行结果
在这里插入图片描述

  • 多列分组用rollup时,会得到每个组和整个结果集的汇总值
select state,city,sum(invoice_total) as total_sales
from invoices i
join clients c  using  (client_id)
group by state, city with rollup

运行结果

在这里插入图片描述

  • 练习
    按照支付方式分组,获取每种支付方式支付的总额,并进行结果汇总。
use sql_invoicing;
select pm.name,sum(amount) as total
from payments pjoin payment_methods pm on payment_method_id = payment_method
group by name with rollup

查询结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/195669.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 配置文件信息中文翻译版

前言 Redis 配置文件信息中文翻译版,方便大家阅读和理解对应参数信息及配置参数信息 # Redis configuration file example# Note on units: when memory size is needed, it is possible to specify # it in the usual form of 1k 5GB 4M and so forth: # 注意:当…

Linux下向Github仓库推送

文章目录 Git 与 Github安装git在github下创建项目下载项目到本地Git三板斧第一板斧 git add第二板斧 git commit第三板斧 git push Git 与 Github Git是目前从开发人员到设计人员的版本控制技术。gitee是国内社交代码托管平台。这是一个你可以玩和实验的地方。在这里你可以找…

Maven依赖管理项目构建工具(保姆级教学)

一、Maven介绍 官网地址:Maven – Introduction Maven 是一款为 Java 项目管理构建、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。 Maven就是一个软件&#…

TSINGSEE青犀智慧机房AI+视频智能监管方案,保障机房设备稳定运转

一、背景与需求分析 随着互联网的高速发展,机房数量及配套环境设备日益增多,其运行状况直接决定着企业组织的运营效率和服务质量。作为企业信息化的核心,机房的安全监测与管理,不仅关系到企业的稳定运转,同时也关系到…

Java编程中,使用时间戳机制实现增量更新的示例

一、需求 课程下可以创建多个讲次,然后分享出去。 在没有更新分享前,通过分享链接看到的课程及讲次详情是快照。课程制作者可以继续修改调整自己的课程,对分享用户是不可见。 当制作者完成修改后,更新分享,让用户看到…

MySQL事务特性原理

文章目录 事务四特性预备知识checkpoint机制redo日志redo的流程事务提交后什么时候进行刷盘 undo日志:数据还未被修改、也是备份Undo日志的作用undo的存储结构回滚段与事务回滚段中的数据分类undo的类型undo log的生命周期 MVCC一、 原子性原理如何通过undo日志实现…

【C语言】深入解开指针(三)

🌈write in front :🔍个人主页 : 啊森要自信的主页 真正相信奇迹的家伙,本身和奇迹一样了不起啊! 欢迎大家关注🔍点赞👍收藏⭐️留言📝>希望看完我的文章对你有小小的帮助&#x…

业务流程图用什么软件画?这10款流程图软件,好用到飞起!

业务流程图是什么? 业务流程图是一种用于表示业务过程中活动流向的图形表示方法,它使用标准化的图形元素(如箭头、椭圆、方框等)来表达一个过程中各个环节之间的关系。在这个图形表示中,每个元素都有特定的含义和功能…

Python实现视频字幕时间轴格式转换

自己喜欢收藏电影,有时网上能找到的中文字幕文件都不满足自己电影版本。在自己下载的压制版电影中已内封非中文srt字幕时,可以选择自己将srt的时间轴转为ass并替换ass中的时间轴。自己在频繁 复制粘贴改格式的时候想起可以用Python代码完成转换这一操作&…

2.4 矩阵的运算法则

矩阵是数字或 “元素” 的矩形阵列。当矩阵 A A A 有 m m m 行 n n n 列,则是一个 m n m\times n mn 的矩阵。如果矩阵的形状相同,则它们可以相加。矩阵也可以乘上任意常数 c c c。以下是 A B AB AB 和 2 A 2A 2A 的例子,它们都是 …

Postman:API测试之Postman使用完全指南

Postman是一个可扩展的API开发和测试协同平台工具,可以快速集成到CI/CD管道中。旨在简化测试和开发中的API工作流。 Postman工具有Chrome扩展和独立客户端,推荐安装独立客户端。 Postman有个workspace的概念,workspace分personal和team类型…

mybatis、mysql 创建时间(create_time)异常自动更新为当前时间

目录标题 一、问题二、原因三、解决 一、问题 bug: mybatis更新代码没有修改时间,但是时间会自动更新为当前时间。 。。。 被坑了挺久 二、原因 可能是创建表的时候, Navicat Premium 等可视化工具给你整活了。。。 三、解决 取消勾选。 注意&…

【超好用的工具库】hutool-all工具库的基本使用

简介(可不看): hutool-all是一个Java工具库,提供了许多实用的工具类和方法,用于简化Java开发过程中的常见任务。它包含了各种模块,涵盖了字符串操作、日期时间处理、加密解密、文件操作、网络通信、图片处…

【漏洞复现】NUUO摄像头存在远程命令执行漏洞

漏洞描述 NUUO摄像头是中国台湾NUUO公司旗下的一款网络视频记录器,该设备存在远程命令执行漏洞,攻击者可利用该漏洞执行任意命令,进而获取服务器的权限。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律&…

单片机FLASH下载算法的制作

环境 硬件使用正点原子STM32F407探索者V2开发板 编程环境使用MDK 下载工具使用JLINK FLASH芯片使用W25Q128 什么是下载算法 单片机FLASH的下载算法是一个FLM文件,FLM通过编译链接得到,其内部包含一系列对FLASH的操作,包括初始化、擦除、写…

【flink理论】动态表:关系查询处理流的思路:连续查询、状态维护;表转换为流需要编码编码

文章目录 一. 使用关系查询处理流的讨论二. 动态表 & 连续查询(Continuous Query)三. 在流上定义表1. 连续查询2. 查询限制2.1. 维护状态2.2. 计算更新 四. 表到流的转换1. Append-only 流2. Retract 流3. Upsert 流 本文主要讨论了: 讨论通过关系查询处理无界流…

Window MongoDB安装

三种NOSQL的一种,Redis MongoDB ES 应用场景: 1.社交场景:使用Mongodb存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人,地点等功能 2.游戏场景:使用Mongodb存储游戏用户信息,用户的装备,积分等直接以内嵌文档的形式存储,方便查询,高效率存储和访问…

一阶低通滤波器(一阶巴特沃斯滤波器)

连续传递函数G(s) 离散传递函数G(z) 转换为差分方程形式 一阶巴特沃斯滤波器Filter Designer参数设计:参考之前的博客Matlab的Filter Designer工具设计二阶低通滤波器 设计采样频率100Hz,截止频率20Hz。 注意:设计参数使用在离散系统中&…

Python使用Mechanize库完成自动化爬虫程序

Mechanize是一个Python第三方库,它可以模拟浏览器的行为,实现自动化的网页访问、表单填写、提交等操作。下面是一个使用Mechanize库编写的爬虫的例子,它可以爬取百度搜索结果页面的标题和链接: import mechanize from bs4 import …

短期经济波动:均衡国民收入决定理论(三)

短期经济波动:国民收入决定理论(三) 文章目录 短期经济波动:国民收入决定理论(三)[toc]1 总需求曲线及其变动1.1 总需求曲线含义1.2 总需求曲线推导1.2.1 代数推导1.2.2 几何推导 1.3 AD曲线及其变动1.3.1 扩张性财政政策1.3.2 扩张性货币政策 2 总供给曲…