• 【MySQL】select语句——group by子句和having子句的使用



    要求

    1. 如何显示每个部门的平均工资和最高工资
    2. 显示每个部门的每种岗位的平均工资和最低工资
    3. 显示平均工资低于2000的部门号和它的平均工资//别名

    1.创建部门表,员工表和工资级别表

    1.部门表

    CREATE TABLE dept( /*部门表*/
    deptno MEDIUMINT   UNSIGNED  NOT NULL  DEFAULT 0, 
    dname VARCHAR(20)  NOT NULL  DEFAULT "",
    loc VARCHAR(13) NOT NULL DEFAULT ""
    );
    
    INSERT INTO dept VALUES(10, 'ACCOUNTING', 'NEW YORK'), 
    (20, 'RESEARCH', 'DALLAS'), 
    (30, 'SALES', 'CHICAGO'), 
    (40, 'OPERATIONS', 'BOSTON');
    
    SELECT * FROM dept;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    2.员工表

    -- 员工表
    
    CREATE TABLE emp1
    (empno  MEDIUMINT UNSIGNED  NOT NULL  DEFAULT 0, /*编号*/
    ename VARCHAR(60) NOT NULL DEFAULT "", /*名字*/
    job VARCHAR(60) NOT NULL DEFAULT "",/*工作*/
    mgr MEDIUMINT UNSIGNED ,/*上级编号*/
    hiredate DATE NOT NULL,/*入职时间*/
    sal DECIMAL(7,2)  NOT NULL,/*薪水*/
    comm DECIMAL(7,2) ,/*红利 奖金*/
    deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部门编号*/
    );
    
    -- 添加测试数据
     INSERT INTO emp1 VALUES(7369, 'SMITH', 'CLERK', 7902, '1990-12-17', 800.00,NULL , 20), 
    (7499, 'ALLEN', 'SALESMAN', 7698, '1991-2-20', 1600.00, 300.00, 30),  
    (7521, 'WARD', 'SALESMAN', 7698, '1991-2-22', 1250.00, 500.00, 30),  
    (7566, 'JONES', 'MANAGER', 7839, '1991-4-2', 2975.00,NULL,20),  
    (7654, 'MARTIN', 'SALESMAN', 7698, '1991-9-28',1250.00,1400.00,30),  
    (7698, 'BLAKE','MANAGER', 7839,'1991-5-1', 2850.00,NULL,30),  
    (7782, 'CLARK','MANAGER', 7839, '1991-6-9',2450.00,NULL,10),  
    (7788, 'SCOTT','ANALYST',7566, '1997-4-19',3000.00,NULL,20),  
    (7839, 'KING','PRESIDENT',NULL,'1991-11-17',5000.00,NULL,10),  
    (7844, 'TURNER', 'SALESMAN',7698, '1991-9-8', 1500.00, NULL,30),  
    (7900, 'JAMES','CLERK',7698, '1991-12-3',950.00,NULL,30),  
    (7902, 'FORD', 'ANALYST',7566,'1991-12-3',3000.00, NULL,20),  
    (7934,'MILLER','CLERK',7782,'1992-1-23', 1300.00, NULL,10);
    SELECT * FROM emp1;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    在这里插入图片描述

    3.工资级别表

    -- 工资级别
    #工资级别表
    CREATE TABLE salgrade
    (
    grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*工资级别*/ 
    losal DECIMAL(17,2)  NOT NULL, /* 该级别的最低工资 */
    hisal DECIMAL(17,2)  NOT NULL /* 该级别的最高工资*/
    );
    
    INSERT INTO salgrade VALUES (1,700,1200);
    INSERT INTO salgrade VALUES (2,1201,1400);
    INSERT INTO salgrade VALUES (3,1401,2000);
    INSERT INTO salgrade VALUES (4,2001,3000);
    INSERT INTO salgrade VALUES (5,3001,9999);
    
    SELECT * FROM salgrade;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    2.select语句

    使用group by 子句对列进行分组[先创建测试表]
    SELECT columnl, column2. column3…
    FROM table
    group by column

    group by用于对查询的结果分组统计,

    # 演示group by + having
    GROUP by用于对查询的结果分组统计, (示意图)
    -- having子句用于限制分组显示结果.
    -- ?如何显示每个部门的平均工资和最高工资
    -- 分析: avg(sal) max(sal)
    -- 按照部门来分组查询
    SELECT AVG(sal), MAX(sal) , deptno 
    	FROM  emp1 GROUP BY deptno; 
    -- 使用数学方法,对小数点进行处理
    SELECT FORMAT(AVG(sal),2), MAX(sal) , deptno 
    	FROM  emp1 GROUP BY deptno; 
    
    -- ?显示每个部门的每种岗位的平均工资和最低工资
    -- 老师分析 1. 显示每个部门的平均工资和最低工资
    --          2. 显示每个部门的每种岗位的平均工资和最低工资
    SELECT FORMAT(AVG(sal),2), MIN(sal) , deptno, job 
    	FROM  emp1 GROUP BY deptno, job;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    3.having语句

    使用having 子句对分组后的结果进行过滤
    SELECT ’ column1, column2. column3…
    FROM table
    group by column having …

    having子句用于限制分组显示结果。

    -- ?显示平均工资低于2000的部门号和它的平均工资 // 别名
    
    -- 分析 [写sql语句的思路是化繁为简,各个击破]
    -- 1. 显示各个部门的平均工资和部门号
    -- 2. 在1的结果基础上,进行过滤,保留 AVG(sal) < 2000
    -- 3. 使用别名进行过滤 
    
    SELECT AVG(sal), deptno 
    	FROM emp1 GROUP BY deptno
    		HAVING AVG(sal) < 2000;
    -- 使用别名		
    SELECT AVG(sal) AS avg_sal, deptno 
    	FROM emp1 GROUP BY deptno
    		HAVING avg_sal < 2000;	
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

  • 相关阅读:
    【python基础】基本数据类型-字符串类型
    第四章. Pandas进阶—日期数据处理
    解决“error #147 declaration is incompatible with xxx xxx (declared at line xx)”问题
    Spring Boot之请求方式与请求映射过程分析
    算法训练营第一天 704 .二分查找、27.移除元素
    spring boot整合 Redis
    VMware Fusion 13+Ubuntu ARM Server 22.04.3在M2芯片的Mac上共享文件夹
    依赖下载失败时,可以考虑一下这个方法
    ElasticSearch 实现分词全文检索 - SpringBoot 完整实现 Demo 附源码【完结篇】
    PMP每日一练 | 考试不迷路-11.19(包含敏捷+多选)
  • 原文地址:https://blog.csdn.net/qq_59708493/article/details/126451099