【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.hqwc.cn/news/188321.html

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

相关文章

一文带你了解docker技术

什么是Docker Docker是一种虚拟技术,诞生于2013年,是dotCloud公司研发的开源项目,因为docker这个公司后来改名docker inc,docker的目标是实现轻量级的操作系统虚拟化解决方案。通俗点说,我们想在一台机器上运行多个系…

redis集群-主从复制

目录 一、主从复制概念二、单机安装Redis2.1、安装 Redis 需要的软件 gcc 和 tcl2.2、上传Redis压缩包2.3、编辑 redis.conf 文件2.4、执行安装 Redis 命令2.5、注意防火墙配置 三、主从复制 - 环境搭建3.1、配置一个 master 节点,两个 slave 节点3.2、配置 redis63…

数据结构-哈希表(C语言)

哈希表的概念 哈希表就是: “将记录的存储位置与它的关键字之间建立一个对应关系,使每个关键字和一个唯一的存储位置对 应。” 哈希表又称:“散列法”、“杂凑法”、“关键字:地址法”。 哈希表思想 基本思想是在关键字和存…

kibana8.10.4简单使用

1.创建discovery里的日志项目 点击stack management 选择kibana里的数据视图,右上角创建数据视图,输入名称。索引范围。例子 example-* ,匹配以example-开头的所有index。 然后点击 保存数据视图到kibana, 2.Kibana多用户创建及角色权限控…

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

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

springMvc中的拦截器【巩固】

先实现下想要的拦截器功能 package com.hmdp.utils;import com.hmdp.entity.User; import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Ht…

AVL树的底层实现

文章目录 什么是AVL树?平衡因子Node节点插入新节点插入较高左子树的左侧新节点插入较高左子树的右侧新节点插入较高右子树的左侧新节点插入较高右子树的右侧 验证是否为平衡树二叉树的高度AVL的性能 什么是AVL树? AVL树又称平衡二叉搜索树,相…

YOLOv3 学习记录

文章目录 简介整体介绍整体架构图 网络架构的改进Backbone 的改进FPNAnchor 机制 坐标表示与样本匹配目标边界框的预测正负样本匹配 损失函数 简介 关注目标在哪里 目标是什么 目标检测的发展路径: proposal 两阶段 --> anchor-base/ anchor-free --> nms f…

SSM框架

SSM SSM框架说明SpringBootMyBatis整合MyBatis数据库中表的设计Pojo对象设计Dao接口设计Dao单元方法进行测试 XML管理整合MyBatis框架映射配置文件的位置XML配置SQL标签常用的SQL标签 动态SQL语句动态删除数据动态修改数据 SSM框架说明 Spring 指 Spring Framework&#xff0c…

【入门篇】1.1 redis 基础数据类型详解和示例

文章目录 1. 简介2. Redis基础数据类型2.1 String类型场景示例常用命令示例 2.2 List类型场景示例 2.3 Set类型场景示例 2.4 Hash类型场景示例 2.5 Sorted Set类型 3. 使用Redis存储数据的注意事项1. 内存管理2. 数据持久化3. 高并发下的性能考量 4. 参考资料 1. 简介 Redis概…

web环境实现一键式安装启动

部署的痛点 一般在客户环境安装web环境,少说需要花费1-2小时。一般需要安装jdk、nginx、mysql、redis等 等你接触到了inno setup ,你有可能会节约更少的时间去部署。也有可能是一个不懂技术的人,都可以进行操作的。废话不多说,接…

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

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