Group By、Having用法总结(常见踩雷点总结—SQL)

Group By、Having用法总结

目录

  • Group By、Having用法总结
  • 一、 GROUP BY 用法
  • 二、 HAVING 用法
  • 三、 `GROUP BY` 和 `HAVING` 的常见踩雷点
    • 3.1 `GROUP BY` 选择的列必须出现在 `SELECT` 中(🤣最重要的一点)
    • 3.2 `HAVING` 与 `WHERE` 的区别
    • 3.3 `GROUP BY` 可以有多个列
    • 3.4 `GROUP BY` 和 `ORDER BY` 的关系
    • 3.5 聚合函数的计算顺序
    • 3.6 `HAVING` 中的聚合函数和常量比较
    • 3.7 避免在 `HAVING` 中做不必要的计算
    • 各位看客老爷 万福金安🤣一键三连呀🤣🤣🤣

在这里插入图片描述

一、 GROUP BY 用法

GROUP BY 子句用来根据一个或多个列将结果集进行分组,常与聚合函数(如 COUNT(), SUM(), AVG(), MAX(), MIN())一起使用。

SELECT column1, column2, aggregate_function(column3)
FROM table
GROUP BY column1, column2;
SELECT department, AVG(salary)
FROM employees
GROUP BY department;
-- 根据 `department` 列对 `employees` 表进行分组,然后计算每个部门的平均工资。

二、 HAVING 用法

  • HAVING 子句用于过滤 GROUP BY 生成的分组数据。
  • 它与 WHERE 子句的不同之处在于,WHERE 在分组前过滤行,HAVING 是在分组后对结果进行过滤。
SELECT column1, aggregate_function(column2)
FROM table
GROUP BY column1
HAVING aggregate_function(column2) condition;
SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;
-- 返回平均工资大于 50000 的部门。

三、 GROUP BYHAVING 的常见踩雷点

3.1 GROUP BY 选择的列必须出现在 SELECT 中(🤣最重要的一点)

  • 使用 GROUP BY 时,SELECT 中的非聚合列必须出现在 GROUP BY 子句中,或者是聚合函数的一部分。

  • 不能在 GROUP BY 后直接选择没有参与分组或没有应用聚合函数的字段,否则 SQL 会报错。

  • 错误示例:

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

    name 列没有出现在 GROUP BY 中,也没有被聚合,会引发错误。

  • SQL 不知道如何处理 name,因为它没有被分组(GROUP BY 只会根据 department 分组),也没有被聚合(没有 MAX(name) 或 MIN(name))。

  • 可以去掉 name 字段,或者使用聚合函数对它进行处理。

    SELECT department, MIN(name), AVG(salary)
    FROM employees
    GROUP BY department;
    

Tips:

  • 分组后,SQL 已经将多个行数据合并为一个分组(代表一组相关的记录)

  • 这个合并的过程中,SQL 无法直接决定非分组字段应该取什么值,因为每个字段的值在一个分组中可能是不同的。Eg.如果一个部门有多个员工,你无法直接从中选择一个特定的员工姓名,因为在一个分组中,有多个员工姓名。

  • That’s why,SQL 只允许你选择分组字段或通过聚合函数“汇总”一个分组中的多个行。

来两个正确用法巩固一下脑子哈哈:
(不能在 GROUP BY 后的 SELECT 中选择没有聚合的字段,或者没有在 GROUP BY 中出现的字段!!!)

SELECT department, job_title, AVG(salary)
FROM employees
GROUP BY department, job_title;
SELECT department, job_title, MAX(employee_name), AVG(salary)
FROM employees
GROUP BY department, job_title;

3.2 HAVINGWHERE 的区别

  • WHERE 用于过滤行数据,而 HAVING 用于过滤分组数据。
  • 不能在 HAVING 中使用列名,而必须使用聚合函数或已经被分组的列。
  • 错误示例:
    SELECT department, COUNT(*)
    FROM employees
    GROUP BY department
    HAVING department = 'HR';  -- 错误,因为 department 在 HAVING 中不应该用
    

3.3 GROUP BY 可以有多个列

  • 可以在 GROUP BY 中使用多个列,创建更细致的分组。

按照 departmentjob_title 进行多列分组:

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

3.4 GROUP BYORDER BY 的关系

  • GROUP BY 用于分组数据,而 ORDER BY 用于排序数据。它们的顺序不一样。
  • 可以在 GROUP BY 后面使用 ORDER BY 来对结果进行排序。

按平均工资降序排序。:

SELECT department, AVG(salary)
FROM employees
GROUP BY department
ORDER BY AVG(salary) DESC;
-- 按平均工资降序排序。

3.5 聚合函数的计算顺序

  • GROUP BY 会先分组,然后应用聚合函数。如果需要在聚合函数的结果上进一步过滤数据,应该使用 HAVING 而不是 WHERE

    SELECT department, SUM(salary)
    FROM employees
    WHERE hire_date > '2020-01-01'   -- WHERE 在聚合之前
    GROUP BY department;
    

3.6 HAVING 中的聚合函数和常量比较

  • HAVING 子句中,通常会看到聚合函数与某个常量进行比较。这样做没有问题,但必须要确保聚合函数的语法正确。

    SELECT department, COUNT(*)
    FROM employees
    GROUP BY department
    HAVING COUNT(*) > 10;  -- 这个是正确的
    

3.7 避免在 HAVING 中做不必要的计算

  • 不要在 HAVING 中做不必要的计算,可能会导致性能下降。如果能在 WHERE 中提前过滤,就避免使用 HAVING

    SELECT department, SUM(salary)
    FROM employees
    WHERE salary > 50000    -- 提前过滤
    GROUP BY department;
    

各位看客老爷 万福金安🤣一键三连呀🤣🤣🤣

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

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

相关文章

MySQL存储目录与配置文件(ubunto下)

mysql的配置文件: 在这个目录下,直接cd /etc/mysql/mysql.conf.d mysql的储存目录: /var/lib/mysql Ubuntu版本号:

深度学习经典模型之Network in Network

1 Network in Network 1.1 模型介绍 ​ Network In Network (NIN)是由 M i n L i n Min Lin MinLin等人提出,在CIFAR-10和CIFAR-100分类任务中达到当时的最好水平,因其网络结构是由三个多层感知机堆叠而被成为NIN [ 5 ] ^{[5]} [5]。NIN以一种全新的角…

Java版ERP管理系统源码解析:利用Spring Cloud Alibaba和Spring Boot实现微服务架构

ERP系统,亦称为企业资源计划系统,是一种融合了企业多元部门和复杂业务的综合管理信息系统。在全球经济蓬勃发展及企业竞争日趋激烈的背景下,ERP系统已逐步跃升为现代企业管理的核心工具。该系统通过优化资源配置及提升业务流程效率&#xff0…

Python 基础笔记之生成器generator

生成斐波拉契数列 def fib(length):a,b0,1n0while n<length:yield aa,bb,abn1return abc g2fib(10) try:print(next(g2)) 生成器方法&#xff1a; __next__():获取下一个元素 send(value):向每次生成器调用中传值 注意&#xff1a;第一次调用send(None) def gen():i0while…

vscode翻译插件

vscode翻译插件 需求 &#xff1a; 在编写代码的时候&#xff0c; 打印或者定义变量的时候总是想不起来英文名称&#xff0c; 所有就开发了一款中文转换为英文的插件。 功能 1、目前支持选中中文&#xff0c;右键选择打印或者变量进行转换。 2、目前支持选中中文&#xff0…

美格智能5G车规级通信模组:高精度定位守护极致安全

物联网时代&#xff0c;众多应用和设备都需要位置相关服务&#xff0c;尤其是对移动场景而言&#xff0c;定位的需求更加重要。随着自动驾驶、高阶辅助驾驶等智能车载技术的高速发展&#xff0c;在智能车载领域的定位需求除基础的位置信息之外&#xff0c;还对信息获取的速度、…

SpringMVC学习记录(三)之响应数据

SpringMVC学习记录&#xff08;三&#xff09;之响应数据 一、页面跳转控制1、快速返回模板视图2、转发和重定向 二、返回JSON数据1、前置准备2、ResponseBody 三、返回静态资源1、静态资源概念2、访问静态资源 /*** TODO: 一个controller的方法是控制层的一个处理器,我们称为h…

药品进销存表格制作 佳易王药店药品入库出库台账库存管理系统操作教程

一、概述 【软件试用版资源文件下载可以点文章最后官网卡片】 药品进销存表格制作 药店药品入库出库台账库存管理系统操作教程 ‌核心功能全面‌&#xff1a;涵盖药品进货、销售、库存管理&#xff0c;以及数据分析与报表生成。 ‌药品进货管理‌&#xff1a;记录供应商信息和…

网页版五子棋——用户模块(服务器开发)

前一篇文章&#xff1a;网页版五子棋—— WebSocket 协议-CSDN博客 目录 前言 一、编写数据库代码 1.数据库设计 2.配置 MyBatis 3.创建实体类 4.创建 UserMapper 二、前后端交互接口 1.登录接口 2.注册接口 3.获取用户信息 三、服务器开发 1.代码编写 2.测试后端…

A day a tweet(seventeen)——Visualize Convolution Neural Network!

a.形象化地CNNs visually explained! . .CNN(Convolution Neural Network) 卷积神经网络 a.不可思议的,难以置信的 v.使形象化CNN explainer is an incredible interactive tool to visualize the internal workings of a CNN. n.解释器;讲解员 …

将vscode的终端改为cygwin terminal

现在终端是默认的power shell&#xff0c;没有显示cygwin 接下来选择默认配置文件 找到cygwin的选项即可 然后提示可能不安全什么的&#xff0c;点是&#xff0c;就有了

大语言模型训练的全过程:预训练、微调、RLHF

一、 大语言模型的训练过程 预训练阶段&#xff1a;PT&#xff08;Pre training&#xff09;。使用公开数据经过预训练得到预训练模型&#xff0c;预训练模型具备语言的初步理解&#xff1b;训练周期比较长&#xff1b;微调阶段1&#xff1a;SFT&#xff08;指令微调/有监督微调…

《AI在企业战略中的关键地位:以微软和阿里为例》

内容概要 在当今商业环境中&#xff0c;人工智能&#xff08;AI&#xff09;的影响力如滔滔洪水&#xff0c;愈演愈烈。文章将揭示AI在企业战略中的崛起&#xff0c;尤其以微软和阿里巴巴为代表的企业&#xff0c;这两家科技巨头通过不同方式&#xff0c;将智能技术融入其核心…

aspose如何获取PPT放映页“切换”的“持续时间”值

文章目录 项目场景问题描述问题1&#xff1a;从官方文档和资料查阅发现并没有对切换的持续时间进行处理的方法问题2&#xff1a;aspose的依赖包中&#xff0c;所有的关键对象都进行了混淆处理 解决方案1、找到ppt切换的持续时间对应的混淆对象中的字段2、获取ppt切换的持续时间…

Linux挖矿病毒(kswapd0进程使cpu爆满)

一、摘要 事情起因:有台测试服务器很久没用了&#xff0c;突然监控到CPU飙到了95以上&#xff0c;并且阿里云服务器厂商还发送了通知消息&#xff0c;【阿里云】尊敬的xxh: 经检测您的阿里云服务&#xff08;ECS实例&#xff09;i-xxx存在挖矿活动。因此很明确服务器中挖矿病毒…

线性代数:Matrix2x2和Matrix3x3

今天整理自己的框架代码&#xff0c;将Matrix2x2和Matrix3x3给扩展了一下&#xff0c;发现网上unity数学计算相关挺少的&#xff0c;所以记录一下。 首先扩展Matrix2x2&#xff1a; using System.Collections; using System.Collections.Generic; using Unity.Mathemati…

CLIP论文CLIP 改进工作串讲

文章目录 CLIPViLTCLIP 改进工作串讲Lseg&#xff08;Language -driven semantic segmentation)Group ViT&#xff08;Semantic Segmentation Emerges from Text Supervision&#xff09;ViLDGLIP_V1/V2&#xff08;Ground Language-Image Pre-train&#xff09;CLIP PassoCLIP…

C++builder中的人工智能(9)如何在C++中创建AI二进制/Heaviside步进函数

什么是二进制步进函数&#xff1f;我们应该使用二进制步进函数还是Heaviside步进函数&#xff1f;二进制步进函数和Heaviside步进函数是同一回事吗&#xff1f;什么是单位步进函数&#xff1f;通过学习如何在C中创建AI二进制/Heaviside步进函数&#xff0c;它将帮助你使用C IDE…

数据结构-数组(稀疏矩阵转置)和广义表

目录 1、数组定义 1&#xff09;数组存储地址计算示例①行优先②列优先 2&#xff09;稀疏矩阵的转置三元组顺序表结构定义 ①普通矩阵转置②三元组顺序表转置稀疏矩阵③稀疏矩阵的快速转置 3&#xff09;十字链表结构定义 2、广义表定义 1&#xff09;基本操作①GetHead②GetT…

云集电商:如何通过 OceanBase 实现降本 87.5%|OceanBase案例

云集电商&#xff0c;一家聚焦于社交电商的电商公司&#xff0c;专注于‘精选’理念&#xff0c;致力于为会员提供超高性价比的全品类精选商品&#xff0c;以“批发价”让亿万消费者买到质量可靠的商品。面对近年来外部环境的变化&#xff0c;公司对成本控制提出了更高要求&…