Oracle 連接查詢


1.什么是連接查詢?(B)


很多時候我們需要查詢的數據並不是來源於同一張表,而是來源於多張表,而這種一個查詢需要對多張表進行操作,就稱為連接查詢。

2.如何進行表的連接查詢?


連接查詢有兩種方式:SQL 1992(1992年發布的標准) 和SQL 1999(1999年發布的標准)

3.SQL1992:(A)


3.1 語法:


SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;

注:1.在 WHERE 子句中寫入連接條件
2.在 WHERE 子句中寫入連接條件當多個表中有重名列時,必須在列的名字前加上表名作為前綴(可使用表別名)

3.2 連接類型:


1.笛卡爾積 (表*表)
例: select * from emp,dept;
emp表中的每一條數據會分別與dept表的每一條數據連接
2.等值連接 (列=列)
例:查詢員工的部門名稱
select e.ename,d.dname from emp e,dept d where e.deptno = d.deptno
3.非等值連接 (列!=列)
--查詢員工的薪水等級
select e.ename,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal
4.自連接 (表自己連接自己)
--查詢員工上司的姓名:以"xxx的上司是xxx"方式顯示
select e1.ename||'的上司是'|| e2.ename from emp e1,emp e2 where e1.mgr = e2.empno
5.外連接 (在滿足一張表的內容都顯示的基礎上,連接另外一張表,如果連接匹配則正常顯示,連接不匹配,另外一張表補null)
select e.ename,d.dname from emp e, dept d where e.deptno = d.deptno (+)
“(+)” 在等號右邊,我們稱這次查詢為“左外連接查詢”
“(+)” 在等號左邊,我們成這次查詢為“右外連接查詢”
“(+)” 在等號哪一邊,哪張表就補null

3.3SQL 1992 缺點:


1.表的連接條件和表的過濾條件都放在WHERE子句中,當條件過多時容易混淆
2.外連接的“左外連接查詢”、“右外連接查詢”不太容易辯別

4.SQL1999(A)


4.1 語法:


SELECT table1.column, table2.column FROM table1 連接類型 JOIN table2 ON 連接條件
在SQL1999 中彌補了SQL1992的缺點,使用 JOIN關鍵字 連接 ON關鍵字進行連接條件判斷,WHERE進行過濾。並且外連接的“左外連接查詢”、“右外連接查詢”分別使用LEFT OUTER JOIN、RIGHT OUTER JOIN


4.2 連接類型:


1.CROSS JOIN 交叉連接(笛卡爾積)
select * from emp cross join dept

2.NATURAL JOIN 自然連接,找到兩張表中具有相同名稱列,進行等值連接
select * from emp natural join dept

3.INNER JOIN 內連接 (inner關鍵字可以省略)
--等值連接
select e.ename,d.dname from emp e INNER JOIN dept d on e.deptno = d.deptno where e.sal > 2000
--非等值連接
select e.ename,s.grade from emp e INNER JOIN salgrade s on e.sal between s.losal and s.hisal
--自連接
select e1.ename || '的上司是' || e2.ename from emp e1 INNER JOIN emp e2 on e1.mgr = e2.empno

--外連接(outer關鍵字可以省略)
4.LEFT OUTER JOIN
select * from emp e LEFT OUTER JOIN dept d on e.deptno = d.deptno
5.RIGHT OUTER JOIN
select * from emp e RIGHT OUTER JOIN dept d on e.deptno = d.deptno
6.FULL OUTER JOIN
select * from emp e FULL OUTER JOIN dept d on e.deptno = d.deptno

 

5.如何進行多表連接?(A)


例:

--SQL 1992
select e.ename, e.sal, d.dname, s.grade
from emp e, dept d, salgrade s
where e.deptno = d.deptno
and e.sal between s.losal and s.hisal

--SQL 1999
select e.ename, e.sal, d.dname, s.grade
from emp e
join dept d
on e.deptno = d.deptno
join salgrade s
on e.sal between s.losal and s.hisal

 

6.子查詢(A):


6.1 什么是子查詢?


在SQL中允許多層嵌套。而子查詢,即嵌套在其他查詢中的查詢。

理解子查詢的關鍵在於把子查詢當作一張表來看待。外層的語句可以把內嵌的子查詢返回的結果當成一張表使用。
–子查詢要用括號括起來
–將子查詢放在比較運算符的右邊(增強可讀性)

6.2 子查詢的種類(A)

1.在where中使用的子查詢

--查詢部門名稱為RESEARCH、SALES
select *
from emp
where deptno in
(select deptno from dept where dname in ('RESEARCH', 'SALES'))
--查詢有哪些人的薪水是在整個雇員的平均薪水之上的
select ename,empno, sal, sal+nvl(comm,0)
from emp
where sal+nvl(comm,0)>(select avg(sal+nvl(comm,0)) from emp);
--查在雇員中有哪些人是經理人
select empno, ename
from emp
where empno in (
select distinct mgr from emp
);
--找出部門編號為20的所有員工中收入最高的職員
select * from emp
where sal >= all(
select sal
from emp
where deptno = 20)
and
deptno = 20

 


2.在from后面使用子查詢

--我們要求每個部門平均薪水的等級
select t1.deptno, t1.savg, s.grade
from (select deptno, avg(sal) savg from emp group by deptno) t1
join salgrade s
on t1.savg between s.losal and s.hisal

--求每個部門薪水的平均等級
select t1.deptno, avg(t1.grade)
from (select e.deptno, s.grade
from emp e, salgrade s
where e.sal between s.losal and s.hisal) t1
group by t1.deptno

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM