- •Введение
- •Глава 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. Триггеры
- •Заключение
- •Библиографический список
- 24 -
не применялся в области управления данными. Однако в середине 1990-х годов большая часть содержимого на корпоративных вебсайтах была из корпоративных SQL-баз данных. Например, на коммерческом вебсайте страницы содержат информацию о товарах, ценах, доступности товара на складе, специальных предложениях и т.п., причем обычно такие страницы создаются по запросу, на основе данных, выбранных из SQL-базы данных. Подавляющее большинство страниц на сайтах аукционов или туристических агентств также основано на информации из SQL-баз данных, преобразованной в формат HTML-страниц. Осуществляется поток информации и в другом направлении, когда введенные пользователем данные в формы на вебстраницах вносятся в SQL-базы данных, являющиеся частью архитектуры веб-сайта.
В начале 2000-х годов технологии Интернета стали применяться для соединения компьютерных приложений друг с другом. Такие архитектуры распределенных приложений получили широкое распространение под общим названием веб-служб (web services). В соответствии с давними неписаными правилами компьютерной индустрии появление новой технологии сопровождается появлением двух лагерей с различными стандартами и языками для их реализации. В данном случае это лагерь, возглавляемый Microsoft под флагом .NET Framework, и лагерь сторонников Java и J2EE-cepверов приложений. Обе архитектуры признают ключевую роль XML, стандарта обмена структурированными данными наподобие тех, что находятся в SQLбазах данных.
2.5. Основы SQL
Здесь будут даны основы языка SQL. В дальнейшем мы рассмотрим, как он связан с теорией реляционных баз данных. Аналогичные примеры будут представлены здесь и в следующей главе.
2.5.1. Использование SQL для извлечения информации из таблиц
Запрос - это команда, которую вы даёте вашей программе базы данных и которая сообщает ей, что нужно вывести определённую информацию из таблиц в память. Эта информация обычно посылается непосредственно на экран компьютера или терминала, которым вы пользуетесь, хотя в большинстве случаев её можно также послать на принтер, сохранить в файле (как объект в памяти компьютера) или представить как вводную информацию для другой команды или процесса.
- 25 -
Для пояснения примеров использования SQL будем применять небольшую учебную базу данных, предметной областью которой будет университет. На первых порах нам понадобится одна таблица, которая будет содержать 5 столбцов и 7 строк, в которых будет храниться информация о фамилиях, именах, группах, среднем балле и поле студентов, обучающихся в университете. Таблица имеет имя students и входит в базу данных university. В тексте приведено содержимое таблицы в том виде, в котором она выводится в консоли компьютера:
family |
| |
name |
| stgroup | |
gpa |
| sex |
||
-------------- |
+ |
-------- |
+ |
--------- |
+ |
------ |
+----- |
Балашов |
| |
Андрей | |
342 |
| |
5.00 |
| м |
|
Катеринченко | |
Андрей | |
342 |
| |
4.59 |
| м |
||
Колычева |
| |
Лия |
| |
349 |
| |
4.38 |
| ж |
Малин |
| |
Сергей | |
345 |
| |
4.87 |
| м |
|
Никулкин |
| |
Сергей | |
342 |
| |
4.79 |
| м |
|
Фахрудинова |
| |
Тамара | |
342 |
| |
4.12 |
| ж |
|
Чертков |
| |
Максим | |
344 |
| |
4.31 |
| м |
|
Любой запрос SQL имеет в своём составе одну команду. Структура этой команды обманчиво проста, потому что вы можете расширять её так, чтобы выполнить сложные оценки и обработку данных. Эта команда называется SELECT (ВЫБРАТЬ).
2.5.2. Команда SELECT
Для получения выборки из таблицы students всех столбцов и всех строк следует использовать следующую команду:
SELECT * FROM students;
или
SELECT family, name, stgroup, gpa, sex FROM students;
В данном случае обе команды идентичны и результат их выполнения будет одинаковым, хотя первый вариант предпочтительнее, поскольку здесь один символ (*) заменяет перечисление ВСЕХ полей таблицы, как это делается во втором случае.
Рассмотрим основные составляющие данной команды: SELECT — сообщает СУБД, что это запрос на выборку данных;
family, name, stgroup, gpa, sex — поля (столбцы, атрибуты) таблицы, значения которых будут выводиться в результате выполнения запроса;
- 26 -
FROM students — обязательное ключевое слово в команде, указывающее на источник данных. В нашем случае это таблица students.
(;) - точка с запятой является всегда последним, завершающим символом в команде SQL. Следует обратить внимание, что любая команда SQL может быть введена на нескольких строках. При этом символ возврата каретки вовсе не будет означать ее окончания и команда будет выполнена только после ввода точки с запятой.
Далее предположим, что нам потребуется вывести только ограниченный набор полей нашей таблицы (фамилии и имена студентов). В этом случае команда SELECT будет выглядеть следующим образом:
SELECT family, name FROM students;
family |
| name |
-------------- |
+-------- |
Балашов |
| Андрей |
Катеринченко |
| Андрей |
Колычева |
| Лия |
Малин |
| Сергей |
Никулкин |
| Сергей |
Фахрудинова |
| Тамара |
Чертков |
| Максим |
(7 rows) |
|
SELECT позволяет изменять порядок столбцов в результате вывода относительно заданного у таблицы при ее формировании (этот порядок сохраняется при использовании символа звездочки).
SELECT name, family FROM students;
name |
| family |
-------- |
+-------------- |
Андрей |
| Балашов |
Андрей |
| Катеринченко |
Лия |
| Колычева |
Сергей |
| Малин |
Сергей |
| Никулкин |
Тамара |
| Фахрудинова |
Максим |
| Чертков |
(7 rows) |
|
При использовании оператора SELECT может возникать избыточность. Например, нас интересует перечень всех групп в нашем университете. Такому запросу соответствует следующий оператор:
SELECT stgroup FROM students;
- 27 -
stgroup
---------
342
342
349
345
342
342
344
(7 rows)
Мы видим, что в результате запроса 4 раза выводится информация о группе 342. Для исключения из результата запроса избыточных данных используется аргумент DISTINCT следующим образом:
SELECT DISTINCT stgroup FROM students; stgroup
---------
345
349
342
344
(4 rows)
Как видно из результата запроса, здесь дубли значений отсутствуют.
Команда SQL SELECT позволяет выбирать часть строк в соответствии с определенным критерием с помощью критерия WHERE. Предположим, что нас интересуют исключительно студенты из группы 342. В этом случае запрос будет выглядеть следующим образом с учетом того, что группа у нас символьное поле:
SELECT * FROM |
students |
WHERE stgroup = '342'; |
||||
family |
| name |
| stgroup | |
gpa |
| sex |
||
-------------- |
+-------- |
+ |
--------- |
+ |
------ |
+----- |
Балашов |
| Андрей |
| |
342 |
| |
5.00 |
| м |
Катеринченко |
| Андрей |
| |
342 |
| |
4.59 |
| м |
Никулкин |
| Сергей |
| |
342 |
| |
4.79 |
| м |
Фахрудинова |
| Тамара | |
342 |
| |
4.12 |
| ж |
|
(4 rows) |
|
|
|
|
|
|
Для примера работы с числовыми параметрами постараемся выбрать студентов, у которых средний балл выше 4.5:
SELECT * FROM students WHERE gpa >= 4.5;
