
- •Глава 1. Файловые системы и базы данных 12
- •Глава 2. Логические структуры реляционной модели 33
- •Глава 3. Ddl – Язык определения данных реляционной модели 62
- •Глава 4. Dml – Язык манипулирования данными реляционной модели 81
- •Глава 5. Dds – Средства администрирования баз данных 116
- •Глава 6. Информационные системы с активным сервером баз данных 121
- •Глава 7. Xml как способ логического представления информации 158
- •Глава 8. Sql и xml 178
- •Введение
- •Глава 1.Файловые системы и базы данных
- •1.2.История систем управления данными
- •1.3.Становление концепции баз данных
- •1.3.1.Файловая система как способ отделения логической и физической структуры данных
- •1.3.2.Структуры данных
- •1.3.3.Целостность данных и метаданные
- •1.3.4.Язык запросов sql
- •1.3.5.Язык sql и унифицированные процедуры
- •1.4.Организация информационных систем на базе субд
- •1.4.1.Субд как средство обеспечения логической и физической независимости данных
- •1.4.2.Субд в составе информационной системы
- •1.4.3.Выделение субд в качестве отдельного компонента информационной системы
- •Глава 2.Логические структуры реляционной модели
- •2.1.Основы реляционной алгебры
- •2.1.1.Объекты и их определения
- •Множество
- •Декартово произведение
- •Отношение
- •Атрибут отношения
- •Заголовок и тело отношения
- •2.1.2.Операторы Объединение отношений
- •Разность отношений
- •Пересечение отношений
- •Произведение отношений
- •Проекция отношения на компоненты
- •Выборка отношения
- •2.2.Основные понятия реляционных баз данных
- •2.2.1.Учебная база данных
- •2.2.2.Первичные ключи
- •2.2.3.Отношение предок/потомок
- •2.2.4.Внешние ключи
- •2.2.5.Индексы
- •2.3.Целостность данных
- •2.3.1.Условия целостности данных
- •2.3.2.Изменения, способные нарушить ссылочную целостность
- •2.3.3.Правила ссылочной целостности
- •2.4.Нормализация данных
- •2.4.1.Понятие функциональной зависимости
- •2.4.2.Первая нормальная форма: атомарные атрибуты
- •2.4.3.Вторая нормальная форма: отсутствие зависимостей частичного ключа
- •2.4.4.Третья нормальная форма: устранение транзитивных зависимостей
- •2.5.Системный каталог
- •2.5.1.Назначение системного каталога
- •2.5.2.Структура системного каталога
- •2.5.3.Информация о таблицах
- •2.5.4.Информация о столбцах
- •2.5.5.Информация о представлениях
- •2.5.6.Информация об отношениях между таблицами
- •2.5.7.Информация о пользователях
- •2.5.8.Информация о привилегиях
- •Глава 3.Ddl – Язык определения данных реляционной модели
- •3.1.Создание базы данных
- •3.1.1.Общий формат оператора create database
- •3.1.2.Определение пароля
- •3.1.3.Указание размера страницы бд
- •3.1.4.Указание национальной кодировки символов
- •3.1.5.Типы данных
- •3.2.Создание доменов
- •3.2.1.Общий формат оператора create domain
- •3.2.2.Ограничения на значения столбцов, ассоциированных с доменом
- •3.2.3.Изменение определения домена
- •3.3.Создание таблиц
- •3.3.1.Инструкция create table
- •Определение столбцов
- •Предложения primary key и foreign key
- •Предложение unique
- •Предложение check
- •3.3.2.Инструкция alter table
- •Добавление столбца
- •Удаление столбца
- •Изменение первичных и вторичных ключей
- •3.4.Создание представлений (view)
- •3.4.1.Общий формат оператора create view
- •3.4.2.Горизонтальное представление
- •3.4.3.Вертикальное представление
- •3.4.4.Удаление представления
- •3.4.5.Недостатки представлений
- •3.5.Создание индексов
- •3.5.1.Общий формат оператора create index
- •3.5.2.Необходимость создания индексов
- •3.5.3.Удаление индекса
- •Глава 4.Dml – Язык манипулирования данными реляционной модели
- •4.1.Оператор выборки select
- •4.1.1.Общий формат оператора select
- •4.1.2.Предложение select
- •4.1.3.Предложение from
- •4.1.4.Предложение where
- •Сравнение
- •Проверка на принадлежность диапазону
- •Проверка на членство в множестве
- •Проверка на соответствие шаблону
- •Проверка на значение null
- •4.1.5.Правила выполнения запроса select
- •4.2.Агрегатные функции
- •4.2.1.Вычисление среднего значения столбца
- •4.2.2.Вычисление суммы значений столбца
- •4.2.3.Вычисление экстремумов
- •4.2.4.Вычисление количества значений в столбце
- •4.2.5.Правила выполнения запросов, в котором участвуют агрегатные функции
- •4.3.Запросы с группировкой
- •4.3.1.Предложение group by
- •4.3.2.Предложение having
- •4.3.3.Предложение order by − определение сортировки
- •4.3.4.Правила выполнения запросов с группировкой
- •4.4.Вложенные запросы
- •4.4.1.Определение подчиненных запросов
- •4.4.2.Условия отбора в подчиненном запросе
- •Сравнение с результатом полученного запроса
- •Проверка на принадлежность результатам вложенного запроса
- •Проверка на существование
- •Многократное сравнение
- •4.4.3.Подчиненные запросы в предложении having
- •4.4.4.Правила выполнения вложенных запросов
- •4.5.Многотабличные запросы
- •4.5.1.Алгоритм выполнения многотабличного запроса
- •4.5.2.Внутреннее объединение таблиц
- •Объединение таблиц по равенству
- •Запросы с использованием отношенияпредок-потомок
- •Запросы на основе составных ключей
- •Правила выполнения многотабличных запросов на выборку
- •4.5.3.Внешнее объединение таблиц
- •Правила выполнения внешних объединений
- •Левое внешнее объединение
- •Правое внешнее объединение
- •Полное внешнее объединение
- •4.6. Операторы обновления данных
- •4.6.1.Оператор insert
- •Однострочная инструкция insert
- •Многострочная инструкция insert
- •4.6.2.Оператор update
- •4.6.3.Оператор delete
- •Глава 5.Dds – Средства администрирования баз данных
- •5.1.Назначение и ликвидация прав
- •5.1.1.Команда grant
- •5.1.2.Команда revoke
- •5.2.Назначение прав исполнения хранимых процедур
- •5.3.Создание группы управления правами – роли
- •5.3.5.Связывание пользователей с ролями
- •Глава 6.Информационные системы с активным сервером баз данных
- •6.1.Хранимые процедуры или функции
- •6.1.1.Структура языка
- •Комментарии
- •6.1.2.Команды и выражения
- •Команды
- •Выражения
- •6.1.3.Переменные
- •Типы данных
- •Объявление переменных
- •Присваивание
- •Аргументы
- •6.1.4.Возвращение переменных
- •6.1.5.Атрибуты
- •Атрибут %type
- •Атрибут %rowtype
- •6.1.6.Конкатенация
- •6.1.7.Передача управления
- •Условные команды
- •6.1.8.Обработка ошибок и исключений
- •6.1.9.Вызов функций
- •6.2.Триггеры
- •6.2.1.Создание триггера
- •6.2.2.Получение информации о триггерах
- •6.2.3.Удаление триггера
- •6.2.4.Pl/pgSql и триггеры
- •Глава 7.Xml как способ логического представления информации
- •7.1.Язык html и его недостатки
- •7.2.Язык xml и его основы
- •7.2.1.Объявление xml
- •7.2.2.Элементы и теги
- •7.2.3.Атрибуты
- •7.2.4.Иерархичность структуры xml-документа
- •7.2.5.Комментарии
- •7.3.Xml Схемы и метаданные
- •7.3.1.Структурирование данных и схема xml
- •7.3.2.Типы данных в схеме xml
- •7.3.3.Элементы и атрибуты в xml Схеме
- •7.3.4.Пространство имен
- •7.4.Стили и форматирование данных xml
- •7.4.1.Основы xsl
- •7.4.2.Структура таблицы стилей xsl
- •Последовательности
- •Шаблоны
- •Глава 8.Sql и xml
- •8.1.Xml как средство представления структурированных данных
- •8.1.1.Представление структурированных данных в xml
- •8.1.2.Сравнение xml и sql
- •8.2.Использование xml с базами данных
- •8.2.1.Хранение данных в формате xml
- •8.2.2.Вывод в формате xml
- •8.2.3.Ввод в формате xml
- •8.2.4.Обмен данными в формате xml
- •8.2.5.Интеграция данных в формате xml
- •Приложение Учебная база данных
Присваивание
Присваивание в PL/pgSQL выполняется оператором присваивания (:=) в форме левая_ переменная := правая_переменная.
Команда присваивает левой переменной значение правой переменной. Также допускается запись вида левая_переменная := выражение.
В этом случае левой переменной присваивается результат выражения, расположенного справа от оператора присваивания.
Значения по умолчанию также могут присваиваться переменным в секции объявлений программных блоков PL/pgSQL. Инициализация переменной производится оператором присваивания (:=) в одной строке с объявлением переменной. Эта тема подробно рассматривается ниже, а в листинге 6.8 приведен небольшой пример.
Листинг 6.8. Инициализация переменной
CREATE FUNCTION идентификатор (аргументы) RETURNS тип AS '
DECLARE
a_integer int4 := 10;
BEGIN
команда;
END;
' LANGUAGE 'plpgsql';
Возможен и другой вариант присваивание переменной результата запроса командой SELECT INTO. He путайте этот вариант использования команды SELECT INTO с командой SQL SELECT INTO, которая заносит результаты запроса в новую таблицу.
Команда SELECT INTO в основном требуется для сохранения данных записей в переменных, объявленных с типами ROWTYPE и RECORD. Чтобы команда SELECT INTO могла использоваться с обычной переменной, тип этой переменной должен соответствовать типу поля, упоминаемому в команде SQL SELECT.
Синтаксис команды SELECT INTO:
CREATE FUNCTION идентификатор (аргументы) RETURNS тип AS '
DECLARE
команда;
BEGIN
SELECT INTO переменная [. ...] поле [, ...] секции_select;
END;
' LANGUAGE 'plpgsql':
В этом описании переменная имя переменной, участвующей в присваивании, a ceкции select любые поддерживаемые секции команды SQL SELECT, обычно следующие за списком целевых полей в команде SELECT.
В листинге 6.9 приведена простая функция, в которой используется команда SELECT INTO. Ключевое слово ALIAS описано в подразделе этого раздела. Примеры выполнения команды SELECT INTO для переменных типа RECORD и ROWTYPE приведены в разделе 6.1.7.
Листинг 6.9. Использование команды SELECT INTO
CREATE FUNCTION get_customer_id (text.text) RETURNS integer AS '
DECLARE
-- Объявление псевдонимов для аргументов.
l_name ALIAS FOR $1;
f_name ALIAS FOR $2;
-- Объявление переменной для хранения кода клиента.
customer_id integer;
BEGIN
-- Получение кода клиента, имя и фамилия которого
-- совпадают с переданными значениями.
SELECT INTO customer_id id FROM customers
WHERE last_name = l_name AND first_name = f_name;
-- Вернуть код.
RETURN customer_id;
END;
' LANGUAGE 'plpgsql';
В листинге 6.10 показан результат вызова функции get_customer_id() с аргументами Jackson и Annie. Возвращенное число равно коду клиента «Annie Jackson» в таблице customers.
Листинг 6.10. Вызов функции get_customer_id()
booktown=# SELECT get_customer_id ('Jackson','Annie');
get_customer_id
107
(1 row)
Если требуется присвоить несколько значений нескольким переменным, в команду включаются две группы, разделенные запятыми и отделенные друг от друга пробелом. В первой группе перечисляются имена переменных, а во второй имена полей.
Функция, приведенная в листинге 6.11, решает обратную задачу по сравнению с функцией get_customer_id() из листинга 6.9 она возвращает имя и фамилию клиента по заданному коду.
Листинг 6.11. Использование команды SELECT INTO с несколькими полями
CREATE FUNCTION get_customer_name (integer) RETURNS text AS '
DECLARE
-- Объявление псевдонимов для аргументов,
customer_id ALIAS FOR $1;
-- Объявление переменных для хранения компонентов
-- полного имени клиента.
customer_fname text;
customer_lname text;
BEGIN
-- Получение имени и фамилии клиента, код которого
-- совпадает с переданным значением.
SELECT INTO customer_fname, customer_lname
first_name, last_name
FROM customers WHERE id = customer_id;
-- Вернуть полное имя.
RETURN customer_fname | '' '' | customer_lname;
END;
' LANGUAGE 'plpgsql1;
В листинге 6.12 показан результат вызова функции get_customer_name() с аргументом 107.
Листинг 6.12. Вызов функции get_customer_name()
booktown=# SELECT get_customer_name(107);
get_customer_name
Annie Jackson
(1 row)
Чтобы узнать, успешно ли были присвоены значения переменным командой SELECT INTO, воспользуйтесь специальной логической переменной FOUND. Кроме того, можно проверить значение заданной переменной ключевыми словами ISNULL или IS NULL (в большинстве случаев положительный результат означает, что команда SELECT INTO завершилась неудачно!).
Ключевые слова FOUND, IS NULL и ISNULL следует использовать в условных командах (IF/THEN). Условные команды PL/pgSQL описаны в разделе 6.1.7.
В листинге 6.13 приведен простейший пример использования логической переменной FOUND в функции get_customer_id().
Листинг 6.13. Использование логической переменной FOUND в функции get_customer_id()
[...]
SELECT INTO customer_id id FROM customers
WHERE last_name = l_name AND first_name = f_name;
-- Если совпадение не найдено, вернуть -1.
-- Другая функция, в которой вызывается
get_customer_id();
-- может интерпретировать -1 как признак ошибки.
IF NOT FOUND THEN
return -1;
END IF;
[...]
В листинге 6.14 показано, что теперь функция get_customer_id() при передаче имени несуществующего клиента возвращает -1.
Листинг 6.14. Вызов нового варианта функции get_customer_id()
booktown=# SELECT get_customer_id('Schmoe','Joe');
get_customer_id
-1
(1 row)