JOIN
Область применения: Databricks SQL Databricks Runtime
Объединяет строки из двух ссылок на таблицу на основе условий соединения.
Синтаксис
left_table_reference { [ join_type ] JOIN right_table_reference [ join_criteria ] |
NATURAL join_type JOIN right_table_reference |
CROSS JOIN right_table_reference }
join_type
{ [ INNER ] |
LEFT [ OUTER ] |
[ LEFT ] SEMI |
RIGHT [ OUTER ] |
FULL [ OUTER ] |
[ LEFT ] ANTI |
CROSS }
join_criteria
{ ON boolean_expression |
USING ( column_name [, ...] ) }
Параметры
-
Ссылка на таблицу слева от соединения.
-
Ссылка на таблицу справа от соединения.
join_type
Тип соединения.
[ INNER ]
Возвращает строки, соответствующие значениям в обеих таблицах. Тип соединения по умолчанию.
LEFT [ OUTER ]
Возвращает все значения из ссылки на левую таблицу и соответствующие значения из правой ссылки на таблицу или добавляется
NULL
, если совпадения нет. Он также называется левым внешним соединением.RIGHT [ OUTER ]
Возвращает все значения из правой ссылки на таблицу и соответствующие значения из ссылки на левую таблицу или добавляется
NULL
, если совпадения нет. Он также называется правым внешним соединением.FULL [ВНЕШНИЙ]
Возвращает все значения из обоих отношений, добавляя значения
NULL
на стороне, не имеющей совпадений. Он также называется полным внешним соединением.[ СЛЕВА ] ПОЛУ
Возвращает значения из левой части ссылки на таблицу, которая имеет совпадение с правом. Он также называется левым полусоединяем.
[ СЛЕВА ] АНТИ
Возвращает значения из ссылки на левую таблицу, которые не соответствуют правой ссылке на таблицу. Он также называется левым анти-соединением.
ПЕРЕКРЁСТОК JOIN
Возвращает декартово произведение двух отношений.
NATURAL
Указывает, что строки из двух отношений будут неявно сопоставляться по равенству во всех столбцах с совпадающими именами.
join_criteria
При необходимости указывает, как строки из одной ссылки на таблицу объединяются со строками другой ссылки на таблицу.
Предупреждение
Если опустить
join_criteria
, то любой изjoin_type
приобретает семантикуCROSS JOIN
.ON boolean_expression
Выражение с типом возвращаемого значения BOOLEAN, которое указывает, как сопоставляются строки из двух отношений. Если результат имеет значение true, строки считаются совпадающими.
USING ( column_name [, …] )
Соответствует строкам, сравнивая равенство для списка столбцов
column_name
, которые должны существовать в обоих отношениях.
-
Временное имя с опциональным списком идентификаторов столбцов.
Примечания.
Если указано USING
или NATURAL
отображается SELECT *
только одно вхождение для каждого столбца, используемого для сопоставления в первую очередь, а затем столбцы левого, а затем правые таблицы соединения, за исключением столбцов, присоединенных к ним.
SELECT * FROM first JOIN second USING (a, b)
эквивалентно правилу
SELECT first.a, first.b,
first.* EXCEPT(a, b),
second.* EXCEPT(a, b)
FROM first JOIN second ON first.a = second.a AND first.b = second.b
Примеры
-- Use employee and department tables to demonstrate different type of joins.
> CREATE TEMP VIEW employee(id, name, deptno) AS
VALUES(105, 'Chloe', 5),
(103, 'Paul' , 3),
(101, 'John' , 1),
(102, 'Lisa' , 2),
(104, 'Evan' , 4),
(106, 'Amy' , 6);
> CREATE TEMP VIEW department(deptno, deptname) AS
VALUES(3, 'Engineering'),
(2, 'Sales' ),
(1, 'Marketing' );
-- Use employee and department tables to demonstrate inner join.
> SELECT id, name, employee.deptno, deptname
FROM employee
INNER JOIN department ON employee.deptno = department.deptno;
103 Paul 3 Engineering
101 John 1 Marketing
102 Lisa 2 Sales
-- Use employee and department tables to demonstrate left join.
> SELECT id, name, employee.deptno, deptname
FROM employee
LEFT JOIN department ON employee.deptno = department.deptno;
105 Chloe 5 NULL
103 Paul 3 Engineering
101 John 1 Marketing
102 Lisa 2 Sales
104 Evan 4 NULL
106 Amy 6 NULL
-- Use employee and department tables to demonstrate right join.
> SELECT id, name, employee.deptno, deptname
FROM employee
RIGHT JOIN department ON employee.deptno = department.deptno;
103 Paul 3 Engineering
101 John 1 Marketing
102 Lisa 2 Sales
-- Use employee and department tables to demonstrate full join.
> SELECT id, name, employee.deptno, deptname
FROM employee
FULL JOIN department ON employee.deptno = department.deptno;
101 John 1 Marketing
106 Amy 6 NULL
103 Paul 3 Engineering
105 Chloe 5 NULL
104 Evan 4 NULL
102 Lisa 2 Sales
-- Use employee and department tables to demonstrate cross join.
> SELECT id, name, employee.deptno, deptname
FROM employee
CROSS JOIN department;
105 Chloe 5 Engineering
105 Chloe 5 Marketing
105 Chloe 5 Sales
103 Paul 3 Engineering
103 Paul 3 Marketing
103 Paul 3 Sales
101 John 1 Engineering
101 John 1 Marketing
101 John 1 Sales
102 Lisa 2 Engineering
102 Lisa 2 Marketing
102 Lisa 2 Sales
104 Evan 4 Engineering
104 Evan 4 Marketing
104 Evan 4 Sales
106 Amy 4 Engineering
106 Amy 4 Marketing
106 Amy 4 Sales
-- Use employee and department tables to demonstrate semi join.
> SELECT *
FROM employee
SEMI JOIN department ON employee.deptno = department.deptno;
103 Paul 3
101 John 1
102 Lisa 2
-- Use employee and department tables to demonstrate anti join.
> SELECT *
FROM employee
ANTI JOIN department ON employee.deptno = department.deptno;
105 Chloe 5
104 Evan 4
106 Amy 6
-- Use employee and department tables to demonstrate lateral inner join.
> SELECT id, name, deptno, deptname
FROM employee
JOIN LATERAL (SELECT deptname
FROM department
WHERE employee.deptno = department.deptno);
103 Paul 3 Engineering
101 John 1 Marketing
102 Lisa 2 Sales
-- Use employee and department tables to demonstrate lateral left join.
> SELECT id, name, deptno, deptname
FROM employee
LEFT JOIN LATERAL (SELECT deptname
FROM department
WHERE employee.deptno = department.deptno);
105 Chloe 5 NULL
103 Paul 3 Engineering
101 John 1 Marketing
102 Lisa 2 Sales
104 Evan 4 NULL
106 Amy 6 NULL