为什么要使用左连接

Why use left join at all

我在看下面的linkLeft Join

如果左连接使用 table 1 中的所有元素并且不关心 table 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;

并不是说人们关心 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 联接,则根本不会获得总统的行。

"If left join uses all elements from table 1 and doesn't care about table 2"

这个说法是错误的,而且示例 SQL 也不相似。

LEFT JOIN 表示: 来自 "LEFT" table 的所有行,无论 "RIGHT" 是否匹配以及来自 "RIGHT" 的所有匹配行。例如,想想客户和他们的订单。您可能有 100 个客户,但并非所有客户都有订单。

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

将检索所有这 100 个客户行,其中没有订单的行的订单列为 NULL,如果有 N 个订单,则为每个订单重复其客户行。即:

客户:(CustomerId,CustomerName)

1, Customer1
2, Customer2
3, Customer3

订单:(OrderId,CustomerId,OrderDate,...)

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, ...

如您所见,它不仅 select "elements" 仅来自 LEFT table,而是来自两者。您可以从 table:

中指定单个或所有列
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;

等等

在另一个 table 上不带 WHERE 子句的 LEFT JOIN 确实非常不合适,因为只需要来自第一个 table 的列。

事实上,它可能比预期多 return 行。

例如:

首先是一些示例数据:

表 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 的查询将 return 3 行。

但是在 SomeKey 上使用左连接的查询会 return 4 行:

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

returns:

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

为什么不从联接 table 中选择字段而执行这种左联接的一个常见原因是要在表 1 中查找在表 2 中没有匹配项的记录。或者使用基于 Table2 字段的条件。

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

returns:

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