SQL SERVER中的几种连接,以及各自的最终效果

SqlServer中包含以下几种连接:

  1. Inner Join:要求指定字段的值,必须在关联的两个数据中同时存在;
  2. Left Join:要求指定字段的值,在两个数据集中同时存在,或者在左边数据集中存在,但是在右边数据集中不存在的;
  3. Right Join:要求指定字段的值,在两个数据集中同时存在,或者在右边数据集中存在,但是在左边数据集中不存在的;
  4. Full Join :最终结果是,指定字段值在两个数据集中同时存在,或者在左边数据集存在,但是在右边不存在,或者在右边数据集中存在,但是在左边数据集中不存在,这个最终结果集中,分别会在右边,或者左边的列上放置Null值。
  5. Cross Join:即最终返回两个结果集的笛卡尔积,即:左边数据集记录数*右边数据集记录数;

具体的效果,参照下面的代码:

--构建基本表
DECLARE @tmpA TABLE (
	iden INT 	
)

DECLARE @tmpB TABLE (
	iden INT	
)

--向基本表中插入数据
INSERT INTO @tmpA(iden)
SELECT 1
UNION
SELECT 2
UNION
SELECT 3

--向基本表中插入数据
INSERT INTO @tmpB(iden)
SELECT 2
UNION
SELECT 3
UNION
SELECT 4

--显示构建基本表中数据情况
SELECT '' AS 'BaseTable1',*
FROM @tmpA
SELECT '' AS 'BaseTable2',*
FROM @tmpB

--Inner Join情况
SELECT '' AS 'Inner_Join', *
FROM @tmpA AS ta
	INNER JOIN @tmpB AS b
	ON b.iden = ta.iden
	
--Left Join 情况
SELECT '' AS 'Left_Join',  *
FROM @tmpA AS ta
	LEFT JOIN @tmpB AS b
	ON b.iden = ta.iden

--Right Join情况
SELECT '' AS 'Right_Join',  *
FROM @tmpA AS ta
	RIGHT JOIN @tmpB AS b
	ON b.iden = ta.iden

--Full Join情况	
SELECT '' AS 'Full_Join',  *
FROM @tmpA AS ta
	FULL JOIN @tmpB AS b
	ON b.iden = ta.iden
	
--Cross Join情况
SELECT '' AS 'Cross_Join',  *
FROM @tmpA AS ta
	CROSS JOIN @tmpB AS b

执行结果如下图:

7.最近在分析代码时,看到了有人在写数据集关联的时候,没有join关键字,所以会感觉很晕,所以就自己做了个实验,将多个数据集直接写在一起,没有join关键字时的效果;实验结果证明,这种情况的关联和corss join的结果是一样的,即:在From子句中如果没有指定各个数据集的关联关系,那么各个数据集形成的最终结果集是各个数据集的一个笛卡尔积;

即:如下代码

SELECT *
FROM 
	(
		SELECT 'a' AS 'a', 'b' AS 'b','some1' AS 'key_field'
		UNION
		SELECT 'c','d' ,'some2' AS 'key_field'
	) AS a,
	(
		SELECT 'ccc' AS 'any_content','dfsf' AS 'cc','some1' AS 'key_field'
		UNION
		SELECT 'dfds','dddd','some2' AS 'key_field'
	) AS b

--注意:上面代码,我也特意模拟了两个数据集存在相同字段情况,看看sqlserver会不会自动为我们关联?
--但是结果是不会的,依然是做简单的笛卡尔积而已。

执行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值