Визуальное пояснение JOIN'ов на SQL
11 декабря 2008 :: 39 комментариев :: 20889 просмотров :: 740 слов

Я думаю пост Ligaya Turmelle's про JOIN'ы в SQL - отличный пример для начинающих разработчиков. Поскольку SQL JOIN'ы очень хорошо видны на диаграммах Венна, покажем это. Но, как стало видно из комментариев к тому посту, диаграммы Венна не всегда полностью отображают всю суть JOIN'ов в реальных задачах.

Мне нравится концепция, поэтому давайте посмотрим, сможем ли мы заставить ее работать. Предположим, мы имеем следующие две таблицы. Таблица А находится слева, и таблица В справа. Мы будем заполнять их четырьмя записями каждую.

id name       id  name
-- ----       --  ----
1  Pirate     1   Rutabaga
2  Monkey     2   Pirate
3  Ninja      3   Darth Vader
4  Spaghetti  4   Ninja

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

SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name

id  name       id   name
--  ----       --   ----
1   Pirate     2    Pirate
3   Ninja      4    Ninja

Inner join выдает только те поля, которые есть как в таблице А так и в таблице В.

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name

id    name       id    name
--    ----       --    ----
1     Pirate     2     Pirate
2     Monkey     null  null
3     Ninja      4     Ninja
4     Spaghetti  null  null
null  null       1     Rutabaga
null  null       3     Darth Vader

Full outer join производит набор всех записей в таблице А и в таблице В с возможностью совпадений записей в левой и правой таблицах. Если таковых нет, на пустой стороне вставляется NULL.

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name

id  name       id    name
--  ----       --    ----
1   Pirate     2     Pirate
2   Monkey     null  null
3   Ninja      4     Ninja
4   Spaghetti  null  null

Left outer join производит набор всех полей в таблице А и в соответствии с ними набирает аналогичные в таблице В. Если соответствий в таблице В не найдено, вставляется NULL.

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null

id  name       id     name
--  ----       --     ----
2   Monkey     null   null
4   Spaghetti  null   null

Выборка, обратная предыдущей. Находятся записи таблицы В, совпадающие с записами в А и тут же оба удаляются из выдачи. Выдаются те поля таблицы А, которых нет в таблице В.

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableA.id IS null
OR TableB.id IS null

id    name       id    name
--    ----       --    ----
2     Monkey     null  null
4     Spaghetti  null  null
null  null       1     Rutabaga
null  null       3     Darth Vader
Тоже удаляет совпадающие записи, но теперь включает в выдачу еще и записи таблицы В, которых нет в таблице А. Есть еще один JOIN, который не может быть выражен так же на диаграмме Венна.
SELECT * FROM TableA
CROSS JOIN TableB

Этот JOIN означает "все к всему" ("everything to everything"), выдающий 4 х 4 = 16 строк, что намного больше, чем было в начале. Если вы сильны в математике, вы помете, что не стоит так запрашивать большие таблицы.

Это мой перевод статьи. Оригинал здесь.

Комментарии
0
Elastep ⸬ 11 июня 2009, 10:39 ⸬ Odesa, UA лог
#
Спасибо! Очень полезно!
0
x-dust ⸬ 16 ноября 2009, 08:12 ⸬ Saint Petersburg, RU лог
#
Thanks!!!!
0
Владимир ⸬ 19 ноября 2009, 15:03 ⸬ Riga, LV лог
#
Обалдено!
Все никак не мог врубиться как работает JOIN.

Огромное спасибо!
0
GreatCornholio ⸬ 19 ноября 2009, 17:34 лог
#
Видимо, запись попала в топ какого-нибудь поиска по блогам.

Кстати, у меня одного вторая иллюстрация заехала на текст?
0
ReDetection ⸬ 20 ноября 2009, 16:15 ⸬ Novosibirsk, RU лог
#
наверно. все нормально как с иллюстрациями, так и с текстом..
0
Саня ⸬ 16 марта 2010, 06:46 ⸬ Moscow, RU лог
#
классно))) автору спасибо:)) теперь все стало понятно:)
0
J ⸬ 24 апреля 2010, 20:35 ⸬ UA лог
#
Отлично, спасибо))
0
DAS ⸬ 02 июня 2010, 09:43 ⸬ KZ лог
#
ВСЕ ЧЕТКО, КОРОТКО И ЯСНО
ВСЕМ СПАСИБО!
0
Rave ⸬ 02 июня 2010, 14:59 ⸬ Sochi, RU лог
#
иллюстрации значительно облегчают понимание. СПАСИБО!
0
rom ⸬ 03 июня 2010, 07:40 ⸬ Kiev, UA лог
#
Дуууже дякую!!! Візуалізація - це те що треба для пояснення таких штук. Просто неймовірно ясно!!!
0
Bin ⸬ 03 июня 2010, 14:26 ⸬ Luk'yanovka, RU лог
#
хохлi
0
Cornholio ⸬ 04 июня 2010, 12:12 ⸬ Novosibirsk, RU лог
#
rom, Эм... а ты мог бы писать более ясно?
0
ReDetection ⸬ 04 июня 2010, 16:44 ⸬ Novosibirsk, RU лог
#
Cornholio, имхо, тут и так все ясно. проверил гугл, он адекватно перевел.
0
vas3k ⸬ 04 июня 2010, 17:12 ⸬ Novosibirsk, RU лог
#
Cornholio, а чого не зрозуміло тобі у рідній мові? Маскаль чтоль?
0
ReDetection ⸬ 05 июня 2010, 13:34 ⸬ Novosibirsk, RU лог
#
V@s3K, чому раптом у рідному?
0
ReDetection ⸬ 08 сентября 2010, 05:27 ⸬ RU ⸬ Linux лог
#
все разъехалось :(
0
BioK ⸬ 08 октября 2010, 15:25 ⸬ Posadas, AR ⸬ Windows лог
#
Very usefull and clear(exept for the russian stuff) ha Just kiding. Regards from SouthAmerica.
0
Cornholio ⸬ 09 октября 2010, 07:56 ⸬ Novosibirsk, RU ⸬ Linux лог
#
BioK, so the last line is definetly for you.

*definitely
0
JasonX ⸬ 09 октября 2010, 09:27 ⸬ Novosibirsk, RU ⸬ Windows лог
#
слив засчитан.
0
ReDetection ⸬ 09 октября 2010, 16:29 ⸬ Novosibirsk, RU ⸬ Linux лог
#
юсфул с одной л, а киддин - с двумя д. подозрительный тип.
0
vas3k ⸬ 09 октября 2010, 16:36 ⸬ Novosibirsk, RU ⸬ Linux лог
#
ReDetection, никто так плохо не говорит на языке, как его носители (с)
Вдумайся :D
0
themylogin ⸬ 09 октября 2010, 17:49 ⸬ Linux лог
#
Пацаны, это аргентинский айпишник :-\
0
vas3k ⸬ 09 октября 2010, 17:53 ⸬ Novosibirsk, RU ⸬ Linux лог
#
themylogin, ага, значит испанский.
0
Cornholio ⸬ 11 октября 2010, 13:34 ⸬ Novosibirsk, RU ⸬ Linux лог
#
themylogin, Да и SouthAmerica, какбы намекает =)
0
ReDetection ⸬ 16 октября 2010, 09:45 ⸬ RU ⸬ Linux лог
#
прямо сейчас понадобился cross join :) ну, во второй таблице запись всего одна и она зависит на условия вывода нескольких из первой. причем та одна запись довольно абстрактна, по-другому не приджойнишь :)
0
Дмитрий ⸬ 30 ноября 2010, 15:55 ⸬ Dnipro, UA ⸬ Windows лог
#
Спасибо побольше бы таких объяснений.
0
Bin ⸬ 30 ноября 2010, 18:30 ⸬ Luk'yanovka, RU ⸬ Windows лог
#
пожалуйста
0
ReDetection ⸬ 03 апреля 2012, 13:18 ⸬ Novosibirsk, RU ⸬ Linux лог
#
опять все поехало D:
Вася, я даю эту страничку вопрошающим, да и из поиска поди часто приходят. почини, пожалуйста!
0
vas3k ⸬ 03 апреля 2012, 14:28 ⸬ Novosibirsk, RU ⸬ Apple лог
#
ReDetection, так лучше?
0
ReDetection ⸬ 03 апреля 2012, 15:29 ⸬ Novosibirsk, RU ⸬ Linux лог
#
V@s3K, да, спасибо.
0
Денис ⸬ 10 июня 2012, 14:44 ⸬ Donetsk, UA ⸬ Windows лог
#
Действительно очень доходчиво и понятно!
Спасибо!
0
nkl ⸬ 18 декабря 2012, 19:26 ⸬ Karagandy, KZ ⸬ Windows лог
#
Спасибо. Хорошие иллюстрации. Из какой книги вырезал?
0
vas3k ⸬ 19 декабря 2012, 04:05 ⸬ Novosibirsk, RU ⸬ Apple лог
#
nkl, взял из оригинальной статьи, а автор мои и сам нарисовать
0
С В ⸬ 09 июня 2013, 14:20 ⸬ Kiev, UA ⸬ Windows лог
#
Кто-нибуть написал бы книгу по SQL таким образом! Никак не мог врубиться, как же работает этот JOIN, и тут доступное объяснение, для новичков. С первого раза все понял. СПС огромное!
0
gardener ⸬ 31 июля 2013, 18:40 ⸬ Odesa, UA ⸬ Windows лог
#
Все гениальное просто!
МОЛОДЦА!
0
Федот ⸬ 28 октября 2013, 09:44 ⸬ RU ⸬ Apple лог
#
Прекрасно, спасибо, очень просто и понятно объяснено.
0
Макс ⸬ 30 января 2014, 09:44 ⸬ Kiev, UA ⸬ Windows лог
#
Спасибо отличная статья
(не заполняйте это поле)

Еще? Тогда вот