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

 更新时间:2023年06月28日 08:31:51   作者:Student_Li  
这篇文章主要给大家详细介绍了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 子句的示例:

sqlCopy code
SELECT customer_id, SUM(total_price) AS total
FROM orders
GROUP BY customer_id
HAVING total > 100;

使用 HAVING 子句的示例:

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 不仅可以使用比较操作符和逻辑操作符,还可以使用聚合函数。

到此这篇关于MySQL中having和where的区别及应用详解的文章就介绍到这了,更多相关MySQL having和where内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL备份脚本的写法

    MySQL备份脚本的写法

    这篇文章主要介绍了MySQL备份脚本的写法,帮助大家更好的理解和学习MySQL,感兴趣的朋友可以了解下
    2020-08-08
  • 将MySQL去重操作优化到极致的操作方法

    将MySQL去重操作优化到极致的操作方法

    这篇文章主要介绍了如何将MySQL去重操作优化到极致,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • mysql数据库优化必会的几个参数中文解释

    mysql数据库优化必会的几个参数中文解释

    对于自己配置mysql数据库的朋友,需要注意的几点,下面都是英文的解释,比较易懂方便和我一样需要优化配置mysql的朋友
    2008-09-09
  • MySQL触发器trigger的使用

    MySQL触发器trigger的使用

    这篇文章主要介绍了MySQL触发器trigger的使用,触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合,需要的朋友可以参考下面文章的具体内容
    2021-09-09
  • MySQL之锁类型解读

    MySQL之锁类型解读

    MySQL锁类型包括读锁(共享锁)和写锁(排他锁),并介绍了意向锁、自增锁、元数据锁、行级锁和间隙锁等概念,悲观锁和乐观锁是两种不同的锁设计思想,悲观锁在每次操作前加锁,适用于并发冲突多的场景;乐观锁在更新时判断数据是否被修改
    2025-02-02
  • MySQL中的行级锁、表级锁、页级锁

    MySQL中的行级锁、表级锁、页级锁

    这篇文章主要介绍了MySQL中的行级锁、表级锁、页级锁,以及分享了多种避免死锁的方法,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • MySQL之高可用集群部署及故障切换实现

    MySQL之高可用集群部署及故障切换实现

    这篇文章主要介绍了MySQL之高可用集群部署及故障切换实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

    MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

    在数据库设计中,有时我们会将 JSON 数据存储在 VARCHAR 或 TEXT 类型字段中,本文将详细介绍如何在 MySQL 中有效查询存储为 VARCHAR 类型的 JSON 数据,感兴趣的朋友一起看看吧
    2025-04-04
  • MySQL中使用CTE获取时间段数据的技巧分享

    MySQL中使用CTE获取时间段数据的技巧分享

    在数据库操作中,获取特定时间段的数据是一项常见任务,MySQL自从8.0版本开始支持CTE(公共表表达式),使得我们可以更加灵活和高效地处理时间段数据,本文小编介绍了MySQL中使用CTE获取时间段数据的技巧分享,需要的朋友可以参考下
    2024-08-08
  • MySQL8设置自动创建时间和自动更新时间的实现方法

    MySQL8设置自动创建时间和自动更新时间的实现方法

    在实际应用中,我们时常会需要用到创建时间和更新时间这两个字段,下面这篇文章主要给大家介绍了关于MySQL8设置自动创建时间和自动更新时间的实现方法,需要的朋友可以参考下
    2023-03-03

最新评论