SQL Server进阶(四):cross join、inner join、left join、right jion、union、union all

本文深入解析SQL中的六种连接类型,包括交叉连接、内连接、左外连接、右外连接、全外连接以及UNION与UNION ALL的区别,通过实例演示每种连接如何操作和返回不同的结果集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试数据脚本

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'
View Code

数据表

1.cross join

  交叉连接不需要任何连接条件。两个表的的数据直接进行笛卡尔积运算。如果一个表有m行,而另一个表有n行,将得到m*n的结果集。

SELECT * FROM Atable as A  cross join Btable as B order by A.S#

2.inner join == join

  内连接的功能是,把两个表相关联的记录列出来,必须是相关联的记录。

  对两个输入表进行笛卡尔积,然后根据指定的谓词对结果行进行过滤。

怎么理解内联接:

  理解内联接最容易的方法是认为A表中每一行同C表中的所有行进行比较,如果A表中的idC表中的id相等,则匹配成功。

  另外一种更正式的方法是在关系代数的基础上来考虑内联接,联接运算首先对两个表求笛卡尔积(4A记录*5C记录=20行记录),然后根据条件C.id=A.id对行进行过滤,最终返回16行。

SELECT * FROM Atable as A  INNER JOIN Btable as B ON A.Sname = B.Sname

3.left outer join == left join

  产生表B的完全集,而A表中匹配的则有值,没有匹配的则以null值取代。

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值取代。

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做为值。

SELECT * FROM Atable as A full join Btable as B ON A.Sname = B.Sname 

6.union与union all

  区别就是联合查询的时候union会去重,union all不会去重

通过UNION运算符来将两张表纵向联接,基本方式为:
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;
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

小结

 

转载于:https://www.cnblogs.com/cnki/p/10274532.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值