mysql之过滤分组的具体实现

 更新时间:2024年08月04日 10:07:16   作者:贾斯汀玛尔斯  
在MySQL中过滤分组数据通常使用GROUP BY结合HAVING子句和WHERE子句,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在MySQL中,过滤分组数据通常使用 GROUP BY 结合 HAVING 子句和 WHERE 子句。GROUP BY 子句用于将结果集按一个或多个列进行分组,而 HAVING 子句用于过滤分组后的数据。WHERE 子句用于过滤分组前的数据。下面是具体的用法和示例:

GROUP BY 子句

GROUP BY 子句用于根据一个或多个列对结果集进行分组。通常结合聚合函数(如 COUNTSUMAVGMAXMIN)使用。

基本语法

SELECT column1, column2, aggregate_function(column3)
FROM table_name
WHERE condition
GROUP BY column1, column2
ORDER BY column1, column2;

示例

  • 按部门分组统计员工人数
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id;

HAVING 子句

HAVING 子句用于过滤分组后的数据。它的作用类似于 WHERE 子句,但 WHERE 子句是在分组前过滤记录,而 HAVING 子句是在分组后过滤记录。

基本语法

SELECT column1, column2, aggregate_function(column3)
FROM table_name
WHERE condition
GROUP BY column1, column2
HAVING aggregate_function(column3) condition
ORDER BY column1, column2;

示例

  • 按部门分组统计员工人数,并只显示员工人数超过5人的部门
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 5;
  • 按部门分组统计员工平均工资,并只显示平均工资高于5000的部门
SELECT department_id, AVG(salary) AS average_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 5000;

结合 WHERE 和 HAVING

WHERE 子句和 HAVING 子句可以一起使用,WHERE 子句用于过滤原始数据,HAVING 子句用于过滤分组后的数据。

示例

  • 在计算平均工资前过滤掉工资低于3000的员工,并按部门分组统计员工平均工资,只显示平均工资高于5000的部门
SELECT department_id, AVG(salary) AS average_salary
FROM employees
WHERE salary >= 3000
GROUP BY department_id
HAVING AVG(salary) > 5000;

复杂示例

以下是一个更复杂的示例,展示了如何结合使用 GROUP BYHAVING 和聚合函数来进行数据分析:

  • 统计每个部门的员工人数、平均工资和最高工资,并只显示员工人数超过10且平均工资高于4000的部门
SELECT department_id,
       COUNT(*) AS employee_count,
       AVG(salary) AS average_salary,
       MAX(salary) AS max_salary
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 10 AND AVG(salary) > 4000;

注意事项

  • WHERE 与 HAVING 的区WHERE 用于过滤原始数据行,HAVING 用于过滤分组后的数据行。
  • 使用聚合函数HAVING 子句通常用于包含聚合函数的条件过滤。
  • 性能考虑:在大型数据集上,尽量先使用 WHERE 子句进行初步过滤,以减少分组和聚合的数据量,从而提高查询性能。

到此这篇关于mysql之过滤分组的具体实现的文章就介绍到这了,更多相关mysql 过滤分组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • 数据库实现行列转换(mysql示例)

    数据库实现行列转换(mysql示例)

    最近突然玩起了sql语句,想着想着便给自己出了一道题目:“行列转换”。起初瞎折腾了不少时间也上网参考了一些博文,不过大多数是采用oracle数据库当中的一些便捷函数进行处理,比如”pivot”。那么,在Mysql环境下如何处理?下面通过这篇文章我们来一起看看吧。
    2016-12-12
  • mysql 数据同步 出现Slave_IO_Running:No问题的解决方法小结

    mysql 数据同步 出现Slave_IO_Running:No问题的解决方法小结

    mysql replication 中slave机器上有两个关键的进程,死一个都不行,一个是slave_sql_running,一个是Slave_IO_Running,一个负责与主机的io通信,一个负责自己的slave mysql进程。
    2011-05-05
  • 浅谈MySQL中的group by

    浅谈MySQL中的group by

    这篇文章主要介绍了MySQL中的group by,MySQL的group by用于对查询的数据进行分组;此外MySQL提供having子句对分组内的数据进行过滤。下面来看看文章对此的具体介绍,需要的朋友可以参考一下,希望对你有所帮助
    2021-11-11
  • MySQL8.0.27安装过程中卡在Initializing Database中并报错的解决

    MySQL8.0.27安装过程中卡在Initializing Database中并报错的解决

    本文主要介绍了MySQL8.0.27安装过程中卡在Initializing Database中并报错的解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 解决MySql8.0 查看事务隔离级别报错的问题

    解决MySql8.0 查看事务隔离级别报错的问题

    这篇文章主要介绍了解决MySql8.0 查看事务隔离级别报错的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • mySQL中in查询与exists查询的区别小结

    mySQL中in查询与exists查询的区别小结

    最近被一个朋友问到mySQL中in查询和exists的区别,当然只是草草的回答了下,今天偶然看到了一篇关于mysql中的exists查询的文章,读完感觉太”冷落”它了,这里总结一下,也跟自己常用的in查询做一下对比。有需要的朋友们可以参考借鉴,下面来一起学习学习吧。
    2016-11-11
  • SQL面试题:求时间差之和(有重复不计)

    SQL面试题:求时间差之和(有重复不计)

    这篇文章主要介绍了SQL面试题:求时间差之和(有重复不计),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • MySQL函数date_format()日期格式转换的实现

    MySQL函数date_format()日期格式转换的实现

    本文主要介绍了MySQL函数date_format()日期格式转换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Mysql入门基础 数据库创建篇

    Mysql入门基础 数据库创建篇

    Mysql入门基础 数据库创建篇,刚接触php与mysql的朋友可以参考下。多写多测试。
    2010-04-04
  • Mysql的Explain使用方式及索引总结

    Mysql的Explain使用方式及索引总结

    这篇文章主要介绍了Mysql的Explain使用方式及索引总结,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12

最新评论