資料庫中的子查詢
阿新 • • 發佈:2020-07-13
概述
- 什麼是子查詢?
select語句當中巢狀select語句,被巢狀的select語句是子查詢。 - 子查詢可以出現在哪裡?
select
...(select)
from
...(select)
where
... (select)
where後面巢狀子查詢
- 例子
找出高於平均薪資的員工資訊。 - 錯誤寫法:
SELECT * FROM emp
where sal>avg(sal);
原因:where後面不能使用分組函式。
- 分步查詢
先找出平均薪資:SELECT avg(sal) FROM emp;
(2073.214286)
再過濾:
SELECT * FROM emp where sal>2073.214286;
- 合併:
SELECT * FROM emp
where sal > (
SELECT * FROM emp
where sal>avg(sal)
);
from後面巢狀子查詢
- 例子
找出每個部門平均薪水的薪資等級。 - 解答:
1、找出每個部門平均薪水(按照部門編號分組,求sal的平均值)
SELECT deptno, avg(sal) as avgsal
from emp
group by deptno;
2、將以上的查詢結果當做臨時表t,讓t表和salgrade s表連線。
SELECT t.*, s.grade FROM (SELECT deptno, avg(sal) as avgsal from emp group by deptno) t join salgrade s on t.avgsal between s.losal and s.hisal;
- 例子
找出每個部門的薪水等級的平均值
1、找出每個員工的薪資等級
SELECT e.ename, e.sal, e.deptno, s.grade
from emp e
join salgrade s
on e.sal between s.losal and s.hisal;
2、看似會用到子查詢,但是不會(因為需要的資料都有)。
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;
select後面巢狀子查詢
- 例子
找出每個員工所在的部門名稱,要求顯示員工名和部門名。
(用巢狀的方法,不用連線)
SELECT e.ename,
(
select d.dname
from dept d
where e.deptno = d.deptno
) as dname
from emp e;