Напомним, что ANY и ALL следуют за одним из предикатов =, !=, >, <, <=, >= и проверяет, выполняется ли этот предикат хотя бы для одного (при ANY) или для всех (при ALL) значениях множества, заданного в правой части, по отношению к элементу, заданному в левой части.
Например, для получения списка кафедр, фонды которых больше хотя бы одной из кафедр факультета информатики, следует записать:
SELECT Name
FROM DEPARTMENT
WHERE Fund > ANY (SELECT DEPARTMENT.Fund
FROM FACULTY, DEPARTMENT
WHERE FACULTY.#F = DEPARTMENT.#F AND
FACULTY.Name = 'IT' )
Если же необходимо, чтобы фонды искомых кафедр были больше любой (то есть всех ) из кафедр факультета информатики, то это записывается следующим образом:
SELECT Name
FROM DEPARTMENT
WHERE Fund > ALL (SELECT DEPARTMENT.Fund
FROM FACULTY, DEPARTMENT
WHERE FACULTY.#F = DEPARTMENT.#F AND
FACULTY.Name = 'IT' )
EXISTS является одноместным предикатом, которые дает TRUE, если подзапрос, к которому он применяется, содержит хотя бы одну строку. Например, для получения списка преподавателей, которые читают хотя бы один курс лекций, следует записать:
SELECT Name
FROM TEACHER
WHERE EXISTS (SELECT *
FROM LECTURE
WHERE LECTURE.#T = TEACHER.#T )
Если же нас интересуют те преподаватели, которые не читают никаких лекций, то следует записать:
SELECT Name
FROM TEACHER
WHERE NOT EXISTS (SELECT *
FROM LECTURE
WHERE LECTURE.#T = TEACHER.#T )
Предикат IN проверяет вхождение элемента во множество. Левый операнд предиката должен быть спецификацией индивидного значения, например, константа или имя поля, а правая – спецификация множества, например, константа-множество или select-запрос. Константа-множество специфицируется списком элементов множества, заключенных в фигурные скобки, например, {'Иванов', 'Петров', 'Игнатов'}. Обратим внимание, что выражение типа x IN {'Иванов', 'Петров', 'Игнатов'} эквивалентно следующему: x = 'Иванов' OR x = 'Петров' OR x = 'Игнатов'.
К предикату IN можно использовать отрицание, тогда он принимает вид NOT IN.
Рассмотрим ряд примеров. Выдать названия факультетов, расположенных в корпусах 1, 3, 5, 11:
SELECT Name
FROM FACULTY
WHERE Building IN {1, 3, 5, 11}.
Выдать названия факультетов, расположенных в тех же корпусах, что и факультеты информатики и экономики:
SELECT Name
FROM FACULTY
WHERE Building IN (SELECT Building
FROM FACULTY
WHERE Name = 'Информатика' OR Name = 'Экономика')
Выдать факультеты, расположенные в корпусах, отличающихся от тех, в которых расположены факультеты информатики и экономики: