Иванов Д.Н. Введение в реляционные базы данных / Иванов Д.Н. Введение в реляционные базы данных
.pdfВр.хр
Д.Н. Иванов
Введение в реляционные базы данных
Учебное пособие по курсу «Базы данных»
Издательство Алтайского университета
Барнаул - 2003
ББК32.973.26-018.2я73 В24
Печатается по решению кафедры информатики АлтГУ
Рецензенты:
профессор кафедры прикладной математики АГТУ
Е.Н Крючкова
Алтайский
госуниверситет
БИБЛИОТЕКА
В24 Введение в реляционные базы данных: Учеб. пособие по курсу «Базы данных». - Барнаул: Изд-во Алт. ун-та, 2003.-43 с.
Данное учебное пособие подготовлено по материалам лекций по теории баз данных, читавшихся студентам математического факультета Алтайского государственного факультета. Главная задача пособия - дать начальный уровень знаний по основным положениям теории баз данных и помочь освоить практические методы и подходы к проектированию и созданию баз данных. Пособие предназначено ДЛЯ студентов младших курсов вузов, начинаюих изучать дисциплину «Базы данных».
© Иванов Д.Н., 2003 © Алтайский государственный университет, 2003
Предисловие
Практически любая информационная система требует эффективную и надежную технологию долговременного хранения и обработки информации. Поэтому такая область информатики, как системы баз данных является обя зательным предметом изучения студентами, специализирующихся в различ ных областях информационных технологий. Учебная дисциплина «Базы дан ных» включена в стандарты специальностей, связанных с подготовкой спе циалистов по вычислительной технике, а раздел, посвященный базам данных, включен в общий курс информатики всех специальностей.
Данное учебное пособие подготовлено по материалам лекций по теории баз данных, читавшихся студентам математического факультета Алтайского государственного факультета. Главная задача пособия - дать начальный уро вень знаний по основным положениям теории баз данных и помочь освоить практические методы и подходы к проектированию и созданию баз данных. Пособие предназначено для студентов младших курсов вузов, начинающих изучать дисциплину «Базы данных».
В первой главе в сжатом виде изложены основные положения теории баз данных, которые помогут ориентироваться в терминологии, понять ос новные концепции хранения, обработки и защиты информации от нарушения логической целостности. Рассмотрены реляционная модель данных, которая лежит в основе практически всех современных систем управления баз дан ных (СУБД), и реляционное исчисление, на основе которого построен стан дартный язык манипулирования данными SQL.
Во второй главе подробно рассмотрены методы и подходы к проектиро ванию баз данных. Особое внимание уделено семантическому моделирова нию на основе методов моделирования «сущность-связь». Разобраны основ ные положения и особенности теории нормализации, которая используется для сокращения избыточности данных и построения эффективной структуры реляционной базы данных. Обозначены распространенные проблемы и типо вые ошибки в проектировании, которые часто допускают начинающие разра ботчики.
Третья глава содержит практический пример всех этапов проектирова ния базы данных, начиная с построения семантической модели и заканчивая реализацией этой модели в виде рабочего макета базы данных, а также при меры построения запросов на извлечение данных.
Раздел упражнений для самостоятельной работы содержит темы задач различных уровней сложности для практического закрепления полученных знаний. В пособии не рассматриваются конкретные программные продукты реляционных СУБД, которые можно применить для решения задач. Такие продукты предлагаются студентам для самостоятельного освоения.
3
Введение
База данных в узком смысле может рассматриваться как некоторое автоматизированное хранилище необходимых для работы наборов данных. Однако абстрактное понятие «данные», как отражение объектов реального мира, в процессе разработки конкретного файла базы данных требует уточнения - какими свойствами наделен исследуемый объект, какие значения могут при нимать свойства объекта, какие действия допустимы с этим объектом, как этот объект связан с другими объектами. Без ответов на эти вопросы разраба тываемая база данных порождает массу проблем, которые впоследствии ска зываются на эффективности работы системы в целом, а также на достоверно сти результатов. Одна из самых распространенных проблем - это избыточ ность, возникающая при хранении одних и тех же данных в разных файлах. Избыточность приводит к .дублированию описания свойств объекта, и, как следствие, его неоднозначности и противоречивости. Несогласованность в описании объекта может привести к аномалиям обновления значений свойств, а также к напрасной работе по наполнению базы данных. Таким образом, отвечая на поставленные вопросы, данные обретают свою структуру, кото рая не ограничивается описанием физических объектов реального мира.
В традиционной терминологии объекты реального мира, сведения о ко торых хранятся в базе данных, принято называть сущностями {entity), а их свойства - атрибутами {attribute). Так, физический объект «Деталь» может обладать свойствами «Название», «Вес». Но в базе данных может храниться информация о заказах детали, что является процессом, а не физическим объ ектом. Кроме того, сущность «Заказ» может обладать своими собственными свойствами «Срок поставки», «Количество», «Поставщик».
Объекты реального мира имеют друг с другом множество сложных свя зей и зависимостей. База данных должна содержать описание значимых {пря мых) связей. Можно определить прямые связи между сущностями «Деталь» и «Поставщик», «Деталь» и «Производитель». С другой стороны, сущности «Поставщик» и «Производитель» зависимы друг от друга, но это всего лишь косвенная связь посредством сущности «Заказ». Отсутствие описаний связей может привести к нарушению логической целостности данных. Например, можно оформить заказ таких деталей, которые не выпускаются ни одним производителем.
Таким образом, в широком смысле слова, база данных теперь представ ляется как совокупность описаний объектов реального мира, связей между ними и хранилище соответствующих значений.
Глава 1. Основы теории реляционных баз данных
1.1. Системы баз данных
Задачи по доступу к данным и выполнению допустимых операций над ними решаются системами баз данных. Основные функции по поиску, до бавлению, обновлению и удалению данных согласно правилам и ограничени ям, описанным структурой базы данных, возлагаются на уровень программ ного обеспечения системы баз данных - систему управления базами данных {СУБД, Database Management System, DBMS), которая обеспечивает следую щие возможности:
-Совместное использование данных различными приложениями.
-Способность поддерживать разнообразные представления {view) од них и тех же данных.
-Управление многопользовательским доступом к данным.
-Гарантия безопасности - защита от несанкционированного доступа и обеспечение целостности данных.
Система баз данных состоит из следующих компонентов:
1.Пользователи. Люди, использующие данные.
2.Приложения. Прикладные программы пользователей, обеспечи вающие возможность пользователям манипулировать представле ниями данных.
3.СУБД. Программное обеспечение системы баз данных.
4.Данные. Физическая реализация СУБД по хранению информации.
5.Аппаратное обеспечение.
1.2.Модели данных
Модель данных имеет первостепенное значение и является фундамен том всех существующих СУБД. Модель данных - это формальная конструк ция, служащая для представления информации об окружающем мире. В рам ках модели данных принято рассматривать три компонента:
-Структура данных.
-Целостность данных.
-Манипуляция данными.
В теории баз данных определены четыре традиционные модели данных, используемых при проектировании СУБД.
Иерархическая модель данных была предложена в 1968 году компанией IBM. Данные модели представлены в виде упорядоченного набора деревьев, где дерево - структура данных, в которой каждая запись данных связана только с одной записью-предком и произвольным набором записейпотомков.
4
Сетевая модель данных была создана в 1971 году рабочей группой Da tabase Task Group Конференции по языкам и системам данных (Conference On Data Systems Languages, CODASYL). Сетевая модель является, по сути, мо дификацией иерархической модели, где появилась возможность связывания одной записи-потомка с произвольным набором записей-предков.
Реляционная модель данных впервые была сформулирована Э. Ф. Коддом (Codd E.F.) в 1970 году. Она существенно отличалась от описанных ра нее моделей и в 80-х годах получила всеобщее признание как наиболее со гласованная и удобная модель разработки СУБД. В реляционной модели данные представляются в виде таблиц, состоящих из строк и столбцов. Связь между данными осуществляется не с помощью явных указателей, как в сете вой модели, а С помощью значений одного или нескольких столбцов связан ных таблиц.
Объектно-ориентированная модель призвана устранить некоторые не достатки реляционной модели, связанные с идеей представления данных в виде некоторого пассивного множества, где нет средств моделирования ре ального поведения данных. Кроме того, весьма ограниченные семантические ВОЗМОЖНОСТИ описания данных реляционной модели затрудняют понимание действительного смысла данных. Так, например, операция оформления зака за деталей требует проверки наличия соответствующего количества деталей у производителя, что можно реализовать в реляционной базе данных путем написания специальной автоматически вызываемой СУБД процедуры {триг гера). В объектно-ориентированной базе данных такая операция может быть составной частью определения данных. В настоящее время, не смотря на все попытки стандартизации, объектно-ориентированная модель данных не име ет такого четкого определения, как реляционная модель. Отсюда возникают различные способы реализации объектно-ориентированных СУБД. Поэтому потенциальные пользователи СУБД, знакомые с реляционным подходом и однородным составом программных продуктов, не спешат переходить к объ ектно-ориентированным системам, хотя ряд реляционных продуктов уже снабжен объектно-ориентированными технологиями.
1.3, Реляционная модель данных
Внастоящее время на рынке СУБД преобладают программные продук ты, построенные на реляционных технологиях. Реляционная модель данных имеет строгое теоретическое обоснование по каждому компоненту - струк туре данных, целостности данных и манипуляции данными.
1.3.1.Структура реляционных данных
Вреляционной базе данных информация хранится в двумерной таблице, которая называется отношением. Каждая строка отношения называется кор тежем, каждый столбец отношения - атрибутом. В терминологии СУБД строка и столбец называются соответственно записью и полем. Количество
6
атрибутов определяет степень отношения, а количество кортежей - карди нальность отношения. Каждое отношение содержит тело и заголовок. Заго ловок состоит из имени отношения и имен атрибутов, которые составляют данное отношение. Имя отношения должно быть уникальным в системе, имя атрибута должно быть уникальным в данном отношении. Тело отношения состоит из неупорядоченного набора кортежей. Значение атрибута в каждом кортеже должно удовлетворять условию атомарности, т.е. на пересечении строки и столбца может находиться единственное значение, а не набор. От ношение, удовлетворяющее условию атомарности, называется нормализован ным.
Таким образом, реляционной базой данной можно назвать набор норма лизованных отношений разной степени.
1.3.2. Целостность реляционных данных
Целостность данных в реляционной системе обеспечивается набором определенных ограничений на значения атрибутов и концепцией ключей.
Домен {domain) определяет набор допустимых значений, которые может принимать атрибут. В узком смысле понятие домен близко к понятию тип данных, принятый в программировании. Как и тип данных, домен определяет не только множество допустимых значений, но и допустимые операции для каждого типа (например, сложение чисел, конкатенация строк и т.д.). Однако, идея, заложенная в понятие «домен», намного шире, чем понятие «тип дан ных» и может трактоваться как семантика значения атрибута или как природа данных. Например, для представления роста человека можно использовать домен «Рост», а для показателей веса - домен «Вес». Оба домена могут быть представлены числовым типом данных, но операции, например, сложения и сравнения для значений этих двух доменов будут бессмысленны. В теории реляционных баз данных в определении отношения всегда указывается имя атрибута и его домен, что является необходимым условием. Поэтому, каждое значение, присваиваемое атрибуту должно соответствовать его домену. В рамках одного отношения допустимо использование нескольких атрибутов, определенных на одном и том же домене. К сожалению, ни один программ ный продукт, выпущенный на рынок реляционных СУБД в настоящее время, не поддерживает домены в полном его смысле в связи со сложностью форма лизации этого понятия на программном уровне. Взамен доменов современ ные реляционные СУБД предлагают дополнительные ограничения на атри буты на основе базовых типов данных, например, диапазон допустимых це лочисленных значений от 0 до 300, строки длиной в 25 символов и т.д. В не которых СУБД существует возможность создания пользовательских типов данных основанных на базовых типах, что можно рассматривать как некото рую замену доменам.
Null-значения определяют отсутствие значения. Потребность в неопре деленном значении атрибута возникает, когда, например, база данных созда-
7
ется на основе информации, не обладающей полными сведениями о какой либо сущности. Так, если в базе данных хранится информация о картинах, то вполне вероятно в коллекции может существовать картина неизвестного ху дожника. В этом случает атрибут «Автор» отношения «Картина» должен принимать Null-значения, а не строковое значение «Неизвестен», так как это значение системой может быть распознано как имя художника. Таким обра зом, в определении отношения кроме домена для каждого атрибута также необходимо указать допустимость Null-значений. Существуют определенные причины, требующие минимизации использования Null-значений для обес печения целостности данных, которые будут рассмотрены ниже.
Потенциальный ключ (candidate key) - это атрибут или набор атрибутов, которые можно использовать для уникальной идентификации кортежей от ношения. В реляционной модели данных всякое отношение обладает свойст вом уникальности кортежей. Реализация этого свойства возложена на систе му потенциальных ключей, причем в одном отношении может быть опреде лено несколько потенциальных ключей, каждый из которых имеет собствен ное множество уникальных значений. Любой потенциальный ключ не может содержать атрибуты с Nullзначениями.
Первичный ключ (primary key) обычно выбирается среди потенциальных ключей и может быть определен в отношении только в единственном числе. Условно первичный ключ можно назвать «главным» потенциальным ключом отношения.
Внешний ключ (foreign key) определяет связи отношений по значениям определенного атрибута или нескольких атрибутов. Если в отношении А есть потенциальный ключ СК, то в отношении В можно определить внешний ключ FK, значения которого в каждом кортеже должны соответствовать од ному из значений всех кортежей потенциального ключа СК отношения А. Причем количество атрибутов, входящих в состав внешнего ключа FK долж но соответствовать количеству атрибутов потенциального ключа СК, а каж дый атрибут внешнего ключа должен быть определен на том же домене, что и соответствующий атрибут потенциального ключа. Заметим, что имена ат рибутов не обязательно должны совпадать. Этот процесс называет заданием связи между отношениями А и В. Схематично такая связь выражается как В—>А. Реляционная модель допускает связь атрибутов внутри отношения как A(X)—>A(Y), где X и Г - атрибуты внешнего ключа и потенциального ключа соответственно, которые определены на одном домене. Связь вида R1 —> R2
->... —>• Rn называется ссылочным путем, а связь Rt —> R2 —> ... —> Rn —>R1 явля ется ссылочным циклом.
При использовании системы внешних ключей возникает понятие ссы лочной целостности. Реляционная СУБД должна гарантировать целостность данных при удалении кортежей или модификации значений атрибутов, вхо дящих в состав потенциального ключа, для которого определены один или несколько внешних ключей. Что должно произойти, если, например, из от-
ношения «Автор» будет удален кортеж, содержащий информацию о худож нике, а в отношении «Картины» существует несколько кортежей с информа цией о картинах этого художника? Существует три типа соблюдения ссылоч ной целостности, один из которых должен быть указан при создании внешне го ключа в отношении «Картины»:
-Ограничение. СУБД запрещает удаление кортежа, если существуют соответствующие ссылки на значения потенциального ключа этого кортежа из других отношений.
-Каскадирование. Этот вариант предусматривает предварительно уда ление всех кортежей, содержащих соответствующие значения внешнего ключа ссылающихся отношений, а затем удаление и самого требуемого кор тежа.
-Присвоение Null-значения. В этом случае все значения внешнего ключа ссылающихся отношений заменяются Null-значениями,
Необходимо отметить, что никаких ограничений не накладывается на удаление кортежей, содержащих значения внешнего ключа.
Если в состав какого-либо ключа входит один атрибут, то такой ключ называется простым, если несколько атрибутов, то составным ключом.
1.33. Реляционная база данных
База данных будет отвечать требованиям реляционной модели, если:
1.Данные хранятся в двумерных таблицах. Каждое имя таблицы уникально.
2.Каждый атрибут имеет уникальное имя для данной таблицы.
3.Каждый атрибут таблицы определен доменом.
4.Для каждого атрибута таблицы определена возможность использо вания Null-значений.
5.Значение каждого атрибута атомарно.
6.Для каждой таблицы определен хотя бы один потенциальный ключ.
7.Определены связи между таблицами и установлены соответствую щие внешние ключи.
8.Для каждого внешнего ключа указан тип соблюдения ссылочной целостности.
1.3.3. Манипулирование реляционными данными
Теоретической основой реляционной модели стала теория отношений, основу которых заложили два логика - американец Чарльз Содерс Пирс (Ch. S. Pierce, 1839-1914) и немец Эрнст Шредер (Е. Schroder, 1841-1902). В руко водстве по теории отношений было показано, что множество отношений замкнуто относительно некоторых специальных операций, что образует вме сте с этими операторами абстрактную алгебру.
Одно из главных достоинств реляционных баз данных - это возмож ность извлекать данные из любого множества реляционных таблиц посредст-
8 |
9 |
вом всего восьми реляционных операций, образующих реляционную алгебру, которую впервые сформулировал в 1970 году Э.Ф. Кодд.
- Выборка (WHERE). Оператор WHERE возвращает кортежи указанного отношения, которые удовлетворяют значению «истина» некоторого логиче ского выражения. Например:
Д е т а л и WHERE Вес > 10 AND Вес < 42
- Проекция. Операция проекции возвращает все кортежи указанного от ношения с сокращенным набором атрибутов за исключением дубликатов. Например:
Автор [Фамилия, Дата рождения]
- Декартово произведение (TIMES). Декартово произведение двух от ношений возвращает отношение, все кортежи которого состоят из конкате нации кортежей исходных отношений. Тело результирующего отношения состоит из всех возможных сочетаний кортежей первого отношения с корте жами второго. Степень результирующего отношения равняется сумме степе ней исходных отношений, а кардинальность - произведению кардинальности исходных отношений. Исходные отношения не должны содержать общих атрибутов, т.е. атрибутов, заданных на одном и том же домене и имеющих одинаковые имена: A(W, X) TIMES B(Y, Z) = C(W, X, Y, Z).
A |
|
B |
|
A |
TIMES |
|
В |
W |
X |
Y |
Z |
|
W X |
Y |
Z |
wl |
xl |
y2 |
zl |
wl |
xl |
y2 |
zl |
w2 |
x2 |
yl |
z2 |
wl |
xl |
yl |
z2 |
|
|
|
|
w2 |
x2 |
у2 |
zl |
|
|
|
|
w2 |
x2 |
yl |
z2 |
- Соединение (JOIN). Операция соединения - разновидность декартова произведения, в котором участвуют два отношения с одним или несколькими общими атрибутами. Соединение с такими условиями еще называют естест венным соединением. Результат соединения - тело, состоящее из всех воз можных сочетаний кортежей исходных отношений, в которых совпадают значения общих атрибутов: А(Х, Y) JOIN B{Y, Z) = С(Х, Y, Z).
|
A |
|
B |
|
A |
JOIN |
В |
|
||
W |
X |
Y |
X |
Y |
Z |
W |
X |
Y |
Z |
|
wl |
xl |
y2 |
x2 |
y2 |
zl |
w2 |
x2 |
y2 |
zl |
|
w2 |
x2 |
y2 |
||||||||
x2 |
y3 |
z2 |
w3 |
x2 |
y3 |
z2 |
||||
w3 |
x2 |
y3 |
||||||||
x3 |
y3 |
z3 |
|
|
|
|
||||
w4 |
x3 |
y4 |
|
|
|
|
||||
x4 |
y4 |
z4 |
|
|
|
|
||||
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
10 |
|
|
|
В случае, если в отношениях A{W,X) и B(Y, Z) нет общих имен атрибу тов, но есть общие домены атрибутов X и У, то соединение таких двух отно шений можно выразить как
(A TIMES В) WHERE X=Y
-Объединение (UNION). Операция объединения выполняется как стан дартная математическая операция работы с множествами. В реляционной алгебре такая операция применима только к совместимым по типу отноше ниям, т.е. должны совпадать степени исходных отношений и каждый атрибут одного отношения должен совпадать по имени и домену с соответствующим атрибутом второго отношения. Результат объединения - отношение с заго ловком, совпадающим с одним из исходных отношений, и телом, состоящим из всех кортежей исходных отношений. Все дубликаты кортежей из резуль тата исключаются: А(Х) UNION В(Х) = С(Х).
-Вычитание (MINUS). Операция вычитания также применяется к двум совместимым по типу отношениям и возвращает кортежи, которые присутст вуют только в первом отношении.
-Пересечение (INTERSECT). Операция пересечения двух совместимых по типу отношений возвращает кортежи, которые существуют в обоих отношениях.
-Деление (DIVIDE). Одно отношение можно разделить на другое, если множество атрибутов второго отношения является подмножеством атрибутов первого отношения. Результат деления - отношение, заголовок которого со стоит из атрибутов первого отношения без перекрывающихся атрибутов вто рого отношения: А(Х, Y) DIVIDE B(Y) = С(Х). Тело результата будет содер жать такие значения не перекрывающихся атрибутов первого отношения, которые совпадают для всего набора значений атрибутов второго отношения.
АВ
X |
Y |
Y |
|
|
|
xl |
yl |
y1 |
xl |
у2 |
У2 |
xl |
уЗ |
|
х2 |
yl |
|
хЗ |
у2 |
|
После определения Коддом первоначальных восьми операций появи лась необходимость введения дополнительных операторов.
- Расширение (EXTEND). В традиционных операциях отсутствуют сред ства скалярных вычислений. Оператор EXTEND позволяет дополнить исход ное отношение новым вычисляемым атрибутом, причем вычисление производится «горизонтально» - по значениям атрибутов текущего кортежа. Так, например, если в отношении «Сотрудники» определены атрибуты
11
«Имя» и «Дата_рождения», то появляется возможность вычисления для каж дого сотрудника его возраста:
EXTEND Сотрудники ADD (СЕГОДНЯ()-Дата_рождения)/365.25 AS Возраст
- Переименование (RENAME). В результате операции переименования получается отношение с измененным именем атрибута или нескольких атри бутов.
Сотрудники RENAME Фамилия AS Фам_Сотр, Имя AS Имя_Сотр
- Подведение итогов (SUMMARIZE). Оператор SUMMARIZE позволя ет проводить «вертикальное» вычисление по всем значениям атрибута отно шения, как для всего отношения, так и для определенных групп значений указанного атрибута или нескольких атрибутов. Для такого рода вычислений используется ряд агрегатных функций COUNT(), MAX(), MIN(), SUM(), AVG().
SUMMARIZE Сотрудники BY ()
ADD AVG(Возраст) AS Средний_Возраст
SUMMARIZE Детали BY (Цвет)
ADD COUNT() AS Количество_Деталей
В первом случае получается отношение с одним кортежем и атрибутом «Средний_Возраст», в котором хранится среднее значение возраста всех со трудников. Во втором случае отношение результата содержит два атрибута: атрибут «Цвет» и ровно столько кортежей, сколько уникальных значений цвета деталей присутствует в отношении, и атрибут «Количество_Деталей», где для каждого цвета в кортеже указано количество деталей такого цвета.
Кроме того, существуют операторы обновления (INSERT, UPDATE, DELETE), которые позволяют соответственно добавлять новые кортежи в отношение, обновлять существующие значение атрибутов и удалять кортежи из отношения.
Нетрудно заметить, что в результате каждой реляционной операции по лучается новое отношение, над которым, в свою очередь, можно выполнять другие операции. Такое свойство называется свойством замкнутости.
Некоторому выражению, построенному с помощью реляционных опе раторов, можно присвоить имя и хранить этот новый объект в реляционной базе данных. Такой объект называется представлением {view), обращение к которому осуществляется как к обычному отношению и над которым можно выполнять другие реляционные операции.
Красные_Детали := Детали WHERE Цвет="Красный"
12
1.4. Язык SQL
Язык структурированных запросов {Structured Query Language, SQL)
является стандартом для всех реляционных систем. SQL позволяет пользователю СУБД создавать и удалять данные из базы данных, описывать правила, обеспечивающие целостность данных в рамках реляционной мо дели, а также выполнять полный набор операций реляционной алгебры.
Язык был разработан в конце 70-х годов и был реализован в первом прототипе реляционной СУБД System R фирмы IBM. В силу широкого рас пространения SQL стал стандартом «де-факто» для языков манипулирования данными в реляционных системах. Язык неоднократно подвергался стандар тизации. В 1989 году был создан первый стандарт языка, который получил название ANSI-SQL или SQL1. Дальнейшая стандартизация проводилась в 1989 и 1992 годах, после чего появились стандарты SQL2 и SQL3. Однако не все СУБД поддерживают последние стандарты языка SQL. Каждый разра ботчик пытается внести в язык собственные дополнительные функциональ ные возможности, в результате чего появляются различные модификации языка. Так, например, СУБД Oracle предлагает язык PL/SQL, в СУБД Micro soft SQL Server используется собственная модификация языка T-SQL. Для знакомства с языком SQL достаточно рассмотреть стандарт ANSI-SQL, кото рый должен поддерживаться всеми СУБД, претендующими на роль реляци онных СУБД.
Реляционная алгебра используется для извлечения данных из реляцион ной базы данных. Язык SQL предлагает для реляционных систем интерфейс более высокого уровня. Это декларативный язык, а не процедурный. В реля ционной алгебре указывается последовательность реляционных операций, т.е. процедуру, с помощью которой можно получить в результате необходи мое отношение. В языке SQL составляется описание данных, которые необ ходимо получить посредством оператора, который транслируется нижеле жащим системным уровнем в последовательность алгебраических операций.
Язык SQL состоит из операторов, которые делятся на две группы.
-Язык определения данных {Data Definition Language, DDL). Операторы CREATE, ALTER и DROP позволяют описывать и изменять структуру базы данных, включая определение таблиц, представлений, ключей, индексов и т.д. - любых объектов базы данных.
-Язык манипулирования данными {Data Manipulation Language, DML).
Операторы SELECT, INSERT, UPDATE и DELETE используются для извле чения, вставки, обновления и удаления данных соответственно.
1,4.1. Оператор SELECT
Оператор извлечения данных SELECT предлагает полный спектр функ циональных возможностей реляционной алгебры. Имея в качестве аргумента все множество таблиц базы данных и их представлений, оператор описывает
13
ограничения, какие необходимо наложить на это множество, чтобы в резуль тате получить требуемую таблицу.
Синтаксис оператора SELECT можно представить следующим образом:
SELECT [ |
ALL |
| DISTINCT |
] |
{ |
< |
Список атрибутов > | * } |
|||
FROM < |
список |
таблиц |
> |
|
|
|
|
||
[ |
WHERE |
< |
условие выборки |
> |
} |
|
|
||
[ |
GROUP |
BY |
< |
список |
атрибутов |
группы > |
|||
[ |
HAVING < |
условие на |
группу |
> |
] |
] |
|||
[ |
ORDER |
BY |
< |
список |
сортируемых |
атрибутов > ) |
Порядок выполнения инструкций оператора строго определен. Резуль тат каждой инструкции - таблица, к которой применяет следующая инструк ция.
1. Инструкция FROM. Результат вычисления обязательной инструкции FROM есть декартово произведение таблиц, перечисленных в списке. Список не может быть пустым и должен состоять хотя бы из одной таблицы. Каждой таблице допустимо назначение псевдонима, который будет действительным только в рамках всего выражения оператора SELECT, например:
FROM Детали AS А, Производители AS В
2.Инструкция WHERE выполняет реляционную операцию выборки к результату инструкции FROM. Инструкция WHERE необязательна и может быть опущена.
3.Инструкция GROUP BY также необязательна и применяется к резуль тату двух предыдущих инструкций, группируя строки по значениям указан ных в списке атрибутов.
4.Инструкция НА. V1NG может применяться только к сгруппированной таблице и накладывает некоторое условие на группу.
BY Детали.Цвет
HAVING COUNT() > 100
Указанный пример пары инструкций GROUP BY и HAVING группиру ет таблицу «Детали» по цвету, а затем оставляет в результате только те цвета,
укоторых количество соответствующих записей в группе превышает 100.
5.Инструкция SELECT применяется к результату всех предыдущих ин струкций и эквивалентна реляционным операциям проекция, расширение и переименование. Предположим, что таблица «Сотрудники» содержит атри буты «Фамилия», «Имя», «Отчество», «Дата рождения» и «Номер отдела». Таблица «Отделы» содержит атрибуты «Номер отдела» и «Название». Для получения списка всех сотрудников с указанием отдела, где он работает, и его текущего возраста можно построить следующее выражение на языке SQL.
SELECT
А.Номер отдела, Фамилия AS Сотрудник,
(СЕГОДНЯ() - Дата_Рождения)/365.25 AS Возраст, Название AS Отдел
FROM Сотрудники AS А, Отделы AS В WHERE А.Номер_Отдела = В.Номер_Отдела
Эквивалентная запись данного запроса операторами реляционной ал гебры будет выглядеть так:
( |
( |
EXTEND |
(Сотрудники |
JOIN Отделы) |
|
|
ADD |
(СЕГОДНЯ() |
- Дата рождения)/365.25 AS Возраст |
|
) |
RENAME |
Фамилия AS |
Сотрудник, Название AS Отдел |
) |
[ |
Номер_Отдела, Фамилия, Возраст ] |
Символ «*» применяется для указания всех атрибутов вычисленной таблицы. Однако при декартовом перемножении двух таблиц, в которых при сутствуют два атрибута с одинаковым именем (как «Номер отдела» в приме ре), что допустимо на высоком уровне языка SQL в отличие от строгих пра вил реляционной алгебры, возникает путаница - какой из атрибутов имеется в виду.
Таблица, которая возвращается в результате выполнения оператора SELECT, может содержать дубликаты строк, избежать которых можно, ука зав ключевое слово DISTINCT.
6. Инструкция ORDER BYвыполнятся последней, и сортирует результат по указанным в списке атрибутам, причем имена атрибутов должны соответ ствовать именам атрибутов из списка инструкции SELECT. Порядок сорти ровки указывается после каждого атрибута. Ключевое слово ASC использу ется для сортировки по возрастанию и DESC - по убыванию. Кроме имен атрибутов можно использовать порядковый номер результирующего столбца в списке инструкции SELECT, например:
ORDER BY 4, Возраст DESC, Сотрудник
Необходимо отметить некоторые особенности и ограничения использо вания отдельных инструкций. Инструкция SELECT не может содержать ат рибуты, не входящие в список атрибутов инструкции GROUP BY, кроме но вых вычисляемых атрибутов с использованием агрегатных функций COUNT0, МАХ(), MIN(), SUMO, AVG().
Допустимо использование вложенных подзапросов, например, для по иска всех деталей с максимальным весом можно использовать следующее выражение:
SELECT * FROM Детали
WHERE Вес = (SELECT MAX(Вес) FROM Детали)
14 |
15 |
|
Дополнительные возможности по конструированию условия выборки возникают при использовании специальных логических операторов.
- X [NOT] LIKE {шаблон} - оператор сравнения LIKE дает значение «истина», если строковое значение атрибута X соответствует шаблону. Шаб лон - строка, которая может содержать два специальных символа «%» и «_». Первый означает любое количество любых символов, а второй - один любой символ.
- X [NOT] BETWEEN xl AND x2 - дает значение «истина», если значе ние атрибута X лежит внутри диапазона значений [xl..x2].
-X [ NOT ] IN (подзапрос) - дает значение «истина», если значение ат рибута X в текущей строке исходной таблицы содержится в множестве всех значений единственного атрибута таблицы, получаемой в результате подза проса.
-X {оператор сравнения} ALL | ANY (подзапрос) - условие вида «все- или-какой-нибудь» дает значение «истина», когда соответствующее сравне ние значения атрибута X в текущей строке исходной таблицы дает значение «истина» для всех значений (ALL) или хотя бы для одного значения (ANY) единственного атрибута таблицы, получаемой в результате подзапроса.
Пример. Найти красные детали, которые тяжелее любой синей детали.
|
|
Детали |
|
SELECT Название |
|
|
|
|
|
FROM Детали |
|
Название |
Цвет |
Вес |
|||
WHERE Цвет = "RED" AND |
|||||
Вес |
> ALL |
|
|
||
D101 |
|
BLUE |
17 |
( SELECT Вес FROM Детали |
|
D102 |
|
BLUE |
12 |
WHERE Цвет = "BLUE" ) |
|
D203 |
|
RED |
21 |
|
|
D204 |
|
RED |
14 |
|
В результате запроса будет получена деталь D203. Если необходимо найти красную деталь тяжелее хотя бы одной синей детали, то в запросе сле дует заменить ALL на ANY и будут получены детали D203 и D204.
- [NOT] EXISTS (подзапрос) - дает значение «истина», если таблица подзапроса возвращает хотя бы одну строку.
SELECT * FROM Детали AS Д1 WHERE Д1.Цвет - "RED" AND EXISTS
( SELECT * FROM Детали AS Д2
WHERE Д1.Вес > Д2.Вес AND Д2.Цвет = "BLUE" )
Пример эквивалентен поиску красных деталей, которые тяжелей хотя бы одной синей детали. Но в этих двух примерах есть существенное разли чие, связанное с оптимизацией запроса. Скорость выполнения второго при мера на большом массиве данных будет существенно ниже, чем первого. Де ло в том, что подзапрос первого примера выполняется один раз и сравнение происходит для каждой строки по уже вычисленному подзапросу. Подзапрос второго примера будет выполняться постоянно для каждой строки Д1. Одна-
ко, существуют определенные задачи, решение которых невозможно без опе ратора EXISTS.
-X IS [NOT] NULL - возвращает значение «истина», если значение X не определено. Обычный оператор сравнения, например, X = NULL дает значе ние «ложь».
Замечание. Исходные Null-значения дают неопределенные значения ре зультату любых операций. Например, если один из числовых атрибутов X или Y в каком-либо кортеже примет значение NULL, то результат операции X
+Y для этого кортежа будет равен NULL.
Спомощью оператора UNION можно выполнить реляционную опера цию объединения двух запросов, построенных с помощью оператора SELECT:
(3aпpoc 1) UNION (Запрос2)
Язык SQL некоторых СУБД поддерживает соответствующие реляцион ным операциям вычитания и пересечения операторы MINUS и INTERSECT. Если такая поддержка отсутствует, то, например, операцию вычитание А(Х) MINUS B(X) можно выразить как
SELECT X FROM A WHERE X NOT IN (SELECT X FROM B)
Особую реализацию получила реляционная операция соединения. На пример, A(X,Y) JOIN B(Y,Z) можно выразить как
SELECT X, A.Y, Z FROM А, В WHERE A.Y == B.Y
В языке SQL-92 существует специальный синтаксис соединения таблиц:
SELECT A . * , B.Z FROM A JOIN В ON A.Y = B.Y
Это пример обычного в понимании реляционной алгебры естественного
соединения, которое еще называется полным |
внутренним соединением. |
Кро |
ме внутреннего соединения существует три |
вида внешнего соединения: |
пол |
ное, левое и правое внешнее соединение. Отличие внешнего соединения от внутреннего заключается в том, что в результирующей таблице не отбрасы ваются строки, в которых значения общих столбцов не совпадают. Так, на пример, при левом соединении в результат войдут все строки левой таблицы, а значения столбцов отсутствующих строк по значению общего столбца пра вой таблицы будут заменены Null-значением.
SELECT A.*, B.Z FROM A LEFT OUTER JOIN В ON A.Y = B.Y
АВ A LEFT OUTER JOIN В
X |
Y |
Y |
Z |
X |
Y |
Z |
xl |
yl |
y2 |
zl |
xl |
yl |
NULL |
x2 |
y2 |
y3 |
z2 |
x2 |
y2 |
zl |
16 |
17 |
1.4.2. Операторы INSERT, UPDATE и DELETE
Оператор INSERT позволяет добавлять в таблиц}' одну строку, если указана следующая форма выражения:
INSERT INTO < таблица >
{ ( < список атрибутов > ) VALUES ( < список значений > )
} | DEFAULT VALUES
Также можно добавить сразу несколько строк, полученных с помощью запроса:
INSERT INTO < таблица > ( < список атрибутов > ) < запрос >
Оператор UPDATE позволяет обновить значения атрибутов таблицы новыми значениями.
UPDATE < таблица > SET
< атрибут > = < значение > | ( < подзапрос > )
[, < атрибут > = < значение > | ( < подзапрос > ) [,...]] [WHERE < условие на обновляемые строки > ]
Оператор DELETE удаляет из таблицы строки, которые удовлетворяют указанному условному выражению.
DELETE FROM < таблица >
[WHERE < условие на удаляемые строки > ]
Инструкция WHERE операторов UPDATE и DELETE соответствует по своим возможностям инструкции WHERE оператора SELECT.
1.5. Реляционная СУБД
Система управления базами данных является реляционной, если
1. Обеспечивает поддержку реляционных баз данных согласно указан ным выше условиям.
2.Обеспечивает поддержку целостностей сущностей их связей.
3.Поддерживает реляционные операции по манипулированию данными посредством языка SQL.
Глава 2. Проектирование реляционной базы данных
Первым шагом перехода от теории к практике является процесс проек тирования реляционной базы данных для конкретной предметной области. Каждая предметная область порождает многообразие объектов и процессов, в которых участвуют эти объекты по определенным правилам, всевозможные связи и зависимости между объектами. Поэтому проектирование базы дан-
18
ных является достаточно сложным и ответственным этапом в ходе реализа ции системы, главная цель которого - создание эффективной структуры дан ных, имеющей максимальную защиту целостности данных.
2.1. Этапы проектирования базы данных
Процесс проектирования базы данных состоит из нескольких этапов.
1. Постановка задачи. Первая стадия проектирования заключается в фиксации требований пользователя как к разрабатываемой системе в целом. так и к управляемой этой системой информации.
2.Семантическое моделирование. На основе поставленных пользовате лем требований строится семантическая модель базы данных, цель которой заключается в описании смыслового значения данных. Сначала проводится системный анализ предметной области на основе требований пользователя для подробного словесного описания объектов этой области, их свойств, свя зей и зависимостей с другими объектами, на основе чего строится модель «сущность-связь», которая представляет зависимости между объектами в виде диаграмм. Существуют и другие методы семантического моделирования для определения смыслового значения данных, однако различные вариации модели «сущность-связь», или ER-модели, являются самыми распространен ными в моделировании баз данных.
Первые два этапа представляют концептуальное проектирование базы данных, в результате которого создается высокоуровневая логическая модель базы данных, которая еще называется концептуальной моделью. Такая мо дель обладает следующими свойствами:
- Независимость от классических моделей данных. Построив четко оп ределенную концептуальную модель, можно выбирать, на каком типе систе мы проводить реализацию базы данных и даже сменить ее, если появится такая необходимость. Однако, такая независимость только кажущаяся, так как в действительности каждая методология семантического моделирования приспособлена к определенному типу системы. Так, в частности ERмоделирование направлена именно на реляционные системы, но если уже определено, что использоваться будет реляционная система, то независи мость ER-модели от конкретной реляционной СУБД существует.
- Полнота описания данных. Это важное свойство говорит о том, что в концептуальную модель можно заложить намного больше смыслового опи сания и ограничений, чем в любой классической модели данных.
3.Следующим этапом проектирования базы данных будет преобразова ние концептуальной модели в концептуальную схему конкретной системы баз данных. Для реляционной СУБД это будет процесс преобразования опре деленных сущностей во множество таблиц, создания потенциальных ключей, определения связей между таблицами посредством внешних ключей и т.д.
19