子查詢

  • 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;

課后作業

  1. 查詢工資高于編號為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)
  1. 查詢工資最高的員工姓名和工資。
select ename, sal 
from emp 
where sal=(select max(sal)
from emp)
  1. 查詢部門最低工資高于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) 
  1. 查詢員工工資為其部門最低工資的員工的編號和姓名及工資。
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
  1. 顯示經理是KING的員工姓名,工資。
select e.ename, e.sal 
from emp e 
join (select empno
from emp 
where ename='KING') m
on e.mgr=m.empno 
  1. 顯示比員工SMITH參加工作時間晚的員工姓名,工資,參加工作時間。
select ename, sal, hiredate
from emp 
where hiredate>
(select hiredate 
from emp 
where ename='SMITH')
  1. 使用子查詢的方式查詢哪些職員在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')
  1. 寫一個查詢顯示和員工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'
  1. 寫一個查詢顯示其工資比全體職員平均工資高的員工編號,姓名。
select empno, ename
from emp 
where sal>
(select avg(sal)
from emp )
  1. 寫一個查詢顯示其上級領導是KING的員工姓名、工資。
select e.ename, e.sal 
from emp e
join (select *
from emp ) m
on e.mgr=m.empno 
where m.ename='KING'
  1. 顯示所有工作在RESEARCH部門的員工姓名,職位。
select e.ename, e.job 
from emp e
join dept d on e.deptno=d.deptno 
where d.dname='RESEARCH'
  1. 查詢每個部門的部門編號、平均工資,要求部門的平均工資高于部門20的平均工資。
select deptno, avg(sal)
from emp 
group by deptno 
having avg(sal)>
(select avg(sal)
from  emp 
where deptno=20
group by deptno)
  1. 查詢大于自己部門平均工資的員工姓名,工資,所在部門平均工資,高于部門平均工資的額度。
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
  1. 列出至少有一個雇員的所有部門。
select deptno, count(*)
from emp 
group by deptno
having count(*)>0
  1. 列出薪金比"SMITH"多的所有雇員。
select ename, sal 
from emp 
where sal>
(select sal 
from emp 
where ename='SMITH')
  1. 列出入職日期早于其直接上級的所有雇員。
select e.ename, e.hiredate 
from emp e
join emp m
on e.mgr=m.empno 
where e.hiredate<m.hiredate
  1. 找員工姓名和直接上級的名字。
select e.ename, m.ename 
from emp e
join emp m on e.mgr=m.empno 
  1. 顯示部門名稱和人數。
select d.dname, count(*)
from emp e 
join dept d on e.deptno=d.deptno
group by d.dname
  1. 顯示每個部門的最高工資的員工。
select ename
from emp 
where sal in
(select max(sal)
from emp 
group by deptno)
  1. 顯示出和員工號7369部門相同的員工姓名,工資。
select ename, sal 
from emp 
where deptno=
(select deptno 
from emp 
where empno=7369)
  1. 顯示出和姓名中包含"W"的員工相同部門的員工姓名。
select ename 
from emp 
where deptno=
(select deptno 
from emp 
where ename like '%W%')
  1. 顯示出工資大于平均工資的員工姓名,工資。
select ename, sal 
from emp 
where sal>
(select avg(sal)
from emp)
  1. 顯示出工資大于本部門平均工資的員工姓名,工資。
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
  1. 顯示每位經理管理員工的最低工資,及最低工資者的姓名。
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
  1. 顯示比工資最高的員工參加工作時間晚的員工姓名,參加工作時間。
select ename, hiredate
from emp 
where hiredate>
(select hiredate 
from emp 
where sal=
(select max(sal)
from emp ))
  1. 顯示出平均工資最高的部門平均工資及部門名稱。
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
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 練習1.1 查詢比所在職位平均工資高的員工姓名,職位。 1.2 查詢工資為其部門最低工資的員工編號,姓名,工資。 ...
    孫競博閱讀 579評論 1 2
  • 連接查詢和子查詢 一、連接查詢 1.1 概念 連接查詢:也可以叫跨表查詢,需要關聯多個表進行查詢 1.2 根據年代...
    我可能是個假開發閱讀 3,874評論 14 16
  • 1,wherer:子查詢一般會返回單行單列 單行多列 多行單列 ; 2,having:子查詢會返回單行單列,同時表...
    大小說家RCQ閱讀 258評論 0 2
  • 高考結束,一個朋友為我做了一件事??赡芤惠呑右餐涣?,因為我可能并做不到。我很享受那刻的真心。今天我來這里看一看他...
    偷懶的時光閱讀 212評論 0 0
  • 你若懂我,該有多好 每個人都有一個死角, 自己走不出來,別人也闖不進去。 我把最深沉的秘密放在那里。 你不懂我,我...
    Youou閱讀 222評論 0 0