MYSQL练习题的书写

目录

1. 题目所涉及到的三个文件

提取码:hlda

  1. 表一:雇员的信息表:emp
+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  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-04-19 | 3000.00 |    NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 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 |
+-------+--------+-----------+------+------------+---------+---------+--------+
  1. 表二:部门表:dept
+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
  1. 表三:工资等级表:salgrade
+-------+-------+-------+
| GRADE | LOSAL | HISAL |
+-------+-------+-------+
|     1 |   700 |  1200 |
|     2 |  1201 |  1400 |
|     3 |  1401 |  2000 |
|     4 |  2001 |  3000 |
|     5 |  3001 |  9999 |
+-------+-------+-------+

2. 34道题目

2.1 第一题:取得每个部门最高薪水的人员名称

	//按部门分组,在分组情况下,找出最大的薪水人
	select  max(sal) from emp group by deptno;
	//把上面一章表当做b表,原表当做a表,联合a和b两张表,查询a表中与b表的部门和薪资一样人的信息
	select a.ename,a.sal,a.deptno 
	from emp a 
		join (select  max(sal) sal from emp group by deptno) b
		on a.sal=b.sal;
//结果
+-------+---------+--------+
| ename | sal     | deptno |
+-------+---------+--------+
| BLAKE | 2850.00 |     30 |
| SCOTT | 3000.00 |     20 |
| KING  | 5000.00 |     10 |
| FORD  | 3000.00 |     20 |
+-------+---------+--------+

2.2 第二题:哪些人的薪水在部门的平均薪水之上

	//先求出平均薪水,然后找出在平均薪水上的人
	select avg(sal) from emp;
	//把找出来的人,按照薪水升序进行排列
	select ename,sal from emp where sal>(select avg(sal) from emp) order by sal;
+-------+---------+
| ename | sal     |
+-------+---------+
| CLARK | 2450.00 |
| BLAKE | 2850.00 |
| JONES | 2975.00 |
| SCOTT | 3000.00 |
| FORD  | 3000.00 |
| KING  | 5000.00 |

2.3 第三题:取得部门中(所有人的)平均的薪水等级

	//先获得平均薪资
	select avg(sal) from emp group by deptno;
	//把上面这个表作为b表,连接emp表,根据薪资等级表,查询等级
	select b.deptno, b.sal,a.grade 
	from salgrade a 
	join (select avg(sal) sal,deptno from emp group by deptno) b
	on  b.sal between losal and hisal;
	//结果
	+--------+-------------+-------+
| deptno | sal         | grade |
+--------+-------------+-------+
|     10 | 2916.666667 |     4 |
|     20 | 2175.000000 |     4 |
|     30 | 1566.666667 |     3 |
+--------+-------------+-------+

2.4 第四题:不准用组函数( Max),取得最高薪水(给出两种解决方案)

  1. 方法一:使用排序,由小到大排序,拿出第一个来
	select sal from emp order by sal desc limit 1;
  1. 方法二:自连接
    1)首先通过自连接,找出a表中小于b表中的元素,只有最大值不会小于,不会出现
    2)通过在emp中寻找不在上面查找结果中的值
    3)使用了自连接,使用了查询函数not in / in
	select sal 
	from emp 
	where sal not in(select a.sal from emp a join emp b on a.sal<b.sal);
  1. 结果
+---------+
| sal     |
+---------+
| 5000.00 |
+---------+

2.5 第五题:取得平均薪水最高的部门和部门编号(至少给出两种解决方案)

  1. 方法一:把部门平均薪水排个序,取出第一个(不适合当多个平均薪资出现并列第一的情况)
	//先获取各部门的平均薪资,然后从大到小排序,取出第一个,即得到了平均薪资最高的薪资和部门边号
		select avg(sal) sal,deptno 
		from emp 
		group by deptno 
		order by avg(sal) desc 
		limit 0,1;
  1. 方法二:把部门平均薪水排个序,取出值与第一个相同的部门
	select avg(sal),deptno 
	from emp 
	group by deptno 
	having avg(sal)=(select avg(sal)
		from emp 
		group by deptno 
		order by avg(sal) desc 
		limit 0,1);
	//结果
+-------------+--------+
| sal         | deptno |
+-------------+--------+
| 2916.666667 |     10 |
+-------------+--------+

2.6 第六题:取得平均薪水最高的部门名称

  1. 首先分组求出部门的平均薪资,并且找出最低的薪水的部门编号
  2. 连接部门表,根据部门的编号,找出部门的名称
  3. 注意思路,一步步写就不会出现问题,如果有一个大的from就是用一个表去取别名。
	//1)分组求出部门的平均薪水
	select avg(sal) avgsal, deptno from emp group by deptno;
	//2)找到平均薪水最低的薪水和部门编号
	select avgsal minavgsal,deptno 
	from (select avg(sal) avgsal, Deptno 
		from emp 
		group by deptno
		having avgsal=(select avg(sal) avgsal from emp group by deptno order by avg(sal) desc limit 0,1)
		) as a;
+-------------+--------+
| minavgsal   | deptno |
+-------------+--------+
| 2916.666667 |     10 |
+-------------+--------+
	//3)连接部门表,根据部们编号找到对应的部门名称
	select a.avgsal minavgsal,a.deptno,b.dname 
	from ( select avg(sal) avgsal, deptno 
			from emp 
			group by deptno 
			having avgsal=(select avg(sal) avgsal from emp group by deptno order by avg(sal) desc limit 0,1)
			 )as a
		join dept b
		on a.deptno=b.deptno;
+-------------+--------+------------+
| minavgsal   | deptno | dname      |
+-------------+--------+------------+
| 2916.666667 |     10 | ACCOUNTING |
+-------------+--------+------------+

2.7 第七题:求平均薪水的等级最低的部门的部门名称

  1. 首先等级最低的部门不止一个
  2. 首先按部门分组求得部门的平均薪资
	select avg(sal) avgsal,deptno from emp group by deptno;
  1. 连接部门等级表,求得平均薪资的等级
	select a.avgsal,a.deptno,b.grade,c.dname
	from (select avg(sal) avgsal,deptno from emp group by deptno) as a
			join salgrade b
			on a.avgsal between b.losal and b.hisal;
			join dept c
			on a.deptno=c.deptno
  1. 从上面表中找到最低平均薪水的部门编号,然后在根据部门标号,在上面表中找出对应标号的部门
	select avgsal,deptno,grade
	from (select a.avgsal,a.deptno,b.grade
			from (select avg(sal) avgsal,deptno from emp group by deptno) as a
			join salgrade b
			on a.avgsal between b.losal and b.hisal
			)as a
	where grade=(select grade
	 from (select a.avgsal,a.deptno,b.grade
			from (select avg(sal) avgsal,deptno from emp group by deptno) as a
			join salgrade b
			on a.avgsal between b.losal and b.hisa
			)as b order by grade limit 0,1);

	select avgsal,deptno,grade,dname
	from (select a.avgsal,a.deptno,b.grade,c.dname
			from (select avg(sal) avgsal,deptno from emp group by deptno) as a
			join salgrade b
			on a.avgsal between b.losal and b.hisal
			join dept c
			on a.deptno=c.deptno
			)as a
	where grade=(select grade
	 from (select a.avgsal,a.deptno,b.grade,c.dname
			from (select avg(sal) avgsal,deptno from emp group by deptno) as a
			join salgrade b
			on a.avgsal between b.losal and b.hisal
			join dept c
			on a.deptno=c.deptno
			)as a order by grade limit 0,1);
+-------------+--------+-------+-------+
| avgsal      | deptno | grade | dname |
+-------------+--------+-------+-------+
| 1566.666667 |     30 |     3 | SALES |
+-------------+--------+-------+-------+		

2.8 第八题:取得比普通员工(员工代码没有在 mgr 字段上出现的)的最高薪水还要高的领导人姓名

2.9 第九题:取得薪水最高的前五名员工

取得薪水最高的前五名员工

	//首先取出薪水,然后按工资进行排序,从大到小排,之后只取出五个
	select ename,sal from emp order by sal desc limit 5;
+-------+---------+
| ename | sal     |
+-------+---------+
| KING  | 5000.00 |
| FORD  | 3000.00 |
| SCOTT | 3000.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
+-------+---------+

2.10 第十题:取得薪水最高的第六到第十名员工

取得薪水最高的第六到第十名员工

	select ename,sal from emp order by sal desc limit 5,5;
+--------+---------+
| ename  | sal     |
+--------+---------+
| CLARK  | 2450.00 |
| ALLEN  | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
| WARD   | 1250.00 |
+--------+---------+

2.11 第十一题:取得最后入职的 5 名员工

取得最后入职的 5 名员工

	select ename,hiredate from emp order by hiredate limit 5;
+-------+------------+
| ename | hiredate   |
+-------+------------+
| SMITH | 1980-12-17 |
| ALLEN | 1981-02-20 |
| WARD  | 1981-02-22 |
| JONES | 1981-04-02 |
| BLAKE | 1981-05-01 |
+-------+------------+

2.12 第十二题:取得每个薪水等级有多少员工

取得每个薪水等级有多少员工

	//1. 新建一张表,得到员工的名字和薪资水平等级
	select a.ename,a.sal,b.grade
	from emp a
		join salgrade b
		on a.sal between b.losal and b.hisal
	
	//2)把上面这张表根据等级进行分组,然后再统计个数
	select grade,counts(*) number 
	from (select a.ename,a.sal,b.grade
			from emp a
			join salgrade b
			on a.sal between b.losal and b.hisal
			) a
	group by grade;
		

2.13 面试题

2.14 第十四题:列出所有员工及领导的姓名

列出所有员工及领导的姓名

  1. 通过自连接,列出员工的名字和领导的名字(采用外连接,把员工表作为主表)
	select a.ename '雇员', ifnull(b.ename,'noboss')  '老板'
	from emp a
		left join emp b
		on a.mgr=b.empno;
+--------+--------+
| 雇员   | 老板   |
+--------+--------+
| SMITH  | FORD   |
| ALLEN  | BLAKE  |
| WARD   | BLAKE  |
| JONES  | KING   |
| MARTIN | BLAKE  |
| BLAKE  | KING   |
| CLARK  | KING   |
| SCOTT  | JONES  |
| KING   | noboss |
| TURNER | BLAKE  |
| ADAMS  | SCOTT  |
| JAMES  | BLAKE  |
| FORD   | JONES  |
| MILLER | CLARK  |
+--------+--------+

2.15 第十五题:列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称

  1. 日期进行比较,使用函数DATEDIFF(day, time1 , time2)
  2. 首先通过自连接,找出员工和老板的对应,然后进行筛选,根据日期比较函数
	select a.empno,a.ename,c.dname
	from emp a
		join emp b
		on a.mgr=b.empno
		join dept c
		on a.deptno=c.deptno
	where a.hiredate< b.hiredate;
	select a.empno,a.ename,c.dname
	from emp a
		join emp b
		on a.mgr=b.empno
		join dept c
		on a.deptno=c.deptno
	where a.hiredate< b.hiredate;

2.16 第十六题:列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门

  1. 部门和员工之间进行关联,同时以部门为主表
select b.dname,a.* 
from emp a right 
	join dept b 
	on a.deptno=b.deptno;
order by dname;
+------------+-------+--------+-----------+------+------------+---------+---------+--------+
| dname      | EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
+------------+-------+--------+-----------+------+------------+---------+---------+--------+
| ACCOUNTING |  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
| ACCOUNTING |  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
| ACCOUNTING |  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
| OPERATIONS |  NULL | NULL   | NULL      | NULL | NULL       |    NULL |    NULL |   NULL |
| RESEARCH   |  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
| RESEARCH   |  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
| RESEARCH   |  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
| RESEARCH   |  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
| RESEARCH   |  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
| SALES      |  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
| SALES      |  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
| SALES      |  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
| SALES      |  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
| SALES      |  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
| SALES      |  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
+------------+-------+--------+-----------+------+------------+---------+---------+--------+

2.17 第十七题:列出至少有 5 个员工的所有部门

  1. 首先把emp根据部门进行分组,统计个数,然后找出个数大于5的部门名字来
	select deptno,count(*) number
	from emp 
	group by deptno
	having number>=5
  1. 把上表连接部门表,找出名字
select b.dname,a.number
from (select deptno,count(*) number
		from emp 
		group by deptno
		having number>=5
		)as a
		join dept b
		on a.deptno=b.deptno
+----------+--------+
| dname    | number |
+----------+--------+
| RESEARCH |      5 |
| SALES    |      6 |
+----------+--------+

2.18 第十八题:列出薪金比"SMITH"多的所有员工信息.

	select * 
	from emp 
	where sal>(select sal from emp where ename='smith');
+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  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-04-19 | 3000.00 |    NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 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 |
+-------+--------+-----------+------+------------+---------+---------+--------+
	

2.19 第十九题:列出所有"CLERK"(办事员)的姓名及其部门名称,部门的人数

  1. 得到一张表,统计部门的编号和部门的人数
	select deptno,count(*) number 
	from emp
	group by deptno
  1. 得到一张表,统计部门的编号,名称和部门的人数
	select c.ename,c.deptno,a.number,b.dname
	from (select deptno,count(*) number 
		from emp
		group by deptno
		) a
		join dept b
		on a.deptno=b.deptno
		join emp c
		on c.deptno=a.deptno
	where c.job='CLERK';
+--------+--------+--------+------------+
| ename  | deptno | number | dname      |
+--------+--------+--------+------------+
| SMITH  |     20 |      5 | RESEARCH   |
| ADAMS  |     20 |      5 | RESEARCH   |
| JAMES  |     30 |      6 | SALES      |
| MILLER |     10 |      3 | ACCOUNTING |
+--------+--------+--------+------------+	

2.20 第二十题:列出最低薪金大于 1500 的各种工作及从事此工作的全部雇员人数

  1. 按工作进行分组,工作的最低薪金,工作的名称和工作的人数
	select job,count(*)number, min(sal) minsal from emp group by job having minsal>1500

2.21 第二十一题:列出在部门"SALES"<销售部>工作的员工的姓名,假定不知道销售部的部门编号.

	select ename from emp where deptno=(select deptno from dept where dname='SALES');
+--------+
| ename  |
+--------+
| ALLEN  |
| WARD   |
| MARTIN |
| BLAKE  |
| TURNER |
| JAMES  |
+--------+

2.22 第二十二题:列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,雇员的工资等级.

  1. 需要联合三张表的信息
  2. 首先计算出公司的平均薪金,然后作为where条件,连接三张表
	select a.ename 'emp', ifnull(b.ename,'wu')  'boss', c.dname 'deptname', d.grade 'grade'
	from emp a
		left  join emp b
		on a.mgr=b.empno
		join dept c
		on a.deptno=c.deptno
		join salgrade d
		on a.sal between d.losal and d.hisal
	where a.sal>(select avg(sal) from emp)
+-------+-------+------------+-------+
| emp   | boss  | deptname   | grade |
+-------+-------+------------+-------+
| JONES | KING  | RESEARCH   |     4 |
| BLAKE | KING  | SALES      |     4 |
| CLARK | KING  | ACCOUNTING |     4 |
| SCOTT | JONES | RESEARCH   |     4 |
| KING  | wu    | ACCOUNTING |     5 |
| FORD  | JONES | RESEARCH   |     4 |
+-------+-------+------------+-------+

2.23 第二十三题:列出与"SCOTT"从事相同工作的所有员工及部门名称(不包括scott了)

  1. 找出scott从事的工作
  2. 建立一张表,找到员工,工作和部门
	//1)找到scott从事的工作
	select job from emp where ename='scott';
	//2.连接表一和表二,根据工作名字,找到对应的人和部门名称
	select a.ename,a.job,b.dname
	from emp a
		join dept b
		on a.deptno=b.deptno
	where a.job=(select job from emp where ename='scott') and a.ename <>'scott';
+-------+---------+----------+
| ename | job     | dname    |
+-------+---------+----------+
| FORD  | ANALYST | RESEARCH |
+-------+---------+----------+

2.24 第二十四题:列出与"SCOTT"从事相同工作的所有员工及部门名称(不包括scott了)

2.25 第二十五题:列出薪金高于在部门 30 工作的所有员工的薪金的员工姓名和薪金.部门名

  1. 首先得到在部门30工作所有员工的最高薪金
select max(sal) from emp where deptno=30;
  1. 连接emp和dept两张表
select a.ename,a.sal,b.dname
from emp a
	join dept b
	on a.deptno=b.deptno
where sal>(select max(sal) from emp where deptno=30);

2.26 第二十六题:列出在每个部门工作的员工数量,平均工资

	select a.dname, b.count(*) number, b.avg(sal) 
	from dept a
		join (select  deptno, count(*) number, avg(sal) 
			from emp group by deptno) b
		on a.deptno=b.deptno
+------------+--------+-------------+
| dname      | number | avgsal      |
+------------+--------+-------------+
| ACCOUNTING |      3 | 2916.666667 |
| RESEARCH   |      5 | 2175.000000 |
| SALES      |      6 | 1566.666667 |
+------------+--------+-------------+

2.27 第二十七题:列出所有员工的姓名、部门名称和工资。

select a.ename,a.sal,b.dname
from emp a
join dept b
on a.deptno=b.deptno
+--------+---------+------------+
| ename  | sal     | dname      |
+--------+---------+------------+
| SMITH  |  800.00 | RESEARCH   |
| ALLEN  | 1600.00 | SALES      |
| WARD   | 1250.00 | SALES      |
| JONES  | 2975.00 | RESEARCH   |
| MARTIN | 1250.00 | SALES      |
| BLAKE  | 2850.00 | SALES      |
| CLARK  | 2450.00 | ACCOUNTING |
| SCOTT  | 3000.00 | RESEARCH   |
| KING   | 5000.00 | ACCOUNTING |
| TURNER | 1500.00 | SALES      |
| ADAMS  | 1100.00 | RESEARCH   |
| JAMES  |  950.00 | SALES      |
| FORD   | 3000.00 | RESEARCH   |
| MILLER | 1300.00 | ACCOUNTING |
+--------+---------+------------+

2.28 第二十八题:列出所有部门的详细信息和人数

  1. 统计部门的编号的人数
select a.*, b.number
from dept a
left join (select deptno ,count(*) number
	from emp group by deptno) b
on a.deptno=b.deptno
+--------+------------+----------+--------+
| DEPTNO | DNAME      | LOC      | number |
+--------+------------+----------+--------+
|     10 | ACCOUNTING | NEW YORK |      3 |
|     20 | RESEARCH   | DALLAS   |      5 |
|     30 | SALES      | CHICAGO  |      6 |
|     40 | OPERATIONS | BOSTON   |   NULL |
+--------+------------+----------+--------+

2.29 第二十九题:列出各种工作的最低工资及从事此工作的雇员姓名

  1. 求出各中工作的最低工资
  2. 使用in运算符,包含在里面的值输出
select * from emp where sal in (select  min(sal) from emp group by job);
+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
+-------+--------+-----------+------+------------+---------+---------+--------+

2.30 第三十题:列出各个部门的 MANAGER(领导)的最低薪金

select  min(sal), deptno from emp where job='MANAGER' group by deptno;
+----------+--------+
| min(sal) | deptno |
+----------+--------+
|  2450.00 |     10 |
|  2975.00 |     20 |
|  2850.00 |     30 |
+----------+--------+

2.31 第三十一题:列出所有员工的年工资,按年薪从低到高排序

select ename,(sal+ifnull(comm,0))*12 yearsal from emp order by yearsal;
+--------+----------+
| ename  | yearsal  |
+--------+----------+
| SMITH  |  9600.00 |
| JAMES  | 11400.00 |
| ADAMS  | 13200.00 |
| MILLER | 15600.00 |
| TURNER | 18000.00 |
| WARD   | 21000.00 |
| ALLEN  | 22800.00 |
| CLARK  | 29400.00 |
| MARTIN | 31800.00 |
| BLAKE  | 34200.00 |
| JONES  | 35700.00 |
| SCOTT  | 36000.00 |
| FORD   | 36000.00 |
| KING   | 60000.00 |
+--------+----------+

2.32 第三十二题:求出员工领导的薪水超过 3000 的员工名称与领导名称

select a.ename,a.sal ,b.ename,b.sal
	from emp a
	join emp b
	on a.mgr=b.empno
where b.sal>3000
+-------+---------+-------+---------+
| ename | sal     | ename | sal     |
+-------+---------+-------+---------+
| JONES | 2975.00 | KING  | 5000.00 |
| BLAKE | 2850.00 | KING  | 5000.00 |
| CLARK | 2450.00 | KING  | 5000.00 |
+-------+---------+-------+---------+

2.33 第三十三题:求出部门名称中,带’S’字符的部门员工的工资合计、部门人数

  1. 部门员工合计和部门人数
select a.dname,b.sum,b.number 
from dept a
	join (select deptno, count(*) number, sum(sal) sum from emp group by deptno
	)b
	on a.deptno =b.deptno
where a.dname like '%S%'
+----------+----------+--------+
| dname    | sum      | number |
+----------+----------+--------+
| RESEARCH | 10875.00 |      5 |
| SALES    |  9400.00 |      6 |
+----------+----------+--------+

2.34 第三十四题:给任职日期超过 30 年的员工加薪 10%

  1. 使用时间计算函数:TimeStampDiff(YEAR,hiredate,now())
update emp set sal = sal * 1.1 where TimeStampDiff(YEAR,hiredate,now())>30;
select * from emp;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值