admin / 13.02.2018
В реализациях языка 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; |
в результате получим то, что требовалось:
Мы использовали выражение явного преобразования типов CAST для приведения среднего значения цены к строковому представлению. Синтаксис выражения CAST очень простой:
CAST(<выражение> AS <тип данных>)
При этом следует иметь в виду, во-первых, что не любые преобразования типов возможны (стандарт содержит таблицу допустимых преобразований типов данных). Во-вторых, результат функции CAST для значения выражения, равного NULL, тоже будет NULL.
Рассмотрим еще один пример: определить средний год спуска на воду кораблей из таблицы Ships. Запрос
SELECT AVG(launched) FROM ships; |
даст результат 1926. В принципе все правильно, т.к. мы получили в результате то, что просили — ГОД. Однако среднее арифметическое будет составлять примерно 1926,2381. Тут следует отметить, что агрегатные функции (за исключением функции COUNT, которая всегда возвращает целое число) наследуют тип данных обрабатываемых значений. Поскольку поле launched — целочисленное, мы и получили среднее значение с отброшенной дробной частью (заметьте — не округленное).
А если нас интересует результат с заданной точностью, скажем, до двух десятичных знаков? Применение выражения CAST к среднему значению ничего не даст по указанной выше причине. Действительно,
SELECT CAST(AVG(launched) AS NUMERIC(6,2)) FROM ships; |
вернет значение 1926.00. Следовательно, CAST нужно применить к аргументу агрегатной функции:
SELECT AVG(CAST(launched AS NUMERIC(6,2))) FROM ships; |
Результат — 1926.238095. Опять не то. Причина состоит в том, что при вычислении среднего значения было выполнено неявное преобразование типа. Сделаем еще один шаг:
SELECT CAST(AVG(CAST(launched AS NUMERIC(6,2))) AS NUMERIC(6,2)) FROM ships; |
В результате получим то, что нужно — 1926.24. Однако это решение выглядит очень громоздко. Заставим неявное преобразование типа поработать на нас:
SELECT CAST(AVG(launched*1.0) AS NUMERIC(6,2)) FROM ships; |
Т.е. мы использовали неявное преобразование целочисленного аргумента к точному числовому типу (EXACT NUMERIC), умножив его на вещественную единицу, после чего применили явное приведения типа результата агрегатной функции.
Аналогичные преобразования типа можно выполнить с помощью функции CONVERT:
SELECT CONVERT(NUMERIC(6,2),AVG(launched*1.0)) FROM ships; |
Функция CONVERT имеет следующий синтаксис:
CONVERT (<тип данных>[(<длина>)], <выражение> [, <стиль>])
Основное отличие функции CONVERT от функции CAST состоит в том, что первая позволяет форматировать данные (например, темпоральные данные типа datetime) при преобразовании их к символьному типу и указывать формат при обратном преобразовании. Разные целочисленные значения необязательного аргумента стиль соответствуют определенным форматам. Рассмотрим следующий пример
SELECT CONVERT(char(25),CONVERT(datetime,’20030722′)); |
Здесь мы преобразуем строковое представление даты к типу datetime, после чего выполняем обратное преобразование, чтобы продемонстрировать результат форматирования. Поскольку значение аргумента стиль не задано, используется значение по умолчанию (0 или 100). В результате получим
Ниже приведены некоторые другие значения аргумента стиль и результат, полученный на приведенном выше примере. Заметим, что значения стиль большие 100 приводят к четырехзначному отображению года.
стиль | формат |
1 | 07/22/03 |
11 | 03/07/22 |
3 | 22/07/03 |
121 | 2003-07-22 00:00:00.000 |
Перечень всех возможных значений аргумента стиль можно посмотреть в BOL.
Содержание
Пусть требуется вывести список всех моделей ПК с указанием их цены. При этом если модель отсутствует в продаже (нет в таблице РС), то вместо цены вывести текст: «Нет в наличии».
Список всех моделей ПК с ценами можно получить с помощью запроса:
SELECT DISTINCT product.model, price FROM product LEFT JOIN pc c ON product.model=c.model WHERE product.type=’pc’; |
В результирующем наборе отсутствующая цена будет заменена NULL-значением:
model | price |
1121 | 850 |
1232 | 350 |
1232 | 400 |
1232 | 600 |
1233 | 600 |
1233 | 950 |
1233 | 980 |
1260 | 350 |
2111 | NULL |
2112 | NULL |
Чтобы заменить NULL-значения нужным текстом, можно воспользоваться оператором CASE:
SELECT DISTINCT product.model, CASE WHEN price IS NULL THEN ‘Нет в наличии’ ELSE CAST(price AS CHAR(20)) END price FROM product LEFT JOIN pc c ON product.model=c.model WHERE product.type=’pc’ |
Оператор CASE в зависимости от указанных условий возвращает одно из множества возможных значений. В нашем примере условием является проверка на NULL. Если это условие выполняется, то возвращается текст «Нет в наличии», в противном случае (ELSE) возвращается значение цены. Здесь есть один принципиальный момент. Поскольку результатом оператора SELECT всегда является таблица, то все значения любого столбца должны иметь один и тот же тип данных (с учетом неявного приведения типов). Поэтому мы не можем наряду с ценой (числовой тип) выводить символьную константу. Вот почему к полю price применяется преобразование типов, чтобы привести его значения к символьному представлению. В результате получим
model | price |
1121 | 850 |
1232 | 350 |
1232 | 400 |
1232 | 600 |
1233 | 600 |
1233 | 950 |
1233 | 980 |
1260 | 350 |
2111 | Нет в наличии |
2112 | Нет в наличии |
Оператор CASE может быть использован в одной из двух синтаксических форм записи:
1-я форма
CASE <проверяемое выражение>
WHEN <сравниваемое выражение 1>
THEN <возвращаемое значение 1>
…
WHEN <сравниваемое выражение N>
THEN <возвращаемое значение N>
[ELSE <возвращаемое значение>]
END
2-я форма
CASE
WHEN <предикат 1>
THEN <возвращаемое значение 1>
…
WHEN <предикат N>
THEN <возвращаемое значение N>
[ELSE <возвращаемое значение>]
END
Все предложения WHEN должны иметь одинаковую синтаксическую форму, т.е. нельзя смешивать первую и вторую формы. При использовании первой синтаксической формы условие WHEN удовлетворяется, как только значение проверяемого выражения станет равным значению выражения, указанного в предложении WHEN. При использовании второй синтаксической формы условие WHEN удовлетворяется, как только предикат принимает значение TRUE. При удовлетворении условия оператор CASE возвращает значение, указанное в соответствующем предложении THEN. Если ни одно из условий WHEN не выполнилось, то будет использовано значение, указанное в предложении ELSE. При отсутствии ELSE, будет возвращено NULL-значение. Если удовлетворены несколько условий, то будет возвращено значение предложения THEN первого из них.
В приведенном выше примере была использована вторая форма оператора CASE.
Заметим, что для проверки на NULL стандарт предлагает более короткую форму оператора — COALESCE. Этот оператор имеет произвольное число параметров и возвращает значение первого, отличного от NULL. Для двух параметров оператор COALESCE(A, B) эквивалентен следующему оператору CASE:
CASE WHEN A IS NOT NULL THEN A ELSE B END
Решение рассмотренного выше примера при использовании оператора COALESCE можно переписать следующим образом:
SELECT DISTINCT product.model, COALESCE(CAST(price as CHAR(20)),’Нет в наличии’) price FROM product LEFT JOIN pc c ON product.model=c.model WHERE product.type=’pc’; |
Использование первой синтаксической формы оператора CASE можно продемонстрировать на следующем примере: Вывести все имеющиеся модели ПК с указанием цены. Отметить самые дорогие и самые дешевые модели.
SELECT DISTINCT model, price, CASE price WHEN (SELECT MAX(price) FROM pc) THEN ‘Самый дорогой’ WHEN (SELECT MIN(price) FROM pc) THEN ‘Самый дешевый’ ELSE ‘Средняя цена’ END comment FROM pc ORDER BY price; |
В результате выполнения запроса получим
model | price | comment |
1232 | 350 | Самый дешевый |
1260 | 350 | Самый дешевый |
1232 | 400 | Средняя цена |
1233 | 400 | Средняя цена |
1233 | 600 | Средняя цена |
1121 | 850 | Средняя цена |
1233 | 950 | Средняя цена |
1233 | 980 | Самый дорогой |
Рекомендуемые упражнения: 31, 32, 47, 53, 54.
блузы и рубашки от производителя
niko-opt.com
Электрокардиограф экзт 12-03 альта купить cardiomc.com.ua
cardiomc.com.ua
Производство бытовок
Каталог продукции, технические характеристики. Каталог продукции.
module-house.ru
Последнее обновление: 29.07.2017
Когда мы присваиваем значение одного одного типа столбцу, который хранит данные другого типа, либо выполняем операции, которые вовлекают данные разных типов, SQL Server пытается выполнить преобразование и привести используемое значение к нужному типу. Но не все преобразования SQL Server может выполнить автоматически. SQL Server может выполнять неявные преобразования от типа с меньшим приоритетом к типу с большим приоритетом. Таблица приоритетов (чем выше, тем больший приоритет):
datetime |
smalldatetime |
float |
real |
decimal |
money |
smallmoney |
int |
smallint |
tinyint |
bit |
nvarchar |
nchar |
varchar |
char |
То есть SQL Server автоматически может преобразовать число 100.0 (float) в дату и время (datetime).
В тех случаях, когда необходимо выполнить преобразования от типов с высшим приоритетом к типам с низшим приоритетом, то надо выполнять явное приведение типов. Для этого в T-SQL определены две функции: CONVERT и CAST.
Функция CAST преобразует выражение одного типа к другому. Она имеет следующую форму:
CAST(выражение AS тип_данных)
Для примера возьмем следующие таблицы:
CREATE TABLE Products ( Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL ); CREATE TABLE Customers ( Id INT IDENTITY PRIMARY KEY, FirstName NVARCHAR(30) NOT NULL ); CREATE TABLE Orders ( Id INT IDENTITY PRIMARY KEY, ProductId INT NOT NULL REFERENCES Products(Id) ON DELETE CASCADE, CustomerId INT NOT NULL REFERENCES Customers(Id) ON DELETE CASCADE, CreatedAt DATE NOT NULL, ProductCount INT DEFAULT 1, Price MONEY NOT NULL );
Например, при выводе информации о заказах преобразует числовое значение и дату в строку:
SELECT Id, CAST(CreatedAt AS nvarchar) + ‘; total: ‘ + CAST(Price * ProductCount AS nvarchar) FROM Orders
Большую часть преобразований охватывает функция CAST.
Если же необходимо какое-то дополнительное форматирование, то можно использовать функцию CONVERT. Она имеет следующую форму:
CONVERT(тип_данных, выражение [, стиль])
Третий необязательный параметр задает стиль форматирования данных. Этот параметр представляет числовое значение, которое для разных типов данных имеет разную интерпретацию. Например, некоторые значения для форматирования дат и времени:
или — формат даты «Mon dd yyyy hh:miAM/PM» (значение по умолчанию)
или — формат даты «mm/dd/yyyy»
или — формат даты «dd/mm/yyyy»
или — формат даты «Mon dd, yyyy hh:miAM/PM»
или — формат даты «hh:mi:ss»
или — формат даты «mm-dd-yyyy»
или — формат даты «hh:mi:ss:mmmm» (24-часовой формат времени)
Некоторые значения для форматирования данных типа money в строку:
— в дробной части числа остаются только две цифры (по умолчанию)
— в дробной части числа остаются только две цифры, а для разделения разрядов применяется запятая
— в дробной части числа остаются только четыре цифры
SELECT CONVERT(nvarchar, CreatedAt, 3), CONVERT(nvarchar, Price * ProductCount, 1) FROM Orders
При использовании функций CAST и CONVERT SQL Server выбрасывает исключение, если данные нельзя привести к определенному типу. Например:
SELECT CONVERT(int, ‘sql’)
Чтобы избежать генерации исключения можно использовать функцию TRY_CONVERT. Ее использование аналогично функции CONVERT за тем исключением, что если выражение не удается преобразовать к нужному типу, то функция возвращает NULL:
SELECT TRY_CONVERT(int, ‘sql’) — NULL SELECT TRY_CONVERT(int, ’22’) — 22
Кроме CAST, CONVERT, TRY_CONVERT есть еще ряд функций, которые могут использоваться для преобразования в ряд типов:
STR(float [, length [,decimal]]): преобразует число в строку. Второй параметр указывает на длину строки, а третий — сколько знаков в дробной части числа надо оставлять
CHAR(int): преобразует числовой код ASCII в символ. Нередко используется для тех ситуаций, когда необходим символ, который нельзя ввести с клавиатуры
ASCII(char): преобразует символ в числовой код ASCII
NCHAR(int): преобразует числовой код UNICODE в символ
UNICODE(char): преобразует символ в числовой код UNICODE
SELECT STR(123.4567, 6,2) — 123.46 SELECT CHAR(219) — Ы SELECT ASCII(‘Ы’) — 219 SELECT NCHAR(1067) — Ы SELECT UNICODE(‘Ы’) — 1067
НазадСодержаниеВперед
Множество типов разрешенные для преобразования в констркуции CAST AS определяется реализацией СУБД. Так в MySQL может преобразовать только следующие типы: binary[(n)], char[(n)], date, datetime, decimal[(m[,d])], signed [integer], time, unsigned [integer]. А в Oracle, кроме преобразования встроенных типов, можно преобразовывать выборки со множеством записей в массивы.
В PostgreSQL более расширенные возможности по преобразованию. Во-первых, можно добавить собственное преобразование для встроенных и пользовательских типов. Во-вторых, есть собственный более удобный оператор преобразования типов ::.
В большинстве случае необходимо преобразование в строку либо из строки.
Для этого случая СУБД предоставляют дополнительные функции.
В этих функциях format описание формата даты или числа, а nlsparams — национальные параметры. Формат строки для даты задается следующими элементами:
Формат числовой строки задается следующими элементами:
Основные элементы форматирования совпадают с Oracle.
Ниже приведен список основных элементов форматирования для даты и времени:
< /ul>
SQL (Structured Query Language — «язык структурированных запросов») — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. Язык SQL основывается на реляционной алгебре и представляет собой совокупность операторов.
Существует 4 группы операторов. Рассмотрим группу операторов манипуляции данными (Data Manipulation Language, DML, SQL DML)
Выбор данных
Выбор данных представляет собой наиболее часто встречающуюся операцию, выполняемую с помощью SQL. Оператор SELECT — один из самых важных операторов этого языка, применяемый для выбора данных. Синтаксис этого оператора имеет следующий вид:
SELECT column FROM table [WHERE where-clause] [ORDER BY order-by-clause]
Операторы SELECT должны содержать слова SELECT и FROM; другие ключевые слова являются необязательными.
За ключевым словом SELECT следуют сведения о том, какие именно поля необходимо включить в результирующий набор данных. Звездочка (*) обозначает все поля таблицы, например:
Для выбора одной колонки применяется следующий синтаксис:
SELECT Company
Пример выбора нескольких колонок имеет вид:
SELECT Company, Phone, Mail
Для указания имен таблиц, из которых выбираются записи, применяется ключевое слово FROM, например:
SELECT * FROM Customers
Этот запрос возвратит все поля из таблицы Customers.
Для фильтрации результатов, возвращаемых оператором SELECT, можно использовать предложение WHERE (необязательное)
SELECT * FROM Products WHERE Category = 4
В предложении WHERE можно использовать различные выражения,
WHERE expression1 [{AND | OR} expression2 …]
например:
SELECT * FROM Products WHERE Category = 2 AND Postavshik > 10
SELECT Name, Price FROM Products WHERE Category= 3 OR Price < 50
Можно использовать такие операторы:
< Меньше
<= Меньше или равно
<> Не равно
= Равно
> Больше
>= Больше или равно
Предложение ORDER BY (необязательное) применяется для сортировки результирующего набора данных по одной или нескольким колонкам.
Для определения порядка сортировки используются ключевые слова ASC (по возрастанию) или DESC (по убыванию). По умолчанию данные сортируются по возрастанию.
Модификация данных
Помимо извлечения данных язык SQL может быть использован для обновления и удаления данных, копирования записей в другие таблицы и выполнения других операций. Ниже мы рассмотрим операторы UPDATE, DELETE и INSERT, используемые для решения некоторых из этих задач.
Оператор UPDATE
Для изменения значений в одной или нескольких колонках таблицы применяется оператор UPDATE. Синтаксис этого оператора имеет вид:
UPDATE table SET column1 = expression1 WHERE criteria
Выражение в предложении SET может быть константой или результатом вычислений. Например, для повышения цен всех продуктов, стоящих меньше 10 долл., можно выполнить следующий запрос:
UPDATE Products SET Price = Price * 1.1 WHERE Price < 10
Оператор DELETE
Для удаления строк из таблиц следует использовать оператор DELETE, синтаксис которого имеет вид:
DELETE FROM table WHERE criteria
Удалить все продукты стоимость которых меньше 100:
DELETE FROM Products WHERE Price < 100
Оператор INSERT
Для добавления записей в таблицы следует использовать оператор INSERT, синтаксис которого имеет вид:
INSERT INTO table ( [column_list] VALUES ( expression [, …] )
Например, для добавления нового клиента в таблицу Customers можно использовать следующий запрос:
INSERT INTO Customers (CustomerID, CompanyName) VALUES (‘XYZ’, ‘XYZ Deli’)
123
Дата добавления: 2016-04-19; просмотров: 182;
FILED UNDER : IT