Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
work_2.doc
Скачиваний:
12
Добавлен:
09.11.2019
Размер:
292 Кб
Скачать
☆

Подзапросы c any и all

ANY и ALL отличаются от EXISTS тем, что используются совместно с реляционными операторами. В этом отношении они подобны оператору IN, однако, в отличие от IN, они могут использоваться только с подзапросами.

Оператор ANY приводит к тому, что текущая строка внешнего запроса включается в результат, если любое (ANY) из значений, выведенных подзапросом, совпадает со значением в текущей строке внешнего запроса. Следующий запрос

SELECT *

FROM ”Заказчики”

WHERE “Код_заказчика” = ANY (SELECT “Код_заказчика” FROM “Заказы”)

равнозначен запросу

SELECT *

FROM Заказчики

WHERE Код_заказчика IN (SELECT Код_заказчика FROM Заказы);

Отличие заключается в том, что оператор ANY может использовать другие операторы сравнения, а не только оператор «=» как в случае IN. Например, если в предыдущем запросе в предложении WHERE заменить оператор «=» на оператор «<=», то получим информацию о заказчике с минимальным значением в поле Код_заказчика, поскольку это – единственное значение, для которого условие основного запроса выполняется.

Оператор ALL аналогичен оператору ANY по взаимодействию с внешним запросом, но для того, чтобы текущее значение во внешнем запросе было выбрано, оно должно удовлетворять условию в предикате внешнего запроса для каждого значения, выбранного подзапросом.

В SQL сказать, что значение больше( или меньше ), чем любое(ANY) из набора значений,  тоже самое что сказать, что оно больше( или меньше ) чем любое одно отдельное из этих значений. И наоборот, сказать, что значение не равно всему (ALL) набору значений, равносильно тому, что нет такого значения в наборе которому оно было бы равно.

Любой запрос, который может быть сформулирован с ANY или с ALL, может быть также сформулирован с EXISTS, хотя обратное в общем случае неверно. Строго говоря, вариант с EXISTS не абсолютно идентичен вариантам с ANY или с ALL из-за различия в том, как обрабатываются NULL-значения. Всякий раз, когда допустимый подзапрос возвращает пустое множество, предикат с ALL автоматически верен, а с ANY – автоматически неверен.

Использование with

Конструкция WITH позволяет оформить результаты подзапроса в виде временной таблицы, которая создается на время выполнения запроса. Т.о., WITH может использоваться для структурирования сложных запросов с многоуровневой иерархией подзапросов. Синтаксис конструкции WITH достаточно прост:

WITH идентификатор AS (запрос)

Например,

WITH subquery_ as (

SELECT "Название", "Цена"

FROM "Книги"

WHERE "Издательство" = 'BHV')

SELECT *

FROM _subquery_

WHERE "Цена" >= ANY(SELECT "Цена" FROM _subquery_ )

Объединение двух или более запросов

Предложение UNION позволяет объединить результаты выполнения нескольких запросов к разным таблицам в одном подмножестве данных, реализуя один запрос. Синтаксис UNION имеет вид:

запрос_1 UNION запрос_1

Непременное требование – одинаковые количество и типы полей в объединяемых предложением UNION запросах, хотя второе требование можно обойти, если использовать преобразование типов в запросах. Например:

SELECT ”Имя”, “Адрес”

FROM “Заказчики”

UNION

SELECT “Название”, “Адрес”

FROM “Поставщики”

Следует иметь в виду, что:

  • Избыточные дубликаты всегда исключаются из результата UNION.

  • Предложением с UNION можно объединить любое число таблиц (проекций таблиц).

  • Весь запрос может использовать только одно предложение ORDER BY. Оно применяется ко всему результату и должно находится после последней инструкции SELECT.

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