为什么要使用左连接
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
我在看下面的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