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里面指示多个列名





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