SqlServer中包含以下几种连接:
- Inner Join:要求指定字段的值,必须在关联的两个数据中同时存在;
- Left Join:要求指定字段的值,在两个数据集中同时存在,或者在左边数据集中存在,但是在右边数据集中不存在的;
- Right Join:要求指定字段的值,在两个数据集中同时存在,或者在右边数据集中存在,但是在左边数据集中不存在的;
- Full Join :最终结果是,指定字段值在两个数据集中同时存在,或者在左边数据集存在,但是在右边不存在,或者在右边数据集中存在,但是在左边数据集中不存在,这个最终结果集中,分别会在右边,或者左边的列上放置Null值。
- 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会不会自动为我们关联?
--但是结果是不会的,依然是做简单的笛卡尔积而已。
执行结果如下: