UNION, INTERSECT, EXEPT значительно упрощают работу с таблицами в реляционных DBMS когда результат должен включать элементы из более, чем одной из них. INTERSECT и EXEPT применяются в некоторых других системах управления базами данных, поэтому из трех указанных можно говорить только о UNION MySQL.
Оператор UNION MySQL, операторы INTERSECT и EXEPT
INTERSECT и EXEPT MySQL не поддерживается в принципе и все запросы, для которых их можно бы было использовать приходится замещать запросами с JOIN .
UNION применяется часто, поэтому рассмотрим его.
UNION оператор объединяет два SELECT-а и выводит общий результат.
SELECT city as cityall from PEOPLE union SELECT city as cityall from REAL_ESTATE;
+——————+
| cityall |
+——————+
| Yekaterinburg |
| Novosibirsk |
| Krasnodar |
| Elabuga |
| Sankt-Peterburg |
| Moskow |
| Moscow |
| Tver |
| Kemerovo |
| Nizniy Tagil |
| Sochi |
+——————+
11 rows in set (0.00 sec)
Также использованы алиасы для двух колонок в разных таблицах.
UNION MySQL по умолчанию устраняет все дубли, если дубли нужны следует использовать UNION ALL
Для того же запроса с UNION ALL получим уже 21 результат вместо 11.
SELECT city as cityall from PEOPLE union all SELECT city as cityall from REAL_ESTATE;
+——————+
| cityall |
+——————+
| Yekaterinburg |
| Novosibirsk |
| Krasnodar |
| Elabuga |
| Sankt-Peterburg |
| Moskow |
| Moskow |
| Moskow |
| Yekaterinburg |
| Moscow |
| Tver |
| Novosibirsk |
| Kemerovo |
| Moscow |
| Yekaterinburg |
| Nizniy Tagil |
| Sochi |
| Sankt-Peterburg |
| Moscow |
| Novosibirsk |
| Krasnodar |
+——————+
21 rows in set (0.00 sec)
INTERSECT MySQL, как уже, упоминалось Выше не поддерживается.
Запросы с их использованием могли бы выглядеть так:
SELECT city from PEOPLE where profession='ElectriacalEngineer' intersect SELECT city from REAL_ESTATE where type='Appartment';
SELECT city from PEOPLE where profession='ElectriacalEngineer' intersect EXEPT city from REAL_ESTATE where type='Appartment';
MySQL при попытке их выполнения будет выдавать ошибки, сообщающие о неверном синтаксисе.