
- •Понимание sql (Understanding sql)
- •С о д е р ж а н и е
- •Введение в реляционную базу данных
- •В в е д е н и е
- •Что такое - реляционная база данных?
- •Связывание одной таблицы с другой
- •Порядок строк произволен
- •Идентификация строк ( первичные ключи )
- •Столбцы именуются и нумеруются
- •Типовая база данных
- •Работа с sql
- •2. Sql : обзор
- •Как работает sql?
- •Что делает ansi ?
- •Интерактивный и вложенный sql
- •Субподразделения sql
- •Различные типы данных
- •Sql несогласованности
- •Что такое - пользователь?
- •Условия и терминология
- •Работа с sql
- •Команда select
- •Выбирайте всегда самый простой способ
- •Описание select
- •Просмотр только определенного столбца таблицы
- •Переупорядочение столбца
- •Удаление избыточных данных
- •Параметры distinct
- •Distinct вместо all
- •Квалифицированный выбор при использовании предложений
- •Работа с sql
- •4. Использование реляционных и булевых операторов для создания более изощренных предикатов
- •Реляционные операторы
- •Булевы операторы
- •Работа с sql
- •5. Использование специальных операторов в условиях
- •Оператор in
- •Оператор between
- •Оператор like
- •Работа с нулевыми( null ) значениями
- •Null оператор
- •Использование not со специальными операторами
- •Работа с sql
- •6. Обобщение данных с помощью агрегатных функций
- •Что такое агрегатные функции ?
- •Как использовать агрегатные функции ?
- •Специальные атрибуты count
- •Использование distinct
- •Использование count со строками, а не значениями
- •Включение дубликатов в агрегатные функции
- •Агрегаты построенные на скалярном выражении
- •Предложение group by
- •Предложение having
- •Не делайте вложенных агрегатов
- •Работа с sql
- •7. Формирование выводов запросов
- •Строки и выражения
- •Скалярное выражение с помощью выбранных полей
- •Столбцы вывода
- •Помещение текста в вашем выводе запроса
- •Упорядочение вывода полей
- •Упорядочение с помощью многочисленных столбцов
- •Упорядочение агрегатных групп
- •Упорядочение вывода по номеру столбца
- •Упорядочение с помощью оператора null
- •Работа с sql
- •8. Запрашивание многочисленных таблиц также как одной
- •Объединение таблиц
- •Имена таблиц и столбцов
- •Создание объединения
- •Объединение таблиц через справочную целостность
- •Объединения таблиц по равенству значений в столбцах и другие виды объединений
- •Объединение более двух таблиц
- •Работа с sql
- •9. Объединение таблицы с собой
- •Как делать объединение таблицы с собой ?
- •Псевдонимы
- •Устранение избыточности
- •Проверка ошибок
- •Больше псевдонимов
- •Еще больше комплексных объединений
- •Работа с sql
- •10. Вставка одного запроса внутрь другого
- •Как работает подзапрос?
- •Значения, которые могут выдавать подзапросы
- •Distinct с подзапросами
- •Предикаты с подзапросами являются необратимыми
- •Использование агрегатных функций в подзапросах
- •Использование подзапросов которые выдают много строк с помощью оператора in
- •Подзапросы выбирают одиночные столбцы
- •Использование выражений в подзапросах
- •Подзапросы в предложении having
- •Работа с sql
- •11. Соотнесенные подзапросы
- •Как сформировать соотнесенный подзапрос
- •Как работает соотнесенный подзапрос
- •Использование соотнесенных подзапросов для нахождения ошибок
- •Сравнение таблицы с собой
- •Соотнесенные подзапросы в предложении having
- •Соотнесенные подзапросы и объединения
- •Работа с sql
- •12. Использование оператора exists
- •Как работает exists?
- •Выбор столбцов с помощью exists
- •Использование exists с соотнесенными подзапросами
- •Комбинация из exists и объединения
- •Использование not exists
- •Exists и агрегаты
- •Более удачный пример подзапроса
- •Работа с sql
- •13. Использование операторов any, all и some
- •Специальные операторы any или some
- •Использование операторов in или exists вместо оператора any
- •Как any может стать неоднозначным
- •Специальный оператор all
- •Равенства и неравенства
- •Правильное понимание any и all
- •Как any, all, и exist поступают с отсутствующими и неизвестными данными
- •Когда подзапрос возвращается пустым
- •Any и all вместо exists с пустым указателем( null )
- •Использование count вместо exists
- •Работа с sql
- •14. Использование предложения union
- •Объединение многочисленных запросов в один
- •Когда вы можете делать объединение между запросами ?
- •Union и устранение дубликатов
- •Использование строк и выражений с union
- •Использование union с order by
- •Внешнее объединение
- •Работа с sql
- •15. Ввод, удаление и изменение значений полей
- •Команды модификации языка dml
- •Ввод значений
- •Вставка пустых указателей (null)
- •Именование столбца для вставки (insert)
- •Вставка результатов запроса
- •Удаление строк из таблиц
- •Изменение значений поля
- •Модифицирование только определенных строк
- •Команда update для многих столбцов
- •Использование выражений для модификации
- •Модифицирование пустых(null) значений
- •Работа с sql
- •16. Использование подзапросов с командами модификации
- •Использование подзапросов с insert
- •Не вставляйте дубликаты строк
- •Использование подзапросов созданных во внешней таблице запроса
- •Использование подзапросов с delete
- •Использование подзапросов с update
- •Столкновение с ограничениями подзапросов команды dml
- •Работа с sql
- •17. Создание таблиц
- •Команда создания таблицы
- •Индексы
- •Уникальность индекса
- •Удаление индексов
- •Изменение таблицы после того как она была создана
- •Удаление таблицы
- •Работа с sql
- •18. Ограничение значений ваших данных
- •Ограничение таблиц
- •Объявление ограничений
- •Использование ограничений для исключения пустых( null ) указателей
- •Убедитесь что значения - уникальны
- •Уникальность как ограничение столбца
- •Уникальность как ограничение таблицы
- •Ограничение первичных ключей
- •Первичные ключи более чем одного поля
- •Проверка значений полей
- •Использование - check, чтобы предопределять допустимое вводимое значение
- •Проверка условий базирующийся на многочисленных полях
- •Установка значений по умолчанию
- •Работа с sql
- •19. Поддержка целостности ваших данных
- •Внешний ключ и родительский ключ
- •Много-столбцовые внешние ключи
- •Смысл внешнего и родительского ключей
- •Ограничение foreign key
- •Как можно поля представить в качестве внешних ключей
- •Внешний ключ как ограничение таблицы
- •Внешний ключ как ограничение столбцов
- •Не указывать список столбцов первичных ключейm
- •Как справочная целостность ограничивает значения родительского ключа
- •Первичный ключ как уникальный внешний ключ
- •Ограничения внешнего ключа
- •Что случится, если вы выполните команду модификации
- •Включение описаний таблицы
- •Действие ограничений
- •Внешние ключи которые ссылаются обратно к их подчиненным таблицам
- •Работа с sql
- •20. Введение: представления
- •Что такое представление ?
- •Команда create view
- •Модифицирование представлений
- •Именование столбцов
- •Комбинирование предикатов представлений и основных запросов в представлениях
- •Групповые представления
- •Представления и объединения
- •Представления и подзапросы
- •Что не могут делать представления
- •Удаление представлений
- •Работа с sql
- •21. Изменение значений с помощью представлений
- •Модифицирование представления
- •Определение модифицируемости представления
- •Модифицируемые представления и представления только_чтение.
- •Что является - модифицируемыми представлением
- •Проверка значений помещаемых в представление
- •Предикаты и исключенные поля
- •Проверка представлений которые базируются на других представлениях
- •Работа с sql
- •22. Кто что может делать в базе данных
- •Пользователи
- •Регистрация
- •Предоставление привилегий
- •Стандартные привилегии
- •Команда grant
- •Группы привилегий, группы пользователей
- •Ограничение привилегий на определенные столбцы
- •Использование аргументов all и public
- •Предоставление привилегий с помощью with grant option
- •Отмена привилегий
- •Использование представлений для фильтрации привилегий
- •Кто может создавать представления?
- •Другие типы привилегий
- •Типичные привилегии системы
- •Создание и удаление пользователей
- •Работа с sql
- •23. Глобальные аспекты sql
- •Переименование таблиц
- •Переименование с тем же самым именем
- •Одно имя для каждого
- •Удаление синонимов
- •Как база данных распределена для пользователей ?
- •Когда сделанные изменения становятся постоянными ?
- •Как sql общается сразу со многими пользователями
- •Типы блокировок
- •Другие способы блокировки данных
- •Работа с sql
- •24. Как данные sql содержатся в упорядоченном виде
- •Каталог системы
- •Типичный системный каталог
- •Использование представлений в таблицах каталога
- •Комментарий в содержании каталога
- •Остальное из каталога
- •Systemindexes - индексация в базе данных
- •Systemuserauth - пользовательские и системные привилегии в базе данных
- •Systemtabauth - привилегии объекта которые не определяют столбцы
- •Systemcolauth
- •Systemsynons - синонимы для таблиц в базе данных
- •Другое использование каталога
- •Работа с sql
- •25. Использование sql с другим языком ( вложенный sql )
- •Что такое - вложение sql
- •Зачем вкладывать sql?
- •Как делаются вложения sql.
- •Использование переменных основного языка в sql
- •Объявление переменных
- •Извлечение значений переменных
- •Sql коды
- •Использование sqlcode для управления циклами
- •Предложение whenever
- •Модифицирование курсоров
- •Переменная indicator
- •Использование переменной indicator для эмуляции null значений sql
- •Примечание: Последняя строка этого примера содержит ремарку - { begin и end необходимы только для понимания }
- •Другое использование переменной indicator
- •Работа с sql
- •Приложение a
- •Глава 5
- •Глава 6
- •Глава 7
- •Глава 8
- •Глава 9
- •Глава 10
- •Глава 11
- •Глава 12
- •Глава 13
- •Глава 14
- •Глава 15
- •Глава 16
- •Глава 17
- •Глава 18
- •Глава 19
- •Глава 20
- •Глава 21
- •Глава 22
- •Глава 23
- •Глава 24
- •Глава 25
- •Приложение b
- •Типы данных в sql
- •Типы ansi
- •Эквивалентные типы данных в других языках
- •Типы текстовой строки
- •Команда format
- •Функции
- •Математические функции
- •Символьные функции
- •Функции даты и времени
- •Другие функции
- •Intersect и minus
- •Автоматические внешние объединения
- •Отслеживание действий
- •Приложение d
- •Синтаксис и команда ссылки
- •Sql элементы
- •Элементы языка бейсика
- •Функциональные элементы
- •Предикаты
- •Sql команды
- •Create view (создать просмотр)
- •Declare cursor (объявить курсор)
- •Delete (удалить)
- •Exec sql (выполнить sql)
- •Fetch (выборка)
- •Grant (передать права)
- •Insert (вставка)
- •Union (объединение)
- •Update (модификация)
- •Whenever (всякий раз как)
- •Приложение e
- •Таблицы, используемые в sql
Проверка значений полей
Конечно, имеется любое число ограничений которые можно устанавливать для данных вводимых в ваши таблицы, чтобы видеть, например, находятся ли данные в соответствующем диапазоне или правильном формате, о чем SQL естественно не может знать заранее. По этой причине, SQL обеспечивает вас ограничением CHECK, которое позволяет вам установить условие которому должно удовлетворять значение вводимое в таблицу, прежде чем оно будет принято. Ограничение CHECK состоит из ключевого слова CHECK сопровождаемого предложением предиката, который использует указанное поле. Любая попытка модифицировать или вставить значение пол которое могло бы сделать этот предикат неверным - будет отклонена. Давайте рассмотрим еще раз таблицу Продавцов. Столбец комиссионных выражается десятичным числом и поэтому может быть умножен непосредственно на сумму приобретений в результате чего будет получена сумма комиссионных(в долларах) продавца с установленным справа значком доллара( $ ) . Кто-то может использовать понятие процента, однако ведь, можно об этом и не знать. Если человек введет по ошибке 14 вместо .14 чтобы указать в процентах свои комиссионные, это будет расценено как 14.0 , что является законным десятичным значением, и будет нормально воспринято системой. Чтобы предотвратить эту ошибку, мы можем наложить ограничение столбца - CHECK чтобы убедиться что вводимое значение меньше чем 1.
CREATE TABLE Salespeople
( snum integer NOT NULL PRIMARY KEY,
sname char(10) NOT NULL UNIQUE,
city char(10),
comm decimal CHECK ( comm < 1 ));
Использование - check, чтобы предопределять допустимое вводимое значение
Мы можем также использовать ограничение CHECK чтобы защитить от ввода в поле определенных значений, и таким образом предотвратить ошибку. Например, предположим, что единственными городами в которых мы имели ведомства сбыта являются Лондон, Барселона, Сан Хосе, и Нью Йорк. Если вам известны все продавцы работающие в каждом из этих ведомств, нет необходимости позволять ввод других значений. Если же нет, использование ограничения может предотвратить опечатки и другие ошибки.
CREATE TABLE Salespeople
(snum integer NOT NULL UNIQUE,
sname char(10) NOT NULL UNIQUE,
city char(10) CHECK,
(city IN ('London', 'New York', 'San Jose', 'Barselona')),
comm decimal CHECK (comm < 1 ));
Конечно, если вы собираетесь сделать это, вы должны быть уверены что ваша компания не открыла уже новых других ведомств сбыта. Большинство программ баз данных поддерживают команду ALTER TABLE( см. Главу 17 ) которая позволяет вам изменять определение таблицы, даже когда она находится в использовании. Однако, изменение или удаление ограничений не всегда возможно для этих команд, даже там где это вроде бы поддерживается. Если вы использовали систему которая не может удалять ограничения, вы будете должны создавать (CREATE) новую таблицу и передавать информацию из старой таблицы в нее всякий раз, когда вы хотите изменить ограничение. Конечно же Вы не захотите делать это часто, и со временем вообще перестанете это делать. Создадим таблицу Порядков:
CREATE TABLE Orders
(onum integer NOT NULL UNIQUE,
amt decimal,
odate date NOT NULL,
cnum integer NOT NULL,
snum integer NOT NULL);
Как мы уже говорили в Главе 2, тип DATЕ(ДАТА) широко поддерживается, но не является частью стандарта ANSI. Что же делать если мы используем базу данных, которая следу ANSI, не распознает тип DATЕ? Если мы объявим поле odate любым типом числа, мы не сможем использовать наклонную черту вправо (/) или черточку (-) в качестве раздели- тел. Так как печатаемые номера - это символы ASCII, мы можем объявить тип поля date - CHAR. Основная проблема в том, что мы будем должны использовать одиночные кавычки всякий раз, когда ссылаемся на значение пол odate в запросе. Нет более простого решения этой проблемы там где тип DATЕ стал таким популярным. В качестве иллюстрации, давайте объявим поле odate - типом CHAR. Мы можем по край- ней мере наложить на него наш формат с ограничением CHECK:
CREATE TABLE Orders
( onum integer NOT NULL UNIQUE,
amt decimal,
odate char (10) NOT NULL CHECK ( odate LIKE
'--/--/----'),
cnum NOT NULL,
snum NOT NULL );
Кроме того, если вы хотите, вы можете наложить ограничение, гарантирующие что введенные символы - числа, и что они - в пределах значений нашего диапазона.