MySQL 练习题
MySQL 练习题
一、表结构与数据准备
(一)部门表(dept)
1. 创建表
CREATE TABLE dept (deptno INT(2) NOT NULL PRIMARY KEY,dname VARCHAR(14),loc VARCHAR(13));
2. 插入数据
INSERT INTO dept (deptno, dname, loc) VALUES(10, 'ACCOUNTING', 'NEW YORK'),(20, 'RESEARCH', 'DALLAS'),(30, 'SALES', 'CHICAGO'),(40, 'OPERATIONS', 'BOSTON');
(二)员工表(emp)
1. 创建表(含外键关联 dept 表)
CREATE TABLE emp (empno INT(4) NOT NULL PRIMARY KEY,ename VARCHAR(10),job VARCHAR(9),mgr INT(4),hiredate DATE,sal FLOAT(7,2),comm FLOAT(7,2),deptno INT(2),CONSTRAINT fk_emp_dept FOREIGN KEY (deptno) REFERENCES dept(deptno));
2. 插入数据
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) VALUES(7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800.00, NULL, 20),(7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600.00, 300.00, 30),(7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250.00, 500.00, 30),(7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975.00, NULL, 20),(7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250.00, 1400.00, 30),(7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850.00, NULL, 30),(7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450.00, NULL, 10),(7788, 'SCOTT', 'ANALYST', 7566, '1987-07-13', 3000.00, NULL, 20),(7839, 'KING', 'PRESIDENT', NULL, '1981-11-07', 5000.00, NULL, 10),(7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500.00, 0.00, 30),(7876, 'ADAMS', 'CLERK', 7788, '1987-07-13', 1100.00, NULL, 20),(7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950.00, NULL, 30),(7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000.00, NULL, 20),(7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300.00, NULL, 10);
(三)工资等级表(salgrade)
1. 创建表
CREATE TABLE salgrade (grade INT(11),losal INT(11),hisal INT(11));
2. 插入数据
INSERT INTO salgrade (grade, losal, hisal) VALUES(1, 700, 1200),(2, 1201, 1400),(3, 1401, 2000),(4, 2001, 3000),(5, 3001, 9999);
二、查询练习题及解答
1. 计算员工工资 + 奖金(处理 NULL 奖金)
需求:查询员工姓名、工资、奖金,以及工资与奖金的总和(奖金为 NULL 时按 0 计算)。
SELECTename 姓名,sal 工资,comm 奖金,sal + IFNULL(comm, 0) 工资加奖金FROM emp;
说明:IFNULL(comm, 0) 将 NULL 奖金转为 0,避免计算结果为 NULL。
2. 拼接员工姓名与工号
需求:将员工姓名和工号拼接为 “姓名_工号” 格式(如 SMITH_7369)。
SELECT CONCAT(ename, '_', empno) AS 姓名_工号 FROM emp;
说明:CONCAT 函数用于字符串拼接。
3. 关联查询员工与部门信息
需求:查询员工编号、姓名及所属部门名称。
SELECTe.empno 员工编号,e.ename 姓名,d.dname 部门名称FROM emp eJOIN dept d ON e.deptno = d.deptno;
说明:通过 deptno 外键关联员工表与部门表。
4. 查询工资高于 SCOTT 的员工
需求:找出工资比 SCOTT 高的员工姓名和工资。
SELECT ename 姓名, sal 工资FROM empWHERE sal > (SELECT sal FROM emp WHERE ename = 'SCOTT');
结果:仅 KING(工资 5000.00)高于 SCOTT(工资 3000.00)。
5. 统计 SALES 部门人数
需求:查询 SALES 部门的员工数量。
SELECT COUNT(*) SALES部门人数FROM emp eJOIN dept d ON e.deptno = d.deptnoWHERE d.dname = 'SALES';
结果:SALES 部门有 6 人。
6. 查询工资最低的员工信息
需求:找出工资最低的员工姓名、工资及所属部门。
SELECTe.ename 姓名,e.sal 工资,d.dname 部门FROM emp eJOIN dept d ON e.deptno = d.deptnoWHERE e.sal = (SELECT MIN(sal) FROM emp);
结果:SMITH,工资 800.00,部门 RESEARCH。
7. 筛选普通员工(非领导)
需求:查询没有下属的普通员工(mgr 字段未被其他员工引用)。
SELECT ename 普通员工FROM empWHERE empno NOT IN (SELECT DISTINCT mgr FROM emp WHERE mgr IS NOT NULL);
说明:子查询获取所有领导的工号,外层查询排除这些工号对应的员工。
8. 按岗位调整工资(CASE 语句)
需求:SALESMAN 岗位涨薪 1000,ANALYST 岗位涨薪 2000,其他岗位薪资不变,查询调整后薪资。
SELECTename 姓名,sal 旧薪资,job 岗位,CASEWHEN job = 'SALESMAN' THEN sal + 1000WHEN job = 'ANALYST' THEN sal + 2000ELSE salEND 新薪资FROM emp;
说明:CASE 语句实现多条件薪资调整。