天天看點

oracle多表查詢多表查詢基本文法左右連接配接SQL:1999SQL定義

多表查詢基本文法

    笛卡爾積在SQL中的實作方式既是交叉連接配接(Cross Join)。所有連接配接方式都會先生成臨時笛卡爾積表,笛卡爾積是關系代數裡的一個概念,表示兩個表中的每一行資料任意組合。

-- 笛卡爾積 
select * from emp, dept;
           
oracle多表查詢多表查詢基本文法左右連接配接SQL:1999SQL定義
-- 使用公共字段,去掉笛卡爾積
select * from emp, dept where emp.deptno = dept.deptno;
           
oracle多表查詢多表查詢基本文法左右連接配接SQL:1999SQL定義
-- 查詢出每個雇員的姓名,工作,雇員的直接上級上司的姓名
-- 在emp表中的MGR表示一個雇員的上級上司的編号,如果現在要想查詢一個雇員的上級上司姓名,則需要用emp表與emp表進行自連接配接操作
select e.ename, e.job, s.ename from emp s, emp e where s.empno = e.mgr; 

-- 查詢出每個雇員的姓名,工作,雇員的直接上級上司的姓名,雇員所在的部門名稱
select e.ename, e.job,s.ename mgr_name, d.dname from emp e, emp s, dept d where e.mgr = s.empno and e.deptno = d.deptno;

-- 查詢出每個雇員的姓名,工資,部門名稱,工資在公司的等級及其上司的姓名,上司的工資,以及上司所對應的等級
SELECT e.ename, e.sal, d.dname,
decode(g.grade,5,'第一等工資',4,'第二等工資',3,'第三等工資',2,'第四等工資',1,'第五等工資')
e_grade, s.ename mgr_name, s.sal mgr_sal,
decode(g2.grade,5,'第一等工資',4,'第二等工資',3,'第三等工資',2,'第四等工資',1,'第五等工資') m_grade
FROM emp e,dept d,salgrade g,emp s,salgrade g2
WHERE (e.deptno=d.deptno) AND (e.sal BETWEEN g.losal AND g.hisal)
AND (s.empno=e.mgr) AND (s.sal BETWEEN g2.losal AND g2.hisal);
           

左右連接配接

-- 利用emp 和 dept 做一個連接配接查詢,查詢結果包括雇員編号,雇員姓名,部門編号,部門名稱,部門所在位置
select e.empno, e.ename, d.deptno, d.dname, d.loc
from emp e,dept d
where e.deptno = d.deptno;
           
oracle多表查詢多表查詢基本文法左右連接配接SQL:1999SQL定義
-- 通過觀察不難發現,在以上結果中部門編号40沒有出現,這是因為在進行普通連接配接時兩邊都有的才出現在結果中,在emp表中沒有部門40,是以結果中也就沒有40
select e.empno, e.ename, d.deptno, d.dname, d.loc
from emp e, dept d
where e.deptno(+) = d.deptno;
           
oracle多表查詢多表查詢基本文法左右連接配接SQL:1999SQL定義

部門40就出現在結果中了.此時我們使用的是右連接配接。

      (+)在=左邊 表示右連接配接

      (+)在=右邊 表示左連接配接

      左連接配接以左表為基準,右連接配接以右表為基準

-- 左連接配接以左表為基準,右連接配接以右表為基準
select e.empno, e.ename, d.deptno, d.dname, d.loc
from emp e, dept d
where e.deptno = d.deptno(+);
           
-- 查詢雇員的編号,姓名,及其上司的編号,姓名
select e.empno, e.ename, s.empno, s.ename
from emp e, emp s
where e.mgr = s.empno;
           
-- 但我們經查詢知道emp表中應該有14條記錄,在以上結果中缺少了KING,因為KING是最高上司,是以他的上司編号為空,故沒辦法查詢出來.為了顯示出來,我們用左/右連接配接來實作
select e.empno, e.ename, s.empno, s.ename
from emp e, emp s
where e.mgr = s.empno(+);
           
oracle多表查詢多表查詢基本文法左右連接配接SQL:1999SQL定義
-- 左右連接配接的連接配接方式不是固定的,具體采用左連接配接還是右連接配接取決于基準條件在等式的左邊還是右邊,上面的左連接配接把基準條件放在右邊,就變為了右連接配接
select e.empno, e.ename, s.empno, s.ename
from emp e, emp s
where s.empno(+) = e.mgr;
           

得到的同樣是上圖的結果值,這裡就不重複貼圖了。

SQL:1999SQL定義

文法格式

SELECT table1.column,table2.column

FROM table1 [CROSS JOIN table2]|

[NATURAL JOIN table2]|

[JOIN table2 USING(column_name)]|

[JOIN table2 ON(table1.column_name=table2.column_name)]|

[LEFT|RIGHT|FULL OUTER JOIN table2 ON (table1.column_name=table2.column_name)]

-- 交叉連接配接(CROSS JOIN):迪卡爾積運算
select * from emp cross join dept;
           
oracle多表查詢多表查詢基本文法左右連接配接SQL:1999SQL定義
select * from emp cross join dept where emp.empno = 7369;
           
oracle多表查詢多表查詢基本文法左右連接配接SQL:1999SQL定義
-- 自然連接配接 NATURAL JOIN
select * from emp natural join dept;
           
oracle多表查詢多表查詢基本文法左右連接配接SQL:1999SQL定義
-- 根據結果可以發現,自然連接配接按公共字段相等進行連接配接,并且産生的結果會自動消除重複的列
select * from emp e, dept d
where e.deptno = d.deptno;
           
oracle多表查詢多表查詢基本文法左右連接配接SQL:1999SQL定義
-- USING(column_name) 用于指定兩個表之間的連接配接字段
select * from emp join dept using(deptno);
           
oracle多表查詢多表查詢基本文法左右連接配接SQL:1999SQL定義
-- ON(tab1.column_name=tab2.column_name) 用于指定兩表的連接配接條件
select * from emp join dept on emp.deptno = dept.deptno;
           
oracle多表查詢多表查詢基本文法左右連接配接SQL:1999SQL定義
-- LEFT[OUTER] JOIN 左連接配接 OUTER可有可無
select e.empno, e.ename, d.deptno, d.dname, d.loc
from emp e left join dept d
on e.deptno = d.deptno;
select e.empno, e.ename, d.deptno, d.dname, d.loc
from emp e left outer join dept d
on e.deptno = d.deptno;
           
oracle多表查詢多表查詢基本文法左右連接配接SQL:1999SQL定義
-- RIGHT JOIN 右連接配接
select e.empno, e.ename, d.deptno, d.dname, d.loc
from emp e right join dept d
on e.deptno = d.deptno;
           
oracle多表查詢多表查詢基本文法左右連接配接SQL:1999SQL定義
-- INNER JOIN 取交集
create table empbak as select * from emp where emp.empno in (7369, 7499, 7521, 7566, 7654, 7698);
select e1.empno, e1.empno, e1.job, e1.mgr, e1.hiredate, e1.sal, e1.comm, e1.deptno 
from emp e1 inner join empbak e2 on e1.empno = e2.empno;
           
oracle多表查詢多表查詢基本文法左右連接配接SQL:1999SQL定義
-- FULL OUTER JOIN 取并集
update empbak e set e.empno = 8369 where e.empno = 7369;
update empbak e set e.empno = 8499 where e.empno = 7499;
update empbak e set e.empno = 8521 where e.empno = 7521;
select * from emp e full join empbak s on e.empno = s.empno;
           
oracle多表查詢多表查詢基本文法左右連接配接SQL:1999SQL定義
-- 對于沒有比對的記錄,則會以null做為值
select * from emp e full join empbak s on e.empno = s.empno
where e.empno is not null and s.empno is not null;
           
oracle多表查詢多表查詢基本文法左右連接配接SQL:1999SQL定義
-- UNION 取并集 去掉重複記錄
select * from emp
union
select * from empbak;
           
oracle多表查詢多表查詢基本文法左右連接配接SQL:1999SQL定義
-- UNION ALL 取并集 不去除重複記錄
select * from emp
union all
select * from empbak;
           
oracle多表查詢多表查詢基本文法左右連接配接SQL:1999SQL定義

最下面的三條記錄是重複記錄,在上面的union連接配接中,多餘的三條重複記錄是被去掉的。

繼續閱讀