MySQL基础05 - 34道练习题

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

第一步:取得每个部门的最高薪水
select deptno,max(sal) as maxsal from emp group by deptno;
+--------+---------+
| deptno | maxsal  |
+--------+---------+
|     10 | 5000.00 |
|     20 | 3000.00 |
|     30 | 2850.00 |
+--------+---------+
第二步:将以上结果当作临时表t,t表和emp e表进行连接,条件是t.deptno = e.deptno and t.maxsal = e.sal
select 
	e.ename,t.* 
from 
	(select deptno,max(sal) as maxsal from emp group by deptno) t 
join 
	emp e 
on 
	t.deptno = e.deptno and t.maxsal = e.sal;
+-------+--------+---------+
| ename | deptno | maxsal  |
+-------+--------+---------+
| BLAKE |     30 | 2850.00 |
| SCOTT |     20 | 3000.00 |
| KING  |     10 | 5000.00 |
| FORD  |     20 | 3000.00 |
+-------+--------+---------+

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

第一步:找出每个部门的平均薪水
select deptno,avg(sal) as avgsal from emp group by deptno;
+--------+-------------+
| deptno | avgsal      |
+--------+-------------+
|     10 | 2916.666667 |
|     20 | 2175.000000 |
|     30 | 1566.666667 |
+--------+-------------+
第二步:将以上查询结果当作t表,t和emp表连接
条件:部门编号相同,并且emp的sal大于t表的avgsal。
select 
	t.*, e.ename, e.sal 
from 
	emp e 
join
	(select deptno,avg(sal) as avgsal from emp group by deptno) t 
on 
	e.deptno = t.deptno and e.sal > t.avgsal;
+--------+-------------+-------+---------+
| deptno | avgsal      | ename | sal     |
+--------+-------------+-------+---------+
|     30 | 1566.666667 | ALLEN | 1600.00 |
|     20 | 2175.000000 | JONES | 2975.00 |
|     30 | 1566.666667 | BLAKE | 2850.00 |
|     20 | 2175.000000 | SCOTT | 3000.00 |
|     10 | 2916.666667 | KING  | 5000.00 |
|     20 | 2175.000000 | FORD  | 3000.00 |
+--------+-------------+-------+---------+

3.取得部门中(所有人的)平均的薪水等级
第一步:
先确定部门中所有人的薪水等级
select 
	e.ename,e.sal,e.deptno,s.grade 
from 
	emp e 
join 
	salgrade s 
on 
	e.sal between s.losal and s.hisal;
+--------+---------+--------+-------+
| ename  | sal     | deptno | grade |
+--------+---------+--------+-------+
| SMITH  |  800.00 |     20 |     1 |
| ALLEN  | 1600.00 |     30 |     3 |
| WARD   | 1250.00 |     30 |     2 |
| JONES  | 2975.00 |     20 |     4 |
| MARTIN | 1250.00 |     30 |     2 |
| BLAKE  | 2850.00 |     30 |     4 |
| CLARK  | 2450.00 |     10 |     4 |
| SCOTT  | 3000.00 |     20 |     4 |
| KING   | 5000.00 |     10 |     5 |
| TURNER | 1500.00 |     30 |     3 |
| ADAMS  | 1100.00 |     20 |     1 |
| JAMES  |  950.00 |     30 |     1 |
| FORD   | 3000.00 |     20 |     4 |
| MILLER | 1300.00 |     10 |     2 |
+--------+---------+--------+-------+
第二步:基于以上的结果,按照deptno分组,求grade的平均值。
select 
	t.deptno,avg(t.grade) 
from 
	(select e.ename,e.sal,e.deptno,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal) t 
group by 
	t.deptno;

另外一种方式:不需要将以上结果看作临时表,直接继续分组即可。
select 
	e.deptno,avg(s.grade) 
from 
	emp e 
join 
	salgrade s 
on 
	e.sal between s.losal and s.hisal 
group by 
	e.deptno;
+--------+--------------+
| deptno | avg(t.grade) |
+--------+--------------+
|     10 |       3.6667 |
|     20 |       2.8000 |
|     30 |       2.5000 |
+--------+--------------+

4.不准用组函数(Max),取得最高薪水(给出两种解决方案)
	第一种:降序,limit 1
	select ename,sal from emp order by sal desc limit 1;
	+-------+---------+
	| ename | sal     |
	+-------+---------+
	| KING  | 5000.00 |
	+-------+---------+
	第二种:select max(sal) from emp;
	第三种:表的自连接
	a表
	 +---------+
	 | sal     |
	 +---------+
	 |  800.00 |
	 | 1600.00 |
	 | 1250.00 |
	 | 2975.00 |
	 | 1250.00 |
	 | 2850.00 |
	 | 2450.00 |
	 | 3000.00 |
	 | 5000.00 |
	 | 1500.00 |
	 | 1100.00 |
	 |  950.00 |
	 | 3000.00 |
	 | 1300.00 |
	 +---------+
	b表
	 +---------+
	 | sal     |
	 +---------+
	 |  800.00 |
	 | 1600.00 |
	 | 1250.00 |
	 | 2975.00 |
	 | 1250.00 |
	 | 2850.00 |
	 | 2450.00 |
	 | 3000.00 |
	 | 5000.00 |
	 | 1500.00 |
	 | 1100.00 |
	 |  950.00 |
	 | 3000.00 |
	 | 1300.00 |
	 +---------+
	 第一步:
	 select 
	 	distinct a.sal 
	 from  
	 	emp a 
	 join 
	 	emp  b 
	 on 
	 	a.sal < b.sal; 
	 	+---------+
		| sal     |
		+---------+
		|  800.00 |
		| 1250.00 |
		| 1500.00 |
		| 1100.00 |
		|  950.00 |
		| 1300.00 |
		| 1600.00 |
		| 2850.00 |
		| 2450.00 |
		| 2975.00 |
		| 3000.00 |
		+---------+
	 第二步:
	 select sal from emp where sal not in (select distinct a.sal from emp a join emp b on a.sal < b.sal);
	+---------+
	| sal     |
	+---------+
	| 5000.00 |
	+---------+

5.取得平均薪水最高的部门编号(至少给出两种解决方案)
第一种:先获取部门的平均薪水,然后降序,limit 1.
select 
	deptno,avg(sal) avgsal 
from 
	emp 
group by 
	deptno 
order by 
	avgsal desc 
limit 1;
+--------+-------------+
| deptno | avgsal      |
+--------+-------------+
|     10 | 2916.666667 |
+--------+-------------+
第二种:max
第一步:找出每个部门的平均薪水
	select deptno,avg(sal) avgsal from emp group by deptno;
	+--------+-------------+
	| deptno | avgsal      |
	+--------+-------------+
	|     10 | 2916.666667 |
	|     20 | 2175.000000 |
	|     30 | 1566.666667 |
	+--------+-------------+
第二步:找出以上结果中avgsal最大的值。
	select avg(sal) as avgsal from emp group by deptno;
	+-------------+
	| avgsal      |
	+-------------+
	| 2916.666667 |
	| 2175.000000 |
	| 1566.666667 |
	+-------------+
	select max(t.avgsal) from (select avg(sal) as avgsal from emp group by deptno) t;
	+---------------+
	| max(t.avgsal) |
	+---------------+
	|   2916.666667 |
	+---------------+
第三步:
	select 
		deptno,avg(sal) as avgsal 
	from 
		emp
	group by 
		deptno 
	having 
		avgsal = (select max(t.avgsal) from (select avg(sal) as avgsal from emp group by deptno) t);
	+--------+-------------+
	| deptno | avgsal      |
	+--------+-------------+
	|     10 | 2916.666667 |
	+--------+-------------+

6.取得平均薪水最高的部门的部门名称
select 
	d.dname, avg(e.sal) as avgsal 
from 
	emp e 
join 
	dept d 
on 
	e.deptno = d.deptno 
group by  
	d.dname   
order by  
	avgsal desc 
limit 1; 
+------------+-------------+
| dname      | avgsal      |
+------------+-------------+
| ACCOUNTING | 2916.666667 |
+------------+-------------+

7.求平均薪水的等级最低的部门的部门名称。

注意:
平均薪水最低,等级可能是最低。
平均薪水不是最低,但也有可能是等级最低。
因此有可能多个结果。不能按照等级排序limit获取。

第一步:找出每个部门的平均薪水
	select avg(sal) as avgsal,deptno from emp group by deptno;
	+-------------+--------+
	| avgsal      | deptno |
	+-------------+--------+
	| 2916.666667 |     10 |
	| 2175.000000 |     20 |
	| 1566.666667 |     30 |
	+-------------+--------+
第二步:找出每个部门的平均薪水的等级
	以上t表和salgrade表连接,条件:
	t.avgsal between s.losal and s.hisal
	select 
		t.*,s.grade 
	from 
		(select avg(sal) as avgsal,deptno from emp group by deptno) t 
	join 
		salgrade s 
	on 
		t.avgsal between s.losal and s.hisal;
+-------------+--------+-------+
| avgsal      | deptno | grade |
+-------------+--------+-------+
| 1566.666667 |     30 |     3 |
| 2916.666667 |     10 |     4 |
| 2175.000000 |     20 |     4 |
+-------------+--------+-------+
第三步:
抛开之前的,最低等级你怎么找?
	平均薪水最低的对应的等级一定是最低的。
	select avg(sal) as avgsal from emp group by deptno order by avgsal asc limit 1;
	+-------------+
	| avgsal      |
	+-------------+
	| 1566.666667 |
	+-------------+
	select grade from salgrade where (select avg(sal) as avgsal from emp group by deptno order by avgsal asc limit 1) between losal and hisal;
	+-------+
	| grade |
	+-------+
	|     3 |
	+-------+
第四步:
先将dept表和emp表连接,以dname分组
	select 
		t.*,s.grade 
	from 
		(select avg(e.sal) as avgsal,d.dname from emp e join dept d on e.deptno = d.deptno group by d.dname) t 
	join 
		salgrade s 
	on 
		t.avgsal between s.losal and s.hisal;
		+-------------+------------+-------+
		| avgsal      | dname      | grade |
		+-------------+------------+-------+
		| 1566.666667 | SALES      |     3 |
		| 2916.666667 | ACCOUNTING |     4 |
		| 2175.000000 | RESEARCH   |     4 |
		+-------------+------------+-------+
然后按照,where 最低等级 = 3		
	select 
		t.*,s.grade 
	from 
		(select avg(e.sal) as avgsal,d.dname from emp e join dept d on e.deptno = d.deptno group by d.dname) t 
	join 
		salgrade s 
	on 
		t.avgsal between s.losal and s.hisal 
	where 
		s.grade  = (select grade from salgrade where (select avg(sal) as avgsal from emp group by deptno order by avgsal asc limit 1) between losal and hisal);
	+-------------+-------+-------+
	| avgsal      | dname | grade |
	+-------------+-------+-------+
	| 1566.666667 | SALES |     3 |
	+-------------+-------+-------+

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

领导代码
mysql> select distinct mgr from emp;
+------+
| mgr  |
+------+
| 7902 |
| 7698 |
| 7839 |
| 7566 |
| NULL |
| 7788 |
| 7782 |
+------
员工编号没有在以上范围内的都是普通员工。
第一步:找到普通员工的最高薪水:
select max(sal) from emp where 普通员工;
select max(sal) from emp where empno not in (select distinct mgr from emp);
+----------+
| max(sal) |
+----------+
|     NULL |
+----------+
因为列表中有NULL,与NULL的任何运算结果都是NULL,影响结果。
需要手动排除NULL
not in在使用的时候,后面小括号中记得排除NULL。
select distinct mgr from emp where mgr is not null;
+------+
| mgr  |
+------+
| 7902 |
| 7698 |
| 7839 |
| 7566 |
| 7788 |
| 7782 |
+------+
select max(sal) from emp where empno not in (select distinct mgr from emp where mgr is not null);
+----------+
| max(sal) |
+----------+
|  1600.00 |
+----------+
第二步:找出高于1600的
select ename,sal from emp where sal > (select max(sal) from emp where empno not in (select distinct mgr from emp where mgr is not null));
+-------+---------+
| ename | sal     |
+-------+---------+
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| SCOTT | 3000.00 |
| KING  | 5000.00 |
| FORD  | 3000.00 |
+-------+---------+
第三步:
比”普通员工的最高薪水“还要高的一定是领导!
	没毛病!
	因为已经是普通员工的最高薪水了,还要高,一定是不是普通员工,那就是领导了。

9. 取得薪水最高的前五名员工
 select ename,sal from emp order by sal desc limit 5;
+-------+---------+
| ename | sal     |
+-------+---------+
| KING  | 5000.00 |
| SCOTT | 3000.00 |
| FORD  | 3000.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
+-------+---------+

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 |
| MARTIN | 1250.00 |
+--------+---------+

11.取得最后入职的5名员工
日期也可以降序,升序。

select ename,hiredate from emp order by hiredate desc limit 5;
+--------+------------+
| ename  | hiredate   |
+--------+------------+
| ADAMS  | 1987-05-23 |
| SCOTT  | 1987-04-19 |
| MILLER | 1982-01-23 |
| FORD   | 1981-12-03 |
| JAMES  | 1981-12-03 |
+--------+------------+

12.取得每个薪水等级有多少员工
分组count。
第一步:每个员工的薪水等级
select 
	e.ename,e.sal,s.grade 
from 
	emp e 
join 
	salgrade s 
on 
	e.sal between s.losal and s.hisal;
+--------+---------+-------+
| ename  | sal     | grade |
+--------+---------+-------+
| SMITH  |  800.00 |     1 |
| ALLEN  | 1600.00 |     3 |
| WARD   | 1250.00 |     2 |
| JONES  | 2975.00 |     4 |
| MARTIN | 1250.00 |     2 |
| BLAKE  | 2850.00 |     4 |
| CLARK  | 2450.00 |     4 |
| SCOTT  | 3000.00 |     4 |
| KING   | 5000.00 |     5 |
| TURNER | 1500.00 |     3 |
| ADAMS  | 1100.00 |     1 |
| JAMES  |  950.00 |     1 |
| FORD   | 3000.00 |     4 |
| MILLER | 1300.00 |     2 |
+--------+---------+-------+
第二步:按照grade分组,进行统计
select 
	s.grade,count(*) 
from 
	emp e 
join 
	salgrade s 
on 
	e.sal between s.losal and s.hisal 
group by 
	s.grade;
+-------+----------+
| grade | count(*) |
+-------+----------+
|     1 |        3 |
|     2 |        3 |
|     3 |        2 |
|     4 |        5 |
|     5 |        1 |
+-------+----------+

13.面试题


14.列出所有员工及领导的名字
注意是外连接
select a.ename '员工',b.ename '领导' 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   | NULL  |
| TURNER | BLAKE |
| ADAMS  | SCOTT |
| JAMES  | BLAKE |
| FORD   | JONES |
| MILLER | CLARK |
+--------+-------+
14 rows in set (0.00 sec)

15.列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称。
select 
	a.ename '员工',a.hiredate, b.ename '领导',b.hiredate,d.dname 
from 
	emp a 
join 
	emp b 
on 
	a.mgr = b.empno 
join 
	dept d 
on 
	a.deptno = d.deptno 
where 
	a.hiredate < b.hiredate;

+-------+------------+-------+------------+------------+
| 员工   | hiredate   | 领导    | hiredate   | dname      |
+-------+------------+-------+------------+------------+
| CLARK | 1981-06-09 | KING  | 1981-11-17 | ACCOUNTING |
| SMITH | 1980-12-17 | FORD  | 1981-12-03 | RESEARCH   |
| JONES | 1981-04-02 | KING  | 1981-11-17 | RESEARCH   |
| ALLEN | 1981-02-20 | BLAKE | 1981-05-01 | SALES      |
| WARD  | 1981-02-22 | BLAKE | 1981-05-01 | SALES      |
| BLAKE | 1981-05-01 | KING  | 1981-11-17 | SALES      |
+-------+------------+-------+------------+------------+

16.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。
外连接
select 
	e.*,d.*  
from 
	emp e 
right join 
	dept d 
on 
	e.deptno = d.deptno;
+-------+--------+-----------+------+------------+---------+---------+--------+--------+------------+----------+
| EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO | DEPTNO | DNAME      | LOC      |
+-------+--------+-----------+------+------------+---------+---------+--------+--------+------------+----------+
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |     10 | ACCOUNTING | NEW YORK |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |     10 | ACCOUNTING | NEW YORK |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |     10 | ACCOUNTING | NEW YORK |
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |     20 | RESEARCH   | DALLAS   |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |     30 | SALES      | CHICAGO  |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |     30 | SALES      | CHICAGO  |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |     30 | SALES      | CHICAGO  |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |     30 | SALES      | CHICAGO  |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |     30 | SALES      | CHICAGO  |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |     30 | SALES      | CHICAGO  |
|  NULL | NULL   | NULL      | NULL | NULL       |    NULL |    NULL |   NULL |     40 | OPERATIONS | BOSTON   |
+-------+--------+-----------+------+------------+---------+---------+--------+--------+------------+----------+

17.列出至少有五个员工的所有部门
按照部门编号分组,计数,筛选出>=5
select 
	deptno,count(*) 
from 
	emp 
group by 
	deptno 
having 
	count(*) >= 5;
+--------+----------+
| deptno | count(*) |
+--------+----------+
|     20 |        5 |
|     30 |        6 |
+--------+----------+
 
18.列出薪金比"SMITH"多的所有员工信息
select 
	ename,sal 
from 
	emp 
where 
	sal > (select sal from emp where ename = "SMITH");
+--------+---------+
| ename  | sal     |
+--------+---------+
| ALLEN  | 1600.00 |
| WARD   | 1250.00 |
| JONES  | 2975.00 |
| MARTIN | 1250.00 |
| BLAKE  | 2850.00 |
| CLARK  | 2450.00 |
| SCOTT  | 3000.00 |
| KING   | 5000.00 |
| TURNER | 1500.00 |
| ADAMS  | 1100.00 |
| JAMES  |  950.00 |
| FORD   | 3000.00 |
| MILLER | 1300.00 |
+--------+---------+

19.列出所有"CLERK"(办事员)的姓名及其部门名称,部门的人数。
select 
	e.ename,d.dname,d.deptno  
from 
	emp e 
join 
	dept d 
on 
	e.deptno = d.deptno 
where 
	e.job = 'CLERK';
+--------+------------+--------+
| ename  | dname      | deptno |
+--------+------------+--------+
| MILLER | ACCOUNTING |     10 |
| SMITH  | RESEARCH   |     20 |
| ADAMS  | RESEARCH   |     20 |
| JAMES  | SALES      |     30 |
+--------+------------+--------+

// 每个部门的人数?
select 
	deptno,count(*) as deptcount 
from 
	emp 
group by 
	deptno;
+--------+-----------+
| deptno | deptcount |
+--------+-----------+
|     10 |         3 |
|     20 |         5 |
|     30 |         6 |
+--------+-----------+

// 将以上两张表当做两个t表
select 
	t1.*,t2.deptcount 
from 
	(select e.ename,d.dname,d.deptno  
from emp e join dept d on e.deptno = d.deptno where e.job = 'CLERK') t1 
join 
	(select deptno,count(*) as deptcount from emp group by deptno) t2 
on 
	t1.deptno = t2.deptno;
+--------+------------+--------+-----------+
| ename  | dname      | deptno | deptcount |
+--------+------------+--------+-----------+
| MILLER | ACCOUNTING |     10 |         3 |
| SMITH  | RESEARCH   |     20 |         5 |
| ADAMS  | RESEARCH   |     20 |         5 |
| JAMES  | SALES      |     30 |         6 |
+--------+------------+--------+-----------+

20.列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数.
select job from emp group by job having min(sal) > 1500;
+-----------+
| job       |
+-----------+
| ANALYST   |
| MANAGER   |
| PRESIDENT |
+-----------+
select job,count(*) from emp group by job having min(sal) > 1500;
+-----------+----------+
| job       | count(*) |
+-----------+----------+
| ANALYST   |        2 |
| MANAGER   |        3 |
| PRESIDENT |        1 |
+-----------+----------+

21.列出在部门“SALES”<销售部>工作的员工的姓名,假定不知道销售部的部门编号。
// 先查出来部门编号
select deptno from dept where dname= "sales";
// 再根据部门编号查员工的姓名
select ename from emp where deptno = (select deptno from dept where dname= "sales");
+--------+
| ename  |
+--------+
| ALLEN  |
| WARD   |
| MARTIN |
| BLAKE  |
| TURNER |
| JAMES  |
+--------+

22. 列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,雇员的工资等级。
// 注意自连接的时候left join
select 
	e.ename '员工',d.dname,e1.ename '领导',s.grade 
from 
	emp e 
join 
	dept d 
on 
	e.deptno = d.deptno 
left join 
	emp e1 
on 
	e.mgr = e1.empno 
join 
	salgrade s 
on 
	e.sal between s.losal and s.hisal where 
	e.sal > (select avg(sal) from emp);
+-------+------------+-------+-------+
| 员工  | dname      | 领导   | 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 |
+-------+------------+-------+-------+

23.列出与"SCOTT"从事相同工作的所有员工及部门名称。
select job from emp where ename = "SCOTT";
+---------+
| job     |
+---------+
| ANALYST |
+---------+
select 
	e.ename,e.job,d.dname 
from 
	emp e 
join 
	dept d 
on 
	e.deptno = d.deptno 
where 
	job = (select job from emp where ename = "SCOTT") 
and 
	e.ename <> 'SCOTT';
+-------+---------+----------+
| ename | job     | dname    |
+-------+---------+----------+
| FORD  | ANALYST | RESEARCH |
+-------+---------+----------+

24.列出薪金等于部门30中员工的薪金的其他员工的姓名和薪金。

// 部门30中的员工薪金
select distinct sal from emp where deptno = 30;
+---------+
| sal     |
+---------+
| 1600.00 |
| 1250.00 |
| 2850.00 |
| 1500.00 |
|  950.00 |
+---------+

// 等于上面列表中的薪金且部门不为30
select ename,sal from emp where sal in (select distinct sal from emp where deptno = 30) and deptno <> 30;
Empty set (0.00 sec)

25.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金、部门名称。
select 
	max(sal) 
from 
	emp 
where 
	deptno = 30;
+----------+
| max(sal) |
+----------+
|  2850.00 |
+----------+

select 
	e.ename,e.sal,d.dname 
from 
	emp e 
join 
	dept d 
on 
	e.deptno = d.deptno 
where 
	e.sal > (select max(sal) from emp where deptno = 30);
+-------+---------+------------+
| ename | sal     | dname      |
+-------+---------+------------+
| KING  | 5000.00 | ACCOUNTING |
| JONES | 2975.00 | RESEARCH   |
| SCOTT | 3000.00 | RESEARCH   |
| FORD  | 3000.00 | RESEARCH   |
+-------+---------+------------+

26.列出每个部门工作的员工人数,平均工资和平均服务期限。
没有员工的部门人数为0
注意是右连接
服务期限:系统当前年份 - 入职年份
select d.dname,d.deptno,count(e.ename),ifnull(avg(e.sal),0) avgsal
from 
	emp e 
right join 
	dept d 
on 
	e.deptno = d.deptno  
group by 
	d.dname;
+------------+--------+----------------+-------------+
| dname      | deptno | count(e.ename) | avgsal      |
+------------+--------+----------------+-------------+
| ACCOUNTING |     10 |              3 | 2916.666667 |
| OPERATIONS |     40 |              0 |    0.000000 |
| RESEARCH   |     20 |              5 | 2175.000000 |
| SALES      |     30 |              6 | 1566.666667 |
+------------+--------+----------------+-------------+

在mysql当中怎么计算,两个日期的“年差”,差了多少年?
	timestampdiff(间隔类型,前一个日期,后一个日期)
间隔类型:
	SECOND 秒,
	MINUTE 分钟,
	HOUR 小时,
	DAY 天,
	WEEK 星期,
	MONTH 月,
	QUARTER 季度,
	YEAR 年

select timestampdiff(YEAR,hiredate,now()) from emp;
+------------------------------------+
| timestampdiff(YEAR,hiredate,now()) |
+------------------------------------+
|                                 42 |
|                                 42 |
|                                 42 |
|                                 41 |
|                                 41 |
|                                 41 |
|                                 41 |
|                                 35 |
|                                 41 |
|                                 41 |
|                                 35 |
|                                 41 |
|                                 41 |
|                                 41 |
+------------------------------------+

select 	d.dname,d.deptno,count(e.ename),ifnull(avg(e.sal),0) avgsal,ifnull(avg( timestampdiff(YEAR,e.hiredate,now())),0) avgservicetime  
from 
	emp e 
right join 
	dept d 
on 
	e.deptno = d.deptno  
group by 
	d.dname;
+------------+--------+----------------+-------------+----------------+
| dname      | deptno | count(e.ename) | avgsal      | avgservicetime |
+------------+--------+----------------+-------------+----------------+
| ACCOUNTING |     10 |              3 | 2916.666667 |        41.0000 |
| OPERATIONS |     40 |              0 |    0.000000 |         0.0000 |
| RESEARCH   |     20 |              5 | 2175.000000 |        38.8000 |
| SALES      |     30 |              6 | 1566.666667 |        41.3333 |
+------------+--------+----------------+-------------+----------------+




*/





猜你喜欢

转载自blog.csdn.net/weixin_43636084/article/details/129629408