为什么要使用左连接

时间:2016-09-11 13:16:21

标签: sql left-join

我正在查看以下链接Left Join

如果左连接使用表1中的所有元素并且不关心表2,为什么不写:

SELECT table1.column_name(s)
FROM table1

而不是写

SELECT table1.column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;

3 个答案:

答案 0 :(得分:3)

并非人们关注TABLE1中的价值观,而且正如您所写,并不关心TABLE2。我们关注TABLE1中的值以及TABLE2 中的值(如果它们存在)

假设您想要一份员工及其经理的报告。你不想仅仅因为他没有经理而排除你公司的总裁。因此,您可以将其写为LEFT OUTER JOIN

SELECT e.employee_name, m.employee_name manager_name
FROM   employees e 
LEFT JOIN employees m ON m.employee_id = e.manager_id

这样,您将获得总统的名字和总统的NULL经理名称。如果你把它写成INNER加入,那么你根本就没有为总统写过一行。

答案 1 :(得分:2)

"如果左连接使用表1中的所有元素,并且不关心表2"

此语句错误,示例SQL甚至不相似。

LEFT JOIN意味着: 来自" LEFT"的所有行表,无论是否匹配" RIGHT"是否和" RIGHT"中的所有行哪里有比赛。例如,想想客户及其订单。您可能有100个客户,而不是所有客户都有订单。

select *
from Customers c 
LEFT JOIN Orders o on c.CustomerID = o.CustomerID;

将检索所有这100个Customer行,其中那些没有订单的行对于Orders'如果列中有N个订单,则会为每个订单重复其客户行。即:

客户:(CustomerId,客户名称)

1, Customer1
2, Customer2
3, Customer3

订单:(的OrderId,客户ID,订购日期,...)

1, 1, 2000/1/1 10:00:00, ...
2, 1, 2000/1/5 11:00:00, ...
3, 2, 2000/1/6 18:00:00, ...

结果将是:

1, Customer1, 1, 1, 2000/1/1 10:00:00, ...
1, Customer1, 2, 1, 2000/1/5 11:00:00, ...
2, Customer2, 3, 2, 2000/1/6 18:00:00, ...
3, Customer3, NULL, NULL, NULL, ...

正如您所看到的,它并没有选择"元素"只有来自LEFT表,它确实来自两者。您可以从任一表中指定单个或所有列:

select c.CustomerID, c.CustomerName, o.OrderDate, o.OrderID
from Customers c 
LEFT JOIN Orders o on c.CustomerID = o.CustomerID;

select c.*
from Customers c 
LEFT JOIN Orders o on c.CustomerID = o.CustomerID;

select c.*, o.OrderId, o.OrderDate
from Customers c 
LEFT JOIN Orders o on c.CustomerID = o.CustomerID;

答案 2 :(得分:2)

当只需要第一个表中的列时,没有WHERE子句的另一个表上的LEFT JOIN确实非常不合适。

事实上,它可能会返回比预期更多的行。

例如:

首先是一些样本数据:

表1:

Id  Text1    SomeKey
1   Tralala  10
2   Joehoe   20
3   Trololo  30

表2:

Id  SomeKey Text2 
1   10      Blah
2   20      Bleh
3   20      Blergh

仅在Table1上的查询将返回3行。

但在SomeKey上使用左连接的查询将返回4行:

select t1.Text1
from Table1 t1
left join Table2 t2 on (t1.SomeKey = t2.SomeKey)

返回:

Text1
-------
Tralala
Joehoe
Joehoe
Trololo

在没有从连接表中选择字段的情况下,人们进行这种左连接的一个常见原因是在Table1中找到Table2中没有匹配项的记录。或者使用基于Table2字段的标准。

select t1.Text1, t1.SomeKey 
from Table1 t1
left join Table2 t2 on (t1.SomeKey = t2.SomeKey)
where t2.Id is null;

返回:

Text1    SomeKey
-------- -------
Trololo  30