Visual fox pro

  • 09 апр. 2012 г.
  • 3702 Слова
Существуют два основных типа подзапросов:
 
Подзапросы, которым предшествует немодифицированная операция сравнения и которые возвращают единственное значение, называются подзапросами- выражениями (скалярными подзапросами).
Подзапросы, которые возвращают список значений и которым предшествует ключевое слово in (принадлежит) или операция сравнения, модифицированная кванторами any (некоторый)или all (все), а также подзапросы, проверяющие существование с помощью квантора exists (существует), называются квантифицированными предикатными подзапросами.
 
Подзапросы любого из этих типов могут быть либо коррелированными (повторяющимися), либо некоррелированными.
 
Некоррелированный подзапрос может вычисляться как независимый запрос. Иначе говоря, результаты подзапроса подставляются в основнойоператор (или внешний запрос). Это не значит, что SQL-сервер именно так выполняет операторы с подзапросами. Некорреляционные подзапросы могут быть заменены соединением и будут выполняться как соединения SQL-сервером.
 
3. Коррелированные подзапросы не могут выполняться как независимые запросы, поскольку они могут обращаться к данным, находящимся в столбцах таблицы, указанной всписке from внешнего запроса. Коррелированные подзапросы детально обсуждаются в конце этой главы.
4. Использование опции distinct в подзапросе-выражении
Подзапросы, которым предшествует немодифицированная операция сравнения, часто содержат ключевое слово distinct (различные), чтобы в результате получалась скалярная величина.
Например, следующий запрос без слова distinct был бы неправильным,потому что в результате получилась бы векторная величина:
 
select pub_name from publishers
where pub_id =
(select distinct pub_id
from titles
where pub_id = publishers.pub_id)
 
Ключевые слова all и any модифицируют операцию сравнения, которая формирует подзапрос.
Рассмотрим в качестве примера операцию > (больше):
5.•           >all означает больше чем любое значение или, что равносильно, больше максимальной величины. Например, >all (1,2,3) означает больше чем 3.
6. •           >any означает больше, по крайней мере, одного значения или, что равносильно, больше минимальной величины. Поэтому, >any (1,2,3) означает меньше 1.
Если подзапросу предшествует квантор all и подзапрос возвращает пустое множествострок, то весь запрос считается ошибочным.
Использование кванторов all и any требует внимательности, поскольку компьютер не допускает двусмысленности, которая свойственна этим словам в обычном языке. Например, можно задать вопрос: “По каким книгам выплачен аванс, больший чем по любой (any) книге, опубликованной издательством New Age Books?”.
Этот вопрос можно перефразировать в SQL в более точной форме:“По каким книгам выплачен аванс, больший чем максимальный аванс, выплаченный издательством New Age Books?”. В данном случае нужно использовать ключевое слово all (все), а не any:

select title
from titles
where advance > all
(select advance
from publishers, titleswhere titles.pub_id = publishers.pub_id
and pub_name = "New Age Books")
Для каждой книги внешний запрос выбирает название и аванс из таблицы titles и сравнивает его со всеми авансами, выплаченными издательством New Age Books, которые возвращаются подзапросом. Внешний запрос находит максимальное значение в этом списке и определяет, является ли аванс по даннойкниге большим этого максимального значения.
>all означает больше чем все значения
В контексе подзапроса квантор >all означает, что текущая строка будет удовлетворять условию, указанному во внешнем запросе, если значение в указанном столбце будет больше всех значений, которые возвращаются подзапросом.
Например, чтобы найти книги, которые стоят больше чем самая дорогая книга...
tracking img