Объяснение SQL объединений JOIN: LEFT/RIGHT/INNER/OUTER

Записи и примечания на тему HTML, CSS, PHP, JScript

Объяснение SQL объединений JOIN: LEFT/RIGHT/INNER/OUTER

» » Сообщение:

Разберем пример. Имеем две таблицы: пользователи и отделы.

Код: Выделить всё Развернуть
U) users               D) departments
id name       d_id     id  name
-- ----       ----     --  ----
1  Владимир    1       1  Сейлз
2  Антон       2       2  Поддержка
3  Александр   6       3  Финансы
4  Борис       2       4  Логистика
5  Юрий        4
Код: Выделить всё Развернуть
SELECT u.id, u.name, d.name AS d_name
FROM users u
INNER JOIN departments d ON u.d_id = d.id

Запрос вернет объединенные данные, которые пересекаются по условию, указанному в INNER JOIN ON <..>.
В нашем случае условие <таблица_пользователей>.<идентификатор_отдела> должен совпадать с <таблица_отделов>.<идентификатор>

В результате отсутствуют:

  • - пользователь Александр (отдел 6 - не существует)
  • - отдел Финансы (нет пользователей)
Код: Выделить всё Развернуть
id name       d_name
-- --------   ---------
1  Владимир    Сейлз
2  Антон       Поддержка
4  Борис       Поддержка
3  Юрий        Логистика
Inner join
Inner join

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


Чтобы получить данные, которые подходят по условию частично, необходимо использовать внешнее объединение - OUTER JOIN.

Такое объединение вернет данные из обеих таблиц (совпадающие по условию объединения) ПЛЮС дополнит выборку оставшимися данными из внешней таблицы, которые по условию не подходят, заполнив недостающие данные значением NULL.

Left join
Left join

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

Код: Выделить всё Развернуть
SELECT u.id, u.name, d.name AS d_name
FROM users u
LEFT OUTER JOIN departments d ON u.d_id = d.id

Получаем полный список пользователей и сопоставленные департаменты.

Код: Выделить всё Развернуть
id      name          d_name
--      --------      ---------
1       Владимир      Сейлз
2       Антон         Поддержка
3       Александр     NULL
4       Борис         Поддержка
5       Юрий          Логистика

Добавив условие

Код: Выделить всё Развернуть
WHERE d.id IS NULL

в выборке останется только 3#Александр, так как у него не назначен департамент.

Left outer join с фильтрацией по полю
Left outer join с фильтрацией по полю

RIGHT OUTER JOIN вернет полный список департаментов (правая таблица) и сопоставленных пользователей.

Код: Выделить всё Развернуть
SELECT u.id, u.name, d.name AS d_name
FROM users u
RIGHT OUTER JOIN departments d ON u.d_id = d.id
Код: Выделить всё Развернуть
id      name        d_name
--      --------    ---------
1       Владимир    Сейлз
2       Антон       Поддержка
4       Борис       Поддержка
NULL    NULL        Финансы
5       Юрий        Логистика

Дополнительно можно отфильтровать данные, проверяя их на NULL.

Код: Выделить всё Развернуть
SELECT d.id, d.name
FROM users u
RIGHT OUTER JOIN departments d ON u.d_id = d.id
WHERE u.id IS null

В нашем примере указав WHERE u.id IS null, мы выберем департаменты, в которых не числятся пользователи. (3#Финансы)

© www.skillz.ru

outer, users, данные, departments, inner, финансы, юрий, пользователей, александр, select, условию, right, антон, владимир, сейлз, нашем, where, объединение, вернет, список



Похожие темыКомментарии ПросмотрыПоследнее сообщение
0432mySQL - Синтаксис JOIN на примерах
Сообщение от: Admin
0344В чем разница между INNER JOIN, LEF...
Сообщение от: Admin