В этом руководстве вы узнаете о различных соединениях SQL Server, которые позволяют объединять данные из двух таблиц.
В реляционной базе данных данные распределены по нескольким логическим таблицам. Чтобы получить полный осмысленный набор данных, вам необходимо запросить данные из этих таблиц с помощью соединений. SQL Server поддерживает множество видов соединений, включая внутреннее соединение, левое соединение, правое соединение, полное внешнее соединение и перекрестное соединение. Каждый тип соединения определяет, как SQL Server использует данные из одной таблицы для выбора строк в другой таблице.
Давайте создадим образцы таблиц для демонстрации.
Настройка таблиц образцов
Сначала создайте новую схему с именем hr:
CREATE SCHEMA hr; GO
Во-вторых, создайте две новые таблицы с именами candidates и employees в схеме hr:
CREATE TABLE hr.candidates( id INT PRIMARY KEY IDENTITY, fullname VARCHAR(100) NOT NULL ); CREATE TABLE hr.employees( id INT PRIMARY KEY IDENTITY, fullname VARCHAR(100) NOT NULL );
В-третьих, вставьте несколько строк в таблицы кандидатов и сотрудников:
INSERT INTO hr.candidates(fullname) VALUES ('John Doe'), ('Lily Bush'), ('Peter Drucker'), ('Jane Doe'); INSERT INTO hr.employees(fullname) VALUES ('John Doe'), ('Jane Doe'), ('Michael Scott'), ('Jack Sparrow');
Назовем таблицу кандидатов левой таблицей, а таблицу сотрудников — правой таблицей.
Внутреннее соединение SQL Server
Внутреннее соединение создает набор данных, включающий строки из левой таблицы и соответствующие строки из правой таблицы.
В следующем примере используется предложение внутреннего соединения для получения строк из таблицы candidates, которые содержат соответствующие строки с такими же значениями в столбце fullname таблицы employees:
SELECT c.id candidate_id, c.fullname candidate_name, e.id employee_id, e.fullname employee_name FROM hr.candidates c INNER JOIN hr.employees e ON e.fullname = c.fullname;
Вот что получилось:
Следующая диаграмма Венна иллюстрирует результат внутреннего объединения двух результирующих наборов:
Левое соединение SQL Server
Left join выбирает данные, начиная с левой таблицы и соответствующие строки в правой таблице. Left join возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если строка в левой таблице не имеет соответствующей строки в правой таблице, столбцы правой таблицы будут содержать пустые значения.
Левое соединение также известно как левое внешнее соединение. Ключевое слово outer необязательно.
Следующий оператор объединяет таблицу кандидатов с таблицей сотрудников с помощью левого соединения:
SELECT c.id candidate_id, c.fullname candidate_name, e.id employee_id, e.fullname employee_name FROM hr.candidates c LEFT JOIN hr.employees e ON e.fullname = c.fullname;
Вот что получилось:
Следующая диаграмма Венна иллюстрирует результат левого соединения двух результирующих наборов:
Чтобы получить строки, которые доступны только в левой таблице, но отсутствуют в правой, добавьте предложение WHERE к приведенному выше запросу:
SELECT c.id candidate_id, c.fullname candidate_name, e.id employee_id, e.fullname employee_name FROM hr.candidates c LEFT JOIN hr.employees e ON e.fullname = c.fullname WHERE e.id IS NULL;
На следующем рисунке показан результат:
Следующая диаграмма Венна иллюстрирует результат левого соединения, которое выбирает строки, доступные только в левой таблице:
Правое соединение SQL Server
Правое соединение или правое внешнее соединение выбирает данные, начиная с правой таблицы. Это обратная версия левого соединения.
Правое соединение возвращает результирующий набор, содержащий все строки из правой таблицы и соответствующие строки в левой таблице. Если строка в правой таблице не имеет соответствующей строки в левой таблице, все столбцы в левой таблице будут содержать пустые значения.
В следующем примере используется правильное соединение для запроса строк из таблиц кандидатов и сотрудников:
SELECT c.id candidate_id, c.fullname candidate_name, e.id employee_id, e.fullname employee_name FROM hr.candidates c RIGHT JOIN hr.employees e ON e.fullname = c.fullname;
Вот что получилось:
Обратите внимание, что все строки из правой таблицы(сотрудники) включены в результирующий набор.
Диаграмма Венна иллюстрирует правильное соединение двух наборов результатов:
Аналогично вы можете получить строки, доступные только в правой таблице, добавив предложение WHERE к приведенному выше запросу следующим образом:
SELECT c.id candidate_id, c.fullname candidate_name, e.id employee_id, e.fullname employee_name FROM hr.candidates c RIGHT JOIN hr.employees e ON e.fullname = c.fullname WHERE c.id IS NULL;
Вот что получилось:
И диаграмма Венна, иллюстрирующая эту операцию:
Полное соединение SQL Server
Полное внешнее соединение или полное соединение возвращает результирующий набор, содержащий все строки из левой и правой таблиц, с соответствующими строками с обеих сторон, где это возможно. В случае отсутствия соответствия отсутствующая сторона будет иметь значения NULL.
В следующем примере показано, как выполнить полное соединение таблиц кандидатов и сотрудников:
SELECT c.id candidate_id, c.fullname candidate_name, e.id employee_id, e.fullname employee_name FROM hr.candidates c FULL JOIN hr.employees e ON e.fullname = c.fullname;
Вот что получилось:
Диаграмма Венна, иллюстрирующая полное внешнее соединение:
Чтобы выбрать строки, которые существуют либо в левой, либо в правой таблице, исключите строки, общие для обеих таблиц, добавив предложение WHERE, как показано в следующем запросе:
SELECT c.id candidate_id, c.fullname candidate_name, e.id employee_id, e.fullname employee_name FROM hr.candidates c FULL JOIN hr.employees e ON e.fullname = c.fullname WHERE c.id IS NULL OR e.id IS NULL;
Вот что получилось:
Диаграмма Венна иллюстрирует вышеописанную операцию:
В этом руководстве вы изучили различные соединения SQL Server, объединяющие данные из двух таблиц.