SQL Server进阶(4):cross join、inner join、left join、right jion、union、union all
测试数据脚本
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
CREATE TABLE Atable ( S# INT, Sname nvarchar(32), Sage INT, Sfrom nvarchar(8) ) insert into Atable select 1,N'李四',18,N'A' union all select 2,N'tom',19, N'A' union all select 3,N'刘一',17,N'A' union all select 4,N'jack',18,N'A' CREATE TABLE Btable ( S# INT, Sname nvarchar(32), Sage INT, Sfrom nvarchar(8) ) insert into Btable select 1,N'刘一',18,N'B' union all select 2,N'钱二',19,N'B' union all select 3,N'张三',17,N'B' union all select 4,N'李四',18,N'B'
数据表
1.cross join
交叉连接不需要任何连接条件。两个表的的数据直接进行笛卡尔积运算。如果一个表有m行,而另一个表有n行,将得到m*n的结果集。
1 | SELECT * FROM Atable as A cross join Btable as B order by A.S# |
2.inner join == join
内连接的功能是,把两个表相关联的记录列出来,必须是相关联的记录。
对两个输入表进行笛卡尔积,然后根据指定的谓词对结果行进行过滤。
怎么理解内联接:
理解内联接最容易的方法是认为A表中每一行同C表中的所有行进行比较,如果A表中的id和C表中的id相等,则匹配成功。
另外一种更正式的方法是在关系代数的基础上来考虑内联接,联接运算首先对两个表求笛卡尔积(4行A记录*5行C记录=20行记录),然后根据条件C.id=A.id对行进行过滤,最终返回16行。
1 | SELECT * FROM Atable as A INNER JOIN Btable as B ON A.Sname = B.Sname |
3.left outer join == left join
产生表B的完全集,而A表中匹配的则有值,没有匹配的则以null值取代。
1 | SELECT * FROM Atable as A left outer join Btable as B ON A.Sname = B.Sname |
4.right outer join == right jion
产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。
1 | SELECT * FROM Atable as A right outer join Btable as B ON A.Sname = B.Sname |
5.full outer join == full join
产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。
1 | SELECT * FROM Atable as A full join Btable as B ON A.Sname = B.Sname |
6.union与union all
区别就是联合查询的时候union会去重,union all不会去重
1 | 通过 UNION 运算符来将两张表纵向联接,基本方式为: |
1 2 3 4 5 6 7 | SELECT 列1 , 列2 FROM 表1 UNION SELECT 列3 , 列4 FROM 表2; UNION ALL 为保留重复行: SELECT 列1 , 列2 FROM 表1 UNION ALL SELECT 列3 , 列4 FROM 表2; |
1 2 | SELECT Sname FROM Atable UNION SELECT Sname FROM Btable SELECT Sname FROM Atable UNION ALL SELECT Sname FROM Btable |
CROSS JOIN--自交叉联接
对同一个表进行联接,就是自联接。交叉联接、内联接、外联接都支持自联接。
SELECT A1.a,A2.a FROM A AS A1 CROSS JOIN A AS A2
A表有4行,查询会生成一个包含4*4=16行的数据的结果集。
在自联接中,必须为表起别名。如果不为表指定别名,联接结果中的列名就会有歧义。
比如在本例中,别名为A1,A2。
小结
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!
· Tinyfox 简易教程-1:Hello World!
2018-01-15 设计模式的艺术
2017-01-15 高并发数据库之MySql性能优化实战总结