UNION

Поділитись

Оператор UNION позволяет обединить две однотипных выборки. Эти выборки могут быть из разных таблиц или из одной и той же таблицы. Формальный синтаксис объединения:

1
2
3
SELECT_выражение1UNION [ALL]
SELECT_выражение2[UNION [ALL]
SELECT_выражениеN]

Например, пусть в базе данных будут две отдельные таблицы для клиентов банка (таблица Customers) и для сотрудников банка (таблица Employees):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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). Выберем сразу всех клиентов банка и его сотрудников из обеих таблиц:

1
2
3
SELECT FirstName, LastName
FROM CustomersUNION
SELECT FirstName, LastName FROM Employees;

Здесь из первой таблицы выбираются два значения – имя и фамилия клиента. Из второй таблицы Employees также выбираются два значения – имя и фамилия сотрудников. То есть при объединении количество выбираемых столбцов и их тип совпадают для обеих выборок.

UNION в MySQL

При этом названия столбцов объединенной выборки будут совпадать с названия столбцов первой выборки. И если мы захотим при этом еще произвести сортировку, то в выражениях ORDER BY необходимо ориентироваться именно на названия столбцов первой выборки:

1
2
3
4
5
SELECT FirstName AS FName, LastName
FROM CustomersUNION
SELECT FirstName, LastName
FROM Employees
ORDER BY FName DESC;

В данном случае каждая выборка имеет по столбцу FName из первой выборки. Тем не менее при сортировке будет учитываться и значение столбца FirstName из второй выборки:

Сортировка в UNION в MySQL

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

1
2
3
4
SELECT FirstName, LastName, AccountSum
FROM CustomersUNION
SELECT FirstName, LastName
FROM Employees;

Если оба объединяемых набора содержат в строках идентичные значения, то при объединении повторяющиеся строки удаляются. Например, в случае с таблицами Customers и Employees сотрудники банка могут быть одновременно его клиентами и содержаться в обеих таблицах. При объединении в примерах выше всех дублирующиеся строки удалялись. Если же необходимо при объединении сохранить все, в том числе повторяющиеся строки, то для этого необходимо использовать оператор ALL:

1
2
3
4
5
SELECT FirstName, LastName
FROM CustomersUNION ALL
SELECT FirstName, LastName
FROM Employees
ORDER BY FirstName;
Обединение повторяющихся строк в MySQL

Объединять выборки можно и из одной и той же таблицы. Например, в зависимости от суммы на счете клиента нам надо начислять ему определенные проценты:

1
2
3
4
SELECT FirstName, LastName, AccountSum + AccountSum * 0.1 AS TotalSum FROM Customers
WHERE AccountSum < 3000UNION
SELECT FirstName, LastName, AccountSum + AccountSum * 0.3 AS TotalSum FROM Customers
WHERE AccountSum >= 3000;

В данном случае если сумма меньше 3000, то начисляются проценты в размере 10% от суммы на счете. Если на счете больше 3000, то проценты увеличиваются до 30%.

Объединение выборок из той же таблицы в MySQL

Поділитись