oracle中的串連查詢總結

來源:互聯網
上載者:User

標籤:

串連查詢:

串連查詢是指基於多張表或視圖的查詢。使用串連查詢時,應指定有效查詢條件,不然可能會導致產生笛卡爾積。如現有部門表dept,員工表emp,以下查詢因查詢條件無效,而產生笛卡爾積:   (各語句中欄位不做解釋,主要顯示邏輯關係)

select dept.dname,emp.ename from dept,emp where dept.name = ‘sales‘;

 有效查詢條件應該指定dept表與emp表之間的串連關係。表之間串連關係多如下:

1.相等串連(=)

相等串連主要用於查詢主從表之間的相關資料,如下:

select table1.col1,table2.col2 from table1,table2 where table1.col1 = table2.col2  ;

 同時可以用and指定其他查詢條件,如修改第一句:

select dept.dname,emp.ename from dept,emp where dept.deptno = emp.deptno and dept.name = ‘sales‘;

 2.不等串連

不等串連指串連條件中使用除相等比較的其他比較操作,多用於在不同表之間顯示特定範圍資訊。如下:

select a.enma, a.sal .b.grade from emp a, salgrade b where a.sal between b.losal and b.hisal;

 3.自串連

指在同一張表中的串連查詢,主要用在自參照表上顯示上下級關係或者層次關係。自參照表是指在不同列之間具有參照關係或者主從關係的表。如下,emp表中包含具有主從關係的兩個欄位,empno(僱員號),mgr(管理者號),為顯示僱員與管理者之間的對應關係,可以用自串連:

select manager.ename  from emp manager, emp worker where manager.empno = worker.mgr and worker.ename = ‘KING‘;

4.內串連與外串連

select table1.column, table2.column from table1 [inner | left | right | full] join table2 on table1.column1 = table2.column2;

 以上分別為內串連、左串連,有連結,完全串連,on子句用於指定串連條件。

內串連:用於返回滿足查詢條件的所有記錄,預設情況下,在指定串連查詢時如果沒有指定任何串連操作,那其就為內串連,目前以上查詢語句皆為內串連,舉例,以下兩句相同:

select dept.dname,emp.ename from dept,emp where dept.deptno = emp.deptno and dept.name = ‘sales‘;select dept.dname,emp.ename from dept inner join emp on dept.deptno = emp.deptno and dept.name = ‘sales‘;

 左外連結:返回滿足串連條件的所有記錄,同時返回不滿足串連條件的串連操作符左邊表的其他行,即左邊返回所有記錄,右表只返回滿足查詢條件的記錄。為方便,引用他人的例子說明查詢效果(參考:http://www.blogjava.net/hello-yun/archive/2011/04/08/347890.html),如下:

SELECT * FROM TESTA LEFT OUTER JOIN TESTB ON TESTA.A=TESTB.A;

查詢效果如下:

多表左外串連:

SELECT * FROM TESTA  LEFT OUTER JOIN TESTB ON TESTA.A=TESTB.A LEFT OUTER JOIN TESTC ON TESTA.A=TESTC.A

 右外串連:如左外串連,即右表返回所有記錄,座標只返回滿足查詢條件的記錄,如:

SELECT * FROM TESTA RIGHT JOIN TESTB ON TESTA.A=TESTB.A;

 查詢效果如下: 

完全外串連:即返回滿足查詢條件的記錄,也返回不滿足查詢條件的其他記錄,舉例如下:

SELECT * FROM TESTA FULL JOIN TESTB ON TESTA.A=TESTB.A;

查詢效果如下: 

(+)操作:(+)執行外串連,將其放在顯示較少行(完全滿足串連條件行)的一端,需要注意的是(+)操作只能用於列,而不能用在運算式上,不能與or和in操作同時使用。

  用(+)實現左外串連:將上面左串連語句改為用(+)實現。

SELECT * FROM TESTA LEFT OUTER JOIN TESTB ON TESTA.A=TESTB.A;==SELECT * FROM TESTA ,TESTB WHERE TESTA.A=TESTB.A(+);

SELECT * FROM TESTA  LEFT OUTER JOIN TESTB ON TESTA.A=TESTB.A LEFT OUTER JOIN TESTC ON TESTA.A=TESTC.A
==
SELECT * FROM TESTA, TESTB,TESTC where TESTA.A=TESTB.A(+) and TESTA.A=TESTC.A(+);

SELECT * FROM TESTA  LEFT OUTER JOIN TESTB ON TESTA.A=TESTB.A LEFT OUTER JOIN TESTC ON TESTB.A=TESTC.A
==
SELECT * FROM TESTA, TESTB,TESTC where TESTA.A=TESTB.A(+) and TESTB.A=TESTC.A(+);

select a.dname, b.ename from dept a left join emp b on a.deptno = b.deptno and a.deptno =10;
==
select a.dname, b.ename from dept a, emp b where a.deptno = b.deptno(+) and a.deptno(+) =10;

 用(+)實現右外串連方式同左串連。

用(+)實現完全串連:

SELECT * FROM TESTA FULL JOIN TESTB ON TESTA.A=TESTB.A;==SELECT  TESTA.*,TESTB.* FROM TESTA LEFT OUTER JOIN TESTB ON TESTA.A=TESTB.AUNIONSELECT TESTA.*,TESTB.* FROM TESTB LEFT OUTER JOIN TESTA ON TESTA.A=TESTB.A

 

oracle中的串連查詢總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.