A. users B. 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 INNERJOIN departments d ON u.d_id = d.id
Запрос вернет объединенные данные, которые пересекаются по условию, указанному в INNER JOIN. В результате не присутствует: - пользователь Александр (отдел 6) - отдел Финансы (нет пользователей)
id name d_name -- -------- --------- 1 Владимир Сейлз 2 Антон Поддержка 4 Борис Поддержка 3 Юрий Логистика
рис. Inner join
INNER JOIN это синоним для JOIN. Выбираются только совпадающие данные из объединяемых таблиц. Чтобы получить данные, которые не подходят по условию, необходимо использовать OUTER JOIN. Такое объединение вернет все данные из обоих таблиц.
С JOIN может также указываться LEFT.
рис. Left join
Существует два типа внешнего объединения (OUTER JOIN) - LEFT OUTER JOIN и RIGHT OUTER JOIN. Работают они одинаково, разница заключается в том что LEFT - указывает что "внешней" таблицей будет находящаяся слева. В нашем примере это таблица users.
SELECT u.id, u.name, d.name AS d_name FROM users u LEFTOUTERJOIN departments d ON u.d_id = d.id
Получаем полный список пользователей и сопоставленные департаменты.
id name d_name -- -------- --------- 1 Владимир Сейлз 2 Антон Поддержка 3 Александр NULL 4 Борис Поддержка 5 Юрий Логистика
рис. Left outer join
RIGHT OUTER JOIN вернет полный список департаментов (правая таблица) и сопоставленных пользователей.
SELECT u.id, u.name, d.name AS d_name FROM users u RIGHTOUTERJOIN departments d ON u.d_id = d.id
id name d_name -- -------- --------- 1 Владимир Сейлз 2 Антон Поддержка 4 Борис Поддержка NULL NULL Финансы 5 Юрий Логистика
Дополнительно можно отфильтровать данные, проверяя их на NULL. В нашем примере указав WHERE a.id IS null, мы отбросим записи, в которых пользователи не числятся в отделах.