sql joins - объединение нескольких таблиц - PullRequest
4 голосов
/ 02 ноября 2010

Я пытаюсь понять соединения и я немного растерялся. Я знаю, как объединять таблицы, используя

=
<=

IN существует и не существует

Я пытался понять, как использовать INNER JOIN, LEFT OUTER JOIN, USING и т. Д., Но это сбивает с толку. Основная проблема, с которой я сталкиваюсь, заключается в том, что разные люди называют их разными именами. Есть ли простое объяснение различных типов объединений и других имен, которые они называют. Например, во время поиска в Google я наткнулся на следующие типы

♦ Simple Join
♦ Equi join
♦ Natural Join
♦ Outer Join
♦ Self Join
♦ Cartesian join
♦ Inner join
♦ Nonequi join
♦ Theta join
♦ Self join 
♦ Cross join
♦ Cross Joins
♦ Natural Joins
♦ Inner Join with USING Clause
♦ Inner Join with ON Clause
♦ Left Outer Join
♦ Right Outer Join
♦ Full OuterJoin

Большинство из вышеперечисленных являются дубликатами, т. Е. Это соединение того же типа, но с другим именем. Я уверен, что все вышеперечисленное можно воссоздать, используя один из (=,! =, Не в, в существует и т. Д.), Но я изо всех сил пытаюсь понять, что есть что и различие между ними. Диаграмма, вероятно, поможет:)

Ответы [ 5 ]

11 голосов
/ 02 ноября 2010
2 голосов
/ 05 ноября 2010

кстати, просто читал о JOIN.Что-то изменилось в синтаксисе MySQL?Oracle использует синтаксис PLSQL, он немного отличается от других баз данных ..

У меня есть следующая ситуация здесь

Fisrt Query

SELECT * FROM tbl1 LEFT JOIN (tbl2, tbl3, tbl4)
    ON (tbl2.field1=tbl1.field1 AND tbl3.filed2=tbl1.field2 AND tbl4.field3=tbl1.field3)

Второй запрос

SELECT * FROM tbl1 LEFT JOIN (tbl2 CROSS JOIN tbl3 CROSS JOIN tbl4)
    ON (tbl2.field1=tbl1.field1 AND tbl3.filed2=tbl1.field2 AND tbl4.field3=tbl1.field3)

Первый запрос аналогичен Второму запросу .

Спасибо всем!

2 голосов
/ 02 ноября 2010

Для некоторых из тех, которые не были объяснены постом Мэтью:

Простое соединение - неявное соединение, по умолчанию используется внутреннее соединение

a join b on a.id = b.id

Естественное соединение - Этовыполняет внутреннее соединение для всех столбцов с одинаковым именем

a natural join b

Self Join - это соединение таблицы с самим собой, это может быть любой другой тип объединения (внутреннее самостоятельное соединение, внешнее самостоятельное соединение и т. д.)1009 *

a "a1" join a "a2" on "a1".id = "a2".id

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

a join b

Перекрестное объединение - это синоним декартового объединения

Внутреннее соединение с предложением USING - Это альтернативный синтаксис дляусловия соединения, вы можете использовать его, если обе таблицы имеют совпадающие имена столбцов

a join b using (id)

Внутреннее объединение с предложением ON - это то же самое, что я показал для простого соединения, единственный другой синтаксис - объединение впредложение where (как показано ниже)

a join b where a.id = b.id

Left Outer Join - То же, что левое соединение. Right Outer Join - То же, что правое соединение.Это как левое соединение, но вы получаете пустые значения на первом столе, а не на втором

1 голос
/ 02 ноября 2010
1 голос
/ 02 ноября 2010

РЕДАКТИРОВАТЬ: Только что натолкнулся на http://www.gplivna.eu/papers/sql_join_types.htm, который, хотя и технический, предоставляет довольно хороший обзор типов соединения SQL Стоит посмотреть

Вот еще одна страница с объяснением некоторых объединений (http://blog.noobtech.com/index.php/2009/02/sql-joins-visual-cheat-sheet/)

Страница, которую я только собирался опубликовать, была той, которую @matthew vines уже опубликовала:)

...