• 两表连接各种Join图示,SQL及查询结果


    按:SQL术语Join在中文对应的翻译是“连接”还是“联结”说法不一,下文将统一采用“连接”的译法。

    开局一张图:

    前奏/准备工作:

    Emp表结构:

    create table emp(
        empid number(4,0),
        empname nvarchar2(20),
        deptno number(4,0)
    )

    Emp充值语句:

    insert into emp(empid,empname,deptno) values('1','Andy','1');
    insert into emp(empid,empname,deptno) values('2','Bill','1');
    insert into emp(empid,empname,deptno) values('3','Cindy','2');
    insert into emp(empid,empname,deptno) values('4','Douglas','2');
    insert into emp(empid,empname,deptno) values('5','张三','4');
    insert into emp(empid,empname,deptno) values('6','李四','6');
    insert into emp(empid,empname,deptno) values('7','王五','7');

    Dept表结构:

    create table dept(
        deptid number(4,0),
        deptname nvarchar2(20)
    )

    Dept充值语句:

    insert into dept(deptid,deptname) values('1','研发');
    insert into dept(deptid,deptname) values('2','销售');
    insert into dept(deptid,deptname) values('3','市场');
    insert into dept(deptid,deptname) values('4','管理');
    insert into dept(deptid,deptname) values('5','公关');
    insert into dept(deptid,deptname) values('8','咨询');

    正文:

    内连接 :

    SQL语句:

    select emp.*,dept.* from emp inner join dept on emp.deptno=dept.deptid

    查询结果:

    SQL> select emp.*,dept.* from emp inner join dept on emp.deptno=dept.deptid;
    
         EMPID EMPNAME                                      DEPTNO     DEPTID DEPTNAME
    ---------- ---------------------------------------- ---------- ---------- ----------------------------------------
             2 Bill                                              1          1 研发
             4 Douglas                                           2          2 销售
             3 Cindy                                             2          2 销售
             5 张三                                               4          4 管理
    
    已用时间:  00: 00: 00.01

    左连接:

    SQL语句:

    select emp.*,dept.* from emp left join dept on emp.deptno=dept.deptid

    查询结果:

    SQL> select emp.*,dept.* from emp left join dept on emp.deptno=dept.deptid;
    
         EMPID EMPNAME                                      DEPTNO     DEPTID DEPTNAME
    ---------- ---------------------------------------- ---------- ---------- ----------------------------------------
             2 Bill                                              1          1 研发
             4 Douglas                                           2          2 销售
             3 Cindy                                             2          2 销售
             5 张三                                               4          4 管理
             6 李四                                               6
             7 王五                                               7
    
    已选择6行。
    
    已用时间:  00: 00: 00.00

    右连接:

    SQL:

    select emp.*,dept.* from emp right join dept on emp.deptno=dept.deptid

    查询结果:

    SQL> select emp.*,dept.* from emp right join dept on emp.deptno=dept.deptid;
    
         EMPID EMPNAME                                      DEPTNO     DEPTID DEPTNAME
    ---------- ---------------------------------------- ---------- ---------- ----------------------------------------
             2 Bill                                              1          1 研发
             3 Cindy                                             2          2 销售
             4 Douglas                                           2          2 销售
             5 张三                                               4          4 管理
                                                                            5 公关
                                                                            8 咨询
                                                                            3 市场
    
    已选择7行。
    
    已用时间:  00: 00: 00.01

    左连接去除内连

    SQL:

    select emp.*,dept.* from emp left join dept on emp.deptno=dept.deptid where dept.deptid IS NULL

    查询结果:

    SQL> select emp.*,dept.* from emp left join dept on emp.deptno=dept.deptid where dept.deptid IS NULL;
    
         EMPID EMPNAME                                      DEPTNO     DEPTID DEPTNAME
    ---------- ---------------------------------------- ---------- ---------- ----------------------------------------
             6 李四                                              6
             7 王五                                              7
    
    已用时间:  00: 00: 00.00

    右连接去除内连

    SQL:

    select emp.*,dept.* from emp right join dept on emp.deptno=dept.deptid where emp.deptno IS NULL

    查询结果:

    SQL> select emp.*,dept.* from emp right join dept on emp.deptno=dept.deptid where emp.deptno IS NULL;
    
         EMPID EMPNAME                                      DEPTNO     DEPTID DEPTNAME
    ---------- ---------------------------------------- ---------- ---------- ----------------------------------------
                                                                            5 公关
                                                                            8 咨询
                                                                            3 市场
    
    已用时间:  00: 00: 00.01

    全连接

    SQL:

    select emp.*,dept.* from emp full join dept on emp.deptno=dept.deptid 

    查询结果:

    SQL> select emp.*,dept.* from emp full join dept on emp.deptno=dept.deptid ;
    
         EMPID EMPNAME                                      DEPTNO     DEPTID DEPTNAME
    ---------- ---------------------------------------- ---------- ---------- ----------------------------------------
             2 Bill                                              1          1 研发
             4 Douglas                                           2          2 销售
             3 Cindy                                             2          2 销售
                                                                            3 市场
             5 张三                                              4          4 管理
                                                                            5 公关
                                                                            8 咨询
             6 李四                                              6
             7 王五                                              7
    
    已选择9行。
    
    已用时间:  00: 00: 00.01

     全连接去除内连接,这种查询适合比较两个结果集的差异,具体请见https://www.cnblogs.com/xiandedanteng/p/12239597.html

    SQL:

    select emp.*,dept.* from emp full join dept on emp.deptno=dept.deptid where emp.deptno IS NULL or dept.deptid IS NULL

    查询结果:

    SQL> select emp.*,dept.* from emp full join dept on emp.deptno=dept.deptid where emp.deptno IS NULL or dept.deptid IS NULL;
    
         EMPID EMPNAME                                      DEPTNO     DEPTID DEPTNAME
    ---------- ---------------------------------------- ---------- ---------- ----------------------------------------
                                                                            3 市场
                                                                            5 公关
                                                                            8 咨询
             6 李四                                              6
             7 王五                                              7
    
    已用时间:  00: 00: 00.00

    全外连接去除内连接

    SQL:

    select emp.*,dept.* from emp full outer join dept on emp.deptno=dept.deptid where emp.deptno IS NULL or dept.deptid IS NULL

    查询结果:

    SQL> select emp.*,dept.* from emp full outer join dept on emp.deptno=dept.deptid where emp.deptno IS NULL or dept.deptid IS NULL;
    
         EMPID EMPNAME                                      DEPTNO     DEPTID DEPTNAME
    ---------- ---------------------------------------- ---------- ---------- ----------------------------------------
                                                                            3 市场
                                                                            5 公关
                                                                            8 咨询
             6 李四                                              6
             7 王五                                              7
    
    已用时间:  00: 00: 00.00

    IN半连接:

    SQL:

    select emp.* from emp where emp.deptno in (select deptid from dept)

    查询结果:

    SQL> select emp.* from emp where emp.deptno in (select deptid from dept);
    
         EMPID EMPNAME                                      DEPTNO
    ---------- ---------------------------------------- ----------
             2 Bill                                              1
             4 Douglas                                           2
             3 Cindy                                             2
             5 张三                                               4
    
    已用时间:  00: 00: 00.00

    EXISTS半连接:

    SQL:

    select emp.* from emp where exists  (select NULL from dept where dept.deptid=emp.deptno)

    查询结果:

    SQL> select emp.* from emp where exists  (select NULL from dept where dept.deptid=emp.deptno);
    
         EMPID EMPNAME                                      DEPTNO
    ---------- ---------------------------------------- ----------
             2 Bill                                              1
             4 Douglas                                           2
             3 Cindy                                             2
             5 张三                                               4
    
    已用时间:  00: 00: 00.01

    IN反连接:

    SQL:

    select emp.* from emp where emp.deptno not in (select deptid from dept)

    查询结果:

    SQL> select emp.* from emp where emp.deptno not in (select deptid from dept);
    
         EMPID EMPNAME                                      DEPTNO
    ---------- ---------------------------------------- ----------
             6 李四                                              6
             7 王五                                              7
    
    已用时间:  00: 00: 00.00

    EXISTS反连接:

    SQL:

    select emp.* from emp where not exists  (select NULL from dept where dept.deptid=emp.deptno)

    查询结果:

    SQL> select emp.* from emp where not exists  (select NULL from dept where dept.deptid=emp.deptno);
    
         EMPID EMPNAME                                      DEPTNO
    ---------- ---------------------------------------- ----------
             6 李四                                              6
             7 王五                                              7
    
    已用时间:  00: 00: 00.00

    参考网页:https://docs.oracle.com/cd/E11882_01/server.112/e41084/queries006.htm#SQLRF30046

    实验环境:

    # 类别 版本
    1 操作系统 Win10
    2 数据库 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
    3 硬件环境 T440p
    4 内存 8G

    --2020年2月6日--

  • 相关阅读:
    EXTJS 基本使用
    EXTJS 常用控件的使用
    EXTJS 验证与表单提交
    EXTJS 常用方法
    禁用USB移动盘的方法
    常用sql 函数练习示例
    .Net 中的反射(反射特性) Part.3
    Delphi調用.NET的WebService
    c#写的串口通讯
    打印控制
  • 原文地址:https://www.cnblogs.com/heyang78/p/12267949.html
Copyright © 2020-2023  润新知