快速SQL Server加入审查

时间:2015-03-30 19:26:31

标签: sql-server

我一直在研究加入,我只是想让某人确认我对它的理解。

当涉及到连接时,它始终是ParentTable右外连接ChildTable 这也是正确的:ChildTable左外连接ParentTable。

这有什么问题:ParentTable左外连接ChildTable将给出 空值?

我在下面做了一个快速选择,是不是?

Select Mom, Brother from ParentTable right outer join ChildTable
on ParentTable.LastName = ChildTable.LastName

或者是左外连接还是内连接? 我下周二即将进行测试,这让我很困惑,任何帮助都会很棒!

1 个答案:

答案 0 :(得分:1)

当你看到父母和孩子时,父母和孩子并不是最好的例子,他们会让你想到特定的家庭关系,这会限制你的思考方式。

让我们选择两个更简单的表格:

    a:            b:
    a.id a.val    b.id b.val
    1    a1       1    b1
    2    a2       3    b3
    4    a4       5    b5
    6    a6       6    b6
    7    a7

这是一个简单的左外连接:

SELECT a.*, b.* FROM a LEFT OUTER JOIN b ON a.id = b.id;

这里" a"是左表,所以表中的所有行" a"将被包括在内,但只有表格中的行和#34; b"它们匹配的位置,否则从该表中选择的所有字段将为" null"。

    result:
    a.id a.val b.id b.val
    1    a1    1    b1
    2    a2    null null
    4    a4    null null
    6    a6    6    b6
    7    a7    null null

这是一个简单的右外连接:

SELECT a.*, b.* FROM a RIGHT OUTER JOIN b ON a.id = b.id;

这里" a"仍然是左表,但因为我们已经指定了一个右连接来自" b"的所有行。将被包括在内,但只包含来自a的匹配行。

    result:
    a.id a.val b.id b.val
    1    a1    1    b1
    null null  3    b3
    null null  5    b5
    6    a6    6    b6

LEFT和RIGHT只是引用JOIN子句中的表,并且根据表中的数据给出空值。


如果您交换表并使用LEFT而不是RIGHT(反之亦然)它只是相同,所以以下内容与上面的第一个查询相同:

SELECT a.*, b.* FROM b RIGHT OUTER JOIN a ON a.id = b.id;

请注意,SELECT或ON子句中表的顺序不会影响join子句。


INNER JOIN不会使用LEFT或RIGHT术语,因为它不会显示左侧或右侧的所有记录,只会显示匹配的记录:

SELECT a.*, b.* FROM a INNER JOIN b ON a.id = b.id;
    result:
    a.id a.val b.id b.val
    1    a1    1    b1
    6    a6    6    b6

不要认为父母和孩子将表视为数据集,这可能会让您感到困惑。