Я думаю пост 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, чому раптом у рідному?
refresh

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

i