Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Подготовка к ПР_2.1.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
1.4 Mб
Скачать

Предикаты для вложенных запросов

В выражении where, кроме перечисленных предикатов, могут также использоваться выражения с оператором select. Любое выражение, начинающееся с оператора select, является запро­сом к базе данных. Если в выражении встречается еще хотя бы один оператор select, то он задает запрос, вложенный в первый. Вложенные запросы также называют подзапросами.

Вложенный запрос является обычным запросом, таким же, как и рассмотренные ранее. Он возвращает таблицу (набор записей), которая, так или иначе, используется для формирования ответа на основной запрос. Так, например, подзапрос используется, ко­гда для выборки данных в одной таблице необходимо выполнить проверки по другой таблице. Для этой цели подходят перечис­ленные далее специальные предикаты.

ALL, SOME, ANY

Предикаты all (все), some (некоторый), any (любой) в действи­тельности представляют собой кванторы, известные в математической логике как кванторы всеобщности и существования. all — квантор всеобщности, a some и any, являющиеся синони­мами в SQL, — кванторы существования.

Применение ключевого слова all следует понимать как "для всех" или "для каждого". Ключевые слова some и any следует по­нимать как "хотя бы какой-нибудь один".

EXISTS

Обработка данных часто состоит из нескольких этапов. Так, сначала производится некоторая выборка данных, а затем выполняются какие-то манипуляции с ней. Однако, выполняя запрос на выборку, мы далеко не всегда можем быть уверенными, что ответ содержит хотя бы одну непустую строку. Если ответ на запрос пуст, то бес­смысленно производить дальнейшую обработку данных. Таким об­разом, полезно знать, содержит ли ответ на запрос какие-либо дан­ные. Для этого предназначен предикат exists (существует). Он становится истинным только тогда, кода результатная таблица, по­лученная в ответ на запрос, содержит хотя бы одну запись.

UNIQUE

Предикат unique (уникальный) имеет такой же смысл, как и exists, но при этом для его истинности требуется, чтобы все записи в результатной таблице не только существовали, но и бы­ли уникальны (т. е. не повторялись).

DISTINCT

Предикат distinct (отличающийся, особый) почти такой же, как и unique. Отличие этих предикатов обнаруживается примени­тельно к значениям null. Так, если в результатной таблице все записи уникальны (предикат unique истинен), то и предикат distinct тоже истинен (т. е. если все записи уникальны, то они и отличающиеся). С другой стороны, если в результатной таблице имеются хотя бы две неопределенные записи, то предикат distinct ложен, хотя предикат unique истинен.

OVERLAPS

Предикат overlaps (перекрывает) используется для определения, перекрываются ли два интервала времени. Интервал времени можно задать двумя способами: в виде начального и конечного моментов или в виде начального момента и длительности. Далее приведены примеры задания интервала времени:

(TIME '12:25:30', TIME '14:30:00') - интервал, заданный начальным и конечным моментами;

(TIME '12:45:00', INTERVAL '2' HOUR)- интервал, заданный начальным моментом и длительностью в часах.

Выражение с предикатом overlaps можно записать, например, так:

(TIME '12:25:30', TIME '14:30:00') OVERLAPS (TIME '12:45:00', INTERVAL '2' HOUR)

Поскольку временные интервалы в данном примере пересекают­ся, то предикат overlaps возвращает значение true.

MATCH

Предикат match применяется для проверки сохранения ссылоч­ной целостности при модификации данных, т. е. при добавлении, изменении и удалении записей.

SIMILAR

Предикат similar (подобный) применяется для проверки частич­ного соответствия символьных строк. Эту же задачу можно решить и с помощью предиката like, однако в ряде случаев similar более эффективен.

Предположим, что в некоторой таблице имеется столбец ОС, со­держащий названия операционных систем. Нужно выбрать записи, соответствующие Windows NT, Windows XP и Windows 98. Тогда в выражении запроса можно использовать такой оператор where:

WHERE ОС SIMILAR TO '(Windows (NT|XP|98))';

Предикат впервые появился в SQL: 1999.