Оператор UNION позволяет объединить две однотипных выборки. Эти выборки могут быть из разных таблиц или из одной и той же таблицы. Формальный синтаксис объединения:
SELECT_выражение1 UNION [ALL] SELECT_выражение2 [UNION [ALL] SELECT_выражениеN]
Например, пусть в базе данных будут две отдельные таблицы для клиентов банка (таблица clients) и для сотрудников банка (таблица employees):
DROP TABLE IF EXISTS clients; DROP TABLE IF EXISTS employees; CREATE TABLE clients ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, account_sum INTEGER NOT NULL ); CREATE TABLE employees ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER ); INSERT INTO clients(name, age, account_sum) VALUES ('Tom', 37, 4000), ('Sam', 25, 3000), ('Mark', 29, 3500), ('Bob', 41, 2500), ('Adam', 28, 2900), ('Tim', 34, 4100); INSERT INTO employees(name, age) VALUES ('Tom', 37), ('Nick', 25), ('Mark', 29), ('Bob', 41), ('Alice', 31);
Здесь мы можем заметить, что обе таблицы, несмотря на наличие различных данных, могут характеризоваться двумя общими атрибутами - именем (name) и возрастом (age). Выберем сразу всех клиентов банка и его сотрудников из обеих таблиц:
SELECT name, age FROM clients UNION SELECT name, age FROM employees;
Здесь из первой таблицы выбираются два значения - имя и возраст клиента. Из второй таблицы employees также выбираются два значения - имя и возраст сотрудников. То есть при объединении количество выбираемых столбцов и их тип совпадают для обеих выборок.
При этом названия столбцов объединенной выборки будут совпадать с названия столбцов первой выборки. Если же в одной выборке больше столбцов, чем в другой, то они не смогут быть объединены. Например, в следующем случае объединение завершится с ошибкой:
SELECT name, age , account_sum FROM clients UNION SELECT name, age FROM employees;
Если оба объединяемых набора содержат в строках идентичные значения, то при объединении повторяющиеся строки по умолчанию удаляются. Например, в случае с таблицами clients и employees сотрудники банка могут быть одновременно его клиентами и содержаться в обеих таблицах. Если же необходимо при объединении сохранить все, в том числе повторяющиеся строки, то для этого необходимо использовать оператор ALL:
SELECT name, age FROM clients UNION ALL SELECT name, age FROM employees;
Объединять выборки можно и из одной и той же таблицы. Например, в зависимости от суммы на счете клиента нам надо начислять ему определенные проценты:
SELECT name, age, account_sum + account_sum * 0.1 AS total_sum FROM clients WHERE account_sum < 3000 UNION SELECT name, age, account_sum + account_sum * 0.3 AS total_sum FROM clients WHERE account_sum >= 3000;
В данном случае если сумма меньше 3000, то начисляются проценты в размере 10% от суммы на счете. Если на счете больше 3000, то проценты увеличиваются до 30%.