- •Введение
- •Глава 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. Триггеры
- •Заключение
- •Библиографический список
|
|
|
- 28 - |
|
|
|
family |
| name |
| stgroup | |
gpa |
| sex |
||
-------------- |
+-------- |
+ |
--------- |
+ |
------ |
+----- |
Балашов |
| Андрей | |
342 |
| |
5.00 |
| м |
|
Катеринченко |
| Андрей | |
342 |
| |
4.59 |
| м |
|
Малин |
| Сергей | |
345 |
| |
4.87 |
| м |
|
Никулкин |
| Сергей | |
342 |
| |
4.79 |
| м |
|
(4 rows) |
|
|
|
|
|
|
2.5.3. Создание более сложных предикатов в предложении SELECT
Критерии отбора могут комбинироваться с помощью круглых скобок и логических операций И (AND), ИЛИ (OR) и НЕТ(NOT). Кроме того, можно использовать различные операции сравнения аналогично тому, как это происходит в других языках программирования: =, <>, >, <, <=, >=.
Рассмотрим ряд примеров. Предположим, нас интересуют все студенты со средним баллом не менее 4.5, обучающиеся в группе 342:
SELECT * FROM students
WHERE gpa >= 4.5 AND stgroup='342';
family |
| name |
| stgroup | |
gpa |
| sex |
||
-------------- |
+-------- |
+ |
--------- |
+ |
------ |
+----- |
Балашов |
| Андрей | |
342 |
| |
5.00 |
| м |
|
Катеринченко |
| Андрей | |
342 |
| |
4.59 |
| м |
|
Никулкин |
| Сергей | |
342 |
| |
4.79 |
| м |
|
(3 rows) |
|
|
|
|
|
|
Далее рассмотрим более сложный пример, когда надо выбрать сведения о студентах, которые имеют средний балл не хуже 4.5 и обучаются либо в группе 342, либо в группе 345.
SELECT * FROM students WHERE gpa >= 4.5
AND (stgroup='342' OR stgroup='345');
family |
| name |
| stgroup | |
gpa |
| sex |
||
-------------- |
+-------- |
+ |
--------- |
+ |
------ |
+----- |
Балашов |
| Андрей | |
342 |
| |
5.00 |
| м |
|
Катеринченко |
| Андрей | |
342 |
| |
4.59 |
| м |
|
Малин |
| Сергей | |
345 |
| |
4.87 |
| м |
|
Никулкин |
| Сергей | |
342 |
| |
4.79 |
| м |
|
(4 rows) |
|
|
|
|
|
|
Данные при вводе записываются всегда в «хвост» таблицы, и оператор SELECT именно в этом порядке и выводит их в результате
- 29 -
запроса. Этот естественный порядок можно изменить, используя ключевую фразу ORDER BY за которой следует перечисление полей, по которым происходит упорядочивание вывода. Сначала записи упорядочиваются по первому из перечисленных полей, потом по следующему и так далее. Для каждого поля может указываться порядок сортировки по возрастанию значения поля () или по его убыванию. В следующем примере будем сортировать нашу таблицу по фамилиям:
SELECT * FROM students ORDER BY family;
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 |
| м |
|
(7 rows) |
|
|
|
|
|
|
Теперь усложним порядок сортировки — сначала по номеру группы, а затем по фамилии:
SELECT * FROM |
students |
ORDER BY stgroup, family; |
||
family |
| name | |
stgroup | gpa |
| sex |
|
-------------- |
+-------- |
+--------- |
+---- |
+----- |
Балашов |
| Андрей |
| 342 |
| 5.00 |
| м |
Катеринченко |
| Андрей |
| 342 |
| 4.59 |
| м |
Никулкин |
| Сергей |
| 342 |
| 4.79 |
| м |
Фахрудинова |
| Тамара |
| 342 |
| 4.12 |
| ж |
Чертков |
| Максим |
| 344 |
| 4.31 |
| м |
Малин |
| Сергей |
| 345 |
| 4.87 |
| м |
Колычева |
| Лия |
| 349 |
| 4.38 |
| ж |
(7 rows) |
|
|
|
|
2.5.4. Формирование вывода запросов
Большинство основанных на SQL баз данных предоставляют специальные средства, позволяющие совершенствовать вывод ваших запросов.
Если надо выполнять простую числовую обработку данных, чтобы затем поместить их в форму, больше соответствующую
- 30 -
потребностям, то SQL позволит помещать скалярные выражения и константы среди выбранных полей. Эти выражения могут дополнять или замещать поля в предложениях SELECT и могут включать в себя одно или более выбранных полей.
Например, нам необходимо представить успеваемость студентов в процентах:
SELECT family, name, gpa/5*100 FROM students ;
family |
| name |
| |
|
-------------- |
+-------- |
+ |
-------------------------- |
Балашов |
| Андрей | |
100.00000000000000000000 |
|
Катеринченко |
| Андрей | |
91.80000000000000000000 |
|
Колычева |
| Лия |
| |
87.60000000000000000000 |
Малин |
| Сергей | |
97.40000000000000000000 |
|
Никулкин |
| Сергей | |
95.80000000000000000000 |
|
Фахрудинова |
| Тамара | |
82.40000000000000000000 |
|
Чертков |
| Максим | |
86.20000000000000000000 |
|
(7 rows) |
|
|
|
В запрос можно вставлять и символьные строки, так в следующем примере мы при перечислении полей введем строку
SELECT family, name, '%', gpa/5*100 FROM students ;
family |
| name | |
| |
|
-------------- |
+-------- |
+--- |
+---------------------- |
Балашов |
| Андрей | % | 100.000000000000000000 |
||
Катеринченко |
| Андрей | % | 91.800000000000000000 |
||
Колычева |
| Лия |
| % | 87.600000000000000000 |
|
Малин |
| Сергей | % | 97.400000000000000000 |
||
Никулкин |
| Сергей | % | 95.800000000000000000 |
||
Фахрудинова |
| Тамара | % | 82.400000000000000000 |
||
Чертков |
| Максим | % | 86.200000000000000000 |
||
(7 rows) |
|
|
|
2.5.5. Агрегатные группы
Агрегатные группы могут использоваться для группировки значений из таблиц по определенному признаку. В следующем примере нас интересует обобщенная информация о группе: максимальное MAX(), минимальное MIN(), среднее AVG() значение среднего балла и количество записей о студентах в каждой группе COUNT().
SELECT stgroup, MAX(gpa),
MIN(gpa), AVG(gpa), COUNT(gpa) FROM students GROUP BY stgroup;
