Я думаю пост 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 nullid 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 строк, что намного больше, чем было в начале. Если вы сильны в математике, вы помете, что не стоит так запрашивать большие таблицы.
Это мой перевод статьи. Оригинал здесь.
Спасибо! Очень полезно!
Thanks!!!!
Обалдено! Все никак не мог врубиться как работает JOIN. Огромное спасибо!
Видимо, запись попала в топ какого-нибудь поиска по блогам.
Кстати, у меня одного вторая иллюстрация заехала на текст?
наверно. все нормально как с иллюстрациями, так и с текстом..
классно))) автору спасибо:)) теперь все стало понятно:)
Отлично, спасибо))
ВСЕ ЧЕТКО, КОРОТКО И ЯСНО ВСЕМ СПАСИБО!
иллюстрации значительно облегчают понимание. СПАСИБО!
Дуууже дякую!!! Візуалізація - це те що треба для пояснення таких штук. Просто неймовірно ясно!!!
хохлi
rom, Эм... а ты мог бы писать более ясно?
Cornholio, имхо, тут и так все ясно. проверил гугл, он адекватно перевел.
Cornholio, а чого не зрозуміло тобі у рідній мові? Маскаль чтоль?
V@s3K, чому раптом у рідному?
все разъехалось :(
Very usefull and clear(exept for the russian stuff) ha Just kiding. Regards from SouthAmerica.
BioK, so the last line is definetly for you.
*definitely
слив засчитан.
юсфул с одной л, а киддин - с двумя д. подозрительный тип.
ReDetection, никто так плохо не говорит на языке, как его носители (с) Вдумайся :D
Пацаны, это аргентинский айпишник :-\
themylogin, ага, значит испанский.
themylogin, Да и SouthAmerica, какбы намекает =)
прямо сейчас понадобился cross join :) ну, во второй таблице запись всего одна и она зависит на условия вывода нескольких из первой. причем та одна запись довольно абстрактна, по-другому не приджойнишь :)
Спасибо побольше бы таких объяснений.
пожалуйста
опять все поехало D: Вася, я даю эту страничку вопрошающим, да и из поиска поди часто приходят. почини, пожалуйста!
ReDetection, так лучше?
V@s3K, да, спасибо.
Действительно очень доходчиво и понятно! Спасибо!
Спасибо. Хорошие иллюстрации. Из какой книги вырезал?
nkl, взял из оригинальной статьи, а автор мои и сам нарисовать
Кто-нибуть написал бы книгу по SQL таким образом! Никак не мог врубиться, как же работает этот JOIN, и тут доступное объяснение, для новичков. С первого раза все понял. СПС огромное!
Все гениальное просто! МОЛОДЦА!
Прекрасно, спасибо, очень просто и понятно объяснено.
Спасибо отличная статья
<script>alert('test');</script>
; drop database "users";
Некст левел общения в баре
Это можно же лимит на отправку сообщений обойти в телеге?
Ааааа ааа аааааа