天天看點

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

本文轉自賀滿部落格園部落格,原文連結:http://www.cnblogs.com/puresoul/archive/2010/07/08/1773871.html,如需轉載請自行聯系原作者。