Основы T-SQL. Основные моменты при изучении Sql

Аннотация: Определяется процесс создания базы данных. Описываются операторы создания, изменения базы данных. Рассматривается возможность указания имени файла или нескольких файлов для хранения данных, размеров и местоположения файлов. Анализируются операторы создания, изменения, удаления пользовательских таблиц. Приводится описание параметров для объявления столбцов таблицы. Дается понятие и характеристика индексов. Рассматриваются операторы создания и изменения индексов. Определяется роль индексов в повышении эффективности выполнения операторов SQL.

База данных

Создание базы данных

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

Стандарт SQL оставляет за разработчиками СУБД право выбора конкретного механизма создания и уничтожения каталогов , однако механизм создания и удаления схем регламентируется посредством операторов CREATE SCHEMA и DROP SCHEMA . В стандарте также указано, что в рамках оператора создания схемы должна существовать возможность определения диапазона привилегий, доступных пользователям создаваемой схемы . Однако конкретные способы определения подобных привилегий в разных СУБД различаются.

В настоящее время операторы CREATE SCHEMA и DROP SCHEMA реализованы в очень немногих СУБД. В других реализациях, например, в СУБД MS SQL Server, используется оператор CREATE DATABASE .

Создание базы данных в среде MS SQL Server

Процесс создания базы данных в системе SQL-сервера состоит из двух этапов: сначала организуется сама база данных , а затем принадлежащий ей журнал транзакций . Информация размещается в соответствующих файлах, имеющих расширения *.mdf (для базы данных ) и *.ldf . (для журнала транзакций ). В файле базы данных записываются сведения об основных объектах (таблицах , индексах , представлениях и т.д.), а в файле журнала транзакций – о процессе работы с транзакциями (контроль целостности данных, состояния базы данных до и после выполнения транзакций).

Создание базы данных в системе SQL-сервер осуществляется командой CREATE DATABASE . Следует отметить, что процедура создания базы данных в SQL-сервере требует наличия прав администратора сервера.

<определение_базы_данных> ::= CREATE DATABASE имя_базы_данных [ <определение_файла> [,...n] ] [,<определение_группы> [,...n] ] ] [ LOG ON {<определение_файла>[,...n] } ] [ FOR LOAD | FOR ATTACH ]

Рассмотрим основные параметры представленного оператора.

При выборе имени базы данных следует руководствоваться общими правилами именования объектов. Если имя базы данных содержит пробелы или любые другие недопустимые символы, оно заключается в ограничители (двойные кавычки или квадратные скобки). Имя базы данных должно быть уникальным в пределах сервера и не может превышать 128 символов.

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

Параметр ON определяет список файлов на диске для размещения информации, хранящейся в базе данных .

Параметр PRIMARY определяет первичный файл . Если он опущен, то первичным является первый файл в списке.

Параметр LOG ON определяет список файлов на диске для размещения журнала транзакций . Имя файла для журнала транзакций генерируется на основе имени базы данных , и в конце к нему добавляются символы _log .

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

<определение_файла>::= ([ NAME=логическое_имя_файла,] FILENAME="физическое_имя_файла" [,SIZE=размер_файла ] [,MAXSIZE={max_размер_файла |UNLIMITED } ] [, FILEGROWTH=величина_прироста ])[,...n]

Здесь логическое имя файла – это имя файла, под которым он будет опознаваться при выполнении различных SQL-команд.

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

Параметр SIZE определяет первоначальный размер файла; минимальный размер параметра – 512 Кб, если он не указан, по умолчанию принимается 1 Мб.

Параметр MAXSIZE определяет максимальный размер файла базы данных . При значении параметра UNLIMITED максимальный размер базы данных ограничивается свободным местом на диске.

При создании базы данных можно разрешить или запретить автоматический рост ее размера (это определяется параметром FILEGROWTH ) и указать приращение с помощью абсолютной величины в Мб или процентным соотношением. Значение может быть указано в килобайтах, мегабайтах, гигабайтах, терабайтах или процентах (%). Если указано число без суффикса МБ, КБ или %, то по умолчанию используется значение MБ. Если размер шага роста указан в процентах (%), размер увеличивается на заданную часть в процентах от размера файла. Указанный размер округляется до ближайших 64 КБ.

Дополнительные файлы могут быть включены в группу:

<определение_группы>::=FILEGROUP имя_группы_файлов <определение_файла>[,...n]

Пример 3.1 . Создать базу данных , причем для данных определить три файла на диске C, для журнала транзакций – два файла на диске C.

CREATE DATABASE Archive ON PRIMARY (NAME=Arch1, FILENAME=’c:\user\data\archdat1.mdf’, SIZE=100MB, MAXSIZE=200, FILEGROWTH=20), (NAME=Arch2, FILENAME=’c:\user\data\archdat2.mdf’, SIZE=100MB, MAXSIZE=200, FILEGROWTH=20), (NAME=Arch3, FILENAME=’c:\user\data\archdat3.mdf’, SIZE=100MB, MAXSIZE=200, FILEGROWTH=20) LOG ON (NAME=Archlog1, FILENAME=’c:\user\data\archlog1.ldf’, SIZE=100MB, MAXSIZE=200, FILEGROWTH=20), (NAME=Archlog2, FILENAME=’c:\user\data\archlog2.ldf’, SIZE=100MB, MAXSIZE=200, FILEGROWTH=20) Пример 3.1. Создание базы данных.

Введение

Эта статья открывает небольшой цикл, посвященный азам взаимодействия с базами данных (БД) в Java и введению в SQL . Многие программы заняты обработкой и модификацией информации, её поддержкой в актуальном состоянии. Поскольку данные - весьма важная часть логики программ, то под них зачастую выделяют отдельное хранилище. Информация в нём структурирована и подчинена специальным правилам, чтобы обеспечить правильность обработки и хранения. Доступ к данным и их изменение осуществляется с помощью специального языка запросов - SQL (Structured Query Language). Система управления базами данных - это ПО, которое обеспечивает взаимодействие разных внешних программ с данными и дополнительные службы (журналирование, восстановление, резервное копирование и тому подобное), в том числе посредством SQL. То есть программная прослойка между данными и внешними программами с ними работающими. В этой части ответим на вопросы что такое SQL, что такое SQL сервер и создадим первую программу для взаимодействия с СУБД.

Виды СУБД

Существует несколько видов СУБД по способу организации хранения данных:
  • Иерархические. Данные организованы в виде древовидной структуры. Пример - файловая система, которая начинается с корня диска и далее прирастает ветвями файлов разных типов и папок разной степени вложенности.
  • Сетевые. Видоизменение иерархической, у каждого узла может быть больше одного родителя.
  • Объектно-ориентированные. Данные организованы в виде классов/объектов c их атрибутами и принципами взаимодействия согласно ООП.
  • Реляционные. Данные этого вида СУБД организованы в таблицах. Таблицы могут быть связаны друг с другом, информация в них структурирована.
В цикле статей будем рассматривать именно реляционные СУБД (как самые распространённые) на примере H2 и создавать с нуля приложение, эмулирующую подобие работы биржи. Вопрос: Почему не PostgreSQL, MySQL, MSSQL или Oracle? Ответ: Чтобы не отвлекаться на вопросы установки отдельного комплекса программ. Дальнейшей настройки, создания БД, тонкостей работы в разных ОС, версий. Для работы с H2 необходимо совершить минимум действий. Но ничего не мешает поменять текущую H2 JDBC на реляционную СУБД другого производителя (изменяется только строка адреса сервера и имя класса драйвера).

SQL

Внешние программы формируют запросы к СУБД на языке управления данными Structured Query Language. Что такое SQL и чем отличается от привычных языков программирования? Одна из особенностей SQL – декларативность. То есть, SQL - декларативный язык . Это значит, что, вбивая команды, то есть, создавая запросы к SQL-серверу, мы описываем, что именно хотим получить, а не каким способом. Посылая серверу запрос SELECT * FROM CUSTOMER (приблизительный перевод с SQL на русский: «сделать выборку из таблицы COSTUMER, выборка состоит из всех строк таблица» ), мы получим данные по всем пользователям. Совершенно неважно, как и откуда сервер загрузит и сформирует интересующие нас данные. Главное – правильно сформулировать запрос.
  • Что такое SQL-Сервер и как он работает? Взаимодействие с СУБД происходит по клиент-серверному принципу. Некая внешняя программа посылает запрос в виде операторов и команд на языке SQL, СУБД его обрабатывает и высылает ответ. Для упрощения примем, что SQL Сервер = СУБД.
Если вы умеете управлять легковым автомобилем одной марки, вы, скорее всего, без особых проблем сможете сесть за руль и других. Основы вождения везде одинаковы, за исключением небольших деталей. Аналогично и для SQL-серверов разных производителей - у каждого из них своя версия SQL, но она удовлетворяет заданным стандартам (SQL92, SQL2003 …). Мы будем использовать операторы и команды в рамках SQL92. Основные SQL-операторы подразделяют на следующие группы:
  • Data Definition Language (DDL ) – определения данных. Создание структуры БД и её объектов;
  • Data Manipulation Language(DML ) – собственно взаимодействие с данными: вставка, удаление, изменение и чтение;
  • Transaction Control Language (TCL ) – управление транзакциями;
  • Data Control Language(DCL ) – управление правами доступа к данным и структурам БД.
В цикле статей мы рассмотрим первые три группы, особо уделяя внимание DML.

JDBC

В 80-е годы прошлого века персональные компьютеры типа PC XT/AT завоевали рынок. Во многом это произошло благодаря модульности их конструкции. Это означает, что пользователь мог довольно просто менять ту или иную составную часть своего компьютера (процессор, видеокарту, диски и тому подобное). Это замечательное свойство сохранилось и поныне: мы меняем видеокарту и обновляем драйвер (иногда он и вовсе обновляется сам, в автоматическом режиме). Чаще всего при таких манипуляциях ничего плохого не происходит, и существующие программы продолжат работать с обновившейся системой без переустановки. Аналогично и для работы в Java с СУБД. Для стандартизации работы с SQL-серверами взаимодействие с ней можно выполнять через единую точку - JDBC (Java DataBase Connectivity). Она представляет собой реализацию пакета java.sql для работы с СУБД. Производители всех популярных SQL-серверов выпускают для них драйверы JDBC. Рассмотрим схему ниже. Приложение использует экземпляры классов из java.sql . Затем мы передаем необходимые команды для получения/модификации данных. Далее java.sql через jdbc-драйвер взаимодействует с СУБД и возвращает нам готовый результат. Для перехода на СУБД другого производителя часто достаточно сменить JDBC и выполнить базовые настройки. Остальные части программы при этом не меняются.

Первая программа

Приступим к практической части. Создадим Java-проект с помощью IDE JetBrains IntelliJ IDEA . Заметим, что редакция Ultimate Edition содержит в своём составе замечательный инструмент для работы с SQL и БД - Data Grip . Однако она платная для большинства пользователей. Так что нам для учебных целей остается использовать общедоступную IntelliJ IDEA Community Edition . Итак: Теперь мы умеем подключаться к СУБД и отключаться от неё. Каждый шаг отражается в консоли. При первом подключении к СУБД создаётся файл базы данных stockExchange.mv.db .

Разбор кода

Собственно код: package sql. demo; import java. sql. *; public class StockExchangeDB { // Блок объявления констант public static final String DB_URL = "jdbc:h2:/c:/JavaPrj/SQLDemo/db/stockExchange" ; public static final String DB_Driver = "org.h2.Driver" ; public static void main (String args) { try { Class. forName (DB_Driver) ; //Проверяем наличие JDBC драйвера для работы с БД Connection connection = DriverManager. getConnection (DB_URL) ; //соединениесБД System. out. println ("Соединение с СУБД выполнено." ) ; connection. close () ; // отключение от БД System. out. println ("Отключение от СУБД выполнено." ) ; } catch (ClassNotFoundException e) { e. printStackTrace () ; // обработка ошибки Class.forName System. out. println ("JDBC драйвер для СУБД не найден!" ) ; } catch (SQLException e) { e. printStackTrace () ; // обработка ошибок DriverManager.getConnection System. out. println ("Ошибка SQL !" ) ; } } }

Блок констант:

  1. DB_Driver : Здесь мы определили имя драйвера, которое можно узнать, например, кликнув мышкой на подключенную библиотеку и развернув её структуру в директории lib текущего проекта.
  2. DB_URL : Адрес нашей базы данных. Состоит из данных, разделённых двоеточием:
  3. Протокол=jdbc
  4. Вендор (производитель/наименование) СУБД=h2
  5. Расположение СУБД, в нашем случае путь до файла (c:/JavaPrj/SQLDemo/db/stockExchange). Для сетевых СУБД тут дополнительно указываются имена или IP адреса удалённых серверов, TCP/UDP номера портов и так далее.

Обработка ошибок:

Вызов методов нашего кода может вернуть ошибки, на которые следует обратить внимание. На данном этапе мы просто информируем о них в консоли. Заметим, что ошибки при работе с СУБД - это чаще всего SQLException .

Логика работы:

  1. Class.forName (DB_Driver) – убеждаемся в наличии соответствующего JDBC-драйвера (который мы ранее загрузили и установили).
  2. DriverManager.getConnection (DB_URL) – устанавливаем соединение СУБД. По переданному адресу, JDBC сама определит тип и местоположение нашей СУБД и вернёт Connection, который мы можем использовать для связи с БД.
  3. connection.close() – закрываем соединение с СУБД и завершаем работу с программой.
В следующей части цикла мы познакомимся с DDL-операторами и типами SQL-данных, а также создадим начальную структуру нашей БД и наполним её таблицами.

Каждый веб-разработчик должен знать SQL, чтобы писать запросы к базам данных. И, хотя, phpMyAdmin никто не отменял, зачастую необходимо испачкать руки, чтобы написать низкоуровневый SQL.

Именно поэтому мы подготовили краткий экскурс по основам SQL. Начнем же!

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

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

Создадим простую таблицу по имени month . Она состоит из 3 колонок:

  • id – Номер месяца в календарном году (целое число).
  • name – Название месяца (строка, максимум 10 символов).
  • days – Количество дней в этом месяце (целое число).

Вот как будет выглядеть соответствующий SQL запрос:

CREATE TABLE months (id int, name varchar(10), days int);

Также при создании таблиц целесообразно добавить первичный ключ для одной из колонок. Это позволит держать записи уникальными и ускорит запросы на выборку. Пусть в нашем случае уникальным будет название месяца (столбец name )

CREATE TABLE months (id int, name varchar(10), days int, PRIMARY KEY (name));

Дата и время
Тип данных Описание
DATE Значения даты
DATETIME Значения даты и времени с точностью до минты
TIME Значения времени

2. Вставка строк

Теперь давайте заполнять нашу таблицу months полезной информацией. Добавление записей в таблицу производится через инструкцию INSERT . Есть два способа записи этой инструкции.

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

Этот способ записи прост, но небезопасен, поскольку нет гарантии, что по мере расширения проекта и редактировании таблицы, столбцы будут располагаться в том же порядке, что и ранее. Безопасный (и в тоже время более громоздкий) способ записи инструкции INSERT требует указания как значений, так и порядка следования столбцов:

Здесь первое значение в списке VALUES соответствует первому указанному имени столбца и т.д.

3. Извлечение данных из таблиц

Инструкция SELECT - наш лучший друг, когда мы хотим получить данные из базы данных. Она используется очень часто, так что отнеситесь к этому разделу очень внимательно.

Самый простое использование инструкции SELECT - запрос, который возвращает все столбцы и строки из таблицы (например, таблицы по имени characters ):

SELECT * FROM "characters"

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

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

SELECT id, name FROM month

Кроме того, во многих случаях мы хотим, чтобы полученные результаты были отсортированы в определенном порядке. В SQL мы делаем это с помощью ORDER BY . Он может принимать опциональный модификатор – ASC (по-умолчанию) сортирующий по возрастанию или DESC , сортирующий по убыванию:

SELECT id, name FROM month ORDER BY name DESC

При использовании ORDER BY убедитесь, что оно будет последним в инструкции SELECT . В противном случае будет выдано сообщение об ошибке.

4. Фильтрация данных

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

В этом запросе мы выбираем только те месяцы из таблицы month , в которых больше 30 дней с помощью оператора больше (>).

SELECT id, name FROM month WHERE days > 30

5. Расширенная фильтрация данных. Операторы AND и OR

Ранее мы использовали фильтрацию данных с использованием одного критерия. Для более сложной фильтрации данных можно использовать операторы AND и OR и операторов сравнения (=,<,>,<=,>=,<>).

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


SELECT * FROM albums WHERE genre = "рок" AND sales_in_millions <= 50 ORDER BY released

6. In/Between/Like

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

  • IN – служит для указания диапазона условий, любое из которых может быть выполнено
  • BETWEEN – проверяет, находится ли значение в указанном диапазоне
  • LIKE – ищет по определенным паттернам

Например, если мы хотим выбрать альбомы с поп и соул музыкой, мы можем использовать IN("value1","value2") .

SELECT * FROM albums WHERE genre IN ("pop","soul");

Если мы хотим получить все альбомы, изданные между 1975 и 1985годами, мы должны записать:

SELECT * FROM albums WHERE released BETWEEN 1975 AND 1985;

7. Функции

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

  • COUNT() – возвращает количество строк
  • SUM() – возвращает общую сумму числового столбца
  • AVG() – возвращает среднее значение из множества значений
  • MIN() / MAX() – получает минимальное / максимальное значение из столбца

Чтобы получить самый последний год в нашей таблице мы должны записать такой SQL запрос:

SELECT MAX(released) FROM albums;

8. Подзапросы

В предыдущем пункте мы научились делать простые расчеты с данными. Если мы хотим использовать результат от этих расчетов, нам не обойтись без вложенных запросов. Допустим, мы хотим вывести artist , album и release year для старейшего альбома в таблице.

Мы знаем, как получить эти конкретные столбцы:

SELECT artist, album, released FROM albums;

Мы также знаем, как получить самый ранний год:

SELECT MIN(released) FROM album;

Все, что нужно сейчас, - это объединить два запроса с помощью WHERE:

SELECT artist,album,released FROM albums WHERE released = (SELECT MIN(released) FROM albums);

9. Объединение таблиц

В более сложных базах данных существует несколько таблиц, связанных друг с другом. Например, ниже представлены две таблицы о видеоиграх (video_games ) и разработчиков видеоигр (game_developers ).


В таблице video_games есть колонка разработчик (developer_id ), но в ней содержится целое число, а не имя разработчика. Это число представляет собой идентификатор (id ) соответствующего разработчика из таблицы разработчиков игр (game_developers ), связывая логически два списка, что позволяет нам использовать информацию, хранящуюся в них обоих одновременно.

Если мы хотим создать запрос, который возвращает все, что нужно знать об играх, мы можем использовать INNER JOIN для связи колонок из обеих таблиц.

SELECT video_games.name, video_games.genre, game_developers.name, game_developers.country FROM video_games INNER JOIN game_developers ON video_games.developer_id = game_developers.id;

Это самый простой и наиболее распространенный тип JOIN . Есть несколько других вариантов, но они применимы к менее частым случаям.

10. Алиасы

Если вы посмотрите на предыдущий пример, то вы заметите, что существуют две колонки называемые name . Это сбивает с толку, так что давайте установим псевдоним одного из повторяющихся столбцов, например, name из таблицы game_developers будет называться developer .

Мы также можем сократить запрос задав псевдонимы имен таблиц: video_games назовем games , game_developers - devs :

SELECT games.name, games.genre, devs.name AS developer, devs.country FROM video_games AS games INNER JOIN game_developers AS devs ON games.developer_id = devs.id;

11. Обновление данных

Часто мы должны изменить данные в некоторых строках. В SQL это делается с помощью инструкции UPDATE . Инструкция UPDATE состоит из:

  • Таблицы, в которой находится значение для замены;
  • Имен столбцов и их новых значений;
  • Выбранные с помощью WHERE строки, которые мы хотим обновить. Если этого не сделать, то изменятся все строки в таблице.

Ниже приведена таблица tv_series с сериалами с их рейтингом. Однако, в таблицу закралась маленькая ошибка: хотя сериал Игра престолов и описывается как комедия, он на самом деле ей не является. Давайте исправим это!

Данные таблицы tv_series UPDATE tv_series SET genre = "драма" WHERE id = 2;

12. Удаление данных

Удаление строки таблицы с помощью SQL - это очень простой процесс. Все, что вам нужно, - это выбрать таблицу и строку, которую нужно удалить. Давайте удалим из предыдущего примера последнюю строку в таблице tv_series . Делается это с помощью инструкции >DELETE

DELETE FROM tv_series WHERE id = 4

Будьте осторожными при написании инструкции DELETE и убедитесь, что условие WHERE присутствует, иначе все строки таблицы будут удалены!

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

Если мы хотим, чтобы удалить все строки, но оставить саму таблицу, то воспользуйтесь командой TRUNCATE:

TRUNCATE TABLE table_name;

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

DROP TABLE table_name;

Будьте очень осторожны с этими командами. Их нельзя отменить!/p>

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

Разновидность языка, применяемая в конкретной СУБД, называется диалектом SQL . Например, диалект СУБДOracleназываетсяPL / SQL ; вMSSQLServerиDB2 применяется диалектTransact - SQL ; вInterbaseиFirebird–isql . Каждый диалектSQLсовместим до определенной степени со стандартомSQL, но может иметь отличия и специфические расширения языка, поэтому для выяснения синтаксиса того или иногоSQL-оператора следует в первую очередь смотретьHelp конкретной СУБД.

Для операций над базами данных и таблицами в стандарте sql предусмотрены операторы:

Ниже приводится синтаксис этих операторов по стандарту SQL92. Поскольку их синтаксис в СУБД может отличаться от стандарта, при выполнении лабораторной работы рекомендуется обращаться к справочной системе СУБД.

Имена объектов базы данных (таблиц, столбцов и др.) могут состоять из буквенно-цифровых символов и символа подчеркивания. Специальные символы (@$# и т.п.) обычно указывают на особый тип таблицы (системная, временная и др.). Не рекомендуется использовать в именах национальные (русские) символы, пробелы и зарезервированные слова, но если они всё же используются, то такие имена следует писать в кавычках ".." или в квадратных скобках [..].

Далее при описании конструкций операторов SQLбудут использоваться следующие обозначения: в квадратных скобках записываются необязательные части конструкции; альтернативные конструкции разделяются вертикальной чертой | ; фигурные скобки {} выделяют логические блоки конструкции; многоточиеуказывает на то, что предшествующая часть конструкции может многократно повторяться. «Раскрываемые» конструкции записываются в угловых скобках < >.

Создание базы данных

CREATE DATABASE Имя_базы_данных

Удаление одной и более баз данных

DROP DATABASE Имя_базы_данных [,Имя_базы_данных …]

Объявление текущей базы данных

USE Имя_базы_данных –- в SQL Server и MySQL

SET DATABASE Имя _ базы _ данных – в Firebird

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

CREATE TABLE Имя_таблицы (

<описание_столбца> [, <описание_столбца> |

<ограничение_целостности_таблицы> …]

< описание_столбца >

Имя_столбца ТИП

{NO ACTION|CASCADE|SET DEFAULT|SET NULL}]

ТИП столбца может быть либо стандартным типом данных (см. таблицу 1), либо именем домена (см. п.6.2).

Некоторые СУБД позволяют создавать вычислимые столбцы (computed columns ). Это виртуальные столбцы, значение которых не хранится в физической памяти, а вычисляется сервером СУБД при всяком обращении к этому столбцу по формуле, заданной при объявлении этого столбца. В формулу могут входить значения других столбцов этой строки, константы, встроенные функции и глобальные переменные.

Описание вычислимого столбца в SQL Server имеет вид:

<описание_столбца> Имя_столбца AS выражение

Описание вычислимого столбца в Firebird имеет вид:

<описание_столбца> Имя_столбца COMPUTED BY <выражение>

СУБД MySQL 3.23 вычислимые столбцы не поддерживает.

< >

CONSTRAINT Имя_ограничения_целостности

{UNIQUE|PRIMARY KEY}(список_столбцов_образующих_ключ )

|FOREIGN KEY (список _ столбцов _FK )

REFERENCES Имя_таблицы (список_столбцов_ PK )

{NO ACTION|CASCADE|SET DEFAULT|SET NULL}]

{NO ACTION|CASCADE|SET DEFAULT|SET NULL}]

|CHECK (условие_проверки )

Некоторые СУБД допускают объявление врéменных таблиц (существующих только во время сеанса). В SQL Server имена временных таблиц должны начинаться с символа # (локальные временные таблицы, видимые только создавшему их пользователю) или ## (глобальные таблицы, видимые всем пользователям); в MySQL для создания временных таблиц используется ключевое слово TEMPORARY, например:

CREATE TEMPORARY TABLE … (далее синтаксис см. CREATE TABLE).

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

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

ALTER TABLE Имя_таблицы

Изменение типа столбца (в SQLServerиFirebird)

ALTER COLUMN Имя_столбца новый_ТИП

Изменение типа, имени и ограничений столбца (в MySQL)

CHANGE COLUMN Имя_столбца <описание_столбца>

Добавление обычного или вычислимого столбца

|ADD <описание_столбца >

Добавление ограничения целостности

| ADD

<ограничение_целостности_таблицы >

Удаление столбца

|DROP COLUMN Имя_столбца

Удаление ограничения целостности

|DROP CONSTRAINT Имя_ограничения_целостности

Включение или отключение проверки ограничений целостности

ВMSSQLServer

|{CHECK|NO CHECK} CONSTRAINT

{Список_имен_ограничений_целостности |ALL}

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

DROP TABLE Имя_таблицы



Далее рассмотрим, как при создании новых таблиц командой CREATETABLEили изменении структуры существующих таблиц командойALTERTABLEобъявить декларативные ограничения целостности (подробнее они описаны в п.4.2) .

1. Обязательное наличие данных (NULL–значения)

Объявляется словом NULL(столбец может иметь пустые ячейки) илиNOT NULL(столбец обязательный). По умолчанию принимаетсяNULL.

Пример создания таблицы 7:

CREATE TABLE Clients(

ClientName NVARCHAR (60) NOT NULL ,

DateOfBirth DATE NULL ,

Phone CHAR (12)); -- по умолчанию тоже NULL

2. Значение по умолчанию (DEFAULT)

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

Рассмотрим пример создания таблицы Orders (Заказы). Столбец OrderDate принимает по умолчанию значение текущей даты, а столбец Quantity (количество) по умолчанию равен 0.

CREATE TABLE Orders(

OrderNum INT NOT NULL , -- номер заказа

OrderDate DATETIME NOT NULL -- дата заказа

DEFAULT GetDate(),

Функция GetDate() возвращает текущую дату 8

Quantity SMALLINT NOT NULL -- кол-во товара, DEFAULT 0);

3. Объявление первичных ключей (PRIMARYKEY)

Простой первичный ключ объявляется словами PRIMARYKEYпри создании таблицы. Например,

CREATE TABLE Staff(-- таблица "Работники"

TabNum INT PRIMARY KEY , -- первичный ключ

WName NVARCHAR (40) NOT NULL , -- ФИО

... -- описание прочих столбцов );

Составной первичный ключ объявляется иначе:

-- способ 1 (объявление PK при создании таблицы)

CREATE TABLE Clients(

PasSeria NUMERIC (4,0)NOT NULL ,-- серия паспорта

PasNumber NUMERIC (6,0)NOT NULL ,-- номер паспорта

Name NVARCHAR (40)NOT NULL ,

Phone CHAR (12),

-- объявление составного первичного ключа

CONSTRAINT Clients_PK

PRIMARY KEY (PasSeria,PasNumber));

-- способ 2(PK объявляется после создания таблицы)

-- сначала создаем таблицу без PK

CREATE TABLE Clients(

PasSeria NUMERIC (4,0)NOT NULL ,--серия паспорта

PasNumber NUMERIC (6,0)NOT NULL ,--номер паспорта

ClientName NVARCHAR (40)NOT NULL ,

Phone CHAR (12));

-- модификация таблицы добавляем РК

ALTER TABLE Clients

ADD CONSTRAINT Clients_PK

PRIMARY KEY (PasSeria,PasNumber);

4. Уникальность столбцов (UNIQUE)

Подобно Primary Key указывает, что столбец или группа столбцов не могут содержать повторяющихся значений, но не являютсяPK . Все столбцы, объявленныеUNIQUE, должны бытьNOTNULL. Пример объявления простого уникального столбца:

CREATE TABLE Students(

SCode INT PRIMARY KEY , -- суррогатный РК

FIO NVARCHAR (40) NOT NULL , -- ФИО

RecordBook CHAR (6) NOT NULL UNIQUE ); -- № зачетки

Пример объявления составного уникального поля:

CREATE TABLE Staff(-- таблица " Работники "

TabNum INT PRIMARY KEY , -- табельный номер

WName NVARCHAR (40) NOT NULL , -- ФИО

PasSeria NUMERIC (4,0) NOT NULL , -- серия паспорта

PasNumber NUMERIC (6,0) NOT NULL , -- номер паспорта

-- объявление составного уникального поля

CONSTRAINT Staff_UNQ UNIQUE (PasSeria,PasNumber));

5. Ограничения на значения столбца (CHECK)

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

Пример создания таблицы Workers (Работники) :

CREATE TABLE Workers(

-- табельные номера 4-значные

TabNum INT PRIMARY KEY

CHECK (TabNum BETWEEN 1000 AND 9999),

Name VARCHAR (60) NOT NULL , -- ФИО сотрудника

-- пол буква " м " или " ж "

Gentry CHAR (1) NOT NULL

CHECK (Gentry IN ("м","ж")),

Возраст не менее 14 лет

Age SMALLINT NOT NULL CHECK (Age>=14),

--№ свидет-ва пенсионного страхования (по маске)

PensionCert CHAR (14)

CHECK (PensionSert LIKE ""));

В этом примере показаны разные типы проверок. Диапазон допустимых значений указывается конструкцией BETWEEN…AND; обычные условия (как для столбцаAge ) используют знаки сравнений =, <>, >, >=, <, <=, связанные при необходимости логическими операциямиAND,OR,NOT(например,Age >=14ANDAge <=70); для указания списка допустимых значений используется предикатINи его отрицаниеNOTIN; конструкция

LIKEмаска_допустимых_значений EXCEPTсписок_исключений

используется для задания маски допустимых значений строковых столбцов. В маске применяются два спецсимвола: «%» – произвольная подстрока, и ­«_» – любой единичный символ. Конструкция EXCEPTявляется необязательной.

В условии отбора CHECKмогут сравниваться значения двух столбцов одной таблицы и столбцы разных таблиц.

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

Для реализации реляционной базы данных предложенной структуры в данной курсовой работе выбрана СУБД MS SQL Server - один из лидеров современного рынка реляционных СУБД, распространяемая свободно для разработки или тестирования приложений и лицензируемой для промышленного использования. Преимуществами MS SQL являются:

Высокая функциональность;

Полная поддержка стандарта SQL и его расширения T-SQL;

Широкая распространенность и доступность поддержки;

Надёжность;

Производительность.

Наличие встроенных средств для работы и администрирования БД.

MS SQL является лидером современного рынка реляционных СУБД. Актуальной стабильной версией MS SQL на момент написания работы была версия 2012. Установка данной СУБД не представляет трудностей. Процесс установки сопровождается мастером, который запрашивает у пользователя необходимые данные и дальше самостоятельно устанавливает сервер БД, настраивает его на оптимальное быстродействие.

Для создания базы данных в СУБД MS SQL использовались запросы на ста­н­­дартизированном языке SQL (англ. Structured Query Language, «Струк­ту­ри­ро­ванный язык запросов»). В процессе создания базы данных для всех ат­ри­бу­тов реляционной были указаны подходящие типы данных. Названия сущностей и атрибутов были переведены на английский язык, ключевые поля сфор­ми­ро­ва­ны с префикса «ID_» и суффикса, состоящего из имени связанной с ним таб­ли­цы. В таблице 8 показано соответствие названия сущности физической таблице в БД.

Таблица 8

Соответствие названия сущности физической таблице

Сущность

Виды транспорта

Физическая модель информационной системы в БД показана на рис. 5.

Рис. 5. Физическая модель информационной системы

Исходный код создания всех отношений базы данных представлен в Приложении к данной работе.

После создания базы данных её было наполнено пробным набором данных. Исходный код запросов на заполнение базы тестовым набором данных представлен в Приложении к данной работе.

Созданные на сервере таблицы базы данных показаны на рис. 6.

Рис. 6. Диаграмма данных сервера MS SQL

5. Разработка объектов базы данных, демонстрирующих логику предметной области

Для демонстрации работоспособности логики работы базы данных создадим в ней и продемонстрируем работу на тестовом наборе данных следующих объектов:

  • Представления;

    Хранимые процедуры;

    Триггеры.

Запросы на базу данных.

Представляют собой базовое средство для получения информации из базы данных. Для написания запроса используется стандарт SQL. Для демонстрации напишем запрос, выводящий перечень туристов, отправившихся отдыхать в отель «San Simeon Apartments», фамилии туристов отсортируем по алфавиту. Запрос и результат его выполнения показан на рис. 7.

Рис. 7. Результат выполнения запроса

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

Рис. 8. Представление и результат его работы

Хранимые процедуры. Это объекты в базе данных, позволяющие хранить в ней наборы инструкций по обработке и изменению данных. Текст процедуры пишется на диалекте языка SQL для MS SQL Server, называемом Transacts SQL или сокращенно T-SQL. Для демонстрации напишем хранимую процедуру, позволяющую изменять на заданный процент стоимость проживания во всех отелях. Текст хранимой процедуры показан на рис. 9.

Рис. 9. Хранимая процедура

Триггеры. Это специальная хранимая процедура, которая вызывается не пользователем, а самим сервером БД в ответ на событие INSERT, DELETE, UPDATE на указанной таблице. Триггеры широко используются программистами для автоматизации контроля и изменений данных в БД. Как правило, триггер работает незаметно для пользователя БД и проявляет себя тогда, когда он вводит ошибочные с точки зрения программиста данные. Припустим, что туристическое агентство не работает с детьми младше 10 лет. Напишем триггер, который не позволит ввести возраст туриста меньше 10 лет. Текст триггера показан на рис. 10.

Рис. 10. Триггер, не позволяющий внести возраст туриста меньше 10 лет