【重学 MySQL】三十八、group by的使用

news2024/9/24 0:18:13

【重学 MySQL】三十八、group by的使用

  • 基本语法
  • 示例
    • 示例 1: 计算每个部门的员工数
    • 示例 2: 计算每个部门的平均工资
    • 示例 3: 结合 WHERE 子句
  • `WITH ROLLUP`
    • 基本用法
    • 示例
    • 注意事项
  • 注意事项

在这里插入图片描述
GROUP BY 是 SQL 中一个非常重要的子句,它通常与聚合函数(如 COUNT(), MAX(), MIN(), SUM(), AVG() 等)一起使用,用于将多个记录组合成汇总行。GROUP BY 通过一个或多个列对结果集进行分组,并可以对每个分组应用聚合函数。

基本语法

SELECT column_name(s), AGGREGATE_FUNCTION(column_name)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);
  • column_name(s): 你想要选择的列。
  • AGGREGATE_FUNCTION(column_name): 应用于 column_name 的聚合函数。
  • table_name: 你要从中选择数据的表。
  • condition: 用于选择记录的条件(可选)。
  • GROUP BY column_name(s): 指定根据哪些列来分组结果。
  • ORDER BY column_name(s): 可选,用于对结果进行排序。

示例

假设我们有一个名为 employees 的表,它包含以下列:id, name, department, 和 salary

示例 1: 计算每个部门的员工数

SELECT department, COUNT(*) AS num_employees
FROM employees
GROUP BY department;

这个查询会返回每个部门以及该部门的员工数。

示例 2: 计算每个部门的平均工资

SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;

这会显示每个部门的平均工资。

示例 3: 结合 WHERE 子句

如果你只想查看某些部门的统计信息,你可以结合使用 WHERE 子句:

SELECT department, COUNT(*) AS num_employees
FROM employees
WHERE salary > 5000
GROUP BY department;

这个查询会返回工资超过 5000 的员工所在的部门以及每个部门的员工数。

WITH ROLLUP

MySQL中的GROUP BY ... WITH ROLLUP是一个强大的功能,它允许你执行聚合查询,并在结果集的末尾自动添加更高级别的汇总行。这些汇总行是通过对前面分组的结果进行进一步聚合得到的,从而提供了一种方便的方式来查看数据的不同层次的总计。

基本用法

当你使用GROUP BY ... WITH ROLLUP时,MySQL会生成一个包含所有指定列的分组结果集,并在结果集的末尾添加一个或多个汇总行。这些汇总行按照你在GROUP BY子句中指定的列的顺序进行汇总。对于每个汇总级别,它都会移除前面的列,并对剩余的列进行汇总。

示例

假设你有一个名为sales的表,其中包含yearproductamount三个字段,分别代表销售年份、产品名称和销售金额。

CREATE TABLE sales (
    year INT,
    product VARCHAR(50),
    amount DECIMAL(10, 2)
);

INSERT INTO sales (year, product, amount) VALUES
(2020, 'Product A', 100.00),
(2020, 'Product B', 200.00),
(2021, 'Product A', 150.00),
(2021, 'Product B', 250.00);

如果你想按年份和产品分组查看销售金额,并在最后添加按年份的总计和所有记录的总计,你可以这样做:

SELECT year, product, SUM(amount) AS total_sales
FROM sales
GROUP BY year, product WITH ROLLUP;

这将生成如下结果(结果顺序可能略有不同,取决于MySQL的实现):

+------+-----------+-------------+
| year | product   | total_sales |
+------+-----------+-------------+
| 2020 | Product A | 100.00      |
| 2020 | Product B | 200.00      |
| 2020 | NULL      | 300.00      |  -- 2020年总计
| 2021 | Product A | 150.00      |
| 2021 | Product B | 250.00      |
| 2021 | NULL      | 400.00      |  -- 2021年总计
| NULL | NULL      | 700.00      |  -- 所有记录总计
+------+-----------+-------------+

在这个例子中,WITH ROLLUP首先按yearproduct分组计算每个产品的销售总额,然后在每个年份的末尾添加该年份的总计(此时product列为NULL),最后在结果集的末尾添加所有记录的总计(此时yearproduct列均为NULL)。

注意事项

  • 使用WITH ROLLUP时,应确保你的SQL查询可以处理NULL值,因为汇总行会包含NULL值。
  • WITH ROLLUP可以与其他聚合函数(如COUNT(), AVG(), MIN(), MAX()等)一起使用。
  • 在结果集中,你可能需要使用COALESCEIFNULL等函数来处理或忽略NULL值,特别是在进行进一步的计算或展示时。

注意事项

  • SELECT 中出现的非组函数的字段必须声明在 GROUP BY 中,反之,GROUP BY 中声明的字段可以不出现在 SELECT 中。
  • GROUP BY 必须声明在 FROM 后面、WHERE 后面、ORDER BY 前面、LIMIT 前面
  • 当使用 WITH ROLLUP 时,不能同时使用 ORDER BY 子句进行结果排序,即 WITH ROLLUPORDER BY 是互相排斥的
  • SELECT 列表中,除了聚合函数外,只能包含 GROUP BY 子句中指定的列。
  • 如果在 SELECT 列表中包含了非聚合列且这些列未出现在 GROUP BY 子句中,那么查询将不会执行,并会报错(在某些数据库系统中,如 MySQL 的旧版本,这可能会静默地工作,但返回的结果可能不是你所期望的)。
  • 聚合函数用于对 GROUP BY 子句产生的每个分组执行计算。
  • 可以通过 HAVING 子句对分组后的结果进行过滤,这与 WHERE 子句不同,WHERE 在数据分组前进行过滤。

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

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

相关文章

MySQL和SQL的区别简单了解和分析使用以及个人总结

MySQL的基本了解 运行环境,这是一种后台运行的服务,想要使用必须打开后台服务,这个后台服务启动的名字是在安装中定义的如下图(个人定义MySQL88)区分大小写图片来源 可以使用命令net start/stop 服务名,开…

实验十八:IIC-EEPROM实验

这个实验比较复杂,是目前第一个多文件项目 KEY1-4:P3^0-P3^3 IIC_SCL=P2^1; IIC_SDA=P2^0; //定义数码管位选信号控制脚 LSA=P2^2; LSB=P2^3; LSC=P2^4; 代码 main.c #include "public.h" #in

常见汽车零部件ASIL等级示例

ASIL(Automotive Safety Integrity Level,汽车安全完整性等级)评级系统是ISO 26262标准中定义的一套风险分类体系,用于评估道路车辆中电子电气系统(E/E系统)功能安全的风险程度,并确保这些系统在…

Linux相关概念和重要知识点(6)(make、makefile、gdb)

1.make、makefile (1)什么是make、makefile? 在我们写完代码后,要编译运行,如果有多个.c文件就需要每次都自己用gcc -o来处理,这十分麻烦。当我们想要自定义多个文件的处理时,我们会浪费很多时…

MatrixOne助力一道创新打造高性能智能制造AIOT系统

客户简介 深圳一道创新(ETAO Innovation)成立于2012年,是一家创新型软件及信息技术服务商,致力于制造戏份行业—电子制造业的数字转型服务,构建万物互联的智能工程。一道创新致力于把先进的软件系统、数字平台、人工智…

拯救者Legion R9000X 2021R(82K8)原厂Win10与Windows11系统恢复镜像下载

LENOVO联想拯救者R9000X锐龙版2021款【82K8】预装OEM系统WIN11/10安装包,恢复原装出厂时开箱状态一模一样 链接:https://pan.baidu.com/s/15dGwacsEG0G8pOiZAHyXaQ?pwd0xgk 提取码:0xgk 联想原装出厂系统自带所有驱动、出厂主题壁纸、系统…

得物App荣获新奖项,科技创新助力高质量发展

近日,备受瞩目的2024中国国际服务贸易交易会(简称“服贸会”)在北京盛大开幕,这一全球唯一的国家级、国际性、综合型服务贸易盛会再次汇聚了全球服务贸易领域的精英与前沿成果。服贸会由商务部和北京市政府携手打造,并…

大数据系统调优:从DAG到单机

目标:优化T10的时效性全局DAG调度层优化:提前任务开始时间: 1. 优化慢结点:T10依赖了T4,T7,T8, 其中T8为瓶颈,如果T8能提前点完成,T10可以早点开始,就能早点完成 2. 快结点做更多预计算…

Android Studio 真机USB调试运行频繁掉线问题

一、遇到问题 Android Studio使用手机运行项目时,总是频繁掉线,连接很不稳定,动不动就消失,基本上无法使用 二、问题出现原因 1、硬件问题:数据线 换条数据线试试,如果可以,那就是数据线的…

如何登录通义灵码,快速开启AI编码之旅?

通义灵码个人版开发者可以使用阿里云账号登录通义灵码 IDE 端插件,本文介绍个人版开发者登录 IDE 端插件的操作指南。 登录通义灵码 步骤 1:准备工作 已成功注册阿里云账号,具体操作可参考:账号注册(PC端)…

通信工程学习:什么是SDN软件定义网络

SDN:软件定义网络 SDN(Software Defined Network),即软件定义网络,是一种新兴的网络架构和技术,它实现了网络控制平面与数据转发平面的分离,并通过软件平台进行集中控制和管理。以下是SDN的详细…

02 BlockChain-- ETH

以太坊与比特币有什么不同? 以太坊立足比特币创新之上,于 2015 年启动,两者之间有一些显著不同。 从宏观的方面: 比特币就仅仅是比特币;以太坊(Ethereum)包括以太币(Ether&#x…

ubuntu中如何查看类型(函数)定义的头文件

问题: 1.该如何查找函数,或者数据类型的头文件? 方法: 1.使用vim搭配ctags 2.使用vscode 使用vscode查看头文件位置的步骤: 1.例如下图,我想添加包含file_operations的头文件 2.双击选中数据类型&#xf…

network request to https://registry.npmjs.org/xxx failed, reason: connect ETIM

目录: 1、问题描述2、解决方案3、npm镜像仓库替换 1、问题描述 npm install 时,报错:npm ERR! network request to https://registry.npmjs.org/postcss-pxtorem failed, reason: connect ETIMEDOU npm ERR! code ETIMEDOUT npm ERR! errno…

DSP学习00-F28379D学习准备(了解一个工程的构成)

叠甲 我也算初学F28379D,不对之处请大家斧正。不同型号的DSP在外设配置的函数上有一些区别,但是掌握一种对其他型号的来说则难度不大。对于我们而言学习DSP最终还是要用于算法验证,而DSP资源的最大化利用、代码效率提升等则是后话。 软件准…

【ASE】第一课_双面着色器

今天我们一起来学习ASE插件,希望各位点个关注,一起跟随我的步伐 今天我们来学习双面着色器,对颜色和贴图进行差值,双面显示不同的效果 最终效果: 思路: 1.先确定前后面的贴图和颜色 贴图(Alb…

华为高级交换技术笔记 2024-2025

2024-2025 一、9/31.通信模型和封装2.以太网3.MAC地址4.以太网帧5.MAC地址表的建立 二、9/61.交换机的数据的处理2.以太网帧的分类3.广播域4.vlan技术开发背景 一、9/3 1.通信模型和封装 2.以太网 3.MAC地址 4.以太网帧 5.MAC地址表的建立 二、9/6 1.交换机的数据的处理 2.以…

[SAP ABAP] 数据字典外键关联

SE11创建自定义数据库表 学校表(ZDBT_SCH_437) 表有3个组成字段: ① MANDT (参考数据元素为MANDT,主键) ② SCHID 学校ID (参考新建数据元素ZDE_SCHID_437,主键,NUMC4) ③ SCHNAME 学校名称 (CHAR20) 学生表(ZDBT_STU_437) 表有7个…

codeforces round974 div3 分层图 树形dp

A Robin Helps 问题&#xff1a; 思路&#xff1a;模拟 代码&#xff1a; #include <bits/stdc.h> using namespace std;const int N 2e5 10;void solve() {int n, k;cin >> n >> k;vector<int> a(n 1);for(int i 1; i < n; i ) cin >&…

着色器(Vertex Shader)基础

什么是顶点着色器 顶点着色器处理顶点并告知它们在“剪辑空间”中的坐标,该空间使计算机可以轻松了解哪些顶点对摄像机可见,哪些顶点不可见,必须剪切或“剪切”掉。 这使得 GPU 在后期阶段的速度更快,因为它们需要处理的数据较少。 它们通过接收来自顶点列表中的单个顶…