Справка по SQL | страница 17
> 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.
Пример. Вывести среднюю цену ПК-блокнотов с предваряющим текстом "средняя цена = ".
Попытка выполнить запрос
>SELECT 'Средняя цена = ' + AVG(price) FROM laptop;
приведет к сообщению об ошибке
Implicit conversion from data type varchar to money is not allowed. Use the CONVERT function to run this query.
Это сообщение означает, что система не может выполнить неявное преобразование типа varchar к типу money. В подобных ситуациях может помочь явное преобразование типов. При этом, как указано в сообщении об ошибке, можно воспользоваться функцией CONVERT. Однако эта функция не стандартизована, поэтому в целях переносимости рекомендуется использовать стандартное выражение CAST. С него и начнем.
Если переписать наш запрос в виде
>SELECT 'Средняя цена = ' + CAST(AVG(price) AS CHAR(15)) FROM laptop;
в результате получим то, что требовалось:
Средняя цена = 1410.44 |
Мы использовали выражение явного преобразования типов CAST для приведения среднего значения цены к строковому представлению. Синтаксис выражения CAST очень простой:
CAST( AS )
При этом следует иметь в виду, во-первых, что не любые преобразования типов возможны (стандарт содержит таблицу допустимых преобразований типов данных). Во-вторых, результат функции CAST для значения выражения, равного NULL, тоже будет NULL.
Рассмотрим еще один пример: определить средний год спуска на воду кораблей из таблицы Ships. Запрос
>SELECT AVG(launched) FROM ships;
даст результат 1926. В принципе все правильно, т.к. мы получили в результате то, что просили - ГОД. Однако среднее арифметическое будет составлять примерно 1926,2381. Тут следует отметить, что агрегатные функции (за исключением функции