SQLSERVER通俗易懂的连接查询、联合查询

     最近有好多小伙伴对连接查询有很多的疑问,当然包括初学者和工作几年的老鸟大笑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.列名取第一个查询数据的名字

最后:查询这玩意儿有时候就那么回事,所以呢,你需要什么样的数据,保证那张表的数据完整,那么你就怎么玩,方法多的是还需要各位多加练习少放香葱

  • 21
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值