Operatorul UNION
Operatorul UNION permite să unești două selecții de același tip. Aceste selecții pot proveni din tabele diferite sau din aceeași tabelă. Sintaxa formală a uniunii este:
SELECT_expresie1
UNION [ALL] SELECT_expresie2
[UNION [ALL] SELECT_expresieN]
De exemplu, să presupunem că în baza de date există două tabele separate pentru clienții băncii (tabela Customers) și pentru angajații băncii (tabela 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');
Aici putem observa că ambele tabele, în ciuda datelor diferite, pot fi caracterizate prin două atribute comune - nume (FirstName) și prenume (LastName). Vom selecta imediat toți clienții băncii și angajații săi din ambele tabele:
SELECT FirstName, LastName
FROM Customers
UNION SELECT FirstName, LastName FROM Employees;
Aici, din prima tabelă sunt selectate două valori - numele și prenumele clientului. Din a doua tabelă, Employees, sunt de asemenea selectate două valori - numele și prenumele angajaților. Deci, la unirea acestora, numărul de coloane selectate și tipurile acestora coincid pentru ambele selecții.

În acest caz, numele coloanelor din selecția combinată vor coincide cu numele coloanelor din prima selecție. Dacă dorim să efectuăm și sortarea, expresiile ORDER BY trebuie să se orienteze către numele coloanelor din prima selecție:
SELECT FirstName AS FName, LastName
FROM Customers
UNION SELECT FirstName, LastName
FROM Employees
ORDER BY FName DESC;
Fiecare selecție are o coloană numită FName din prima selecție. Cu toate acestea, în timpul sortării, va fi luat în considerare și valoarea coloanei FirstName din a doua selecție:

Dacă una dintre selecții are mai multe coloane decât cealaltă, ele nu pot fi unite. De exemplu, în următorul caz, unirea va eșua cu o eroare:
SELECT FirstName, LastName, AccountSum
FROM Customers
UNION SELECT FirstName, LastName
FROM Employees;
Dacă ambele seturi de date care urmează să fie unite conțin valori identice în rânduri, atunci la unire, rândurile duplicate vor fi eliminate. De exemplu, în cazul tabelelor Customers și Employees, angajații băncii pot fi simultan clienți și pot apărea în ambele tabele.
În exemplele anterioare, la unirea acestora, toate rândurile duplicate au fost eliminate. Dacă este necesar să se păstreze toate rândurile, inclusiv cele duplicate, la unire, trebuie să utilizați operatorul ALL:
SELECT FirstName, LastName
FROM Customers
UNION ALL SELECT FirstName, LastName
FROM Employees
ORDER BY FirstName;

Se pot uni selecții chiar și din aceeași tabelă. De exemplu, în funcție de suma din contul unui client, poate fi necesar să i se calculeze anumite procente:
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;
În acest caz, dacă suma este mai mică de 3000, se vor aplica procente în valoare de 10% din suma din cont. Dacă suma este mai mare de 3000, procentele se vor majora la 30%.
