
- •1. Конспект лекций (семестр 5)
- •1.1. Введение в базы данных
- •1.2. Классификация моделей данных
- •1.3. Язык sql
- •1.4. Проектирование баз данных
- •1.5.Физические модели баз данных
- •1.6. Распределённая обработка данных
- •1.7. Обеспечение безопасности в бд
- •1.8. Современные направления исследований и разработок
- •1.9. Методы и модели анализа данных: olap и Data Mining
- •2. Конспект лекций (семестр 6)
- •2.1. Представления
- •2.2. Компоненты языка Transact-sql
- •2.3. Курсоры
- •2.4. Хранимые процедуры
- •2.5. Триггеры
- •3. Рекомендуемая литература
2.2. Компоненты языка Transact-sql
Переменные
Локальные переменные обозначаются префиксом @, глобальные переменные – двойным символом @@. Например: @MyVariable, @@VERSION. Все глобальные переменные определяются SQL Server, вы не можете определить их самостоятельно. Большинство глобальных переменных предоставляют информацию о текущем статусе SQL Server.
Создание локальных переменных:
DECLARE @локальная_переменная тип_данных
Например: DECLARE @var1 int, @var2 int
Большинство типов данных являются скалярными, т.е. содержат одно значение, такое как число или строка. Возможно объявлять переменные с табличным типом данных:
DECLARE @локальная_переменная Table ({определение таблицы})
Определение таблицы идентично обычному CREATE TABLE, за исключением некоторых ограничений.
После создания локальных переменных, которые первоначально имеют значение NULL, им можно присвоить другие значения следующими способами:
Используя команду SET
SET @myChar = ‘Hello’
Используя команду SELECT
SELECT @myChar = ‘Hello’
С вложенным оператором SELECT
SELECT @myChar = MAX (OilName) FROM Oils
Оператор = замещает ключевое слово SELECT.
Используя команду INSERT INTO с указанием переменной табличного типа
INSERT INTO @myTable SELECT * FROM Oils или
INSERT INTO @myTable VALUES (‘The value’)
Управление ходом выполнения
Transact-SQL обрабатывает операторы сценария от начала до конца, не пропуская ни один оператор, если не задано иное. Это не всегда то, что вам нужно. Иногда вам необходимо, чтобы оператор выполнялся, только если некоторое условие истинно, или повторялся до тех пор, пока некоторое условие является истинным, или выполнялся указанное количество раз.
Когда вы приступаете к использованию операторов управления ходом выполнения Transact-SQL, удобно интерпретировать определенную группу команд как блок. Transact-SQL позволяет вам сделать это с помощью пары команд BEGIN...END.
В блок вы можете включить любой оператор Transact-SQL, в том числе другие блоки BEGIN...END, но здесь есть несколько ограничений. Вы не можете сочетать операторы CREATE DEFAULT, CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER и CREATE VIEW с какими-либо другими операторами. Также вы не можете изменять структуру таблицы и затем ссылаться на новый столбец в этом же блоке.
Условное выполнение IF...ELSE
Если булево выражение, следующее за командой IF, имеет значение TRUE, то будет выполнен оператор или блок операторов, следующий за этим оператором. Если булево выражение имеет значение FALSE, то оператор или блок операторов, следующий за FALSE, будет пропущен.
IF @test
SELECT ‘Истина’
ELSE
SELECT ‘Ложь’
Операторы IF...ELSE могут быть вложены один в другой, образуя логическую структуру, схожую с конструкцией IF...ELSEIF...ELSE, принятой в других языках программирования. Однако следует остерегаться использовать этот прием в простых случаях.
Тот же эффект можно достичь путем использования оператора CASE. При этом оценить ход выполнения будет легче.
CASE
В большинстве языков программирования оператор CASE является расширенной формой оператора IF, которая позволяет вам определять множество булевых выражений в одном операторе. В SQL Server CASE является функцией, а не командой. Она используется не сама по себе, как IF, а как часть оператора SELECT или UPDATE.
Синтаксис простой структуры CASE представлен ниже:
CASE значение
WHEN выражение_один THEN результирующее_выражение_один
WHEN выражение_два ТНEN результирующее_выражение_два
•••• ••••
WHEN выражение_п ТНEN результирующее_выражение_п
[ELSE альтернативное_результирующее_выражение]
END
Вы можете использовать в выражении любое количество фраз WHEN. Фраза ELSE необязательна — она выполняется, только если все фразы WHEN оцениваются как FALSE.
Сравнение одного значения с некоторым количеством других значений является типичной задачей, но иногда вам требуется большая степень гибкости. В этом случае вы можете воспользоваться так называемым поисковым синтаксисом функции CASE Transact-SQL, который имеет следующий вид:
CASE
WHEN булево_выражение_один ТНEN результирующее_выражение_один
WHEN булево_выражение_два ТНEN результирующее_выражение_два
WHEN булево_выражение_п THEN результирующее_выражение_п
•••• ••••
[ELSE альтернативное_результирующее_выражение]
END
Например:
SELECT TOP 10 OilName, LatinName,
CASE
WHEN LEFT (OilName, 1) = 'B' THEN 'Name B’
WHEN LEFT (LatinName, 1) = 'C' THEN ' LatinName C'
ELSE ' Neither'
END AS TestResults
FROM Oils
ORDER BY OilName
В этой форме CASE вы можете указать целое булево выражение в каждой фразе WHEN вместо неявного сравнения выражения в простой форме. Учтите, что при определении истинности можно оценивать несколько булевых_выражений. Transact-SQL возвратит только первое результирующее _выражение, а затем перейдет к оператору, следующему за END.
Команда GOTO
Структуры IF...ELSE и CASE управляют порядком выполнения операторов, основываясь на результатах вычисления булевого выражения. Команда GOTO является безусловной. Она передает выполнение непосредственно к оператору, следующему после метки, которая на него указывает. Сама команда GOTO имеет очень простой синтаксис:
GOTO имя_метки
GOTO является весьма непопулярной в кругу программистов командой. Применение команды GOTO, тем не менее, бывает вполне оправданным, особенно при обработке ошибок. Если вы будете аккуратно использовать эту команду, она даже сможет сделать код проще для понимания. Используйте команду GOTO для безусловного перехода.
Например:
GOTO M
……
M:
PRINT ‘ Name 1 ’
Циклы
Последняя из команд управления ходом выполнения позволяет вам выполнять оператор или блок операторов до тех пор, пока выполняется (является истинным) указанное условие.
Простейшая форма цикла WHILE содержит булево выражение и оператор или блок операторов. Операторы будут повторяться, пока булево выражение не примет FALSE. Если при первой оценке булево выражение имеет значение FALSE, то оператор или блок операторов не будет выполняться вообще.
Например:
DECLARE @counter int
SET @counter = 1
WHILE @counter < 11
BEGIN
PRINT @counter
SET @counter = @counter + 1
END
Синтаксис оператора WHILE также позволяет вам осуществлять и более сложную логику выполнения, в отличие от простой логики в предыдущей примере. Фраза BREAK вызывает выход из цикла; выполнение продолжается с оператора, следующего за фразой END блока оператора структуры WHILE. Фраза CONTINUE возвращает выполнение на начало цикла, при этом операторы, следующие за CONTINUE в пределах блока операторов, будут пропущены. Оба оператора, BREAK и CONTINUE обычно выполняются как условные в пределах оператора IF.
Если вам потребуется, вы можете использовать команды BREAK и CONTINUE в одном и том же операторе WHILE.
Например:
DECLARE @counter int
SET @counter = 1
WHILE @counter < 11
BEGIN
SET @counter = @counter + 1
IF (@counter % 2) = 0 CONTINUE
PRINT @counter
END
Функции преобразования
Внутреннее представление различных столбцов данных не всегда удобно для отчетов. Поэтому в T-SQL включены следующие две функции, выполняющие преобразование типов данных.
CONVERT (data_type, variable, style)
Функция CONVERT() преобразует переменную (или значение столбца) к заданному типу данных. В аргументе data_type может быть задано имя любого допустимого типа данных SQL Server. Если это тип данных nchar, nvarchar, char, varchar, binary или varbinary, в скобках можно задать числовое значение, определяющее его длину.
В аргументе style задается желаемый формат данных после преобразования переменной типа datatime или smalldatatime к символьному типу данных. Допустимые значения этого аргумента приведены в табл.4.
Функция CONVERT() используется для преобразования типов данных перед выводом их в окне Query Analyzer или для конкатенации символьных и числовых значений перед передачей их инструкции PRINT.
Максимальная длина столбцов CompanyName и ContactName таблицы Customers в базе данных Northwind составляет соответственно 40 и 30 символов. Если включить эти столбцы в запрос как есть, строки результирующего набора данных не поместятся в окне Query Analyzer. Сделать эти столбцы покороче можно с помощью такой инструкции:
USE NORTHWIND
SELECT CONVERT(nchar(30), CompanyName),
CONVERT(nchar(15), ContactName)
FROM Customers
Следующая инструкция формирует итоговые данные по всем компаниям и возвращает их вместе с названиями таковых:
USE NORTHWIND
SELECT CONVERT(char(25), CompanyName),
CONVERT(char(10), SUM(Quantity * UnitPrice * (1 - Discount)))
FROM [Order Details], Orders, Customers
WHERE [Order Details].OrderID = Orders.OrderID AND
Orders.CustomerID = Customers.CustomerID
GROUP BY CompanyName
ORDER BY CompanyName
Вот фрагмент выходных данных, генерируемых этой инструкцией:
Around the Horn 13806.8
Berglunds snabbkop 24927.6
Blauer See Delikatessen 3421.95
Blondesddsl pere et fils 18534.1
Bolido Comidas preparadas 4232.85
Bon app’ 21963.3
Bottom-Dollar Markets 20801.6
Если не пользоваться функцией CONVERT(), названия компаний будут дополняться пробелами до длины 40 символов, а в числах будет слишком много десятичных знаков:
Around the Horn 13806.800003051758
Berglunds snabbkop 24927.57746887207
Blauer See Delikatessen 3421.9500045776367
CAST (variable AS data_type)
Функция CAST() преобразует значение переменной или столбца к заданному типу данных. Эта функция делает то же самое, что и функция CONVERT() и включена в T-SQL для обеспечения совместимости со стандартом SQL-92.
Функции для обработки дат и времени
Как и Visual Basic, T-SQL предоставляет разработчикам несколько функций для выполнения операций с датами и временем. Эти функции описаны в следующих разделах.
GETDATE ()
Возвращает текущую дату и время, установленные на той машине, на которой работает SQL Server.
DATEADD (interval, number, datetime)
Увеличивает значение аргумента datetime на заданное количество единиц времени. Единица времени задается в аргументе interval, допустимые значения которого приведены в табл. 5.
DATEDIFF
(interval,
datetime1,
datetime2)
Возвращает разность между двумя аргументами в различных единицах времени — днях, часах, месяцах, годах и т. д. (см. табл. 5). Единица времени задается в аргументе interval.
DATEPART (interval, datetime)
Возвращает целое число, представляющее заданную часть даты.
DATENAME (interval, datetime)
Возвращает имя части аргумента datetime. Например, выражение DATENAME(month, varDate) возвращает название месяца, заданного в переменной varDate (January, February и т. д.), а выражение DATENAME (weekday, varDate) — название дня недели, заданного в переменной varDate (Monday, Tuesday и т. д.). Вот как выглядит данная инструкция T-SQL:
USE NORTHWIND
SELECT DATENAME(weekday, [OrderDate]), Count(OrderID)
FROM Orders
GROUP BY DATENAME(weekday, [OrderDate])
Выполнив эту инструкцию в Query Analyzer, вы увидите такой результат:
Friday 164
Monday 165
Thursday 168
Tuesday 168
Wednesday 165
Эти функции возвращают день недели, месяц и год даты, переданной им в виде значения datetime.