mysql 中的 having 与 order by 的区别与联系举例说明

发布时间 2023-07-28 14:24:31作者: sunny_2016

HAVING和ORDER BY都是在查询语句中用于对结果进行排序的子句,但它们的使用场景和作用略有不同。

区别:

  • HAVING子句用于在GROUP BY子句后对分组结果进行筛选,只返回满足条件的分组。它通常与聚合函数一起使用,用于筛选分组后的结果集。HAVING子句是在分组后进行筛选,可以使用聚合函数和分组后的别名,但不能使用表达式或列名。
  • ORDER BY子句用于对查询结果进行排序,可以按照一个或多个列进行升序或降序排序。它是在查询结果集上进行排序,可以使用列名、表达式和别名进行排序。

联系:

  • HAVING和ORDER BY都是在查询语句中用于对结果进行处理的子句,它们可以单独使用,也可以一起使用。
  • HAVING子句通常用于对分组结果进行筛选,而ORDER BY子句用于对整个结果集进行排序。
  • 在使用GROUP BY子句进行分组后,可以使用HAVING子句对分组结果进行进一步筛选,然后使用ORDER BY对筛选后的结果进行排序。

下面是HAVING和ORDER BY的示例说明:

  1. 使用HAVING子句筛选分组结果:

    • 查询订单表中订单数量大于等于5的客户,并按照订单数量降序排序:
      SELECT customer_id, COUNT(*) AS order_count
      FROM orders
      GROUP BY customer_id
      HAVING order_count >= 5
      ORDER BY order_count DESC;
      
  2. 使用HAVING和ORDER BY一起使用:

    • 查询订单表中订单数量大于等于5的客户,且按照订单数量降序排序,如果订单数量相同,则按照客户ID升序排序:
      SELECT customer_id, COUNT(*) AS order_count
      FROM orders
      GROUP BY customer_id
      HAVING order_count >= 5
      ORDER BY order_count DESC, customer_id ASC;
      

在实际使用中,根据需求和数据结构的复杂度,可以选择使用HAVING子句、ORDER BY子句或它们的组合来实现所需的结果筛选和排序。