- •Установочный модуль
- •Введение
- •Модуль 1
- •Реляционная алгебра
- •Отсутствующие данные
- •Пустые значения
- •Неопределенные значения
- •Интерпретации
- •Правила вычисления выражений
- •Следствия
- •Проверка условий
- •Реляционные объекты данных
- •Формальные определения
- •Домены и атрибуты
- •Схема отношения
- •Именованное значение атрибута
- •Кортеж
- •Отношение
- •Схема базы данных
- •База данных
- •Операции реляционной алгебры
- •Унарные операции
- •Бинарные операции
- •Варианты операции соединения
- •Производные операции
- •Пример построения выражения реляционной алгебры
- •Понятие базовых и виртуальных отношений
- •Понятие полноты реляционной алгебры
- •Формирование запросов на языке SQL
- •Металингвистические символы
- •Реализация операций реляционной алгебры
- •Пример использования подзапросов
- •Группирующие запросы
- •Упорядочение результатов
- •Вопросы для самоконтроля
- •Упражнения
- •Построение выражений реляционной алгебры
- •Модуль 2
- •Базовые и виртуальные отношения
- •Типы данных
- •Базовые типы данных
- •Типы данных, определяемые пользователем
- •Первичные и кандидатные ключи
- •Создание базовых отношений
- •Индексы
- •Модификация базовых отношений
- •Вставка строк
- •Обновление строк
- •Удаление строк
- •Целостность
- •Декларативная поддержка
- •Пример декларативной поддержки целостности
- •Транзакции и блокировки
- •Триггеры
- •Виртуальные отношения
- •Вопросы для самоконтроля
- •Упражнения
- •Декларативная поддержка целостности
- •Модуль 3
- •Нормальные формы
- •Функциональные зависимости (ФЗ)
- •Правила вывода Армстронга
- •Производные правила вывода
- •Независимость правил Армстронга
- •Полнота системы правил Армстронга
- •Нормальные формы
- •Первая нормальная форма (1NF)
- •Вторая нормальная форма (2NF)
- •Третья нормальная форма (3NF)
- •Нормальная форма Бойса-Кодда (Boyce, Codd; NFBC)
- •Пример построения нормализованных схем отношений
- •Вопросы для самоконтроля
- •Модуль 4
- •Проектирование схем баз данных
- •Уровни логической модели
- •Миграция ключей и виды связей
- •Классификация кластеров
- •Иерархическая рекурсия
- •Абстрактная схема
- •Обобщения
- •Пример реализации иерархической рекурсии
- •Сетевая рекурсия
- •Абстрактная схема
- •Сетевая реализация иерархической рекурсии
- •Обобщения
- •Пример реализации сетевой рекурсии
- •Ассоциация
- •Детализация связей многие-ко-многим
- •Обобщения
- •Пример реализации ассоциации
- •Обобщение
- •Абстрактная схема
- •Пример реализации обобщения
- •Композиция
- •Абстрактная схема
- •Пример реализации композиции
- •Агрегация
- •Абстрактная схема
- •Пример реализации агрегации
- •Унификация атрибутов
- •Вопросы для самоконтроля
- •Упражнения
- •Иерархическая рекурсия
- •Сетевая рекурсия
- •Ассоциация
- •Обобщение
- •Композиция
- •Агрегация
- •Дополнительные главы
- •Технологии баз данных
- •Информационные системы
- •Жизненный цикл ИС
- •СУБД и БД
- •Жизненный цикл БД и средства проектирования
- •Модели данных
- •Иерархическая модель данных
- •Сетевая модель данных
- •Реляционная модель данных
- •Постреляционная модель данных
- •Объектно-ориентированные модели данных
- •XML как модель данных
- •Многомерная модель данных (OLAP)
- •Основные функции СУБД
- •Управление данными во внешней памяти
- •Управление буферами оперативной памяти
- •Управление транзакциями
- •Журнализация и восстановление БД после сбоев
- •Поддержка языков баз данных
- •Типовая организация СУБД
- •Модели взаимодействия с БД
- •Модель с централизованной архитектурой
- •Модель с автономными персональными компьютерами
- •Архитектура «файл-сервер»
- •Архитектура «клиент-сервер»
- •Архитектура «клиент-сервер» трехзвенная
- •Распределенные базы данных
- •Технология тиражирования данных
- •Понятие «фрактал»
- •Геометрические фракталы
- •Алгебраические фракталы
- •Стохастические фракталы
- •Системы итерируемых функций
- •Вопросы для самоконтроля
- •Литература
- •Список иллюстраций
- •Список таблиц
Таким образом, полнота реляционной алгебры понимается в том смысле, что система запросов, построенная на основе реляционной алгебры (запрос – это выражение реляционной алгебры над множеством отношений базы данных D), приводит к тому же множеству допустимых запросов D+, что и система запросов, построенная на основе исчисления кортежей (запрос – это выражение исчисления кортежей над D).
2.9. Формирование запросов на языке SQL
Оператор select – один из наиболее важных и самых распространенных операторов SQL. Он позволяет производить выборки данных из таблиц и преобразовывать к нужному виду полученные результаты. Будучи очень мощным, он способен выполнять действия, эквивалентные выражениям реляционной алгебры, причем в пределах единственного выполняемого оператора. При его помощи можно реализовать сложные и громоздкие условия отбора данных из различных отношений.
Оператор select – средство, которое полностью абстрагировано от вопросов представления данных, что помогает сконцентрировать внимание на проблемах доступа к данным. Примеры его использования наглядно демонстрируют один из основополагающих принципов промышленных СУБД: средства хранения данных и доступа к ним отделены от средств представления данных. Операции над данными производятся в масштабе наборов данных, а не отдельных записей.
Оператор select реализует вычисление выражений как реляционной, так и псевдореляционной алгебры. В последнем случае в результирующем отношении могут появляться дублирующиеся кортежи. Потенциально опасными с точки зрения возникновения дубликатов кортежей являются операции проекции и объединения. Поэтому в этих операциях вводятся специальные опции, управляющие режимом исключения дубликатов.
Базовая структура оператора select включает следующие фразы и достаточно проста:
select выбрать такие-то атрибуты from из таких-то отношений
where с таким-то условием выборки кортежей
Далее рассматривается реализация операций реляционной алгебры с помощью оператора select. В общем случае в одном операторе select может быть определено целое выражение реляционной алгебры, а не только одна отдельная операция.
2.9.1. Металингвистические символы
При описании синтаксических конструкций используются следующие металингвистические символы:
1){ } – синтаксические конструкции в фигурных скобках представляют обязательные синтаксические единицы;
2)[ ] – синтаксические конструкции в квадратных скобках представляют необязательные синтаксические единицы;
3)| – вертикальная черта читается как «либо»;
4)... – многоточие означает возможность повторения предшествующей синтаксической единицы;
5),.. – запятая и две точки означают возможность повторения предшествующей синтаксической единицы через запятую. Так, например, следующие синтаксические конструкции будут
эквивалентными:
{буква | цифра}[,{буква | цифра}]...
{буква | цифра},..
Обе эти конструкции описывают последовательность из одного или нескольких буквенноцифровых символов, разделенных запятыми.
Примечание. Если в синтаксической конструкции металингвистический символ должен появляться буквально, то он подчеркивается. Например, синтаксическая конструкция [[число]]... соответствует необязательному ряду из нескольких чисел, заключенных в квадратные скобки
2.9.2. Реализация операций реляционной алгебры
Операция выборки
Операция выборки реализуется оператором
select *
from имя_отношения where условие_выборки
Здесь звездочка означает выбор всех атрибутов из схемы отношения. Условие выборки записывается в виде логического выражения со связками not, and, or. Ссылки на атрибуты производятся по их именам. Например, в следующем запросе из отношения Успеваемость выбираются те кортежи,
которые относятся к номеру зачетной книжки 100 и семестру 6 (МнемоП – мнемоническое наименование предмета):
Успеваемость(NЗК, Семестр, МнемоП, Оценка, Дата)
select *
from Успеваемость
where NЗК = 100 and Семестр = 6
Условие выборки может содержать предикаты в следующих формах:
1)выражение {< | <= | = | < > | >= | >} выражение
2)выражение [not] between выражение1 and выражение2
3)выражение is [not] null
4)строковое_выражение [not] like шаблон
[escape 0escape_символ0]
5)выражение [not] in (выражение,..)
6)выражение [not] in (подзапрос)
7)выражение {< | <= | = | < > | >= | >} {all | any} (подзапрос)
8)exists (подзапрос)
Форма 1 предиката применяется для выражений любого типа, за исключением BLOB – крупных двоичных объектов.
Форма 2 предиката с оператором [not] between (между) является сокращением следующего условия:
[not] (выражение1 <= выражение and выражение <= выражение2)
Форма 3 предиката предназначена для тестирования null-значений.
Форма 4 предиката с оператором like (похожий) позволяет отбирать строки по шаблону с использованием следующих символов замещения.
1.% – любая строка из нуля или более символов. Например, конструкция like 0%t%0 соответствует любым строкам, содержащим хотя бы один символ 0t0.
2._ – любой одиночный символ. Например, конструкция like 0a_0 соответствует двухсимвольным строкам, начинающимся с символа 0a0.
3.{[символ-символ] | [символ. . . ]} – любой одиночный символ, содержащийся в указанном диапазоне или последовательности символов. Например, конструкция like 0[b-d]at0, как и like
0[bcd]at0, соответствует строкам 0bat0, 0cat0, 0dat0. Конструкция like 0[ [ ]0 соответствует символу 0[0.
4. {[bсимвол-символ] | [bсимвол. . . ]} – любой одиночный символ, не содержащийся в указанном
диапазоне или последовательности символов. Например, конструкция like 0[ b0-9]%0 соответствует любым строкам, первый символ которых не является цифрой.
Если символ замещения 0%0 или 0_0 необходимо сам по себе включить в шаблон, то следует или заключить его в квадратные скобки, или определить escape-символ (то есть символ перехода) и использовать его перед символом замещения. Например, следующие конструкции соответствуют
двухсимвольным строкам, начинающимся с символа подчеркивания:
like 0 |
[_]_0 |
|
|
|
like |
0 |
/_ _0 |
escape |
0/0 |
like |
0 |
!_ _0 |
escape |
0!0 |
Форма 5 предиката соответствует предикату принадлежности элемента списку.
Форма 6 предиката отличается от формы 5 тем, что вместо списка задается подзапрос, возвращающий один столбец (но не одну строку, так как требуется однотипность данных). Например, следующий запрос выводит список студентов, получивших к моменту запроса хотя бы одну оценку отлично:
Студенты(NЗК, Ф, И, О) Сессия(NЗК, МнемоП, Оценка)
select * from Студенты
where NЗК in (select NЗК from Сессия where Оценка = 5)
Здесь в результирующем запросе поля из таблицы Сессия не используются и поэтому можно использовать подзапрос, а не соединение.
Форма 7 предиката позволяет сравнивать выражения со всеми (all) или некоторыми (any) значениями, возвращаемыми в подзапросе. В частности, следующие предикаты эквивалентны:
выражение in (подзапрос)
выражение = any (подзапрос)
Форма 8 предиката проверяет подзапрос на пустоту. С помощью этого предиката последний пример может быть записан в виде
Студенты(NЗК, Ф, И, О) Сессия(NЗК, МнемоП, Оценка)
select * from Студенты
where exists(select * from Сессия
where NЗК = Студенты.NЗК and Оценка = 5)
Здесь подзапрос является примером так называемого коррелированного подзапроса, поскольку условие выборки в подзапросе зависит от текущей анализируемой записи внешнего запроса.
Указывать конкретные столбцы в подзапросе предиката exists смысла не имеет.
Операция проекции
Операция проекции реализуется оператором
select [distinct] список_имен_атрибутов from имя_отношения
Здесь необязательная опция distinct задает режим исключения дубликатов кортежей. Если результат проекции гарантированно не содержит дубликатов кортежей или дубликаты допустимы, то
из соображений производительности опцию distinct лучше не указывать, например:
Успеваемость(NЗК, Семестр, МнемоП, Оценка, Дата)
select NЗК, Семестр, МнемоП, Оценка from Успеваемость
Здесь первые три возвращаемые атрибута образуют ключ отношения. Поэтому опция distinct становится излишней. Запрос возвращает исходное отношение Успеваемость, в котором опущен атрибут Дата.
Операция переименования атрибутов
Операция переименования атрибутов заключается в добавлении ключевого слова as и нового имени атрибута после исходного имени атрибута в списке имен атрибутов фразы select, например
Успеваемость(NЗК, Семестр, МнемоП, Оценка, Дата)
select NЗК as [№ зачетки], Семестр, МнемоП as МнемоПредмета, Оценка, Дата
from Успеваемость
Имена атрибутов, содержащие не буквенно-цифровые символы, в частности пробелы, заключаются в квадратные скобки (в некоторых СУБД).
Операция объединения
Операция объединения реализуется с помощью операции union, применяемой к базовым операторам select:
select список_имен_атрибутов_отношения_1 from имя_отношения_1
union [all]
select список_имен_атрибутов_отношения_2 from имя_отношения_2
Списки имен атрибутов объединяемых отношений должны ссылаться на атрибуты совместимых типов и быть перечислены в согласованном порядке. Имена атрибутов в отношениях могут быть различными. Результирующему отношению приписываются имена атрибутов, указанные в первом операторе select. Операция объединения может иметь форму union all с опцией all (все). В этом случае из результирующего отношения дубликаты кортежей не удаляются (что является более предпочтительным с точки зрения производительности).
Операция пересечения
Операция пересечения проще всего реализуется с использованием ключей отношений:
R1(Ключ, A, B, C), R2(Ключ, A, B, C)
select * from R1
where Ключ in (select Ключ from R2)
Здесь R1 и R2 – имена отношений. Оператор select в скобках является так называемым подзапросом. Он возвращает список значений ключа отношения R2. Согласно условию выборки в результирующее отношение выбираются те кортежи отношения R1, ключ которых содержится в списке ключей отношения R2. Имена ключей отношений могли бы быть и различными. Сами отношения могли бы иметь различные наборы дополнительных атрибутов.
Операция разности
Операция разности реализуется аналогично операции пересечения с заменой ключевого слова in на not in:
R1(Ключ, A, B, C), R2(Ключ, A, B, C)
select * from R1
where Ключ not in (select Ключ from R2)
В результирующее отношение выбираются те кортежи отношения R1, ключ которых не содержится в списке ключей отношения R2.
Операция декартова произведения
Операция декартова произведения реализуется с помощью операции перекрестного соединения cross join:
select *
from R1 cross join R2
Здесь предполагается, что отношения не имеют совпадающих имен атрибутов. В противном случае потребовалось бы с помощью переименования атрибутов разрешить коллизию имен, например:
R1(A, B), R2(B, C)
select A, R1.B as B1, R2.B as B2, C from R1 cross join R2
Здесь ссылки на атрибуты B отношений R1 и R2 производятся по их уточненным именам R1.B и R2.B соответственно.
Операция естественного соединения
Операция естественного соединения является частным случаем операции внутреннего соединения inner join по условию равенства кортежей на пересечении схем отношений, например:
R1(A, B, C), R2(B, C, D)
select A, R1.B, R1.C, D
from R1 inner join R2 on R1.B = R2.B and R1.C = R2.C
Здесь ссылаться на общие атрибуты B и C просто по именам нельзя, так как будет неясно, к какому отношению они относятся. Использованная формулировка условия соединения (после ключевого слова on) предполагает, что общие атрибуты соединяемых отношений null-значений не допускают.
Операции левого, правого и полного внешних соединений реализуются аналогичным образом с