zoukankan      html  css  js  c++  java
  • 两表连接各种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日--

  • 相关阅读:
    LUA之面向对象
    LUA笔记之表
    LUA笔记之字符串
    STM32模拟I2C
    php(1)-php5.6启动命令
    ip地址变更对tomcat和nginx的影响
    解决 nginx: [alert] kill(189, 1) failed (3: No such process)
    linux(16)-yum安装提示“没有可用软件包”
    性能测试监控分析(17) 负载和CPU使用率低高负载的原因
    Codeforces Round #588 (Div. 2)C(思维,暴力)
  • 原文地址:https://www.cnblogs.com/heyang78/p/12267949.html
Copyright © 2011-2022 走看看