Справка по SQL - страница 10

Шрифт
Интервал

стр.

столбца - имени производителя. Чтобы один производитель не выводился несколько раз (что может случиться, если он производит несколько моделей, отсутствующих в таблице PC), используется служебное слово DISTINCT.

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


>SELECT DISTINCT model, price

>FROM Laptop

>WHERE price ALL

> (SELECT price

> FROM PC);


model

price

1298

1050.0

1750

1200.0

1752

1150.0


Приведем формальные правила оценки предикатов, использующих параметры ANY|SOME и ALL:

* Если определен параметр ALL или SOME и все результаты сравнения значения выражения и каждого значения, полученного из подзапроса, являются 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

> FROM Laptop

> WHERE speed 600) AS lap INNER JOIN

> (SELECT maker, model

> FROM Product) AS prod ON lap.model = prod.model;


В результате получим:


maker

type

model

speed

B

Laptop

1750

750

A

Laptop

1752

750


Наконец, подзапросы могут присутствовать в предложении SELECT. Это иногда позволяет весьма компактно сформулировать запрос.

Пример. Найти разницу между средними значениями цены ПК-блокнотов и ПК, т.е. на сколько в среднем ПК-блокнот стоит дороже, чем ПК.

Здесь вообще можно обойтись одним предложением SELECT:


> SELECT (SELECT AVG(price)

> FROM Laptop) -

> (SELECT AVG(price)

> FROM PC) AS dif_price;


В результате получим:

dif_price

365.81818181818187


Преобразование типов



В реализациях языка SQL может быть выполнено неявное преобразование типов. Так, например, в T-SQL при сравнении или комбинировании значений типов smallint и int, данные типа smallint неявно преобразуются к типу int. Подробно о явном и неявном преобразовании типов в MS SQL Server можно прочитать в BOL.

Пример. Вывести среднюю цену ПК-блокнотов с предваряющим текстом "средняя цена = ".


стр.

Похожие книги