- •Введение
- •Глава 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. Триггеры
- •Заключение
- •Библиографический список
- 41 -
Для модификации могут использоваться выражения. Предположим, что студентам группы 345 за какие-то заслуги надо увеличить средний балл на 0.1. Тогда команда будет выглядеть следующим образом:
UPDATE students |
|
|
|
|
SET gpa = gpa + 0.1 |
|
|
||
WHERE stgroup = '345'; |
|
|
||
UPDATE 2 |
|
|
|
|
SELECT * FROM nstudents ; |
|
|
||
family |
| name |
| stgroup | gpa |
| sex |
|
-------------- |
+--------- |
+--------- |
+------ |
+----- |
Балашов |
| Андрей |
| 342 |
| 5.00 |
| м |
Катеринченко |
| Андрей |
| 342 |
| 4.59 |
| м |
Колычева |
| Лия |
| 349 |
| 4.38 |
| ж |
Никулкин |
| Сергей |
| 342 |
| 4.79 |
| м |
Фахрудинова |
| Тамара |
| 342 |
| 4.12 |
| ж |
Чертков |
| Максим |
| 344 |
| 4.31 |
| м |
Макаркина |
| Надежда |
| 340 |
| 4.55 |
| ж |
Малин |
| Сергей |
| 345 |
| 4.97 |
| м |
Дубоделов |
| Андрей |
| 345 |
| 4.97 |
| м |
(9 rows) |
|
|
|
|
2.7. DDL (Язык описания данных)
2.7.1. Создание таблиц
До этой главы мы запрашивали таблицы данных и выполняли команды по извлечению этих данных, считая, что эти таблицы уже были созданы кем-то до нас.
Таблицы создаются командой CREATE TABLE. Эта команда создает пустую таблицу - таблицу без строк. Значения вводятся с помощью DML-команды INSERT. Команда CREATE TABLE определяет имя таблицы и описание набора имён столбцов, указанных в определенном порядке. Она также определяет типы данных и размеры столбцов. Каждая таблица должна иметь по крайней мере один столбец.
Синтаксис команды CREATE TABLE достаточно сложен, но в простейшем виде он следующий:
CREATE TABLE table-name
(<column name> <data type>[(size)], <column name> <data type> [(size)] ...);
Кпримеру, таблица students, которую мы постоянно использовали
впримерах, была создана следующей командой:
- 42 -
CREATE TABLE students ( family varchar(20), name varchar(15), stgroup varchar(5), gpa numeric(3,2),
sex char(1));
Пробелы используются для разделения частей команды SQL, они не могут быть частью имени таблицы (или любого другого объекта, такого как индекс).
Знак подчеркивания ( _ ) обычно используется для разделения слов в именах таблиц.
Значение аргумента размера зависит от типа данных. Если вы его не указываете, ваша система сама будет назначать значение автоматически.
Имена всех таблиц в пределах одной базы данных обязательно должны быть различными. Это касается и всех остальных именуемых объектов базы данных (индексы, хранимые процедуры и так далее).
Порядок столбцов по умолчанию соответствует их порядку в операторе CREATE TABLE.
2.7.2. Индексы
Индекс - это упорядоченный (буквенный или числовой) список столбцов или групп столбцов в таблице. Таблицы могут иметь большое количество строк, а так как строки не находятся в каком-нибудь определенном порядке, их поиск по указанному значению может потребовать времени. Индексный адрес - это еще и обеспечение способа объединения всех значений в группы из одной или больше строк, которые отличаются одна от другой.
Когда вы создаёте индекс в поле, база данных запоминает порядок всех значений этого поля в памяти. Так как строки в таблице не упорядочены, то запрос будет сканировать всю таблицу последовательно, строку за строкой, проверяя каждый раз значение поля, по которому производится поиск, на равенство заданному значению.
Хотя индекс значительно улучшает эффективность запросов, использование индекса может значительно замедлять операции модификации DML (такие, как INSERT, UPDATE и DELETE), а сам индекс занимает значительный объем памяти, поскольку его размер соизмерим с размером самой таблицы.
Индексы могут состоять из нескольких полей. Если больше чем одно поле указывается для одного индекса, второе упорядочивается внутри первого, третье внутри второго и так далее.
- 43 -
Предположим, что нам надо создать индекс, который позволил бы получить быстрый доступ к студентам по фамилии:
CREATE INDEX famstudents ON students (family, name);
CREATE INDEX
Теперь мы можем искать студента по фамилии значительно быстрее, хотя при выполнении команды SELECT порядок вывода останется таким, каким он и был ранее. Следует понимать, что выигрыш от применения индекса будет ощутим в том случае, когда размер таблицы реально большой, а это как минимум десятки и сотни тысяч записей.
Индекс всегда можно удалить, зная его имя в базе данных. В примере мы удаляем только что созданный индекс:
DROP INDEX famstudents; DROP INDEX
2.7.3. Изменение структуры таблицы после ее создания
Команда ALTER TABLE не является частью стандарта ANSI, но используется достаточно часто. Она используется для того, чтобы изменить определение (структуру) существующей таблицы. Обычно она добавляет столбцы к таблице. Типичный синтаксис добавления столбца к таблице:
ALTER TABLE
ADD <column name> <data type> <size>;
Столбец будет добавлен со значениями NULL для всех строк таблицы. Новый столбец станет последним по порядку столбцом таблицы. Вообще-то можно добавить сразу несколько новых столбцов, отделив их запятыми, в одной команде. Имеется возможность удалять или изменять столбцы.
Предположим, что нам нужно хранить информацию о студенческом билете студента, тогда используем следующую команду:
ALTER TABLE students ADD st_ticket VARCHAR(12); ALTER TABLE
Тогда при выборке данных из таблицы мы увидим следующее:
SELECT * FROM students ; |
|
|
|
|
||
family |
|name |
|stgroup| |
gpa |
|sex | st_ticket |
||
------------ |
+------- |
+------- |
+ |
------ |
+---- |
+----------- |
Балашов |
|Андрей |
| 342 |
| |
5.00 |
| м |
| |
Катеринченко|Андрей |
| 342 |
| |
4.59 |
| м |
| |
|
Колычева |
|Лия |
| 349 |
| |
4.38 |
| ж |
| |
Малин |
|Сергей |
| 345 |
| |
4.87 |
| м |
| |
Никулкин |
|Сергей |
| 342 |
| |
4.79 |
| м |
| |
Фахрудинова |
|Тамара |
| 342 |
| |
4.12 |
| ж |
| |
