Разбираемся с mySQL JOIN, визуальное представление.

Author Автор: Роман Чернышов    Опубликовано: 13 мая 2012

На протяжении немалого времени, в начале своей карьеры веб-разработчика, я работал с базой данный как умел, а умел я не многое. Составлял простые примитивные запросы, а порою даже вставлял запросы в циклы. На тот момент мне к сожалению не попалась в руки правильная книжка по mySQL и учить приходилось методом проб и ошибок. Множество статей в интернете как-то не сразу донесли до меня замечательный mySQL запрос — JOIN.
В этой публикации я расскажу о всех возможных вариантах работы с JOIN и более того, представлю принцип работы каждой команды — визуально.

Рассматривать мы будем:

  1. INNER JOIN
  2. LEFT JOIN
  3. RIGHT JOIN
  4. OUTER JOIN
  5. LEFT JOIN EXCLUDING INNER JOIN
  6. RIGHT JOIN EXCLUDING INNER JOIN
  7. OUTER JOIN EXCLUDING INNER JOIN

Отдельно стоит отметить пункты 5,6 и 7. На самом деле эти запросы не соединяют две таблицы, а наоборот исключают из одной таблицы столбцы присутствующие в другой. На деле это может оказать очень полезным.

Inner JOIN

Один из самых распространенных запросов, встречается предельно часто. Этот запрос вернет все записи из левой таблицы (таб. А) и записи из (таб. В), но при этом возвращены будут только совпадающие столбцы.

Пример запроса:

SELECT <select_list>
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key

Left JOIN

Данный запрос вернет все столбцы из левой таблицы (таб. А), а также все столбцы из правой таблицы (таб. В) но только которые совпадают со столбцами из левой таблицы.

Пример запроса:

SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key

Right JOIN

Аналогичен предыдущему запросу, но уже вернет все столбцы из правой таблицы (таб. В), а также все столбцы из левой таблицы (таб. А) которые совпадают со столбцами из правой таблицы.

Пример запроса:

SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key

Outer JOIN

Часто данный запрос записывают как FULL OUTER JOIN или FULL JOIN, все вариации выполняют одно действие, а именно возвращают все столбцы из обоих таблиц, при этом совпадающие столбцы будут перекрыты столбцами из левой таблицы.

Пример запроса:

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key

Left Excluding JOIN

Этот запрос вернет все столбцы из левой таблицы (таб. А), которые не совпадают со столбцами из правой таблицы (таб. В).

Пример запроса:

SELECT <select_list> 
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL

Right Excluding JOIN

Почти как и предыдущий, но этот запрос вернет все столбцы из правой таблицы (таб. В), которые не совпадают со столбцами из левой таблицы (таб. А).

Пример запроса:

SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL

Outer Excluding JOIN

Этот запрос вернет все записи из левой и правой таблицы, но при этом исключит совпадающие столбцы.

Пример запроса:

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL OR B.Key IS NULL

Надеюсь этот пост пригодится многим начинающий веб-разработчикам, ведь запомнить сразу все отличия запросов друг от друга очень сложно, ввиду чего многие пользуются одним, двумя типами запросов и забывают про силу и мощь mySQL.

В качестве шпаргалки приведу изображение со всеми типами JOIN запросов и кратким примером кода.

Category mySQL     Tags ,

9 комментариев to “Разбираемся с mySQL JOIN, визуальное представление.”

  • Andrey 26.04.2016 в 12:01 дп

    Есть 3 таблицы(A,B,C), в таблице A есть данные как и из B, так и из C. Как можно получить эти записи?
    Спасибо

    • Роман Чернышов 26.04.2016 в 12:37 дп

      Добрый день, сформулируйте вопрос правильно, уточните что вы подразумеваете под словами «эти записи»?
      Если вы хотите сделать выборку из таблицы А, совместно подтянув данные из В и С, то запрос будет такой

      SELECT a.*, b.*, c.*
      FROM a
      LEFT JOIN b ON a.field1 = b.field1
      LEFT JOIN c ON a.field2 = c.fiel2

      Возможно вы хотите при выборки соблюсти какие-то условия?

  • Andrey 26.04.2016 в 1:06 дп

    A B C
    id name id name id name
    1 John 1 Alisa 1 Paul
    2 Paul 2 John
    3 Alisa
    4 Jeff

    Надо выбрать из таблицы A имена которые есть в таблицах B и C, т.е по итогу получить результат Alisa Paul John

    • Роман Чернышов 26.04.2016 в 1:15 дп

      SELECT a.name
      FROM a
      WHERE (SELECT count(id) FROM b WHERE a.name=b.name) > 0 OR (SELECT count(id) FROM c WHERE a.name=c.name) > 0

      Наверняка если поразмыслить, протестировать и сделать замеры, то найдется более быстрый и оптимальный запрос.
      Это то, что пришло в голову, впрочем тоже достаточно эффективно.

  • Andrey 26.04.2016 в 1:13 дп

    A
    | id name |
    | 1 John |
    | 2 Paul |
    | 3 Alisa |
    | 4 Jeff |
    |_________|

    B
    | id name |
    | 1 Alisa |
    |_________|

    C
    | id name |
    | 1 Paul |
    | 2 John |
    |_________|

    Чуть более корректные таблицы

    • Andrey 26.04.2016 в 1:19 дп

      Через JOIN это менее эффективно?

      • Роман Чернышов 26.04.2016 в 2:06 дп

        JOIN тут не подходит)

        • Петр 25.05.2016 в 1:13 пп

          Готов поспорить: что мешает обернуть в OUTER JOIN результаты двух INNER JOIN?

  • Александр 21.06.2016 в 11:39 дп

    Вставлю свои пять копеек. Вот еще вариант решения:
    SELECT name
    FROM A
    WHERE name IN (SELECT name FROM B) OR name IN (SELECT name FROM D)

Оставить комментарий на Andrey

Автор блога
Роман Чернышов
Веб-разработчик,
Full Stack
Senior, Architect
PHP, JavaScript, Node.JS, Python, HTML 5, CSS 3, MySQL, Bash, Linux Admin
Заказать работу
предложить оффер

Моя книга
Книга. Веб-разработчик. Легкий вход в профессию
Печатная книга
Веб-разработчик.
Легкий вход в профессию
Оформить предзаказ
Последние вопросы
Список вопросов
Последние комментарии
Меню

Archive

Мои проекты
Insurance CMS Love Crm CMS Совместные покупки Мой PHP Framework Хостинг для моих клиентов Лицензии на мой софт и поддержка