
Принципы формирования запросов на языке реляционной алгебры
Отметим следующие особенности построения языков запросов с использованием рассмотренных выше операций реляционной алгебры. Во-первых, в любые языки манипулирования данными включаются дополнительные операторы включения, удаления и модификации кортежей отношений базы данных. Кроме того, формула F операции селекции может включать выполнение арифметических вычислений, а также сравнения, например, вида А =В+3. В состав операторов языка включаются команды присваивания некоторого имени вычисленному экземпляру отношения и печати этого экземпляра. Наконец, над столбцами отношений обеспечивается выполнение таких операций, как нахождение среднего значения, суммы, минимума или максимума из заданного набора значений.
Содержание запроса к базе данных на языке реляционной алгебры состоит в следующем:
— взять некоторое отношение (или группу отношений), выполнить над ним операцию селекции;
— объединить результат селекции с другим объектом с помощью операции -соединения или естественного соединения;
— найти проекцию полученного результата и ее напечатать в качестве ответа на запрос.
Описанная схема содержания запроса может быть названа схемой «селекции—соединения—проекции».
Пусть R, S — исходные отношения, из которых должен быть сформулирован ответ на некоторый запрос. Общая структура формулы, называемой реляционным выражением, для формирования ответа, может иметь вид
(10)
где
— операции реляционной алгебры,
— некоторое подмножество множества
атрибутов R
и S,
F1,
F2
— формулы исчисления предикатов,
выражающие условия селекции кортежей
R и S.
Реляционное выражение (10) может быть достаточно сложным. Такое выражение удобно представлять в виде древовидного графа, листьями которого являются исходные отношения, а узлами — операции реляционной алгебры. Граф такого типа называется деревом разбора реляционного выражения.
Понятие и виды функциональных зависимостей. Нормальные формы отношений
4.2.1.Функциональные зависимости.
Реляционная база данных содержит как структурную, так и семантическую информацию. Структура базы данных определяется числом и видом включенных в нее отношений, и связями типа "один ко многим", существующими между кортежами этих отношений. Семантическая часть описывает множество функциональных зависимостей, существующих между атрибутами этих отношений. Дадим определение функциональной зависимости.
Определение:
Если даны два атрибута X и Y некоторого отношения, то говорят, что Y функционально зависит от X, если в любой момент времени каждому значению X соответствует ровно одно значение Y.
Функциональная зависимость обозначается X -> Y. Отметим, что X и Y могут представлять собой не только единичные атрибуты, но и группы, составленные из нескольких атрибутов одного отношения.
Можно сказать, что функциональные зависимости представляют собой связи типа "один ко многим", существующие внутри отношения.
Некоторые функциональные зависимости могут быть нежелательны.
Определение:
Избыточная функциональная зависимость - зависимость, заключающая в себе такую информацию, которая может быть получена на основе других зависимостей, имеющихся в базе данных.
Корректной считается такая схема базы данных, в которой отсутствуют избыточные функциональные зависимости. В противном случае приходится прибегать к процедуре декомпозиции (разложения) имеющегося множества отношений. При этом порождаемое множество содержит большее число отношений, которые являются проекциями отношений исходного множества. (Операция проекции описана в разделе, посвященном реляционной алгебре). Обратимый пошаговый процесс замены данной совокупности отношений другой схемой с устранением избыточных функциональных зависимостей называется нормализацией.
Условие обратимости требует, чтобы декомпозиция сохраняла эквивалентность схем при замене одной схемы на другую, т.е. в результирующих отношениях:
не должны появляться ранее отсутствовавшие кортежи;
на отношениях новой схемы должно выполняться исходное множество функциональных зависимостей.
Нормализация отношений. Нормальные формы отношений
Для устранения рассмотренных аномалий осуществляется нормализация отношений, т.е. их декомпозиция на более мелкие. Для определения качества нормализации Э.Коддом предложен аппарат нормальных форм. Рассмотрим нормальные формы отношений.
ОПРЕДЕЛЕНИЕ
Отношение находится и первой нормальной форме тогда и только тогда, когда на пересечении каждого столбца и каждой строки находятся только элементарные значения атрибутов.
В некотором смысле это определение избыточно, потому что собственно оно определяет само отношение в теории реляционных баз данных. Однако в силу исторически сложившихся обстоятельств и для преемственности такое определение первой нормальной формы существует и мы должны с ним согласиться. Отношения, находящиеся в первой нормальной форме, часто называют просто нормализованными отношениями. Соответственно, ненормализованные отношения могут интерпретироваться как таблицы с неравномерным заполнением, например таблица «Расписание», которая имеет вид:
Преподаватель
|
День недели
|
Номер пары
|
Название дисциплины
|
Тип занятий
|
Группа
|
Петров В. И.
|
Понед.
|
1
|
Теор.выч.проц.
|
Лекция
|
4906
|
|
Вторник
|
1
|
Комп.графика
|
Лаб. раб.
|
4907
|
|
Вторник
|
2
|
Комн.графика
|
Лаб. раб.
|
4906
|
Киров В. А.
|
Понед.
|
2
|
Теор. информ.
|
Лекция
|
4906
|
|
Вторник
|
3
|
Пр-е на C++
|
Лаб. раб.
|
4907
|
|
Вторник
|
4
|
Пр-е на C++
|
Лаб. раб.
|
4906
|
Серов А. А.
|
Понед.
|
3
|
Защита инф.
|
Лекция
|
4944
|
|
Среда
|
3
|
Пр-е на VB
|
Лаб. раб.
|
4942
|
|
Четверг
|
4
|
Пр-е на VB
|
Лаб. раб.
|
4922
|
Здесь на пересечении одной строки и одного столбца находится целый набор элементарных значений, соответствующих набору дней, перечню пар, набору дисциплин, по которым проводит занятия один преподаватель.
Для приведения отношения «Расписание» к первой нормальной форме необходимо дополнить каждую строку фамилией преподавателя.
ОПРЕДЕЛЕНИЕ
Отношение находится во второй нормальной форме тогда и только тогда, когда оно находится в первой нормальной форме и не содержит неполных функциональных зависимостей непривычных атрибутов от атрибутов первичного ключа.
-
Отношение находится по второй нормальной форме тогда и только тогда, когда оно находится в первой нормальной форме и не содержит неполных функциональных зависимостей непервичных атрибутов от атрибутов первичного ключа.
Преподаватель
День
недели
Номер
пары
Название
дисциплины
Тип
занятий
Группа
Петров В. И
Понед.
1
Теор. выч. проц.
Лекция
4906
Петров В. И
Вторник
1
Комп.графика
Лаб. раб.
4907
Петров В. И
Вторник
2
Комн.графика
Лаб. раб.
4906
Киров В. А.
Понед.
2
Теор. информ.
Лекция
4906
Киров В. А.
Вторник
3
Пр-е на C++
Лаб. раб.
4907
Киров В. А.
Вторник
4
Пр-е на C++
Лаб. раб.
4906
Серов А. А.
Понед.
3
Защита инф.
Лекция
4944
Серов А. А.
Среда
3
Пр-е на VB
Лаб. раб. ..
4942
Серов А. А.
Четверг.
4
Пр-е на VB.
Лаб. раб. -
4922
Рассмотрим отношение, моделирующее сдачу студентами текущей сессии. Структура этого отношения определяется следующим набором атрибутов:
(ФИО. Номер зач.кн., Группа, Дисциплина, Оценка)
Так как каждый студент сдает целый набор дисциплин в процессе сессии, то первичным ключом отношения может быть (Номер, зач.кн. Дисциплина), который однозначно определяет каждую стоку отношения. С другой стороны, атрибуты ФИО и Группа зависят только от части первичного ключа — от значения атрибута Номер зач. кн., поэтому мы должны констатировать наличие неполных функциональных зависимостей в данном отношении. Для приведения данного отношения ко второй нормальной форме следует разбить его на проекции, при этом должно быть соблюдено условие восстановления исходного отношения без потерь. Такими проекциями могут быть два отношения:
(ФИО, Номер.зач.кн. Группа) (Номер зач.кн., Дисциплина, Оценка)
Этот набор отношений не содержит неполных функциональных зависимостей, и поэтому эти отношения находятся во второй нормальной форме.
А почему надо приводить отношения ко второй нормальной форме? Иначе говоря, какие аномалии или неудобства могут возникнуть, если мы оставим исходное отношение и не будем его разбивать на два? Давайте рассмотрим ситуацию, когда студент переведен из одной группы в другую. Тогда в первом случае (если мы не разбивали исходное отношение на два) мы должны найти все записи с данным студентом и в них изменить значение атрибута Группа на новое. Во втором же случае меняется только один кортеж в первом отношении. И конечно, опасность нарушения корректности (непротиворечивости содержания) БД в первом случае выше. Может получиться так, что часть кортежей поменяет значения атрибута Группа, а часть по причине сбоя в работе аппаратуры останется в старом состоянии. И тогда наша БД будет содержать записи, которые относят одного студента одновременно к разным группам. Чтобы этого не произошло, мы должны принимать дополнительные непростые меры, например, организовывать процесс согласованного изменения с использованием сложного механизма транзакций, который мы будем рассматривать в главах, посвященных вопросам распределенного доступа к БД. Если же мы перешли ко второй нормальной форме, то мы меняем только один кортеж. Кроме того, если у нас есть студенты, которые еще не сдавали экзамены, то в исходном отношении мы вообще не можем хранить о них информацию, а во второй схеме информация о студентах и их принадлежности к конкретной группе хранится отдельно от информации, которая связана со сдачей экзаменов, и поэтому мы можем в этом случае отдельно работать со студентами и отдельно хранить и обрабатывать информацию об успеваемости и сдаче экзаменов, что в действительности и происходит.
ОПРЕДЕЛЕНИЕ
Отношение находится в третьей нормальной 4юрме тогда и только тогда, когда оно находится во второй нормальной форме и не содержит транзитивных зависимостей.
Рассмотрим отношение, связывающее студентов с группами, факультетами и специальностями, на которых он учится.
(ФИО, Номер зач.кн., Группа. Факультет, Специальность, Выпускающая кафедра)
Первичным ключом отношения является Номер зач.кн., однако рассмотрим остальные функциональные зависимости. Группа, в которой учится студент, однозначно определяет факультет, на котором он учится, а также специальность и выпускающую кафедру. Кроме того, выпускающая кафедра однозначно определяет факультет, на котором обучаются студенты, выпускаемые по данной кафедре. Но если мы предположим, что одну специальность могут выпускать несколько кафедр, то специальность не определяет выпускающую кафедру. В этом случае у нас есть следующие функциональные зависимости:
Номер зач.кн. -> ФИО
Номер зач.кн. -> Группа
Номер зач.кн. -> Факультет
Номер зач.кн. -> Специальность
Номер зач.кн. -> Выпускающая кафедра
Группа -> Факультет
Группа -> Специальность
Группа -> Выпускающая кафедра
Выпускающая кафедра -> Факультет
И эти зависимости образуют транзитивные группы. Для того чтобы избежать этого, мы можем предложить следующий набор отношений:
(Номер.зач.кн., ФИО., Специальность. Группа)
(Группа. Выпускающая кафедра)
(Выпускающая- кафедра; Факультет)
Первичные ключи отношений выделены.
Теперь необходимо удостовериться, что при естественном соединении мы не потеряем ни одном строки и не получим лишних кортежей. И это упражнение я предлагаю выполнить вам самостоятельно.
Полученный набор отношений находится в третьей нормальной форме.
ОПРЕДЕЛЕНИЕ
Отношение находится в нормальной форме Бойса—Кодда, если оно находится в третьей нормальной форме и каждым детерминант отношения является возможным ключом отношения.
Рассмотрим отношение, моделирующее сдачу студентом текущих экзаменов. Предположим, что студент может сдавать экзамен по одной дисциплине несколько раз, если он получил неудовлетворительную оценку. Допустим, что во избежание возможных полных однофамильцев мы можем однозначно идентифицировать студента номером его зачетной книги, но, с другой стороны, у нас ведется электронный учет текущей успеваемости студентов, поэтому каждому студенту присваивается в период его обучения в вузе уникальный номер-идентификатор. Отношение, которое моделирует сдачу текущей сессии, имеет следующую структуру:
(Номер зач.кн., Идентификатор_студента, Дисциплина, Дата. Оценка)
Возможными ключами отношения являются Номер_зач.кн, Дисциплина, Дата и Иден-тификатор_студента, Дисциплина, Дата. ,
Какие функциональные зависимости у нас имеются?
Номер_зач.кн, Дисциплина, Дата -> Оценка:
Идентификатор_студента, Дисциплина. Дата -> Оценка;
Номер зач.кн. -> Идентификатор_студента:
Идентификатор_студента -> Номер зач.кн.
Откуда взялись две последние функциональные зависимости? Но ведь мы предварительно описали, что каждому студенту ставится в соответствие один номер зачетной книжки и один Идентификатор_студента, поэтому по значению Номер зач.кн. можно однозначно определить Идентификатор_студента (это третья зависимость) и обратно (и это четвертая зависимость). Оценим это отношение.
Это отношение находится в третьей нормальной форме, потому что неполных функциональных зависимостей не первичных атрибутов от атрибутов возможного ключа здесь не присутствует и нет транзитивных зависимостей. А как же третья и четвертая зависимости, разве они не являются неполными? Нет, потому что зависимым не является не первичный атрибут, то есть атрибут, не входящий ни в один возможный ключ. Поэтому придраться к этому мы не можем. Но вот под четвертую нормальную форму наше отношение не подходит, потому что у нас есть два детерминанта Номер зач.кн. и Идентификатор_студента, которые не являются возможными ключами отношения. Для приведения отношения к нормальной форме Бойса-Кодда надо разделить отношение, например, на два со следующими схемами:
(Идентификатор_студента. Дисциплина, Дата, Оценка)
(Номер зач.кн. Идентификатор_студента)
или наоборот:
(Номер зач.кн.. Дисциплина. Дата. Оценка)
(Номер зач.кн. Идентификатор_студента)
Эти схемы равнозначны с точки зрения теории нормализации, поэтому выбирать проектировщикам следует исходя из некоторых дополнительных рассуждений. Ну, например, если учесть, что зачетные книжки могут теряться, то как они будут восстанавливаться: если с тем же самым номером, то нет разницы, но если с новым номером, то тогда первая схема предпочтительней.
В большинстве случаев достижение третьей нормальной формы или даже формы Бойса—Кодда считается достаточным для реальных проектов баз данных, однако, в теории нормализации существуют нормальные формы высших порядков, которые уже связаны не с функциональными зависимостями между атрибутами отношений, а отражают более тонкие вопросы семантики предметной области и связаны с другими видами зависимостей. Прежде чем перейти к рассмотрению нормальных форм высших порядков, дадим еще несколько определений.
ОПРЕДЕЛЕНИЕ
В отношении R (А, В, С) существует многозначная зависимость (multi valid dependence, MVD) R.A -» R.B в том и только в том случае, если множество значений В, соответствующее паре значений А и С, зависит только от А и не зависит от С.
Когда мы рассматривали функциональные зависимости, то каждому значению детерминанта соответствовало только одно значение зависимого от него атрибута. При рассмотрении многозначных зависимостей мы выделяем случаи, когда одному значению некоторого атрибута соответствует устойчиво постоянное множество значений другого атрибута. Когда это может быть? Рассмотрим конкретную ситуацию, понятную всем студентам. Пусть дано отношение, которое моделирует предстоящую сдачу экзаменов на сессии. Допустим, оно имеет вид:
(Номер зач.кн. Группа. Дисциплина)
Перечень дисциплин, которые должен сдавать студент, однозначно определяется не его фамилией, а номером группы (то есть специальностью, на которой он учится).
В данном отношении существуют следующие две многозначные зависимости:
Группа -» Дисциплина Группа -» Номер зач.кн.
Это означает, что каждой группе однозначно соответствует перечень дисциплин по учебному плану, и номер группы определяет список студентов, которые в этой группе учатся.
Если мы будем работать с исходным отношением, то мы не сможем хранить информацию о новой группе и ее учебном плане — перечне дисциплин, которые должна пройти группа до тех пор, пока в нее не будут зачислены студенты. При изменении перечня дисциплин по учебному плану, например при добавлении новой дисциплины, внести эти изменения в отношение для всех студентов, занимающихся в данной группе, весьма затруднительно. С другой стороны, если мы добавляем студента в уже существующую группу, то мы должны добавить множество кортежей, соответствующих перечню дисциплин для данной группы. Эти аномалии модификации отношения как раз и связаны с наличием двух многозначных зависимостей.
В теории реляционных баз данных доказывается, что в общем случае в отношении R (А, В, С) существует многозначная зависимость R.A -» R.B в том и только в том случае, когда существует многозначная зависимость R.A -» R.C.
Дальнейшая нормализация отношений, подобных нашему, основывается на теореме Фейджина.
ТЕОРЕМА ФЕЙДЖИНА
Отношение R (А, В, С) можно спроецировать без потерь в отношения R1 (А, В) и R2 (А, С) в том и только в том случае, когда существует MVD А -» В | С ( что равнозначно наличию двух зависимостей А -» В и А -» С).
Под проецированием без потерь понимается такой способ декомпозиции отношения путем применения операции проекции, при котором исходное отношение полностью и без избыточности восстанавливается путем естественного соединения полученных отношений. Практически теорема доказывает наличие эквивалентной схемы для отношения, в котором существует несколько многозначных зависимостей.
ОПРЕДЕЛЕНИЕ
Отношение R находится в четвертой нормальной форме (4NF) в том и только в том случае, если в случае существования многозначной зависимости А -» В все остальные атрибуты R функционально зависят от А.
В нашем примере можно произвести декомпозицию исходного отношения в два отношения:
(Номер зач. кн., Группа) (Группа, Дисциплина)
Оба эти отношения находятся в 4NF и свободны от отмеченных аномалий. Действительно, обе операции модификации теперь упрощаются: добавление нового студента связано с добавлением всего одного кортежа в первое отношение, а добавление новой дисциплины выливается в добавление одного кортежа во второе отношение, кроме того, во втором отношении мы можем хранить любое количество групп с определенным перечнем дисциплин, в которые пока еще не зачислены студенты.
Последней нормальной формой является пятая нормальная форма 5NF, которая связана с анализом нового вида зависимостей, зависимостей «проекции соединения» (project-join зависимости, обозначаемые как PJ-зависимости). Этот вид зависимостей является в некотором роде обобщением многозначных зависимостей.
ОПРЕДЕЛЕНИЕ
Отношение R (X, Y, ..., Z) удовлетворяет зависимости соединения (X, Y, ..., Z) в том и только в том случае, когда R восстанавливается без потерь путем соединения своих проекций на X, Y, ..., Z. Здесь X, Y, ..., Z — наборы атрибутов отношения R.
Наличие PJ-зависимости в отношении делает его в некотором роде избыточным и затрудняет операции модификации.
ОПРЕДЕЛЕНИЕ
Отношение R находится в пятой нормальной форме (нормальной форме проекции-соединения — PJ/NF) в том и только в том случае, когда любая зависимость соединения в R следует из существования некоторого возможного ключа в R.
Рассмотрим отношение R1:
R1 (Преподаватель, Кафедра, Дисциплина).
Предположим, что каждый преподаватель может работать на нескольких кафедрах и на каждой кафедре может вести несколько дисциплин. В этом случае ключом отношения является полный набор из трех атрибутов. В отношении отсутствуют многозначные зависимости, и поэтому отношение находится в 4NF.
Введем следующие обозначения наборов атрибутов:
ПК (Преподаватель, Кафедра)
ПД (Преподаватель. Дисциплина)
КД (Кафедра. Дисциплина)
Допустим, что отношение R1 удовлетворяет зависимости проекции соединения (ПК, ПД, КД). Тогда отношение R1 не находится в NF/PJ, потому что единственным ключом его является полный набор атрибутов, а наличие зависимости PJ связано с наборами атрибутов, которые не составляют возможные ключи отношения R1. Для того чтобы привести это отношение к NF/PJ, его надо представить в виде трех отношений:
R2 (Преподаватель. Кафедра)
R3 (Преподаватель. Дисциплина)R4 (Кафедра, Дисциплина)
Пятая нормальная форма редко используется на практике. В большей степени она является теоретическим исследованием. Очень тяжело определить само наличие зависимостей «проекции—соединения», потому что утверждение о наличии такой зависимости делается для всех возможных состояний БД, а не только для текущего экземпляра отношения R1. Однако знание о возможном наличии подобных зависимостей, даже теоретическое, нам все же необходимо.
Виды угроз и основные задачи по защите данных. Средства защиты баз данных в компьютерных сетях
Я зык запросов SQL. Оператор языка SQL для создания и изменения структуры таблицы баз данных.
Создание БД
Стандарт ISO не определяет, как должна создаваться база данных, и каждая СУБД использует в этом вопросе свой подход. В соответствии со стандартом компоненты базы данных существуют в некоторой среде, которая включает ряд каталогов, а те, в свою очередь, — наборы схем.
В указанной иерархии в стандарте предусмотрены только средства регламентации механизма создания и удаления схем — самой нижней ступени данной иерархии. Механизмы создания всего остального закладываются в саму СУБД. Оператор создания схемы БД определяется следующим образом:
CREATE SCHEMA [ Имя_схемы | AUTHORIZATION Имя_пользователя]
Следовательно, если пользователю Иванову требуется создать схему факультет, то данный оператор, осуществляющий подобные действия, будет выглядеть следующим образом:
CREATE SCHEMA ФАКУЛЬТЕТ AUTHORIZATION Иванов;
Для удаления раннее созданной схемы определен следующий оператор:
DROP SCHEMA Имя_схемы [RESTRICT | CASCADE]
По умолчанию принимается установка режима restrict, при которой удаление выполняется только в том случае, если схема пуста. В противном случае данный оператор не выполняется. Использование альтернативного режима cascade должно производиться с большой осторожностью, так как реализация его приводит к автоматическому удалению всех связанных с удаляемой схемой объектов.
Хотя рассмотренные два оператора определены в стандарте, на практике они реализованы в очень редких случаях. Вместо операторов create schema и drop schema успешно используются не нуждающиеся в дополнительных пояснениях операторы:
CREATE DATABASE Имя_БД
DROP DATABASE Имя_ БД
Однако конкретные реализации данных операторов могут содержать дополнительную информацию. После выполнения второго оператора уничтожается вся база данных вместе с содержащимися в ней данными.
Поскольку база данных является многокомпонентным объектом, то процесс создания базы данных не исчерпывается выполнением только одного оператора create database, а предполагает целую последовательность определенных действий. Рассмотрим по очереди дальнейшие действия данного процесса.
Создание, изменение структуры и удаление таблицы
Главными компонентами базы данных являются ее таблицы, представляющие отношения проекта БД. Создание таблицы осуществляется посредством оператора create table. Его упрощенная версия выглядит следующим образом:
CREATE TABLE Имя_таблицы ( Имя_столбца Тип_даных [NULL | NOT NULL ] [,...])
Оператор такого вида приведет к созданию таблицы с именем <Имя_таблицы>, которая будет содержать столько столбцов, сколько их задано в операторе. При определении столбца необходимо задать его имя, тип данных, к которому будут относиться значения этого столбца, а также определить, можно ли в качестве значения рассматриваемого столбца использовать ключевое слово null. Ключевым словом null помечается такой столбец, который может содержать неопределенные значения. Такая ситуация возможна для столбцов, соответствующих непервичным атрибутам отношения. Определения столбцов первичных ключей отношений всегда должны содержать ключевые слова not null. Любая попытка ввести в такой столбец NULL-значение будет отвергнута, и, следовательно, будет заблокирована возможность нарушения ссылочной целостности данных. По причинам, обсуждавшимся ранее, использование NULL-значений очень часто запрещают и для столбцов внешних ключей.
Для того чтобы создать таблицу БД СЕССИЯ, необходимо использовать оператор вида
CREATE TABLE S1 (
ФИО VARCHAR (20) NOT NULL,
Дисциплина VARCHAR (20) NOT NULL,
Оценка SMALLINT NOT NULL);
В данном определении таблицы указаны три столбца, типы данных этих столбцов, и все они помечены определителем not null. Запрет на NULL-значения в данной таблице введен не из соображений поддержки целостности данных, а из стремления иметь в таблице только тех студентов, которые успешно сдали экзамены. Если же допустить присутствие в таблице всех студентов, которые должны были сдавать определенные для группы экзамены, то естественно допустить для столбца Оценка NULL-значения для тех студентов, кто по той или иной причине не сдавал экзамен. Оператор в этом случае примет вид
CREATE TABLE S1 (
ФИО VARCHAR (20) NOT NULL,
Дисциплина VARCHAR (20) NOT NULL,
Оценка SMALLINT);
Полное описание оператора create table должно включать средства поддержки целостности данных. Такие средства представляют собой спецификаторы, позволяющие задать ограничения для предотвращения попыток нарушить согласованность данных. Базовое определение оператора create table имеет следующий формат:
CREATE TABLE имя_таблицы
({ имя_столбца тип_даных [NOT NULL] [UNIQUE]
[DEFAULT значение по умолчанию] [CHECK (условие проверки на допустимость)] [,...]}
[PRIMARY KEY (список столбцов),]
{[UNIQUE (список столбцов),] [,...]}
{[FORING KEY (список столбцов внешних ключей)
REFERENCES имя родительской таблицы [(список столбцов ключей-кандидатов)],
[MATCH {PARTIAL | FULL}
[ON UPDATE правило ссылочной целостности]
[ON DELETE правило ссылочной целостности]] [,...]}
{[CHECK (условие проверки на допустимость)] [,...]})
Как ранее было отмечено, согласованность данных опирается на следующие ограничения:
□ контроль возможности использовать NULL-значения;
□ ограничения для доменов атрибутов;
□ категорная целостность;
□ ссылочная целостность;
□ ограничения предметной области.
Поскольку проблема NULL-значений уже была рассмотрена выше, здесь стоит только напомнить, что в том случае, когда необходимо запретить помещать NULL-значения в некоторый столбец, в его определение требуется включить спецификатор not null.
Спецификатор check предназначен для задания ограничений для доменов атрибутов. Так, например, для столбца Оценка можно задать следующее определение:
Оценка SMALLINT CHECK(Оценка >= 2 AND Оценка <= 5);
Присутствие в определении таблицы строки со спецификатором primary Key призвано обеспечить категорную целостность данных. Обеспечение категорной целостности состоит в том, что первичный ключ таблицы должен иметь уникальное непустое значение в каждой ее строке. Первичный ключ Таблицы S1 является составным и включает два столбца (ФИО, Дисциплина), его можно определить следующей фразой:
PRIMARY KEY (ФИО, Дисциплина).
Фраза primary key может употребляться в таблице только один раз. Если же надо гарантировать уникальность альтернативных ключей, то можно использовать ключевое слово unique.
Для связывания строк родительской и дочерней таблиц используются внешние ключи. Каждая строка дочерней таблицы, содержащая этот ключ, связывается со строкой родительской таблицы, у которой потенциальный ключ имеет такое же значение, что внешний ключ у дочерней таблицы. Ссылочная целостность обеспечивается тогда, когда поле внешнего ключа дочерней таблицы имеет такое значение, которое обязательно присутствует в качестве значения соответствующего потенциального ключа в родительской таблице.
Например, чтобы связать таблицы S1 и S2 базы данных Сессия, таблицу S2 необходимо определить как родительскую с первичным ключом фио, а таблицу S1 — как дочернюю. В таблице S1 столбец ФИО является внешним ключом, который должен обязательно ссылаться на первичный ключ таблицы S2, так как экзамены в сессию могут сдавать только студенты, обучающиеся в определенной группе и присутствующие в таблице S2. Таким образом, для таблицы S1 необходимо определить внешний ключ, для чего служит фраза foring key. Данный ключ определяется следующим образом:
FORING KEY ФИО REFERENCES S2.
Произведенное определение внешнего ключа позволит системе отклонить любые попытки ввести в таблицу S1 сведения о таком студенте, которого нет в таблице S2.
В операторе create table есть средства регламентировать деятельность системы и в случаях обновления информации посредством таких операторов, как update и delete. Поддержка ссылочной целостности предполагает регламентацию поведения системы в случае попытки с помощью операторов update или delete обновить или удалить значение потенциального ключа в родительской таблице, если с ним связана хотя бы одна строка дочерней таблицы. Указанная регламентация осуществляется посредством фраз on update и on delete предложения foring key. Пользователь должен выбрать один из возможных квалификаторов:
□ cascade — удаление (изменение) строки из родительской таблицы при водит к автоматическому удалению (изменению) всех ссылающихся на нее строк дочерней таблицы; если дочерняя таблица связана с другими таблицами, то изменения распространяются далее аналогичным образом;
□ set null — удаление строки из родительской таблицы приводит к автоматическому присвоению внешним ключам ссылающихся строк дочер ней таблицы NULL-значений; этот вариант может использоваться только в том случае, если в определений столбца внешнего ключа отсутствует ключевое слово not null;
□ set default — удаление строки из родительской таблицы приводит к автоматическому присвоению внешним ключам ссылающихся строк дочерней таблицы значений, принимаемых по умолчанию; этот вариант может использоваться только в том случае, если в определении столбца внешнего ключа присутствует ключевое слово default и задано значение, используемое по умолчанию;
□ no action — удаление (изменение) строки из родительской таблицы отменяется; этот квадификатор используется по умолчанию также и в том случае, когда фраза on delete (on update) опущена.
В определении создаваемой нами таблицы S1 для внешнего ключа фио на случай удаления или обновления строки родительской таблицы S2 должен быть использован вариант cascade, так как сдавать экзамены, а значит и присутствовать в данной таблице, имеют право только студенты, зачисленные в определенную группу.
Способ обработки значений внешнего ключа может быть уточнен определителем match. Если для таблицы указывается определитель match full, to предполагается, что все компоненты внешнего ключа имеют либо некоторое конкретное значение, либо значение null.
При использовании определителя match partial предполагается, что все компоненты внешнего ключа либо имеют значение null, либо в родительской таблице должна существовать по крайней мере одна строка, удовлетворяющая всем непустым значениям внешних ключей.
Исходя из сказанного, перепишем оператор создания таблицы S1 БД Сессия следующим образом:
CREATE TABLE S1 (
ФИО VARCHAR (20) NOT NULL,
Дисциплина VARCHAR (20) NOT NULL,
Оценка SMALLINT NOT NULL);
PRIMARY KEY (ФИО, Дисциплина),
PORING KEY ФИО REFERENCES S2 ;
ON UPDATE CASCADE
ON DELETE CASCADE);
Учитывая то, что операторы языка SQL транслируются в режиме интерпретации, создавать таблицы необходимо в определенном порядке: вначале родительские, а затем дочерние. В противном случае появятся сообщения об ошибке в том случае, когда в определении дочерней таблицы будут присутствовать ссылки на еще не существующую родительскую таблицу.
Обновление таблиц
В уже созданную таблицу изменения могут быть внесены с помощью оператора alter table, который имеет следующий обобщенный формат:
ALTER TABLE имя_таблицы [ADD [COLUMN] имя столбца тип_даных [NOT NULL] [UNIQUE]
[DEFAULT значение по умолчанию] [CHECK (условие проверки на допустимость)]]
[DROP [COLUMN] ] имя_столбца [RISTRICT | CASCADE]] [ADD [CONSTRAINT [имя ограничения]] ограничение] [DROP CONSTRAINT имя ограничения [RISTRICT | CASCADE]] [ALTER [COLUMN] SET DEFAULT значение по умолчанию] [ALTER [COLUMN] DROP DEFAULT]
В данном формате предусмотрены возможности для выполнения ряда действий:
О добавить новый столбец в существующую таблицу — add column;
удалить столбец из существующей таблицы — drop column;
добавить в определение таблицы новое ограничение — add constraint;
удалить из определения таблицы существующее ограничение — drop constraint;
задать для существующего столбца значение по умолчанию — alter
[COLUMN] SET DEFAULT;
□ отменить установленное для столбца значение по умолчанию alter
[COLUMN] DROP DEFAULT.
Параметр "ограничение" во фразе add constraint может принимать одно из следующих значений: primary key, unique, foring key, check. Таким образом, используя эту фразу можно определять первичные, потенциальные и внешние ключи и задавать дополнительные ограничения.
Фразы, связанные с удалением компонентов таблиц, — будь то столбец или ограничения, содержат дополнительный квалификатор, позволяющий уточнить порядок удаления:
□ cascade — удаление осуществляется каскадным образом с удалением ссылок на удаляемый компонент;
□ ristrict — удаление отменяется, если существуют ссылки на удаляемый компонент; это значение квалификатора используется по умолчанию.
Значения остальных указанных в операторе alter table параметров совпадают со значениями параметров в определении оператора create table.
Одним оператором alter table можно провести только одно изменение таблицы, например, за один раз можно добавить один столбец. Чтобы добавить два столбца в таблицу, необходимо использовать два оператора.
Добавить в таблицу S1 столбец Группа, содержащий символьный тип данных, можно с помощью оператора:
ALTER TABLE S1
ADD Группа varchar (7) NOT NULL
Удаление таблиц
Ставшая ненужной таблица может быть удалена из базы данных оператором
DROP TABLE имя таблицы [RISTRICT | CASCADE].
Ключевые слова ristrict и cascade используются для определения условий удаления таблицы в том случае, если в базе данных присутствуют ее дочерние таблицы. Ключевое слово ristrict при наличии в базе данных зависимых от удаляемой таблицы объектов вызовет отмену удаления. Ключевое слово cascade в этой ситуации вызовет автоматическое удаление всех объектов базы данных, существование которых зависит от данной таблицы.
Удалим таблицу S1:
DROP TABLE S1;
В данном операторе ключевые слова ristrict и cascade не использовались, так как таблиц, зависимых от таблицы S1, в базе данных нет.
Назначение и формат оператора SELECT. Простые и сложные критерии отбора записей в операторе SELECT.
Синтаксис оператора Select
Назначение оператора select состоит в выборке и отображении данных одной или нескольких таблиц БД. Этот исключительно мощный, наиболее часто используемый оператор реализует все операции реляционной алгебры. Возможности данного оператора широки и разнообразны. Один и тот же запрос может быть реализован несколькими способами, которые могут существенно отличаться по времени исполнения.
Синтаксис оператора select:
SELECT [DISTINCT| ALL] {*| [<список полей>]} FROM <список таблиц>
[WHERE <предикат-условие выборки или соединения>]
[GROUP BY <список полей результата>]
[HAVING <предикат-условие для группы>]
[ORDER BY <список полей, по которым требуется упорядочить вывод>]
Указанный порядок следования фраз в операторе select не может быть изменен, но не все его части являются обязательными. К обязательным предложениям относятся только фразы select и from. Все остальные части оператора могут быть использованы по усмотрению программиста. Поясним каждую фразу данного оператора.
□ Фраза select:
наличие ключевого слова all (по умолчанию) означает, что в результирующую таблицу включаются все строки, удовлетворяющие условиям запроса, что может привести к появлению в результирующей таблице одинаковых строк;
ключевое слово distinct предназначено для приведения таблицы в соответствие с принципами теории отношений, где предполагается отсутствие дубликатов строк;
символ "*" определяет очень часто встречаемую ситуацию, когда в результирующий набор включаются все столбцы из исходной таблицы запроса. Таким образом, программист может выбрать один из возможных вариантов формирования результирующих таблиц: включение только указанных столбцов или включение всех столбцов таблицы.
Во фразе from задается перечень исходных таблиц запроса.
Во фразе where определяются условия отбора строк результата или условия соединения строк исходных таблиц, подобно операции условного соединения в реляционной алгебре. exist и not exist, используемые во встроенных подзапросах.
Во фразе group by задается список полей группировки.
Во фразе having задаются предикаты-условия, накладываемые на каждую группу.
Во фразе order by задается список полей упорядочения результата, то есть список полей, который определяет порядок сортировки в результирующей таблице.
Рассмотрим ряд простых запросов.
Запрос 1
Вывести сведения о кафедрах университета.
Данная задача сводится к выборке и выводу информации из одной таблицы, причем выводу подлежат все ее строки и все ее столбцы. Реализуется такой запрос с помощью оператора вида:
SELECT * FROM kafedra;
Результатом выполнения такого запроса будет являться таблица, содержащая сведения обо всех кафедрах университета. Приведем несколько строк такой таблицы:
Kod_kaf Name_kaf Nom_telef Nom_Auditoria Col_sotr Zav_kaf
001 |
Физики |
23-34-24 |
132 |
25 |
Иванов Т.М. |
002 |
Общей математики |
23-65-43 |
003 |
22 |
Махов К.Л. |
003 |
Истории |
23-78-72 |
465 |
16 |
Росс Л.Т. |
004 |
Графики |
23-99-77 |
385 |
18 |
Фирсов С.С. |
005 |
Прикладной математики |
23-66-62 |
028 |
24 |
Ляхова И.Т. |
Запрос 2
Вывести номера телефонов кафедр университета.
Результат такого запроса должен содержать только два столбца: Name_kaf и Nom_telef, поэтому сам запрос должен выглядеть следующим образом:
SELECT Name_kaf, Nom_telef FROM kafedra;
Результирующая таблица приведена ниже:
Name_kaf |
Nom_telef |
Физики |
23-34-24 |
Общей математики |
23-65-43 |
Истории |
23-78-72 |
Графики |
23-99-77 |
Прикладной математики |
23-66-62 |
До сих пор в запросах использовались только два обязательных предложения select, from и предложение для указания условия поиска where.
Рассмотрим ряд запросов с использованием других фраз.
В общем случае строки в результирующей таблице выводятся в неупорядоченном каким-либо образом состоянии. Просматривать и анализировать такой материал не всегда удобно. Для сортировки строк по какому-либо столбцу применяется фраза order by. Она включает список разделенных запятыми наименований столбцов, по которым требуется упорядочить выводимую информацию. Данная фраза должна всегда располагаться последней в операторе select и при ее наличии появляется возможность отсортировать строки по возрастанию (asc) или убыванию (desc) значений указанного столбца или комбинации указанных столбцов, независимо от того, присутствуют эти столбцы в результирующей таблице или нет.
Запрос 5
Вывести сведения о кафедрах университета в виде, отсортированном по столбцу Name_kaf в порядке возрастания.
Запрос будет выглядеть следующим образом:
SELECT *
FROM kafedra
ORDER BY Name_kaf ASC;
Kod_kaf |
Name_kaf |
Nom_telef |
Nom_Auditoria |
Col_sotr |
Zav_kaf |
002 |
Общей математики |
23-65-43 |
003 |
22 |
Малахов К. Л. |
005 |
Прикладной математики |
23-66-62 |
028 |
24 |
Ляхова И.Т. |
001 |
Физики |
23-34-24 |
132 |
25 |
Иванов Т. М. |
Результат данного запроса:
Kod_kaf |
Name_kaf |
Nom_telef |
Nom_Auditoria |
Col_sotr |
Zav_kaf |
004 |
Графики |
23-99-77 |
385 |
18 |
Фирсов С.С. |
003 |
Истории |
23-78-72 |
465 |
16 |
Росс Л.Т. |
Часто для улучшения наглядности выводимую информацию полезно отсортировать по нескольким столбцам. Для этого имена столбцов сортировки необходимо перечислить через запятую во фразе order by. При этом выводимая таблица будет содержать строки, упорядоченные по первому указанному во фразе order by столбцу, а строки, имеющие равные значения в этом столбце, будут упорядочены по значениям второго столбца и т. д. слева направо
Задание условий отбора
Задание условий отбора осуществляется с помощью фразы where. В предложение where можно включить одно или несколько условий отбора строк. В качестве условий отбора могут быть использованы следующие предикаты: ,
сравнения " = , <>, >, <, >=, <=" - для сравнения результатов вы числения двух выражений; более сложные выражения строятся с по мощью логических операторов AND, OR, NOT; значения выражений вычисляются в порядке, который определяется приоритетом исполь зуемых операторов и наличием скобок в выражении;
between a and в — предикат истинен, когда вычисленное значение выражения попадает в заданный диапазон (предикат not between a and в истинен тогда, когда сравниваемое значение не попадает в за данный интервал);
in — предикат истинен тогда, когда сравниваемое значение входит в множество заданных значений; при этом множество значений может быть задано простым перечислением или встроенным подзапросом (предикат not in истинен тогда, когда сравниваемое значение не вхо дит в заданное множество);
like и not like — предикаты, смысл которых противоположен, тре буют задания шаблона, с которым сравнивается заданное значение; предикат like истинен тогда, когда сравниваемое значение соответст вует шаблону, и ложен в противном случае;
is null — предикат, применяющийся для выявления равенства зна чения некоторого атрибута неопределенному значению:
- <имя атрибута> is null — принимает значение true, если в данной строке указанный атрибут имеет неопределенное значение и значение false, в противном случае: - <имя атрибута> IS NOT NULL — все ПРОИСХОДИТ Наоборот.
Рассмотрим несколько примеров.
Запрос 3
Вывести сведения о кафедре графики. Запрос будет выглядеть следующим образом:
SELECT * FROM kafedra
WHERE Name_kaf = 'Графики';
Ответ на такой запрос будет содержать только одну строку:
Kod_kaf |
Nom_kaf |
Nom_telef |
Nom_auditoria |
Col_sotr |
Zav_kaf |
004 |
Графики |
23-99-77 |
385 |
18 |
Фирсов С.С. |
Посмотрим, как работают другие предикаты, например between a and в.
Запрос 4
Вывести сведения о кафедрах университета, находящихся на первом этаже, учитывая тот факт, что номера аудиторий первого этажа лежат в диапазоне от 1 до 99.
Запрос будет выглядеть следующим образом:
SELECT *
FROM kafedra
WHERE Nom_Auditoria BETWEEN 1 AND 99;
Результат запроса:
Kod_kaf |
Name_kaf |
Nom_telef |
Norn_Auditoria |
Col_sotr |
Zav_kaf |
002 |
Общей математики |
23-65-43 |
003 |
22 |
Махов К.Л. |
005 |
Прикладной математики |
23-66-62 |
028 |
24 |
Ляхова И.Т. |