JOIN операция
join_operation:
{ cross_join_operation | condition_join_operation }
cross_join_operation:
from_item cross_join_operator from_item
condition_join_operation:
from_item condition_join_operator from_item join_condition
cross_join_operator:
{ CROSS JOIN | , }
condition_join_operator:
{
[INNER] JOIN
| FULL [OUTER] JOIN
| LEFT [OUTER] JOIN
| RIGHT [OUTER] JOIN
}
join_condition:
{ on_clause | using_clause }
on_clause:
ON bool_expression
using_clause:
USING ( join_column [, ...] )
JOINfrom_item
Операция объединяет два SELECT
а, чтобы предложение могло запрашивать их как один источник. Предложение join_type
и ON
или USING
( “условие объединения”) определяет, как объединять и отбрасывать строки из двух from_item
s для формирования единого источника.
[INNER] JOIN
INNER JOIN
или просто JOIN
эффективно вычисляет декартово произведение двух таблиц данных и отбрасывает все строки , которые не соответствуют условию объединения. “Эффективно” означает, что можно реализовать без фактического вычисления декартова произведения INNER JOIN
FROM A INNER JOIN B ON A.w = B.y
Table A Table B Result
+-------+ +-------+ +---------------+
| w | x | * | y | z | = | w | x | y | z |
+-------+ +-------+ +---------------+
| 1 | a | | 2 | k | | 2 | b | 2 | k |
| 2 | b | | 3 | m | | 3 | c | 3 | m |
| 3 | c | | 3 | n | | 3 | c | 3 | n |
| 3 | d | | 4 | p | | 3 | d | 3 | m |
+-------+ +-------+ | 3 | d | 3 | n |
+---------------+
FROM A INNER JOIN B USING (x)
Table A Table B Result
+-------+ +-------+ +-----------+
| x | y | * | x | z | = | x | y | z |
+-------+ +-------+ +-----------+
| 1 | a | | 2 | k | | 2 | b | k |
| 2 | b | | 3 | m | | 3 | c | m |
| 3 | c | | 3 | n | | 3 | c | n |
| 3 | d | | 4 | p | | 3 | d | m |
+-------+ +-------+ | 3 | d | n |
+-----------+
Пример
Этот запрос выполняется INNER JOIN
для таблиц Roster
и TeamMascot
SELECT Roster.LastName, TeamMascot.Mascot
FROM Roster JOIN TeamMascot ON Roster.SchoolID = TeamMascot.SchoolID;
+---------------------------+
| LastName | Mascot |
+---------------------------+
| Adams | Jaguars |
| Buchanan | Lakers |
| Coolidge | Lakers |
| Davis | Knights |
+---------------------------+
CROSS JOIN
CROSS JOIN
возвращает декартово произведение двух таблиц
. Другими словами, он объединяет каждую строку из первой таблиц
с каждой строкой из второй таблицей
.
Если строки двух таблиц
независимы, то результат имеет M * N строк, учитывая что M строк в одной таблицк и N в другой.
CROSS JOIN
может быть написан так:
FROM A CROSS JOIN B
Table A Table B Result
+-------+ +-------+ +---------------+
| w | x | * | y | z | = | w | x | y | z |
+-------+ +-------+ +---------------+
| 1 | a | | 2 | c | | 1 | a | 2 | c |
| 2 | b | | 3 | d | | 1 | a | 3 | d |
+-------+ +-------+ | 2 | b | 2 | c |
| 2 | b | 3 | d |
+---------------+
Вы можете использовать коррелированное перекрестное соединение для преобразования или сглаживания ARRAY
в набор строк. Чтобы узнать больше, см. Преобразуйте элементы массива в строки таблицы.
Примеры
Этот запрос выполняется CROSS JOIN
для таблиц Roster
и TeamMascot
SELECT Roster.LastName, TeamMascot.Mascot
FROM Roster CROSS JOIN TeamMascot;
+---------------------------+
| LastName | Mascot |
+---------------------------+
| Adams | Jaguars |
| Adams | Knights |
| Adams | Lakers |
| Adams | Mustangs |
| Buchanan | Jaguars |
| Buchanan | Knights |
| Buchanan | Lakers |
| Buchanan | Mustangs |
| ... |
+---------------------------+
Перекрестное соединение через запятую (,)
CROSS JOIN
могут быть записаны неявно с запятой. Это называется перекрестным соединением через запятую.
Соединение через запятую выглядит так:
FROM A, B
Table A Table B Result
+-------+ +-------+ +---------------+
| w | x | * | y | z | = | w | x | y | z |
+-------+ +-------+ +---------------+
| 1 | a | | 2 | c | | 1 | a | 2 | c |
| 2 | b | | 3 | d | | 1 | a | 3 | d |
+-------+ +-------+ | 2 | b | 2 | c |
| 2 | b | 3 | d |
+---------------+
Вы не можете писать перекрестные соединения через запятую внутри круглых скобок. Чтобы узнать больше, см. Соединяйте операции в определенной последовательности.
FROM (A, B) // INVALID
Вы можете использовать коррелированное перекрестное соединение через запятую для преобразования или сглаживания ARRAY
в набор строк. Чтобы узнать больше, см. Преобразуйте элементы массива в строки таблицы.
Примеры
Этот запрос выполняет перекрестное соединение через запятую в таблицах Roster
и TeamMascot
SELECT Roster.LastName, TeamMascot.Mascot
FROM Roster, TeamMascot;
+---------------------------+
| LastName | Mascot |
+---------------------------+
| Adams | Jaguars |
| Adams | Knights |
| Adams | Lakers |
| Adams | Mustangs |
| Buchanan | Jaguars |
| Buchanan | Knights |
| Buchanan | Lakers |
| Buchanan | Mustangs |
| ... |
+---------------------------+
INNER [OUTER] JOIN
A FULL OUTER JOIN
(или просто FULL JOIN
) возвращает все поля для всех строк в обоих таблицах, которые удовлетворяют условию соединения.
FULL
указывает, что возвращаются все строки из обоих таблиц, даже если они не соответствуют условию соединения.
OUTER
указывает , что если данная строка из одной таблицы не присоединяется ни к одной строке в другой таблице, строка вернется с нулевыми значениями для всех столбцов из другой таблицы.
FROM A FULL OUTER JOIN B ON A.w = B.y
Table A Table B Result
+-------+ +-------+ +---------------------------+
| w | x | * | y | z | = | w | x | y | z |
+-------+ +-------+ +---------------------------+
| 1 | a | | 2 | k | | 1 | a | NULL | NULL |
| 2 | b | | 3 | m | | 2 | b | 2 | k |
| 3 | c | | 3 | n | | 3 | c | 3 | m |
| 3 | d | | 4 | p | | 3 | c | 3 | n |
+-------+ +-------+ | 3 | d | 3 | m |
| 3 | d | 3 | n |
| NULL | NULL | 4 | p |
+---------------------------+
FROM A FULL OUTER JOIN B USING (x)
Table A Table B Result
+-------+ +-------+ +--------------------+
| x | y | * | x | z | = | x | y | z |
+-------+ +-------+ +--------------------+
| 1 | a | | 2 | k | | 1 | a | NULL |
| 2 | b | | 3 | m | | 2 | b | k |
| 3 | c | | 3 | n | | 3 | c | m |
| 3 | d | | 4 | p | | 3 | c | n |
+-------+ +-------+ | 3 | d | m |
| 3 | d | n |
| 4 | NULL | p |
+--------------------+
Пример
Этот запрос выполняет a FULL JOIN
для таблиц Roster
и TeamMascot
SELECT Roster.LastName, TeamMascot.Mascot
FROM Roster FULL JOIN TeamMascot ON Roster.SchoolID = TeamMascot.SchoolID;
+---------------------------+
| LastName | Mascot |
+---------------------------+
| Adams | Jaguars |
| Buchanan | Lakers |
| Coolidge | Lakers |
| Davis | Knights |
| Eisenhower | NULL |
| NULL | Mustangs |
+---------------------------+
LEFT [OUTER] JOIN
Результат a LEFT OUTER JOIN
(или просто LEFT JOIN
) для двух таблиц
всегда сохраняет все строки слева таблиц
в JOIN
операции, даже если ни одна строка справа не удовлетворяет запросу объединения.
LEFT
указывает, что возвращаются все строки слева по ключу таблицы; если данная строка слева не присоединяется ни к одной строке таблицы справа, строка вернется с нулевыми значениями для всех столбцов таблицы справа. Строки справа, которые не соединяются ни с одной строкой слева, отбрасываются
FROM A LEFT OUTER JOIN B ON A.w = B.y
Table A Table B Result
+-------+ +-------+ +---------------------------+
| w | x | * | y | z | = | w | x | y | z |
+-------+ +-------+ +---------------------------+
| 1 | a | | 2 | k | | 1 | a | NULL | NULL |
| 2 | b | | 3 | m | | 2 | b | 2 | k |
| 3 | c | | 3 | n | | 3 | c | 3 | m |
| 3 | d | | 4 | p | | 3 | c | 3 | n |
+-------+ +-------+ | 3 | d | 3 | m |
| 3 | d | 3 | n |
+---------------------------+
FROM A LEFT OUTER JOIN B USING (x)
Table A Table B Result
+-------+ +-------+ +--------------------+
| x | y | * | x | z | = | x | y | z |
+-------+ +-------+ +--------------------+
| 1 | a | | 2 | k | | 1 | a | NULL |
| 2 | b | | 3 | m | | 2 | b | k |
| 3 | c | | 3 | n | | 3 | c | m |
| 3 | d | | 4 | p | | 3 | c | n |
+-------+ +-------+ | 3 | d | m |
| 3 | d | n |
+--------------------+
Пример
Этот запрос выполняет a LEFT JOIN
для таблиц Roster
и TeamMascot
SELECT Roster.LastName, TeamMascot.Mascot
FROM Roster LEFT JOIN TeamMascot ON Roster.SchoolID = TeamMascot.SchoolID;
+---------------------------+
| LastName | Mascot |
+---------------------------+
| Adams | Jaguars |
| Buchanan | Lakers |
| Coolidge | Lakers |
| Davis | Knights |
| Eisenhower | NULL |
+---------------------------+
RIGHT [OUTER] JOIN
Результат а RIGHT OUTER JOIN
(или просто RIGHT JOIN
) аналогичен и симметричен LEFT OUTER JOIN
результату
FROM A RIGHT OUTER JOIN B ON A.w = B.y
Table A Table B Result
+-------+ +-------+ +---------------------------+
| w | x | * | y | z | = | w | x | y | z |
+-------+ +-------+ +---------------------------+
| 1 | a | | 2 | k | | 2 | b | 2 | k |
| 2 | b | | 3 | m | | 3 | c | 3 | m |
| 3 | c | | 3 | n | | 3 | c | 3 | n |
| 3 | d | | 4 | p | | 3 | d | 3 | m |
+-------+ +-------+ | 3 | d | 3 | n |
| NULL | NULL | 4 | p |
+---------------------------+
FROM A RIGHT OUTER JOIN B USING (x)
Table A Table B Result
+-------+ +-------+ +--------------------+
| x | y | * | x | z | = | x | y | z |
+-------+ +-------+ +--------------------+
| 1 | a | | 2 | k | | 2 | b | k |
| 2 | b | | 3 | m | | 3 | c | m |
| 3 | c | | 3 | n | | 3 | c | n |
| 3 | d | | 4 | p | | 3 | d | m |
+-------+ +-------+ | 3 | d | n |
| 4 | NULL | p |
+--------------------+
Пример
Этот запрос выполняет a RIGHT JOIN
для таблиц Roster
и TeamMascot
SELECT Roster.LastName, TeamMascot.Mascot
FROM Roster RIGHT JOIN TeamMascot ON Roster.SchoolID = TeamMascot.SchoolID;
+---------------------------+
| LastName | Mascot |
+---------------------------+
| Adams | Jaguars |
| Buchanan | Lakers |
| Coolidge | Lakers |
| Davis | Knights |
| NULL | Mustangs |
+---------------------------+
ON значение
Объединенная строка (результат соединения двух строк) удовлетворяет ON
условию соединения, если возвращается условие соединения TRUE
.
FROM A JOIN B ON A.x = B.x
Table A Table B Result (A.x, B.x)
+---+ +---+ +-------+
| x | * | x | = | x | x |
+---+ +---+ +-------+
| 1 | | 2 | | 2 | 2 |
| 2 | | 3 | | 3 | 3 |
| 3 | | 4 | +-------+
+---+ +---+
Пример
Этот запрос выполняется INNER JOIN
в таблице Roster
и TeamMascot
SELECT Roster.LastName, TeamMascot.Mascot
FROM Roster JOIN TeamMascot ON Roster.SchoolID = TeamMascot.SchoolID;
+---------------------------+
| LastName | Mascot |
+---------------------------+
| Adams | Jaguars |
| Buchanan | Lakers |
| Coolidge | Lakers |
| Davis | Knights |
+---------------------------+
USING значение
USING
предложение требует списка столбцов из одного или нескольких столбцов, которые встречаются в обеих входных таблицах. Он выполняет сравнение на равенство для этого столбца, и строки удовлетворяют условию соединения, если сравнение на равенство возвращается TRUE
.
FROM A JOIN B USING (x)
Table A Table B Result
+---+ +---+ +---+
| x | * | x | = | x |
+---+ +---+ +---+
| 1 | | 2 | | 2 |
| 2 | | 3 | | 3 |
| 3 | | 4 | +---+
+---+ +---+
Пример
Этот запрос выполняется INNER JOIN
в таблице Roster
и TeamMascot
Этот оператор возвращает строки из Roster
и TeamMascot
где Roster.SchooldID
совпадает с TeamMascot.SchooldID
. Результаты включают в себя один SchooldID
столбец.
SELECT * FROM Roster INNER JOIN TeamMascot USING (SchoolID);
+----------------------------------------+
| SchoolID | LastName | Mascot |
+----------------------------------------+
| 50 | Adams | Jaguars |
| 52 | Buchanan | Lakers |
| 52 | Coolidge | Lakers |
| 51 | Davis | Knights |
+----------------------------------------+
ON и USING значения
Ключевые ON
слова и USING
не эквивалентны, но они похожи. ON
возвращает несколько столбцов и USING
возвращает один.
FROM A JOIN B ON A.x = B.x
FROM A JOIN B USING (x)
Table A Table B Result ON Result USING
+---+ +---+ +-------+ +---+
| x | * | x | = | x | x | | x |
+---+ +---+ +-------+ +---+
| 1 | | 2 | | 2 | 2 | | 2 |
| 2 | | 3 | | 3 | 3 | | 3 |
| 3 | | 4 | +-------+ +---+
+---+ +---+
Хотя ON
и USING
не эквивалентны, они могут возвращать одни и те же результаты , если вы укажете столбцы, которые хотите вернуть.
SELECT x FROM A JOIN B USING (x);
SELECT A.x FROM A JOIN B ON A.x = B.x;
Table A Table B Result
+---+ +---+ +---+
| x | * | x | = | x |
+---+ +---+ +---+
| 1 | | 2 | | 2 |
| 2 | | 3 | | 3 |
| 3 | | 4 | +---+
+---+ +---+