Операции над множествами: UNION, INTERSECT и EXCEPT
Складывайте, пересекайте и вычитайте целые наборы результатов - не столбцы, а строки целиком
Главная идея: Операция над множествами берёт строки, полученные двумя запросами
SELECT, и объединяет их по вертикали. JOIN склеивает таблицы бок о бок, делая строки шире; операция над множествами ставит наборы результатов друг под друга, образуя один более длинный список. UNION объединяет их, INTERSECT оставляет только строки, присутствующие в обоих наборах, а EXCEPT оставляет строки первого набора, которых нет во втором.
К концу урока вы сможете:
- объединять два набора результатов с помощью
UNIONи понимать, когда вместо него нуженUNION ALL, - находить строки, общие для двух запросов, с помощью
INTERSECT, - вычитать один набор результатов из другого с помощью
EXCEPT, - соблюдать правила совместимости столбцов, которых требует любая операция над множествами,
- воспроизводить
INTERSECTиEXCEPTна старых версиях MySQL, где их нет (до 8.0.31).
1. Наша учебная база данных
Каждый запрос ниже работает с двумя небольшими таблицами. Компания ведёт список своих сотрудников (employees) и отдельно список клиентов (customers). В обеих записях хранятся имя человека и его город.
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
name VARCHAR(50),
city VARCHAR(50)
);
CREATE TABLE customers (
cust_id INT PRIMARY KEY,
name VARCHAR(50),
city VARCHAR(50)
);
INSERT INTO employees (emp_id, name, city) VALUES
(1, 'Alice', 'London'),
(2, 'Bob', 'Paris'),
(3, 'Carol', 'London'),
(4, 'David', 'Berlin');
INSERT INTO customers (cust_id, name, city) VALUES
(101, 'Emma', 'Paris'),
(102, 'Frank', 'London'),
(103, 'Grace', 'Paris'),
(104, 'Alice', 'Madrid');
Держите эти восемь строк в голове. Обратите внимание на города: сотрудники живут в Лондоне, Париже и Берлине; клиенты - в Париже, Лондоне и Мадриде. Именно эти совпадения и различия и позволяют описывать операции над множествами.