前言:這幾天學習oracle,把自己對於關聯查詢的理解,記錄下。如有錯誤請指正!
交叉連接:
交歡連接又稱為“笛卡兒積連接”,是兩個或多個表之間的無條件連接。一個表中所有的記錄與其它表的所有的記錄進行連接。
如果進行連接的表中的數據行數分別為“n1,n2、n3”,那么交叉連接后結果集中有n1xn2xn3條記錄。
一、內連接
內連接是種常用的關聯查詢方式,使用inner join來實現,其中inner是可以省略的語法如下:
內連接的標准語法
select colums_list
from table_name1 [inner] join table_name2
on join_codition
參數說明:
- colums_list :字段列表
- table_name1和table_name2:是兩個要實現內聯接的表名
- join_condition:實現內連接的條件表達式
內連接語法:Oracle擴展的連接方式
SELECT table1.column,talbe2.column[,…]
FROM table1,table2[,…]
WHERE condition;
例如:
SQL> select e.empno 員工號,e.ename 員工姓名,e.job 職務,d.dname 2 from emp e inner join dept d 3 on e.deptno = d.deptno; ------------------------------------------------或者------------------------------------------------------------------------------- SQL> select e.empno 員工號,e.ename 員工姓名,e.job 職務,d.dname 2 from emp e ,dept d where e.deptno = d.deptno; 員工號 員工姓名 職務 DNAME ---------- -------------------- ------------------ ---------------------------- 7369 SMITH CLERK RESEARCH 7499 ALLEN SALESMAN SALES 7521 WARD SALESMAN SALES 7566 JONES MANAGER RESEARCH 7654 MARTIN SALESMAN SALES 7698 BLAKE MANAGER SALES 7782 CLARK MANAGER ACCOUNTING 7788 SCOTT ANALYST RESEARCH 7839 KING PRESIDENT ACCOUNTING 7844 TURNER SALESMAN SALES 7876 ADAMS CLERK RESEARCH 員工號 員工姓名 職務 DNAME ---------- -------------------- ------------------ ---------------------------- 7900 JAMES CLERK SALES 7902 FORD ANALYST RESEARCH 7934 MILLER CLERK ACCOUNTING 已選擇14行。
二、外連接
外連接分為:左外連接和右外連接、完全連接
-
A、左外連接:關鍵字為left outer join 或者 left join
-
語法:
1、標准SQL語句的連接方式
SELECT table1.column, table2.column[,…]
FROM table1 LEFT JOIN table2[,]
ON table1.column <operator> table2.column[,…];
-
2、Oracle擴展的連接方式
SELECT table1.column, table2.column[,…]
FROM table1, table2[,…]
WHERE table1.column <operator>
table2.column(+)[…];
-
例如:
-
SQL> select e.empno,e.ename,e.job,d 2 .dname 3 from emp e left join dept d 4 on e.deptno = d.deptno; -----------------------------------------------------------或者---------------------------------------------------------------------------------- SQL> select e.empno,e.ename,e.job,d.dname 2 from emp e,dept d 3 where e.deptno = d.deptno(+); EMPNO ENAME JOB DNAME ---------- -------------------- ------------------ ---------------------------- 7934 MILLER CLERK ACCOUNTING 7839 KING PRESIDENT ACCOUNTING 7782 CLARK MANAGER ACCOUNTING 7902 FORD ANALYST RESEARCH 7876 ADAMS CLERK RESEARCH 7788 SCOTT ANALYST RESEARCH 7566 JONES MANAGER RESEARCH 7369 SMITH CLERK RESEARCH 7900 JAMES CLERK SALES 7844 TURNER SALESMAN SALES 7698 BLAKE MANAGER SALES EMPNO ENAME JOB DNAME ---------- -------------------- ------------------ ---------------------------- 7654 MARTIN SALESMAN SALES 7521 WARD SALESMAN SALES 7499 ALLEN SALESMAN SALES 9527 LIKE PRINTER
-
B、右外連接:關鍵字為right outer join 或者 right join
-
1、標准SQL語句的連接方式
SELECT table1.column, table2.column[,…]
FROM table1 RIGHT JOIN table2[,…]
ON table1.column <operator> table2.column[…];
-
例如:
-
2、Oracle擴展的連接方式
語法:
-
SELECT table1.column, table2.column[,…]
FROM table1, table2[,…]
WHERE table1.column (+)<operator>
table2.column[…];
-
例如:
-
SQL> select e.empno,e.ename,e.job,d 2 .dname 3 from emp e left join dept d 4 on e.deptno = d.deptno; -------------------------------------------------------------或者-------------------------------------------------------------------- SQL> select e.empno,e.ename,e.job,d.dname 2 from emp e,dept d 3 where e.deptno (+)= d.deptno; EMPNO ENAME JOB DNAME ---------- -------------------- ------------------ ---------------------------- 7369 SMITH CLERK RESEARCH 7499 ALLEN SALESMAN SALES 7521 WARD SALESMAN SALES 7566 JONES MANAGER RESEARCH 7654 MARTIN SALESMAN SALES 7698 BLAKE MANAGER SALES 7782 CLARK MANAGER ACCOUNTING 7788 SCOTT ANALYST RESEARCH 7839 KING PRESIDENT ACCOUNTING 7844 TURNER SALESMAN SALES 7876 ADAMS CLERK RESEARCH EMPNO ENAME JOB DNAME ---------- -------------------- ------------------ ---------------------------- 7900 JAMES CLERK SALES 7902 FORD ANALYST RESEARCH 7934 MILLER CLERK ACCOUNTING OPERATIONS 已選擇15行。
-
C、完全連接:關鍵字為full outer join 或者 full join
-
在Oracle數據庫中,全外連接的表示方式為
SELECT table1.column, table2.column[,…]
FROM table1 FULL JOIN table2[,…]
ON table1.column1 = table2.column2[…];
-
例如:
-
SQL> select e.empno,e.ename,d.deptno,d.dname from emp e full join dept d on d.deptno = e.deptno; EMPNO ENAME DEPTNO DNAME ---------- -------------------- ---------- ----------------------------9528 LIKE 7369 SMITH 20 RESEARCH 7499 ALLEN 30 SALES 7521 WARD 30 SALES 7566 JONES 20 RESEARCH 7654 MARTIN 30 SALES 7698 BLAKE 30 SALES 7782 CLARK 10 ACCOUNTING 7788 SCOTT 20 RESEARCH 7839 KING 10 ACCOUNTING EMPNO ENAME DEPTNO DNAME ---------- -------------------- ---------- ---------------------------- 7844 TURNER 30 SALES 7876 ADAMS 20 RESEARCH 7900 JAMES 30 SALES 7902 FORD 20 RESEARCH 7934 MILLER 10 ACCOUNTING 40 OPERATIONS 已選擇17行。
-
- 注:左外連接其實就是:將左邊表中的數據全部顯示出不無論在其連接表中是否有對應的數據,如果沒有與之對應的連接表的值為NULL。
- 右外連接是:指在內連接的基礎上,將連接操作符右側表中不符合連接條件的記錄加入結果集中,與之對應的連接操作符左側表列用NULL填充。
- 完全連接是:全外連接:指在內連接的基礎上,將連接操作符兩側表中不符合連接條件的記錄全部加入結果集中。
- 注:左外連接其實就是:將左邊表中的數據全部顯示出不無論在其連接表中是否有對應的數據,如果沒有與之對應的連接表的值為NULL。
對於(+)操作符:
- 當使用(+)操作符執行外連接時,應當將該操作符放在顯示較少行(完全滿足連接條件行)一端。
- (+)操作符只能出現在where子句中,並且不能與outer join語法同時使用。
- 當使用(+)操作符執行外連接時,如果在where語句中包含多個條件,則必須在所有的條件中都包含(+)操作符。
- (+)操作符只能適用於列,而不能適用於表達式。
- (+)操作符不能與or和in操作符一起使用。
- (+)操作符只能用於左外連接和右外連接,不能用於實現完全連接。
- (+)所在位置的另一則為連接方向,而且如果后面有條件都要注意(+)位置
三、自連接
在應用開發中,用戶可能擁有“自引用式”的外鍵,“自引用式”外鍵是指表中的一個列可以是該表主鍵的一個外鍵。
例如:
SQL> select em2.ename 管理者,em1.ename 下屬員工 2 from emp em1 left join emp em2 3 on em1.mgr = em2.empno 4 order by em1.mgr; 管理者 下屬員工 -------------------- -------------------- JONES FORD JONES SCOTT BLAKE JAMES BLAKE TURNER BLAKE MARTIN BLAKE WARD BLAKE ALLEN CLARK MILLER SCOTT ADAMS KING CLARK KING BLAKE 管理者 下屬員工 -------------------- -------------------- KING JONES FORD SMITH KING LIKE EAST 已選擇16行。
四、交叉連接
交叉連接的執行結果是一個笛卡兒積,那么這種查詢結果是非常冗余的,但可以通過where子句來過濾。
QL> select count(*) from emp; COUNT(*) ---------- 16 SQL> select count(*) from dept; COUNT(*) ---------- 4 SQL> select count(*) from emp cross join dept; COUNT(*) ---------- 64