一、什麼是多表查詢?
從多個表中獲取數據
二、笛卡爾集
三、連接的類型
1、等值連接
示例:查詢員工信息,要求顯示:員工號,姓名,月薪,部門名稱
select e.empno,e.ename,e.sal,d.dname
from emp e, dept d
where e.deptno = d.deptno;
2、不等值連接
查詢員工信息,要求顯示:員工號,姓名,月薪,薪水級別
select e.empno,e.ename,e.sal,s.grade
from emp e, salgrade s
where e.sal between s.losal and s.hisal;
3、外連接
示例:按部門統計員工人數,要求顯示:部門號,部門名稱,人數
select d.deptno 部門號, d.dname 部門名稱, count(e.empno) 人數
from emp e, dept d
where e.deptno = d.deptno
group by d.deptno, d.dname;
-
核心:通過外連接,把對於連接條件不成立的記錄,仍然包含在最後的結果中
-
左外連接:當連接條件不成立的時候,等號左邊的表仍然被包含
select d.deptno 部門號,d.dname 部門名稱, count(e.empno) 人數
from emp e, dept d
where e.deptno = d.deptno(+)
group by d.deptno, d.dname;
- 右外連接:當連接條件不成立的時候,等號右邊的表仍然被包含
select d.deptno 部門號,d.dname 部門名稱, count(e.empno) 人數
from emp e, dept d
where e.deptno(+) = d.deptno
group by d.deptno, d.dname;
4、自連接
示例:按員工姓名和員工的老闆姓名
select e.ename 員工姓名, b.ename 老闆姓名
from emp e, emp b
where e.mgr = b.empno;
-
核心:通過別名,將同一張表視爲多張表
-
自連接存在的問題:不適合操作大表
-
解決辦法:層次查詢
四、層次查詢
-
某些情況下,層次查詢可以替代自連接
-
本質上,是一個單表查詢
層次查詢的原理:
select level, empno, ename, sal, mgr
from emp
connect by prior empno = mgr
start with mgr is null
order by level;