在本教程中,您将学习如何使用MySQL HAVING子句为行分组或聚合组指定过滤条件。

MySQL HAVING子句简介

在SELECT语句中使用HAVING子句来指定一组行或聚合的过滤条件。

HAVING子句通常与GROUP BY子句一起使用,以根据指定的条件过滤分组。如果省略GROUP BY子句,则HAVING子句的行为与WHERE子句类似。

请注意,HAVING子句将过滤条件应用于每组分行,而WHERE子句将过滤条件应用于每个单独的行。

MySQL HAVING子句示例

让我们举一些使用HAVING子句的例子来看看它是如何工作。 我们将使用示例数据库(yiibaidb)中的orderdetails表进行演示。

mysql> desc orderdetails;

+-----------------+---------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-----------------+---------------+------+-----+---------+-------+

| orderNumber | int(11) | NO | PRI | NULL | |

| productCode | varchar(15) | NO | PRI | NULL | |

| quantityOrdered | int(11) | NO | | NULL | |

| priceEach | decimal(10,2) | NO | | NULL | |

| orderLineNumber | smallint(6) | NO | | NULL | |

+-----------------+---------------+------+-----+---------+-------+

5 rows in set

可以使用GROUP BY子句来获取订单号,查看每个订单销售的商品数量和每个销售总额:

SELECT

ordernumber,

SUM(quantityOrdered) AS itemsCount,

SUM(priceeach*quantityOrdered) AS total

FROM

orderdetails

GROUP BY ordernumber;

执行上面查询语句,得到以下结果(部分) -

+-------------+------------+----------+

| ordernumber | itemsCount | total |

+-------------+------------+----------+

| 10100 | 151 | 10223.83 |

| 10101 | 142 | 10549.01 |

| 10102 | 80 | 5494.78 |

| 10103 | 541 | 50218.95 |

| 10104 | 443 | 40206.20 |

| 10105 | 545 | 53959.21 |

| 10106 | 675 | 52151.81 |

| ------- 这里省略了一大波数据 ---------|

| ........ ........... |

| 10421 | 75 | 7639.10 |

| 10422 | 76 | 5849.44 |

| 10423 | 111 | 8597.73 |

| 10424 | 269 | 29310.30 |

| 10425 | 427 | 41623.44 |

+-------------+------------+----------+

326 rows in set

现在,可以通过使用HAVING子句查询(过滤)哪些订单的总销售额大于55000,如下所示:

SELECT

ordernumber,

SUM(quantityOrdered) AS itemsCount,

SUM(priceeach*quantityOrdered) AS total

FROM

orderdetails

GROUP BY ordernumber

HAVING total > 55000;

执行上面查询语句,得到以下结果 -

+-------------+------------+----------+

| ordernumber | itemsCount | total |

+-------------+------------+----------+

| 10126 | 617 | 57131.92 |

| 10127 | 540 | 58841.35 |

| 10135 | 607 | 55601.84 |

| 10142 | 577 | 56052.56 |

| 10165 | 670 | 67392.85 |

| 10181 | 522 | 55069.55 |

| 10192 | 585 | 55425.77 |

| 10204 | 619 | 58793.53 |

| 10207 | 615 | 59265.14 |

| 10212 | 612 | 59830.55 |

| 10222 | 717 | 56822.65 |

| 10287 | 595 | 61402.00 |

| 10310 | 619 | 61234.67 |

| 10312 | 601 | 55639.66 |

| 10390 | 603 | 55902.50 |

+-------------+------------+----------+

可以使用逻辑运算符(如OR和AND)在HAVING子句中构造复杂过滤条件。 假设您想查找哪些订单的总销售额大于50000,并且包含超过600个项目,则可以使用以下查询:

SELECT

ordernumber,

SUM(quantityOrdered) AS itemsCount,

SUM(priceeach*quantityOrdered) AS total

FROM

orderdetails

GROUP BY ordernumber

HAVING total > 50000 AND itemsCount > 600;

执行上面查询语句,得到以下结果 -

+-------------+------------+----------+

| ordernumber | itemsCount | total |

+-------------+------------+----------+

| 10106 | 675 | 52151.81 |

| 10126 | 617 | 57131.92 |

| 10135 | 607 | 55601.84 |

| 10165 | 670 | 67392.85 |

| 10168 | 642 | 50743.65 |

| 10204 | 619 | 58793.53 |

| 10207 | 615 | 59265.14 |

| 10212 | 612 | 59830.55 |

| 10222 | 717 | 56822.65 |

| 10310 | 619 | 61234.67 |

| 10312 | 601 | 55639.66 |

| 10360 | 620 | 52166.00 |

| 10390 | 603 | 55902.50 |

| 10414 | 609 | 50806.85 |

+-------------+------------+----------+

假设您想查找所有已发货(status='Shiped')的订单和总销售额大于55000的订单,可以使用INNER JOIN子句将orders表与orderdetails表一起使用,并在status列和总金额(total)列上应用条件,如以下查询所示:

SELECT

a.ordernumber, status, SUM(priceeach*quantityOrdered) total

FROM

orderdetails a

INNER JOIN

orders b ON b.ordernumber = a.ordernumber

GROUP BY ordernumber, status

HAVING status = 'Shipped' AND total > 5000;

执行上面查询,得到以下结果 -

+-------------+---------+----------+

| ordernumber | status | total |

+-------------+---------+----------+

| 10126 | Shipped | 57131.92 |

| 10127 | Shipped | 58841.35 |

| 10135 | Shipped | 55601.84 |

| 10142 | Shipped | 56052.56 |

| 10165 | Shipped | 67392.85 |

| 10181 | Shipped | 55069.55 |

| 10192 | Shipped | 55425.77 |

| 10204 | Shipped | 58793.53 |

| 10207 | Shipped | 59265.14 |

| 10212 | Shipped | 59830.55 |

| 10222 | Shipped | 56822.65 |

| 10287 | Shipped | 61402.00 |

| 10310 | Shipped | 61234.67 |

| 10312 | Shipped | 55639.66 |

| 10390 | Shipped | 55902.50 |

+-------------+---------+----------+

HAVING子句仅在使用GROUP BY子句生成高级报告的输出时才有用。 例如,您可以使用HAVING子句来回答统计问题,例如在本月,本季度或今年总销售额超过10000的订单。

在本教程中,您已经学习了如何使用具有GROUP BY子句的MySQL HAVING子句为行分组或聚合分组指定过滤器条件。

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

mysql having in_MySQL having子句相关推荐

  1. mysql分组语句的子句_MySQL 中的排序与分组 语句

    MySQL ORDER BY 排序 我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据,如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设 ...

  2. mysql中select语句子句,了解mysql中select语句操作实例

    Select的语法 SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] ...

  3. mysql having in_MySQL中无GROUPBY直接HAVING的问题

    本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/database/having_w ...

  4. mysql like n_MySQL LIKE 子句

    MySQL LIKE子句 当你进行查询的条件不是唯一,或不是百分之百确定时,那么模糊查询对你来说是一个不错的选择.like是一个用于模糊查询的语句,WHERE 子句中可以使用等号 (=) 来设定获取数 ...

  5. mysql where id_MySQL where 子句

    MySQL where子句 在上一节课我们已经提到了where子句,其作用就是用于限制条件.譬如说,现在我们要查询某个表中,id值大于12的所有记录,就可以这样果 select * from wher ...

  6. mysql having in_mysql:having 用法

    顺序:where -> group by -> min -> order by -> limit 在select语句中使用having 子句来指定一组行或聚合的过滤条件 hav ...

  7. mysql 用set插入数据_在MySQL中使用SET子句插入多个数据?

    让我们首先创建一个表-mysql> create table DemoTable1544 -> ( -> Id int , -> Name varchar(20) ->  ...

  8. mysql update in_mysql update join优化update in查询效率

    数据库版本:5.6.16 update in 修改数据,结果执行时间过慢,一直不出结果. SQL语句及执行计划如下: UPDATE erp_order_extra SET last_time=1231 ...

  9. mysql 替代 in_mysql用什么代替in

    Mysql中用exists代替in:exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当exists里的条件语句能够返回记录行时,条件就为真,返回当前loop到的这条记录. ...

最新文章

  1. 组件 插件 控件联系与区别
  2. Vim 键盘指令高清图
  3. Machine Learning-模型评估与调参(完整版)
  4. 1022: [SHOI2008]小约翰的游戏John【Nim博弈,新生必做的水题】
  5. 批准Oracle IDM中的特定Web服务
  6. ASP.NET WebAPI 自定义ControllerSelector
  7. java中子类与父类中隐含的this引用的分析
  8. bootstrap基础学习【菜单、按钮、导航】(四)
  9. PAT1103 Integer Factorization (30)(DFS:回溯)
  10. 关于FD.io VPP的最新消息
  11. SQL Server插入geography、geometry和c_hierarchyid类型数据
  12. c语言实现数据结构中的链式表
  13. thinkphp5两种分页方法
  14. 1136 A Delayed Palindrome(20 分)
  15. CMOS中的 latch-up 闩锁效应、添加tap解决latch-up、使用combained area绘制TAP TAP的作用 IC后端版图【VLSI】
  16. ORA-1652: unable to extend temp segment by 128 in tablespace TEMP解决
  17. osu计算机科学硕士,OSU的Computer Science and Engineering「俄亥俄州立大学计算机科学与工程系」...
  18. mysql 竖列变成横行_mysql 横变竖 竖变横
  19. 应用程序操作word文件报“RPC服务器不可用,HRESULT:0x800706BA”
  20. 数据科学导论实验:基于Twitter的网络结构和社会群体演化

热门文章

  1. QT的QWinThumbnailToolBar类的使用
  2. QML基础类型之double
  3. linux dd devzero,makefile中ifeq与ifneq dev/null和dev/zero简介 dd命令
  4. Hibernate统计表中的条数
  5. SQLite 分离数据库(http://www.w3cschool.cc/sqlite/sqlite-detach-database.html)
  6. 通过已有SQL语句,生成数据库模型PDM
  7. Mysql 死锁过程及案例详解之用户自定义锁
  8. 【tensorflow】tf.layers.conv1d函数解析(一维卷积)
  9. adguard没有核心 core no_业主装修最后悔的五个地方!没有之一
  10. .mvn 需要放git上吗_下巴反复长痘,饮食上需要忌口吗?