пятница, 11 января 2019 г.

SQL UNION

Объединением двух множеств называется множество всех элементов, принадлежащих какому-либо одному или обоим исходным множествам. Результатом объединения будет множество, состоящее из всех строк, входящих в какое-либо одно или в оба первоначальных отношения. Однако, если этот результат сам по себе должен быть другим отношением, а не просто разнородной смесью строк, то два исходных отношения должны быть совместимыми по объединению, т. е. строки в обоих отношениях должны быть одной и той же формы. Что касается SQL, то две таблицы совместимы по объединению (и к ним может быть применен оператор объединения UNION) тогда и только тогда, когда:
  • Они имеют одинаковое число полей (например, m);
  • Для всех i (i = 1, 2, …, m) i-е поле первой таблицы и i-е поле второй таблицы имеют в точности одинаковый тип данных.
1. В качестве примера выберем коды товаров, которые имеют стоимость, превышающую 1000, либо покупаются покупателем с кодом 23 (либо то и другое):
SELECT stock FROM goods WHERE unitprice > 1000 UNION SELECT stock FROM ordsale WHERE customerno = 23;
Из результата выборки, использующей оператор UNION, всегда исключаются избыточные дубликаты. Поэтому, хотя в рассматриваемом примере товар выбирается обеими из двух составляющих предложений SELECT, в результирующей таблице каждый товар присутствует только один раз.
Оператором UNION можно соединить любое число конструкций SELECT.
Оператор ORDER BY в запросе с использованием оператора UNION может входить только в последнее предложение SELECT. При указании критерия упорядочивания используйте номера полей результирующей таблицы.
При использовании оператора UNION часто оказывается полезным включение константы в результирующую таблицу.
2. Например, текстовую константу можно использовать в качестве пояснения условия выборки товаров:
SELECT stock, ‘Стоимость товара> 1000’ FROM goods WHERE unitprice > 1000 UNION SELECT stock, ‘Товар куплен покупателем 23’ FROM ordsale WHERE customerno = 23 ORDER BY 2,1;
UNION ALL.
Оператор UNION ALL позволяет, в отличие от UNION, разрешить выборку повторяющихся значений.
SELECT name FROM employees_Rus UNION ALL SELECT name FROM employees_Usa;