Mysql 数据库 第七节 《DQL 高阶查询》 分组 聚合 Limit

                                                        《DQL 高阶查询》

 

DQL 常用聚合查询(只会返回一行结果)

       聚合函数 值作用域 非 Null  数据, 所以在 聚合之前 需要检查 数据是否为 Null

1. count 返回  不为 null 的数据     记录数      count(*)  等价于 count(1)

     COUNT  使用比较多的  场景 就是 数据分页

            SELECT COUNT(*) FROM emp;

            SELECT COUNT(work_type) FROM emp;

 

         2. sum 对字段列进行 求和

             NUll 和 一个 数 相加   得到  NULL

             所以在求 和 的时候 一般要先判断 是否 为  null,  所以需要  ifNull 先进性 判断

            SELECT IFNULL(COMM,0) + IFNULL(SAL,0 ) as total FROM emp;

            SELECT  SUMIFNULL(COMM,0) +  IFNULL(SAL,0 ) )   FROM emp;

 

         3. avg 对数据进行 平均值  的计算

             SELECT AVG(  IFNULL(COMM,0) )  FROM  emp;

             SELECT AVG(  IFNULL(COMM,0) ), AVG(  IFNULL(SAL,0) )  FROM  emp;

 

         4.  max  和 min  求 最大值 和 最 小值

             SELECT MAX(COMM), MIN(SAL) FROM emp;

             

 

 

分组查询  Group By:

          1. group by

          将查询 结果按照 1个 或多个 字段 进行分组, 字段相同的是为一组, 归类

 

          2,注意事项

          当 group by 单独使用时, 只显示分组 的 第一条记录,所以 一般不会单独使用, 在使用 分组时,分组后的 字段 一般作   为前面的返回字段

          *单独使用   指的 是  没有配合 聚合 函数一起使用

 

          3. group concat(字段)

          分组后, 根据分组结果 将某些字段 串起来输出

          group by 分类 之后 统计  每 个 分类的  具体 个数情况, 串起来 输出,以 逗号分隔

          SELECT edeptno , GROUP_CONCAT(ename) FROM  emp GROUP BY edeptno

 

          * 统计男女性别 对应的 所以姓名

          SELECT sex ,GROUP_CONCAT(ename)  FROM emp GROUP BY sex;

 

          * 统计部门下的 人的 性别

          SELECT edeptno, GROUP_CONCAT(work_age)  FROM emp GROUP BY edeptno ;

 

           4. 分组 和  聚合函数 一起啊使用

           查询 每个部门 的 名称 和 每个部门的薪资 总和 (按部门编号分组)

           SELECT edeptno,  SUM( IFNULL(sal,0) )  FROM emp GROUP BY edeptno;

 

           查询男性和女性 的平均 工龄 (按性别分类)
           SELECT sex , AVG( IFNULL(work_age,0) )   FROM emp GROUP BY sex;

 

           查询 每个部门的 部门名称 以及 每个部门 工资大于 1500 的人数 (按部门编号分组)

          SELECT edeptno , COUNT(*)  FROM emp WHERE SAL > 200 GROUP BY edeptno;

 

 

        

        


 

分组 +  Having 的使用

    1.  having 用于分组后的再次筛选, where 用于分组前的 数据筛选

    2.  having 和 where 条件的作用一样, 但只能 用于 分组 group by,

   查询  [薪资总和]  大于 50 的部门 id

    SELECT edeptno , SUM(IFNULL(SAL,0))  FROM emp
     GROUP BY edeptno HAVING   SUM(IFNULL(SAL,0)) > 50

 

    3.  having 和 where 条件的区别

  1.  where 是在分组(group by)之前, having 是在分组(group by)之后
  2.  where 不能使用聚合函数  having 能使用聚合 函数 (对聚合函数 进行条件 筛选)
  3.  where 在分组之前就 进行筛选 数据, 过滤掉数据 将不会进入        

  

     查询员工  工资大于 50工资总和大于 100 的   部门名称  以及工资总和,按照 总和 倒叙排列

     对于比较 复杂 的查询  ,拆分    需求

  1.      首先看查询          A部门编号,                    B 工资总和
  2.      筛选条件              A 员工 工资 大于 50,      GROUP BY  之前
  3.      聚合筛选条件       B 部门工资单大于 1000    GROUP BY  之后 聚合 条件
  4.      按照  总和  倒序 排
SELECT edeptno , SUM( IFNULL(SAL,0)) FROM emp 
WHERE SAL > 50 GROUP BY edeptno 
HAVING SUM( IFNULL(SAL,0)) > 1000
ORDER BY SUM( IFNULL(SAL,0)) DESC


简化:
SELECT edeptno , SUM( IFNULL(SAL,0))  as total FROM emp
WHERE SAL > 50 GROUP BY edeptno
HAVING total > 1000
ORDER BY total DESC

本节代码

SELECT edeptno , GROUP_CONCAT(ename) FROM  emp GROUP BY edeptno

ALTER TABLE emp ADD  COLUMN sex CHAR(1) COMMENT '性别';

ALTER TABLE emp MODIFY  sex  CHAR(1) DEFAULT '1' COMMENT '性别';


ALTER TABLE emp DROP COLUMN sex;


ALTER TABLE emp ADD  COLUMN sex CHAR(1) DEFAULT '1' COMMENT '性别';


SELECT sex ,GROUP_CONCAT(ename)  FROM emp GROUP BY sex;




SELECT edeptno, GROUP_CONCAT(work_age) FROM emp GROUP BY edeptno ;

SELECT edeptno,  SUM( IFNULL(sal,0) ) FROM emp GROUP BY edeptno;

SELECT sex , AVG( IFNULL(work_age,0) ) FROM emp GROUP BY sex;



SELECT edeptno , COUNT(*) FROM emp WHERE SAL > 200 GROUP BY edeptno;




SELECT edeptno , SUM(IFNULL(SAL,0))  FROM emp 
GROUP BY edeptno HAVING  SUM(IFNULL(SAL,0)) > 50


SELECT edeptno , SUM( IFNULL(SAL,0)) FROM emp 
WHERE SAL > 50 GROUP BY edeptno 
HAVING SUM( IFNULL(SAL,0)) > 1000
ORDER BY SUM( IFNULL(SAL,0)) DESC

 

 

 


 

练习题:

1.查询 20 号部门  的所有员工人数     聚合查询

SELECT COUNT(*)  FROM emp WHERE edeptno = 20

2.查询 每个 部门 中 奖金最高的奖金

SELECT edeptno , MAX(SAL) FROM emp GROUP BY edeptno 

3.查询每个部门的 平均 薪资 和奖金汇总

SELECT edeptno, AVG(SAL) , SUM(COMM) FROM emp GROUP BY edeptno;

4.查询 30 号部门的 平均 工资

SELECT  AVG(SAL) FROM emp WHERE edeptno = 30

5.查询 所有 工种 不是  MANAGER  和 CLIERK, 部门工资总和 大于 55 部门名称 以及 资总 总和, 按照倒叙 显示

SELECT edeptno, SUM(SAL) FROM emp  
WHERE work_type != 'MANAGER' AND  work_type != 'CLERK' 
GROUP BY edeptno
HAVING SUM(SAL) > 55
ORDER BY SUM(SAL) DESC


SELECT edeptno, SUM(SAL) FROM emp 
WHERE work_type NOT IN('MANAGER', 'CLERK' )
GROUP BY edeptno 
HAVING SUM(SAL) > 55
ORDER BY SUM(SAL) DESC


SELECT edeptno, SUM(SAL) FROM emp 
WHERE work_type NOT IN('MANAGER', 'CLERK' )
GROUP BY edeptno 
HAVING SUM(SAL) > 55  AND SUM(SAL) < 10000
ORDER BY SUM(SAL) DESC

Having  中科院使用  AND OR   IN  NOT IN 等等 修饰

SELECT COUNT(*) FROM emp WHERE edeptno = 20
 
 
SELECT edeptno , MAX(SAL) FROM emp GROUP BY edeptno  


SELECT edeptno, AVG(SAL) , SUM(COMM) FROM emp GROUP BY edeptno;


SELECT AVG(SAL) FROM emp WHERE edeptno = 30


SELECT edeptno, SUM(SAL) FROM emp  
WHERE work_type != 'MANAGER' AND  work_type != 'CLERK' 
GROUP BY edeptno
HAVING SUM(SAL) > 55
ORDER BY SUM(SAL) DESC



SELECT edeptno, SUM(SAL) FROM emp 
WHERE work_type NOT IN('MANAGER', 'CLERK' )
GROUP BY edeptno 
HAVING SUM(SAL) > 55  AND SUM(SAL) < 10000
ORDER BY SUM(SAL) DESC

 

 


 

SQL 语句的书写顺序  以及 执行顺序 (目前)

 

Mysql 数据库 第七节 《DQL 高阶查询》 分组 聚合 Limit_第1张图片

 

 

Limit 的使用:

  1. 从那一行 开始查, 查询多少条
  2. limit 参数 1 (从那一行开始),参数2(查询多少条 ) 步长
  3. 下标从0 开始
  4. 分页思路

    SELECT * FROM emp LIMIT 0,3;    132

    SELECT * FROM emp LIMIT 3,3;    465

    SELECT * FROM emp LIMIT 5;        13245  前五

你可能感兴趣的:(数据库,Mysql)