Mysql中having与where的区别小结

 更新时间:2025年03月04日 10:30:35   作者:李若盛开  
本文主要介绍了MySQL中WHERE和HAVING子句的区别,包括它们的执行顺序、效率、适用条件和在多表关联查询中的应用,具有一定的参考价值,感兴趣的可以了解一下

一. 简介

where

对查询数据进行过滤

having

用于对已分组的数据进行过滤【having和group by 必须配合使用(有having必须出现group by)】

二. 用法

where

select * from table where sum(字段)>100

having

select * from table group by 字段 having 字段>10

三.区别

1. 被执行的数据来源不同

where是数据从磁盘读入内存的时候进行判断,【数据分组前进行过滤】

而having是磁盘读入内存后再判断。【对分组之后的数据再进行过滤】

所以:使用where比用having效率要高很多。

2. 执行顺序不一样

Where>Group By>Having

MySQL解释sql语言时的执行顺序:

SELECT
DISTINCT <select_list>
FROM <left_table>
<join_type> JOIN <right_table>
ON <join_condition><strong>
WHERE</strong> <where_condition>
GROUP BY <group_by_list><strong>
HAVING</strong> <having_condition>
ORDER BY <order_by_condition>
LIMIT <limit_number>

3. where不可以使用字段的别名,但是having可以

select name as aa from student where aa > 100 (错误)
select name as aa from student group name having  aa > 100 (正确)

4. having能够使用聚合函数当做条件,但是where不能使用,where只能使用存在的列当做条件

select  *  as aa from student where count(*) > 1 (错误)
select *  from student group name having  count(name) > 1 (正确)

注意:能用where就用where

5. 多表关联查询时,where先筛选再联接,having先联接再筛选

找出所有在'IT'部门且薪水高于10000的员工:(在联接之前先进行了筛选)

SELECT e.employee_name, d.department_name  
FROM employees e  
JOIN departments d ON e.department_id = d.department_id  
WHERE e.salary > 10000 AND d.department_name = 'IT';

找出每个客户下订单的总金额超过1000的客户及其订单总金额:(先联表,基于分组后的聚合结果来过滤)

SELECT c.customer_name, SUM(o.order_amount) AS total_amount  
FROM customers c  
JOIN orders o ON c.customer_id = o.customer_id  
GROUP BY c.customer_name  
HAVING SUM(o.order_amount) > 1000;

总结

  • where子句在数据被联接和分组之前应用,用于过滤行
  • having子句在数据被联接、分组和聚合之后应用,用于过滤分组

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

相关文章

  • Linux环境下设置MySQL表名忽略大小写的方法小结

    Linux环境下设置MySQL表名忽略大小写的方法小结

    在MySQL中,表名的大小写敏感性取决于操作系统和MySQL的配置,在Unix/Linux系统上,表名通常是区分大小写的,由于之前MySQL未设置忽略表名大小写导致数据查询失败等问题,所以本文给大家介绍了Linux环境下设置MySQL表名忽略大小写的方法,需要的朋友可以参考下
    2024-06-06
  • Mysql学习笔记之存储过程与存储函数示例详解

    Mysql学习笔记之存储过程与存储函数示例详解

    MySQL存储过程是一种在MySQL数据库中存储的预编译SQL代码块,它可以接受参数并执行一系列SQL操作,这篇文章主要介绍了Mysql学习笔记之存储过程与存储函数的相关资料,需要的朋友可以参考下
    2025-08-08
  • 浅析mysql 语句的调度优先级及改变

    浅析mysql 语句的调度优先级及改变

    本篇文章是对mysql语句的调度优先级及改变进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • mysql 5.7.15版本安装配置方法图文教程

    mysql 5.7.15版本安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 5.7.15安装配置方法图文教程,更改数据库data的存储路径,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • MySQL复合查询和表的内外连接示例详解

    MySQL复合查询和表的内外连接示例详解

    在数据库管理和数据分析中,单表查询往往无法满足复杂的数据查询需求,因此多表查询和子查询成为了解决问题的关键技术,MySQL支持多种多表查询方式,如内连接、外连接(左外连接和右外连接)以及自连接,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • MySQL怎么实现原子性的流程详解(以UPDATE为例)

    MySQL怎么实现原子性的流程详解(以UPDATE为例)

    原子性是事务的其中一个特性,指的是要么全部执行完,要么全都不执行,这篇文章主要介绍了MySQL怎么实现原子性(以UPDATE为例)的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-08-08
  • Mysql动态更新数据库脚本的示例讲解

    Mysql动态更新数据库脚本的示例讲解

    今天小编就为大家分享一篇关于Mysql动态更新数据库脚本的示例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • mysql查看连接数和设置会话超时问题

    mysql查看连接数和设置会话超时问题

    这篇文章主要介绍了mysql查看连接数和设置会话超时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • MySQL常用命令速查之新手必备的20个高频操作

    MySQL常用命令速查之新手必备的20个高频操作

    MySQL命令是用于与MySQL数据库进行交互和操作的命令,这篇文章主要介绍了MySQL常用命令速查之新手必备的20个高频操作,文中通过代码就介绍的非常详细,需要的朋友可以参考下
    2025-12-12
  • kali虚拟机mysql修改绑定ip的问题

    kali虚拟机mysql修改绑定ip的问题

    这篇文章主要介绍了kali虚拟机mysql修改绑定ip,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06

最新评论