Особенности построения баз данных. Учебное пособие
.pdf−предложения модификации данных (добавление, удаление и изменение данных);
−предложения управления данными (предоставление и отмена привилегий на доступ к данным, управление транзакциями и др.). Кроме того, он предоставляет возможность выполнять в этих предложениях:
−арифметические вычисления (включая разнообразные функциональные преобразования), обработку текстовых строк и выполнение операций сравнения значений арифметических выражений и текстов;
−упорядочение строк и(или) столбцов при выводе содержимого таблиц на печать или экран дисплея;
−создание представлений (виртуальных таблиц), позволяющих пользователям иметь свой взгляд на данные без увеличения их объема в базе данных;
−запоминание выводимого по запросу содержимого таблицы, нескольких таблиц или представления в другой таблице (реляционная операция присваивания);
−агрегатирование данных: группирование данных и применение к этим группам таких операций, как среднее, сумма, максимум, минимум число элементов и т.п.
Впервые, достаточно полный функционально, вариант языка SQL был разработан и реализован в рамках проекта экспериментальной реляционной СУБД SystemR компании IBM (1974 – 79 гг.). Его исходным на-
званием было SEQUEL (Structured English Query Language).
Благодаря своей элегантности и машинной независимости, а также поддержке промышленными лидерами в технологии реляционных баз данных, SQL был признан стандартным языком и в обозримом будущем сохранит свои позиции.
Официальный стандарт языка SQL является совместной разработкой Американским институтом национальных стандартов (American National Standards Institute – ANSI) и Международной организацией по стандартам
(International Standards Organization – ISO).
Работа над официальным стандартом языка SQL началась с 1982 г.
В1989 г. был принят первый стандарт SQL (SQL1 или SQL/89). Он во многих частях имеет чрезвычайно общий характер и допускает очень широкое толкование. Поэтому на фоне завершения разработки этого стандарта была начата работа над стандартом SQL2. Она длилась несколько лет и в 1992 г. был выработан окончательный проект стандарта SQL2 (SQL/92).
В 2000 г. большинство коммерческих продуктов соответствовало SQL92. Даже сейчас еще не все элементы этого стандарта широко реализо-
51
ваны. Впрочем многие коммерческие СУБД расширяют SQL за рамки стандарта, добавляя другие возможности. В любой из версий отклонения от стандарта должны описываться в документации на программный продукт.
В 1999 г. был принят стандарт SQL3 (SQL/99).
Типовые операции по обработке записей реляционной таблицы
Классический состав операций с реляционными таблицами определяет требования к реляционным языкам. Рассмотрим типовые операции по обработке записей в изолированной реляционной таблице.
Включить – добавляется новая запись, для чего указывается имя таблицы, в которую производится дополнение, и значения полей новой записи, обязательно заполнение ключевых полей.
Удалить – удаляется определенная запись или группа записей, указывается имя таблицы и первичный ключ удаляемой записи – единичное удаление либо формируется условие (задают значения вторичных ключей или отдельных полей записи), выполнение которого необходимо для удаления группы записей.
Обновить – изменяется значение полей указанной записи, задается имя таблицы, идентификатор записи (записей), подлежащей корректировке значений полей, новые значения изменяемых полей.
Выборка (селекция) – выбор подмножества записей таблицы по условию, которое формулируется как логическое выражение. Результирующая таблица имеет ту же схему, что и исходная, эту операцию называют «горизонтальной» выборкой. Частным случаем выборки является пустая выборка, если исходные записи не соответствуют условию отбора
Проекция – для таблицы указывается подмножество полей, участвующих в формировании новой (выходной) таблицы, имеющей другую схему, и, может быть, другой массив записей (исключаются записи, дублирующие друг друга). Эту операцию называют «вертикальной» выборкой.
Типовые операции совместной обработки реляционных таблиц
Операции совместной обработки таблиц различны для таблиц с одинаковой или отличающейся схемой данных. Применительно к односхемным таблицам (одинаковый состав полей) выполняются следующие операции.
Объединение – для двух таблиц строится новая таблица той же схемы, содержащая совокупность записей исходных таблиц. При этом, если таблицы содержат одинаковые значения первичного ключа, при объединении таблиц записи не дублируются. Если записи двух таблиц имеют различные значения первичного ключа, результат объединения – совокупность всех записей исходных таблиц.
Пересечение – для двух таблиц строится новая таблица той же схемы, содержащая общие для них записи (с одинаковыми значениями первичного ключа). Если записей, содержащих одинаковое значение первичного ключа, нет, результат пересечения – пустая таблица.
52
Вычитание – для двух таблиц строится новая таблица той же схемы, содержащая записи первой таблицы, отличные от второй таблицы. Если записей, содержащих одинаковое значение первичного ключа, во второй таблице нет, результат вычитания – полный состав записей первой таблицы; если записи второй таблицы содержат все значения первичного ключа записей первой таблицы, результат вычитания – пустая таблица.
Применительно к разносхемным таблицам выполняются различные действия.
Декартово произведение – две таблицы образуют новую таблицу, которая включает все поля исходных таблиц. В результирующей таблице выводится итог соединения типа «каждый с каждым», при этом могут отсутствовать значения отдельных полей в результирующей записи.
Условием совместной обработки разносхемных реляционных таблиц в ряде случаев является наличие общих по типу и значению полей, так называемых внешних ключей.
Соединение – две таблицы, имеющие общие поля – внешние ключи, участвуют в создании новой таблицы, схема которой строится объединением всех полей исходных отношений, а результирующие записи формируются по определенным условиям:
−для одинаковых значений внешних ключей – симметричное соединение;
−для всех записей одной из таблиц и соответствующих им записей другой таблицы – внешнее соединение.
Деление – создается новая таблица, схема которой строится вычитанием из множества полей первой таблицы множества полей второй таблицы, результирующие записи формируются для одинаковых значений общих полей.
1.Сотрудники
КОД_С |
|
ФИО |
|
ДАТА_Р |
|
ЗВАНИЕ |
|
|
|
|
|
|
|
1001 |
|
Иванов С. П. |
|
11.12.1969 |
|
майор |
1002 |
|
Петров А.А. |
|
07.08.1971 |
|
сержант |
1003 |
|
Сидоров С.В. |
|
23.03.1965 |
|
капитан |
1004 |
|
Семенов В.А. |
|
15.06.1973 |
|
сержант |
1005 |
|
Кузьмин О.Н. |
|
27.10.1965 |
|
майор |
|
|
|
2. Объекты |
|
||
|
|
|
|
|
|
|
КОД_О |
|
НАЗВАНИЕ |
|
УЛИЦА |
ДОМ |
|
|
|
|
|
|
|
|
2001 |
|
АИСТ |
|
Советская |
115 |
|
2002 |
|
НАДЕЖДА |
|
Коммунальная |
10 |
|
2003 |
|
ДЕЛЬФА |
|
Интернациональная |
34 |
|
2004 |
|
ВАЛЕНТ |
|
Советская |
83 |
|
53
3. Дежурство
КОД_Д |
ДАТА_Д |
КОД_С |
КОД_О |
|
|
|
|
3001 |
01.10.2004 |
1001 |
2003 |
3002 |
01.10.2004 |
1004 |
2004 |
3003 |
11.10.2004 |
1002 |
2001 |
3004 |
23.09.2004 |
1003 |
2001 |
3005 |
12.09.2004 |
1002 |
2004 |
3006 |
15.11.2004 |
1005 |
2002 |
3007 |
11.10.2004 |
1003 |
2001 |
3008 |
15.12.2004 |
1001 |
2003 |
3009 |
13.10.2004 |
1004 |
2002 |
3010 |
12.09.2004 |
1001 |
2001 |
4. Зарплата
КОД_С |
ОКЛАД |
|
ПРЕМИЯ |
|
|
|
|
1001 |
5000 |
|
2000 |
1002 |
3500 |
1500 |
|
1003 |
4000 |
1500 |
|
1004 |
3500 |
1500 |
|
1005 |
5000 |
|
1000 |
Типы команд SQL
В SQL имеется 6 основных типов команд:
1. Команды языка определения данных (DDL). Они позволяют создавать новые таблицы в БД, добавлять индексы и т.д. Основными командами являются:
CREATE TABLE |
Создать таблицу |
ALTER TABLE |
Модифицировать таблицу |
DROP TABLE |
Удалить таблицу |
CREATE INDEX |
Создать индекс |
ALTER INDEX |
Модифицировать индекс |
DROP INDEX |
Удалить индекс |
2. Команды языка обработки данных (DML). Они используются для добавления, корректировки и удаления строк в таблицах:
INSERT |
Вставить данные в таблицу |
UPDATE |
Обновить данные |
DELETE |
Удалить данные |
3. Команда языка запросов данных (DQL). Она используется для получения данных из таблиц и определения формы представления этих данных:
54
SELECT.
4. Команда языка управления данных (DCL). Они определяют доступ отдельных пользователей и групп пользователей к объектам БД:
GRANT |
Предоставить привилегии |
REVOKE |
Отменить привилегии |
5. Команды языка обработки транзакций (TPL).
Транзакция – это неделимая, с точки зрения воздействия на СУБД, последовательность операций манипулирования данными.
Они обеспечиваются обновление всех строк, используемых операторами языка обработки данных:
BEGIN TRANSACTION |
Начать транзакцию |
COMMIT TRANSACTION |
Завершить транзакцию |
SAVE TRANSACTION |
Создать точку сохранения внутри тран- |
|
закции |
6. Команды языка управления курсором (CCL). Они выполняют опе-
рации с отдельными строками одной или нескольких таблиц:
DECLARE CURSOR |
Объявить курсор |
FETCH INTO |
Переместить курсор |
UPDATE WHERE CURRENT |
Изменить текущее значение |
Команда SELECT
Все запросы на получение данных из одной или нескольких таблиц выполняются с помощью команды SELECT. Результатом выполнения команды является другая таблица. К этой новой таблице может быть снова применима команда SELECT.
Оператор SELECT обладает большими возможностями по заданию структуры выходной информации. При выполнении выборки могут формироваться вычисляемые поля, являющиеся результатом обработки исходных данных. Возможно упорядочение выводимых данных, формирование групп записей, подсчет групповых итогов.
Универсальный оператор SELECT имеет следующую конструкцию:
SELECT [предикат] {*|таблица.*| [таблица.]поле1 [,[таблица.] поле2 [,…]]}
[AS псевдоним1 [, псевдоним2 [, …]]]
FROM выражение [, …] [IN внешняя база данных]
[WHERE …] [GROUP BY …] [HAVING …]
55
[ORDER BY …]
[WITH OWNERACCESS OPTION];
предикат |
Используются для ограничения числа возвращаемых |
|
записей: |
|
ALL – все записи; |
|
DISTINCT – записи, различающиеся в указанных для |
|
вывода полях; |
|
DISTINCTROW – полностью различающиеся записи по |
|
всем полям; |
|
TOP – возврат заданного числа или процента записей в |
|
диапазоне, соответствующем фразе ORDER BY |
таблица |
Имя таблицы, поля которой формируют выходные дан- |
|
ные |
поле1, поле2 |
Имя полей, используемых при отборе. Порядок их следо- |
|
вания определяет выходную структуру выборки данных |
псевдоним1, |
Новые заголовки столбцов результатов данных |
псевдоним2 |
|
FROM |
Определяет выражение, используемое для задания ис- |
|
точника формирования выборки. Обязательно присутст- |
|
вует в каждом операторе |
внешняя база данИмя внешней базы данных – источника данных для вы- |
|
ных |
борки |
WHERE |
Определяет условия отбора записей (необязательное) |
GROUP BY |
Указание полей (максимум 10) для формирования групп, |
|
по которым возможно вычисление групповых итогов. |
|
Порядок их следования определяет виды итогов (необя- |
|
зательное) |
HAVING |
Определяет условия отбора записей для сгруппирован- |
|
ных данных (необязательное) |
ORDER BY |
Определяет поля, по которым выполняется упорядочение |
|
выходных записей: |
|
ASC – возрастание; |
|
DESC – убывание |
WITH |
При работе в сети в составе защищенной рабочей группы |
OWNERACCESS |
для указания пользователям, не обладающим достаточ- |
OPTION |
ными правами, возможности просматривать результат |
|
запроса или выполнять запрос |
;Точка с запятой сообщает базе данных, что команда заполнена и готова к выполнению
Всамой простой форме команда SELECT инструктирует базу данных, чтобы извлечь информацию из таблицы.
SELECT КОД_С, ФИО, ЗВАНИЕ FROM Сотрудники;
56
Результат этого запроса:
|
|
КОД_С |
ФИО |
|
ЗВАНИЕ |
|||
|
|
|
|
|
|
|
|
|
|
1001 |
|
Иванов С. П. |
|
майор |
|
|
|
|
1002 |
|
Петров А.А. |
|
сержант |
|
|
|
|
1003 |
|
Сидоров С.В. |
|
капитан |
|
|
|
|
1004 |
|
Семенов В.А. |
|
сержант |
|
|
|
|
1005 |
|
Кузьмин О.Н. |
|
майор |
|
|
|
|
|
Для вывода полного списка столбцов можно использовать звездочку |
||||||
(*). |
|
|
|
|
|
|
||
|
|
SELECT * |
|
|
|
|
|
|
|
|
FROM Сотрудники; |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
КОД_С |
|
ФИО |
ДАТА_Р |
ЗВАНИЕ |
||
|
|
|
|
|
||||
|
1001 |
|
Иванов С. П. |
11.12.1969 |
майор |
|
||
|
1002 |
|
Петров А.А. |
07.08.1971 |
сержант |
|
||
|
1003 |
|
Сидоров С.В. |
23.03.1965 |
капитан |
|
||
|
1004 |
|
Семенов В.А. |
15.06.1973 |
сержант |
|
||
|
1005 |
|
Кузьмин О.Н. |
27.10.1965 |
майор |
|
||
Звездочка (*) покажет все столбцы в их естественном порядке. Но если указать столбцы отдельно, то можно получить их в том порядке, котором хотите.
SELECT КОД_С, ДАТА_Р, ФИО, ЗВАНИЕ
FROM Сотрудники;
КОД_С |
ДАТА_Р |
ФИО |
ЗВАНИЕ |
|
|
|
|
1001 |
11.12.1969 |
Иванов С. П. |
майор |
1002 |
07.08.1971 |
Петров А.А. |
сержант |
1003 |
23.03.1965 |
Сидоров С.В. |
капитан |
1004 |
15.06.1973 |
Семенов В.А. |
сержант |
1005 |
27.10.1965 |
Кузьмин О.Н. |
майор |
Исключение дубликатов |
|
SELECT ЗВАНИЕ |
|
ЗВАНИЕ |
|
FROM Сотрудники; |
майор |
|
сержант |
|
капитан |
|
сержант |
|
майор |
57
Эта команда выводит все значения столбца ЗВАНИЕ из таблицы СОТРУДНИКИ (2 раза – сержант и майор).
Для исключения дубликатов необходимо запрос дополнить ключевым словом DISTINCT:
SELECT DISTINCT ЗВАНИЕ |
ЗВАНИЕ |
FROM Сотрудники; |
капитан |
|
майор |
|
сержант |
DISTINCT – полезный способ избежать избыточности данных, но важно при этом понимать, что вы делаете. Если не хотите потерять некоторые данные, то вы не должны безоглядно использовать DISTINCT, потому что это может скрыть какую-то проблему или какие-то важные данные.
DISTINCT может указываться только один раз в предложении SELECT. Если предложение выбирает несколько полей, то DISTINCT опускает записи, где все выбранные поля идентичны. Строки, в которых некоторые значения одинаковы, а некоторые различные, будут сохранены.
Параметр ALL
Использование параметра ALL имеет противоположный эффект, будут выводиться все значения. Так как это тот же случай, когда не указывается ни DISTINCT, ни ALL, то ALL – скорее пояснительный, а не действующий аргумент.
Параметр TOP
Использование параметра TOP позволяет выводить заданное количество записей.
SELECT TOP 2 ЗВАНИЕ |
ЗВАНИЕ |
FROM Сотрудники; |
майор |
|
сержант |
Таблицы имеют тенденцию становиться очень большими, поскольку с течением времени в них добавляются новые записи. Обычно в определенный момент времени интересуют только некоторые записи, поэтому SQL дает возможность устанавливать критерии, какие записи будут выбраны для вывода.
WHERE – предложение команд SELECT, которое позволяет устанавливать условия, которые могут быть верными или неверными для любой строки таблицы. Команда извлекает из таблицы только те строки, для которых такое утверждение верно.
SELECT ФИО, ЗВАНИЕ FROM Сотрудники
WHERE ЗВАНИЕ = 'сержант';
ФИО |
ЗВАНИЕ |
Петров А.А. |
сержант |
Семенов В.А. |
сержант |
58
Для числовых значений кавычки не используются.
SELECT ДАТА_Д, КОД_С |
ДАТА_Д |
КОД_С |
FROM Дежурство |
01.10.2004 |
1001 |
WHERE КОД_С = 1001; |
15.12.2004 |
1001 |
|
12.09.2004 |
1001 |
Реляционные операторы
Реляционные операторы – это математический символ, который указывает на определенный тип сравнения между двумя значениями. SQL обладает следующими:
= |
Равно |
> |
Больше |
< |
Меньше |
> = |
Больше или равно |
< = |
Меньше или равно |
< > |
Не равно |
Эти операторы имеют стандартные значения для числовых значений. Для символьных значений, их определение зависит от формата преобразования, ASCII (используется во всех персональных и малых машинах) или EBCDIC (Расширенный Двоично-Десятичный код обмена информации используется в больших компьютерах).
В ASCII все символы верхнего регистра – меньше, чем все символы нижнего регистра («Z» < «a»), а все номера – меньше, чем все символы
(«1» < «Z»).
SELECT *
FROM Сотрудники
WHERE КОД_С>1002;
SELECT *
FROM Сотрудники
WHERE ЗВАНИЕ>'м';
Булевы операторы
Выражения Буля – являются или верными или неверными, подобно предикатам. Операторы Буля и как они работают:
AND берет два аргумента и оценивает их по отношению к истине, верны ли они оба.
OR берет два аргумента и оценивает на правильность, верен ли один из них.
NOT берет одиночный аргумент и заменяет его значение с неверного на верное или верное на неверное.
SELECT * FROM Объекты
59
WHERE УЛИЦА = 'Советская' And ДОМ > 100;
SELECT * FROM Объекты
WHERE УЛИЦА = 'Советская' Or ДОМ <= 10;
NOT может использоваться для инвертирования значений
SELECT *
FROM Сотрудники
WHERE NOT ЗВАНИЕ = 'майор';
SQL может применять NOT с выражением Буля только сразу после него.
SELECT * FROM Объекты
WHERE NOT УЛИЦА = 'Советская' Or ДОМ <= 10;
КОД_О |
НАЗВАНИЕ |
УЛИЦА |
ДОМ |
|
|
|
|
2002 |
НАДЕЖДА |
Коммунальная |
10 |
2003 |
ДЕЛЬФА |
Интернациональная |
34 |
NOT применяется только к выражению УЛИЦА = 'Советская'. Вы можете получить другой результат при команде:
SELECT * FROM Объекты
WHERE Not (УЛИЦА = 'Советская' Or ДОМ <= 10);
КОД_О |
НАЗВАНИЕ |
УЛИЦА |
ДОМ |
|
|
|
|
2003 |
ДЕЛЬФА |
Интернациональная |
34 |
Здесь SQL понимает круглые скобки как означающие, что все внутри них будет оцениваться первым и обрабатываться как единое выражение с помощью всего, что снаружи них.
В дополнении к реляционным и булевским операторам, SQL использует специальные операторы IN, BETWEEN, LIKE, и IS NULL.
Оператор IN
Оператор IN проверяет, содержится ли значение в определенном наборе.
SELECT *
FROM Сотрудники
WHERE ЗВАНИЕ IN ('майор', 'капитан');
60
