
- •Isbn 5-8459-0138-3 (рус) isbn 0-201-38590-2 (англ)
- •Глава 2. Архитектура системы баз данных 65
- •Глава 6. Реляционная алгебра 192
- •Глава 7. Реляционное исчисление 243
- •Глава 8. Целостность данных 301
- •Глава 9. Представления 350
- •Часть 111
- •Часть IV
- •Глава 14. Восстановление 544 14.1. Введение 544
- •Глава 15. Параллельность 566
- •Часть V
- •Глава 16. Защита данных 602
- •Глава 17. Оптимизация 639
- •Глава 18. Отсутствующая информация 693
- •Глава 19. Наследование типов 725
- •Глава 20. Распределенные базы данных 767
- •Глава 21. Поддержка принятия решений 813
- •Глава 22. Хронологические базы данных 853
- •Глава 23. Логические системы управления базами данных 899
- •Часть VI
- •Глава 24. Объектные базы данных 944
- •Глава 25. Объектно-реляционные базы данных 999
- •Часть I (четыре главы) — это обширное введение в теорию баз данных вообще и реляционных баз данных в частности. Здесь также излагаются основы стандартно- го языка баз данных sql.
- •Часть IV. Две главы данной части — это несколько пересмотренные и расширен- ные версии глав 13 и 14 предыдущего издания.
- •Часть VI. Глава 24 является полностью переписанной и значительно улучшенной версией глав 22-24. Глава 25 почти полностью обновлена.
- •Часть I
- •Часть I состоит из четырех вводных глав.
- •1.1. Вводный пример
- •1.2. Что такое система баз данных
- •1.3. Что такое база данных Перманентные данные
- •1.4. Назначение баз данных
- •1.5. Независимость данных
- •1.6. Реляционные и другие системы
- •1.7. Резюме
- •2.1. Введение
- •2.2. Три уровня архитектуры
- •Внешний уровень (представления отдельных пользователей)Концептуальный уровень (обобщенное представление пользователей)
- •2.3. Внешний уровень
- •Отображение "внешний/концептуальный" схемы
- •Определение структур хранения (внутренняя схема)
- •Внешнее представление а Концептуальная схема
- •2.4. Концептуальный уровень
- •2.5. Внутренний уровень
- •2.6. Отображения
- •2.7. Администратор базы данных
- •2.8. Система управления базой данных
- •2.9. Система управления передачей данных
- •2.10. Архитектура "клиент/сервер"
- •2.11. Утилиты
- •2.12. Распределенная обработка
- •2.13. Резюме
- •3.1. Введение
- •3.2. Реляционная модель
- •3.3. Отношения и переменные-отношения
- •3.4. Смысл отношений
- •3.5. Оптимизация
- •3.6. Каталог
- •3.7. Базовые переменные-отношения и представления
- •3.8. Транзакции
- •3.9. База данных поставщиков и деталей
- •3.10. Резюме
- •Глава 4
- •4.1. Введение
- •4.2. Обзор языка sql
- •4.3. Каталог
- •4.4. Представления
- •4.5. Транзакции
- •4.6. Внедрение sql-операторов
- •4.7. Несовершенство языка sql
- •4.8. Резюме
- •Часть 9. Управление внешними данными (sql/med) Часть 10. Связь с объектным языком (sql/olb)
- •Часть II
- •Глава 5
- •5.1. Введение
- •5.2. Домены
- •5.3. Значения отношений
- •5.4. Переменные-отношения
- •5.5. Средства sql
- •5.6. Резюме
- •6.1. Введение
- •6.2. Реляционная замкнутость
- •6.3. Синтаксис
- •6.4. Семантика
- •6.5. Примеры
- •6.5.1. Получить имена поставщиков детали с номером 'р2'
- •6.5.2. Получить имена поставщиков по крайней мере одной красной детали
- •6.5.3. Получить имена поставщиков всех типов деталей
- •6.5.4. Получить номера поставщиков по крайней мере тех типов деталей, которые поставляет поставщик с номером 's2'
- •6.5.5. Получить все пары номеров поставщиков, находящихся в одном городе
- •6.5.6. Получить имена поставщиков, которые не поставляют деталь с номером 'р2'
- •6.6. Зачем нужна реляционная алгебра
- •6.7. Дополнительные операторы
- •6.8. Группирование и разгруппирование
- •6.9. Реляционные сравнения
- •6.10. Резюме
- •7.1. Введение
- •7.2. Исчисление кортежей
- •7.3. Примеры
- •7.3.5. Найти имена поставщиков по крайней мере одной детали, поставляемой поставщиком с номером 's2'
- •7.3.6. Выбрать имена поставщиков всех типов деталей
- •7.3.7. Определить имена поставщиков, которые не поставляют деталь с номером 'р2'
- •7.3.8. Определить номера поставщиков по крайней мере всех типов деталей, поставляемых поставщиком с номером *s2'
- •7.4. Сравнительный анализ реляционного исчисления и реляционной алгебры
- •7.5. Вычислительные возможности
- •7.5.1. Определить номера и вес в граммах всех типов деталей, вес которых превышает 10 ооо г
- •7.6.1. Выбрать номера поставщиков из Парижа со статусом, большим 20
- •7.7.1. Указать цвета деталей и названия городов, в которых находятся детали "не из Парижа" с весом, превышающим 10 фунтов
- •7.7.2. Для всех деталей указать номер и вес в граммах
- •7.7.3. Выбрать информацию обо всех парах поставщиков и деталей, находящихся в одном городе
- •7.7.4. Найти все пары названий городов, таких, что поставщик из первого города поставляет деталь, находящуюся во втором городе
- •7.7.5. Выбрать все пары номеров поставщиков, таких, что оба поставщика в каждой паре находятся
5.5. Средства sql
К рассматриваемому в этой главе материалу имеют отношение следующие SQL- операторы.
CREATE DOMAIN CREATE TABLE INSERT
ALTER DOMAIN ALTER TABLE UPDATE
DROP DOMAIN DROP TABLE DELETE
Операторы INSERT, UPDATE и DELETE приводились в главе 4. Остальные операторы бу- дут рассмотрены ниже.
Домены
Как отмечалось в главе 4, "домены" в языке SQL, к сожалению, далеки от настоящих реляционных доменов (т.е. типов). Фактически эти два понятия настолько различны, что для данной конструкции языка SQL желательно было бы использовать какое-либо другое название. Основное назначение концепции доменов в языке SQL — разрешить присвое- ние встроенным типам сокращенных имен, которые можно было бы использовать для упрощения записи определения нескольких столбцов в нескольких базовых таблицах, как, например, показано ниже.
CREATE DOMAIN Si CHAR(5) ; CREATE DOMAIN Pi CHAR(6) ;
CREATE TABLE S ( SI St, ... ) ; CREATE TABLE P ( PI Pt, ... ) ; CREATE TABLE SP ( Si Si, Pi Pi, ... ) ;
Далее перечислены некоторые основные различия между настоящими доменами и конструкциями языка SQL.
■ Как уже отмечалось, на самом деле домены языка SQL — это просто синтаксиче- ские сокращения. Они, несомненно, не относятся к истинному типу данных, опре- деляемому пользователем.
Значения доменов языка SQL не могут быть "произвольной внутренней сложно- сти". Сложность значений домена ограничена сложностью встроенных типов.
Домены языка SQL должны определяться в терминах одного из встроенных типов, а не в терминах другого домена, определенного пользователем.
На практике каждый домен языка SQL должен определяться в терминах только од- ного из существующих встроенных типов. Таким образом, в языке SQL невозможно определить домены, аналогичные, например, типам POINT и LINESEG из раздела 5.2.
Домены языка SQL не могут иметь больше одного "допустимого" представления. В действительности в языке SQL нет четкого различия между типом и его физическим представлением. Например, если домены языка SQL с именами Si и Pi будут опреде- лены в терминах типа CHAR, то над номерами поставщиков и номерами деталей можно будет выполнять те же операции, что и над строками, в частности — конкатенацию.
В языке SQL нет строгого контроля типов и выполняемая проверка правильности типов совершенно незначительна. Если взять в качестве примера определенные выше типы Si и Pi, следующий SQL-оператор ошибки не вызовет, хотя, если рас- суждать логически, должен был бы вызвать.
SELECT * FROM SP WHERE Si = Pi ;
Замечание. To же самое можно преподнести иначе, сказав, что язык SQL поддер- живает ровно восемь истинно реляционных доменов, а именно — восемь следую- щих "базовых типов".
Числа
Строки символов
Строки битов
Даты
Отметки времени
" Временные отметки (timestamp)
Интервалы "год/месяц"
Интервалы "день/время"
Тогда можно было бы сказать, что проверка правильности типов производится, но только для этих восьми типов. Так, например, попытка сравнить число со строкой битов приведет к ошибке, а сравнение двух чисел будет корректным, даже если эти числа имеют различные представления, скажем, одно — INTEGER, а другое — FLOAT.
■ Язык SQL не поддерживает возможность определения пользователем операций, применяемых к данному домену. Допустимыми являются только встроенные опе- раторы, применяемые к соответствующим представлениям этого типа.
Ниже приводится пример создания домена с помощью SQL-оператора CREATE DOMAIN.
CREATE DOMAIN <имя дотна> <иыя встроенного типа> [ Определение значения по умолчаяик» ] [ <ограничения> ] ;
Пояснения
Список допустимых имен встроенных типов, которые можно указывать как значе- ние параметра <ныя встроенного тнпа>, приводится в разделе 4.2 главы 4.
Необязательный параметр определения значения по умолчанию задает значение по умолчанию, которое будет применяться к каждому столбцу, определенному на этом домене и не имеющему собственного явного заданного значения по умолча- нию (подробности приводятся в следующем разделе). Значение этого параметра должно иметь вид DEFAULT Оначение по умолчании», где параметр Оначение по умопчанию>, в свою очередь, может быть литералом, именем встроенного 0- адического оператора или ключевым словом NULL12.
Замечание, Оператор, который не имеет операндов, называется 0-адическим (например, CURRENT_DATE).
3. В необязательном параметре <ограничения> перечисляются все ограничения, при- меняемые к определяемому домену. Обсуждение ограничений мы откладываем до главы 8.
Существующий SQL-домен можно в любое время изменить с помощью оператора ALTER DOMAIN. В частности, этот оператор позволяет определить для указанного домена новое значение по умолчанию (заменяя при этом старое значение, если оно было указано) или удалить существующее. Он также позволяет ввести новое ограничение це- лостности для данного домена или удалить уже существующие ограничения. Подробное изложение всех этих опций (а они довольно сложны) выходит за рамки данной книги. Интересующийся читатель может обратиться к [4.19].
И наконец, существующий домен можно отменить с помощью оператора DROP DOMAIN, имеющего следующий синтаксис.
DROP DOMAIN <имя доыена> <режим> ;
Здесь параметр <режим> может принимать значения RESTRICT и CASCADE. Общая идея состоит в следующем.
При выборе опции RESTRICT домен не будет уничтожен, если на него имеются ка- кие-либо ссылки.
При выборе опции CASCADE операция будет выполнена и "каскадно" продолжена во всех направлениях. Столбцы, которые были ранее определены на основе уда- ляемого домена, будут рассматриваться как определенные непосредственно на ба- зе типа данных этого домена.
12
Подробное обсуждение поддержки в
языке
SQL
пустых
значений (обозначаемых ключевым
словом
NULL)
мы
отложим до главы 18. Однако отдельных
упоминаний о пустых значениях в
этой
главе не избежать.
Базовые таблицы
Прежде чем обсуждать базовые таблицы, необходимо сделать пару замечаний отно- сительно таблиц языка SQL вообще.
Во-первых, в таблицах языка SQL, в отличие от настоящих отношений, допусти- мы повторяющиеся строки, поэтому им не требуются какие-либо первичные ключи (или, более общо, потенциальные ключи).
Во-вторых, в таблицах языка SQL, в отличие от настоящих отношений, столбцы рассматриваются в порядке слева направо. Например в таблице поставщиков S столбец St может быть первым столбцом, столбец SNAME — вторым и т.д.
Перейдем непосредственно к базовым таблицам. Они определяются с помощью опе- ратора CREATE TABLE (обратите внимание, что ключевое слово TABLE означает здесь ис- ключительно базовую таблицу; то же самое касается операторов ALTER TABLE и DROP TABLE, которые описываются ниже). Синтаксис выражения следующий.
CREATE TABLE <имя базовойтабпицы>
( <списох элементов базовой таблицы> );
Здесь каждый параметр <элемент базовой таблицы> является либо определением столбца, либо определением ограничения базовой таблицы. В последнем случае элемент задает ограничение поддержки целостности данных, которое будет применяться к созда- ваемой таблице. Подробное обсуждение подобных ограничений мы отложим до главы 8. Каждое определение столбца (по крайней мере одно такое определение обязательно должно присутствовать), в свою очередь, выглядит следующим образом.
<имя столбца> <тнп или имя домена> [ <значение по умолчании» ]
Здесь параметр <имя столбца> указывает название столбца, параметр <тип или имя домена> задает используемый тип данных или домен, а необязательный параметр <значение по умолчанию> устанавливает значение по умолчанию для описываемого столбца, которое подавляет значение по умолчанию, указанное на уровне домена (если такое имеется).
Замечание. Параметр Оначение по умогчанию> задает значение по умолчанию, ко- торое помещается в соответствующий столбец в том случае, если пользователь не указал конкретное значение для этого столбца в операторе INSERT. Подобный случай проиллю- стрирован в разделе 4.6 главы 4. Если для данного столбца собственное значение по умолчанию явно не определено, а также если нет такового значения, наследуемого из домена, то предполагается, что значение по умолчанию— NULL, т.е. NULL— это "значение по умолчанию, используемое по умолчанию".
Пример использования оператора CREATE TABLE показан на рис. 4.1 главы 4.
Существующее определение базовой таблицы можно в любое время изменить с по- мощью оператора ALTER TABLE. Он позволяет выполнить следующие изменения.
Добавить столбец
Задать для существующего столбца новое значение по умолчанию (которое заме- нит прежнее значение, если оно было определено)
Удалить значение по умолчанию для существующего столбца
Удалить существующий столбец
Задать новые ограничения целостности
Удалить существующие ограничения целостности
Приведем пример для первого случая.
ALTER TABLE S ADD COLUMN DISCOUNT INTEGER DEFAULT -1 ;
Этот оператор добавляет в базовую таблицу поставщиков столбец с именем DISCOUNT (имеющий тип INTEGER). Начальным значением каждой строки этого столбца во всех случаях будет -1.
Наконец, существующую базовую таблицу можно уничтожить с помощью оператора DROP TABLE.
DROP TABLE <иня базовой таблицы> <режим> ;
Здесь (как и в случае оператора DROP DOMAIN) опция <режим> принимает одно из двух возможных значений — RESTRICT или CASCADE. При выборе опции RESTRICT базовая таб- лица не будет уничтожена, если на нее имеются ссылки в каком-либо представлении или ограничении целостности. При выборе опции CASCADE операция будет выполнена (будут удалены все строки таблицы, а затем и сама таблица), при этом1 также будут удалены все представления и ограничения целостности, ссылающиеся на эту таблицу.