加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle学习(5)---数据定义语言---连接查询

发布时间:2020-12-12 15:30:28 所属栏目:百科 来源:网络整理
导读:连接查询 源码项目地址 在应用中所需要的数据来自于一个表的情况非常少。经常会需要查询两个或两个 以上的表。这种查询两个或两个以上的数据表或试图的查询叫做连接查询。 表的连接查询包括等值连接、非等值连接、自连接、内连接和外连接,以等值连 接为例,下

连接查询

源码项目地址

在应用中所需要的数据来自于一个表的情况非常少。经常会需要查询两个或两个 以上的表。这种查询两个或两个以上的数据表或试图的查询叫做连接查询。

表的连接查询包括等值连接、非等值连接、自连接、内连接和外连接,以等值连 接为例,下面描述连接查询的语法:

SELECT table1.column,table2.column
        FROM table1,table2
        WHERE table1.column1 = table2.column2;

可以使用表的别名来简化连接查询。一旦给表定义了别名,在整个SQL语句中就不能 再使用表的全名了,可以对比一下不使用或使用别名的效果。

--不使用别名

        SELECT EMP.ENAME,DEPT.DNAME
        FROM EMP,DEPT
        WHERE EMP.DEPTNO = DEPT.DEPT.NO;

    --使用别名

        SELECT E.ENAME,D.DNAME
        FROM EMP E,DEPT D
        WHERE E.DEPTNO = D.DEPT.NO;
  1. 等值连接

> 等值连接是连接查询中最常见的一种,通常是在有主外键关系的表间建立,并将连接
条件设定为有关系的列,使用 "=" 连接相关的表。

--例1: 等值连接查询

    --查询职员表中的全部数据

         SELECT E.ENAME,E.JOB,D.DNAME,D.LOC
         FROM SCOTT.EMP E,SCOTT.DEPT D
         WHERE E.DEPTNO = D.DEPTNO;

    --除了等值连接条件外还有其他连接条件

         SELECT E.ENAME,SCOTT.DEPT D
         WHERE E.DEPTNO = D.DEPTNO
         AND E.DEPTNO = 10;

结果为: ![等值连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/25.png)
![等值连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/26.png)

也可以以此类推,对多个表做等值连接查询,多个表之间存在主从表关系,连接
条件同样写在WHERE子句中。为了避免笛卡尔积,连接n各表,最少需要n-1个
连接条件
  1. 非等值连接

> 非等值连接在多个表使用非等号连接,查询在多个表中有非等值关联关系的
数据,非等值连接符包括 >,>=,<,<=,<>以及 BETWEEN...AND,LIKE,IN等。

--例2: 非等值连接的查询
--查询每个职员的工资级别

        SELECT E.ENAME,E.SAL,S.GRADE
        FROM SCOTT.EMP E,SCOTT.SALGRADE S
        WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;

结果为: ![等值连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/27.png)
  1. 自连接

> 自连接是一种比较特殊的连接查询,数据的来源是一个表,即关联关系来自于
单表中的多个列。表中的列参照同一个表中的其它列的情况称作自参表。
自连接是通过将表用别名虚拟成两个表的方式实现,可以是等值或不等值连接。

--例3: 自连接
--查出每个职员经理的名字,以及他们的职员编码

        SELECT
        WORKER.EMPNO W_EMPNO,WORKER.ENAME W_ENAME,MANAGER.EMPNO M_EMPNO,MANAGER.ENAME M_ENAME
        FROM SCOTT.EMP WORKER,SCOTT.EMP MANAGER
        WHERE WORKER.MGR = MANAGER.EMPNO;

结果为: ![自连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/28.png)
  1. 内连接和外连接

> 上面所介绍的连接查询都属于内连接,即返回满足连接条件的数据记录,在有些情况下,需要返回
那些不满足连接天剑的记录。在Oracle 9i版本之后外链接一般在FROM短句中指定。

    Oracle 9i之后的外链接语法:

        SELECT table1.column,table2.column
        FROM table1 [INNER | LEFT | RIGHT | FULL] JOIN table2
        ON table1.column1 = table2.column2;

1. ### 内连接
    > 内连接返回所有满足连接条件的记录

    --例4: 内连接(1)
    --使用等值连接的形式

            SELECT E.ENAME,D.DNAME
            FROM SCOTT.EMP E,SCOTT.DEPT D
            WHERE E.DEPTNO = D.DEPTNO;

    结果为: ![内连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/29.png)

    --例5: 内连接(2)
    --使用NATURAL JOIN对于,将两个表中所有同名列做等值连接。如果两个表中同名列数据
    --类型不能比较的话,就会报错

            SELECT E.ENAME,D.DNAME
            FROM SCOTT.EMP E NATURAL JOIN SCOTT.DEPT D;

    结果为: ![内连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/30.png)

    --例6: 内连接(3)
    --使用USING子句实现,较NATURAL JOIN方式更灵活,是将两个表中指定的同名列做等值
    --连接,避免了同名列可能因类型不同导致的错误。

            SELECT E.ENAME,D.DNAME
            FROM SCOTT.EMP E JOIN SCOTT.DEPT D
            USING(DEPTNO);

    结果为: ![内连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/30.png)

    --例7: 内连接(4)
    --使用ON子句。这种方式避免了第3种方式必须有同名列的缺陷,可以在ON子句中指定连接条件,--列名可以相同也可以不同。

            SELECT E.ENAME,D.DNAME
            FROM SCOTT.EMP E JOIN SCOTT.DEPT D
            ON (E.DEPTNO = D.DEPTNO);

    结果为: ![内连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/30.png)

2. ### 左外链接
    > 外连接是内连接的一种扩展,做外链接是指不仅会返回满足连接条件的记录,还可以返回那些
    不满足连接条件的操作符左边表的其它记录。

    --例8: 左外连接

            INSERT INTO SCOTT.EMP(EMPNO,ENAME)
            VALUES (1235,'MATHA');

            SELECT E.ENAME,D.DNAME
            FROM SCOTT.EMP E LEFT OUTER JOIN SCOTT.DEPT D
            ON E.DEPTNO = D.DEPTNO;

    结果为: ![左外连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/31.png)

3. ### 右外链接
    > 右外连接除了返回满足连接条件的记录,还可以返回那些不满足连接条件的操作符右边表
    的其它记录

    --例9: 右外连接

            SELECT E.ENAME,D.DNAME
            FROM SCOTT.EMP E RIGHT OUTER JOIN SCOTT.DEPT D
            ON E.DEPTNO = D.DEPTNO;

    结果为: ![右外连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/32.png)

4. ### 全外连接
    > 全外连接是指返回满足条件的记录,还会返回不满足连接条件的所有其他行,即使左链接和右连接的综合。

    --例10: 全外连接

            SELECT E.ENAME,D.DNAME
            FROM SCOTT.EMP E FULL OUTER JOIN SCOTT.DEPT D
            ON E.DEPTNO = D.DEPTNO;

    结果为: ![全外连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/33.png)
    ![全外连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/34.png)

源码项目地址

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读