mysql练习题 -- 第五天

  • 表信息

dept 部门表

字段
DEPTNO 部门编号
DNAME 部门名称
LOC 位置

emp 员工表

字段
EMPNO 员工编号
ENAME 员工名称
JOB 职位
MGR 上级
HIREDATE 入职时间
SAL 薪水
COMM 奖金
DEPTNO 部门编号

salgrade 薪水等级表

字段
GRADE 等级编号
LOSAL 最低薪水
HISAL 最高薪水

文件下载: https://download.youkuaiyun.com/download/eebaicai/12626751

20.列出所有"CLERK"(办事员)的姓名及部门名称,部门的人数

第一步:

SELECT
	e.ename,
	d.dname
FROM
	dept d
JOIN emp e ON d.deptno = e.deptno
WHERE
	e.job = 'CLERK';

+--------+------------+
| ename  | dname      |
+--------+------------+
| SMITH  | RESEARCH   |
| ADAMS  | RESEARCH   |
| JAMES  | SALES      |
| MILLER | ACCOUNTING |
+--------+------------+

第二步:

SELECT
	deptno,
	count(*) as total_emp
FROM
	emp
GROUP BY
	deptno;

+--------+-----------+
| deptno | total_emp |
+--------+-----------+
|     10 |         3 |
|     20 |         5 |
|     30 |         6 |
+--------+-----------+

第一步和第二步联合:

SELECT
	e.ename,
	d.dname,
	t.total_emp
FROM
	dept d
JOIN emp e ON d.deptno = e.deptno
JOIN (
	SELECT
		deptno,
		count(*) AS total_emp
	FROM
		emp
	GROUP BY
		deptno
) t ON d.deptno = t.deptno
WHERE
	e.job = 'CLERK';

+--------+------------+-----------+
| ename  | dname      | total_emp |
+--------+------------+-----------+
| SMITH  | RESEARCH   |         5 |
| ADAMS  | RESEARCH   |         5 |
| JAMES  | SALES      |         6 |
| MILLER | ACCOUNTING |         3 |
+--------+------------+-----------+

21.列出最低薪水大于1500的各种工作及从事此工作全部员工人数

SELECT
	min(sal),
	count(*)
FROM
	emp
GROUP BY
	job
HAVING
	min(sal) > 1500;

+----------+----------+
| min(sal) | count(*) |
+----------+----------+
|  3000.00 |        2 |
|  2450.00 |        3 |
|  5000.00 |        1 |
+----------+----------+

22. 列出在部门"SALES"<销售部>工作的员工的姓名(假设不知道销售部的部门编号)

SELECT
	ename
FROM
	emp
WHERE
	deptno = (
		SELECT
			deptno
		FROM
			dept
		WHERE
			dname = 'SALES'
	);

+--------+ 
| ename  | 
+--------+ 
| ALLEN  | 
| WARD   | 
| MARTIN | 
| BLAKE  | 
| TURNER | 
| JAMES  | 
+--------+ 

23.列出薪水高于公司平均薪水的所有员工,所在部门,上级领导,员工薪水等级

SELECT
	a.ename AS empname,
	d.dname,
	b.ename AS leadername,
	s.grade
FROM
	emp a
JOIN dept d ON a.deptno = d.DEPTNO
LEFT JOIN emp b ON a.mgr = b.empno
JOIN salgrade s ON a.sal BETWEEN s.losal
AND s.hisal
WHERE
	a.sal > (SELECT avg(sal) FROM emp);

+---------+------------+------------+-------+
| empname | dname      | leadername | grade |
+---------+------------+------------+-------+
| JONES   | RESEARCH   | KING       |     4 |
| BLAKE   | SALES      | KING       |     4 |
| CLARK   | ACCOUNTING | KING       |     4 |
| SCOTT   | RESEARCH   | JONES      |     4 |
| KING    | ACCOUNTING | NULL       |     5 |
| FORD    | RESEARCH   | JONES      |     4 |
+---------+------------+------------+-------+

24.列出与"SCOTT"从事相同工作的所有员工及部门名称

SELECT
	e.ename,
	e.job,
	d.dname
FROM
	emp e
JOIN dept d ON e.deptno = d.deptno
WHERE
	e.job = (
		SELECT
			job
		FROM
			emp
		WHERE
			ename = 'SCOTT'
	)
AND e.ename != 'SCOTT';

+-------+---------+----------+
| ename | job     | dname    |
+-------+---------+----------+
| FORD  | ANALYST | RESEARCH |
+-------+---------+----------+
MySQL的学习和练习是掌握数据库操作的关键部分。以下是一些 MySQL 相关的实践题目,涵盖了基础查询、聚合函数、排序、分页、多表连接等常见应用场景。 --- ### ### 基础查询练习 1. 查询所有员工的姓名和工资。 ```sql SELECT ename, sal FROM emp; ``` 2. 查询所有部门的编号和名称。 ```sql SELECT deptno, dname FROM dept; ``` 3. 查询工资大于 3000 的员工信息。 ```sql SELECT * FROM emp WHERE sal > 3000; ``` 4. 查询部门编号为 20 的所有员工信息。 ```sql SELECT * FROM emp WHERE deptno = 20; ``` 5. 查询职位为 "MANAGER" 或 "CLERK" 的员工姓名及其职位。 ```sql SELECT ename, job FROM emp WHERE job IN ('MANAGER', 'CLERK'); ``` --- ### ### 聚合函数分组 6. 计算每个部门的平均工资。 ```sql SELECT deptno, AVG(sal) AS avg_salary FROM emp GROUP BY deptno; ``` 7. 找总工资最高的部门。 ```sql SELECT deptno, SUM(sal) AS total_salary FROM emp GROUP BY deptno ORDER BY total_salary DESC LIMIT 1; ``` 8. 查找拥有最多员工的部门。 ```sql SELECT deptno, COUNT(*) AS employee_count FROM emp GROUP BY deptno ORDER BY employee_count DESC LIMIT 1; ``` 9. 显示每个职位的员工数量,并按数量降序排列。 ```sql SELECT job, COUNT(*) AS count FROM emp GROUP BY job ORDER BY count DESC; ``` 10. 查找平均工资高于 2500 的部门。 ```sql SELECT deptno, AVG(sal) AS avg_sal FROM emp GROUP BY deptno HAVING avg_sal > 2500; ``` --- ### ### 排序限制 11. 按照工资从高到低列所有员工。 ```sql SELECT ename, sal FROM emp ORDER BY sal DESC; ``` 12. 获取工资排名前五的员工信息。 ```sql SELECT ename, sal FROM emp ORDER BY sal DESC LIMIT 5; ``` 13. 获取工资排名在第 6 到第 10 名之间的员工。 ```sql SELECT ename, sal FROM emp ORDER BY sal DESC LIMIT 5, 5; ``` 14. 获取每个部门中工资最高的前三名员工。 ```sql SELECT e1.deptno, e1.ename, e1.sal FROM emp e1 WHERE ( SELECT COUNT(*) FROM emp e2 WHERE e1.deptno = e2.deptno AND e2.sal >= e1.sal ) <= 3 ORDER BY e1.deptno, e1.sal DESC; ``` --- ### ### 多表连接 15. 查询每个员工所在的部门名称。 ```sql SELECT e.ename, d.dname FROM emp e JOIN dept d ON e.deptno = d.deptno; ``` 16. 查询没有员工的部门。 ```sql SELECT d.deptno, d.dname FROM dept d LEFT JOIN emp e ON d.deptno = e.deptno WHERE e.empno IS NULL; ``` 17. 查询至少有两个员工的部门名称。 ```sql SELECT d.dname FROM dept d JOIN emp e ON d.deptno = e.deptno GROUP BY d.deptno HAVING COUNT(e.empno) >= 2; ``` 18. 查询“SALES”部门的所有员工信息。 ```sql SELECT e.* FROM emp e JOIN dept d ON e.deptno = d.deptno WHERE d.dname = 'SALES'; ``` --- ### ### 子查询条件判断 19. 查询比“ALLEN”工资高的员工信息。 ```sql SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename = 'ALLEN'); ``` 20. 查询工资高于本部门平均工资的员工。 ```sql SELECT e.ename, e.sal FROM emp e WHERE e.sal > ( SELECT AVG(sal) FROM emp WHERE deptno = e.deptno ); ``` 21. 查询有上级领导的员工姓名及领导姓名。 ```sql SELECT e.ename, m.ename AS manager_name FROM emp e JOIN emp m ON e.mgr = m.empno; ``` 22. 查询没有下属的员工(即不是经理的人)。 ```sql SELECT ename FROM emp WHERE empno NOT IN (SELECT DISTINCT mgr FROM emp WHERE mgr IS NOT NULL); ``` --- ### ### 分页查询 23. 实现分页查询,每页显示 5 条记录,获取第一页数据。 ```sql SELECT * FROM emp ORDER BY empno LIMIT 0, 5; ``` 24. 获取第三页数据(假设每页 5 条记录)。 ```sql SELECT * FROM emp ORDER BY empno LIMIT 10, 5; ``` 25. 分页查询员工工资排名,每页显示 10 条记录,获取第二页数据。 ```sql SELECT ename, sal FROM emp ORDER BY sal DESC LIMIT 10, 10; ``` --- ### ### 高级查询 26. 查询工资最高的员工姓名。 ```sql SELECT ename FROM emp WHERE sal = (SELECT MAX(sal) FROM emp); ``` 27. 查询工资最低的员工所在部门名称。 ```sql SELECT d.dname FROM emp e JOIN dept d ON e.deptno = d.deptno WHERE e.sal = (SELECT MIN(sal) FROM emp); ``` 28. 查询工资总和最高的部门名称。 ```sql SELECT d.dname FROM emp e JOIN dept d ON e.deptno = d.deptno GROUP BY d.deptno ORDER BY SUM(e.sal) DESC LIMIT 1; ``` 29. 查询工资排名前十但不在前五的员工信息。 ```sql SELECT ename, sal FROM emp ORDER BY sal DESC LIMIT 5, 5; ``` 30. 查询工资排名在 [5-9] 名的员工。 ```sql SELECT ename, sal FROM emp ORDER BY sal DESC LIMIT 4, 5; -- 参考引用[^1] ``` --- ### ### 综合练习 31. 查询每个部门工资最高的前两名员工。 ```sql SELECT e1.deptno, e1.ename, e1.sal FROM emp e1 WHERE ( SELECT COUNT(*) FROM emp e2 WHERE e1.deptno = e2.deptno AND e2.sal >= e1.sal ) <= 2 ORDER BY e1.deptno, e1.sal DESC; ``` 32. 查询每个部门工资总和,并按照工资总和降序排列。 ```sql SELECT deptno, SUM(sal) AS total_salary FROM emp GROUP BY deptno ORDER BY total_salary DESC; ``` 33. 查询工资排名前 10 的员工,同时显示他们的部门名称。 ```sql SELECT e.ename, e.sal, d.dname FROM emp e JOIN dept d ON e.deptno = d.deptno ORDER BY e.sal DESC LIMIT 10; ``` 34. 查询工资排名在 [3-5] 名的员工,并显示他们的职位。 ```sql SELECT ename, sal, job FROM emp ORDER BY sal DESC LIMIT 2, 3; -- 参考引用[^1] ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值