Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование приложений баз данных с использованием СУБД MS SQL Server. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
представление совсем не виртуально, а присутствует в памяти фи­зически.
Примеры создания представления.
Пример 1.
Create view Hr.AuthS as select name from Author
Представление AuthS содержит только столбец name таблицы Au­thor. Пример 2.
create view dbo.un_book as select isbn, title=cast(name as char(15))+case when len(name)>15 then '…' else '' end, publisher=izd from book where Mesto ='M.'
Содержание представления показано на рис. 7.
Рис. 7
20
2.5. Индексы
Индексы представляют собой набор ссылок на места физиче­ского размещения строк таблицы в файлах базы данных, упорядо­ченный по возрастанию или убыванию значений определенного столбца или комбинации значений двух и более столбцов. Упоря­доченность позволяет организовать быстрый поиск нужного значе­ния, т. е. основное назначение индекса – ускорение процесса выборки из таблицы
строк с определенным значением индексиро­ванного столбца. В индексе хранятся только значения индексиро­ванного столбца и указатели на соответствующие строки. Сам ин­декс содержится отдельно от таблицы в страницах файлов базы данных, специально предназначенных для хранения индексов. Индексы не следует создавать для столбцов, которые только выби­раются, но не используются
в качестве критериев поиска или сор­тировки, или для объемных столбцов, длина которых достигает не­скольких десятков байт. Кроме того, если изменения, затрагиваю­щие индексированные столбцы, производятся чаще, чем выборка, то индекс лучше не создавать совсем. Это связано с тем, что при обновлении данных необходимо будет перестраивать индексы, а это требует
дополнительных временных затрат.
СУБД поддерживает два типа индексов: кластерные и некла­стерные. Оба реализуются в виде сбалансированного дерева. Кла­стерный индекс представляет собой настоящую таблицу, нижний уровень индекса содержит физические строки индексированной таблицы. Некластерный индекс хранится отдельно от таблицы и содержит только значения индексированных столбцов и указате­ли на строки.
Чтобы создать индекс, нужно воспользоваться следующей ко­мандой:
Create [clustered| nonclustered] index<имя индекса> on<имя таблицы>(<имя столбца> [asc|desc] [,…n]) [on<имя группы файлов>]
Пример
Create nonclustered index Tindex1 on book (god desc)
В результате выполнения команды для таблицы book был создан некластерный индекс по столбцу god, упорядоченный по убыванию значений.
21
3. ЯЗЫК TRANSACT-SQL
3.1. Общие сведения о Transact-SQL
В 1970-х годах был разработан специальный язык SEQUEL (Structured English Query Language), который позднее был переиме- нован в SQL. В 1986 году комитетом ANSI (American National Standards Institute) был принят первый стандарт языка. Последним
принятым стандартом является ISO SQL:2008.
Язык SQL разрабатывался как непроцедурный язык, который будет доступен обычным пользователям, а не только программи­стам. Однако со временем язык становился все сложнее и сейчас предназначен
в большей степени для программистов. Несмотря на существование стандартов языка SQL, в каждой СУБД использует­ся свое расширение этого языка. Основной причиной использова­ния расширений SQL является потребность применять SQL не только как язык запросов, но и как язык программирования. SQL
Server использует свое расширение языка, которое называется Transact-SQL. С его помощью можно создавать программируемые объекты базы данных трех типов:
хранимые процедуры;  функции; триггеры.
3.2. Типы данных
В дополнение к типам данных, рассмотренным ранее и ис­пользуемым при описании столбцов, Transact-SQL использует еще и следующие типы данных:
Table. Особый тип данных, используемый в основном для временного хранения таблиц и для передачи в качестве
параметра
в функции;
HierarchyID. Используется для представления положения в иерархической структуре;
Sql_variant. Тип данных, хранящий значения различных ти- пов данных, поддерживаемых MS SQL Server;
XML. Позволяет хранить XML-данные;
22
Cursor (1 байт). Тип данных для переменных или выходных
параметров хранимых процедур, которые содержат ссылку на кур­сор;
Timestamp / rowversion (8 байт). Это тип данных, который
представляет собой автоматически сформированные уникальные двоичные числа в базе данных. Значение данного типа генерирует­ся БД автоматически при вставке или изменении записи;
UniqueIdentifier (16 байт). Представляет собой GUID (Spe-
cial Globally Unique Identifier). Гарантируется уникальность данного значения.
3.3. Переменные в Transact-SQL
Любой объект базы данных должен обладать уникальным именем внутри этой базы. На основе имени происходит обращение к этому объекту. Имена объектов называются идентификаторами. Transact-SQL накладывает ряд ограничений на порядок именования объектов:
первый символ имени должен быть одним из символов ла- тинского алфавита
(A–Z, a–z) либо символом @, # или _, т. е. не допускается использование цифр и прочих специальных символов. Остальная часть имени может включать любые символы алфавита, цифры и некоторые специальные символы;
общая длина имени обычного объекта не должна превы-
шать 128 символов, для временных объектов – 116;
внутри имени запрещается использование пробелов, скобок
и таких символов,
как ~, !, %, ^, & и др.
имя объекта не должно совпадать с зарезервированным сло-
вом и с именем уже существующего объекта;
если имя объекта содержит пробелы или совпадает с заре-
зервированным словом, то его необходимо поместить внутрь квад­ратных скобок [ ].
Замечание. Transact-SQL является CASE-нечувствительным
языком, т. е. не различает регистр символов.
Имена
локальных переменных должны удовлетворять пере-
численным правилам именования объектов и всегда должны начи-
23
наться с символа @. Область действия переменной ограничена па­кетом операторов или процедурой, в которой она была объявлена.
Объявление переменной производится следующей командой:
DECLARE @<Имя Переменной><Тип Данных>[ ,…n]
Пример объявления одной переменной:
DECLARE @st nchar(9)
Пример объявления нескольких переменных:
DECLARE @temp int, @count float
3.4. Операторы языка Transact-SQL
3.4.1. Оператор присваивания
Синтаксис оператора присваивания:
SET @<Имя Переменной> = Выражение
Пример присвоения
значения:
SET @s = 0.54
Оператор select позволяет присваивать значения нескольким пере­менным одновременно:
declare @a int,@st nvarchar(40),@value1 float Select @a=15,@st='business',@value1=price*ytd_sales from titles where title_id='BU1032'
Последний пример демонстрирует возможность присвоения
результата подзапроса, если он возвращает единственное значение.
Можно инициализировать переменную сразу при объявлении,
например:
DECLARE @iCounter int = 0
24
3.4.2. Оператор вывода
Для вывода значений переменных можно использовать ко­манду select или команду print. Первая из них выводит данные в стандартный набор строк (recordset) и эти данные могут быть ис­пользованы в пользовательской программе. Пример.
declare @a int,@st nvarchar(40),@value1 float
Select @a=15,@st='символьная строка',@value1=price*ytd_sales from titles where title_id='BU1032' Select s1=@a,s2=@st,s3=@value1
Первая команда select является оператором присваивания, вто-
рая – оператором вывода.
Результаты вывода можно увидеть на рис. 8. Здесь s1, s2, s3 – наименования столбцов выведенной второй командой SELECT таблицы, которая состоит из одной строки.
Рис. 8
25
Команда print выводит информацию в качестве служебной
и появляется во вкладке «Сообщения» (см. рис. 8).
Пример Print @aa
3.4.3. Составной оператор
Группировка двух и более команд в единый блок осуществля-
ется с помощью конструкции:
BEGIN ... END
Составной оператор используется в условных и циклических
конструкциях.
3.4.4. Условный оператор IF
Выполнение той или иной группы команд в зависимости от выполнения или невыполнения некоторого условия реализуется с помощью конструкции:
IF<условие>
Оператор
[ELSE
Оператор ]
При отсутствии команд, выполняемых при невыполнении ус­ловия, ключевое слово ELSE можно не указывать.
Следует отметить особенность проверки значений на NULL (специальный маркер, обозначающий отсутствие информации). Вместо обычного сравнения: IF @myvar = NULL,
следует исполь-
зовать оператор IS: IF @myvar IS NULL.
3.4.5. Функция CASE
Функция CASE в отличие от оператора IF может использо­ваться в запросах и имеет два возможных варианта использования.
26
Вариант 1 (с входным выражением):
CASE <входное выражение> WHEN <выражение when> THEN <результат> [...] [ELSE <результат>] END
В последующих примерах анализируются последние цифры полей, содержащих числовые идентификаторы. Пример:
SELECT TOP 10 GOD, GOD % 10 AS 'Last_Digit', Position = CASE GOD % 10 WHEN 1 THEN 'Один' WHEN 2 THEN 'Два' WHEN 3 THEN 'Три' WHEN 4 THEN 'Четыре' ELSE 'Другое' END FROM book
Результат запроса представлен на рис. 9.
Рис. 9
Вариант 2 (без входного выражения).
Предыдущий вариант функции позволяет работать только со строго перечисленными вариантами. Однако в ряде случаев необ­ходимо получить значение на основании какого-либо логического
27
условия. Выходом является второй, так называемый «поисковый», вариант:
CASE WHEN<логическое выражение>THEN<результат> [...] [ELSE <результат>] END
Пример:
SELECT TOP 10 GOD, GOD % 10 AS 'Last_Digit', 'How_Close?' = CASE WHEN GOD % 10 < 3 THEN 'Меньше трех' WHEN GOD % 10=6 THEN 'Равен шести' WHEN GOD % 10 >6 THEN 'Больше шести' ELSE 'Другое' END FROM book
Результат выполнения запроса представлен на рис. 10.
Рис. 10
3.4.6. Оператор цикла
Transact-SQL поддерживает единственный тип цикла – цикл
WHILE, синтаксис которого следующий:
WHILE условие Оператор
[BREAK | CONTINUE]
28
Замечание. Вертикальная черта в описании синтаксиса озна­чает «или», т. е. в данном примере может быть указано либо BREAK, либо CONTINUE.
Тело цикла выполняется до тех пор, пока условие истинно. Цикл можно принудительно остановить, если выполнить в теле цикла команду BREAK. Если же нужно начать цикл заново, не до­жидаясь выполнения команд
тела цикла, необходимо выполнить
команду CONTINUE.
3.4.7. Оператор WAITFOR
В некоторых случаях требуется отложить выполнение той или иной команды. Для этих целей можно воспользоваться оператором WAITFOR. Эта команда имеет следующий синтаксис:
WAITFOR DELAY <’time’> | TIME <’time’>
Если используется параметр DELAY, то указывается, сколько времени необходимо ждать MS SQL Server. Максимально возмож­ная задержка – 24 часа. Пример использования: WAITFOR DELAY ‘01:00’, который приостановит выполнение на один час.
Если используется параметр TIME, то исполнение будет
при­остановлено до наступления заданного времени. Пример использо­вания: WAITFOR TIME ‘01:00’ – приостановление выполнения ко­да до наступления часа ночи.
3.4.8. Блок TRY/CATCH
Данную конструкцию можно использовать для обработки ис-
ключительных ситуаций. Впервые эта конструкция появилась в MS
SQL Server 2005.
Блок TRY/CATCH в MS SQL Server работает так же, как и в других языках программирования. Используется следующий синтаксис:
29
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]