Что такое соединения SQL? Объяснение типов SQL-соединений

Что такое соединения SQL База данных

Язык структурированных запросов (SQL) позволяет нам выполнять какие-то действия с одной таблицей в реляционной базе данных. Эти действия могут обновлять, создавать, удалять или выбирать запись в этой таблице.

Что, если бы у нас было две таблицы с разной информацией об одном и том же человеке, и мы хотели бы использовать всю эту информацию для отображения в счете этого человека? Для этого нам нужно будет использовать предложение соединения.

В этом руководстве мы определим, что такое предложение соединения, поговорим о типах предложений соединения и дадим примеры соединения для каждого из них.

Что такое соединения SQL?

Операторы соединения SQL позволяют нам получать доступ к информации из двух или более таблиц одновременно. Они также нормализуют нашу базу данных. Нормализация позволяет нам поддерживать низкий уровень избыточности данных, чтобы мы могли уменьшить количество аномалий данных в нашем приложении при удалении или обновлении записи.

Упрощенно: предложение JOIN позволяет нам объединять строки из двух или более таблиц на основе связанного столбца.

Давайте проиллюстрируем приведенный выше пример с нашим клиентом и заказом клиента. Если бы у нас была таблица Customers с информацией о нашем клиенте и отдельная таблица заказов:

Давайте проиллюстрируем приведенный выше пример с нашим клиентом и заказом клиентаОбратите внимание, что в этих таблицах содержится много одинаковой информации в обеих таблицах. Оператор соединения значительно снижает потребность в этих повторяющихся значениях. Наши новые таблицы могут выглядеть так:

Обратите внимание, что в этих таблицах содержится много одинаковой информации в обеих таблицах

Мы можем запрашивать базу данных, используя предложения соединения для выбора информации из таблицы Customers и информации из таблицы Orders для использования там, где нам нужно в нашем приложении.

В зависимости от ваших потребностей существует несколько различных типов операторов соединения. В следующем разделе мы рассмотрим примеры каждого типа.

Типы операторов соединения

Тип используемого оператора соединения зависит от вашего варианта использования. Есть четыре различных типа операций соединения:

  • (INNER) JOIN: возвращает набор данных, значения которого совпадают в обеих таблицах.
  • LEFT (OUTER) JOIN: возвращает все записи из левой таблицы и соответствующие записи из правой s
  • RIGHT (OUTER) JOIN: возвращает все записи из правой таблицы и соответствующие записи из левой.
  • ПОЛНОЕ (ВНЕШНЕЕ) СОЕДИНЕНИЕ: возвращает все записи при совпадении в левой или правой таблице.
Читайте также:  Лучшие инструменты анализа данных

Тип используемого оператора соединения зависит от вашего варианта использования

Внутренние соединения

Если представить каждую таблицу как отдельный круг на диаграмме Венна, внутренним соединением будет заштрихованная область, где пересекаются оба круга.

Ключевое слово INNER JOIN выбирает все строки из таблиц, пока выполняется условие соединения. Это ключевое слово создаст набор результатов, состоящий из объединенных строк из обеих таблиц, в которых существует общее поле.

Вот синтаксис внутреннего соединения:

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

В этом примере будут исключены все записи со значениями NULL.

create table Customers (
    customer_id INT,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    address VARCHAR(50),
    city VARCHAR(50),
    state VARCHAR(50),
    zip_code VARCHAR(50),
    email VARCHAR(50),
    PRIMARY KEY(customer_id)
);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (1, ‘Windham’, ‘McKevitt’, ’73 Namekagon Park’, ‘Washington’, ‘DC’, ‘20525’, ‘wmckevitt0@example.com’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (2, ‘Wallis’, ‘Breawood’, ‘91869 Dexter Parkway’, ‘Pomona’, ‘CA’, ‘91797’, ‘wbreawood1@nhs.uk’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (3, ‘Valerie’, ‘Merkel’, ’35 Longview Alley’, ‘Bonita Springs’, ‘FL’, ‘34135’, ‘vmerkel2@123-reg.co.uk’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (4, ‘Brigid’, ‘Southwood’, ‘568 Kropf Parkway’, ‘Indianapolis’, ‘IN’, ‘46216’, ‘bsouthwood3@privacy.gov.au’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (5, ‘Tucker’, ‘Du Pre’, ‘521 Bonner Park’, ‘Miami’, ‘FL’, ‘33175’, ‘tdupre4@thetimes.co.uk’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (6, ‘Tabbie’, ‘Maxwaile’, ‘3824 Sunnyside Pass’, ‘Pittsburgh’, ‘PA’, ‘15261’, ‘tmaxwaile5@joomla.org’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (7, ‘Cull’, ‘Stanborough’, ‘8624 Larry Place’, ‘Boston’, ‘MA’, ‘02298’, ‘cstanborough6@alibaba.com’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (8, ‘Homer’, ‘Park’, ‘8994 Elmside Circle’, ‘Dallas’, ‘TX’, ‘75251’, ‘hpark7@plala.or.jp’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (9, ‘Lorelei’, ‘Bollom’, ‘5737 Manley Circle’, ‘San Francisco’, ‘CA’, ‘94121’, ‘lbollom8@arstechnica.com’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (10, ‘Claudina’, ‘Thibodeaux’, ’74 Holy Cross Hill’, ‘Norfolk’, ‘VA’, ‘23520’, ‘cthibodeaux9@mysql.com’);
create table Orders (
    order_id INT,
    order_date VARCHAR(50),
    amount VARCHAR(50),
    customer_id INT,
    PRIMARY KEY(order_id)
);
insert into Orders (order_id, order_date, amount, customer_id) values (34, ’07-11-2020′, ‘$56.34’, 1);
insert into Orders (order_id, order_date, amount, customer_id) values (12, ’07-12-2020′, ‘$23.34’, 2);
insert into Orders (order_id, order_date, amount, customer_id) values (18, ’07-13-2020′, ‘$156.72’, 3);
insert into Orders (order_id, order_date, amount, customer_id) values (01, ’07-14-2020′, ‘$536.12’, 4);
insert into Orders (order_id, order_date, amount, customer_id) values (89, ’07-15-2020′, ‘$99.45’, 5);
insert into Orders (order_id, order_date, amount, customer_id) values (82, ’07-12-2020′, ‘$12.12’, 6);
insert into Orders (order_id, order_date, amount, customer_id) values (99, ’07-11-2020′, ‘$19.52’, 7);
insert into Orders (order_id, order_date, amount, customer_id) values (23, ’07-11-2020′, ‘$88.98’, 2);
insert into Orders (order_id, order_date, amount, customer_id) values (22, ’07-16-2020′, ‘$222.34’, 3);
insert into Orders (order_id, order_date, amount, customer_id) values (56, ’07-16-2020′, ‘$222.34’, NULL);
select first_name, last_name, order_date, amount
from Customers c
inner join Orders o
on c.customer_id = o.customer_id
ORDER BY order_date

Правое внешнее соединение

Этот оператор соединения принимает все записи из таблицы B, независимо от того, имеют ли они значения NULL и соответствующие столбцы из таблицы A.

Правое соединение возвращает все строки самой правой таблицы и соответствующие строки самой левой таблицы. RIGHT JOIN также известен как RIGHT OUTER. Вот синтаксис:

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;

Здесь наша таблица клиентов — это таблица A, а таблица заказов — это таблица B.

create table Customers (
    customer_id INT,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    address VARCHAR(50),
    city VARCHAR(50),
    state VARCHAR(50),
    zip_code VARCHAR(50),
    email VARCHAR(50),
    PRIMARY KEY(customer_id)
);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (1, ‘Windham’, ‘McKevitt’, ’73 Namekagon Park’, ‘Washington’, ‘DC’, ‘20525’, ‘wmckevitt0@example.com’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (2, ‘Wallis’, ‘Breawood’, ‘91869 Dexter Parkway’, ‘Pomona’, ‘CA’, ‘91797’, ‘wbreawood1@nhs.uk’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (3, ‘Valerie’, ‘Merkel’, ’35 Longview Alley’, ‘Bonita Springs’, ‘FL’, ‘34135’, ‘vmerkel2@123-reg.co.uk’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (4, ‘Brigid’, ‘Southwood’, ‘568 Kropf Parkway’, ‘Indianapolis’, ‘IN’, ‘46216’, ‘bsouthwood3@privacy.gov.au’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (5, ‘Tucker’, ‘Du Pre’, ‘521 Bonner Park’, ‘Miami’, ‘FL’, ‘33175’, ‘tdupre4@thetimes.co.uk’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (6, ‘Tabbie’, ‘Maxwaile’, ‘3824 Sunnyside Pass’, ‘Pittsburgh’, ‘PA’, ‘15261’, ‘tmaxwaile5@joomla.org’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (7, ‘Cull’, ‘Stanborough’, ‘8624 Larry Place’, ‘Boston’, ‘MA’, ‘02298’, ‘cstanborough6@alibaba.com’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (8, ‘Homer’, ‘Park’, ‘8994 Elmside Circle’, ‘Dallas’, ‘TX’, ‘75251’, ‘hpark7@plala.or.jp’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (9, ‘Lorelei’, ‘Bollom’, ‘5737 Manley Circle’, ‘San Francisco’, ‘CA’, ‘94121’, ‘lbollom8@arstechnica.com’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (10, ‘Claudina’, ‘Thibodeaux’, ’74 Holy Cross Hill’, ‘Norfolk’, ‘VA’, ‘23520’, ‘cthibodeaux9@mysql.com’);
create table Orders (
    order_id INT,
    order_date VARCHAR(50),
    amount VARCHAR(50),
    customer_id INT,
    PRIMARY KEY(order_id)
);
insert into Orders (order_id, order_date, amount, customer_id) values (34, ’07-11-2020′, ‘$56.34’, 1);
insert into Orders (order_id, order_date, amount, customer_id) values (12, ’07-12-2020′, ‘$23.34’, 2);
insert into Orders (order_id, order_date, amount, customer_id) values (18, ’07-13-2020′, ‘$156.72’, 3);
insert into Orders (order_id, order_date, amount, customer_id) values (01, ’07-14-2020′, ‘$536.12’, 4);
insert into Orders (order_id, order_date, amount, customer_id) values (89, ’07-15-2020′, ‘$99.45’, 5);
insert into Orders (order_id, order_date, amount, customer_id) values (82, ’07-12-2020′, ‘$12.12’, 6);
insert into Orders (order_id, order_date, amount, customer_id) values (99, ’07-11-2020′, ‘$19.52’, 7);
insert into Orders (order_id, order_date, amount, customer_id) values (23, ’07-11-2020′, ‘$88.98’, 2);
insert into Orders (order_id, order_date, amount, customer_id) values (22, ’07-16-2020′, ‘$222.34’, 3);
insert into Orders (order_id, order_date, amount, customer_id) values (56, ’07-16-2020′, ‘$77.92’, NULL);
select first_name, last_name, order_date, amount
from Customers c
right join Orders o
on c.customer_id = o.customer_id
ORDER BY order_date;

Левое внешнее соединение

Левое соединение аналогично правому соединению. Левое соединение возвращает все строки самой левой таблицы и совпадающие строки для самой правой таблицы. Ниже приведен синтаксис:

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

В этом примере перечислены все записи из таблицы Customers (независимо от того, имеют ли они значения NULL) вместе с соответствующими столбцами в таблице Orders.

create table Customers (
    customer_id INT,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    address VARCHAR(50),
    city VARCHAR(50),
    state VARCHAR(50),
    zip_code VARCHAR(50),
    email VARCHAR(50),
    PRIMARY KEY(customer_id)
);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (1, ‘Windham’, ‘McKevitt’, ’73 Namekagon Park’, ‘Washington’, ‘DC’, ‘20525’, ‘wmckevitt0@example.com’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (2, ‘Wallis’, ‘Breawood’, ‘91869 Dexter Parkway’, ‘Pomona’, ‘CA’, ‘91797’, ‘wbreawood1@nhs.uk’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (3, ‘Valerie’, ‘Merkel’, ’35 Longview Alley’, ‘Bonita Springs’, ‘FL’, ‘34135’, ‘vmerkel2@123-reg.co.uk’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (4, ‘Brigid’, ‘Southwood’, ‘568 Kropf Parkway’, ‘Indianapolis’, ‘IN’, ‘46216’, ‘bsouthwood3@privacy.gov.au’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (5, ‘Tucker’, ‘Du Pre’, ‘521 Bonner Park’, ‘Miami’, ‘FL’, ‘33175’, ‘tdupre4@thetimes.co.uk’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (6, ‘Tabbie’, ‘Maxwaile’, ‘3824 Sunnyside Pass’, ‘Pittsburgh’, ‘PA’, ‘15261’, ‘tmaxwaile5@joomla.org’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (7, ‘Cull’, ‘Stanborough’, ‘8624 Larry Place’, ‘Boston’, ‘MA’, ‘02298’, ‘cstanborough6@alibaba.com’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (8, ‘Homer’, ‘Park’, ‘8994 Elmside Circle’, ‘Dallas’, ‘TX’, ‘75251’, ‘hpark7@plala.or.jp’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (9, ‘Lorelei’, ‘Bollom’, ‘5737 Manley Circle’, ‘San Francisco’, ‘CA’, ‘94121’, ‘lbollom8@arstechnica.com’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (10, ‘Claudina’, ‘Thibodeaux’, ’74 Holy Cross Hill’, ‘Norfolk’, ‘VA’, ‘23520’, ‘cthibodeaux9@mysql.com’);
create table Orders (
    order_id INT,
    order_date VARCHAR(50),
    amount VARCHAR(50),
    customer_id INT,
    PRIMARY KEY(order_id)
);
insert into Orders (order_id, order_date, amount, customer_id) values (34, ’07-11-2020′, ‘$56.34’, 1);
insert into Orders (order_id, order_date, amount, customer_id) values (12, ’07-12-2020′, ‘$23.34’, 2);
insert into Orders (order_id, order_date, amount, customer_id) values (18, ’07-13-2020′, ‘$156.72’, 3);
insert into Orders (order_id, order_date, amount, customer_id) values (01, ’07-14-2020′, ‘$536.12’, 4);
insert into Orders (order_id, order_date, amount, customer_id) values (89, ’07-15-2020′, ‘$99.45’, 5);
insert into Orders (order_id, order_date, amount, customer_id) values (82, ’07-12-2020′, ‘$12.12’, 6);
insert into Orders (order_id, order_date, amount, customer_id) values (99, ’07-11-2020′, ‘$19.52’, 7);
insert into Orders (order_id, order_date, amount, customer_id) values (23, ’07-11-2020′, ‘$88.98’, 2);
insert into Orders (order_id, order_date, amount, customer_id) values (22, ’07-16-2020′, ‘$222.34’, 3);
insert into Orders (order_id, order_date, amount, customer_id) values (56, ’07-16-2020′, ‘$77.92’, NULL);
select first_name, last_name, order_date, amount
from Customers c
left join Orders o
on c.customer_id = o.customer_id
ORDER BY order_date;

Полное присоединение

Полные соединения также известны как полные внешние соединения. Это в основном означает, что запрос будет объединять данные и возвращать записи из обеих таблиц независимо от того, имеют ли они значения NULL.

FULL JOIN создает набор результатов путем объединения результатов левого и правого соединений, включая все строки. Для строк, которые не совпадают. набор результатов (объединенная таблица) покажет значения NULL. Синтаксис следующий:

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name
WHERE condition;

В PostgreSQL работает полный синтаксис соединения:

create table Customers (
    customer_id INT,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    address VARCHAR(50),
    city VARCHAR(50),
    state VARCHAR(50),
    zip_code VARCHAR(50),
    email VARCHAR(50),
    PRIMARY KEY(customer_id)
);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (1, ‘Windham’, ‘McKevitt’, ’73 Namekagon Park’, ‘Washington’, ‘DC’, ‘20525’, ‘wmckevitt0@example.com’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (2, ‘Wallis’, ‘Breawood’, ‘91869 Dexter Parkway’, ‘Pomona’, ‘CA’, ‘91797’, ‘wbreawood1@nhs.uk’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (3, ‘Valerie’, ‘Merkel’, ’35 Longview Alley’, ‘Bonita Springs’, ‘FL’, ‘34135’, ‘vmerkel2@123-reg.co.uk’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (4, ‘Brigid’, ‘Southwood’, ‘568 Kropf Parkway’, ‘Indianapolis’, ‘IN’, ‘46216’, ‘bsouthwood3@privacy.gov.au’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (5, ‘Tucker’, ‘Du Pre’, ‘521 Bonner Park’, ‘Miami’, ‘FL’, ‘33175’, ‘tdupre4@thetimes.co.uk’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (6, ‘Tabbie’, ‘Maxwaile’, ‘3824 Sunnyside Pass’, ‘Pittsburgh’, ‘PA’, ‘15261’, ‘tmaxwaile5@joomla.org’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (7, ‘Cull’, ‘Stanborough’, ‘8624 Larry Place’, ‘Boston’, ‘MA’, ‘02298’, ‘cstanborough6@alibaba.com’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (8, ‘Homer’, ‘Park’, ‘8994 Elmside Circle’, ‘Dallas’, ‘TX’, ‘75251’, ‘hpark7@plala.or.jp’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (9, ‘Lorelei’, ‘Bollom’, ‘5737 Manley Circle’, ‘San Francisco’, ‘CA’, ‘94121’, ‘lbollom8@arstechnica.com’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (10, ‘Claudina’, ‘Thibodeaux’, ’74 Holy Cross Hill’, ‘Norfolk’, ‘VA’, ‘23520’, ‘cthibodeaux9@mysql.com’);
insert into Customers (customer_id, first_name, last_name, address, city, state, zip_code, email) values (11, NULL, NULL , ’74 Holy Cross Hill’, ‘Norfolk’, ‘VA’, ‘23520’, NULL);
create table Orders (
    order_id INT,
    order_date VARCHAR(50),
    amount VARCHAR(50),
    customer_id INT,
    PRIMARY KEY(order_id)
);
insert into Orders (order_id, order_date, amount, customer_id) values (98, ’07-01-2020′, ‘$333.33’, 11);
insert into Orders (order_id, order_date, amount, customer_id) values (12, ’07-12-2020′, ‘$23.34’, 2);
insert into Orders (order_id, order_date, amount, customer_id) values (18, ’07-13-2020′, ‘$156.72’, 3);
insert into Orders (order_id, order_date, amount, customer_id) values (01, ’07-14-2020′, ‘$536.12’, 4);
insert into Orders (order_id, order_date, amount, customer_id) values (89, ’07-15-2020′, ‘$99.45’, 5);
insert into Orders (order_id, order_date, amount, customer_id) values (82, ’07-12-2020′, ‘$12.12’, 6);
insert into Orders (order_id, order_date, amount, customer_id) values (99, ’07-11-2020′, ‘$19.52’, 7);
insert into Orders (order_id, order_date, amount, customer_id) values (23, ’07-11-2020′, ‘$88.98’, 2);
insert into Orders (order_id, order_date, amount, customer_id) values (22, ’07-16-2020′, ‘$222.34’, 3);
insert into Orders (order_id, order_date, amount, customer_id) values (56, ’07-16-2020′, ‘$77.92’, NULL);
insert into Orders (order_id, order_date, amount, customer_id) values (34, ’07-11-2020′, ‘$56.34’, 1);
select first_name, last_name, order_date, amount
from Customers c
full join Orders o
on c.customer_id = o.customer_id
ORDER BY order_date;

Примечание. Полные объединения обычно не используются, что может объяснить, почему MySQL не поддерживает их. Однако есть несколько вариантов использования.

Например, с записями просмотра, в которых заказ не связан с клиентом, или с клиентом, который не сделал никаких заказов.

Оцените статью
bestprogrammer.ru
Добавить комментарий