MySQL分组聚合

where 与 having 的区别 & order by

假如我们有一张表,表名为 sales,如下所示:

+----------------+-------------+--------------+---------+----------+---------------+
| transaction_id | customer_id | product_name | price   | quantity | purchase_date |
+----------------+-------------+--------------+---------+----------+---------------+
|              1 |         101 | Laptop       | 1200.00 |        2 | 2024-06-01    |
|              2 |         102 | Phone        |  800.00 |        1 | 2024-06-02    |
|              3 |         101 | Tablet       |  500.00 |        3 | 2024-06-03    |
|              4 |         103 | Laptop       | 1200.00 |        1 | 2024-06-04    |
|              5 |         102 | Headphones   |  100.00 |        2 | 2024-06-05    |
|              6 |         101 | Phone        |  800.00 |        1 | 2024-06-06    |
|              7 |         104 | Tablet       |  500.00 |        2 | 2024-06-07    |
|              8 |         102 | Laptop       | 1200.00 |        1 | 2024-06-08    |
|              9 |         101 | Phone        |  800.00 |        2 | 2024-06-09    |
|             10 |         103 | Headphones   |  100.00 |        1 | 2024-06-10    |
+----------------+-------------+--------------+---------+----------+---------------+

having子句

having 子句用于在 SQL 查询中对分组后的结果进行筛选,用于过滤分组后的数据。

where 子句对行数据进行筛选,用于过滤行数据。

  • 想要找出购买商品数量大于 1 且总价值超过 1000 的客户。我们可以这样做:

    select customer_id, sum(price * quantity) as total_purchase_value
    from sales
    group by customer_id
    having sum(quantity) > 1 and sum(price * quantity) > 1000;+-------------+----------------------+
    | customer_id | total_purchase_value |
    +-------------+----------------------+
    |         101 |              6300.00 |
    |         102 |              2200.00 |
    |         103 |              1300.00 |
    +-------------+----------------------+
    3 rows in set (0.00 sec)
    

    在这个例子中只有满足这两个条件的客户才会包含在结果中。并且像上面having后面的就是分组后的数据。

  • 查找购买了至少三种不同产品的客户。我们可以这样查询:

    select customer_id, count(distinct product_name) as distinct_products_count
    from sales
    group by customer_id
    having count(distinct product_name) >= 3;+-------------+-------------------------+
    | customer_id | distinct_products_count |
    +-------------+-------------------------+
    |         101 |                       3 |
    |         102 |                       3 |
    +-------------+-------------------------+
    2 rows in set (0.00 sec)
    

这里关于where就不在进行举例子说明了。

如果wherehaving都能输出我们想要的结果,那我们就首选where会提高我们查询的效率。

order by 子句

order by 子句用于在 SQL 查询结果中指定排序顺序。它允许按照一个或多个列的值对查询结果进行排序,默认情况下,order by会按照升序(asc)排列数据,但也可以指定降序(desc)。

以下是 order by 子句的一般语法结构:

select 列名1, 列名2, ...
from 表名
order by 列名1 [asc|desc], 列名2 [asc|desc], ...;
  • 按客户ID和销售额排序

    select customer_id, sum(price * quantity) as total_sales
    from sales
    group by customer_id
    order by customer_id asc, total_sales desc;+-------------+-------------+
    | customer_id | total_sales |
    +-------------+-------------+
    |         101 |     6300.00 |
    |         102 |     2200.00 |
    |         103 |     1300.00 |
    |         104 |     1000.00 |
    +-------------+-------------+
    4 rows in set (0.00 sec)
    

    在这个例子中,order by customer_id asc, total_sales desc 指定了首先按客户ID升序排序,然后在同一客户ID内按总销售额降序排序。

  • 按产品名称排序

    select product_name, sum(quantity) as total_quantity_sold
    from sales
    group by product_name
    order by product_name asc;+--------------+---------------------+
    | product_name | total_quantity_sold |
    +--------------+---------------------+
    | Headphones   |                   3 |
    | Laptop       |                   4 |
    | Phone        |                   4 |
    | Tablet       |                   5 |
    +--------------+---------------------+
    4 rows in set (0.00 sec)
    

    在这个例子中,order by product_name asc 指定了按产品名称的字母顺序进行升序排序。

  • 按销售数量和单价排序

    select product_name, sum(quantity) as total_quantity, avg(price) as average_price
    from sales
    group by product_name
    order by total_quantity desc, average_price desc;+--------------+----------------+---------------+
    | product_name | total_quantity | average_price |
    +--------------+----------------+---------------+
    | Tablet       |              5 |    500.000000 |
    | Laptop       |              4 |   1200.000000 |
    | Phone        |              4 |    800.000000 |
    | Headphones   |              3 |    100.000000 |
    +--------------+----------------+---------------+
    4 rows in set (0.00 sec)
    

    在这个例子中,order by total_quantity desc, average_price desc 指定了按销售数量降序排序,然后在相同销售数量的情况下按平均单价降序排序。

    order by 子句进行排序时,可以根据需要指定列名、表达式、聚合函数或列的别名作为排序的依据。

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

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

相关文章

数据结构之B树的原理与业务场景

B树是一种自平衡的树形数据结构,它能够保持数据有序,并且可以高效地进行查找、顺序访问、插入和删除操作。B树的设计是为了优化磁盘I/O操作,因为它可以减少磁盘访问次数,这在数据库和文件系统中非常有用。 1. B树的原理 节点的出…

PCIe总线-RK3588 PCIe子系统简介(八)

1.PCIe子系统 RK3588 PCIe子系统如下图所示。总共拥有5个PCIe控制器。PCIe30X4(4L)支持RC和EP模式,其他4个仅支持RC模式。ITS port 1连接PCIe30X4(4L)和PCIe30X2(2L)控制器,PCIe30X4(4L)和PCIe30X2(2L)控制器使用PCIe3.0 PIPE PHY。ITS port 0连接PCIe3…

RIP路由附加度量值(华为)

#交换设备 RIP路由附加度量值 RIP(Routing Information Protocol)路由协议中的附加度量值是指在RIP路由原来度量值的基础上所增加的额外度量值,通常以跳数来表示。这个附加度量值可以是正值,也可以是负值,用于影响路…

关于STM32上用HID HOST调鼠标数据的解析

一、前言 关于这章主要是基于我前面的那篇文章 链接: 关于怎么用Cubemx生成的USBHID设备实现读取一体的鼠标键盘设备(改进版) https://blog.csdn.net/qq_29187987/article/details/139535648?spm1001.2014.3001.5501 引用的文章的简介 引用的这篇文…

数据库概述1

数据:描述事物的符号记录称为数据; 包括数字、图片、音频等; 数据库:长期储存在计算机内有组织、可共享的大量数据的集合;数据库中的数据按照一定的数据模型组织、描述和存储,具有较小的数据冗余、较高的数…

STM32学习笔记(一)--时钟树详解

(1)时钟概述;时钟是具有周期性的脉冲信号,最常用的是占空比50%的方波。(时钟相当于单片机的脉搏;STM32本身非常复杂,外设非常的多,为了保持低功耗工作,STM32 的主控默认不…

(一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景

utf8mb4_general_ci 和 utf8mb4_unicode_ci 是 MySQL 数据库中字符集和排序规则。用于指定字符数据的排序和比较规则,确保在数据库中对字符串进行查询和比较时得到正确的结果。 1、utf8mb4_general_ci 是一个较为简单的排序规则。不区分大小写(case-ins…

【Python】深入了解 AdaBoost:自适应提升算法

我们都找到天使了 说好了 心事不能偷藏着 什么都 一起做 幸福得 没话说 把坏脾气变成了好沟通 我们都找到天使了 约好了 负责对方的快乐 阳光下 的山坡 你素描 的以后 怎么抄袭我脑袋 想的 🎵 薛凯琪《找到天使了》 在机器学习的领域中&#x…

算法工程师 | 如何快速 了解,掌握一个算法!脚踏实地,迎着星辰,向前出发 ~

本文是一些碎碎念 希望对正在迈向 算法工程师道路的你 有所裨益 一般来说,代码 中会有很多 算法实现的细节,但论文可能并没有体现,所以能够尝试自己 仔细阅读论文,手动复现代码,基本上来说对 这个 算法 你有了全…

夏季城市环境卫生挑战多:TSINGSEE青犀智慧环卫方案助力城市垃圾站智能管理

一、背景分析 夏季,随着气温的攀升,城市垃圾的数量和种类也随之增加,这给环卫工作带来了极大的挑战。环卫垃圾站点作为城市垃圾处理的重要一环,其管理效率直接关系到城市环境的整洁与卫生。近年来,随着视频监控技术的…

【Redis】Redis常见问题——缓存更新/内存淘汰机制/缓存一致性

目录 回顾数据库的问题如何提高 mysql 能承担的并发量?缓存解决方案应对的场景 缓存更新问题定期生成如何定期统计定期生成的优缺点 实时生成maxmemory 设置成多少合适呢?项目类型上来说 新的问题 内存淘汰策略Redis淘汰策略为什么redis要内存淘汰内存淘…

ESP32 IDF ADF 加入音频

需要把mp3制作成音频bin 用ADF自带工具 果用户需要生成自己的 audio-esp.bin,则需要执行 mk_audio_bin.py 脚本(位于 $ADF_PATH/tools/audio_tone/mk_audio_tone.py),并且指定相关文件的路径。 源 MP3 文件在 tone_mp3_folder …

红黑树(C++)

文章目录 写在前面1. 红黑树的概念及性质1. 1 红黑树的概念1. 2 红黑树的性质 2. 红黑树节点的定义3. 红黑树的插入3.1 按照二叉搜索的树规则插入新节点3.2 检测新节点插入后,红黑树的性质是否造到破坏 4.红黑树的删除5.红黑树的验证6.源码 写在前面 在上篇文章中&…

MySQL中CAST和CONVERT函数都用于数据类型转换

在 MySQL 中,CAST() 和 CONVERT() 函数都用于数据类型转换。虽然这两个函数在大多数情况下可以互换使用,但它们之间还是有一些细微的差别。 官方文档地址 https://dev.mysql.com/doc/refman/8.4/en/cast-functions.html#function_cast CAST() 函数 C…

5.3.1_2 二叉树的层次遍历

👋 Hi, I’m Beast Cheng👀 I’m interested in photography, hiking, landscape…🌱 I’m currently learning python, javascript, kotlin…📫 How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以订…

ERNIE-Lite-8K模拟function calling的测试代码

ERNIE-Lite-8K目前免费。一般免费的东西功能都比较少,ERNIE-Lite-8K就不支持function calling。有一些办法可以通过提示词近似实现类似的效果。 今天,我通过系统提示的方式测试了ERNIE-Lite-8K,让它“调用”我实现的do_add函数,实…

Linux 基础IO 三

1.close 关闭之后&#xff0c;文件内部没有数据 #include<stdio.h> #include<string.h> //#include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h>int main() {close(1);int fd open("log.txt", O…

c++模板模式

文章目录 模板模式什么是模板模式为什么使用模板模式模板模式实现步骤 示例模板模式优缺点 模板模式 什么是模板模式 模板模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;将某些步骤的具体实现延…

[DDR4] DDR 简史

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解DDR4》 存和硬盘&#xff0c;这对电脑的左膀右臂&#xff0c;共同扛起了存储的重任。内存以其超凡的存取速度闻名&#xff0c;但一旦断电&#xff0c;内存中的数据也会消失。它就像我们的工作桌面&…