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

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

join1 Разбираемся с mySQL JOIN, визуальное представление.На протяжении немалого времени, в начале своей карьеры веб-разработчика, я работал с базой данный как умел, а умел я не многое. Составлял простые примитивные запросы, а порою даже вставлял запросы в циклы. На тот момент мне к сожалению не попалась в руки правильная книжка по 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
INNER JOIN Разбираемся с mySQL JOIN, визуальное представление.
Один из самых распространенных запросов, встречается предельно часто. Этот запрос вернет все записи из левой таблицы (таб. А) и записи из (таб. В), но при этом возвращены будут только совпадающие столбцы.

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

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

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

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

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

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

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

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

Outer JOIN
FULL OUTER JOIN Разбираемся с mySQL 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
LEFT EXCLUDING JOIN Разбираемся с mySQL 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
RIGHT EXCLUDING JOIN Разбираемся с mySQL 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
OUTER EXCLUDING JOIN Разбираемся с mySQL 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 запросов и кратким примером кода.

Visual SQL JOINS V2 Разбираемся с 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)

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

О блоге и авторе

Добро пожаловать на блог веб-разработчика! На протяжении многих лет, начиная с 2009 года, я занимаюсь созданием специализированных сайтов, сервисов и крупных веб-порталов. Мною было создано несколько сотен сайтов, большинство из которых работают на ПО созданном под заказ, а также на готовом ПО которое я разрабатываю на протяжении всего периода моей деятельности. Это: CMS "Совместные покупки", CMS "osRealty", CMS "Спорт прогнозы" и многое другое.

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

Поиск по блогу
Категории
Архив
Новое на сайте
Блогеры пишут
  • Роман Чернышов: Для работы капчи на PHP 5.6, замените в файле class.captcha.php строку 264 $ifunc( $this -> i [...]
  • Роман Чернышов: Схема такая: 1) На сайте есть виртуальные кошельки (далее ВК) 2) При пополнении пользователем ВК, [...]
  • Александр: Может скрипт комментариев блокирует сообщения с кодом? Или как длинный текст не проходит?
  • Александр: Пытаюсь в который раз здесь показать код, но страница обновляется, и не сообщения, ни любого оповеще [...]
  • Роман Чернышов: Лично у меня интерес к продаже ссылок пропал уже давно. Преимущество сапы, это то - что ссылки можно [...]
Портфолио Все работы


www.detskiy-mir.net
www.detskydoctor.ru
www.betelit.ru
www.all-alliance.ru
www.videogonok.ru
www.carpfishing.by
www.property-greek.com
www.domcons.ru

с 2009 года по сегодняшний день, создано более 300 сайтов...