Предикаты – условия на запись, - используемые в опции where (как в командах модификации, так и в самой команде select), в свою очередь могут содержать ссылку на выборку. К таким предикатам относятся:
1) r c all (команда select), где r – выражение над записью, c – знак сравнения.
Предикат истинен, если сравнение выполняется для значения выражения r и всех значений, выбранных командой select. При этом предполагается, что select выдаёт некий список значений list, то есть, формально, таблицу с единственным полем, совместимым по типу с типом выражения r.
» " lÎlist (r c l)
Если выборка пуста, значение предиката true.
2) r c [any½some] (команда select)
При тех же условиях на select эквивалентно предикату:
$ lÎlist (r c l)
3) r [not] in (команда select)
При тех же условиях на select: rÎlist.
4) [not] exists (команда select)
В данном случае на select не накладывается никаких ограничений. Предикат истинен, если выборка не пуста: $ r: rÎselect
Пример. Молодые покупатели_1.
select name, Id
fromCustomer
where birthday>(select avg(birthday) fromEmployee);
Молодые покупатели_2.
select name, Id
fromCustomer
where birthday>(select avg(birthday) fromCustomer);
Коллизии имён нет, по умолчанию каждое имя поля ссылается на таблицы из ближайшего from. Синтаксис SQL не запрещает именам полей внутренней выборки ссылаться на таблицы внешней выборки. Такие подзапросы называются соотнесёнными.
Молодые покупатели_3.
select name, Id
fromCustomer, Cust1
where birthday>(select avg( birthday) fromCustomer, Cust2
where Cust1.city=Cust2.city);
Синтаксически соотнесённые и не соотнесенные запросы выглядят схоже. Реализация кардинально различна. В случае не соотнесённого запроса выборка осуществляется последовательно: сначала вложенный запрос, затем внешний. В случае соотнесённого запроса внутренний select выполняется для каждой записи внешнего. Это вложенный цикл – с точки зрения реализации, а с точки зрения логики – декартово произведение.