oracle連接類型
實現多表的簡單連接時,如果僅僅通過select子句和from子句連接多個表,那麼查詢的結果將是一個通過笛卡兒積所生成的表。
所謂的笛卡兒積所生成的表,就是一個基本表中每一行與另一個基本表中的每一行連接在一起所生成的表,查詢結果的行數是兩個基本表的行數的積。
如下,使用oracle中的emp和dept兩個表連接查詢:
SQL> select * from emp,dept;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DEPTNO DNAME LOC
------ --------- --------- ----- ---------- ------ ----- ------ ------ ------------ -------------
7369 SMITH CLERK 7902 17-12月-80 800 20 10 ACCOUNTING NEW YORK
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 10 ACCOUNTING NEW YORK
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 10 ACCOUNTING NEW YORK
7566 JONES MANAGER 7839 02-4月 -81 2975 20 10 ACCOUNTING NEW YORK
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 10 ACCOUNTING NEW YORK
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 10 ACCOUNTING NEW YORK
7782 CLARK MANAGER 7839 09-6月 -81 2450 10 10 ACCOUNTING NEW YORK
7788 SCOTT ANALYST 7566 24-1月 -87 3000 20 10 ACCOUNTING NEW YORK
7839 KING PRESIDENT 17-11月-81 5000 10 10 ACCOUNTING NEW YORK
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 10 ACCOUNTING NEW YORK
7876 ADAMS CLERK 7788 02-4月 -87 1100 20 10 ACCOUNTING NEW YORK
7900 JAMES CLERK 7698 03-12月-81 1800 30 10 ACCOUNTING NEW YORK
7902 FORD ANALYST 7566 03-12月-81 3000 20 10 ACCOUNTING NEW YORK
7934 MILLER CLERK 7782 23-1月 -82 1300 10 10 ACCOUNTING NEW YORK
7935 XIAOXUE MANAGER 7839 01-3月 -98 5000 500 20 10 ACCOUNTING NEW YORK
7369 SMITH CLERK 7902 17-12月-80 800 20 20 RESEARCH DALLAS
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 20 RESEARCH DALLAS
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 20 RESEARCH DALLAS
7566 JONES MANAGER 7839 02-4月 -81 2975 20 20 RESEARCH DALLAS
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 20 RESEARCH DALLAS
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 20 RESEARCH DALLAS
7782 CLARK MANAGER 7839 09-6月 -81 2450 10 20 RESEARCH DALLAS
7788 SCOTT ANALYST 7566 24-1月 -87 3000 20 20 RESEARCH DALLAS
7839 KING PRESIDENT 17-11月-81 5000 10 20 RESEARCH DALLAS
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 20 RESEARCH DALLAS
7876 ADAMS CLERK 7788 02-4月 -87 1100 20 20 RESEARCH DALLAS
7900 JAMES CLERK 7698 03-12月-81 1800 30 20 RESEARCH DALLAS
7902 FORD ANALYST 7566 03-12月-81 3000 20 20 RESEARCH DALLAS
7934 MILLER CLERK 7782 23-1月 -82 1300 10 20 RESEARCH DALLAS
7935 XIAOXUE MANAGER 7839 01-3月 -98 5000 500 20 20 RESEARCH DALLAS
7369 SMITH CLERK 7902 17-12月-80 800 20 30 SALES CHICAGO
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 30 SALES CHICAGO
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 30 SALES CHICAGO
7566 JONES MANAGER 7839 02-4月 -81 2975 20 30 SALES CHICAGO
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 30 SALES CHICAGO
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 30 SALES CHICAGO
7782 CLARK MANAGER 7839 09-6月 -81 2450 10 30 SALES CHICAGO
7788 SCOTT ANALYST 7566 24-1月 -87 3000 20 30 SALES CHICAGO
7839 KING PRESIDENT 17-11月-81 5000 10 30 SALES CHICAGO
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 30 SALES CHICAGO
7876 ADAMS CLERK 7788 02-4月 -87 1100 20 30 SALES CHICAGO
7900 JAMES CLERK 7698 03-12月-81 1800 30 30 SALES CHICAGO
7902 FORD ANALYST 7566 03-12月-81 3000 20 30 SALES CHICAGO
7934 MILLER CLERK 7782 23-1月 -82 1300 10 30 SALES CHICAGO
7935 XIAOXUE MANAGER 7839 01-3月 -98 5000 500 20 30 SALES CHICAGO
7369 SMITH CLERK 7902 17-12月-80 800 20 40 OPERATIONS BOSTON
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 40 OPERATIONS BOSTON
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 40 OPERATIONS BOSTON
7566 JONES MANAGER 7839 02-4月 -81 2975 20 40 OPERATIONS BOSTON
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 40 OPERATIONS BOSTON
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 40 OPERATIONS BOSTON
7782 CLARK MANAGER 7839 09-6月 -81 2450 10 40 OPERATIONS BOSTON
7788 SCOTT ANALYST 7566 24-1月 -87 3000 20 40 OPERATIONS BOSTON
7839 KING PRESIDENT 17-11月-81 5000 10 40 OPERATIONS BOSTON
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 40 OPERATIONS BOSTON
7876 ADAMS CLERK 7788 02-4月 -87 1100 20 40 OPERATIONS BOSTON
7900 JAMES CLERK 7698 03-12月-81 1800 30 40 OPERATIONS BOSTON
7902 FORD ANALYST 7566 03-12月-81 3000 20 40 OPERATIONS BOSTON
7934 MILLER CLERK 7782 23-1月 -82 1300 10 40 OPERATIONS BOSTON
7935 XIAOXUE MANAGER 7839 01-3月 -98 5000 500 20 40 OPERATIONS BOSTON
已選擇 60 行。
以上得到60行數據,但是上面所得到的數據中冗余的數據很多,我們可以用where子句中消除部分冗余數據:
SQL> select * from emp,dept where emp.deptno=dept.deptno;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO DEPTNO DNAME LOC
------ --------- --------- ----- ---------- ------ ----- ------ ------ ------------ -------------
7369 SMITH CLERK 7902 17-12月-80 800 20 20 RESEARCH DALLAS
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 30 SALES CHICAGO
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 30 SALES CHICAGO
7566 JONES MANAGER 7839 02-4月 -81 2975 20 20 RESEARCH DALLAS
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 30 SALES CHICAGO
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 30 SALES CHICAGO
7782 CLARK MANAGER 7839 09-6月 -81 2450 10 10 ACCOUNTING NEW YORK
7788 SCOTT ANALYST 7566 24-1月 -87 3000 20 20 RESEARCH DALLAS
7839 KING PRESIDENT 17-11月-81 5000 10 10 ACCOUNTING NEW YORK
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 30 SALES CHICAGO
7876 ADAMS CLERK 7788 02-4月 -87 1100 20 20 RESEARCH DALLAS
7900 JAMES CLERK 7698 03-12月-81 1800 30 30 SALES CHICAGO
7902 FORD ANALYST 7566 03-12月-81 3000 20 20 RESEARCH DALLAS
7934 MILLER CLERK 7782 23-1月 -82 1300 10 10 ACCOUNTING NEW YORK
7935 XIAOXUE MANAGER 7839 01-3月 -98 5000 500 20 20 RESEARCH DALLAS
已選擇 15 行。
SQL>
結果比上面的簡潔得多。
在連接查詢的from子句中,多個表之間可以使用英文逗號進行分割。除了這種形式外,sql還支持使用關鍵字join進行連接。
在from子句中,使用join連接的語法形式如下:
from join_table1 join_type join_table2 [on(join_condition)]
[join_type...on join_condition,...]
join_table1,join_table2表示參與連接操作的表名。
join_type連接類型,連接類型有inner join(內連接),outer join(外連接)和cross join(交叉連接)
join_condition連接條件,由被連接表中的列和比較運算符,邏輯運算符等構成。還可以使用多組的join_type...on join_condition...子句,實現多個表的連接。
內連接
內連接時最常用的連接查詢方式,使用inner join關鍵字進行指定。如果知識使用join關鍵字,默認表示內連接。
內連接使用比較運算符,在連接表的某些列之間進行比較操作,並列出表中與連接條件相匹配的數據行。
根據使用的比較方式不同,內連接又分為等值連接,自然連接和不等連接。
1.等值連接
所謂的等值連接,是指在連接條件中使用等號運算符比較被連接的值,也就是通過相等的列值連接起來的查詢。
例:使用inner join連接兩個不同的表emp和dept,on用來設置連接條件,使用where子句限制查詢范圍。檢索accounting部門的員工信息,如下:
SQL> select empno,ename,sal,d.deptno,dname from emp e inner join dept d on e.deptno=d.deptno where dname='ACCOUNTING';
EMPNO ENAME SAL DEPTNO DNAME
---------- ---------- ---------- ---------- --------------
7782 CLARK 2450 10 ACCOUNTING
7839 KING 5000 10 ACCOUNTING
7934 MILLER 1300 10 ACCOUNTING
確實從上面可以看出數據庫中只用三條dname為accounding的記錄。
同樣的,我們也可以選擇部門編號大於20的記錄。
SQL> select empno,ename,sal,d.deptno,dname from emp e inner join dept d on e.deptno=d.deptno where d.deptno>20;
EMPNO ENAME SAL DEPTNO DNAME
---------- ---------- ---------- ---------- --------------
7499 ALLEN 1600 30 SALES
7521 WARD 1250 30 SALES
7654 MARTIN 1250 30 SALES
7698 BLAKE 2850 30 SALES
7844 TURNER 1500 30 SALES
7900 JAMES 950 30 SALES
已選擇 6 行。
2.不等連接
所謂的不等連接,就是在連接條件中使用除了等號之外的其他比較運算符,構成非等值連接查詢。可以使用的比較運算符包括>,<,>=,<=,<>(不等於),!=,like,in和between等。
例如:通過emp表和salgrade表,查詢員工的工資等級。使用between運算符,建立不等連接,
salgrade為工資等級,該表中的數據如下,其中工資分為5的等級,每條數據中有個最低工資和最高工資:
SQL> select * from salgrade;
GRADE LOSAL HISAL
---------- ---------- ----------
1 700 1200
2 1201 1400
3 1401 2000
4 2001 3000
5 3001 9999
SQL> select empno,ename,sal,grade from emp e inner join salgrade s on e.sal between s.losal and s.hisal;
EMPNO ENAME SAL GRADE
------ --------- ------ ----------
7369 SMITH 800 1
7876 ADAMS 1100 1
7521 WARD 1250 2
7654 MARTIN 1250 2
7934 MILLER 1300 2
7499 ALLEN 1600 3
7844 TURNER 1500 3
7900 JAMES 1800 3
7566 JONES 2975 4
7698 BLAKE 2850 4
7782 CLARK 2450 4
7788 SCOTT 3000 4
7902 FORD 3000 4
7839 KING 5000 5
7935 XIAOXUE 5000 5
已選擇 15 行。
3.自然連接
自然連接是在兩個表中尋找列名和數據類型都相同的字段,通過相同的字段將兩個表連接在一起,並返回所有符合條件的結果。
使用自然連接,需要指定natural join連接關鍵字,但不需要指定連接的條件。
使用自然連接需要注意以下的幾點:
(1)如果自然連接的兩個表中有多個字段都滿足名稱和數據類型相同,那麼它們都會被作為自然連接的條件。
(2)如果自然連接的兩個表中,僅僅是字段名稱相同,而字段的數據類型不同,那麼使用該字段進行連接將會返回一個錯誤。
(3)由於oracle支持自然連接,那麼在設計表時,應該盡量子啊不同的表中將具有相同含義de字段使用相同的名字和數據類型,如果總是對主鍵和外鍵使用相同的名字,嘛呢就可以滿足自然連接。
SQL> select e.ename,e.sal,deptno,d.dname from emp e natural join dept d;
ENAME SAL DEPTNO DNAME
--------- ------ ------ ------------
SMITH 800 20 RESEARCH
ALLEN 1600 30 SALES
WARD 1250 30 SALES
JONES 2975 20 RESEARCH
MARTIN 1250 30 SALES
BLAKE 2850 30 SALES
CLARK 2450 10 ACCOUNTING
SCOTT 3000 20 RESEARCH
KING 5000 10 ACCOUNTING
TURNER 1500 30 SALES
ADAMS 1100 20 RESEARCH
JAMES 1800 30 SALES
FORD 3000 20 RESEARCH
MILLER 1300 10 ACCOUNTING
XIAOXUE 5000 20 RESEARCH
由上面可知在emp和dept表中有deptno字段相同
SQL> select * from emp e natural join dept d;
DEPTNO EMPNO ENAME JOB MGR HIREDATE SAL COMM DNAME LOC
------ ------ --------- --------- ----- ---------- ------ ----- ------------ -------
20 7369 SMITH CLERK 7902 17-12月-80 800 RESEARCH DALLAS
30 7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 SALES CHICAGO
30 7521 WARD SALESMAN 7698 22-2月 -81 1250 500 SALES CHICAGO
20 7566 JONES MANAGER 7839 02-4月 -81 2975 RESEARCH DALLAS
30 7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 SALES CHICAGO
30 7698 BLAKE MANAGER 7839 01-5月 -81 2850 SALES CHICAGO
10 7782 CLARK MANAGER 7839 09-6月 -81 2450 ACCOUNTING NEW YORK
20 7788 SCOTT ANALYST 7566 24-1月 -87 3000 RESEARCH DALLAS
10 7839 KING PRESIDENT 17-11月-81 5000 ACCOUNTING NEW YORK
30 7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 SALES CHICAGO
20 7876 ADAMS CLERK 7788 02-4月 -87 1100 RESEARCH DALLAS
30 7900 JAMES CLERK 7698 03-12月-81 1800 SALES CHICAGO
20 7902 FORD ANALYST 7566 03-12月-81 3000 RESEARCH DALLAS
10 7934 MILLER CLERK 7782 23-1月 -82 1300 ACCOUNTING NEW YORK
20 7935 XIAOXUE MANAGER 7839 01-3月 -98 5000 500 RESEARCH DALLAS
已選擇 15 行。