上一篇博客所記錄的僅僅只是Oracle裏面最簡單的select語句,這些語句涉及到的表只有一個,而且結構也不太複雜。今天我們將來實現稍微比較複雜的多表查詢
1,最簡單的多表查詢:
SQL> SELECT e.empno , e.ename , e.sal , d.deptno
2 FROM emp e , dept d
3 WHERE e.deptno=d.deptno ;
EMPNO ENAME SAL DEPTNO
---------- ---------- ---------- ----------
7369 SMITH 800 20
7499 ALLEN 1600 30
7521 WARD 1250 30
7566 JONES 2975 20
7654 MARTIN 1250 30
7698 BLAKE 2850 30
7782 CLARK 2450 10
7788 SCOTT 3000 20
7839 KING 5000 10
7844 TURNER 1500 30
7876 ADAMS 1100 20
7900 JAMES 950 30
7902 FORD 3000 20
7934 MILLER 1300 10
已選擇14行。
在多表查詢中,如果只通過SELECT和FROM連接多個表,查詢的結果將會是一個笛卡爾積所生成的表。
所謂的笛卡爾積所生成的表,就是一個基本表中每一行與另一個基本表每一行連接在一起所生成的表。查詢結果的行數是兩個基本表的行數的積。
執行語句:
select e.empno , e.ename , e.sal ,d.deptno from emp e , dept d ;
得到下面結果:
輸出的行數剛好是14*4=56行。所以我們需要用WHERE語句防止產生笛卡爾積的表。
2,使用INNER JOIN實現多個表的內連接
INNER JOID與上面的多表查詢很相似,或則說只是上面語句的一種變形而已。
下面的測試我們將與
SELECT e.empno , e.ename , e.sal , d.deptnoFROM emp e , dept d WHERE e.deptno=d.deptno ;
的結果進行比較
a,等值連接
SQL> SELECT e.empno , e.ename , e.sal , d.deptno
2 FROM emp e INNER JOIN dept d
3 ON e.deptno=d.deptno ;
EMPNO ENAME SAL DEPTNO
---------- ---------- ---------- ----------
7369 SMITH 800 20
7499 ALLEN 1600 30
7521 WARD 1250 30
7566 JONES 2975 20
7654 MARTIN 1250 30
7698 BLAKE 2850 30
7782 CLARK 2450 10
7788 SCOTT 3000 20
7839 KING 5000 10
7844 TURNER 1500 30
7876 ADAMS 1100 20
7900 JAMES 950 30
7902 FORD 3000 20
7934 MILLER 1300 10
已選擇14行。
b,不等值連接
在連接條件中使用除等號(=)外的表運算符。
SQL> SELECT empno , ename , sal ,grade
2 FROM emp e
3 INNER JOIN salgrade s
4 ON e.sal BETWEEN s.losal AND s.hisal ;
EMPNO ENAME SAL GRADE
---------- ---------- ---------- ----------
7369 SMITH 800 1
7900 JAMES 950 1
7876 ADAMS 1100 1
7521 WARD 1250 2
7654 MARTIN 1250 2
7934 MILLER 1300 2
7844 TURNER 1500 3
7499 ALLEN 1600 3
7782 CLARK 2450 4
7698 BLAKE 2850 4
7566 JONES 2975 4
EMPNO ENAME SAL GRADE
---------- ---------- ---------- ----------
7788 SCOTT 3000 4
7902 FORD 3000 4
7839 KING 5000 5
已選擇14行。
c,自然連接
SQL> SELECT e.empno , e.ename , e.sal , d.deptno
2 FROM emp e NATURAL JOIN dept d ;
SELECT e.empno , e.ename , e.sal , d.deptno
*
第 1 行出現錯誤:
ORA-25155: NATURAL 聯接中使用的列不能有限定詞
SQL> SELECT e.empno , e.ename , e.sal , deptno
2 FROM emp e NATURAL JOIN dept d ;
EMPNO ENAME SAL DEPTNO
---------- ---------- ---------- ----------
7369 SMITH 800 20
7499 ALLEN 1600 30
7521 WARD 1250 30
7566 JONES 2975 20
7654 MARTIN 1250 30
7698 BLAKE 2850 30
7782 CLARK 2450 10
7788 SCOTT 3000 20
7839 KING 5000 10
7844 TURNER 1500 30
7876 ADAMS 1100 20
7900 JAMES 950 30
7902 FORD 3000 20
7934 MILLER 1300 10
已選擇14行。
-------------------------------------------------------------------------------------------
d,使用USING關鍵字簡化連接(這種效果跟第一種非常相似)
查詢必須滿足下面條件
*查詢必須是等值連接
*等值連接中的列必須具有相同的名稱和數據類型
SQL> SELECT e.empno , e.ename , e.sal , d.deptno
2 FROM emp e INNER JOIN dept d
3 USING(deptno) ;
SELECT e.empno , e.ename , e.sal , d.deptno
*
第 1 行出現錯誤:
ORA-25154: USING 子句的列部分不能有限定詞
SQL> SELECT empno , ename , sal , deptno
2 FROM emp e INNER JOIN dept d
3 USING(deptno) ;
EMPNO ENAME SAL DEPTNO
---------- ---------- ---------- ----------
7369 SMITH 800 20
7499 ALLEN 1600 30
7521 WARD 1250 30
7566 JONES 2975 20
7654 MARTIN 1250 30
7698 BLAKE 2850 30
7782 CLARK 2450 10
7788 SCOTT 3000 20
7839 KING 5000 10
7844 TURNER 1500 30
7876 ADAMS 1100 20
7900 JAMES 950 30
7902 FORD 3000 20
7934 MILLER 1300 10
已選擇14行。
使用USING關鍵字簡化連接時,需要注意一下幾點:
1,USING 語句和SELECT語句都不能爲字段指定別名與表別名
2,如果連接查詢時使用了兩個表中相同的多個列,那麼我們可以在USING裏面指示多個列名