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
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

猜你喜欢

转载自www.cnblogs.com/xieviki650/p/SQL_JOIN.html