MySQL中having和where的区别及应用详解

这篇文章主要给大家详细介绍了MySQL中having和where的区别以及他们的使用方法,文中有相关的代码示例,具有一定的参考价值,需要的朋友可以参考下

目录

having 和 where 区别

  • having是对一个表的数据进行分组之后,对组信息进行相应条件筛选
  • having筛选时,只能根据select子句中可出现的字段(数据)来进行条件设定
  • having子句与where子句一样,都是用于条件判断
  • where是判断数据从磁盘读入内存的时候
  • having是判断分组统计之前的所有条件
  • having子句中可以使用字段别名,而where不能使用
  • having能够使用统计函数,而where不能使用

having 和 where 应用

在 MySQL 中,HAVINGWHERE 是用于筛选数据的两个关键字,它们有以下区别和用法:

用途:

  • WHEREWHERE 子句用于在执行查询之前筛选行。它可用于过滤 SELECTUPDATEDELETE 语句中的行,根据指定的条件选择要操作的数据行。
  • HAVINGHAVING 子句用于在执行聚合查询后筛选结果集。它仅能在包含聚合函数(如 SUMCOUNTAVG 等)的 SELECT 语句中使用,并在查询结果进行聚合操作后,对聚合结果进行筛选。

位置:

  • WHEREWHERE 子句通常出现在 SELECTUPDATEDELETE 语句的 FROM 子句之后、GROUP BY 子句之前。
  • HAVINGHAVING 子句通常出现在 GROUP BY 子句之后、ORDER BY 子句之前。

过滤条件:

  • WHEREWHERE 子句用于指定过滤条件,其中可以使用比较操作符(如 =, <>, <, >, BETWEEN, IN 等)和逻辑操作符(如 AND, OR, NOT)。
  • HAVINGHAVING 子句用于指定对聚合结果的过滤条件,其中可以使用比较操作符和逻辑操作符,也可以使用聚合函数。

示例: 假设有一个名为 orders 的表,其中包含 customer_id(客户ID)和 total_price(总价格)字段。我们希望查找每个客户的总价格大于 100 的订单。

使用 WHERE 子句的示例:

|-----------|---------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 | sqlCopy code SELECT customer_id, ``SUM``(total_price) ``AS total FROM orders GROUP BY customer_id HAVING total > 100; |

使用 HAVING 子句的示例:

|-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 | sqlCopy code SELECT customer_id, ``SUM``(total_price) ``AS total FROM orders GROUP BY customer_id HAVING SUM``(total_price) > 100; |

在上述示例中,WHERE 子句无法直接使用聚合函数,因此我们使用 GROUP BY 子句将结果按客户ID分组,并在 HAVING 子句中筛选出总价格大于 100 的订单。

总结:

  • WHERE 子句用于在执行查询之前筛选行,而 HAVING 子句用于在执行聚合查询后筛选结果集。
  • WHERE 出现在 FROM 子句之后,GROUP BY 子句之前;而 HAVING 出现在 GROUP BY 子句之后、ORDER BY 子句之前。
  • WHERE 可以使用比较操作符和逻辑操作符来指定过滤条件,而 HAVING 不仅可以使用比较操作符和逻辑操作符,还可以使用聚合函数。
相关推荐
新法国菜16 分钟前
MySql知识梳理之DDL语句
数据库·mysql
DarkAthena1 小时前
【GaussDB】全密态等值查询功能测试及全密态技术介绍
数据库·gaussdb
ShawnLeiLei1 小时前
2.3 Flink的核心概念解析
数据库·python·flink
石皮幼鸟2 小时前
数据完整性在所有场景下都很重要吗?
数据库·后端
大只鹅3 小时前
Centos7.9 Docker26容器化部署 MySql9.4 一主一从的同步复制部署
mysql·centos
叁沐3 小时前
MySQL 28 读写分离有哪些坑?
mysql
nightunderblackcat4 小时前
新手向:异步编程入门asyncio最佳实践
前端·数据库·python
DarkAthena4 小时前
【GaussDB】使用MySQL客户端连接到GaussDB的M-Compatibility数据库
数据库·mysql·gaussdb
livemetee4 小时前
Flink2.0学习笔记:使用HikariCP 自定义sink实现数据库连接池化
大数据·数据库·笔记·学习·flink
XXD啊5 小时前
Redis 从入门到实践:Python操作指南与核心概念解析
数据库·redis·python