СОЕДИНЯЕТСЯ против ВЫБОРА из многих таблиц - PullRequest
7 голосов
/ 18 октября 2011

Я искал повсюду, но я не могу найти ответ, вероятно, потому что я не могу найти правильный способ задать вопрос.Итак, вот оно: есть ли причина предпочитать какой-либо из этих двух запросов?

SELECT * FROM table1, table2 WHERE table1.id = table2.id;

и

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

Вопрос возникает из гораздо более сложного запроса, который я пытаюсь выполнитьоптимизировать, но я думаю, что эти два запроса содержат суть вопроса, и, надеюсь, задавая таким образом, он будет более полезным для других.Заранее спасибо.

Ответы [ 4 ]

6 голосов
/ 18 октября 2011
SELECT * FROM table1, table2 WHERE table1.id = table2.id;

и

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

вернут одинаковые результаты.Однако вы должны предпочесть второй в этом случае.Первая форма все еще широко распространена, потому что Oracle долгое время не поддерживал вторую форму.

Тем не менее, заявив INNER JOIN, имеет намерение и вынуждает вас написать условие, потому что INNER JOIN требует предложения ON.Для больших запросов это делает запрос намного более читабельным и затрудняет пропуск предиката присоединения.

Также обратите внимание, что я бы склонялся читать первую форму следующим образом: взять декартово произведение двухтаблицы и сохраняют только строки с одинаковыми идентификаторами в обеих таблицах , что в SQL выражается как SELECT * FROM table1 CROSS JOIN table2 WHERE table1.id = table2.id;.

5 голосов
/ 18 октября 2011

На самом деле два запроса одинаковы, только два разных способа их написания.Лично я думаю, что последний дает немного больше читабельности для пользователя.

2 голосов
/ 18 октября 2011

Они одинаковы.

Большая часть различий, наблюдаемых в базовом формате, часто возникает между различными базами данных, такими как Oracle и mySQL.Традиционно в оракуле соединения выполнялись только с использованием table.foreign_id = table2.id, тогда как mySQL использовал бы table1 join table2 on table1.foreign_key = table2.id

Аналогично join, inner join, left inner join и left join традиционно немного отличались от реализации базы данных.для реализации, поэтому лучше проверить руководство / документ для текущей реализации базы данных, чтобы убедиться, что она делает то, что вы хотите.

В более поздние времена синтаксис стал более стандартизированным со стандартами ANSI, но то, что люди часто используютпоказывает свои корни!
Эта хорошо написанная статья -
http://www.google.com/url?sa=t&source=web&cd=4&ved=0CD8QFjAD&url=http%3A%2F%2Fwww.kingtraining.com%2Fconfdownloads%2Fdownloads%2FOracle9iJoin_paper.pdf&ei=LOGdTpfiFOrV0QH4zpmECQ&usg=AFQjCNHjicW-tWmJfZcXwNi220LxjGvNhg&sig2=4tdM2lfgQ6AqiYudWWTirg

дает намного больше информации и истории и действительно хорошо объясняет различные виды внутренних и внешних соединений.

2 голосов
/ 18 октября 2011

С что я получаю они оба одинаковы. Один - просто синтаксический сахар для другого.

Он известен как явное или неявное соединение.

...