Oracle學習筆記(三)多表查詢(一)

上一篇博客所記錄的僅僅只是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裏面指示多個列名





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章