SQL Server присоединяется

В этом руководстве вы узнаете о различных соединениях 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 — внутреннее объединение

Следующая диаграмма Венна иллюстрирует результат внутреннего объединения двух результирующих наборов:

Объединения SQL Server — внутреннее объединение

Левое соединение 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;

Вот что получилось:

SQL Server Joins - левое соединение

Следующая диаграмма Венна иллюстрирует результат левого соединения двух результирующих наборов:

Чтобы получить строки, которые доступны только в левой таблице, но отсутствуют в правой, добавьте предложение 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 — левое объединение с предложением where

Следующая диаграмма Венна иллюстрирует результат левого соединения, которое выбирает строки, доступные только в левой таблице:

Соединения SQL Server — левое соединение только со строками в левой таблице

Правое соединение 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;

Вот что получилось:

SQL Server Joins - правое соединение

Обратите внимание, что все строки из правой таблицы(сотрудники) включены в результирующий набор.

Диаграмма Венна иллюстрирует правильное соединение двух наборов результатов:

Аналогично вы можете получить строки, доступные только в правой таблице, добавив предложение 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 — правильное объединение с предложением where

И диаграмма Венна, иллюстрирующая эту операцию:

Объединения SQL Server — правое объединение только со строками в правой таблице

Полное соединение 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;

Вот что получилось:

SQL Server Joins — полное соединение

Диаграмма Венна, иллюстрирующая полное внешнее соединение:

Соединения SQL Server — полное внешнее соединение

Чтобы выбрать строки, которые существуют либо в левой, либо в правой таблице, исключите строки, общие для обеих таблиц, добавив предложение 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 — полное соединение с предложением where

Диаграмма Венна иллюстрирует вышеописанную операцию:

Соединения SQL Server — полное внешнее соединение со строками, уникальными для обеих таблиц

В этом руководстве вы изучили различные соединения SQL Server, объединяющие данные из двух таблиц.

Мирослав С.

Автор статей, ИБ-специалист