Справка по SQL | страница 16



значения, полученного из подзапроса, являются TRUE, истинностное значение равно TRUE.

* Если результат выполнения подзапроса не содержит строк и определен параметр ALL, результат равен TRUE. Если же определен параметр SOME, результат равен FALSE.

* Если определен параметр ALL и результат сравнения значения выражения хотя бы с одним значением, полученным из подзапроса, является FALSE, истинностное значение равно FALSE.

* Если определен параметр SOME и хотя бы один результат сравнения значения выражения и значения, полученного из подзапроса, является TRUE, истинностное значение равно TRUE.

* Если определен параметр SOME и каждое сравнение значения выражения и значений, полученных из подзапроса, равно FALSE, истинностное значение тоже равно FALSE.

* В любом другом случае результат будет равен UNKNOWN.

Еще о подзапросах


Заметим, что в общем случае запрос возвращает множество значений. Поэтому использование подзапроса в предложении WHERE без операторов EXISTS, IN, ALL и ANY, которые дают булево значение, может привести к ошибке времени выполнения запроса.

Пример. Найти модели и цены ПК, стоимость которых превышает минимальную стоимость ПК-блокнотов:


>SELECT DISTINCT model, price

>FROM PC

>WHERE price

> (SELECT MIN(price)

> FROM Laptop);


Этот запрос вполне корректен, т.к. скалярное значение price сравнивается с подзапросом, который возвращает единственное значение. В результате получим три модели ПК:


model

price

1121

850.0

1233

950.0

1233

980.0


Однако, если в ответ на вопрос "найти модели и цены ПК, стоимость которых совпадает со стоимостью ПК-блокнота" написать следующий запрос:


>SELECT DISTINCT model, price

>FROM PC

>WHERE price =

> (SELECT price

> FROM Laptop);


то при выполнении последнего мы можем получить такое сообщение об ошибке:



Эта ошибка будет возникать при сравнении скалярного значения с подзапросом, который либо возвращает более одного значения, либо ни одного.

Подзапросы, в свою очередь, также могут содержать вложенные запросы.

С другой стороны, подзапрос, возвращающий множество строк и содержащий несколько столбцов, вполне естественно может использоваться в предложении FROM. Это позволяет ограничить набор столбцов и/или строк при выполнении операции соединения таблиц.

Пример. Вывести производителя, тип, модель и частоту процессора для ПК-блокнотов, частота процессора которых превышает 600 МГц.

Этот запрос может быть сформулирован, например, следующим образом:


>SELECT prod.maker, lap.*

>FROM (SELECT 'Laptop' AS type, model, speed