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

Author Роман Чернышов    Category mySQL     Tags , Комментариев 9 Дата 13 Май

На протяжении немалого времени, в начале своей карьеры веб-разработчика, я работал с базой данный как умел, а умел я не многое. Составлял простые примитивные запросы, а порою даже вставлял запросы в циклы. На тот момент мне к сожалению не попалась в руки правильная книжка по 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 запросов и кратким примером кода.

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)

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

Консультации

Последние вопросы
Меню

Archive

Качественный хостинг сайтов CMS Для сайта услуг хостинга