標籤:
串連查詢:
串連查詢是指基於多張表或視圖的查詢。使用串連查詢時,應指定有效查詢條件,不然可能會導致產生笛卡爾積。如現有部門表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中的串連查詢總結