- MySQL中的TOP-N語句
- limit后start, count
select *
from emp
order by sal
limit 0, 5
- MySQL中分頁公式
select *
from emp
limit (pageIndex-1)*pageSize, pageSize
練習1.1 查詢入職日期最早的員工姓名,入職日期。
select ename, hiredate
from emp
where hiredate=
(select min(hiredate)
from emp )
1.2 查詢工資比SMITH工資高并且工作地點在CHICAGO的員工姓名,工資,部門名稱。
select e.ename, e.sal, d.dname
from emp e
join dept d on e.deptno=d.deptno
where e.sal>
(select sal
from emp
where ename='SMITH')
and d.loc='CHICAGO'
1.3 查詢入職日期比20部門入職日期最早的員工還要早的員工姓名,入職日期。
select ename, hiredate
from emp
where hiredate<
(select min(hiredate)
from emp
where deptno=20)
1.4 查詢部門人數大于所有部門平均人數的部門編號,部門名稱,部門人數。
select e.deptno, d.dname, count(e.deptno)
from emp e
join dept d on e.deptno=d.deptno
group by e.deptno, d.dname
having count(e.deptno)>
(select avg(count(deptno))
from emp
group by deptno)
練習2.1 查詢入職日期比10部門任意一個員工晚的員工姓名、入職日期,不包括10部門員工。
select ename, hiredate
from emp
where hiredate>any
(select hiredate
from emp
where deptno=10)
and deptno<>10
2.2 查詢入職日期比10部門所有員工晚的員工姓名、入職日期,不包括10部門員工。
select ename, hiredate
from emp
where hiredate>all
(select hiredate
from emp
where deptno=10)
and deptno<>10
2.3 查詢職位和10部門任意一個員工職位相同的員 工姓名,職位,不包括10部門員工。
select ename, job
from emp
where job=any
(select job
from emp
where deptno=10)
and deptno<>10
練習3.1 查詢職位及經理和10部門任意一個員工職位及經理相同的員工姓名,職位,不包括10部門員工。
select ename, job
from emp
where (job,mgr)in
(select job, mgr
from emp
where deptno=10)
and deptno<>10
3.2 查詢職位及經理和10部門任意一個員工職位或經理相同的員工姓名,職位,不包括10部門員工。
select ename, job
from emp
where job in
(select job
from emp
where deptno=10)
or mgr in
(select mgr
from emp
where deptno=10)
and deptno<>10
查詢比自己部門平均工資高的員工姓名,工資,
部門編號,部門平均工資
select e.ename, e.sal, e.deptno, d.salavg
from emp e
join (select deptno, avg(sal) salavg
from emp
group by deptno ) d
on e.deptno=d.deptno
where d.salavg<e.sal
練習4.1 查詢比自己職位平均工資高的員工姓名、職位,部門名稱,職位平均工資。
select e.ename, e.job, d.dname, b.job_avgsal
from emp e
join (select job, avg(sal) job_avgsal
from emp
group by job) b
on e.job=b.job
and e.sal>b.job_avgsal
join dept d on e.deptno=d.deptno
4.2 查詢職位和經理同員工SCOTT或BLAKE完全相同的員工姓名、職位,不包括SCOTT和BLAKE本人。
select e.ename, e.job
from emp e
where (e.job, e.mgr) in
(select job, mgr
from emp
where ename in ('SCOTT', 'BLAKE'))
and e.ename not in ('SCOTT','BLAKE')
4.3 查詢不是經理的員工姓名。
select ename
from emp
where empno not in
(select mgr
from emp
where mgr is not null)
練習5.1 查詢入職日期最早的前5名員工姓名,入職日期。
select rownum, ename,hiredate
from (select ename,hiredate
from emp
order by hiredate asc)
where rownum<=5
5.2 查詢工作在CHICAGO并且入職日期最早的前2名的員工姓名,入職日期。
select rownum, ename, hiredate
from (select deptno, ename, hiredate
from emp
order by hiredate asc) e
join dept d on e.deptno=d.deptno
and d.loc='CHICAGO'
where rownum<=2
練習6 按照每頁顯示5條記錄,分別查詢第1頁,第2 頁,第3頁信息,要求顯示員工姓名、入職日期 、部門名稱。
select *
from (select rownum rn, e.ename, e.hiredate, d.dname
from emp e
join dept d on e.deptno=d.deptno
where rownum<=5)
where rn>0;
select *
from (select rownum rn, e.ename, e.hiredate, d.dname
from emp e
join dept d on e.deptno=d.deptno
where rownum<=10)
where rn>5;
select *
from (select rownum rn, e.ename, e.hiredate, d.dname
from emp e
join dept d on e.deptno=d.deptno
where rownum<=15)
where rn>10;
練習7 按照每頁顯示5條記錄,分別查詢工資最高的第1頁,第2頁,第3頁信息,要求顯示員工姓名 、入職日期、部門名稱、工資。
select *
from (select rownum rn, b.*
from (select e.ename, e.hiredate, d.dname, e.sal
from emp e
join dept d on e.deptno=d.deptno
order by e.sal desc) b
where rownum<=5)
where rn>0;
select *
from (select rownum rn, b.*
from (select e.ename, e.hiredate, d.dname, e.sal
from emp e
join dept d on e.deptno=d.deptno
order by e.sal desc) b
where rownum<=10)
where rn>5;
select *
from (select rownum rn, b.*
from (select e.ename, e.hiredate, d.dname, e.sal
from emp e
join dept d on e.deptno=d.deptno
order by e.sal desc) b
where rownum<=15)
where rn>10;
課后作業
- 查詢工資高于編號為7782的員工工資,并且和7369號員工從事相同工作的員工的編號、姓名及工資。
select empno, ename, job
from emp
where sal>(select sal
from emp
where empno=7782)
and job=(select job
from emp
where empno=7369)
- 查詢工資最高的員工姓名和工資。
select ename, sal
from emp
where sal=(select max(sal)
from emp)
- 查詢部門最低工資高于10號部門最低工資的部門的編號、名稱及部門最低工資。
select e.deptno, d.dname, min(sal)
from emp e
join dept d on e.deptno=d.deptno
group by e.deptno, d.dname
having min(sal)>
(select min(sal)
from emp
where deptno=10)
- 查詢員工工資為其部門最低工資的員工的編號和姓名及工資。
select e.empno, e.ename, e.sal
from emp e
join (select deptno, min(sal) min_sal
from emp
group by deptno) b
on e.deptno=b.deptno
where e.sal=b.min_sal
- 顯示經理是KING的員工姓名,工資。
select e.ename, e.sal
from emp e
join (select empno
from emp
where ename='KING') m
on e.mgr=m.empno
- 顯示比員工SMITH參加工作時間晚的員工姓名,工資,參加工作時間。
select ename, sal, hiredate
from emp
where hiredate>
(select hiredate
from emp
where ename='SMITH')
- 使用子查詢的方式查詢哪些職員在NEW YORK工作。
select ename
from emp
where ename in
(select e.ename
from emp e
join dept d on e.deptno=d.deptno
where d.loc='NEW YORK')
- 寫一個查詢顯示和員工SMITH工作在同一個部門的員工姓名,雇傭日期,查詢結果中排除SMITH。
select e.ename, e.hiredate
from emp e
join (select deptno
from emp
where ename='SMITH'
group by deptno) b
on e.deptno=b.deptno
where e.ename<>'SMITH'
- 寫一個查詢顯示其工資比全體職員平均工資高的員工編號,姓名。
select empno, ename
from emp
where sal>
(select avg(sal)
from emp )
- 寫一個查詢顯示其上級領導是KING的員工姓名、工資。
select e.ename, e.sal
from emp e
join (select *
from emp ) m
on e.mgr=m.empno
where m.ename='KING'
- 顯示所有工作在RESEARCH部門的員工姓名,職位。
select e.ename, e.job
from emp e
join dept d on e.deptno=d.deptno
where d.dname='RESEARCH'
- 查詢每個部門的部門編號、平均工資,要求部門的平均工資高于部門20的平均工資。
select deptno, avg(sal)
from emp
group by deptno
having avg(sal)>
(select avg(sal)
from emp
where deptno=20
group by deptno)
- 查詢大于自己部門平均工資的員工姓名,工資,所在部門平均工資,高于部門平均工資的額度。
select e.ename, e.sal, b.avg_sal, e.sal-b.avg_sal oversal
from emp e
join (select deptno, avg(sal) avg_sal
from emp
group by deptno ) b
on e.deptno=b.deptno
where e.sal>b.avg_sal
- 列出至少有一個雇員的所有部門。
select deptno, count(*)
from emp
group by deptno
having count(*)>0
- 列出薪金比"SMITH"多的所有雇員。
select ename, sal
from emp
where sal>
(select sal
from emp
where ename='SMITH')
- 列出入職日期早于其直接上級的所有雇員。
select e.ename, e.hiredate
from emp e
join emp m
on e.mgr=m.empno
where e.hiredate<m.hiredate
- 找員工姓名和直接上級的名字。
select e.ename, m.ename
from emp e
join emp m on e.mgr=m.empno
- 顯示部門名稱和人數。
select d.dname, count(*)
from emp e
join dept d on e.deptno=d.deptno
group by d.dname
- 顯示每個部門的最高工資的員工。
select ename
from emp
where sal in
(select max(sal)
from emp
group by deptno)
- 顯示出和員工號7369部門相同的員工姓名,工資。
select ename, sal
from emp
where deptno=
(select deptno
from emp
where empno=7369)
- 顯示出和姓名中包含"W"的員工相同部門的員工姓名。
select ename
from emp
where deptno=
(select deptno
from emp
where ename like '%W%')
- 顯示出工資大于平均工資的員工姓名,工資。
select ename, sal
from emp
where sal>
(select avg(sal)
from emp)
- 顯示出工資大于本部門平均工資的員工姓名,工資。
select e.ename, e.sal
from emp e
join (select deptno, avg(sal) avg_sal
from emp
group by deptno) b
on e.deptno=b.deptno
where e.sal>b.avg_sal
- 顯示每位經理管理員工的最低工資,及最低工資者的姓名。
select e.ename, m.min_sal
from emp e
join (select min(sal) min_sal
from emp
where mgr is not null
group by mgr) m
on m.min_sal=e.sal
- 顯示比工資最高的員工參加工作時間晚的員工姓名,參加工作時間。
select ename, hiredate
from emp
where hiredate>
(select hiredate
from emp
where sal=
(select max(sal)
from emp ))
- 顯示出平均工資最高的部門平均工資及部門名稱。
select d.dname, avg(sal)
from emp e
join dept d on e.deptno=d.deptno
group by d.dname
having avg(sal)=
(select max(avg(sal))
from emp
group by deptno