JOIN语句(SQL)中的“左”表和“右”表到底是哪个表?


70

是什么使给定的表成为左表?

该表是否在查询的“发件人”部分中指明?

还是因为它位于=运算符的左侧,所以它是左侧的表格吗?

以下是否等效

SELECT *
FROM left_table
LEFT JOIN right_table ON left_table.right_id = right_table.id

SELECT *
FROM left_table
LEFT JOIN right_table on right_table.left_id = left_table.id

???

谢谢


您的第二个查询似乎令人困惑,为什么不写:SELECT * FROM left_table LEFT JOIN right_table on right_table.id = left_table.right_id
levolutionniste

Answers:


52

左表是选择中的第一个表。是的,您的两个示例是等效的。


2
这需要澄清。“ select中的第一个表”是什么意思?
fraxture

14

正确的表始终是您要加入的表。是的,您的两个陈述是等效的。

JOIN [Table] ON ...

[表格]始终是正确的表格。


3
这就引出了“您要联接的表”是什么意思的问题。
philipxy

11

从左到右读取时,大约在整个FROM子句中首先出现的所有内容(包括其他JOIN,子查询,视图和存储过程)的结果大致为“左”。

这两个SQL语句是等效的,因为子句部分的=运算符是对称的(如果a = b则b = a),因此无论顺序如何,结果都是相同的。ONJOIN

常规联接仅显示JOIN的ON子句为true的行,而LEFT JOIN还可显示条件为false时“ left”中的记录(SELECT中存在的“ right”中的任何列均显示NULL)。

例如:

-- People:           -- Car
id | name            owner_id | model
---+------------     ---------+------------
1  | Paul            1        | Ferrari
2  | Nancy           2        | Porsche
3  | Arthur          NULL     | Lamborghini
4  | Alfred          10       | Maserati

> select people.name, car.model from people join car on car.owner_id=people.id;

name     | model
---------+--------------
Paul     | Ferrari
Nancy    | Porsche
2 record(s) found

> select people.name, car.model from people left join car on 
  car.owner_id=people.id;

name     | model
---------+--------------
Paul     | Ferrari
Nancy    | Porsche
Arthur   | NULL
Alfred   | NULL     
4 record(s) found

> select people.name, car.model from people left join car on 
  people.id = car.owner_id;

name     | model
---------+--------------
Paul     | Ferrari
Nancy    | Porsche
Arthur   | NULL
Alfred   | NULL     
4 record(s) found

1
那不是问题。
乔纳森·哈特利2013年


3

是的,由表出现在JOIN运算符的一侧确定。您的两个示例确实是等效的。


您的回答似乎自相矛盾。您说相对于运算符的位置决定了左边和右边的表,但是在我的示例中,它们被交换了,并且说它们是等效的。
杰克

请仔细阅读:我说的是相对于JOIN运算符而不是相等运算符的位置。
Dan J 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.