| Предисловие | 5 |
| Для кого предназначена эта книга | 9 |
| |
| Часть 1. Обзор языка SQL | 11 |
|
| |
| Глава 1. Обзор | 13 |
| |
| Язык SQL | 13 |
| Роль SQL | 15 |
| Достоинства SQL | 17 |
Независимость от конкретных СУБД | 18 |
Переносимость с одной вычислительной системы на другие | 18 |
Стандарты языка SQL | 18 |
Одобрение SQL компанией IBM (СУБД DB2) | 19 |
Протокол ODBC и компания Microsoft | 19 |
Реляционная основа | 19 |
Высокоуровневая структура, напоминающая английский язык | 20 |
Интерактивные запросы | 20 |
Программный доступ к базе данных | 20 |
Различные представления данных | 20 |
Полноценный язык для работы с базами данных | 21 |
Динамическое определение данных | 21 |
Архитектура клиент/сервер | 21 |
| |
| Глава 2. Краткое введение в SQL | 23 |
| |
| Простая база данных | 23 |
| Чтение данных | 24 |
| Получение итоговых данных | 26 |
| Добавление данных | 27 |
| Удаление данных | 27 |
| Обновление данных | 28 |
| Защита данных | 28 |
| Создание базы данных | 29 |
| Резюме | 30 |
| |
| Глава 3. Развитие SQL | 31 |
| |
| SQL и управление базами данных | 31 |
| Краткая история SQL | 32 |
Первые годы | 33 |
Первые реляционные СУБД | 34 |
СУБД компании IBM | 34 |
Коммерческое признание | 35 |
| Стандарты SQL | 37 |
Стандарты ANSI/ISO | 37 |
Другие стандарты SQL | 38 |
ODBC и консорциум SQL Access Group | 39 |
Миф о переносимости | 39 |
| SQL и сети | 41 |
Централизованная архитектура | 41 |
Архитектура файл/сервер | 42 |
Архитектура клиент/сервер | 43 |
| Влияние SQL | 44 |
SQL и спецификация SAA компании IBM | 44 |
SQL на мини-компьютерах | 45 |
SQL на системах UNIX | 45 |
SQL и обработка транзакций | 46 |
SQL на персональных компьютерах | 47 |
SQL в локальных вычислительных сетях | 48 |
| Резюме | 49 |
| |
| Глава 4. Реляционные базы данных | 51 |
| |
| Первые модели данных | 51 |
Системы управления файлами | 51 |
Иерархические СУБД | 53 |
Сетевые базы данных | 54 |
| Реляционная модель данных | 56 |
Учебная база данных | 57 |
Таблицы | 58 |
Первичные ключи | 60 |
Отношения предок/потомок | 61 |
Внешние ключи | 63 |
Двенадцать правил Кодда * | 64 |
| Резюме | 66 |
| |
| Часть 2. Чтение данных | 69 |
|
| |
| Глава 5. Основы SQL | 71 |
| |
| Операторы | 71 |
| Имена | 74 |
Имена таблиц | 75 |
Имена столбцов | 75 |
| Типы данных | 75 |
Дополнительные типы данных | 77 |
Различия в реализациях типов данных | 81 |
| Константы | 83 |
Числовые константы | 83 |
Строковые константы | 84 |
Константы даты и времени | 84 |
Символьные константы | 85 |
| Выражения | 87 |
| Встроенные функции | 88 |
| Отсутствующие данные (значения NULL) | 90 |
| Резюме | 91 |
| |
| Глава 6. Простые запросы на чтение | 91 |
| |
| Оператор SELECT | 91 |
Предложение SELECT | 93 |
Предложение FROM | 94 |
| Результаты запроса на чтение | 94 |
| Простые запросы | 97 |
Вычисляемые столбцы | 98 |
Чтение всех столбцов (оператор SELECT *) | 100 |
| Повторяющиеся строки (ключевое слово DISTINCT) | 101 |
| Отбор строк (предложение WHERE) | 102 |
| Условия поиска | 104 |
Сравнение (=, <>, <, <=, >, >=) | 105 |
Проверка на принадлежность диапазону значений (BETWEEN) | 108 |
Поверка на членство в множестве (IN) | 110 |
Проверка на соответствие шаблону (LIKE) | 112 |
Проверка на равенство значению NULL (IS NULL) | 114 |
Составные условия поиска (AND, OR и NOT) | 116 |
| Сортировка результатов запроса (предложение ORDER BY) | 119 |
| Правила выполнения однотабличных запросов | 121 |
Объединение результатов нескольких запросов (UNION) * | 122 |
Запрос на объединение и повторяющиеся строки * | 124 |
Запрос на объединение и сортировка * | 126 |
Многократные запросы на объединение * | 126 |
| Резюме | 128 |
| |
| Глава 7. Многотабличные запросы на чтение (объединения) | 129 |
| |
| Пример двухтабличного запроса | 129 |
| Простое объединение таблиц (объединение по равенству) | 131 |
Запросы с использованием отношения предок/потомок | 133 |
Объединения с условием для отбора строк | 135 |
Несколько связанных столбцов | 136 |
Запросы на чтение к трём и более таблицам | 136 |
Прочие объединения таблиц по равенству | 139 |
| Объединение таблиц по неравенству | 141 |
| Особенности многотабличных запросов | 142 |
Полные имена столбцов | 142 |
Чтение всех столбцов | 143 |
Самообъединения | 144 |
Псевдонимы таблиц | 147 |
| Производительность при обработке многотабличных запросов | 148 |
| Структура объединения таблиц | 149 |
Умножение таблиц | 149 |
Правила выполнения многотабличных запросов | 151 |
| Внешнее объединение таблиц * | 152 |
Левое и правое внешние объединения * | 156 |
Система записи внешнего объединения * | 157 |
| Объединения и стандарт SQL2 | 159 |
Внутренние объединения в стандарте SQL2 | 160 |
Внешние объединения в стандарте SQL2 | 162 |
Перекрёстные объединения и запросы на объединение в SQL2 | 163 |
Многотабличные объединения в стандарте SQL2 | 164 |
| Резюме | 166 |
| |
| Глава 8. Итоговые запросы на чтение | 167 |
| |
| Агрегатные функции | 167 |
Вычисление суммы столбца (SUM) | 169 |
Вычисление среднего значения столбца (AVG) | 170 |
Вычисление экстремумов (MIN и МАХ) | 171 |
Вычисление количества значений в столбце (COUNT) | 172 |
Агрегатные функции в списке возвращаемых столбцов | 173 |
Агрегатные функции и значения NULL | 176 |
Удаление повторяющихся строк (DISTINCT) | 177 |
| Запросы с группировкой (предложение GROUP BY) | 179 |
Несколько столбцов группировки | 181 |
Ограничения на запросы с группировкой | 185 |
Значения NULL в столбцах группировки | 186 |
| Условия поиска групп (предложение HAVING) | 187 |
Ограничения на условия поиска групп | 191 |
Значения NULL и условия поиска групп | 191 |
Предложение HAVING без GROUP BY | 192 |
| Резюме | 192 |
| |
| Глава 9. Вложенные запросы на чтение | 193 |
| |
| Применение вложенных запросов | 193 |
Что такое вложенный запрос | 194 |
Вложенные запросы в предложении WHERE | 195 |
Внешние ссылки | 197 |
| Условия поиска во вложенном запросе | 197 |
Сравнение с результатом вложенного запроса (=, <>, <, <=, >, >=) | 198 |
Проверка на принадлежность результатам вложенного запроса (IN) | 200 |
Проверка на существование (EXISTS) | 201 |
Многократное сравнение (ANY и ALL) * | 203 |
| Вложенные запросы и объединения | 208 |
| Уровни вложенности запросов | 210 |
| Связанные вложенные запросы * | 211 |
| Вложенные запросы в предложении HAVING * | 214 |
| Резюме | 216 |
| SQL-запросы на чтение — заключительное резюме | 217 |
| |
| Часть 3. Изменение данных | 219 |
|
| |
| Глава 10. Внесение изменений в базу данных | 221 |
| |
| Добавление новых данных | 221 |
Однострочный оператор INSERT | 222 |
Многострочный оператор INSERT | 226 |
Утилиты пакетной загрузки | 228 |
| Удаление существующих данных | 229 |
Оператор DELETE | 229 |
Удаление всех строк | 231 |
Оператор DELETE с вложенным запросом * | 232 |
| Обновление существующих данных | 234 |
Оператор UPDATE | 234 |
Обновление всех строк | 236 |
Оператор UPDATE с вложенным запросом * | 237 |
| Резюме | 238 |
| |
| Глава 11. Целостность данных | 239 |
| |
| Условия целостности данных | 239 |
| Обязательность данных | 241 |
| Проверка на правильность | 242 |
| Целостность таблицы | 243 |
Прочие условия уникальности | 244 |
Уникальность и значения NULL | 244 |
| Ссылочная целостность | 245 |
Проблемы, связанные со ссылочной целостностью | 246 |
Правила удаления и обновления * | 249 |
Каскадные удаления и обновления * | 252 |
Ссылочные циклы * | 254 |
Внешние ключи и значения NULL * | 257 |
| Деловые правила | 259 |
Что такое триггер | 260 |
Триггеры и ссылочная целостность | 261 |
Достоинства и недостатки триггеров | 262 |
Триггеры и стандарты SQL | 262 |
| Резюме | 263 |
| |
| Глава 12. Обработка транзакций | 265 |
| |
| Что такое транзакция | 265 |
Операторы COMMIT и ROLLBACK | 266 |
Модель транзакции в стандарте ANSI/ISO | 269 |
Другие модели транзакций | 270 |
| Журнал транзакций * | 273 |
| Транзакции и работа в многопользовательском режиме | 274 |
Проблема пропавшего обновления | 275 |
Проблема промежуточных данных | 276 |
Проблема несогласованных данных | 277 |
Проблема строк-призраков | 278 |
Параллельные транзакции | 279 |
| Блокировка * | 281 |
Уровни блокировки | 282 |
Жёсткая и нежёсткая блокировки | 283 |
Тупиковые ситуации * | 284 |
Усовершенствованные методы блокировки * | 286 |
| Резюме | 292 |
| |
| Часть 4. Структура базы данных | 293 |
|
| |
| Глава 13. Создание баз данных | 295 |
| |
| Язык определения данных | 295 |
| Создание базы данных | 297 |
| Определения таблиц | 298 |
Создание таблицы (оператор CREATE TABLE) | 298 |
Удаление таблицы (оператор DROP TABLE) | 306 |
Изменение определения таблицы (оператор ALTER TABLE) | 307 |
| Определение ограничительных условий | 310 |
Условия проверки | 311 |
Утверждения | 312 |
Определения доменов | 312 |
| Синонимы (операторы CREATE/DROP SYNONYM) | 313 |
| Индексы (операторы CREATE/DROP INDEX) | 314 |
| Другие объекты базы данных | 317 |
| Структура базы данных | 319 |
Однобазовая архитектура | 320 |
Многобазовая архитектура | 321 |
Каталоговая архитектура | 323 |
| DDL и стандарт ANSI/ISO | 325 |
| Резюме | 328 |
| |
| Глава 14. Представления | 329 |
| |
| Что такое представление | 329 |
Как СУБД работает с представлениями | 331 |
Преимущества представлений | 331 |
Недостатки представлений | 332 |
| Создание представлений (оператор CREATE VIEW) | 332 |
Горизонтальные представления | 333 |
Вертикальные представления | 335 |
Смешанные представления | 336 |
Сгруппированные представления | 337 |
Объединённые представления | 339 |
| Обновление представлений | 340 |
Обновление представлений и стандарт ANSI/ISO | 342 |
Обновление представлений в коммерческих СУБД | 342 |
Контроль обновления представления (предложение WITH CHECK OPTION) | 343 |
| Удаление представления (оператор DROP VIEW) | 345 |
| Резюме | 346 |
| |
| Глава 15. SQL и безопасность баз данных | 347 |
| |
| Принципы защиты данных, применяемые в SQL | 347 |
Идентификатор пользователя | 349 |
Защищаемые объекты | 353 |
Привилегии | 353 |
| Представления и защита данных в SQL | 355 |
| Предоставление привилегий (оператор GRANT) | 358 |
Привилегии на столбцы | 359 |
Передача привилегий (предложение WITH GRANT OPTION) | 361 |
| Отмена привилегий (оператор REVOKE) | 363 |
Оператор REVOKE и право предоставления привилегий | 365 |
Оператор REVOKE и стандарт ANSI/ISO | 367 |
| Резюме | 368 |
| |
| Глава 16. Системный каталог | 369 |
| |
| Что такое системный каталог | 369 |
Системный каталог и средства формирования запросов | 370 |
Системный каталог и стандарт ANSI/ISO | 371 |
Содержимое системного каталога | 372 |
| Информация о таблицах | 373 |
| Информация о столбцах | 376 |
| Информация о представлениях | 378 |
| Комментарии и метки | 380 |
| Информация об отношениях между таблицами | 381 |
| Информация о пользователях | 383 |
| Информация о привилегиях | 384 |
| Информационная схема в стандарте SQL2 | 386 |
| Прочая информация | 391 |
| Резюме | 392 |
| |
| Часть 5. Программирование на SQL | 393 |
|
| |
| Глава 17. Встроенный SQL | 395 |
| |
| Обзор программного SQL | 395 |
Выполнение операторов SQL в СУБД | 397 |
| Основные концепции встроенного SQL | 399 |
Разработка программы со встроенным SQL | 401 |
Выполнение программы со встроенным SQL | 403 |
| Простые операторы встроенного SQL | 406 |
Объявления таблиц | 409 |
Обработка ошибок | 410 |
Использование базовых переменных | 416 |
| Чтение данных с помощью встроенного SQL | 423 |
Однострочные запросы | 424 |
Многострочные запросы | 430 |
| Удаления и обновления данных с использованием курсоров | 439 |
| Курсоры и обработка транзакций | 444 |
| Резюме | 445 |
| |
| Глава 18. Динамический SQL* | 447 |
| |
| Недостатки статического SQL | 447 |
| Основная концепция динамического SQL | 449 |
| Динамическое выполнение операторов (оператор EXECUTE IMMEDIATE) | 451 |
| Динамическое выполнение в два этапа | 453 |
Оператор PREPARE | 456 |
Оператор EXECUTE | 457 |
| Оператор DECLARE STATEMENT | 465 |
| Динамические запросы на чтение | 466 |
Оператор DESCRIBE | 471 |
Динамический оператор DECLARE CURSOR | 474 |
Динамический оператор OPEN | 475 |
Динамический оператор FETCH | 477 |
Динамический оператор CLOSE | 478 |
| Диалекты динамического SQL | 478 |
Динамический SQL в SQL/DS | 479 |
Динамический SQL в Oracle * | 482 |
| Динамический SQL и стандарт SQL2 | 485 |
Стандарт SQL2 и область SQLDA | 488 |
Стандарт SQL2 и динамические SQL-запросы | 492 |
| Резюме | 495 |
| |
| Глава 19. Интерфейсы программирования приложений SQL | 497 |
| |
| Принципы применения интерфейса программирования приложений | 497 |
| Интерфейс программирования приложений в SQL Server | 499 |
Основные принципы работы SQL Server | 501 |
Запросы на чтение в SQL Server | 509 |
Хранимые процедуры | 514 |
Позиционные обновления | 521 |
Динамические запросы | 526 |
| Другие интерфейсы программирования приложений | 529 |
Интерфейс вызовов в Oracle | 530 |
Интерфейс программирования приложений в SQLBase | 534 |
| Резюме | 539 |
| |
| Часть 6. Перспективы развития языка SQL | 535 |
|
| |
| Глава 20. Управление распределёнными базами данных | 537 |
| |
| Проблемы управления распределёнными данными | 537 |
| Уровни доступа к распределённым данным | 542 |
Удалённые запросы | 543 |
Удалённые транзакции | 544 |
Распределённые транзакции | 545 |
Распределённые запросы | 547 |
| Распределённые таблицы | 549 |
Горизонтальное разделение таблиц | 549 |
Вертикальное разделение таблиц | 551 |
Зеркальные таблицы | 552 |
Реплицированные таблицы | 553 |
| Метод двухфазного выполнения * | 555 |
| Резюме | 559 |
| |
| Глава 21. SQL и основные тенденции развития баз данных | 561 |
| |
| Тенденции на рынке баз данных | 561 |
| Повышение производительности аппаратного обеспечения | 563 |
| Война за показатели производительности | 565 |
| Стандарты языка SQL | 566 |
| Расширения языка SQL | 568 |
| Сложные типы данных | 569 |
| Приложения для архитектуры клиент/сервер | 570 |
| Доступ к реляционным базам данных из приложений для персональных |
компьютеров | 571 |
| Клиентские программы для работы с базами данных | 572 |
| Распределённые базы данных | 573 |
| Объектно-ориентированные базы данных | 573 |
| |
| Приложение А. Учебная база данных | 577 |
| Приложение Б. Синтаксис языка SQL (стандарт ANSI/ISO) | 583 |
| Предметный указатель | 587 |