- •1. Использование оператора union
- •2. Включение или выключение повторяющихся строк
- •3. Сортировка результатов комбинированных запросов
- •Объединение “по вертикали” или операция union
- •Синтаксис
- •Правила использования
- •Применение
- •Примеры Использование union при выборке из двух таблиц[править | править вики-текст]
- •Использование union all при выборке из двух таблиц[править | править вики-текст]
- •Использование union при выборке из одной таблицы[править | править вики-текст]
- •Использование union как внешнее объединение[править | править вики-текст]
- •Синтаксис
- •Аргументы
- •Примеры а.Использование простого union
- •Б.Использование select into с union
- •В.Использование union двух инструкций select с order by
- •Г.Использование union трех инструкций select для демонстрации эффекта от использования скобок и all
SQL- Комбинированные запросы (UNION)
В большинстве SQL-запросов используется один оператор, с помощью которого возвращаются данные из одной или нескольких таблиц. SQL также позволяет выполнять одновременно несколько отдельных запросов и отображать результат в виде единого набора данных. Такие комбинированные запросы обычно называют сочетаниями или сложными запросами.
1. Использование оператора union
Запросы в языке SQL комбинируются с помощью оператора UNION. Для этого необходимо указать каждый запрос SELECT и разместить между ними ключевое слово UNION. Ограничений по количеству использованного оператора UNION в одном общем запросе нет. В предыдущем разделе мы отмечали, что Access не имеет возможности создавать полное внешнее объединение, теперь мы посмотрим, как можно этого достичь через оператор UNION.
SELECT * FROM Sumproduct LEFT JOIN Sellers ON Sumproduct.City = Sellers.City UNION SELECT * FROM Sumproduct RIGHT JOIN Sellers ON Sumproduct.City = Sellers.City
Видим, что запрос отобразил как все колонки из первой таблицы - так и с другой, независимо от того, все ли записи имеют соответствия в другой таблице.
Также стоит отметить, что во многих случаях вместо UNION мы можем использовать предложение WHERE со многими условиями, и получать аналогичный результат. Однако из-за UNION записи выглядят более лаконичными и понятными. Также необходимо соблюдать определенные правила при написании комбинированных запросов:
запрос UNION должен включать два и более операторов SELECT, отделенных между собой ключевым словом UNION (т.е. если в запросе используется четыре оператора SELECT, то должно быть три ключевых слова UNION)
каждый запрос в операторе UNION должен иметь одни и те же столбцы, выражения или статистические функции, которые, к тому же, должны быть перечислены в одинаковом порядке
типы данных столбцов должны быть совместимыми. Они не обязательно должны быть одного типа, однако обязаны иметь подобный тип, чтобы СУБД могла их однозначно преобразовать (например, это могут быть различные числовые типы данных или различные типы даты).
2. Включение или выключение повторяющихся строк
Запрос с UNION автоматически удаляет все повторяющиеся строки из набора результатов запроса (то есть, ведет себя как предложения WHERE с несколькими условиями в одном операторе SELECT ). Такое поведение оператора UNION по умолчанию, но при желании мы можем изменить это. Для этого нам следует использовать оператор UNION ALL вместо UNION.
3. Сортировка результатов комбинированных запросов
Результаты выполнения оператора SELECT сортируются с помощью предложения ORDER BY. При комбинировании запросов с помощью UNION только одно предложение ORDER BY может быть использовано, и оно должно быть проставлено в последнем операторе SELECT. Действительно, на практике нет особого смысла часть результатов сортировать в одном порядке, а другую часть - в другом. Поэтому несколько предложенийORDER BY применять не разрешается.
Объединение “по вертикали” или операция union
На самом деле в английском языке слов JOIN больше соответствует русскому слову соединение, а слово объединение, в свою очередь, ближе к английскому UNION. Я надеюсь, что не смутил читателя тем, что на предыдущих этапах везде использовал слово “объединение”. Разница между операциями JOIN и UNION в SQL принципиальная. Лучше сказать, что обе эти операции ортогональны друг другу. Если JOIN всячески объединяла данные в ширину или “по горизонтали”: объединяла поля из разных таблиц (колонки из разных запросов) в один запрос, то UNION напротив: рост в ширину не приемлет и объединяет именно результаты различных запросов одинакового формата. Другими словами - объединяет данные “по вертикали”.
Пример простейшего объединения (псевдоним NAME здесь необязателен):
SELECT S_NAME AS NAME FROM D_STAFF UNION SELECT P_NAME AS NAME FROM D_PROFILE
Объединение
UNION в SQL запросе.
Естественно, что можно накладывать любые критерии отбора на объединяемые запросы:
SELECT S_NAME AS NAME FROM D_STAFF
WHERE S_NAME LIKE '%анд%'
UNION
SELECT P_NAME AS NAME FROM D_PROFILE
WHERE P_NAME LIKE 'фин%'
Объединение
UNION с дополнительными условиями.
Ну и, наконец, обещанный на предыдущем шаге эквивалент FULL JOIN. Запрос построен на основании того факты, что пустые значения в результатах запросов LEFT JOIN и RIGH JOIN можно идентифицировать сравнением вида IS NULL. Противоположное выражение будет выглядеть как IS NOT NULL. Из примера, думаю, все станет ясно.
SELECT D_STAFF.XD_IID, D_STAFF.S_NAME, D_STAFF.S_EXPERIENCE, D_STAFF_PROFILE.PROFILE_ID
FROM D_STAFF LEFT JOIN D_STAFF_PROFILE ON D_STAFF_PROFILE.STAFF_ID=D_STAFF.XD_IID
WHERE (D_STAFF_PROFILE.STAFF_ID IS NULL)
ORDER BY D_STAFF.S_EXPERIENCE DESC
UNION ALL
SELECT D_STAFF.XD_IID, D_STAFF.S_NAME, D_STAFF.S_EXPERIENCE, D_STAFF_PROFILE.PROFILE_ID
FROM D_STAFF RIGHT JOIN D_STAFF_PROFILE ON D_STAFF_PROFILE.STAFF_ID=D_STAFF.XD_IID
WHERE (D_STAFF.XD_IID IS NULL)
ORDER BY D_STAFF.S_EXPERIENCE DESC
UNION ALL
SELECT D_STAFF.XD_IID, D_STAFF.S_NAME, D_STAFF.S_EXPERIENCE, D_STAFF_PROFILE.PROFILE_ID
FROM D_STAFF INNER JOIN D_STAFF_PROFILE ON D_STAFF_PROFILE.STAFF_ID=D_STAFF.XD_IID
ORDER BY D_STAFF.S_EXPERIENCE DESC
Реализация
операции вычитания с помощью нескольких
объединений.
По умолчанию результат UNION содержит только уникальные строки. Ключевое слово ALL заставляет в отчет включать все, в том числе и повторяющиеся строки. Кстати, первые две части запроса соответствуют как раз результату операции MINUS:
LEFT JOIN MINUS INNER JOIN
и
RIGHT JOIN MINUS INNER JOIN.
В языке SQL ключевое слово UNION применяется для объединения результатов двух SQL-запросов в единую таблицу, состоящую из схожих строк. Оба запроса должны возвращать одинаковое число столбцов и совместимые типы данных в соответствующих столбцах. Данный оператор был описан уже в самом первом стандарте SQL — SQL/89.
