Я думаю пост 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 строк, что намного больше, чем было в начале. Если вы сильны в математике, вы помете, что не стоит так запрашивать большие таблицы.

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

Elastep — 11.06.2009 - 17:39 [85.238.103.131]
Спасибо! Очень полезно!
x-dust — 16.11.2009 - 14:12 [217.118.78.119]
Thanks!!!!
Владимир — 19.11.2009 - 21:03 [85.234.189.152]
Обалдено!
Все никак не мог врубиться как работает JOIN.

Огромное спасибо!
GreatCornholio — 19.11.2009 - 23:34 [10.204.60.69]
Видимо, запись попала в топ какого-нибудь поиска по блогам.
GreatCornholio — 19.11.2009 - 23:38 [10.204.60.69]
Кстати, у меня одного вторая иллюстрация заехала на текст?
ReDetection — 20.11.2009 - 22:15 [80.64.175.68]
наверно. все нормально как с иллюстрациями, так и с текстом..
Саня — 16.03.2010 - 12:46 [95.26.21.13]
классно))) автору спасибо:)) теперь все стало понятно:)
J — 25.04.2010 - 03:35 [79.124.184.24]
Отлично, спасибо))
DAS — 02.06.2010 - 16:43 [78.109.156.94]
ВСЕ ЧЕТКО, КОРОТКО И ЯСНО
ВСЕМ СПАСИБО!
Rave — 02.06.2010 - 21:59 [77.106.254.134]
иллюстрации значительно облегчают понимание. СПАСИБО!
rom — 03.06.2010 - 14:40 [193.239.152.245]
Дуууже дякую!!! Візуалізація - це те що треба для пояснення таких штук. Просто неймовірно ясно!!!
Bin — 03.06.2010 - 21:26 [94.251.117.33]
хохлi
Cornholio — 04.06.2010 - 19:12 [89.31.118.162]
rom, Эм... а ты мог бы писать более ясно?
ReDetection — 04.06.2010 - 23:44 [80.64.175.185]
Cornholio, имхо, тут и так все ясно. проверил гугл, он адекватно перевел.
V@s3K — 05.06.2010 - 00:12 [178.49.15.6]
Cornholio, а чого не зрозуміло тобі у рідній мові? Маскаль чтоль?
ReDetection — 05.06.2010 - 20:34 [80.64.175.185]
V@s3K, чому раптом у рідному?
ReDetection — 08.09.2010 - 12:27 [94.25.6.234] Linux
все разъехалось :(
BioK — 08.10.2010 - 22:25 [190.7.25.203] Windows
Very usefull and clear(exept for the russian stuff) ha Just kiding. Regards from SouthAmerica.
Cornholio — 09.10.2010 - 14:56 [89.31.118.250] Linux
BioK, so the last line is definetly for you.
Cornholio — 09.10.2010 - 14:58 [89.31.118.250] Linux
*definitely
JasonX — 09.10.2010 - 16:27 [80.64.175.12] Windows
слив засчитан.
ReDetection — 09.10.2010 - 23:29 [80.64.175.106] Linux
юсфул с одной л, а киддин - с двумя д. подозрительный тип.
V@s3K — 09.10.2010 - 23:36 [178.49.15.6] Linux
ReDetection, никто так плохо не говорит на языке, как его носители (с)
Вдумайся :D
themylogin — 10.10.2010 - 00:49 [192.168.0.12] Linux
Пацаны, это аргентинский айпишник :-\
V@s3K — 10.10.2010 - 00:53 [178.49.15.6] Linux
themylogin, ага, значит испанский.
Cornholio — 11.10.2010 - 20:34 [89.31.118.250] Linux
themylogin, Да и SouthAmerica, какбы намекает =)
ReDetection — 16.10.2010 - 16:45 [94.25.6.234] Linux
прямо сейчас понадобился cross join :) ну, во второй таблице запись всего одна и она зависит на условия вывода нескольких из первой. причем та одна запись довольно абстрактна, по-другому не приджойнишь :)
Дмитрий — 30.11.2010 - 21:55 [195.182.194.226] Windows
Спасибо побольше бы таких объяснений.
Bin — 01.12.2010 - 00:30 [94.251.117.33] Windows
пожалуйста
refresh

(не заполняйте это поле)

i