MySQL UNION


Оператор UNION дозволяє об'єднати дві однотипних вибірки. Ці вибірки можуть бути з різних таблиць або з однієї і тієї ж таблиці. Формальний синтаксис об'єднання:

SELECT_вираз
UNION [ALL] SELECT_вираз2
[UNION [ALL] SELECT_виразN]

Наприклад, нехай в базі даних будуть дві окремі таблиці для клієнтів банку (таблиця 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%.


Наш партнер:
beta test mp3 playlist downloader