UNION - объединение нескольких результатов выборки
Операция UNION
позволяет объединить несколько результатов выборки в один набор строк. Именно объединение строк
отличает
эту операцию от соединения таблиц через JOIN
, которая присоединяет столбцы.
Если не используется ключевое слово ALL
для UNION
, все возвращенные строки будут уникальными, так как по умолчанию
подразумевается DISTINCT
, который удаляет неуникальные значения.
С удалением дублей:
SELECT `имя_столбцов_таблицы_для_вывода`
FROM `имя_таблицы_1` WHERE условие
UNION
SELECT `имя_столбцов_таблицы_для_вывода`
FROM `имя_таблицы_2` WHERE условие;
Без удаления дублей:
SELECT имя_столбцов_таблицы_для_вывода
FROM имя_таблицы_1 WHERE условие
UNION ALL
SELECT имя_столбцов_таблицы_для_вывода
FROM имя_таблицы_2 WHERE условие
Количество столбцов должны совпадать во всех объединяемых наборах. Типы данных для объединяемых столбцов должны совпадать или хотя бы иметь возможность неявно преобразовываться друг к другу.
Например, пусть в базе данных будут две отдельные таблицы для клиентов банка (таблица Customers
) и для
сотрудников банка (таблица Employees
), создаем таблицу:
CREATE TABLE Customers
(
Id INT AUTO_INCREMENT PRIMARY KEY,
FirstName VARCHAR(20) NOT NULL,
LastName VARCHAR(20) NOT NULL,
AccountSum DECIMAL
);
CREATE TABLE Employees
(
Id INT AUTO_INCREMENT PRIMARY KEY,
FirstName VARCHAR(20) NOT NULL,
LastName VARCHAR(20) NOT NULL
);
Наполняем соданную таблицу:
INSERT INTO Customers(FirstName, LastName, AccountSum)
VALUES
('Tom', 'Smith', 2000),
('Sam', 'Brown', 3000),
('Mark', 'Adams', 2500),
('Paul', 'Ins', 4200),
('John', 'Smith', 2800),
('Tim', 'Cook', 2800);
INSERT INTO Employees(FirstName, LastName)
VALUES
('Homer', 'Simpson'),
('Tom', 'Smith'),
('Mark', 'Adams'),
('Nick', 'Svensson')
Здесь мы можем заметить, что обе таблицы, несмотря на наличие различных данных, могут характеризоваться двумя общими
атрибутами - именем (FirstName
) и фамилией (LastName
). Выберем сразу всех клиентов банка и
его сотрудников из обеих таблиц:
SELECT FirstName, LastName
FROM Customers
UNION SELECT FirstName, LastName FROM Employees
Здесь из первой таблицы выбираются два значения - имя и фамилия клиента. Из второй таблицы Employees
также выбираются два значения - имя и фамилия сотрудников. То есть при объединении количество выбираемых столбцов и
их тип совпадают для обеих выборок.
При этом названия столбцов объединенной выборки будут совпадать с названия столбцов первой выборки. И если мы захотим
при этом еще произвести сортировку, то в выражениях ORDER BY
необходимо ориентироваться именно на
названия столбцов первой выборки:
SELECT FirstName AS FName, LastName
FROM Customers
UNION SELECT FirstName, LastName
FROM Employees
ORDER BY FName DESC
В данном случае каждая выборка имеет по столбцу FName
из первой выборки. Тем не менее при сортировке
будет учитываться и значение столбца FirstName
из второй выборки.
Если же в одной выборке больше столбцов, чем в другой, то они не смогут быть объединены. Например, в следующем случае объединение завершится с ошибкой:
SELECT FirstName, LastName, AccountSum
FROM Customers
UNION SELECT FirstName, LastName
FROM Employees
Если оба объединяемых набора содержат в строках идентичные значения, то при объединении повторяющиеся строки
удаляются. Например, в случае с таблицами Customers
и Employees
сотрудники банка могут
быть одновременно его клиентами и содержаться в обеих таблицах. При объединении в примерах выше всех дублирующиеся
строки удалялись. Если же необходимо при объединении сохранить все, в том числе повторяющиеся строки, то для этого
необходимо использовать оператор ALL
:
SELECT FirstName, LastName
FROM Customers
UNION ALL SELECT FirstName, LastName
FROM Employees
ORDER BY FirstName
Объединять выборки можно и из одной и той же таблицы. Например, в зависимости от суммы на счете клиента нам надо начислять ему определенные проценты:
SELECT FirstName, LastName, AccountSum + AccountSum * 0.1 AS TotalSum
FROM Customers WHERE AccountSum < 3000
UNION SELECT FirstName, LastName, AccountSum + AccountSum * 0.3 AS TotalSum
FROM Customers WHERE AccountSum >= 3000
В данном случае если сумма меньше 3000, то начисляются проценты в размере 10% от суммы на счете. Если на счете больше 3000, то проценты увеличиваются до 30%.