Mysql中where与having的区别实例详解

 更新时间:2023年01月09日 15:19:45   作者:菜鸟教程*…*  
当SQL语句中使用聚合函数,然后又需要对聚合函数的记录集进行筛选过滤时,这个时候就需要用到Having子句,下面这篇文章主要给大家介绍了关于Mysql中where与having区别的相关资料,需要的朋友可以参考下

以一道题来做引子

牛客,SQL30 计算总和

OrderItems表代表订单信息,包括字段:订单号order_num和item_price商品售出价格、quantity商品数量。

order_num

item_price

quantity

a1

10

105

a2

1

1100

a3

1

200

a4

2

1121

a5

5

10

a6

1

19

a7

7

5

【问题】编写 SQL 语句,根据订单号聚合,返回订单总价不小于1000 的所有订单号,最后的结果按订单号进行升序排序。

提示:总价 = item_price 乘以 quantity

order_num

total_price

a1

1050

a2

1319

a4

2242

先来看一看错误的写法:

select order_num, sum(item_price*quantity) total_price
from OrderItems
group by order_num
where total_price >= 1000
order by order_num

错误:SQL_ERROR_INFO: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where total_price >= 1000\norder by order_num' at line 4"

上述的错误为:非法使用聚合函数,不能在 WHERE 子句中使用聚合函数

我们的 total_price等价于sum(item_price*quantity),而在WHERE 子句中使用聚合函数

改错

select order_num, sum(item_price*quantity) total_price
from OrderItems
group by order_num
having total_price >= 1000
order by order_num

这样就对了

使用having时注意:

1. 行已经被分组。

2. 使用了聚合函数。

3. 满足HAVING 子句中条件的分组将被显示。

4. HAVING 不能单独使用,必须要跟 GROUP BY 一起使用。

那么和where的区别有以下几点:

1. WHERE 可以直接使用表中的字段作为筛选条件,但不能使用分组中的计算函数作为筛选条件; HAVING 必须要与 GROUP BY 配合使用,可以把分组计算的函数和分组字段作为筛选条件。

2. 如果需要通过连接从关联表中获取需要的数据,WHERE 是先筛选后连接,而 HAVING 是先连接 后筛选。

3. 第二项导致了WHERE执行效率高,不能使用分组中的计算函数进行筛选,而HAVING 可以使用分组中的计算函数,执行效率较低。

where、聚合函数、having在from后面的执行顺序:

where > 聚合函数 > having

若需要对聚合函数对group by的结果进行过滤,只能使用having。Having语句通常与Group by语句联合使用,用来过滤Group by语句返回的结果集,Having语句的存在弥补了Where关键字不能与聚合函数联合使用的不足。

例如:查询平均成绩大于60分的同学的学号和平均成绩

select s_id, AVG(s_score) s_avg from Score group by s_id Having AVG(s_score) > 60;

也可以写成如下形式:

select s_id, AVG(s_score) s_avg from Score group by s_id Having s_avg > 60;

如果将Having改成where 就会报错,因为where的执行顺序大于聚合函数。

总结

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

相关文章

  • 碰到MySQL无法启动1067错误问题解决方法

    碰到MySQL无法启动1067错误问题解决方法

    创建primay key过程中发生了断电,当电脑再次启动时候,发现mysql 服务无法启动,使用 net start 提示 1067错误;后来只能通过手工删除数据文件,日志文件,再启动服务,然后导入数据来完成
    2013-01-01
  • MySQL数据库开发的36条原则(小结)

    MySQL数据库开发的36条原则(小结)

    这篇文章主要介绍了MySQL数据库开发的36条原则(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • MySQL下常见的启动失败与备份失败问题的解决教程

    MySQL下常见的启动失败与备份失败问题的解决教程

    这篇文章主要介绍了MySQL下常见的启动失败与备份失败问题的解决教程,示例环境基于Linux系统,需要的朋友可以参考下
    2015-11-11
  • mysql 5.7.20 win64 安装及配置方法

    mysql 5.7.20 win64 安装及配置方法

    这篇文章主要介绍了mysql 5.7.20 win64 安装及配置方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-11-11
  • 利用Prometheus与Grafana对Mysql服务器的性能监控详解

    利用Prometheus与Grafana对Mysql服务器的性能监控详解

    Prometheus是源于 Google Borgmon的一个开源监控系统,用 Golang开发。被很多人称为下一代监控系统。Grafana是一个开源的图表可视化系统,简单说图表配置比较方便、生成的图表比较漂亮。下面就介绍了利用Prometheus与Grafana对Mysql服务器性能监控的方法。
    2017-03-03
  • MySQL常用存储引擎功能与用法详解

    MySQL常用存储引擎功能与用法详解

    这篇文章主要介绍了MySQL常用存储引擎功能与用法,较为详细的分析了mysql存储引擎的分类、功能、使用方法及相关操作注意事项,需要的朋友可以参考下
    2018-04-04
  • mysql 导入导出数据库、数据表的方法

    mysql 导入导出数据库、数据表的方法

    这篇文章主要介绍了mysql 导入导出数据库、数据表的方法,有需要的朋友可以参考一下
    2013-11-11
  • mysql 复制过滤重复如何解决

    mysql 复制过滤重复如何解决

    在进行mysql复制过程中,会出现数据重复的现象,怎样利用mysql 过滤重复的数据呢?本文将提供详细的解决方法,需要了解的朋友可以参考下
    2012-11-11
  • Windows平台下MySQL常用操作与命令

    Windows平台下MySQL常用操作与命令

    Windows平台下MySQL常用操作与命令,学习mysql的朋友可以参考下。
    2011-09-09
  • 基于C++实现Mysql数据库连接池实例

    基于C++实现Mysql数据库连接池实例

    数据库连接池负责分配、管理、和释放数据库连接,允许使用应用程序重复使用一个现有的数据库连接。数据库连接是关键有限且昂贵的资源,一个数据库连接对象均对应一个物理数据库的连接,每次操作都打开一个物理连接,使用完都关闭连接
    2022-12-12

最新评论