MySql数据库查询(DQL)语言—分组函数和分组查询

版权声明:本博客主要记录学习笔记和遇到的一些问题解决方案,转载请注明出处! https://blog.csdn.net/u010982507/article/details/90734797

分组函数

一、简介与分类
分组函数又称为聚合函数或统计函数或组函数,用作统计使用。
常见分组函数有:

  • sum()
  • avg()
  • max()
  • min()
  • count()

二、使用方式

  1. sum()
    描述:求和。
    约束:支持数值型;忽略NULL,NULL不参与运算。
    示例:select sum(salary) from employees;
  2. avg()
    描述:求平均值。
    约束:支持数值型;忽略NULL,NULL不参与运算。
    示例:select avg(salary) from employees;
  3. max()
    描述:计算最大值。
    约束:支持数值型/字符型/日期型;忽略NULL,NULL不参与运算。
    示例:select max(salary) from employees;
    示例:select max(last_name) from employees;
    示例:select max(date) from employees;
  4. min()
    描述:获取最小值。
    约束:支持数值型/字符型/日期型;忽略NULL,NULL不参与运算。
    示例:select min(salary) from employees;
    示例:select min(last_name) from employees;
    示例:select min (date) from employees;
  5. count()
    描述:计算非空类型个数。
    约束:支持任何类型;忽略NULL,NULL不参与运算。
    示例:select count(salary) from employees; 107总数
    示例:select count(commision_pac) from employees; 35个,其他为null
    示例:select count(*) from employees; 统计所有的行,三列属性,只要有一列的字段不为null,则+1
    同:select count(1) from employees;
    5.5之前MYISAM引擎:count() 效率较高。
    5.5之后innoDB引擎:count(
    )与count(1)效率差不多。
    描述:查询部门为90的员工个数。
    示例:select count(*) from employees where department_id = 90;
  6. 组合使用
    描述:组合使用,平均值保留两位小数。
    示例:select sum(salary) 和, round(avg(salary), 2) 平均值, max(salary) 最大, min(salary) 最小, count(salary) 数量 from employees;
    描述:与去重distinct组合使用,求所有的工资的和以及去除重复后的和。
    示例:select sum(salary), sum(distinct salary) from employees;
  7. 和分组函数一同查询的字段有限制
    描述:和分组函数一同查询的字段要求是group by后的字段。
    select AVG(salary), employee_id from employees;查询有问题,平均数时一个值,员工id是多个值,不能一同显示。

分组查询

一、使用方式

  1. 分组查询一般配合分组函数进行,一般语法是:
    select column(此列要求出现在group by的后面), group_function(column)
    from table
    where condition
    group by group_by_expression
    order by column;
    注意:要求查询列表必须特殊,是分组函数和group by之后出现的字段。

二、分组前筛选

  1. 查询每个工种的最高工资。
    select max(salary), job_id from employees group by job_id;
  2. 查询每个位置上的部门个数。
    select count(*),location_id from departments group by location_id;
  3. 查询邮箱中包含a字符的,每个部门的平均工资。
    select avg(salary),department_id from employees where email like '%a%' group by department_id;
  4. 查询有奖金的每个领导手下员工的最高工资。
    select max(salary),manager_id from employees where commission_pac is not null group by manager_id;
    总结:
    1.查询的字段都在一张表中,可以用where筛选,即是添加分组前的筛选条件。筛选前的数据源是原始表,即表中有筛选条件的字段。
    2.在group by前面使用关键字where

三、分组后筛选

  1. 查询每个部门的员工个数,并且员工个数大于2。
    select count(*),department_id from employees group by department_id having count(*) > 2;
  2. 查询每个工种有奖金的员工的最高工资,且最高工资>12000。
    select max(salary), job_id from employees where commission is not null group by job_id having max(salary) > 12000;
    总结:
    1.添加分组后的筛选,筛选条件的数据源是来自分组后的结果集;
    2.在group by后面使用关键字having;
    3.分组函数做条件肯定是放在having字句中,如max(salary) > 12000count(*) > 2;

四、按函数分组

  1. 按员工姓名长度分组,查询每一组的员工个数,筛选员工个数大于5的有哪些。
    select count(*),length(last_name) from employees group by length(last_name) having count(*) > 5;
    或使用别名
    select count(*) c,length(last_name) l from employees group by l having c > 5;

五、按多个字段分组

  1. 查询每个部门每个工种的平均工资。
    select avg(salary), department_id, job_id from employees group by department_id, job_id;

六、添加排序

  1. 查询每个部门每个工种的平均工资,并按平均工资高低排序。
    select avg(salary), department_id, job_id from employees group by department_id, job_id order by avg(salary) desc;

猜你喜欢

转载自blog.csdn.net/u010982507/article/details/90734797