• SQL----Inner Join、 Outer Join、Cross Join理解


    多表的查询,会涉及到Join操作

    总结一下查询的种类和使用方法。 

    准备数据:

     假设有两个表,学生和班级。

    create table Stu (
        Stu_no varchar(10),
        Class_no nvarchar(10)
        primary key(Stu_no)
    )
    
    create table Class(
        Class_no nvarchar(10),
        Class_teacher nvarchar(10)
        primary key(Class_no)
    )
    
    insert into Stu 
    values ('1','电系'),('2','火系'),('3','水系')
    
    insert into Class
    values ('金系','皮卡丘'),('草系','妙蛙种子'),('水系','蚊香蝌蚪')

    这里的数据,学生表1,2号的班级电系,火系,班级表中没有

    班级表草系,金系,在学生表中也不存在

                

    sql的join可以分为内连接(inner join),外连接(outer join)、交叉连接(cross join)

    其中inner和outer语法中需要加on, on后为连接条件,按照这个条件来进行筛选

    cross语法不需要加on

    1.inner join 内连接

          看成两个表的并集,要求每个表中每一行都匹配,不匹配的行会被排除

           

          在Stu、Class两表中使用内连接,目的是取出当前有班主任的学生的信息   

    select * 
    from Stu inner join Class    -- join 是inner join的简写版
    on Stu.Class_no = Class.Class_no

        学生表中学生1,2分别是电系和火系的,班级表中没有这个班级,就删去1,2学生的信息

        班级表的草系和金系,在学生表中没有这样班级的学生,于是将草系,金系删除

        这样获取学生,老师信息是一一对应的

        

    2.outer join 外连接

      外连接分为三大类,左连接、右连接、全链接

    左(外)连接:

        看作两个表的下图连接,左表中的每一行都要存在,右表与左表不匹配的内容删去,输出中匹配不了的右表部分使用null

           

        Stu、Class做左连接,目的是选取每个学生的信息,学号,班级,老师,没有班主任的学生也要输出

    select * 
    from Stu left join Class 
    on Stu.Class_no = Class.Class_no

        学生表1,2分别是电系和火系,在右表班级中没有对应的班级,使用null值代替,仍输出左表不匹配内容

        班级草系、金系在左表学生中没有匹配,删除

        

    左内连接:

        看作是两个表做下图操作,在左外连接上去除了右表存在部分,只提取左表没有匹配的行

        

        Stu,Class进行左内连接,目的选取所有没有班主任的学生

    select * 
    from Stu left join Class 
    on Stu.Class_no = Class.Class_no
    where Class.Class_no is null

        在左连接的基础上,选择右表匹配项为null值的项,就是左表中没有匹配的项

        进行左连接后,1,2号学生没有匹配到班主任,右表内容为null,选择右表值为null的项就可以将左表未匹配项选择出来  

        

    右(外)连接:

        将两表看作下图操作,右表中每一行都存在,左表与右表匹配不了的行删去,输出中匹配不了的左表部分使用null填充

        

        Stu、Class进行右连接,输出所有班级信息,没有学生也输出

    select * 
    from Stu right join Class
    on Stu.Class_no = Class.Class_no

        班级表中信息全部输出,草系,金系与左表没有匹配项,将左表内容用null进行输出

        

    右内连接:

        将两表看作下图操作,在右外连接的基础上,除去左表也存在的内容,提取右表中没有匹配的行

        

        Stu、Class右内操作,输出所有没有学生的班级

    select * 
    from Stu right join Class
    on Stu.Class_no = Class.Class_no
    where Stu.Class_no is null

        在右外连接的基础上,班级表草系,金系对应学生表中的信息为空,将空值输出

        

    全(外)链接:

        两个表进行并集操作,对应不匹配位置使用null值替代

        

        Stu、Class进行并集操作,目的选出所有学生,班级信息

    select * 
    from Stu full join Class
    on Stu.Class_no = Class.Class_no

      

        

    全内连接:

        两表进行下图操作,选出左右两表所有没有匹配的项

        

    select * 
    from Stu full join Class
    on Stu.Class_no = Class.Class_no
    -- 全内连接
    where Stu.Class_no is null or Class.Class_no is null 

        Stu、Class做全内连接,选出两个表中所有没有匹配的项

        

    3.Cross join 交叉连接

        两个表中所有元素的排列组合,Stu表中有3个班级,Class表中有3个班级,输出值为3*3 = 9个

        cross join 不用加on

    select *   
    from Stu cross join Class

        什么都不加,直接在from后面放两个表,也是交叉连接

    select * 
    from Stu,Class

  • 相关阅读:
    在线用户数与并发用户数的区别和比例关系
    MYSQL中数据类型介绍
    5分钟教你搞定RAID模式
    nginx与fastdfs配置详解与坑
    Fastdfs group通过添加硬盘扩容
    fastDfs配置文件tracker.conf配置详解
    FastDFS配置详解之Storage配置
    mysql修改库名
    vCenter Server Appliance(VCSA )6.7部署指南
    如何知道一个函数的执行时间简单案例
  • 原文地址:https://www.cnblogs.com/xieviki650/p/SQL_JOIN.html
Copyright © 2020-2023  润新知