最近有好多小伙伴对连接查询有很多的疑问,当然包括初学者和工作几年的老鸟so,抛开那些数学公式,我打算用通俗易懂的图文方式来对连接和联合查询做一些自己的见解,还有更高明的还希望各位不吝赐教
首先创建两个表,学生和班级表,一个班级对应多个学生
--新建学生表
select * into Student
from
(select 1 as id ,'张三' as name , 18 as age,1 as classId
union select 2 as id ,'李四' as name , 19 as age,1 as classid
union select 3 as id ,'王麻子' as name , 18 as age,2 as classid
union select 4 as id ,'熊二' as name , 19 as age,4 as classid) as studen
--新建班级表
select * into Class
from
(select 1 as cid ,'软件工程一班' as className
union select 2 as cid ,'软件工程二班' as className
union select 3 as cid ,'软件工程三班' as className ) as class
这里呢熊二是找不到班级的,软件工程三班现在是没有学生的,这样做的目的就是为了区分每个查询的区别
下面来分析各种连接查询:
内连接:
--内连接
select * from Student inner join Class on Student.classId = Class.cid
select * from Student join Class on Student.classId = Class.cid
结论:我们可以看出Student表的“熊二”没有班级,Class表的“软件工程三班”在对应表里面都没有找到相对应数据,说以呢内连接的查询是对于两张表有对应数据的查询,没有对应得就不关我的事。
注:那么这里为毛把inner jion 和join拿出来做比较呢,有个小伙子面试被问道了有啥区别。。所以呢 就是这样的区别,inner关键字可以去掉,join就是inner join的一个简写而已。。。没什么的
左连接:
--左连接
select * from Student left join Class on Student.classId = Class.cid
结论:左连接在例子里可以看出,以两个查询表左边的表为主表,右边的表为辅表,简单的说就是要保存左边的数据完整,右边有没有对应我不管,右边没有对应的所有列为null。
右连接:
--右连接
select * from Student right join Class on Student.classId = Class.cid
结论:跟左连接相反,这里右连接是以右表为主,左表为辅,保证右表的数据完整性。有小伙伴看出来了,这里用了左连接和右连接查询,结果是相同的,只是数据位置不同而已,这里不影响结果。。so,左连接和右连接可以相互转换查询。
全连接:
--全连接
select * from Student full join Class on Student.classId = Class.cid
结论:这里可以看出,不管是Student表里面没有对应班级的“熊二”,还是Class表里面没有学生的“软件工程三班”,都查询出来了,而没有对应得令一张表数据为null,这样保证了两个表的数据完整性。
交叉连接:
--交叉连接
select * from Student cross join Class
结论:这里查询出来的表数据是相乘,也就是传说中的笛卡尔积。。不管数据是否对应,左边的表所有数据循环的与右边的表中的数据去连接查询。
连接查询呢就这么多,下面讲讲联合查询。
联合查询:
--联合查询 union
select 1 as cid ,'软件工程一班' as className
union select 1 as cid ,'软件工程一班' as className
--联合查询 union all
select 1 as cid ,'软件工程一班' as className
union all select 1 as cid ,'软件工程一班' as className
结论:这里用union 和 union all做了一个比较。联合查询带all的,那就是不管有没有数据重复,结果都显示。
1.联合查询这里要注意几个地方就是查询联合的数据列转换后一定是同类型的,比如int和decimal(18, 2),那么转换后都是decimal(18, 2)类型的;
2.列名取第一个查询数据的名字
最后:查询这玩意儿有时候就那么回事,所以呢,你需要什么样的数据,保证那张表的数据完整,那么你就怎么玩,方法多的是还需要各位多加练习少放香葱