分享一波sql測試題及自己寫的sql答案, 如果有更好的sql寫法, 歡迎批評指正
部門表 dept:
DEPTNO DNAME LOC
10,ACCOUNTING,NEW YORK
20,RESEARCH,DALLAS
30,SALES,CHICAGO
40,OPERATIONS,BOSTON
員工表 emp:
EMPNO, ENAME, JOB, MGR, HIREDATE, SAL,COMM,DEPTNO
7369,SMITH,CLERK,7902,1980-12-17,800,null,20
7499,ALLEN,SALESMAN,7698,1981-02-20,1600,300,30
7521,WARD,SALESMAN,7698,1981-02-22,1250,500,30
7566,JONES,MANAGER,7839,1981-04-02,2975,null,20
7654,MARTIN,SALESMAN,7698,1981-09-28,1250,1400,30
7698,BLAKE,MANAGER,7839,1981-05-01,2850,null,30
7782,CLARK,MANAGER,7839,1981-06-09,2450,null,10
7788,SCOTT,ANALYST,7566,1987-04-19,3000,null,20
7839,KING,PRESIDENT,null,1981-11-17,5000,null,10
7844,TURNER,SALESMAN,7698,1981-09-08,1500,0,30
7876,ADAMS,CLERK,7788,1987-05-23,1100,null,20
7900,JAMES,CLERK,7698,1981-12-03,950,null,30
7902,FORD,ANALYST,7566,1981-12-02,3000,null,20
7934,MILLER,CLERK,7782,1982-01-23,1300,null,10
需求:
- 查詢出 JONES 的領(lǐng)導(dǎo)是誰(JONES 向誰報(bào)告)。
- JONES 領(lǐng)導(dǎo)誰。(誰向JONES 報(bào)告)。
- 查詢各職位的員工工資的最大值,最小值,平均值,總和
- 選擇具有各個(gè)job 的員工人數(shù)(提示:對job 進(jìn)行分組)
- 查詢員工最高工資和最低工資的差距,列名為DIFFERENCE;
- 查詢各個(gè)管理者屬下員工的最低工資,其中最低工資不能低于 800,沒有管理者的員工不計(jì)算在內(nèi)
- 查詢所有部門的部門名字dname,所在位置loc,員工數(shù)量和工資平均值;
- 查詢和scott 相同部門的員工姓名ename 和雇用日期hiredate
- 查詢工資比公司平均工資高的所有員工的員工號 empno,姓名ename 和工資sal。
- 查詢和姓名中包含字母u 的員工在相同部門的員工的員工號 empno 和姓名ename
- 查詢在部門的loc 為 newYork 的部門工作的員工的員工姓名ename,部門名稱 dname 和崗位名稱job
- 查詢管理者是king 的員工姓名 ename 和工資sal
- 顯示Operations 部門有哪些職位
- 各個(gè)部門中工資大于1500的員工人數(shù)
- 哪些員工的工資,高于整個(gè)公司的平均工資,列出員工的名字和工資(降序)
- 所在部門平均工資高于1500的員工名字
- 列出各個(gè)部門中工資最高的員工的信息:名字、部門號、工資
- 哪個(gè)部門的平均工資是最高的,列出部門號、平均工資
=======================
數(shù)據(jù)準(zhǔn)備
create table if not exists dept(
deptno int,
dname varchar(20),
loc varchar(20)
);
insert into dept values (10,'ACCOUNTING','NEW YORK');
insert into dept values (20,'RESEARCH','DALLAS');
insert into dept values (30,'SALES','CHICAGO');
insert into dept values (40,'OPERATIONS','BOSTON');
create table if not exists emp(
empno int,
ename varchar(20),
job varchar(20),
mgr int,
hiredate date,
sal double,
comm double,
deptno int
);
insert into emp values ( 7369,'SMITH','CLERK',7902,'1980-12-17',800,null,20);
insert into emp values (7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30 );
insert into emp values ( 7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
insert into emp values ( 7566,'JONES','MANAGER',7839,'1981-04-02',2975,null,20);
insert into emp values ( 7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
insert into emp values ( 7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,null,30);
insert into emp values (7782,'CLARK','MANAGER',7839,'1981-06-09',2450,null,10 );
insert into emp values ( 7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,null,20);
insert into emp values ( 7839,'KING','PRESIDENT',null,'1981-11-17',5000,null,10);
insert into emp values ( 7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
insert into emp values ( 7876,'ADAMS','CLERK',7788,'1987-05-23',1100,null,20);
insert into emp values (7900,'JAMES','CLERK',7698,'1981-12-03',950,null,30 );
insert into emp values ( 7902,'FORD','ANALYST',7566,'1981-12-02',3000,null,20);
insert into emp values ( 7934,'MILLER','CLERK',7782,'1982-01-23',1300,null,10);
==================================
答案
1. 查詢出 JONES 的領(lǐng)導(dǎo)是誰(JONES 向誰報(bào)告)。
select ename
from emp
where empno in ( select mgr from emp where ename = 'JONES' );
2. JONES 領(lǐng)導(dǎo)誰。(誰向JONES 報(bào)告)。
select ename
from emp
where mgr in ( select empno from emp where ename = 'JONES' );
3. 查詢各職位的員工工資的最大值,最小值,平均值,總和
SELECT job,min(sal) min, max(sal) max, avg(sal) avg, sum(sal) sum
from emp
group by job ;
4. 選擇具有各個(gè) job 的員工人數(shù)(提示:對job 進(jìn)行分組)
SELECT job,count(distinct empno) count
from emp
group by job ;
5. 查詢員工最高工資和最低工資的差距,列名為 DIFFERENCE ;
select max(sal)-min(sal) as DIFFERENCE
from emp ;
6. 查詢各個(gè)管理者屬下員工的最低工資,其中最低工資不能低于 800 ,沒有管理者的員工不計(jì)算在內(nèi)
select a.empno, a.ename, b.min
from
emp a
inner join
(
SELECT mgr, min(sal) min
from emp
where mgr is not null
group by mgr
having min(sal) >= 800
) b
on a.empno = b.mgr ;
7. 查詢所有部門的部門名字 dname ,所在位置 loc ,員工數(shù)量和工資平均值;
select min(a.dname) dname, min(a.loc) loc, count(b.empno) count, avg(b.sal) avg
from
dept a left join emp b
on a.deptno = b.deptno
group by a.deptno ;
8. 查詢和 scott 相同部門的員工姓名 ename 和雇用日期 hiredate
select a.deptno,a.ename,a.hiredate
from
emp a
join
(
select deptno
from emp
where emp.ename = 'scott'
) b
on a.deptno = b.deptno and a.ename != 'scott';
9. 查詢工資比公司平均工資高的所有員工的員工號 empno,姓名ename 和工資sal
select a.empno,a.ename,a.sal,b.sal
from
emp a
join
( select avg(sal) sal from emp ) b
on a.sal > b.sal ;
10. 查詢和姓名中包含字母 u 的員工在相同部門的員工的員工號 empno 和姓名ename
select a.empno,a.ename,a.deptno
from
emp a
inner join
(
select ename,deptno
from emp
where ename like '%u%'
) b
on a.deptno = b.deptno and a.ename != b.ename ;
11. 查詢在部門的loc 為 newYork 的部門工作的員工的員工姓名ename,部門名稱 dname 和崗位名稱job
select
a.ename, b.dname, a.job
from
emp a
join
(
select deptno, dname
from dept
where loc = 'NEW YORK'
) b
on a.deptno = b.deptno ;
12. 查詢管理者是 king 的員工姓名 ename 和工資sal
SELECT
a.ename, a.sal
from
emp a
join
(
select empno from emp where ename = 'king'
) b
on a.mgr = b.empno;
13. 顯示 Operations 部門有哪些職位
select
a.job
from
emp a
join
( select deptno from dept where dname = 'Operations' ) b
on a.deptno = b.deptno
group by a.job ;
14. 各個(gè)部門中工資大于1500的員工人數(shù)
select
b.deptno, count(distinct a.ename) count
from
dept b
left join
(select ename,deptno from emp where sal > 1500 ) a
on a.deptno = b.deptno
group by b.deptno ;
15. 哪些員工的工資,高于整個(gè)公司的平均工資,列出員工的名字和工資(降序)
select
a.ename, a.sal, b.avgsal
from
emp a
join
(select avg(sal) avgsal from emp ) b
on a.sal > b.avgsal
order by a.sal desc ;
16. 所在部門平均工資高于2000的員工名字
select
a.ename, a.sal , a.deptno
from
emp a
join
(select deptno from emp group by deptno having avg(sal) > 2000 ) b
on a.deptno = b.deptno ;
17. 列出各個(gè)部門中工資最高的員工的信息:名字、部門號、工資
select
a.deptno, a.ename, a.sal
from
emp a
join
(select deptno,max(sal) sal from emp group by deptno ) b
on a.deptno = b.deptno and a.sal = b.sal ;
18. 哪個(gè)部門的平均工資是最高的,列出部門號、平均工資
select
deptno, avg(sal) avgsal
from emp
group by deptno
order by avgsal desc
limit 1 ;