
- •Язык запросов sql
- •Введение в sql(0-0)
- •Аннотация к лекции
- •Краткая история развития sql
- •Возможности языка
- •Основы sql
- •Типы данных sql
- •Литералы
- •Операторы и выражения
- •Именование объектов
- •Комментарии
- •Итоги лекции
- •Простейшие запросы (0-0)
- •Аннотация к лекции
- •О предложении select
- •Основные фразы – select и from
- •Фраза select
- •Синтаксис фразы select
- •Указание выводимых столбцов
- •Исключение повторяющихся строк
- •Использование вычисляемых выражений
- •Переопределение имен результирующих столбцов
- •Включение литералов в результат запроса
- •Вывод результатов в файл
- •Фраза from
- •Синтаксис фразы from
- •Синонимы таблиц
- •Запрос в качестве имени таблицы
- •Итоги лекции
- •Отбор строк по условию (0-0)
- •Аннотация к лекции
- •Простейшие условия
- •Операторы сравнения
- •Логические операторы
- •Использование выражений над столбцами
- •Специальные операторы
- •Проверка на принадлежность множеству
- •Проверка на принадлежность диапазону значений
- •Проверка на соответствие шаблону
- •Проверка на неопределенное значение
- •Итоги лекции
- •Многотабличные запросы (0-0)
- •Аннотация к лекции
- •Декартово произведение таблиц
- •Условие соединения
- •Соединение таблиц по равенству
- •Соединение таблиц по неравенству
- •Самосоединение таблицы
- •Внешнее соединение таблиц
- •Соединение с использованием фразы from
- •Итоги лекции
- •Использование функций (0)
- •Аннотация к лекции
- •Агрегатные функции
- •Однострочныефункции
- •Строковые функции
- •Числовые функции
- •Временные функции
- •Функции преобразования
- •Итогилекции(урока)
- •Группировка и сортировка (0)
- •Аннотация к лекции
- •Запросы с группировкой строк
- •Понятие группировки строк
- •Группировка по одному столбцу
- •Группировка по нескольким столбцам
- •Использование выражений
- •Условиеотборагрупп
- •Сортировка строк
- •Сортировка по столбцу или выражению
- •Сортировка по нескольким столбцам или выражениям
- •Итоги лекции
- •Множественные операции над таблицами (0-0)
- •Аннотация к лекции
- •Множественные операции в стандарте sql
- •Объединение таблиц
- •Пересечение таблиц
- •Разность таблиц
- •Дополнительные аспекты использования множественных операций
- •Множественные операции и группировка
- •Множественные операции и сортировка
- •Итоги лекции
- •Определение таблиц и представлений (0-0)
- •Аннотация к лекции
- •Создание таблицы
- •Изменениетаблицы
- •Возможности изменения таблиц
- •Добавление столбца
- •Изменение определения столбца
- •Удаление столбца
- •Переименование таблицы
- •Удаление таблицы
- •Определение индексов
- •Представления
- •Итоги лекции
- •Манипулирование данными (0-0)
- •Аннотация к лекции
- •Добавление новых строк
- •Варианты добавления строк
- •Вставка отдельных строк
- •Использование запроса при вставке строк
- •Вставка значений по умолчанию
- •Обновление существующих данных
- •Удаление существующих строк
- •Импорт и экспорт данных
- •Итоги лекции
- •Определение ограничений целостности, ключей, задание прав доступа к данным (0-18)
- •Аннотация к лекции
- •Виды ограничений целостности
- •Ограничение на отсутствие значения
- •Ограничениеуникальности
- •Ограничение первичного ключа
- •Ограничение ссылочной целостности
- •Изменение ограничений целостности
- •Итоги лекции
- •Программирование бд (19)
Ограничение первичного ключа
Первичный ключ – это столбец (или совокупность столбцов) таблицы, который уникально идентифицирует строку таблицы. Первичный ключ очень похож на уникальный ключ – он тоже уникальный, может быть простым и составным, указываться как в описании столбца, так и для всей таблицы. Однако есть два существенных различия. Во-первых, уникальный ключ может принимать значения NULL, первичный ключ – нет. Во-вторых, таблица может содержать только один первичный ключ.
Простой первичный ключ
Синтаксис ограничения первичного ключа имеет следующий вид:
имя_столбца тип_данных [CONSTRAINT имя_ограничения] PRIMARY KEY
Вот как, например, выглядит определение первичного ключа в таблице ROOM:
CREATE TABLE ROOM
(RomPK INTEGER CONSTRAINT rom_prk PRIMARY KEY,
Num NUMBER(3) NOT NULL,
Building CHAR(5) NOT NULL,
Seats NUMBERO),
CONSTRAINT rom_unq_num_bld UNIQUE (Num, Building));
Составной первичный ключ
Составной первичный ключ указывается после определения столбцов. Его синтаксис совпадает с определением уникального ключа, за исключением названия ограничения:
[CONSTRAINT имя_ограничения] PRIMARY KEY (список_столбцов)
Если бы в таблице ROOM первичным ключом являлась пара столбцов Num и Building, это нужно было бы записать следующим образом:
CREATE TABLE ROOM
(Num NUMBER(3),
Building CHAR(5),
Seats NUMBERO),
CONSTRAINT rom_unq_num_bld PRIMARY KEY (Num, Building));
Ограничение ссылочной целостности
SQLдает возможность поддерживать связь между таблицами с помощью так называемых внешних ключей. Одновременно они обеспечивают ссылочное ограничение целостности, которому посвящен данный пункт.
Внешний ключ и ссылочная целостность
Внешний ключ– это столбец (или совокупность столбцов), с помощью которого между строками двух таблиц устанавливается связь. Например, для связи между кафедрами (таблица DEPARTMENT) и факультетами (таблицы FACULTY) в таблице DEPARTMENT помимо столбцов данных кафедры существует дополнительный столбец FacFK, с помощью значений которого указывается, какому именно факультету принадлежит кафедра. Столбец (группа столбцов), на который ссылается внешний ключ, обычно называетсяссылочным ключом. Таблица, из которой делается ссылка, называетсядочерней, а та, на которую делается ссылка, –родительской(это может быть и одна таблица). Одна и та же таблица может иметь множество внешних ключей для установления связей с несколькими таблицами. Так, таблица LECTURE учебной базы данных имеет внешние ключи для связи с таблицами ROOM (столбец RomFK), SUBJECT (столбец SbjFK), TEACHER (столбец TchFK) и SGR0UP (столбец GrpFK).
Внешний ключ допускает значения NULL, но их можно запретить установлением ограничения NOT NULL. Это полезно, когда существует так называемая зависимость по существованию, когда объекты одного класса не могут существовать без объектов другого класса. Например, нет смысла говорить о занятии в расписании, если не определены ведущий его преподаватель, дисциплина, аудитория и группа.
Внешний ключ и его ссылочный ключ должны иметь одинаковое количество столбцов и одинаковые или совместимые типы данных для соответствующих столбцов. Внешний ключ, состоящий из одного столбца, называется простым, а из нескольких –составным. Чаще всего используются простые внешние и соответствующие им ссылочные ключи.
Связывание внешнего ключа со ссылочным позволяет устанавливать между таблицами отношения один-к-одному и один-ко-многим. В нашем случае имеет место отношение один-ко-многим – на одном факультете может быть несколько кафедр, но каждая кафедра принадлежит только одному факультету. Связь многие-ко-многим (как если бы кафедра подчинялась нескольким факультетам) не может быть непосредственно представлена с помощью конструкции ссылочный/внешний ключ.
Ссылочная целостность задается фразой FOREIGN KEY, в которой нужно указывать внешний и соответствующий ему ссылочный ключи. В этой фразе можно также указать, каким образом следует поддерживать ссылочную целостность в случае изменения или удаления одного из значений ссылочного ключа. Ссылочное ограничение, как и любое другое, задается в предложении CREATE TABLE и может быть определено как ограничение столбца или как ограничение таблицы.
Простой внешний ключ
Определение столбца как внешнего ключа имеет следующий синтаксис:
имя_столбца тип_данных [CONSTRAINT имя_ограничения] REFERENCES имя_родительской_таблицы [столбец_родительской_таблицы]
В этом случае роль ссылочного ограничения исполняет фраза REFERENCES. Например, связь между таблицами FACULTY и DEPARTMENT указывается в таблице DEPARTMENT следующим внешним ключом:
FacFK INTEGER CONSTRAINT dep_fak_fac REFERENCES FACULTY(FacPK)
Столбец родительской таблицы можно не указывать, если ссылочный ключ является в ней первичным, то есть имеющим ограничение PRIMARYKEY. Например, так как столбецFacPKявляется первичным ключом в таблицеFACULTY, предыдущий пример может быть записан следующим образом:
FacFK INTEGER REFERENCES FACULTY
Составной внешний ключ
Составной внешний ключ указывается после определения столбцов таблицы и имеет следующий синтаксис:
[CONSTRAINT имя_ограничения] FOREIGN KEY (список_столбцов_дочерней_таблицы) REFERENCES имя_родительской_таблицы [(список_столбцов_родительской_таблицы)]
Учитывая, что в учебной базе данных таблица ROOM содержит простой первичный ключ RomPK и составной уникальный ключ (Num, Building), из таблицы LECTURE можно сослаться на таблицу ROOM следующими двумя способами:
CREATE TABLE LECTURE
…
RomFK INTEGERб
…
CONSTRAINT leс fkey rom FOREIGN KEY (RomFK) REFERENCES ROOM(RomPK);
и
CREATE TABLE LECTURE
RomNumFK NUMBER(3).
RomBldFK CHAR(5),
CONSTRAINT lec_fkey_rom FOREIGN KEY (RomNumFK, RomBldFK) REFERENCES ROOM (Num. Building);
Поддержка ссылочной целостности
Рассмотрим, какие имеются возможности по поддержке ссылочной целостности при манипулировании строками родительской и дочерней таблиц. При вставке или обновлении строк дочерней таблицы СУБД проверяет, нарушают ли эти действия ссылочную целостность. Если это так, вставка/обновление строки запрещается. Удаление строки дочерней таблицы вообще не может привести к нарушению ссылочной целостности (если, конечно, она одновременно не является родительской для другой ссылки).
Вставка строки родительской таблицы не вызывает проблем с поддержкой ссылочной целостности (если, конечно, она одновременно не является дочерней для другой ссылки). А удаление или обновление ее строк может нарушить ссылочную целостность. Например, если удаляемый факультет имеет в своем составе кафедры, они останутся без факультета – их внешние ключи будут ссылаться на отсутствующий факультет. Для этого случая стандарт SQL предлагает несколько вариантов поддержки целостности, указываемых при определении внешнего ключа с помощью следующих конструкций:
ON DELETE {RESTRICT | CASCADE | SET NULL | SET DEFAULT}
ON UPDATE {RESTRICT | CASCADE | SET NULL | SET DEFAULT}
Смысл этих вариантов следующий.
RESTRICT – запрещается удалять строку (или изменять значение ссылочного ключа строки) родительской таблицы, если на эту строку имеются ссылки из дочерней таблицы.
CASCADE – удаление строки в родительской таблице приводит к удалению всех связанных с ними строк дочерней таблицы. Изменение значения ссылочного ключа родительской таблицы приводит к соответствующему изменению значений внешних ключей дочерней таблицы.
SET NULL – удаление строки (или изменение значения ссылочного ключа)
родительской таблицы приводит к установке в значение NULL всех внешних ключей дочерней таблицы, которые ссылаются на удаленные (или измененные) значения ссылочного ключа родительской таблицы.
SET DEFAULT – удаление строки (или изменение значения ссылочного ключа) родительской таблицы приводит к установке в значение по умолчанию всех внешних ключей дочерней таблицы, которые ссылаются на удаленные (или измененные) значения ссылочного ключа родительской таблицы.