MySQL 分组查询(group by 的用法浅析)

版权声明:本文为博主原创文章,未经博主同意不可随意转载。 https://blog.csdn.net/hellokandy/article/details/83996959

数据库的表结构如下:

#列出每个部门最高薪水的结果

SELECT 
    szDepartment, MAX(nSalary) AS nMaxSalary
FROM
    test.department
GROUP BY szDepartment;

解释一下这个结果:
1、满足“SELECT子句中的列名必须为分组列或列函数”,因为SELECT有GROUP BY szDepartment中包含的列szDepartment。
2、“列函数对于GROUP BY子句定义的每个组各返回一个结果”
根据部门分组,对每个部门返回一个结果,就是每个部门的最高薪水。

#查询每个部门总的薪水数

SELECT 
    szDepartment, sum(nSalary) AS nSumSalary
FROM
    test.department
GROUP BY szDepartment;

#查询每个部门总的薪水数+ORDER BY

SELECT 
    szDepartment, sum(nSalary) AS nSumSalary
FROM
    test.department
GROUP BY szDepartment
ORDER BY nSumSalary DESC;

扫描二维码关注公众号,回复: 4569412 查看本文章

#查询每个部门平均薪水数

SELECT 
    szDepartment, avg(nSalary) AS nAvgSalary
FROM
    test.department
GROUP BY szDepartment
ORDER BY nAvgSalary DESC;

#寻找雇员数超过2个人的部门的平均薪水

在GROUP BY子句之后使用HAVING子句(可应用限定条件进行分组,以便系统仅对满足条件的组返回结果)

SELECT 
    szDepartment, avg(nSalary) AS nAvgSalary
FROM
    test.department
GROUP BY szDepartment
HAVING count(*) > 2
ORDER BY szDepartment DESC;

#寻找雇员平均工资大于4000的部门的最高和最低薪水:

SELECT 
    szDepartment, MAX(nSalary) AS nMaxSalary, MIN(nSalary) AS nMinSalary
FROM
    test.department
GROUP BY szDepartment
HAVING AVG(nSalary) > 4000
ORDER BY szDepartment DESC;

Having与Where的区别

  • where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行。
  • having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。

其他举例说明:

查询某个用户(用户名为admin,工号为9999)在2018年11月7号到2018年11月12号之间,每一天最后的那条数据。

代码如下:

SELECT 
    *
FROM
    (SELECT 
        *
    FROM
        user_statistics
    WHERE
        szUserName = 'admin'
            AND szEmployeeNumber = '9999'
            AND szCreatTime BETWEEN '20181107000000' AND '20181112235959'
    ORDER BY nId DESC) user_statistics
GROUP BY CONVERT( szCreatTime , DATE)

猜你喜欢

转载自blog.csdn.net/hellokandy/article/details/83996959