SQL 干货 | 使用 Having 子句筛选聚合字段

news2024/10/11 6:34:15

如果你编写 SQL 查询已有一段时间,那么你可能对 WHERE 子句非常熟悉。虽然它对聚合字段没有影响,但有一种方法可以根据聚合值过滤记录,那就是使用 HAVING 子句。本博客将介绍它的工作原理,并提供几个在 SELECT 查询中使用它的示例。

聚合和 Having 子句

聚合通常与分组结合使用。在 SQL 中,可以使用 GROUP BY 子句来实现。通过聚合和分组,我们可以深入了解数据。例如,一家电子商务公司可能希望跟踪特定时间段内的销售情况。

在很多情况下,我们可能不想在整个数据集上应用 GROUP BY 子句。在这种情况下,我们可以使用 GROUP BY 命令和有条件的 HAVING 子句来筛掉不需要的结果。与 WHERE 子句类似,HAVING 指定了一个或多个筛选条件,但针对的是一个组或一个聚合。因此,HAVING 总是放在 WHERE 和 GROUP BY 子句之后,而在(可选的)ORDER BY 子句之前:

SELECT column_list
FROM table_name
WHERE where_conditions
GROUP BY column_list
HAVING having_conditions
ORDER BY order_expression

一些实例

为了更好地了解 HAVING 如何工作,让我们通过 Sakila 示例数据库 运行几个 SELECT 查询。

我们的第一个查询列出了租片次数最多的人,按降序排序,这样租片次数最多的人就排在最前面。我们将使用 HAVING 子句删除租片次数少于 3 次的客户,以在一定程度上缩短列表:

SELECT
  c.customer_id,
  c.first_name,
  c.last_name,
  COUNT(r.rental_id) AS total_rentals
FROM 
  customer AS c
    LEFT JOIN rental AS r ON c.customer_id = r.customer_id
GROUP BY c.customer_id
HAVING total_rentals >= 3
ORDER BY total_rentals DESC;

下面是 Navicat Premium 中的查询及其结果的第一页:

top movie renters (89K)

从这些租金数字来看,我们还可以再进一步缩小列表长度!

通过 WHERE 和 HAVING 筛选行

正如 GROUP BY 和 ORDER BY 应用于查询过程的不同阶段一样,WHERE 和 HAVING 也是如此。因此,我们可以在分组和聚合之前和之后加入这两个子句来筛选结果。例如,我们可以添加一个 WHERE 子句,将结果限制在给定年份的上半年:

SELECT
  c.customer_id,
  c.first_name,
  c.last_name,
  COUNT(r.rental_id) AS total_rentals
FROM 
  customer AS c
    LEFT JOIN rental AS r ON c.customer_id = r.customer_id
WHERE r.rental_date BETWEEN '2005-01-01' AND '2005-06-30'
GROUP BY c.customer_id
HAVING total_rentals >= 3
ORDER BY total_rentals DESC;

下面是在 Navicat Premium 中运行的上述查询及其结果的第一页:

top movie renters for first half of 2005 (96K)

组合多个条件

正如 WHERE 子句使用 AND 和 OR 关键字支持多个条件一样,HAVING 子句也是如此。例如,我们可以将 HAVING 子句修改为类似下面的内容,从而找到租金数字在给定范围内的客户:

HAVING total_rentals >= 3 AND total_rentals <= 10

结语

在今天的博客中,我们学习了如何使用 HAVING 子句筛选分组和聚合字段。

对 Navicat Premium 感兴趣吗?你可以完全免费试用 14 天进行评估!

Navicat 17 最新资讯 & 技术干货

- Navicat 17 体验官火热招募中

- Navicat- 17 新特性 | 用户界面再升级

- Navicat 17 新特性 | 模型设计创新与优化

- Navicat 17 新特性 | 查询与配置

- Navicat 17 新特性 | Navicat BI 功能革新升级

- Navicat 17 新特性 | 原生支持国产 Linux ARM 平台以及银河麒麟与统信操作系统

- 聚焦 Navicat 17 新特性 | 数据字典提升数据结构清晰度

- Navicat 17 新增 PolarDB 与 Garnet 数据库

- Navicat 17 新特性 | 聚焦 MongoDB

- Navicat 17 新特性 | 新增 Redis 哨兵部署模式

- 免费版 Navicat Premium Lite

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

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

相关文章

计次卡魔都千丝冥缘应用———未来之窗行业应用跨平台架构

一、魔都千丝冥缘作用 在本次卡购买种&#xff0c;涉及卡包表单、次卡表单&#xff0c;商品表单&#xff0c;提成表单&#xff0c;支付方式表单&#xff0c;职员表单 并且在商品表和次卡表单字段一样&#xff0c;元素name名称一样。 未来之窗魔都千丝冥缘&#xff0c;将功能…

字节跳动青训营开始报名了!

关于青训营&#xff1a; 青训营是字节跳动技术团队发起的技术系列培训 &人才选拔项目;面向高校在校生&#xff0c;旨在培养优秀且具有职业竞争力的开发工程师。 本次技术训练营由掘金联合豆包MarsCode 团队主办课程包含前端、后端和 A 方向&#xff0c;在这个飞速发…

高频股票期货ETF历史高频数据源

【数据源】 银河金融数据库&#xff08;yinhedata.com&#xff09; 提供金融数据股票、美股、期货以及ETF等高频tick数据&#xff0c;分钟级别数据。 MACD背离是指MACD指标与价格走势之间发生的方向性差异&#xff0c;这通常被视为市场可能发生趋势反转的信号。以下是一个具体…

GS-SLAM论文阅读笔记-CG-SLAM

前言 这是一篇不是最新的工作&#xff0c;我之前没有阅读&#xff0c;但是我前几天阅读GLC-SLAM的时候&#xff0c;发现它的一部分内容参考了CG-SLAM&#xff0c;并且CG-SLAM最近被ECCV2024接收&#xff0c;说明这是一片值得参考的好文章&#xff0c;接下来就阅读一下吧&#…

数据库——表格之间的关系(表格之间的连接和处理)

数据库表格之间经常存在各种关系&#xff1a; 一对一、一对多、多对多 1.一对一 —— 丈夫表&#xff0c;妻子表为例 连接方式一&#xff1a;合并为一张表 这种方式对于一对一来说最优 连接方式二&#xff1a;在其中一张表内加入一个外键&#xff0c;连接另一张表 连…

Windows搭建Java开发环境(Building a Java development environment on Windows)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

开发日志:IIS安全配置

为了解决IIS文件路径泄漏问题&#xff0c;可以采取以下措施&#xff1a; 一. 详细操作 1. CMD关闭NTFS 8.3文件格式的支持 命令行&#xff1a;fsutil 8dot3name set 1 2. 修改注册表禁用短文件名功能 CMD输入regedit回车&#xff0c;在注册表中找到HKEY_LOCAL_MACHINE\SYSTEM\C…

003 Springboot操作RabbitMQ

Springboot整合RabbitMQ 文章目录 Springboot整合RabbitMQ1.pom依赖2.yml配置3.配置队列、交换机方式一&#xff1a;直接通过配置类配置bean方式二&#xff1a;消息监听通过注解配置 4.编写消息监听发送测试5.其他类型交换机配置1.FanoutExchange2.TopicExchange3.HeadersExcha…

6. 继承、重写、super、final

文章目录 一、重新定义需求二、继承1. 继续分析2. 概念3. 代码① 父类② 子类③ 测试结果 4. 饿狼传说之多层继承① 概念② 代码 5. 多继承 三、方法的重写1. 情境2. 代码① 吃什么② 怎么叫(Override重写) 3. 小结 四、super1. 啃老2. 啃老啃到底 五、final1. 用途及特征2. 举…

【Python爬虫系列】_025.关于互斥锁(Lock)

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈

Vue使用@别名替换后端ip地址

1. 安装 types/node types/node 包允许您在TypeScript项目中使用Node.js的核心模块和API&#xff0c;并提供了对它们的类型检查和智能提示的支持。 npm install types/node --save-dev 比如安装之后&#xff0c;就可以导入nodejs的 path模块&#xff0c;在下面代码 import path…

【SEO】什么是SEO?

什么是SEO&#xff08;搜索引擎优化&#xff09;&#xff1f;为什么SEO对于⼀个⽹站⾄关重要&#xff1f; SEO 全称是搜索引擎优化&#xff08;Search Engine Optimization&#xff09; 因为我们目前开发的网址&#xff0c;需要人看到&#xff0c;除了通过宣传营销的方式展现…

C++ | Leetcode C++题解之第468题验证IP地址

题目&#xff1a; 题解&#xff1a; class Solution { public:string validIPAddress(string queryIP) {if (queryIP.find(.) ! string::npos) {// IPv4int last -1;for (int i 0; i < 4; i) {int cur (i 3 ? queryIP.size() : queryIP.find(., last 1));if (cur st…

ctf.bugku-eval

题目来源&#xff1a;eval - Bugku CTF 访问页面&#xff0c; 代码解释 <?phpinclude "flag.php"; //包含"flag.php"文件$a $_REQUEST[hello]; //从请求参数hello中获取值并赋给变量$a。 eval( "var_dump($a);"); //…

SQLAlchemy模型定义:映射数据库表到Python类

SQLAlchemy是一个流行的Python SQL工具包和对象关系映射&#xff08;ORM&#xff09;框架&#xff0c;它提供了一个高层的ORM以及底层的SQL表达式语言。使用SQLAlchemy&#xff0c;开发者可以以面向对象的方式来操作数据库&#xff0c;而不必编写复杂的SQL语句。本文将详细介绍…

【spring ai】java 实现RAG检索增强,超快速入门

rag 需求产生的背景介绍&#xff1a; 在使用大模型时&#xff0c;一个常见的问题是模型会产生幻觉&#xff08;即生成的内容与事实不符&#xff09;&#xff0c;同时由于缺乏企业内部数据的支持&#xff0c;导致其回答往往不够精准和具体&#xff0c;偏向于泛泛而谈。这些问题…

如何利用wsl-Ubuntu里conda用来给Windows的PyCharm开发

前提&#xff1a;咱们在wsl-Ubuntu上&#xff0c;有conda的虚拟环境 咱们直接打开PyCharm,打开Settings 更换Python Interpreter即可 当然一开始可能没有下面的选项&#xff0c;需要我们点击右边的Add Interpreter 这里选择wsl 点击next 将这两步进行修改 可以看出来&#xff0…

计算机视觉之OpenCV vs YOLO

好多开发者希望搞明白OpenCV 和YOLO区别&#xff0c;实际上&#xff0c;二者在计算机视觉领域都有广泛应用&#xff0c;但它们有很大的不同。 一、OpenCV 概述 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它…

继承--C++

文章目录 一、继承的概念及定义1、继承的概念 二、继承定义1、定义格式2、继承基类成员访问方式的变化3、继承类模板 三、基类和派生类间的转换1、继承中的作用域2、隐藏规则&#xff1a; 四、派生类的默认成员函数1、4个常见默认成员函数2、实现⼀个不能被继承的类 五、继承与…

(八)Proteus仿真STM32单片机GPIO驱动数码管

1&#xff0c;参考上篇&#xff0c;将LED点阵屏更换成数码管如下图 2&#xff0c;修改驱动函数&#xff0c;数组seg[14]前10个是0-9数字的编码&#xff0c;后四个是空格&#xff0c;点&#xff0c;横线&#xff0c;下划线 char seg_decode(char num)//数字解码 {const char se…