在本教程中,咱们将学习如何使用MySQL HAVING子句来指定行分组或聚合的过滤条件。html
MySQL的HAVING子句在SELECT语句中是用来为某一组行或聚合指定过滤条件。mysql
MySQL的HAVING子句一般与GROUP BY子句一块儿使用。当它在GROUP BY子句中使用时,咱们能够应用它在GROUP BY子句以后来指定过滤的条件。若是省略了GROUP BY子句,HAVING子句行为就像WHERE子句同样。sql
请注意,HAVING子句应用筛选条件每个分组的行,而WHERE子句的过滤条件是过滤每一个单独的行。数据库
让咱们来看看使用MySQL HAVING子句的例子。在这里将使用示例数据库(studymysql)中的 order_detail 表做为示范。其表结构以下所示 -
咱们可使用GROUP BY子句来得到订单编号,每一个订单销售的产品数量,以及每一个订单的总额:函数
SELECT order_id, SUM(buy_number)AS buy_count, SUM(total_money) AS money_count FROM studymysql.order_detail GROUP BY order_id;
执行上面的 SQL 语句后,获得下面的结果 -
学习
如今,要查找那些销售总额超过 1500000 的订单信息。使用MySQL HAVING子句和聚合函数以下:spa
SELECT order_id, SUM(buy_number)AS items_count, SUM(total_money) AS sum_total_money FROM studymysql.order_detail GROUP BY order_id HAVING sum_total_money>1500000;
执行上面的 SQL 语句后,获得下面的结果 -
咱们还能够构造并使用逻辑运算符,如在HAVING子句中OR和AND运算符实现更复杂一点的过滤条件。假设要查找 order 表中总销售额大于100000,而且一个订单中包含 6 种以上的产品,参考使用下面的查询:htm
SELECT order_id, SUM(buy_number) AS items_count, SUM(total_money) AS total FROM studymysql.order_detail GROUP BY order_id HAVING total>1000000 AND items_count>350;
执行上面的 SQL 语句后,获得下面的结果 -
教程
假设要查找已发货(status=2)而且总销售额超过 160000 的全部订单,咱们能够经过使用INNER JOIN子句将 order 表链接 order_detail 表,并在 status 和 total 列上指定条件,以下查询所示:get
SELECT od.order_id, SUM(od.total_money) total, o.status FROM studymysql.order_detail od INNER JOIN studymysql.order o ON od.order_id=o.order_id GROUP BY od.order_id HAVING o.status='2' AND total>160000 ;
执行上面的 SQL 语句后,获得下面的结果 -
当咱们要经过GROUP BY子句来实现高级的报表输出时,使用HAVING子句就很是有用了。例如,咱们可使用HAVING子句来实现一些相似的查询,如:这个月,本季度和今年累计销售额超过10000 的订单信息。
在本教程中,您已经学会了如何使用MySQL HAVING子句在GROUP BY中来指定记录或汇集组的筛选条件。
转自:http://www.studymysql.com/mysql/having.html