RizVN Login



SQL-запросы. В чем разница между INNER JOIN, RIGHT JOIN, LEFT JOIN?

SQL-запросы. В чем разница между INNER JOIN, RIGHT JOIN, LEFT JOIN?В рамках сегодняшней статьи я расскажу вам в чем разница между INNER JOIN, RIGHT JOIN и LEFT JOIN, приведу подробные примеры, а так же предоставлю некоторые пояснения.

Без баз данных сегодня не обходится практически ни одно приложение. И в этом нет ничего странного, так как наличие пользовательской информации требует специальных хранилищ. Кто-то пытается реализовывать их собственными силами, используя, например, файлы. А кто-то использует уже готовые решения, по типу MySQL. Если в первом случае все задачи ложатся на плечи их создателей, то во втором авторам программных продуктов предоставляется универсальный язык для построения запросов под названием SQL

Однако, специфика использования SQL запросов может оказаться простой не для всех. Поэтому попробуем поэтапно посмотреть их на практике.

Допустим, что у вас существует две таблицы - авторы и программы. Сразу оговоримся, что не всегда известно какие программы кем написаны (обычно мелкие утилиты и инструменты можно встретить без указания авторства, к примеру, небольшие скрипты), а так же не все авторы еще что-либо написали (т.е. допустим, автор оставил заявку, но еще не приложил свое творение). Для простоты, таблицы назовем author и util.

Таблица авторов (author) будет выглядеть следующим образом:

idname
1 Вася
2 Коля
3 Петя

Где id - это идентификатор автора, а name - это, собственно, имя автора

Таблица программ (util) будет выглядеть следующим образом:

idauthor_idname
1 1 Вася Мега продукт
2 0 Крутая, но неизвестная утилита

Где id - это идентификатор программы, author_id - это идентификатор автора (0 - если неизвестен), name - название программы

Итак, исходные данные у нас есть, теперь, давайте рассмотрим каждый из join по отдельности.

INNER JOIN

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

Примечание: Кстати, в большинстве баз данных не обязательно писать перед join слово inner. Однако, в рамках примера я все же его укажу.

SQL запрос будет выглядеть следующим образом

-- Выводим все поля
select *
-- Указываем таблицу авторов
from author
-- Соединяем с таблицей программ
inner join util
-- Указываем условие
on author.id = util.author_id

Результат выполнения такого SQL запроса будет следующим:

idnameidauthor_idname
1 Вася 1 1 Вася Мега продукт

Как видите, в нашей базе данных известно, что только автор Вася написал хотя бы одну программу. Коля и Петя ничего не написали, поэтому их в результатах нет. Так же не вывелась безызвестная программа.

Теперь, перейдем к следующему типу

LEFT JOIN

Данные тип позволяет находить как все вариации обычного JOIN-а (inner), так и выводить строки из первой таблицы, для которых не нашлись строки из второй таблицы, удовлетворяющие условиям. В нашем случае, мы выведем всех авторов и, если есть, их программы тоже.

SQL запрос будет выглядеть следующим образом. Он точно такой же, как и в предыдущем случае, только вместо inner join стоит left join.

-- Выводим все поля
select *
-- Указываем таблицу авторов
from author
-- Соединяем с таблицей программ
left join util
-- Указываем условие
on author.id = util.author_id

Результат выполнения такого SQL запроса будет следующим:

idnameidauthor_idname
1 Вася 1 1 Вася Мега продукт
2 Коля NULL NULL NULL
3 Петя NULL NULL NULL

Как видите, были выведены все авторы. В случае с Васей, строка осталась аналогичной, так как он написал хотя бы одну программу. В случае с Колей и Петей возвращаемые результаты были NULL, так как они еще не написали ни одной программы. Так же стоит отметить, что и программа без автора не попала в результат, так как автор неизвестен.

Теперь, последний тип.

RIGHT JOIN

В целом, действие этого оператора точно такое же как и у LEFT JOIN, за одним исключением - таблицы "как бы" меняются местами (т.е. ищутся соответствия по второй таблице, а не первой). Вы могли бы сказать, что в таком случае можно было бы просто ограничится одним LEFT, но как показывает практика, RIGHT JOIN позволяет использовать понятные и удобные запросы, а так же быстро менять логику самих SQL запросов. В нашем случае, попытаемся найти все программы и их авторов, если таковые были указаны.

Воспользуемся тем же SQL запросом, но с правым объединением строк таблиц:

-- Выводим все поля
select *
-- Указываем таблицу авторов
from author
-- Соединяем с таблицей программ
right join util
-- Указываем условие
on author.id = util.author_id

Результат выполнения такого SQL запроса будет следующим:

idnameidauthor_idname
1 Вася 1 1 Вася Мега продукт
NULL NULL 2 0 Крутая, но неизвестная утилита

Как видите, вывелся весь список программ. В случае с Мега продуктом, автор нашелся, так что в левой части результата отображаются данные Васи. В случае же с безызвестной утилитой, автор не нашелся, поэтому в полях автора стоит значение NULL.

Если вы внимательно следили, то могли отметить насколько удобно устроен оператор JOIN, всего одной простой правкой можно легко поменять логику основного запроса.

Теперь, надеюсь, у вас не будет проблем с INNER JOIN, RIGHT JOIN, LEFT JOIN, и вы сможете с легкостью реализовывать свои творения.

1 1 1 1 1 1 1 1 1 1 Рейтинг 5.00 (1 Голос)

Комментарии / отзывы   

0 # Крошка 24.04.2017 18:41
Весьма полезная статья, понятный и наглядный пример, а то я уже запуталась с этими таблицами.
Ответить | Ответить с цитатой | Цитировать | Сообщить модератору

Добавить комментарий / отзыв

Комментарий - это вежливое и наполненное смыслом сообщение (правила).


Введите защитный код

Обновить
Защитный код

Каталог программ