• 【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

    在这里插入图片描述

  • 相关阅读:
    ubuntu安装exe微信
    Ubuntu之apt-get系列--apt-get安装软件的方法/教程
    rust学习
    人工神经网络理论及应用,人工智能神经网络论文
    高德 Android 地图SDK 绘制面不显示
    面试中经常问到的几个问题,快来看看能答对几道吧
    WSL下gcc for arm交叉编译链的系统配置
    Vite入门 | 青训营笔记
    Unity Bolt模块间通信
    01-01HTML
  • 原文地址:https://blog.csdn.net/qq_59708493/article/details/126451099