В этом учебном пособии вы узнаете, как использовать JOINS, как INNER, так и OUTER JOINS, в SQL Server (Transact-SQL) с синтаксисом, рисунками и примерами.
Описание
SQL Server (Transact-SQL) JOINS используются для извлечения данных из нескольких таблиц. JOIN SQL Server выполняется, когда две или более таблицы объединены в SQL-запрос.
Существует 4 разных типа соединений SQL Server:
- SQL Server INNER JOIN (или иногда называют простое соединение)
- SQL Server LEFT OUTER JOIN (или иногда называют LEFT JOIN)
- SQL Server RIGHT OUTER JOIN (или иногда называют RIGHT JOIN)
- SQL Server FULL OUTER JOIN (или иногда называют FULL JOIN)
Итак, обсудим синтаксис SQL Server JOIN, посмотрим на рисунки SQL Server JOINS и рассмотрим примеры JOIN для SQL Server.
INNER JOIN (простое соединение)
Скорее всего, вы уже писали запросы, в котором используется SQL INNER JOIN. Это наиболее распространенный тип соединения. SQL Server INNER JOINS возвращает все строки из нескольких таблиц, где выполняется условие объединения.
Синтаксис
Синтаксис INNER JOIN в SQL Server (Transact-SQL):
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
Рисунок
На этом рисунке SQL INNER JOIN возвращает затененную область:
SQL Server INNER JOIN вернет записи, в которых пересекаются table1 и table2.
Пример
Ниже приведен пример INNER JOIN в SQL Server (Transact-SQL):
1 2 3 4 |
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers INNER JOIN orders ON suppliers.supplier_id = orders.supplier_id; |
Этот пример SQL Server INNER JOIN возвратит все строки из таблиц suppliers и orders, где в таблицах suppliers и orders будет указано соответствующее значение supplier_id.
Давайте рассмотрим некоторые данные, чтобы объяснить, как работает INNER JOINS:
У нас есть таблица, называемая suppliers с двумя полями (supplier_id и supplier_name), которая содержит следующие данные:
supplier_id | supplier_name |
---|---|
10000 | IBM |
10001 | Hewlett Packard |
10002 | Microsoft |
10003 | NVIDIA |
Если мы выполним SQL Server оператор SELECT (который содержит INNER JOIN) ниже:
1 2 3 4 |
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers INNER JOIN orders ON suppliers.supplier_id = orders.supplier_id; |
Наш результирующий набор будет выглядеть следующим образом:
supplier_id | name | order_date |
---|---|---|
10000 | IBM | 05.05.2015 |
10001 | Hewlett Packard | 08.02.2016 |
Строки для Microsoft и NVIDIA из таблицы suppliers будут опущены, так как значения supplier_id 10002 и 10003 не существует в обеих таблицах. Строка order_id 500127 из таблицы orders будет опущена, так как supplier_id 10004 не существует в таблице suppliers.
Старый синтаксис
В качестве последнего примечания, стоит отметить, что приведенный выше пример SQL Server INNER JOIN можно переписать, используя старый неявный синтаксис следующим образом (но рекомендуется использовать синтаксис INNER JOIN):
FROM suppliers, orders
WHERE suppliers.supplier_id = orders.supplier_id;
LEFT OUTER JOIN
Другой тип соединения называется SQL Server LEFT OUTER JOIN. Этот тип соединения возвращает все строки из таблицы с левосторонним соединением, указанной в условии ON, и только те строки из другой таблицы, где объединенные поля равны (условие соединения выполнено).
Синтаксис
Синтаксис LEFT OUTER JOIN в SQL Server (Transact-SQL):
FROM table1
LEFT [OUTER] JOIN table2
ON table1.column = table2.column;
В некоторых базах данных ключевые слова LEFT OUTER JOIN заменяются LEFT JOIN.
Рисунок
На этом рисунке, SQL Server LEFT OUTER JOIN возвращает затененную область:
SQL Server LEFT OUTER JOIN вернет все записи из table1 и только те записи из table2, которые пересекаются с table1.
Пример
Ниже приведен пример LEFT OUTER JOIN в SQL Server (Transact-SQL):
1 2 3 4 |
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers LEFT OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id; |
Этот пример LEFT OUTER JOIN возвращает все строки из таблиц suppliers и orders, где имеются соответствующие значение поля supplier_id в обоих таблицах.
Если значение supplier_id в таблице suppliers не существует в таблице orders, все поля в таблице orders будут отображаться как
Рассмотрим некоторые данные, чтобы понять, как работает INNER JOIN:
У нас есть таблица suppliers с двумя полями (supplier_id и supplier_name) которая содержит следующие данные:
supplier_id | supplier_name |
---|---|
10000 | IBM |
10001 | Hewlett Packard |
10002 | Microsoft |
10003 | NVIDIA |
У нас есть еще одна таблица orders с тремя полями (order_id, supplier_id и order_date). Она содержит следующие данные:
order_id | supplier_id | order_date |
---|---|---|
500125 | 10000 | 05.05.2015 |
500126 | 10001 | 08.02.2016 |
Если мы запустим оператор SELECT (который содержит LEFT OUTER JOIN) ниже:
1 2 3 4 |
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers LEFT OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id; |
Результирующий набор будет выглядеть следующим образом:
supplier_id | name | order_date |
---|---|---|
10000 | IBM | 05.05.2015 |
10001 | Hewlett Packard | 08.02.2016 |
10002 | Microsoft | null |
10003 | NVIDIA | null |
Строки для Microsoft и NVIDIA будут включены, так как был использован LEFT OUTER JOIN. Тем не менее, вы заметите, что поле order_date для этих записей содержит значение NULL.
RIGHT OUTER JOIN
Другой тип соединения называется SQL Server RIGHT OUTER JOIN. Этот тип соединения возвращает все строки из таблицы с правосторонним соединением, указанной в условии ON, и только те строки из другой таблицы, где объединенные поля равны (условие соединения выполнено).
Синтаксис
Синтаксис RIGHT OUTER JOIN в SQL Server (Transact-SQL):
FROM table1
RIGHT [OUTER] JOIN table2
ON table1.column = table2.column;
В некоторых базах данных, RIGHT OUTER JOIN заменяется на RIGHT JOIN.
Рисунок
На этом рисунке, Oracle RIGHT OUTER JOIN возвращает затененную область:
Пример
Рассмотрим пример RIGHT OUTER JOIN SQL Server (Transact-SQL):
1 2 3 4 |
SELECT orders.order_id, orders.order_date, suppliers.supplier_name FROM suppliers RIGHT OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id; |
Этот пример RIGHT OUTER JOIN возвращает все строки из таблицы orders и только те строки из таблицы suppliers, где объединяемые поля равны.
Если значение supplier_id в таблице orders не существует в таблице suppliers, все поля в таблице suppliers будут отображаться в результирующем наборе как NULL.
Рассмотрим некоторые данные, чтобы понять, как работает RIGHT OUTER JOIN:
У нас есть таблица suppliers с двумя полями (supplier_id и supplier_name) которая содержит следующие данные:
supplier_id | supplier_name |
---|---|
10000 | Apple |
10001 |
У нас есть вторая таблица orders с тремя полями (order_id, supplier_id и order_date). Она содержит следующие данные:
order_id | supplier_id | order_date |
---|---|---|
500125 | 10000 | 12.05.2016 |
500126 | 10001 | 14.05.2016 |
500127 | 10002 | 18.05.2016 |
Если мы запустим оператор SELECT (который содержит RIGHT OUTER JOIN) ниже:
1 2 3 4 |
SELECT orders.order_id, orders.order_date, suppliers.supplier_name FROM suppliers RIGHT OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id; |
Результирующий набор будет выглядеть следующим образом:
order_id | order_date | supplier_name |
---|---|---|
500125 | 12.05.2016 | Apple |
500126 | 14.05.2016 | |
500127 | 18.05.2016 | null |
Строка для order_id 500127 будет включена, так как был использован RIGHT OUTER JOINS. Тем не менее, вы заметите, что поле supplier_name для этой записи содержит значение NULL.
FULL OUTER JOIN
Другой тип соединения называется SQL Server FULL OUTER JOIN. Этот тип соединения возвращает все строки из левой таблицы и правой таблицы с NULL - значениями в месте, где условие объединения не выполняется.
Синтаксис
Синтаксис SQL Server FULL OUTER JOIN:
FROM table1
FULL [OUTER] JOIN table2
ON table1.column = table2.column;
В некоторых базах данных, FULL OUTER JOIN заменяются FULL JOIN.
Рисунок
На этом рисунке, FULL OUTER JOIN возвращает затененную область:
SQL Server FULL OUTER JOIN будет возвращать все записи из обеих таблиц table1 и table2.
Пример
Ниже приведен пример ПОЛНОГО ВНЕШНЕГО СОСТАВА в SQL Server (Transact-SQL):
1 2 3 4 |
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers FULL OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id; |
Этот пример FULL OUTER JOIN возвратит все строки из таблицы suppliers и все строки из таблицы orders и всякий раз, когда условие соединения не выполняется, то поля в результирующем наборе будут принимать значения NULL.
Если значение поля supplier_id в таблице suppliers не существует в таблице orders, то все поля в таблице orders будут отображаться в результирующем наборе как NULL. Если значение supplier_id в таблице orders не существует в таблице suppliers, то все поля в таблице suppliers будут отображаться результирующем наборе как NULL .
Рассмотрим некоторые данные, чтобы понять, как работает FULL OUTER JOIN:
У нас есть таблица suppliers с двумя полями (supplier_id и supplier_name). Она содержит следующие данные:
supplier_id | supplier_name |
---|---|
10000 | IBM |
10001 | Hewlett Packard |
10002 | Microsoft |
10003 | NVIDIA |
У нас есть вторая таблица orders с тремя полями (order_id, supplier_id и order_date), которая содержит следующие данные:
order_id | supplier_id | order_date |
---|---|---|
500125 | 10000 | 12.05.2016 |
500126 | 10001 | 14.05.2016 |
500127 | 10004 | 18.05.2016 |
Если мы выполним оператор SELECT (который содержит FULL OUTER JOIN) ниже:
1 2 3 4 |
SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers FULL OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id; |
Результирующий набор будет выглядеть следующим образом:
supplier_id | supplier_name | order_date |
---|---|---|
10000 | IBM | 12.05.2016 |
10001 | Hewlett Packard | 14.05.2016 |
10002 | Microsoft | null |
10003 | NVIDIA | null |
null | null | 18.05.2016 |
Строки для Microsoft и NVIDIA будут включены, так как используется FULL OUTER JOIN. Тем не менее, вы заметите, что поле order_date для этих записей содержит значение NULL.
Строка для supplier_id 10004 также будет включена, так как используется FULL OUTER JOIN. Тем не менее, вы заметите, что supplier_id и поле supplier_name для этих записей содержат значение NULL.