SQL JOIN, все, что вы хотите знать, должно быть

база данных MySQL DBA

вводить

Это статья, объясняющая SQL JOINs.Эта статья переведена отечественными шишками.Чтобы упростить понимание, LZ берет MySQL в качестве примера и добавляет пример в конце.Исходная ссылка: https:// www.cnblogs.com/xufeiyang/p/5818571.html

задний план

Я тот, кто не любит абстракцию, картинка стоит тысячи слов. Я искал все объяснения SQL JOIN в Интернете, но не смог найти ни одного, которое могло бы описать его с помощью изображений.

В некоторых есть картинки, но они не охватывают все примеры JOIN, а некоторые введения слишком просты для чтения. Поэтому я решил написать свою собственную статью, чтобы представить SQL JOIN.

Подробное описание

Далее я расскажу о семи способах получения данных из двух связанных таблиц, за исключением перекрестных JOIN и самостоятельных JOIN. Ниже приведены примеры семи JOIN:

  1. INNER JOIN (внутреннее соединение)

  2. LEFT JOIN (левое соединение)

  3. ПРАВОЕ СОЕДИНЕНИЕ (правое соединение)

  4. ВНЕШНЕЕ СОЕДИНЕНИЕ

  5. LEFT JOIN EXCLUDING INNER JOIN (левое соединение исключает результат внутреннего соединения)

  6. ПРАВОЕ СОЕДИНЕНИЕ ИСКЛЮЧАЯ ВНУТРЕННЕЕ СОЕДИНЕНИЕ (правое соединение исключает результат внутреннего соединения)

  7. ВНЕШНЕЕ СОЕДИНЕНИЕ ИСКЛЮЧАЯ ВНУТРЕННЕЕ СОЕДИНЕНИЕ (внешнее соединение исключает результат внутреннего соединения)

Для лучшего описания этой статьи я использую 5, 6 и 7 как ЛЕВОЕ ИСКЛЮЧЕНИЕ ВНУТРЕННЕГО СОЕДИНЕНИЯ, ПРАВОЕ ИСКЛЮЧЕНИЕ ВНУТРЕННЕГО СОЕДИНЕНИЯ, ВНЕШНЕЕ ИСКЛЮЧЕНИЕ ВНУТРЕННЕГО СОЕДИНЕНИЯ, чтобы конкретно объяснить

У некоторых людей могут быть разные мнения: 5, 6, 7 на самом деле не являются соединениями двух таблиц, но для простоты понимания я по-прежнему называю их соединениями, поскольку вы можете использовать эти соединения в каждом запросе (за исключением некоторых записей с условием WHERE). )

INNER JOIN (внутреннее соединение)

Это самый простой, понятный и наиболее часто используемый метод JOIN. Запрос внутреннего соединения возвращает результаты для всех совпадающих строк в таблицах A и B. Пример SQL выглядит следующим образом:

SELECT <select_list> FROM Table_A AINNER JOIN Table_B BON A.Key = B.Keyскопировать код

LEFT JOIN (левое соединение)

Запрос LFET JOIN возвращает все записи в таблице A, независимо от того, есть ли совпадающие записи в таблице B. Он вернет все совпадающие записи в таблице B (конечно, ни одно совпадение не будет помечено как null). Пример SQL выглядит следующим образом:

SELECT <select_list>FROM Table_A ALEFT JOIN Table_B BON A.Key = B.Keyскопировать код

ПРАВОЕ СОЕДИНЕНИЕ (правое соединение)

Вопреки ЛЕВОМУ СОЕДИНЕНИЮ. Запрос RIGHT JOIN вернет все записи в таблице B, независимо от того, есть ли совпадающие записи в таблице A. Он вернет все совпадающие записи в таблице A (конечно, никакие совпадения не будут помечены как нулевые). Пример SQL выглядит следующим образом:

SELECT <select_list>FROM Table_A ARIGHT JOIN Table_B BON A.Key = B.Keyскопировать код

ВНЕШНЕЕ СОЕДИНЕНИЕ

OUTER JOIN также можно рассматривать как FULL OUTER JOIN или FULL JOIN. Он вернет все строки в обеих таблицах, левая таблица A соответствует правой таблице B, правая таблица B также соответствует левой таблице A (если совпадений нет, отображается нуль). ВНЕШНЕЕ СОЕДИНЕНИЕ обычно записывается следующим образом:

SELECT <select_list>FROM Table_A AFULL OUTER JOIN Table_B BON A.Key = B.Keyскопировать код

LEFT Excluding JOIN

Он вернет все строки в таблице A, которых нет в таблице B, обычно записывается как:

SELECT <select_list> FROM Table_A ALEFT JOIN Table_B BON A.Key = B.KeyWHERE B.Key IS NULLскопировать код

RIGHT Excluding JOIN

В отличие от вышесказанного, он вернет все строки в таблице B, которых нет в таблице A. Пример SQL выглядит следующим образом:

SELECT <select_list>FROM Table_A ARIGHT JOIN Table_B BON A.Key = B.KeyWHERE A.Key IS NULLскопировать код

OUTER Excluding JOIN

Outer Excluding JOIN вернет все строки в таблицах A и B, для которых нет совпадений. Я не сталкивался с такой ситуацией, но другие JOIN используются чаще. Пример SQL выглядит следующим образом:

SELECT <select_list>FROM Table_A AFULL OUTER JOIN Table_B BON A.Key = B.KeyWHERE A.Key IS NULL OR B.Key IS NULLскопировать код

пример

На примере MySQL подготовленные данные выглядят следующим образом: для облегчения понимания данные более регулярны

учительский стол

учитель_карточный стол

1, 2 и 3 — уникальные данные таблицы учителя, 4, 5 и 6 — общедоступные данные, а 7, 8 и 9 — уникальные данные таблицы учителя_карты.

INNER JOIN

SELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tINNER JOIN teacher_card tcON t.tid = tc.tidскопировать код

Ключевое слово INNER может быть опущено

lEFT JOIN

SELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tLEFT OUTER JOIN teacher_card tcON t.tid = tc.tidскопировать код

Ключевое слово OUTER может быть опущено

RIGHT JOIN

SELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tRIGHT OUTER JOIN teacher_card tcON t.tid = tc.tidскопировать код

Ключевое слово OUTER может быть опущено

OUTER JOIN

SELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tFULL OUTER JOIN teacher_card tcON t.tid = tc.tidскопировать код

Так написать нельзя, MySQL не поддерживает FULL OUTER JOIN, можно переписать так

SELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tLEFT JOIN teacher_card tcON t.tid = tc.tidUNIONSELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tRIGHT JOIN teacher_card tcON t.tid = tc.tidскопировать код

LEFT EXCLUDING JOIN

SELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tLEFT JOIN teacher_card tcON t.tid = tc.tidWHERE tc.tid IS NULLскопировать код

RIGHT EXCLUDING JOIN

SELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tRIGHT JOIN teacher_card tcON t.tid = tc.tidWHERE t.tid IS NULLскопировать код

OUTER EXCLUDING JOIN

SELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tFULL OUTER JOIN teacher_card tcON t.tid = tc.tidWHERE t.tid IS NULLOR tc.tid IS NULLскопировать код

Точно так же MySQL не может быть записан в приведенном выше виде, но может быть переписан следующим образом.

SELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tLEFT JOIN teacher_card tcON t.tid = tc.tidWHERE tc.tid IS NULLUNIONSELECT t.tid, t.name, tc.tid AS tcid, tc.descriptionFROM teacher tRIGHT JOIN teacher_card tcON t.tid = tc.tidWHERE t.tid IS NULLскопировать код

Последняя большая картина

Рекомендуемое чтение

Почему индекс MySQL реализован с деревом B+?

Принцип и применение ClassLoader

Порядок загрузки классов Java

Знание Java

Публичный аккаунт с галантерейными товарами