- •Введение
- •Глава 1. Основные понятия баз данных
- •1.1. История возникновения баз данных
- •1.2. Модели данных
- •1.2.1. Иерархическая модель данных
- •1.2.2. Сетевая модель базы данных
- •1.2.3. Реляционная модель базы данных
- •1.2.4. Другие модели баз данных (ООСУБД)
- •2.1. История появления и развития SQL
- •Глава 2. SQL
- •2.2. Стандарты SQL
- •2.2.1. Стандарты ANSI/ISO
- •2.2.2. ODBC и консорциум SQL Access Group
- •2.2.3. JDBC и серверы приложений
- •2.3. SQL и переносимость
- •2.4. SQL и сети
- •2.4.1. Централизованная архитектура
- •2.4.2. Архитектура файлового сервера
- •2.4.3. Архитектура “клиент/сервер”
- •2.4.4. Многоуровневая архитектура
- •2.4.5. SQL и мэйнфреймы
- •2.4.7. SQL и UNIX
- •2.4.8. SQL и персональные компьютеры
- •2.4.9. SQL, хранилища данных и интеллектуальные ресурсы предприятия
- •2.4.10. SQL и интернет-приложения
- •2.5. Основы SQL
- •2.5.1. Использование SQL для извлечения информации из таблиц
- •2.5.2. Команда SELECT
- •2.5.3. Создание более сложных предикатов в предложении SELECT
- •2.5.4. Формирование вывода запросов
- •2.5.5. Агрегатные группы
- •2.6. Запросы к нескольким таблицам
- •2.6.1. Подзапросы
- •2.6.2. Использование операторов ANY, ALL и SOME
- •2.6.3. Использование предложения UNION
- •2.6.4. Ввод, удаление и изменение значения поля
- •2.7. DDL (Язык описания данных)
- •2.7.1. Создание таблиц
- •2.7.2. Индексы
- •2.7.3. Изменение структуры таблицы после ее создания
- •2.8. Ограничение данных
- •2.8.1. Ограничение таблиц
- •2.8.2. Установка значений по умолчанию
- •2.9. Поддержка целостности данных
- •2.9.1. Первичные ключи
- •2.9.2. Пользовательские представления
- •2.10. Модификация данных с помощью представлений
- •2.11. Разграничение доступа в базе данных
- •Глава 3. Математические основы реляционных баз данных
- •3.1. Отношения и их схемы
- •3.2. Реляционные операторы
- •3.2.1. Булевы операции
- •3.2.2. Оператор выбора
- •3.2.3. Оператор проекции
- •3.2.4. Оператор соединения
- •3.2.5. Другие операции на отношениях
- •3.2.6. Оператор деления
- •3.2.7. Оператор переименования атрибутов
- •3.2.8. Оператор эквисоединения
- •3.2.9. Расширения для сравнения на доменах
- •3.2.9.1. Расширение выбора
- •3.3. Реляционная алгебра
- •3.3.1. Дополнительные операторы
- •3.3.1.1. Оператор расщепления
- •3.3.1.2. Оператор FACTOR
- •3.4. Функциональные зависимости
- •3.4.1. Определение
- •3.4.2. Аксиомы вывода
- •3.4.3. Применение аксиом вывода
- •3.4.4. Выводы на основе аксиом вывода
- •3.4.6. Направленные ациклические графы вывода
- •3.4.7. Проверка принадлежности к замыканию множества функциональных зависимостей
- •3.5. Покрытия функциональных зависимостей
- •3.5.1. Покрытия и эквивалентность
- •3.5.2. Неизбыточные покрытия
- •3.5.3. Редуцированные покрытия
- •3.5.3.1. Посторонние атрибуты
- •3.5.3.3. Алгоритм построения редуцированного покрытия
- •3.5.3.4. Канонические покрытия
- •3.5.3.5. Структура неизбыточных покрытий
- •3.5.4. Минимальные покрытия
- •3.5.4.1. Прямая определяемость
- •3.5.4.2. Вычисление минимальных покрытий
- •3.5.4.3. Оптимальные покрытия
- •3.5.5. Составные функциональные зависимости
- •3.5.6. Кольцевые покрытия
- •3.6. Многозначные зависимости и зависимости соединения
- •3.6.1. Многозначные зависимости
- •3.6.2. Многозначные и функциональные зависимости
- •3.6.3. Аксиомы вывода для многозначных зависимостей
- •3.6.4. Только многозначные зависимости
- •3.6.5. Функциональные и многозначные зависимости
- •3.6.6. Зависимости соединения
- •3.7. Синтез схем реляционных баз данных
- •3.7.1. Базы данных и их схемы
- •3.7.2. Нормальные формы баз данных
- •3.7.2.1. Первая нормальная форма
- •3.7.2.2. Вторая нормальная форма
- •3.7.2.4. Нормальная форма Бойса - Кодда (НФБК)
- •3.7.2.5. Четвертая нормальная форма
- •3.7.2.3. Третья нормальная форма
- •3.8. Алгоритмы синтеза схем баз данных
- •3.8.1. Нормализация через декомпозицию
- •3.8.2. Недостатки нормализации через декомпозицию
- •3.8.3. Нормализация посредством синтеза
- •Глава 4. Система управления базами данных PostgreSQL
- •4.1. Установка
- •4.2. Запуск и останов сервера PostgreSQL
- •4.2.1. Утилита psql
- •4.2.2. Создание базы данных
- •4.3. Объекты базы данных
- •4.4. Функции и операторы
- •4.4.1. Логические операторы
- •4.4.2. Операторы сравнения
- •4.5. Клиентские приложения PostgreSQL
- •4.5.1. clusterdb
- •4.5.2. createdb
- •4.5.3. createuser
- •4.5.4. dropdb
- •4.5.5. dropuser
- •4.5.6. ecpg
- •4.5.7. pg_basebackup
- •4.5.8. pgbench
- •4.5.9. pg_config
- •4.5.10. pg_dump
- •4.5.11. pg_dumpall
- •4.5.12. pg_isready
- •4.5.13. pg_receivewal
- •4.5.14. pg_restore
- •4.5.15. psql
- •4.5.16. reindexdb
- •4.5.17. vacuumdb
- •4.6. Серверные приложения PostgreSQL
- •4.6.1. initdb
- •4.6.2. pg_archivecleanup
- •4.6.3. pg_checksums
- •4.6.4. pg_controldata
- •4.6.6. pg_resetwal
- •4.6.7. pg_rewind
- •4.6.8. pg_test_fsync
- •4.6.9. pg_test_timing
- •4.6.10. pg_upgrade
- •4.6.11. pg_waldump
- •4.6.12. postgres
- •4.6.13. postmaster
- •4.7. Серверное программирование
- •4.7.1. Расширение SQL
- •4.7.2. Триггеры
- •Заключение
- •Библиографический список
|
|
|
|
- 44 - |
|
|
|
Чертков |
|Максим |
| 344 |
| 4.31 |
| м |
| |
||
Дубоделов |
|Андрей |
| |
345 |
| 4.87 |
| |
м |
| |
Макаркина |
|Надежда| |
344 |
| |
| |
ж |
| |
|
(9 rows) |
|
|
|
|
|
|
|
Также можно изменить и удалить столбцы из таблицы. Предположим, что нам надо переименовать наш новый столбец, изменить тип данных, а затем через некоторое время возникла необходимость его удалить из таблицы. Для этого мы используем следующую последовательность команд:
ALTER TABLE students
RENAME COLUMN st_ticket TO ticket; ALTER TABLE
ALTER TABLE students
ALTER COLUMN ticket TYPE VARCHAR(10); ALTER TABLE
ALTER TABLE students DROP COLUMN ticket;
ALTER TABLE
Можно удалить и всю таблицу целиком:
DROP TABLE students; DROP TABLE
SELECT * FROM students ;
ERROR: relation "students" does not exist LINE 1: SELECT * FROM students
Здесь мы видим, что более такой таблицы не существует в базе данных и запрос к ней вызывает ошибку, о которой нам сообщает сервер базы данных.
2.8. Ограничение данных
Ограничения - это часть определений таблицы, вводящая ограничения на значения, которые вы можете вводить в столбцы. До этого места единственными ограничениями на значения, которые вы могли вводить, были тип данных и размер вводимых значений, которые должны быть совместимы с теми столбцами, куда эти значения помещаются (как определено для команды CREATE TABLE или команды ALTER TABLE).
2.8.1. Ограничение таблиц
При создании таблицы можно задавать ограничения на значения полей и SQL будет отклонять любые значения, противоречащие заданным ограничениям. Имеются ограничения таблицы и ограничения столбца.
- 45 -
Ограничения столбца вставляются в операторы CREATE TABLE и ALTER TABLE в конце имени столбца после типа данных, но перед запятой, в то время как ограничения таблицы указываются после последнего столбца перед заключительной круглой скобкой.
На примере рассмотрим создание таблицы с данными о студентах, в которой запрещено вставлять строки, в которых отсутствует информация о фамилиях и именах студентов:
CREATE TABLE IF NOT EXISTS students ( family varchar(20) NOT NULL,
name varchar(15) NOT NULL, stgroup varchar(5),
gpa numeric(3,2), sex char(1));
CREATE TABLE
Теперь попробуем добавить новую запись с пустым значением поля, содержащего информацию об имени студента:
INSERT INTO students
VALUES ('Овсиенко',NULL,'345',NULL,'ж');
ERROR: null value in column "name" violates not-null constraint
DETAIL: Failing row contains (Овсиенко, null, 345, null, ж).
Обратим внимание, что при вставке были заданы два пустых значения, но ошибка была только для поля name.
Теперь рассмотрим требование уникальности на уровне столбца. В примере мы можем потребовать, чтобы в таблице не было студентов с одинаковой фамилией (требование неправильное, но показательное):
CREATE TABLE students (
family varchar(20) NOT NULL UNIQUE, name varchar(15),
stgroup varchar(5), gpa numeric(3,2), sex char(1));
CREATE TABLE
Попробуем ввести данные о студенте Балашове, обратив внимание на то, что у него все остальные данные (кроме пола) отличаются и дублируется только фамилия:
INSERT INTO nstudents
VALUES ('Балашов','Петр','345',4.45,'м');
ERROR: duplicate key value violates unique constraint "nstudents_family_key"
DETAIL: Key (family)=(Балашов) already exists.
- 46 -
На уровне таблицы можно определить как уникальную группу полей, которая будет указана через запятую после описания последнего поля в таблице. В примере уникальной будет совокупность двух полей
— фамилии и имени:
CREATE TABLE IF NOT EXISTS nstudents ( family varchar(20),
name varchar(15), stgroup varchar(5), gpa numeric(3,2), sex char(1),
UNIQUE (family, name));
CREATE TABLE
Теперь попробуем снова ввести данные о студенте Балашове Петре:
INSERT INTO students
VALUES ('Балашов','Петр','345',4.45,'м');
INSERT 0 1
Теперь новая запись добавлена, поскольку хотя фамилия и совпадает, но пара имя и фамилия здесь является уникальной, следующий пример, где эта пара не уникальна, покажет, как срабатывает заданное ограничение уникальности:
INSERT INTO students
VALUES ('Балашов','Андрей','342',5.00,'м');
ERROR: duplicate key value violates unique constraint "nstudents_family_name_key"
DETAIL: Key (family, name)=(Балашов, Андрей) already
exists.
Ограничение CHECK состоит из ключевого слова CHECK, сопровождаемого предложением предиката, который использует указанное поле. Любая попытка модифицировать или вставить значение поля, которое могло бы сделать этот предикат неверным, будет отклонена.
Допустим, средний балл не может быть больше 5.00:
CREATE TABLE IF NOT EXISTS students ( family varchar(20),
name varchar(15), stgroup varchar(5),
gpa numeric(3,2) CHECK (gpa <= 5), sex char(1),
UNIQUE (family, name));
CREATE TABLE
Теперь попробуем ввести новую запись со значением среднего балла, превышающим заданное ограничение:
INSERT INTO nstudents
VALUES ('Косымскова','Светлана','345',5.04,'ж');
- 47 -
ERROR: new row for relation "nstudents" violates check constraint "nstudents_gpa_check"
DETAIL: Failing row contains (Косымскова, Светлана, 345,
5.04, ж).
Теперь ограничим возможность для ввода записей только теми, у которых в сведениях о студентах группа может принимать значения из определенного набора:
CREATE TABLE students ( family varchar(20), name varchar(15), stgroup varchar(5)
CHECK (stgroup IN ('342','344','345')), gpa numeric(3,2),
sex char(1),
UNIQUE (family, name));
CREATE TABLE
Попытка ввести данные о студентах из других групп, кроме 342, 344 и 345, приведет к следующему результату:
INSERT INTO students
VALUES ('Косымскова','Светлана','346',4.04,'ж'); ERROR: new row for relation "students" violates check constraint "students_stgroup_check"
DETAIL: Failing row contains (Косымскова, Светлана, 346, 4.04, ж).
Допустимо формировать условия, которые базируются на нескольких полях: так, в следующем примере будет проверяться принадлежность студента к одной из групп - 342, 344 или 345 и одновременно средний балл должен не превышать 5.
CREATE TABLE IF NOT EXISTS nstudents ( family varchar(20),
name varchar(15), stgroup varchar(5), gpa numeric(3,2), sex char(1),
UNIQUE (family, name),
CHECK (stgroup IN ('342','344','345') OR gpa <= 5)); CREATE TABLE
2.8.2. Установка значений по умолчанию
Когда вы вставляете строку в таблицу без указания в ней значений для каждого поля, SQL должен иметь значение по умолчанию для включения его в определённое поле или же команда будет
