MySQL练习题

进阶练习

(插入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工资
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元。
*/

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