Использование квантора существования в запросах
Квантор существования является понятием, заимствованным из формальной логики. Его смысл заключается в следующем: при задании квантора существования говорят о том, что существует некоторая переменная. В языке SQL квантор существования заменяется оператором EXISTS (существует).
Пусть символ «X» обозначает некоторую произвольную переменную. Тогда в формальной логике оператор с примененным квантором существования EXISTS X (предикат, зависящий от X) принимает значение «истина» тогда и только тогда, когда «предикат, зависящий от X» имеет значение «истина» при каком-либо значении переменной X. Если переменная X может быть любым целым числом, принадлежащим интервалу от 1 до 10, то предикат: EXISTS X (X < 5)принимает значение «истина», тогда как предикат EXISTS X(X < 0)принимает значение «ложь».
В языке SQL предикат с квантором существования представлен может быть представлен выражением вида:
EXISTS (SELECT * FROM …)
Выражение считается истинным только тогда, когда результат вычисления подзапроса, представленного с помощью SELECT * FROM ..., является непустым множеством. Выражение истинно тогда и только тогда, когда существует какая-либо запись в таблице, указанной во фразе FROM подзапроса, которая удовлетворяет условию WHERE этого подзапроса.
Пример SQL- запроса с квантором существования для выбора фамилий покупателей, которым продан компьютер «Pentium»:
SELECT NAME FROM tab10
WHERE EXISTS (SELECT * FROM tab11
WHERE tab10.kod= tab11.kod and.STOCK = “Pentium”)
Фактически любой запрос, который может быть выражен с использованием оператора IN, альтернативным образом может быть сформулирован с помощью EXISTS.
Можно сконструировать отрицание существования, используя NOT EXISTS. С помощью SQL-запроса
SELECT NAME FROM tab10
WHERE NOT EXISTS (SELECT * FROM tab11
WHERE tab10.kod= tab11.kod and.STOCK = “Pentium”)
можно получить информацию о покупателях, которые не купили «Pentium».
Заключенный в скобки подзапрос, входящий в конструкцию EXISTS не обязательно использует конструкцию SELECT * ... . В конструкции SELECT можно также указать имя поля, т.е. использовать предложение вида: SELECT имя_поля FROM .... Операторы EXISTS и NOT EXISTS всегда помещаются перед подзапросом.
Объединение множеств
Объединением двух множеств называется множество всех элементов, принадлежащих какому-либо одному или обоим множествам. Поскольку отношение является множеством записей, то можно построить объединение двух отношений. Результатом будет отношение, состоящее из всех строк, входящих в какое-либо одно или в оба сразу отношения. Однако строки этих двух отношений должны быть совместимы по объединению.
В языке SQL две таблицы совместимы по объединению и к ним может быть применен оператор объединения UNION тогда и только тогда, когда:
1) они имеют одинаковое число полей, например m;
2) для всех i ( ) i-е поле первой таблицы и i-е поле второй таблицы имеют в точности одинаковый тип данных.
В SQL-92 реализованы некоторые операции реляционной алгебры в явном виде с помощью операторов: UNION, Intersect, EXCEPT, JOIN.
По отношению к таблицам операторы объединения (UNION), пересечения (Intersect) и разности (EXCEPT) можно применять только в случае объединительной совместимости.
Пример 4. SQL-запрос
SELECT kod FROM tab12 WHERE UNITPRICE>1000
UNION
SELECT kod FROM tab13 WHERE CUSTOMERNO=23
предназначен для выбора кодов товаров, которые имеют стоимость более 1000, либо приобретаются покупателем с кодом 23 (либо и то, и другое).
Использование оператора UNION исключает из результатов выборки повторяющиеся значения. Если это не устраивает пользователя, то вместо оператора UNION используют UNION ALL.Тогда повторы не будут исключены из выборки.
Оператором UNION можно соединить любое количество конструкций SELECT.
Пример 5. С помощью SQL-запроса
SELECT kod FROM tab12 WHERE UNITPRICE>1000
UNION
SELECT kod FROM tab13 WHERE CUSTOMERNO=23
UNION
SELECT kod FROM tab12 WHERE UNITPRICE< 500
пользователь может получить информацию о кодах товаров, которые имеют стоимость более 1000, либо приобретены покупателем с кодом 23, либо имеют цену менее 500.
Если к запросу, приведенному в примере 1, добавить строку OR UNITPRICE < 500, то его результирующая таблица будет аналогична результирующей таблице, соответствующей запросу 2.
Оператор ORDER BY в запрос с использованием оператора UNION может входить только в последнее предложение SELECT. При использовании критерия упорядочивания используются номера полей результирующей таблицы. Пример с включением константы в результирующую таблицу:
SELECT kod,”Стоимость товара >1000$” FROM tab12
WHERE UNITPRICE>1000
UNION