вводить
Это статья, объясняющая SQL JOINs.Эта статья переведена отечественными шишками.Чтобы упростить понимание, LZ берет MySQL в качестве примера и добавляет пример в конце.Исходная ссылка: https:// www.cnblogs.com/xufeiyang/p/5818571.html
задний план
Я тот, кто не любит абстракцию, картинка стоит тысячи слов. Я искал все объяснения SQL JOIN в Интернете, но не смог найти ни одного, которое могло бы описать его с помощью изображений.
В некоторых есть картинки, но они не охватывают все примеры JOIN, а некоторые введения слишком просты для чтения. Поэтому я решил написать свою собственную статью, чтобы представить SQL JOIN.
Подробное описание
Далее я расскажу о семи способах получения данных из двух связанных таблиц, за исключением перекрестных JOIN и самостоятельных JOIN. Ниже приведены примеры семи JOIN:
-
INNER JOIN (внутреннее соединение)
-
LEFT JOIN (левое соединение)
-
ПРАВОЕ СОЕДИНЕНИЕ (правое соединение)
-
ВНЕШНЕЕ СОЕДИНЕНИЕ
-
LEFT JOIN EXCLUDING INNER JOIN (левое соединение исключает результат внутреннего соединения)
-
ПРАВОЕ СОЕДИНЕНИЕ ИСКЛЮЧАЯ ВНУТРЕННЕЕ СОЕДИНЕНИЕ (правое соединение исключает результат внутреннего соединения)
-
ВНЕШНЕЕ СОЕДИНЕНИЕ ИСКЛЮЧАЯ ВНУТРЕННЕЕ СОЕДИНЕНИЕ (внешнее соединение исключает результат внутреннего соединения)
Для лучшего описания этой статьи я использую 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
Публичный аккаунт с галантерейными товарами