JOIN в SQL
Команда JOIN в SQL-запросе служит для объединения выборки из нескольких таблиц в один результирующий набор, причём в результирующей выборке находятся все поля всех таблиц, участвующих в запросе. Давайте с Вами разберём подробнее использование JOIN в SQL.
Существует несколько вариантов запроса JOIN, начнём мы с самого популярного, а именно INNER JOIN:
SELECT * FROM `users` INNER JOIN `subscribers` ON `users`.`email` = `subscribers`.`email`
Подобным запросом я извлёк все записи, где в выборку попадут все пользователи сайта, которые также являются подписчиками.
Особенностью INNER JOIN является то, что в результат входят все поля со всеми значениями. Количество записей ровно столько, сколько удовлетворили условиям у обеих таблиц.
Теперь давайте перейдём к следующей разновидности JOIN, а точнее к LEFT OUTER JOIN:
SELECT * FROM `users` LEFT OUTER JOIN `subscribers` ON `users`.`email` = `subscribers`.`email`
Особенностью данного запроса является то, что результат выборки содержит записи, удовлетворяющие левой таблице. Если они ещё и удовлетворяют условиям правой таблицы, то это идентично INNER JOIN, иначе вместо значений в правой таблице будет NULL.
Теперь перейдём к RIGHT OUTER JOIN:
SELECT * FROM `users` RIGHT OUTER JOIN `subscribers` ON `users`.`email` = `subscribers`.`email`
Зеркальная противоположность LEFT OUTER JOIN, теперь NULL присутствуют в первой таблице, то есть слева.
И, наконец, последний тип JOIN - это CROSS JOIN:
SELECT * FROM `users` CROSS JOIN `subscribers`
Данный запрос выдаёт всевозможные сочетания двух таблиц. В данном запросе результирующее число записей - это перемножение количества записей в обеих таблицах.
Я ещё не рассказал о FULL OUTER JOIN, который не поддерживается MySQL. Но, на мой взгляд, он и не нужен. Его особенностью является то, что он выводит строку, в которой есть хотя бы одно совпадение с любой из таблиц. Соответственно, в другой таблице (в которой нет совпадения с условием) идут NULL. Фактически, это объединение LEFT OUTER JOIN и RIGHT OUTER JOIN:
SELECT * FROM `users` LEFT OUTER JOIN `subscribers` ON `users`.`email` = `subscribers`.`email` UNION SELECT * FROM `users` RIGHT OUTER JOIN `subscribers` ON `users`.`email` = `subscribers`.`email`
Вот я и рассказал обо всех разновидностях JOIN в SQL. Стоит отметить, что тема очень сложная, и её редко понимают с первого раза. Поэтому я Вам рекомендую обязательно посмотреть, как работают данные запросы на примере Ваших каких-нибудь таблиц (если их нет, то создайте). Проверьте все разновидности JOIN и посмотрите, чем они отличаются.
-
- Михаил Русаков
Комментарии (9):
Я не силен в SQL, только начал изучать. Статья отличная. Но если бы были маленькие "примерчики" для каждого случая для сравнении, я бы понял абсолютно все! Спасибо за статьи!
Ответить
А как сделать сортировку вывода данных? Вот в мы же обьединяем два запроса юнионом, а как сделать ORDER BY и по какому же запросу и как его указать?
Ответить
В самом конце запроса его можно указать, после всех JOIN. Там же указывается и WHERE, и LIMIT.
Ответить
Михаил, а не рискованно открывать всему свету префикс таблиц в вашей БД?)
Ответить
Это старый, от Joomla ещё остался, но вообще, да, он попал сюда случайно, когда проверял правильность запросов, чтобы не было ошибок.
Ответить
Михаил очень прошу вас чтобы вы написали цикл статей про репликацию и подробную ее настройку. то что есть php.ru не доходчиво для меня.
Ответить
Возможно, напишу в следующем месяце.
Ответить
Я очень надеюсь! Она будет действительно нужна для многих юзеров!
Ответить
Здраствуйте!После этого запроса пропали все комментарий на сайте, как их вернуть?
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.