
- •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. Выбрать все пары номеров поставщиков, таких, что оба поставщика в каждой паре находятся
4.2. Обзор языка sql
В языке SQL имеются операции как определения данных, так и манипулирования ими. Сначала мы познакомимся с операциями определения данных. На рис. 4.1 показано, как с помощью средств языка SQL определяется база данных поставщиков и деталей (ср. с рис. 3.9 в главе 3). Как можно видеть, определение включает один оператор CREATE TABLE для каждой базовой таблицы (как указывалось в главе 3, ключевое слово TABLE в операторе CREATE TABLE обозначает именно базовую таблицу). Каждый оператор CREATE TABLE задает имя создаваемой базовой таблицы, имена и типы данных столбцов этой таблицы, а также первичный ключ таблицы и любые внешние ключи, присутствующие в ней (кроме того, может быть указана другая дополнительная информация, которая не показана на рис. 4.1). Приведем еще пару замечаний по синтаксису.
■ Обратите внимание, что символ "I", который мы часто используем в именах столбцов, на самом деле в стандарте SQL/92 недопустим. '
В качестве признака конца оператора мы здесь используем символ хотя соглас- но стандарту SQL/92 выбор используемого для этой цели символа зависит от реали- зации. Детальное рассмотрение данного вопроса выходит за рамки этой книги.
CREATE TABLE S
( Si CHAR(5),
SNAME CHAR(20), STATUS NUMERIC(5), CITY CHAR(15), PRIMARY KEY ( Si ) ) ;
CREATE TABLE P
( Pi CHAR(6),
PNAME CHAR(20), COLOR CHAR(6), WEIGHT NUMERIC(5,1), CITY CHAR(15), PRIMARY KEY ( Pi ) ) ;
CREATE TABLE SP
( Si CHAR(5),
Pi CHAR(6),
QTY NUMERIC(9), PRIMARY KEY ( Si, Pi ), FOREIGN KEY ( Si ) REFERENCES S, FOREIGN KEY ( Pi ) REFERENCES P )
Рис. 4.1. Определение базы данных поставщиков и деталей средствами языка SQL
Одно из важных отличий между рис. 4.1 и его аналогом (рис. 3.9) в главе 3 состоит в том, что на рис. 4.1 нет ничего, соответствующего определениям типов (т.е. операторов TYPE). И причина этого, конечно, заключается в следующем: в языке SQL пользователю не разрешается определять собственные типы2. Поэтому для определения столбцов мож- но использовать только встроенные (определенные системой) типы. В языке SQL под- держиваются следующие встроенные типы, которые фактически не требуют дополни- тельных разъяснений.
CHARACTER [ VARYING ] (л) INTEGER DATE
BIT [ VARYING ] (л) SMALLINT TIME
NUMERIC (p,g) FLOAT (p) TIMESTAMP
2
В языке SQL/92
разрешается
определять собственные типы для так
называемых доменов,
однако
эти "домены " на самом деле — не
домены (т.е. типы) в реляционном смысле
(см. подроб-
ности приводятся в главе
5). Замечание.
Определяемые
пользователем типы данных поддержи-
ваются
стандартом SQL3
(приложение
Б).
В языке SQL поддерживается множество значений, принимаемых по умолчанию, со- кращений и альтернативных написаний. Например, существует сокращение CHAR для опре- делителя CHARACTER. Квадратные скобки "[" и "]" в принятой нотации используются для указания необязательных элементов (например, CHARACTER или BIT), при отсутствии кото- рых будут использованы значения по умолчанию. (Это правило обычно подразумевается при описании в форме Бэкуса-Наура, сокращенно — BNF). И наконец, отметим, что в язы- ке SQL требуется указывать конкретную длину или точность для определенных типов (например, CHAR) в отличие от нашего гипотетического синтаксиса, использовавшегося в главе 3. Очевидно, что язык SQL рассматривает эти длины и спецификаторы точности как часть определения типа (подразумевая, например, что значения CHAR(3) и CHAR(4) задают разные типы). Однако мы считаем, что лучше расценивать их (длины и точности) как огра- ничения целостности (что мы и делаем, в частности, в главе 8, упр. 8.4).
Выборка
(RESTRICT):
Результат:
SELECT
S#, Р#,
QTY
FROM
SP
WHERE
QTY <
150 ;
Проекция
(PROJECT):
Результат:
SELECT
S#, CITY
FROM S ;
s# |
P# |
QTY |
SI S2 |
P5 P6 |
100 100 |
S# |
CITY |
SI |
London |
S2 |
Paris |
S3 |
Paris |
S4 |
London |
S5 |
Athens |
Соединение (JOIN):
SELECT S.S#, SNAME, STATUS, CITY, P#, QTY
FROM S, SP
WHERE S.S# = SP.S# ;
s# |
SNAME |
STATUS |
CITY |
P# |
QTY |
SI |
Smith |
20 |
London |
PI |
300 |
SI |
Smith |
20 |
London |
P2 |
200 |
SI |
Smith |
20 |
London |
P3 |
400 |
S4 |
Clark |
20 |
London |
P5 |
400 |
Рис. 4.2. Примеры выполнения операций выборки, проекции и соединения на языке SGL 122 Часть I. Основные понятия
Замечание. Пример операции соединения на этом рисунке подтверждает, что в языке SQL иногда необходимо использовать уточненные имена (например, S.St, SP.St), по- зволяющие устранить неоднозначность при указании столбцов. Согласно общему прави- лу уточненные имена допустимы всегда, а неуточненные имена допустимы, только если при этом не возникает неоднозначности.
Отметим, что в языке SQL поддерживается сокращенная форма предложения SELECT, как показано в следующем примере.
SELECT * — или SELECT S.* (т.е. символ "*" может быть уточнен) FROM S ;
В результате выполнения этого запроса будет получена копия всей таблицы S. Символ "*" — это сокращение для списка разделенных запятыми имен всех столбцов таблицы, ука- занной в предложении FROM. Имена столбцов перечисляются слева направо в том порядке, в котором они определены в этой таблице. Кстати, обратите внимание на комментарий, ко- торый начинается двумя дефисами и заканчивается символом новой строки.
Замечание. Выражение SELECT * FROM Т, где Т— это имя таблицы, может быть со- кращено до простого выражения TABLE Т.
Значительно подробнее оператор SELECT обсуждается в главе 7 (раздел 7.7).
Перейдем к операциям обновления. Примеры операций INSERT, UPDATE и DELETE языка SQL приводились в главе 1. Однако во всех примерах этой главы использовались операции обработки отдельных строк. Тем не менее операции INSERT, UPDATE и DELETE, как и опера- ция SELECT, обрабатывают данные на уровне множеств (некоторые упражнения и ответы к ним в главе 1 действительно демонстрировали эту возможность). Вот несколько примеров обновления на уровне множеств для базы данных поставщиков и деталей.
INSERT
INTO TEMP ( Pt, WEIGTH ) SELECT Pt, WEIGTH FROM P
WHERE COLOR = 'Red' ;
В этом примере подразумевается, что предварительно создана другая таблица TEMP с двумя столбцами: Pt и WEIGTH. Оператор INSERT вставляет в нее номера деталей и соот- ветствующие веса всех деталей с цветом 'Red' (красный).
UPDATE S
SET STATUS = STATUS * 2 WHERE CITY = 'Paris' ;
Приведенный выше оператор UPDATE удваивает статус всех поставщиков в Париже.
DELETE
FROM SP
WHERE Pt = 'P2' ;
Этот оператор DELETE удаляет из таблицы SP все строки с информацией о детали с номером 'Р2'.
Замечание. В язык SQL не включен прямой аналог операции реляционного при- своения. Но можно имитировать эту операцию, сначала удалив все строки из целевой таблицы, а затем выполнив для нее операции INSERT ... SELECT ... (как это сделано вы- ше, в первом примере).