多表的查询,会涉及到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