【Oracle】多表连接查询详解
多表查詢:按數(shù)據(jù)庫設計原則,員工表中只有部門的編號信息,部門的詳細信息會放在部門表中,這個時候我們就需要使用多表查詢的功能。
課程目標:
1、什么是多表查詢?
2、笛卡爾集。
3、等值連接。
4、不等值連接。
5、外連接。
6、自連接。
7、層次查詢。
具體內(nèi)容:
1、什么是多表查詢?
2、笛卡爾集。
笛卡爾集的列數(shù)相加,行數(shù)相乘。
為了避免笛卡爾集,可以在WHERE加入有效的連接條件,如上圖所示。
在實際運行環(huán)境下面,應避免使用笛卡爾全集。
在實際的應用中,連接條件至少有一個。
3、等值連接。
示例:查詢員工信息,要求顯示員工號、姓名、月薪、部門名稱。
我們在查詢多表的時候,習慣給表起一個別名。
連接符號是“=”即等值連接。
select e.empno,e.ename,e.sal,d.dname
from emp e,dept d
where e.deptno = d.deptno;
?
4、不等值連接。
示例:查詢員工信息,要求顯示員工號、姓名、月薪、薪水的級別。
select e.empno,e.ename,e.sal,s.grade
from emp e,salgrade s
where e.sal between s.losal and s.hisal;
注意使用between/and的時候要小值在前面,大值在后面。
若違反規(guī)定,則按下圖所示,不會有查詢結(jié)果。
5、外連接。
示例:按部門統(tǒng)計員工人數(shù),要求顯示部門號、部門名稱、人數(shù)。
select d.deptno 部門號,d.dname 部門名稱,count(e.empno) 人數(shù)
from emp e,dept d
where e.deptno = d.deptno
group by d.deptno,d.dname;
但是查看部門表發(fā)現(xiàn),我們的部門表里面有四個部門,上圖顯示的結(jié)果僅僅只有三個部門,很明顯是不對的。
缺少了40部門,為什么上圖會漏掉這一個部門呢?
原因是部門表中存在40的部門,在員工表里面卻不存在,所以不作統(tǒng)計。
這個時候就需要使用我們的外連接。
核心:通過外連接,把對于連接條件不成功的記錄,仍然包含在最后的結(jié)果中。
左外連接:當連接條件不成立的時候,等號左邊的表仍然被包含。
右外連接:當連接條件不成立的時候,等號右邊的表仍然被包含。
修改之前的select語句。
右外連接:需要在“=”的左邊加上“(+)”。
select d.deptno 部門號,d.dname 部門名稱,count(e.empno) 人數(shù)
from emp e,dept d
where e.deptno(+) = d.deptno
group by d.deptno,d.dname;
如果是左外連接,需要在“=”的右邊加上“(+)”。
6、自連接。
示例:查詢員工姓名和員工的上級姓名。
select e.ename 員工姓名, b.ename 上級姓名
from emp e,emp b
where e.mgr = b.empno;
核心:通過別名,將同一張表視同為多張表。
7、層次查詢。
自連接存在的問題:
不適合操作大表:產(chǎn)生的笛卡爾集的大小至少是一個平方(至少兩個表)。
解決方法:層次查詢。
層次查詢是一個單表查詢,只有一個表,不存在第二個表,只有在一張表的情況下才不會產(chǎn)生笛卡爾集。
某些情況下,可以替代自連接,本質(zhì)上,它是一個單表查詢。
示例:上述例子。
select level,empno,ename,sal,mgr
from emp
connect by prior empno = mgr
start with empno = 7839
order by 1;
還有一種形式 start ?with mgr = null;
樹的深度我們還有一個偽列:Level
思考:自連接和層次查詢的優(yōu)缺點各式什么?
總結(jié)
以上是生活随笔為你收集整理的【Oracle】多表连接查询详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Smartform】开发中报SSFCO
- 下一篇: 计划行类别分配操作