Какая таблица точно является «левой» таблицей и «правой» таблицей в операторе JOIN (SQL)? - PullRequest
53 голосов
/ 05 ноября 2010

Что делает данную таблицу левой таблицей?

Таблица указана в части запроса «От»?

Или это левая таблица, потому что она находится слева от оператора =?

Являются ли следующие эквиваленты

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

???

Спасибо

Ответы [ 5 ]

38 голосов
/ 05 ноября 2010

Левая таблица является первой таблицей в списке выбора. Да, ваши два примера эквивалентны.

9 голосов
/ 05 ноября 2010

Правая таблица - это всегда та таблица, к которой вы присоединяетесь.Так что да, оба ваших утверждения эквивалентны.

JOIN [Table] ON ...

[Таблица] - всегда правильная таблица.

7 голосов
/ 05 ноября 2010

Грубо говоря, "left" - это результат всего, что появляется первым во всем предложении FROM при чтении слева направо, включая результат других JOIN, подзапросов, VIEWS и STORED PROCEDURES.

Оба оператора SQL эквивалентны, поскольку оператор = в части ON предложения JOIN равен симметричный (если a = b, то b = a), поэтому результат такой же независимо от порядка.

Обычное объединение показывает только те строки, в которых предложение ON для JOIN имеет значение true, тогда как LEFT JOIN показывает также записи из «left», если условие ложно (показывает NULL для любого столбца из «right», присутствующего в SELECT).

Например:

-- 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
4 голосов
/ 05 ноября 2010

Смотрите это для довольно хорошего прохождения по объединениям: http://en.wikipedia.org/wiki/Join_(SQL)

И да, оба утверждения эквивалентны: -)

3 голосов
/ 05 ноября 2010

Да, это определяется стороной оператора JOIN, в которой отображается таблица. Ваши два примера действительно эквивалентны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...