进阶练习
(插入emp数据)
12. 用指令查询 第3页的 2条员工信息
13. 查询工资高于1号部门平均工资的员工信息
14. 查询最高工资的员工信息
15. 查询工资高于2号部门最低工资的员工信息
16. 给2号部门工资最低的员工涨500工资
17 查询每个 员工 姓名 工资 年总绩效(年总绩效3个月工资 别名显示)
18 给有领导的员工且工资低于4000的工资 然涨薪300块的信息
19 给没有领导员工中工资最低的2个人工资涨50%
20 查询4号部门中超过本部门平均工资的员工信息
21 查询2号部门中工资之和
22 给平均工资最低的部门员工的工资每人降薪200块 (分组查询 虚拟表)
数据
- -- 切换到shtd_store数据库
- USE shtd_store;
-
- -- 如果存在则删除员工表emp和部门表department
- DROP TABLE IF EXISTS emp;
- DROP TABLE IF EXISTS department;
-
- -- 建立部门表
- CREATE TABLE department (
- deptno INT PRIMARY KEY COMMENT '部门编号',
- dname VARCHAR(20) COMMENT '部门名称',
- loc VARCHAR(30) COMMENT '部门所在地'
- );
-
- -- 建立员工表
- CREATE TABLE emp (
- empno INT PRIMARY KEY COMMENT '员工编号',
- ename VARCHAR(20) COMMENT '员工姓名',
- job VARCHAR(30) COMMENT '职位',
- mgr INT COMMENT '上级经理编号',
- hiredate DATE COMMENT '入职日期',
- sal DECIMAL(10,2) COMMENT '基本工资',
- comm DECIMAL(10,2) COMMENT '奖金',
- deptno INT COMMENT '所属部门编号',
- FOREIGN KEY (deptno) REFERENCES department(deptno)
- );
-
-
- -- 插入部门数据
- INSERT INTO department (deptno, dname, loc) VALUES
- (1, '部门A', '地点A'),
- (2, '部门B', '地点B'),
- (3, '部门C', '地点C'),
- (4, '部门D', '地点D');
-
- -- 插入员工数据
- INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES
- (7369, '员工A', '职位A', 7902, '2022-01-01', 1000, NULL, 1),
- (7499, '员工B', '职位B', 7698, '2022-02-01', 1500, 300, 2),
- (7521, '员工C', '职位C', 7698, '2022-03-01', 2000, 500, 2),
- (7566, '员工D', '职位D', 7839, '2022-04-01', 3000, NULL, 1),
- (7698, '员工E', '职位E', 7839, '2022-05-01', 5000, NULL, 3),
- (7782, '员工F', '职位F', 7839, '2022-06-01', 4000, NULL, 2),
- (7788, '员工G', '职位G', 7566, '2022-07-01', 3500, NULL, 1),
- (7839, '员工H', '职位H', NULL, '2022-08-01', 8000, NULL, 4),
- (7844, '员工I', '职位I', 7698, '2022-09-01', 2500, NULL, 2),
- (7876, '员工J', '职位J', 7788, '2022-10-01', 4500, NULL, 1),
- (7900, '员工K', '职位K', 7698, '2022-11-01', 1800, NULL, 2),
- (7902, '员工L', '职位L', 7566, '2022-12-01', 3200, NULL, 1),
- (7934, '员工M', '职位M', 7782, '2023-01-01', 1500, NULL, 1);
答案
- -- 12. 查询第3页的2条员工信息
-
- SELECT *
- FROM emp
- ORDER BY empno
- LIMIT 2 OFFSET 4;
- /*
- 在查询第3页的2条员工信息时,根据常规的分页逻辑(每页显示2条记录),第三页的第二条员工信息是指 排在第5和第6行的员工记录。
- 上述查询使用LIMIT和OFFSET实现分页查询。
- LIMIT表示返回的结果行数,OFFSET表示跳过的行数。
- 这个查询返回第3页的2条员工信息。
- */
-
- -- 13. 查询工资高于1号部门平均工资的员工信息
- SELECT *
- FROM emp
- WHERE sal > (SELECT AVG(sal) FROM emp WHERE deptno = 1);
- /*
- 上述查询使用子查询来获取1号部门的平均工资,
- 并在外部查询中筛选出工资高于该平均工资的员工信息。
- */
-
- -- 14. 查询最高工资的员工信息
- SELECT *
- FROM emp
- WHERE sal = (SELECT MAX(sal) FROM emp);
- /*
- 上述查询使用子查询来获取最高工资,
- 并在外部查询中筛选出工资等于最高工资的员工信息。
- */
-
- -- 15. 查询工资高于2号部门最低工资的员工信息
- SELECT *
- FROM emp
- WHERE sal > (SELECT MIN(sal) FROM emp WHERE deptno = 2);
- /*
- 上述查询使用子查询来获取2号部门的最低工资,
- 并在外部查询中筛选出工资高于最低工资的员工信息。
- */
-
- -- 16. 给2号部门工资最低的员工涨500工资
-
- SELECT empno,sal from emp where deptno = "2" order by sal limit 1;
-
- UPDATE emp
- set sal = sal + 1000
- WHERE
- empno = 7499;
-
- SELECT * from emp where empno = "7499";
-
- ------------------------------------
-
- UPDATE emp
- SET sal = sal + 500
- WHERE empno = (
- SELECT empno
- FROM emp
- WHERE deptno = 2
- ORDER BY sal
- LIMIT 1
- );
- /*
- 上述更新操作使用子查询来获取2号部门工资最低的员工,
- 并将其工资增加500。
- */
-
- -- 17. 查询每个员工的姓名、工资、年总绩效(年总绩效=3个月工资,别名显示)
- SELECT ename, sal, sal * 3 AS total_performance
- FROM emp;
- /*
- 上述查询使用别名和计算列来获取每个员工的姓名、工资以及年总绩效。
- 年总绩效等于工资乘以3。
- */
-
- -- 18. 给有领导且工资低于4000的员工涨薪300元
- UPDATE emp
- SET sal = sal + 300
- WHERE mgr IS NOT NULL AND sal < 4000;
- /*
- 上述更新操作筛选出有领导且工资低于4000的员工,
- 并将其工资增加300。
- */
-
- -- 19. 给没有领导且工资最低的2个人工资涨50%
- UPDATE emp
- SET sal = sal * 1.5
- WHERE mgr IS NULL
- ORDER BY sal
- LIMIT 2;
- /*
- 上述更新操作使用排序和LIMIT来找到没有领导且工资最低的2个员工,
- 并将他们的工资增加50%。
- */
-
- -- 20. 查询4号部门中超过本部门平均工资的员工信息
- SELECT *
- FROM emp
- WHERE deptno = 4 AND sal > (SELECT AVG(sal) FROM emp WHERE deptno = 4);
- /*
- 上述查询使用子查询来获取4号部门的平均工资,
- 并在外部查询中筛选出工资高于该平均工资的员工信息。
- */
-
- -- 21. 查询2号部门中工资之和
- SELECT SUM(sal)
- FROM emp
- WHERE deptno = 2;
- /*
- 上述查询使用SUM函数计算2号部门的工资总和。
- */
-
- -- 22. 给平均工资最低的部门员工的工资每人降薪200元 (分组查询,虚拟表)
- UPDATE emp
- SET sal = sal - 200
- WHERE deptno = (
- SELECT deptno
- FROM (
- SELECT deptno, AVG(sal) AS avg_sal
- FROM emp
- GROUP BY deptno
- ORDER BY avg_sal
- LIMIT 1
- ) AS min_dept
- );
- /*
- 上述更新操作使用子查询和虚拟表来找到平均工资最低的部门,
- 并对该部门的员工每人进行工资降低200元。
- */
-