Объяснение SQL объединений JOIN INNER OUTER
|
|
|
Имеем две таблицы 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 INNER JOIN 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 LEFT OUTER JOIN 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 RIGHT OUTER JOIN departments d ON u.d_id = d.id id name d_name -- -------- --------- 1 Владимир Сейлз 2 Антон Поддержка 4 Борис Поддержка NULL NULL Финансы 5 Юрий Логистика Дополнительно можно отфильтровать данные, проверяя их на NULL. В нашем примере указав WHERE a.id IS null, мы отбросим записи, в которых пользователи не числятся в отделах. Информация: http://www.somecoders.com/2006/02/explanation-of-the-different-sql-joins/ http://www.khankennels.com/blog/index.php/archives/2007/04/20/getting-joins/ http://www.codinghorror.com/blog/archives/000976.html |