当前位置: 首页 > article >正文

MySQL零基础教程13—分组查询(group by 和 having)

复习

上期学习的时聚合查询,其中涉及到了几个聚合函数,通过下方导图整体回顾复习一下:

在这里插入图片描述

分组

之前我们使用最多的就是where子句,分组查询要学习两个新的子句:group byhaving子句

group by子句

我们构建一个场景:假如在订单表中,我们需要获取到,每个人分别买了多少单,那么就需要以顾客为组,分别统计每个顾客的订单数量,这种情况就需要分组

select customer_name, count(*) as 订单数量 from orders group by customer_name;

在这里插入图片描述
在分组查询的时候,因为已经指定了分组条件,就不需要对count()再加条件了,系统会自动先分组再汇总

having子句:给分组加上条件

在之前我们给查询加条件都是通过where子句,在分组查询的时候,也是可以增加过滤条件的,只不过需要使用的是having子句,分组查询的时候where是不起作用的

where和having的区别:

  1. where过滤的时候,指定的是行,不是分组,where是没有分组的概念的
  2. having在用法上和where大同小异,区别就是having过滤的是“组”

或者这样理解:where是在分组前进行过滤,having是在分组后进行过滤

构建一个需要过滤的分组查询场景:

查询每位顾客的订单数量,但是只查询订单总数大于等于3的顾客:

select customer_name as 顾客姓名, count(*) as 订单数量 from orders group by customer_name having count(*)>=3;

在这里插入图片描述
上边提到where是在分组前进行过滤,having是在分组后进行过滤,我们可以写一个语句体会一下:

根据顾客分组,查询订单数量大于等于3,且姓张的顾客的数据:

select customer_name as 顾客姓名, count(*) from orders where customer_name like '张%' group by customer_name having count(*)>=3;

在这里插入图片描述
上边这个sql在分组前使用where,分组后使用having,两个子句就都生效了

分组后的排序

之前还学习了对查询数据的排序,比如以某一列的值为依据,对结果进行增序或者降序排列,分组后也是可以排序的,同样使用order by子句

我们对上边的查询结果,根据订单数量进行增序排列(从低到高)

select customer_name, count(*) as 订单数量 from orders group by customer_name order by count(*) asc;

在这里插入图片描述

回顾select子句的顺序

截止现在,已经学习了不少子句了,我们汇总复盘一下:

子句说明是否必须使用
select要返回的内容,列或者表达式
from从哪个表里边检索如果从表中查询,则必须
where过滤行
group by分组只有分组处理的时候使用
having组级别的过滤
order by对结果排序
limit限制查询结果行数

http://www.kler.cn/a/569210.html

相关文章:

  • 消息中间件应用的常见问题与方案?
  • 华为 Open Gauss 数据库在 Spring Boot 中使用 Flyway
  • 【Delphi】如何解决使用webView2时主界面置顶,而导致网页选择文件对话框被覆盖问题
  • Python的那些事第三十四篇:基于 Plotly 的交互式图表与仪表板设计与应用
  • 【北京迅为】itop-3568 开发板openharmony鸿蒙烧写及测试-第1章 体验OpenHarmony—烧写镜像
  • 6-2JVM解释器
  • docker利用docker-compose-gpu.yml启动RAGFLOW,文档解析出错【亲测已解决】
  • 高效API开发:FastAPI中的缓存技术与性能优化
  • 前缀和算法 算法4
  • unsloth报错FileNotFoundError: [WinError 3] 系统找不到指定的路径。
  • Transformer 代码剖析2 - 模型训练 (pytorch实现)
  • 【大模型学习笔记】0基础本地部署dify教程
  • AI辅助学习vue第十四章
  • 欧拉22.03系统安装离线redis 6.2.5
  • vue3配置端口,比底部vue调试
  • logback日志输出配置范例
  • FPGA AXI-Stream协议详解与仿真实践
  • Git版本管理逻辑解析:从核心原理到工作流实践
  • Java零基础入门笔记:(7)异常
  • 中间件专栏之Redis篇——Redis中过期key删除和内存淘汰策略