欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

mysql练习题 -- 第一天

程序员文章站 2024-03-30 19:59:57
表信息dept 部门表字段DEPTNO 部门编号DNAME 部门名称LOC 位置emp 员工表字段EMPNO 员工编号ENAME 员工名称JOB 职位MGR 上级HIREDATE 入职时间SAL 薪水COMM 奖金DEPTNO 部门编号salgrade 薪水等级表字段GRADE 等级编号LOSAL 最低薪水HISAL 最高薪水文件下载: xxxxx1. 取得每个部门最高薪水的人员名称第一步: 取得每个部门最高薪水 [按照部门编号....
  • 表信息

dept 部门表

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

emp 员工表

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

salgrade 薪水等级表

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

文件下载: https://download.csdn.net/download/eebaicai/12626751

1. 取得每个部门最高薪水的人员名称

第一步: 取得每个部门最高薪水 [按照部门编号分组求最大值]

SELECT deptno, MAX(sal) as maxsal FROM emp GROUP BY deptno;

第二步: 将上面的查询结果当作临时表t, t表和emp e表进行表连接
条件: t.deptno = e.deptno AND t.maxsal = e.sal

SELECT
	e.ename,
	t.*
FROM
	emp e
JOIN (
	SELECT
		deptno,
		MAX(sal) AS maxsal
	FROM
		emp
	GROUP BY
		deptno
) t ON t.deptno = e.deptno
AND t.maxsal = e.sal;

2. 哪些人的薪水在部门的平均薪水之上

第一步: 找出部门的平均薪水 按照部门编号分组求平均值]

SELECT
	deptno,
	avg(sal) as avgsal
FROM
	emp
GROUP BY
	deptno;

第二步: 将上面的查询结果当作临时表t, t表和emp e表进行表连接
条件: t.deptno = e.deptno AND e.sal > t.avgsal

SELECT
	e.ename,
	e.sal,
	t.*
FROM
	emp e
JOIN (
	SELECT
		deptno,
		avg(sal) AS avgsal
	FROM
		emp
	GROUP BY
		deptno
) t ON t.deptno = e.deptno
AND e.sal > t.avgsal;

3. 取得部门中(所有人的)平均的薪水等级

(就是薪水等级的平均值)
第一步: 取得每个员工的薪水等级

SELECT
	e.ename,
	e.sal,
	e.deptno,
	s.grade
FROM
	emp e
JOIN salgrade s ON e.sal BETWEEN s.losal
AND hisal

第二步: 在上面的基础之上,按部门编号分组,求等级的平均值

SELECT
	e.ename,
	e.sal,
	e.deptno,
	avg(s.grade)
FROM
	emp e
JOIN salgrade s ON e.sal BETWEEN s.losal
AND hisal
GROUP BY
	e.deptno;

4. 取得部门中(所有人的)平均薪水的等级

第一步: 取得部门的平均薪水

SELECT
	deptno,
	avg(sal) as avgsal
FROM
	emp
GROUP BY
	deptno;

第二步: 将上面的查询结果当作临时表t, t表和salgrade s表进行表连接
条件: t.avgsal between s.losal and s.hisal

SELECT
	 s.grade,
	 t.*
FROM
	salgrade s
JOIN (
	SELECT
		deptno,
		avg(sal) AS avgsal
	FROM
		emp
	GROUP BY
		deptno
) t ON t.avgsal BETWEEN s.losal
AND s.hisal;

5. 不准用组函数(max),取得最高薪水(给出两种解决方案)

第一种: 按照薪水降序排列,取第一个

SELECT
	sal
FROM
	emp
ORDER BY
	sal DESC
LIMIT 1;

第二种: 自连接

SELECT
	a.sal
FROM
	emp a
JOIN emp b ON a.sal < b.sal;

上面的结果,肯定没有5000的
然后

SELECT
	sal
FROM
	emp
WHERE
	sal NOT IN (
		SELECT DISTINCT
			a.sal
		FROM
			emp a
		JOIN emp b ON a.sal < b.sal
	);

本文地址:https://blog.csdn.net/eebaicai/article/details/107372268

相关标签: mysql