Строковые функции SQL – примеры использования. Встроенные функции Создание новой базы данных

В этом учебном пособии вы узнаете, как создавать и удалять функции в SQL Server (Transact-SQL) с помощью синтаксиса и примеров.

Описание

В SQL Server функция представляет собой хранимую программу, в которую вы можете передавать параметры и возвращать значение.

Create Function

Вы можете создавать свои собственные функции в SQL Server (Transact-SQL). Давайте рассмотрим подробнее.

Синтаксис

Синтаксис Functions в SQL Server (Transact-SQL):

CREATE FUNCTION function_name
([ @parameter [ AS ] datatype
[ = default ] [ READONLY ]
, @parameter [ AS ] datatype
[ = default ] [ READONLY ] ]
RETURNS return_datatype
[ WITH { ENCRYPTION
| SCHEMABINDING
| RETURNS NULL ON NULL INPUT
| CALLED ON NULL INPUT
| EXECUTE AS Clause ]
[ AS ]
BEGIN
executable_section
RETURN return_value
END;

Параметры или аргументы

schema_name — имя схемы, которой принадлежит эта функция.
function_name — наименование функции в SQL Server.
@parameter — один или несколько параметров, которые передаются в функцию.
type_schema_name — схема, которая владеет типом данных, если это применимо.
datatype — тип данных для @parameter .
default — значение по умолчанию для назначения параметру @parameter .
READONLY — это означает, что @parameter не может быть перезаписана функцией.
return_datatype — тип данных возвращаемого значения функции.
ENCRYPTION — это означает, что источник для функции не будет сохранен как обычный текст в системных представлениях SQL Server.
SCHEMABINDING — это означает, что базовые объекты не могут быть изменены, чтобы влиять на функцию.
RETURNS NULL ON NULL INPUT — это означает, что функция вернет NULL, если любые параметры имеют значение NULL, без необходимости выполнять функцию.
CALL ON NULL INPUT — это означает, что функция будет выполняться, даже если любые параметры имеют NULL.
EXECUTE AS — устанавливает контекст безопасности для выполнения функции.
return_value — значение, возвращаемое функцией.

Пример

Рассмотрим пример создания функции в SQL Server (Transact-SQL).
Ниже приведен простой пример функции:

Transact-SQL

CREATE FUNCTION ReturnSite (@site_id INT) RETURNS VARCHAR(50) AS BEGIN DECLARE @site_name VARCHAR(50); IF @site_id < 10 SET @site_name = "yandex.com"; ELSE SET @site_name = "google.com"; RETURN @site_name; END;

CREATE FUNCTION ReturnSite

(@ site_id INT )

RETURNS VARCHAR (50 )

BEGIN

DECLARE @ site_name VARCHAR (50 ) ;

IF @ site_id < 10

SET @ site_name = "yandex.com" ;

ELSE

SET @ site_name = "google.com" ;

RETURN @ site_name ;

END ;

Эта функция называется ReturnSite . Она имеет один параметр, называемый @site_id , который является типом данных INT. Функция возвращает значение VARCHAR (50), указанное в предложении RETURNS.
Затем вы можете ссылаться на новую функцию ReturnSite следующим образом.

Таблица 8.2. Математические функции SQL
Математическая функция Описание
ABS(X) Возвращает абсолютное значение числа Х
ACOS (X) Возвращает арккосинус числа Х
ASIN(X) Возвращает арксинус числа Х
ATAN(X) Возвращает арктангенс числа Х
COS(X) Возвращает косинус числа Х
EXP(X) Возвращает экспоненту числа Х
SIGN(X) Возвращает -1, если Х<0,0, если Х=0, +1 , если Х>0
LN(X) Возвращает натуральный логарифм числа Х
MOD(X,Y) Возвращает остаток от деления Х на Y
CEIL (X) Возвращает наименьшее целое, большее или равное Х
ROUND(X,n) Округляет число Х до числа с n знаками после десятичной точки
SIN(X) Возвращает синус числа Х
SQRT(X) Возвращает квадратный корень числа Х
TAN(X) Возвращает тангенс числа Х
FLOOR (X) Возвращает наибольшее целоеб меньшее или равное Х
LOG(a,X) Возвращает логарифм числа Х по основанию А
SINH(X) Возвращает гиперболический синус числа Х
COSH(X) Возвращает гиперболический косинус числа Х
TANH(X) Возвращает гиперболический тангенс числа Х
TRANC(X,n) Усекает число Х до числа с n знаками после десятичной точки
POWER(A,X) Возвращает значение А , возведенное в степень Х

Набор встроенных функций может изменяться в зависимости от версии СУБД одного производителя и также в СУБД различных производителей. Так, например, в СУБД SQLBase, Centure Inc. есть функция @ATAN2(X,Y) , которая возвращает арктангенс Y/X , но отсутствует функция SIGN(X) .

Арифметические выражения необходимы для получения данных, которые непосредственно не сохраняются в колонках таблиц базы данных, но значения которых необходимы пользователю. Допустим, что вам необходим список служащих, показывающий выплату, которую получил каждый служащий с учетом премий и штрафов.

SELECT ENAME, SAL, COMM, FINE, SAL + COMM - FINE FROM EMPLOYEE ORDER BY DEPNO;

Арифметическое выражение SAL + COMM - FINE выводится как новая колонка в результирующей таблице, которая вычисляется в результате выполнения запроса. Такие колонки называют еще производными (вычисляемыми) атрибутами или полями.

Функции обработки строк

SQL предоставляет вам широкий набор функций для манипулирования со строковыми данными (конкатенация строк, CHR, LENGTH, INSTR и другие). Список основных функций для обработки строковых данных приведен в таблице 8.3 .

Таблица 8.3. Функции SQL для обработки строк
Функция Описание
CHR(N) Возвращает символ ASCII кода для десятичного кода N
ASCII(S) Возвращает десятичный ASCII код первого символа строки
INSTR(S2.S1.pos[,N] Возвращает позицию строки S1 в строке S2 большую или равную pos.N - число вхождений
LENGHT(S) Возвращает длину строки
LOWER(S) Заменяет все символы строки на прописные символы
INITCAP(S) Устанавливает первый символ каждого слова в строке на заглавный, а остальные символы каждого слова - на прописные
SUBSTR(S,pos,[,len]) Выделяет в строке S подстроку длиной len , начиная с позиции pos
UPPER(S) Преобразует прописные буквы в строке на заглавные буквы
LPAD(S,N[,A]) Возвращает строку S , дополненную слева симолами A до числа символов N . Символ - наполнитель по умолчанию - пробел
Rpad(S,N[,A]) Возвращает строку S , дополненную справа симолами A до числа символов N . Символ - наполнитель по умолчанию - пробел
LTRIM(S,) Возвращает усеченную слева строку S . Символы удаляются до тех пор, пока удаляемый символ входит в строку - шаблон S1 (по умолчанию - пробел)
RTRIM(S,) Возвращает усеченную справа строку S . Символы удаляются до тех пор, пока удаляемый символ входит в строку - шаблон S1 (по умолчанию - пробел
TRANSLATE(S,S1,S2) Возвращает строку S , в которой все вхождения строки S1 замещены строкой S2 . Если S1 <> S2 , то символы, которым нет соответствия, исключаются из результирующей строки
REPLACE(S,S1,[,S2]) Возвращает строку S , для которой все вхождения строки S1 замещены на подстроку S2 . Если S2 не указано, то все вхождения подстроки S1 удаляются из результирующей строки
NVL(X,Y) Если Х есть NULL , то возвращает в Y либо строку, либо число, либо дату в зависимости от исходного типа Y

Названия одних и тех же функций могут отличаться в различных СУБД. Так, например, функция СУБД Oracle SUBSTR(S, pos, [, len]) в СУБД SQLBase называется @SUBSTRING(S, pos, len) . В СУБД SQLBase имеются функции, которых нет в СУБД Oracle (см.

Мы продолжаем изучение языка запросов SQL, и сегодня мы с Вами будем разговаривать о строковых функциях SQL . Мы рассмотрим основные и часто используемые строковые функции, такие как: LOWER, LTRIM, REPLACE и другие, все рассматривать мы будем, конечно же, на примерах.

SELECT name || surname AS FIO FROM table

Или чтобы отделить пробелом введите

SELECT name || " " || surname AS FIO FROM table

т.е. две вертикальные черты объединяют два столбца в один, а чтобы отделить их пробелом я поставил между ними пробел (можно использовать любой символ, например тире или двоеточие ) в апострофах и объединил также двумя вертикальными чертами (в Transact-SQL вместо двух вертикальных черточек используется знак + ).

Функция INITCAP

Дальше идет также очень полезная функция, INITCAP – которая возвращает значение в строке, в которой каждое слово начинается с заглавной буквы, а продолжается маленькими. Это нужно для того, если у Вас в той или иной колонке не соблюдают правила заполнения и для того чтобы вывести все это дело в красивом виде можно использовать данную функцию, например, у Вас в таблице записи в колонке name следующего вида: ИВАН иванов или петр петров, Вы применяете данную функцию.

SELECT INITCAP (name) AS FIO FROM table

И у Вас получится вот так.

Функция UPPER

Похожая функция, только возвращает все символы с заглавной буквы, это UPPER .

SELECT UPPER (name) AS FIO FROM table

  • name – название колонки;
  • 20 – количество знаков (длина поля );
  • ‘-‘ – символ, которым нужно дополнить до необходимого количества знаков.

Функция RPAD

Сразу рассмотрим обратную функцию. RPAD – действие и синтаксис тот же что и у LPAD, только дополняются символы справа (в LPAD слева ).

SELECT RPAD (name, 20, "-") AS name FROM table

Иван—————-
Сергей—————

Функция LTRIM

Далее идет тоже в некоторых случаях полезная функция, LTRIM – эта функция удаляет крайние левые символы, которые Вы укажите. Например, у Вас в базе есть колонка «город», в которой город указан в виде «г.Москва», а также есть города которые указанны в виде просто «Москва». Но Вам нужно вывести отчет только в виде «Москва» без «г.», но как это сделать, если есть и такие и такие? Вы просто указываете своего рода шаблон «г.» и если крайние левые символы начинаются с «г.», то эти символы просто не будут выводиться.

SELECT LTRIM (city, "г.") AS gorod FROM table

Данная функция просматривает символы слева, если символов по шаблону нет в начале строки, то она возвращает исходное значение ячейки, а если есть, то удаляет их.

Функция RTRIM

Также давайте сразу рассмотрим обратную функцию. RTRIM – то же самое что и LTRIM только символы ищутся справа.

Примечание! В Transact-SQL функции RTRIM и LTRIM удаляют пробелы справа и слева соответственно.

Функция REPLACE

Теперь рассмотрим такую интересную функцию как REPLACE – она возвращает строку, в которой все совпадения символов, заменяются на Ваши символы, которые Вы укажите. Для чего ее можно использовать, например, у Вас в базе есть колонки, в которых встречаются некие разделительные символы, допустим «/». Например, Иван/Иванов, а Вам хотелось бы вывести Иван-Иванов, то напишите

SELECT REPLACE (name, "/", "-") FROM table

и у Вас произойдет замена символов.

Данная функция заменяет только полное совпадение символов, если например Вы укажите «—» т.е. три тире она и будет искать только три тире, а каждое отдельное тире заменять не будет, в отличие от следующей функции.

Функция TRANSLATE

TRANSLATE – строковая функция, которая заменяет все символы в строке, на те символы, которые Вы укажите. Исходя из названия функции, можно догадаться, что это полный перевод строки. Отличие данной функции от REPLACE в том, что она заменяет каждый символ, который Вы укажите, т.е. у Вас есть три символа, допустим абв и с помощью TRANSLATE Вы его можете заменить на abc таким образом у Вас а=a, б=b, в=c и по такому принципу будут заменяться все совпадения символов. А если Вы заменяли с помощью REPLACE, то у Вас искалось только полное совпадение символов абв расположенных подряд.

Функция SUBSTR

SUBSTR – данная функция, возвращает только тот диапазон символов, который Вы укажите. Другими словами, допустим, строка из 10 символов, а Вам все десять не нужны, а допустим, нужны только 3-8 (с третьего по восьмой ). С помощью данной функции Вы легко можете это сделать. Например, у Вас в базе есть какой-нибудь идентификатор, фиксированной длинны (типа: AA-BB-55-66-CC) и каждая комбинация символов что-то означает. И в один прекрасный момент Вам сказали вывести только 2 и 3 комбинацию символов, для этого вы пишите запрос следующего вида.

SELECT SUBSTR (ident, "4", "8") FROM table

т.е. мы выводим все символы, начиная с 4 и заканчивая 8, и после этого запроса у Вас выведется вот это:

Функция LENGTH – длина строки

Следующая функция также может пригодиться, это LENGTH – которая просто на всего считает количество символов в строке. Например, Вам нужно узнать, сколько символов в каждой ячейки столбца допустим «name», таблица следующего вида.

SELECT LENGTH (name) FROM table

после этого запроса Вы получите вот это.

4
6
7

Вот мы с Вами и рассмотрели основные строковые функции SQL. В следующих статьях мы продолжим изучение SQL.

Шаги этого этапа изучения SQL запросов призваны продемонстрировать тот факт, что SQL умеет не только делать сложные выборки и сортировать данные, но и вычислять результаты математических функций, выполнять преобразование текста, группировать записи и т.п. Точнее все это умеет не SQL, а , его поддерживающие. SQL своими стандартами только формулирует требования к этим самым СУБД.

Шаг 15. Функции SUM, AVG, MIN, MAX, COUNT…

На этом шаге будут показаны варианты использования простейших функций в SQL, таких как сумма, минимальное и максимальное значения, среднее значение и т.п. Сразу же начнем с примера вывода среднего значения стажа всех сотрудников.

SELECT AVG(D_STAFF.S_EXPERIENCE) AS [СРЕДНИЙ СТАЖ СОТРУДНИКОВ] FROM D_STAFF

SQL функция AVG.

Аналогично можно вычислить минимальное и максимальное значения (MIN, MAX), общую сумму (SUM) и т.д. Советую попробовать это выполнить с использованием обучающей программы. Стоит попробовать определить дополнительные критерии отбора записей, участвующих в определении итогового значения функции с использованием оператора WHERE.

Перечисленные выше функции для определения своего значения используют результат запроса целиком. Такие функции называются агрегатными . Также, есть ряд функций, аргументом которых являются не все значения определенной в запросе колонки, а каждое отдельное значение каждой отдельной строки результата. Примером такой функции является SQL функция вычисления длины текстового поля LEN:

SELECT S_NAME, LEN(D_STAFF.S_NAME) AS [ДЛИНА] FROM D_STAFF


Можно использовать суперпозицию SQL функций , как показано ниже, и вычислить максимальное значение длины поля S_NAME.

SELECT MAX(LEN(D_STAFF.S_NAME)) AS [МАКСИМАЛЬНАЯ ДЛИНА] FROM D_STAFF


SQL функция MAX.

Ну и в заключении все вместе.

SELECT SUM(D_STAFF.S_EXPERIENCE) AS [СУММА], AVG(D_STAFF.S_EXPERIENCE) AS [СРЕДНЕЕ], MIN(D_STAFF.S_EXPERIENCE) AS [МИНИМУМ], MAX(D_STAFF.S_EXPERIENCE) AS [МАКСИМУМ], COUNT(*) AS [КОЛИЧЕСТВО ЗАПИСЕЙ], MAX(LEN(D_STAFF.S_NAME)) AS [МАКСИМАЛЬНАЯ ДЛИНА] FROM D_STAFF


Пример использования агрегатных SQL функций.

Обратите внимание на аргумент функции COUNT. Я указал в качестве аргумента (*), поскольку хочу получиться именно общее число записей. Если указать, например COUNT(S_NAME), то результатом будет число непустых значений S_NAME (S_NAME IS NOT NULL). Можно было бы написать COUNT(DISTINCT S_NAME) и получить количество уникальных значений S_NAME, но MS Access такой вариант, к сожалению, не поддерживает. В нашем примере COUNT(S_NAME) и COUNT(*) дают абсолютно одинаковый результат.

Шаг 16. Преобразование текста

Часто, текстовые значения заполняются пользователями программного обеспечения по-разному: кто пишет Ф.И.О. с заглавной буквы, кто нет; кто-то пишет все заглавными буквами. Многие отчетные формы требуют унифицированного подхода, да и не только отчетные формы. Для решения этой задачи в SQL есть две функции UCASE и LCASE. Пример запроса и результат его обработки приведены ниже:

SELECT UCASE(D_STAFF.S_NAME) AS , LCASE(D_STAFF.S_NAME) AS FROM D_STAFF


SQL функции UCASE и LCASE.

Шаг 17. SQL и работа со строками

Есть еще такая замечательная функция MID, которая поможет вам решить задачу выделения части строки из всего значения текстового поля. Здесь также лучшим комментарием будет пример – пример "издевательств" над наименованиями профилей пользователей.

SELECT UCASE(MID(P_NAME,3,5)) FROM D_PROFILE


Суперпозиция SQL функций UCASE и MID.

Мы “вырезали” из значений наименований профилей по 5 символов, начиная с 3-го, и получили кучу повторяющегося “мусора”. Для того чтобы оставить только уникальные значения будем использовать ключевое слово DISTINCT.

SELECT DISTINCT UCASE(MID(P_NAME,3,5)) AS FROM D_PROFILE


Выбор уникальных значений агрегатной функции.

Иногда приходится в качестве аргументов функции MID использовать выражения с функцией LEN. В следующем примере мы уже выводим последние 5 символов в наименованиях профилей.

SELECT UCASE(MID(P_NAME,LEN(P_NAME)-4,5)) FROM D_PROFILE


Использование SQL функции LEN.

Шаг 18. Использование SQL функций в критерии отбора записей. Оператор HAVING

Разобравшись с функциями, практически сразу возникает вопрос, как их можно использовать в критериях отбора записей? Некоторые функции, а именно те, которые не являются агрегатными - использовать достаточно легко. Вот, например, список сотрудников, чье Ф.И.О. более 25 символов.

SELECT S_NAME FROM D_STAFF WHERE LEN(D_STAFF.S_NAME) > 25


Использование неагрегатной функции LEN в условиях SQL запроса.

Ну а если вам, к примеру, необходимо вывести идентификаторы всех должностей, которые занимают более одного сотрудника в компании, то такой подход не подойдет. Я имею в виду то, что следующий запрос, может быть, и не лишен какого-то смысла, но он неверный с точки зрения структурированного запроса. Это связано с тем, что для корректной обработки подобных SQL запросов с использованием агрегатных функций одного линейного прохода по записям сотрудников будет мало.

SELECT S_POSITION FROM D_STAFF WHERE COUNT(S_POSITION)>1

Для таких случаев в SQL ввели ключевое слово HAVING, которое поможет нам решить проблему с должностями и сотрудниками.

SELECT S_POSITION FROM D_STAFF GROUP BY S_POSITION HAVING COUNT(S_POSITION)>1


Использование агрегатных функций в условиях SQL запроса.

Шаг 19. Группировка данных в результатах SQL запроса оператором GROUP BY

Оператор GROUP BY необходим для группировки значений агрегатных функций по значениям связанных с ними полей. Он необходим, когда мы хотим использовать значение агрегатной функции в критерии отбора записей (предыдущий шаг). Он также необходим, когда мы хотим включить в результат запроса значение агрегатной функции. Но в самом простом варианте группировка эквивалента выделению уникальных значений колонки. Смотрим пример запроса.

SELECT S_POSITION FROM D_STAFF


А это два варианта, позволяющие вывести только уникальные значения S_POSITION.

SELECT S_POSITION FROM D_STAFF GROUP BY S_POSITION

SELECT DISTINCT S_POSITION FROM D_STAFF


Ну а теперь вернемся к группировке значений функций по значениям связанных с ними полей. Выведем для каждого профиля пользователя количество ассоциированных с ним записей в таблице D_STAFF_PROFILE.

SELECT PROFILE_ID AS , COUNT(PROFILE_ID) AS [КОЛИЧЕСТВО ЗАПИСЕЙ] FROM D_STAFF_PROFILE GROUP BY PROFILE_ID


Использование агрегатной SQL функции вместе с группировкой.

Оператор GROUP BY позволяет также группировать результат запроса более чем по одному полю, перечисляя их через запятую. Я надеюсь, что после всего вышесказанного дополнительные комментарии к результату последнего запроса не нужны.

SELECT S.S_POSITION AS , S.S_NAME AS [СОТРУДНИК], COUNT(SP.STAFF_ID) AS [КОЛИЧЕСТВО ЗАПИСЕЙ В ТАБЛИЦЕ D_STAFF_PROFILE] FROM D_STAFF S, D_STAFF_PROFILE SP WHERE S.XD_IID=SP.STAFF_ID GROUP BY S.S_POSITION, S.S_NAME


Группировка строк результата SQL запроса по нескольким полям.

Встроенные функции SQL предназначены для облегчения и ускорения обработки данных. Особенностью является то, что они могут указываться непосредственно в выражении. Все встроенные функции можно условно разделить на группы.

Математические функции :

    ABS (значение ) – возвращает абсолютное значение числа;

    Round (значение, точность ) – возвращает числовое значение, округленное до указанного аргументом точность количества десятичных разрядов;

    SIGN (значение ) – возвращает минус, если число отрицательное, и плюс – в противном случае;

    POWER (значение, степень ) – возводит число в степень;

    SQRT (значение ) – извлекает квадратный корень числа;

    CEILING (значение) – возвращает ближайшее целое число большее или равное значению;

    - FLOOR (значение) – возвращает ближайшее целое число меньшее или равное значению.

Строковые функции:

    ASCII (строка ) – возвращает ASCII код первого символа строки;

    CH A R (число )– возвращают символ по ASCII коду;

    LEN (строка )– возвращает длину строки в символах, исключая конечные пробелы;

    L TRIM (строка) / RTRIM (строка)- удаляет пробелы в начале/конце строки;

    LEFT (строка, число) / R IGHT (строка, число) – возвращает указанное аргументом число количество символов строки, начиная с левого/правого края;

    SUBSTRING (строка, позиция, длина ) – возвращает подстроку указанной длины из строки, начиная с указанной позиции;

    LOWER (строка) / UPPER (строка ) – возвращает строку, преобразованную в нижний / верхний регистр и т.д.

Функции для работы с датами:

    GETDATE () – возвращает значение, которое содержит дату и время компьютера, на котором запущен экземпляр SQL Server;

    DAY (значение_дата) –возвращает число из указанной даты;

    MONTH (значение_дата) – возвращает номер месяца из указанной даты;

    YEAR (значение_дата) – возвращает значение года из указанной даты;

    DATENANE(часть, значение_дата ) – возвращает символьную строку, представляющую указанную часть (Day , Month , Hour и т.д. ) из указанной даты;

    DATEPART(часть, значение_дата ) – возвращает целое число, представляющее указанную часть (Day , Month , Hour и т.д. ) из указанной даты.

Функции преобразования типов данных

    CAST (значение AS тип_данных )

    CONVERT (тип_данных , значение )

Аргумент значение в функциях задает величину, которую необходимо преобразовать.

7.3. Команды языка определения данных

Язык определения данных содержит команды, которые предназначены для создания, изменения и удаления базы данных и ее объектов.

Создание таблицы

Создание новой таблицы выполняется командой CREATE TABLE. В команде выполняется описание структуры таблицы, каждого столбца таблицы и ограничений целостности, которые должны устанавливаться для таблицы.

Синтаксис команды:

CREATE TABLE имя_таблицы ({ описание_столбца | имя_вычисляемого_столбца AS выражение | ограничения_целостности_уровня_таблицы} [, ...])

Именем таблицы является идентификатор длинной не более 128 символов.

Таблица может содержать вычисляемый столбец, тогда значение столбца определяется выражением, которое хранится в структуре таблицы. Изменять данные вычисляемого столбца нельзя, поэтому для него не могут быть установлены ограничения целостности NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY и значение DEFAULT.

Синтаксис описания столбца таблицы имеет вид:

имя_столбца тип_данных [(размер) ]

[{DEFAULT значение_по_умолчанию | IDENTITY [(значение, шаг) ]}]

[ограничения_целостности_уровня_столбца]

DEFAULT - позволяет задать значение, присваиваемое столбцу во вновь добавляемой записи.

IDENTITY – указывает, что создается столбец с поддержкой автоматической нумерации (столбец-счетчик). В таблице может быть определен только один столбец-счетчик. Параметр значение задает начальное значение счетчика, а параметр шаг – шаг приращения. Если эти параметры не заданы, то они имеют значение 1. IDENTITY может быть задано только для тех столбцов, которые имеют целочисленные или десятичные типы. Вставка значений в столбец IDENTITY запрещена.

Существует две группы ограничений целостности, обрабатываемых СУБД:

Декларативные ограничения целостности, которые объявляются при создании или изменении таблицы;

Процедурные ограничения целостности, которые обрабатываются триггерами.

Декларативные ограничения целостности могут быть ограничениями на уровне таблицы и ограничениями на уровне таблицы. Ограничения на уровне столбца применяется только к одному столбцу. Каждому декларативному ограничению целостности может быть присвоено имя.

Описание ограничений уровня столбца имеет следующий синтаксис:

{{PRIMARY KEY | UNIQUE | NOT NULL } |FOREIGN KEY REFERENCES имя_таблицы(имя_столбца )

|CHECK логическое_выражение}

Имя ограничения целостности данных должно быть уникальным в пределах базы данных. Рассмотрим ограничения, которые могут быть определены на уровне столбца:

Ограничение по первичному ключу PRIMARY KEY. Все значения первичного ключа таблицы должны быть уникальными и отличаться от значения Null. В таблице может быть только один первичный ключ. Если он является составным, то ограничения целостности по первичному ключу задаются на уровне таблицы;

Ограничения уникальности значения столбца UNIQUE. Это означает, что в таблице не может быть двух записей, имеющих одно и то же значение в этом столбце;

Ограничение NOT NULL, запрещающее хранить в столбце значение NULL;

Ограничение по внешнему ключу FOREIGN KEY (ограничение ссылочной целостности). Для столбца, который является внешним ключом, с помощью REFERENCES указывается имя таблицы, с которой устанавливается связь, и имя столбца этой таблицы, по которому будет устанавливаться связь. Такая таблица является главной (родительской) по отношению к создаваемой таблице. Для столбца главной таблицы, по значениям которого устанавливается связь, должно быть установлено ограничение PRIMARY KEY.

Если ключ внешней таблицы состоит из нескольких полей, то ограничение FOREIGN KEY должно задаваться на уровне таблицы. При этом следует перечислить все столбцы, входящие во внешний ключ, указать имя главной таблицы и имена столбцов главной таблицы, на которые ссылается внешний ключ.

Ссылочная целостность устанавливает правила добавления и изменения данных в таблице при помощи внешнего ключа и соответствующего ему ограничения первичного ключа. Предложения ON UPDATE и ON DELETE для внешнего ключа определяют следующие правила изменения связанных данных:

NO ACTION – разрешает изменять (удалять) только те значения в главной таблице, которые не имеют соответствующих значений внешнего ключа в дочерней таблице. Данное правило действует по умолчанию;

CASCADE означает, что каждое значение внешнего ключа дочерней таблицы будет автоматически изменяться (удаляться) при модификации значения первичного ключа родительской таблице;

SET NULL означает, что в случае изменения (удаления) первичного ключа родительской таблицы, во всех ссылающихся строках дочерней таблицы значениям внешнего ключа будут автоматически присвоены значения NULL;

SET DEFAULT означает, что в случае изменения (удаления) первичного ключа родительской таблицы, во всех ссылающихся строках дочерней таблицы значениям внешнего ключа будут автоматически присвоены значения по умолчанию.

Дополним пример учебной базы данных «Университет», проектирование которой рассматривалось в гл. 4.3 таблицами ДИСЦИПЛИНА и ОБЩАЯ ВЕДОМОСТЬ. В таблицах 6,7 описана логическая структура таблиц.

Таблица 6

Логическая структура информационного объекта ДИСЦИПЛИНА

Таблица 7

Логическая структура информационного объекта ОБЩАЯ ВЕДОМОСТЬ

Признак ключа

Формат поля

Наименование

Точность

Номер зачетной книжки

Зарегистрированный номер зачетной книжки студента

текстовый

Код дисциплины

Код дисциплины

Числовой

Длинное целое

числовой

Приведем запросы на создание таблиц в соответствии с приведенной на рис. 35 инфологической моделью БД.

Рис. 35. Схема базы данных «Университет»

Как видно из схемы БД таблица ФАКУЛЬТЕТ является независимой таблицей, поэтому она создается первой. Запрос на создание таблицы с учетом описания логической структуры в табл. 4 (стр.61) будет иметь вид:

CREATE TABLE факультет

([номер факультета] tinyint PRIMARY KEY , [наименование факультета] char(50))

Таблица СПЕЦИАЛЬНОСТЬ также является независимой, ее создаем второй. При создании запроса использует описание логической структуры в табл. 5 (стр.62).

CREATE TABLE [специальность] (

[номер специальности] int PRIMARY KEY,

[наименование специальности] char (60),

[стоимость обучения] )

Таблица ГРУППА является зависимой от ФАКУЛЬТЕТА и СПЕЦИАЛЬНОСТИ таблицей. Используем таблицу 3 (стр. 61) при создании запроса и учтем, что столбцы номер факультета и номер специальности являются внешними ключами:

CREATE TABLE [группа] (

[номер группы] smallint PRIMARY KEY,

[номер специальности] int FOREIGN KEY REFERENCES специальность(номер специаль - ности )ON DELETE CASCADE ON UPDADE CASCADE,

[номер факультета] tinyint FOREIGN KEY REFERENCES факультет(номер факультета ) ON DELETE CASCADE ON UPDADE CASCADE, [номер курса] tinyint)

Таблица СТУДЕНТ является зависимой от ГРУППЫ таблицей. На основании данных таблицы 2 (стр. 60) составим запрос. Также учтем, что столбец номер группы является внешними ключами:

CREATE TABLE [студент] (

[номер группы] smallint NOT NULL FOREIGN KEY REFERENCES группа(номер группы ) ,

[фамилия] char(15) NOT NULL ,

[дата рождения] datetime NOT NULL ,

[коммерческий] bit NOT NULL ,

[имя регистрации] char(9))

Данные таблицы ОБЩАЯ ВЕДОМОСТЬ зависят от таблиц СТУДЕНТ и ДИСЦИПЛИНА. В этой таблице первичный ключ составной и каждый из столбцов первичного ключа является внешним ключом (см. табл. 7 и рис. 35).

Воспользуемся описанием логической структуры таблицы дисциплина, приведенной в таблице 6 и составим запрос:

CREATE TABLE [дисциплина] (

[код дисциплины] int PRIMARY KEY,

[наименование дисциплины] char(50))

Теперь можно создать запрос на создание таблицы общая ведомость. Так как первичный ключ таблицы является составным, то ограничение PRIMARY KEY должно задаваться на уровне таблицы. Для примера зададим ограничения FOREIGN KEY также на уровне таблицы. Запрос будет иметь вид:

CREATE TABLE [общая ведомость] (

[код дисциплины] int,

[номер зачетной книжки] char(8),

[оценка] NOT NULL , PRIMARY KEY ([код дисциплины],[номер зачетной книжки]), FOREIGN KEY ([код дисциплины]) REFERENCES [дисциплина] ([код дисциплины]), FOREIGN KEY ([номер зачетной книжки]) REFERENCES [студент] ([номер зачетной книжки]))

Изменение структуры таблицы

Изменение структуры таблицы выполняется командой ALTER TABLE. С помощью команды можно выполнять изменение свойств существующих столбцов, удалять их или добавлять в таблицу новые столбцы, управлять ограничениями целостности, как на уровне столбцов, так и на уровне таблицы. Назначение многих параметров и ключевых слов аналогично назначению соответствующих параметров и ключевых слов команды CREATE TABLE.

Удаление таблицы

Удаление таблицы выполняется при помощи команды DROP TABLE. Синтаксис команды:

DROP TABLE таблица

Например, запрос на удаление таблицы СТУДЕНТ имеет следующий вид:

DROP TABLE Студент

При удалении таблицы СЛЕДУЕТ учитывать связи установленные в базе данных между таблицами. Если на удаляемую таблицу с помощью ограничения целостности FOREIGN KEY ссылается другая таблица, то СУБД не разрешит ее удаление.

Создание индекса

Индексы используют для ускорения доступа к конкретным данным в таблице базы данных. Индекс является структурой, которая упорядочивает значения в одном или нескольких столбцах таблицы базы данных, например, в столбце Фамилий таблицы СТУДЕНТ. Если проводится поиск конкретного студента по фамилии, индекс помогает получить нужные сведения быстрее по сравнению с поиском по всем строкам таблицы.

Индекс обеспечивает указатели на значения данных, сохраненные в определенных столбцах таблицы, и упорядочивает эти указатели согласно заданному порядку сортировки. Поиск данных в таблице с использованием индекса аналогичен поиску в предметным указателе в книге. Сначала проводится поиск конкретного значения в предметном указателе, а затем выполняется соответствующий переход по указателю на строку, содержащую это значение.

Создание индекса выполняется командой CREATE INDEX:

CREATE INDEX

имя_ индекса ON имя_таблицы (столбец [,…])

где UNIQUE – указывает на то, что индекс должен хранить только уникальные значения.

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

Пример: Создать составной индекса в таблице СТУДЕНТ для полей Фамилия и Дата рождения

CREATE INDEX Ind_Fam ON

Студент(Фамилия, [Дата рождения] DESC)

Индекс для таблицы следует создавать только в том случае, если предполагается часто выполнять запросы по данным в индексированных столбцах. Индексы занимают место на диске и замедляют операции добавления, удаления и обновления строк.

Удаление индекса таблицы

Удаляет индекс из таблицы команда DROP. Синтаксис команды DROP на удаление индекса:

DROP INDEX индекс ON таблица

Перед удалением индекса из таблицы или самой таблицы ее необходимо закрыть.

Пример: Удалить индекс Ind_Fam из таблицы СТУДЕНТ

DROP INDEX Ind_Fam ON Студент