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

news2025/1/9 16:15:19

文章目录

  • 学习目标
  • 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_payments
       COUNT(*) 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中有重复的,结果7
       COUNT(client_id) AS num
      -- 可用distinc去重,结果3
      COUNT(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分组
还可以排序
还可以添加筛选条件
select
    client_id,
    sum(invoice_total) as total_sales
from invoices
where invoice_date >= '2019-07-01'
group by client_id
order by total_sales desc
  • 多列分组数据
-- 多列分组
select
    state,
    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 c
    join 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 p
    join payment_methods pm 
        on payment_method_id = payment_method
group by name with rollup

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NET8 ORM 使用AOT SqlSugar

.NET AOT8 基本上能够免强使用了, SqlSugar ORM也支持了CRUD 能在AOT下运行了 Nuget安装 SqlSugarCore 具体代码 StaticConfig.EnableAot true;//启用AOT 程序启动执行一次就好了//用SqlSugarClient每次都new,不要用单例模式 var db new SqlSugarClient(new ConnectionC…

【Nuxt】Nuxt3 动态导入图片 src

nuxt3 不再支持 require 动态导入资源,因此需要我们将图片放到 public 目录下,这样我们就可以动态导入了 比如下面 👇: 感谢 Nuxt3遇见的坑(四):图片动态渲染之后打包路径问题以及打包css样式…

MySQL5.7安装详细过程--window系统

1、Window安装MySQL5.7详细过程 1.1、下载MySQL5.7安装包 下载地址:https://downloads.mysql.com/archives/community/ 1.2、将文件解压到盘符中 你可以解压到你想解压的位置,放在C或其他盘符都可以。 我放在了C盘中:C:\Program Files\my…

视频一键转码:批量转换MP4视频的技巧

随着数字媒体设备的普及,视频文件在生活中扮演着越来越重要的角色。而在处理视频文件时,有时需要将其转换为不同的格式以适应不同的需求。其中,MP4格式因其通用性和高质量而备受青睐。本文详解云炫AI智剪如何一键转码的技巧,帮助批…

Java内存区域速览

文章目录 JVM的组成加载字节码流程 运行时数据区-总览1. 程序计数器2. 虚拟机栈栈帧栈的运行原理 3. 本地方法栈4. 堆内存(Java Heap虚拟机对堆 的划分1. 年轻代(Young Generation):2. 老年代(Old Generation)&#xf…

GPT-4V新玩法登顶GitHub热榜,随手一画就能生成网页!web开发者:感受到了威胁

西风 发自 凹非寺 量子位 | 公众号 QbitAI 随手一画就能生成网页!GPT-4V新玩法登顶GitHub热榜,狂揽3000🌟: 现在只要简单画一画,框一框,点击执行: “啪”地一下,一个带有各种“按钮…

设计模式-状态模式-笔记

状态模式State 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供了一种解决方案。 经典模式:State、Memento 动机&#xff08…

R语言绘制精美图形 | 火山图 | 学习笔记

一边学习,一边总结,一边分享! 教程图形 前言 最近的事情较多,教程更新实在是跟不上,主要原因是自己没有太多时间来学习和整理相关的内容。一般在下半年基本都是非常忙,所有一个人的精力和时间有限&#x…

modbusRTU通信简单实现(使用NModbus4通信库)

本文实现ModbusRTU通信,使用的是NModbus4通信库,使用 Modbus Slave是一个模拟Modbus协议从机的上位机软件,主要用于模拟测试跟其他主机设备通信的过程。与之成套存在的另一个软件--Modbus Poll,则是模拟Modbus协议主机的上位机软件…

基于ssm+vue交通事故档案系统

摘要 摘要是对文章、论文或其他文本的主要观点、结论和关键信息的简洁概括。由于你没有提供具体的文章或主题,我将为你创建一个通用的摘要。 本文介绍了一种基于SSM(Spring Spring MVC MyBatis)和Vue.js的交通事故档案管理系统的设计与实现…

Unity Text文本首行缩进两个字符的方法

Text文本首行缩进两个字符的方法比较简单。通过代码把"\u3000\u3000"加到文本字符串前面即可。 参考如下代码: TMPtext1.text "\u3000\u3000" "这是一段有首行缩进的文本内容。\n这是第二行"; 运行效果如下图所示: 虽…

Linux(3):Linux 的文件权限与目录配置

把具有相同的账户放入到一个组里面,这个组就是这两个账户的 群组 。在访问资源(操作系统中计算机的资源)时,可以让这个组里面的所有用户都具有访问权限。 每个账号都可以有多个群组的支持。 在我们Liux 系统当中,默认的…

ROS话题(Topic)通信:自定义msg - 例程与讲解

在 ROS 通信协议中,数据是以约定好的结构传输的,即数据类型,比如Topic使用的msg,Service使用的srv,ROS 中的 std_msgs 封装了一些原生的数据类型,比如:Bool、Char、Float32、Int64、String等&am…

为什么Go是后端开发的未来

近年来,Go 编程语言的流行度迅速增加。Go 最初由 Google 开发,迅速成为后端开发中最受欢迎的语言之一,特别是在分布式系统和微服务的开发中。本文将讨论为什么 Go 是后端开发的未来。 Go 简介 Go,又称为 Golang,是由…

7、使用真机调试鸿蒙项目

此处以华为手机为例,版本为鸿蒙4.0. 一、打开手机调试功能 1、打开开发者模式 打开“设置”—“关于手机”,连续点击“软件版本”可打开开发者模式 2、开启USB调试功能 打开“设置”—“系统更新”—“开发者选项”,下拉找到“USB调试”…

1-2 暴力破解-模拟

模拟:根据题目要求编写代码 可分为:图形排版(根据某种规则输出特定图形)、日期问题、其他模拟 一.图形排版 1.输出梯形(清华大学) 法一:等差数列 分析:每行的星号个数为等差数列2n2…

【Java 进阶篇】JQuery 遍历 —— 无尽可能性的 `each` 之旅

在前端的征途中,操作元素是开发者不可避免的任务之一。而在 JQuery 中,each 方法则是处理这个任务的得力助手。本文将深入探讨 each 方法的奇妙之处,以及它与原生的 for...of 循环的关系,带你领略无尽可能性的遍历之旅。 起步&am…

9款AI让你在2分钟内创建任何东西

1、免费AI绘画:LeonardoAi一个免费的 Midjourney 替代品,能够快速创建高品质和风格统一的视觉图片,帮你释放创造力。 2、 模板编辑AI:Canva 将所有AI的强大功能汇聚于一处,为你的工作流程注入超级动力。 3、构建网站&…

基于51单片机步进电机节拍步数正反转LCD1602显示( proteus仿真+程序+原理图+设计报告+讲解视频)

基于51单片机步进电机节拍步数正反转LCD1602显示 📑1. 主要功能:📑2. 讲解视频:📑3. 仿真📑4. 程序代码📑5. 设计报告📑6. 设计资料内容清单&&下载链接📑[资料下…

SpringCloud FeignClient声明式服务调用采坑记录(A调用服务B/C,B/C重启后必须重启A后才能成功调用配置项)

SpringCloud FeignClient声明式服务调用(A调用服务B/C,B/C重启后必须重启A后才能成功调用配置项采坑记录) 1. 报错(info级别的警告信息)2. 原因:使用了默认了cache负载均衡,或者禁用了ribbonLoa…