Oracle多表连接查询
多個表之間關系:一對多|(多對一)? 多對多 一對一 3種
關系的完整性約束:實體完整性、參照完整性、用于定義的完整性。 必須滿足實體完整性和參照完整性.
實體完整性:規定了字段|屬性的約束
參照完整性:關系與關系之間的引用 某個字段的約束? 外鍵
?
一.笛卡爾集
?笛卡爾集會在下面條件下產生:
?? 省略連接條件
?? 連接條件無效
?? 所有表中的所有行互相連接
為了避免笛卡爾集, 可以在 WHERE 加入有效的連接條件。
//查詢員工及部門的詳細信息? 但是會產生一個笛卡爾積的效果
SQL> select * from emp,dept;
?
二. Oracle連接
使用來接在多個表中查詢數據
//別名查詢 為表起別名 采用別名查詢
SQL> select * from emp e,dept d? where e.deptno=d.deptno;
綜上所述 創建連接查詢時應遵循如下規則:
1、? from子句應當包括所有的表名
2、? where子句應定義連接條件 兩個表1一個等值條件 三個表 2個等值條件…依次類推。
l? 備注:連接 n個表,至少需要 n-1個連接條件。 例如:連接三個表,至少需要兩個連接條件。
3、? 當列名為多個表共有時,列名必須被限制。
?????? 非等值連接
?????????????????? SELECT e.last_name, e.salary, j.grade_level ?FROM?? employees e, job_grades j
WHERE? e.salary ?BETWEEN j.lowest_sal AND j.highest_sal;
?
三?? 內連接和外連接
1、內連接:
內連接根據所使用的比較方式不同,把內連接分為了:
1)? 等值連接:在連接條件中使用等于號(=)運算符比較被連接列的列值,其查詢結果中列出被連接表中的所有列,包括其中的重復列。
SQL> select * from emp e inner join dept d on e.deptno = d.deptno;
2)? 不等連接:在連接條件使用除等于運算符以外的其它比較運算符比較被連接的列的列值。這些運算符包括>、>=、<=、<、!>、!<和<>。
SQL> select * from emp e inner join dept d on e.deptno>d.deptno;
3)? 自然連接:在連接條件中使用等于(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,并刪除連接表中的重復列。
SQL> select * from emp natural join dept;
SQL> select? e.*,d.dname,d.loc? from emp e inner join dept d on e.deptno = d.deptno;
SQL> select d.*,e.ename,e.empno,e.job,e.mgr,e.hiredate,e.sal,e.comm from emp e inner join dept d on e.deptno=d.deptno;
?
備注:Distinct是去掉重復的行,而自然連接是去掉重復的列。
?
2、外連接
內連接的查詢結果都是滿足連接條件的記錄。但是,有時我們也希望輸出那些不滿足連接條件的記錄的信息。比如,我們想知道這個部門中所有員工的情況,也包括沒有員工的部門,這時就需要使用外連接。外連接是只限制一張表中的數據必須滿足連接條件,而另一張表中的數據可以不滿足連接條件的連接方式。3種外連接:
1) 左外連接(LEFT OUTER JOIN)
如果在連接查詢中,連接表左端的表中所有的記錄都列出來,并且能在右端的表中找到匹配的記錄,那么連接成功。如果在右端的表中,沒能找到匹配的記錄,那么對應的記錄是空值(NULL)。這時,查詢語句使用關鍵字 LEFT OUTER JOIN,也就是說,左外連接的含義是限制連接關鍵字右端的表中的數據必須滿足連接條件,而不關左端的表中的數據是否滿足連接條件,均輸出左端表中的內容。
例如:要查詢所有部門的員工信息查詢語句為
SQL> select * from dept d left outer join emp e on e.deptno=d.deptno order by d.deptno; 左外連接查詢中左端表中的所有記錄的信息都得到了保留。
?? 備注:部門表中記錄保留,如果部門中沒有員工,部門顯示 員工記錄用null補充。
2)右外連接(RIGHT OUTER JOIN)
右外連接與左外連接類似,只是右端表中的所有元組都列出,限制左端表的數據必須滿足連接條件,而不管右端表中的數據是否滿足連接條件,均輸出表中的內容。
例如:同上例內容,查詢語句為
SQL> select * from emp e right outer join dept d on e.deptno=d.deptno order by d.deptno;
右外連接查詢中右端表中的所有元組的信息都得到了保留。
3)全外連接(FULL OUTER JOIN)
全外連接查詢的特點是左、右兩端表中的記錄都輸出,如果沒能找到匹配的記錄,就使用NULL來代替。
例如:同左外連接例子內容,查詢語句為
SQL> select * from emp e full outer join dept d on e.deptno=d.deptno order by d.deptno;
全外連接查詢中所有表中的元組信息都得到了保留。
備注:一定分清:左與右?? 在join后邊的是右
?
3、? 交叉聯接
交叉連接即笛卡兒乘積,是指兩個關系中所有記錄的任意組合。一般情況下,交叉查詢是沒有實際意義的。
SQL> select * from emp e cross join dept d;
備注:可以添加where子句篩選出有意義的數據。建議不使用。
??
4、? 自連接查詢
如果在一個連接查詢中,涉及到的兩個表都是同一個表,這種查詢稱為自連接查詢。同一張表在FROM字句中多次出現,為了區別該表的每一次出現,需要為表定義一個別名。自連接是一種特殊的內連接,它是指相互連接的表在物理上為同一張表,但可以在邏輯上分為兩張表。
例如:要求檢索出員工編號為7369的上司的詳細信息,查詢語句為
SQL> select e1.* from emp e inner join emp e1 on e.mgr=e1.empno where e.empno=7369;
注意:對于連接查詢中使用到的 inner outer是可以省略的。但為規范最好不要省略。
提高部分:
SQL> select * from emp e inner join dept d on e.deptno(+)=d.deptno;的理解?
l 使用外連接可以查詢不滿足連接條件的數據。
l 外連接的符號是 (+)。
?
另外:
l 在NATURAL JOIN 子句創建等值連接時,可以使用 USING 子句指定等值連接中需要用到的列。
l 使用 USING 可以在有多個列滿足條件時進行選擇。
l 不要給選中的列中加上表名前綴或別名。
l NATURAL JOIN 和 USING 子句經常同時使用。
?
?
原文:http://blog.csdn.net/java958199586/article/details/7350647
轉載于:https://www.cnblogs.com/puresoul/archive/2010/07/08/1773871.html
總結
以上是生活随笔為你收集整理的Oracle多表连接查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Java高并发编程详解:多线程与架构设
- 下一篇: breakall lisp文件_CAD导