Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SQL UNION Доклад.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
271.74 Кб
Скачать

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]