Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Хомоненко А.Д., Цыганков В.М., Мальцев М.Г. - Базы данных. Учебник для высших учебных заведений (6-е изд.) - 2009

.pdf
Скачиваний:
4944
Добавлен:
14.05.2016
Размер:
14.64 Mб
Скачать

3. Реляционная модель данных

83

Пример 3. Запись выражения.

Приведем запись выражения, соответствующее запросу: «Получить имена поставщиков, которые поставляют все детали».

5Х.Город_П WHERE FORALL РХ (EXISTS SPX

(SPX.n# = SX.n# AND SPХ.Д# = 5Х.Д# ))

Равносильное этому выражение выглядит так:

5Х.Город_П WHERE NOT EXISTS РХ (NOT EXISTS SPX

(SPX.n# = SX.n# AND 5РХ.Д# = 5Х.Д#))

Описанное исчисление не обладает вычислительной полнотой, так как не позволяет выполнять вычисления, связанные с обработкой данных в базах. Добавление вычислительных функций в это исчисление можно реализовать путем расширения определения операндов сравнения и элементов целевого списка таким образом, чтобы они допускали использование скалярных выражений с литералами, ссылками на атрибуты и итоговыми функциями. В качестве итоговых могут выступать следующие функции: COUNT (количество), SUM (сумма), AVG (среднее), МАХ (максимальное), MIN (минимальное). Для целевых элементов целесообразно использовать спецификацию вида «AS <имя атрибута>», позволяющую явно задать имя результирующему атрибуту, если нет очевидного наследуемого имени.

Пример 4. Запись запроса.

Пусть требуется получить информацию о каждой поставке с полными данными о деталях и общем весе поставки. Запрос на дополненном функциями языке реляционного исчисления кортежей может выглядеть следующим образом:

(SPX.n#, SPX.Количество, РХ, РХ.Вес * 5РХ.Количество AS Общий_Вес) WHERE РХ.Д# = SPX.JX#

Вариант реляционного исчисления, основанного на доменах {исчисление доменов), предложен Лакроиксом и Пиротте (Lacroix and Pirotte), которые также разработали на его основе соответствующий язык ILL. Другими языками, основанными на исчислении доменов, являются: FQL, DEDUCE, а также QBE с некоторыми оговорками.

По утверждению Дейта, язык QBE включает элементы исчисления кортежей и исчисления доменов, но более близок ко второму. Он не является реляционно полным, так как не поддерживает операцию отрицания квантора существования (NOT EXISTS). Несмотря на этот недостаток, язык QBE получил широкое распространение в современных СУБД. Тем более, что реализации этого языка, как правило, шире исходного языка.

84

Часть 1. Основы построения баз данных

Исчисление доменов имеет много сходства с исчислением кортежей. В отличие от исчисления кортежей, в исчислении доменов основой любого выражения запроса выступают переменные доменов. Переменная домена — это скалярная переменная, значения которой охватывают элементы некоторого домена.

Большая часть различий рассматриваемых исчислений заключается в том, что исчисление доменов поддерживает дополнительную форму условия, называемую условием принадлежности. В общем виде условие принадлежности записывается в виде:

R ( A , : ^ , A 2 : ^ , . . . ),

где А. — атрибут отношения R, а й — переменная домена или литерал. Проверяемое условие истинно, если и только если существует кортеж в отношении R, имеющий атрибуты А, равные заданным в выражении соответствующим значениям

Например, выражение SP (П# : 'S1', Д# : 'Р1') истинно, если в отношении SP существует хотя бы один кортеж со значением *S 1' атрибута П# и значением Ф Г атрибута Д#. Аналогично, выражение SP (П# : SX, Д# : РХ) истинно, если в отношении SP существует кортеж, в котором значение атрибута П# эквивалентно текущему значению переменной домена SX, а значение атрибута Д# эквивалентно текущему значению переменной домена РХ.

В следующих примерах будем подразумевать существование (объявленное каким-либо образом, подобно оператору RANGE исчисления кортежей) следующих переменных доменов: SX (домен П#), РХ (домен Д#), NAMEX (домен Имя).

Пример 5. Выражения исчисления доменов.

(SX) WHERE S ( n # :SX)

(SX) WHERE S (П# : SX, Город_П : 'Москва')

NAMEX WHERE EXISTS SX ( S (П# : SX, Имя : NAMEX) AND FORALL PX ( IF P (Д# : РХ )

THEN SP (П# : SX, Д# : PX ) ) )

Первое выражение означает множество всех номеров поставщиков отношения S, второе — множество номеров поставщиков из Лондона. Третье выражение соответствует запросу на получение имен поставщиков, производящих все детали.

3.8. Язык запросов по образцу QBE

Хранимые в базе данные можно обрабатывать вручную, последовательно просматривая и редактируя данные в таблицах с помощью имеющихся в СУБД соответствующих средств. Для повышения эффективности применя-

3. Реляционная модель данных

85

ют запросы, позволяющие производить множественную

обработку данных,

то есть одновременно вводить, редактировать и удалять множество записей, а также выбирать данные из таблиц.

Запрос представляет собой специальным образом описанное требование, определяющее состав производимых над БД операций по выборке, удалению или модификации хранимых данных.

Для подготовки запросов с помощью различных СУБД чаще всего используются два основных языка описания запросов:

язык QBE (Query By Example) — язык запросов по образцу;

SQL (Structured Query Language) — структурированный язык запросов. По возможностям манипулирования данными при описании запросов ука-

занные языки практически эквивалентны. Главное отличие между ними, повидимому, заключается в способе формирования запросов: язык QBE предполагает ручное или визуальное формирование запроса, в то время как использование SQL означает программирование запроса.

Характеристика языка QBE

Теоретической основой языка QBE является реляционное исчисление с переменными-доменами. Язык QBE позволяет задавать сложные запросы к БД путем заполнения предлагаемой СУБД запросной формы. Такой способ задания запросов обеспечивает высокую наглядность и не требует указания алгоритма выполнения операции — достаточно описать образец ожидаемого результата. В каждой из современных реляционных СУБД имеется свой вариант языка QBE.

На языке QBE можно задавать запросы однотабличные и многотабличные (выбирающие или обрабатывающие данные из нескольких связанных таблиц).

С помощью запросов на языке QBE можно выполнять следующие основные операции:

выборку данных;

вычисление над данными;

вставку новых записей;

удаление записей;

модификацию (изменение) данных.

Результатом выполнения запроса является новая таблица, называемая ответной (первые две операции), или обновленная исходная таблица (остальные операции).

Выборка, вставка, удаление и модификация могут производиться безусловно или в соответствии с условиями, задаваемыми с помощью логических выражений. Вычисления надданными задаются с помощью арифметических выражений и порождают в ответных таблицах новые поля, называемые

вычисляемыми.

86

Часть 1. Основы построения баз данных

Запросная форма имеет вид таблицы, имя и названия полей которой совпадают с именем и названиями полей соответствующей исходной таблицы. Чтобы узнать имена доступных таблиц БД, в языке QBE предусмотрен запрос на выборку имен таблиц. Названия полей исходной таблицы могут вводиться в шаблон вручную или автоматически. Во втором случае используется запрос на выборку заголовков столбцов.

В современных СУБД, например в Access и Visual FoxPro, многие действия по подготовке запросов с помощью языка QBE выполняются визуально с помощью мыши. В частности, визуальное связывание таблиц при подготовке запроса выполняется не элементами примеров, а просто «протаскиванием» мышыо поля одной таблицы к полю другой.

Первоначальный вариант QBE

В большинстве современных СУБД имеется свой вариант QBE, незначительно отличающийся от первого описания QBE, предложенного Злуффом М.М. в 1975-1977 гг. Рассмотрим основные возможности QBE, опираясь на первоначальный его вариант.

Для иллюстрации средств и возможностей языка QBE используем таблицы БД, которая относится к торговой сфере и используется в фирме, продающей товары нескольких видов. База данных включает четыре следующие таблицы с полями:

ЕМР (служащие): Ф И О — фамилия и инициалы служащего, ЗАРПЛАТА — размер должностного оклада, Р У К О В О Д И Т Е Л Ь — фамилия и инициалы руководителя, ОТДЕЛ — название отдела, в котором работает служащий;

SALES (продажи): ОТДЕЛ — название отдела, ТОВАР — название товара;

SUPPLY (поставщики): ТОВАР — название поставляемого товара, ПОСТАВЩИК — название организации, поставляющей товар;

• TYPE (типы товаров): ТОВАР — название товара, ЦВЕТ — его цвет,

СТ О И М О С Т Ь — стоимость товара.

Втаблицах приведены неполные и упрощенные сведения. Так, в таблице TYPE указаны не все виды товаров, приведенные в таблице SALES.

Для описания переменных в условиях отбора записей, а также для связывания шаблонов в запросах используются элементы примера.

Элемент примера играет роль идентификатора переменной (как в языке программирования) и задается с помощью символьно-цифровой последовательности. Элементы примера в шаблонах выделим подчеркиванием. Вид (длина и состав) элемента примера роли не играют: главное чтобы при использовании в нескольких местах шаблона он был одинаков. Таким образом, как элементы примера, в частности, можно использовать идентификаторы example, х или у.

Для указания системе необходимости включения в ответную таблицу того или иного поля используется «Р.», что означает «напечатать».

3. Реляционная модель данных

87

ЕМР

ФИО

ЗАРПЛАТА

РУКОВОДИТЕЛЬ

 

ОТДЕЛ

 

Киселев В.М.

1800

Белкин Б.Н.

 

хозтовары

 

Гурский С.И.

1600

Томилов А.Н.

 

игрушки

 

Андреева Е.А.

2000

Петров А.С.

 

косметика

 

Левин П.Г.

2200

Петров А.С.

канцтовары

 

Носов А.П.

1600

Томилов А.Н.

 

игрушки

 

Гофман В.Э.

2600

Андреева Е.А.

 

косметика

 

Сорокина Т.В.

1700

Андреева Е.А.

 

косметика

 

Белкин Б.Н.

1800

Петров А.С.

 

хозтовары

 

Семин С.В.

2200

Левин П.Г.

канцтовары

 

Григорьев А.Н.

1900

Томилов А.Н.

 

игрушки

 

Томилов А.Н.

2000

Петров А.С.

 

игрушки

SALES

ОТДЕЛ

ТОВАР

SUPPLY

ТОВАР

 

ПОСТАВЩИК

 

канцтовары

бумага

 

ручка

 

Pencraft

 

хозтовары

мыло

 

бумага

 

Pencraft

 

канцтовары

карандаш

 

мыло

 

Procter & Gamble

 

косметика

помада

 

карандаш

Flic

 

игрушки

самолет

 

чернила

 

Pencraft

 

игрушки

машина

 

духи

 

Beautex

 

игрушки

кукла

 

чернила

 

Flic

 

косметика

духи

 

посуда

 

Cremco

 

канцтовары

чернила

 

помада

 

Beautex

 

хозтовары

посуда

 

самолет

 

Signal

 

канцтовары

ручка

 

машина

 

Signal

 

 

 

 

кукла

 

Signal

 

 

 

 

посуда

 

Flic

 

 

 

 

ручка

 

Beautex

 

 

 

 

карандаш

Pencraft

88

 

 

Часть 1. Основы построения баз данных

TYPE

ТОВАР

ЦВЕТ

СТОИМОСТЬ

 

посуда

белый

30

 

помада

красный

17

 

духи

 

42

 

ручка

зеленый

6

 

карандаш

синий

2

 

чернила

зеленый

4

 

чернила

синий

3

 

карандаш

красный

2

 

карандаш

синий

2

Пример 1. Запрос на выборку.

С учетом изложенного запрос на выборку всех зеленых товаров можно записать в следующем виде:

TYPE

ТОВАР

ЦВЕТ

СТОИМОСТЬ

 

Р. XX

зеленый

 

Словесно запрос можно сформулировать следующим образом: «Вывести все товары XX, цвет которых зеленый». В приведенном шаблоне элемент примера XX не обязателен и его можно опустить. Элементы примера указываются обязательно при записи логических условий, а также при связывании таблиц в запросах.

Пустые колонки из шаблона можно удалять. Пример 2. Удаление колонок.

У нас неиспользуемым столбцом является СТОИМОСТЬ. Исходя их этого, для приведенного шаблона можно записать следующий эквивалентный шаблон:

TYPE ТОВАР ЦВЕТ

Р.зеленый

После заполнения шаблона для получения результата нажимается соответствующая клавиша, например <Enter>, и начинается выполнение запроса. Результатом выполнения приведенного запроса является следующая таблица:

TYPE ТОВАР

ручка

чернила

3. Реляционная модель данных

89

Рассмотрим основные возможности перечисленных выше типов операций,

используемых в запросах.

 

 

 

Выборка

данных

Простая

выборка.

Примером простой выборки является запрос: «Вывес-

ти все возможные цвета товаров из таблицы TYPE».

Пример 3. Простая

выборка.

 

Заполненный шаблон в этом случае будет выглядеть так:

TYPE

ТОВАР

ЦВЕТ

СТОИМОСТЬ

 

 

Р.

 

Ответная таблица имеет единственный столбец ЦВЕТ, содержащий значения: белый, красный, пусто (значение не задано), зеленый и синий. Дублируемые значения при этом пропадают.

Если требуется вывести данные из нескольких полей исходной таблицы, в каждом из соответствующих столбцов шаблона записывается «Р.». Занесение «Р.» во все столбцы шаблона можно заменить записью «Р.» в первом столбце шаблона под именем таблицы.

Простая выборка с упорядочиванием. Для упорядочения выводимых значений по возрастанию и по убыванию используются конструкции «АО.» и «DO.» соответственно. Если требуется выполнить упорядочивание по нескольким столбцам, применяют конструкции вида: «АО(1).», «АО(2).».

Выборка с квалификаторами (условиями). Выбор записей из исходной таблицы в общем случае может быть основан на: точном совпадении, частичном совпадении, сравнении.

1. Точное совпадение задается вводом констант в соответствующих полях шаблона, как в случае запроса по товарам зеленого цвета.

2. Частичное совпадение задается с помощью элементов примера. В частности, для формулировки запроса о выводе всех видов товаров, названия которых начинаются с буквы «и», можно воспользоваться конструкцией «Р.ике», записанной в поле Т О В А Р таблицы TYPE. Здесь: «Р.» задает вывод, «и» — константа, а «ке» — элемент примера, играющий роль переменной.

Используя элементы примера, можно задавать различные варианты частичного совпадения со значениями данных из таблиц: в начале «ике», в конце «ха», в середине «х!ох2» и в произвольном месте.

Поскольку элементу примера сопоставим любой символ, в том числе и пустой (отсутствие символа), то условию частичного совпадения «х!ох2» удовлетворяют слова, не только имеющие символ «о» в середине, но начинающиеся и заканчивающиеся на «о».

90 Часть 1. Основы построения баз данных

Пример 4. Частичное совпадение.

Шаблон запроса с выбором товаров синего цвета, в середине названий которых имеется буква «р», выглядит так:

TYPE

ТОВАР

ЦВЕТ

СТОИМОСТЬ

 

Р.хру

синий

 

Результат в этом случае будет следующий:

TYPE

ТОВАР

 

карандаш

 

чернила

3. Условие сравнения записывается с помощью операций сравнения: равно (=), больше (>), меньше (<), больше или равно (>=), меньше или равно (<=), не равно (—1= или просто —•), не больше (—•>), не меньше (—•<).

Пример 5. Условия сравнения.

Запрос имен сотрудников, работающих в отделе игрушек и получающих зарплату больше 1800, выглядит так:

ЕМР

ФИО

ЗАРПЛАТА РУКОВОДИТЕЛЬ

ОТДЕЛ

 

Р.

>1800

игрушки

Результатом запроса является таблица вида:

ЕМР ФИО

Григорьев А.Н.

Томилов А.Н.

В операциях сравнения можно использовать и элементы примера. Пример 6. Сравнения с элементами примера.

Ниже приведен вид шаблона запроса выборки имен и зарплат сотрудников, получающих больше, чем Левин П.Г. По-другому запрос можно сформулировать так: «Пусть Левин П.Г. получает зарплату в количестве s. Найти всех сотрудников, получающих больше, чем s, и вывести их зарплаты». Порядок строк в шаблоне несущественен.

ЕМР

ФИО

ЗАРПЛАТА

Р.R> s

Левин П.Г.

s

3. Реляционная модель данных

91

Сотрудников, получающих больше Левина П.Г., в таблице ЕМР не оказалось (вероятно, таковым является Петров А.С., но из таблицы ЕМР нам этого не узнать). В подобных случаях результирующая таблица оказывается пустой:

ЕМР ФИО ЗАРПЛАТА

Условия в запросе могут задаваться по одному или по нескольким столбцам. При этом происходит объединение отдельных условий по схеме логического И (AND).

Пример 7. Объединение условий.

Для формулировки запроса выборки имен и зарплат служащих, получающих больше Левина П.Г. и работающих в отделе игрушек, достаточно в предыдущую запросную форму в первую строку столбца ОТДЕЛ вставить слово «игрушки».

Запрос вида: «Найти имена и зарплаты служащих, получающих больше, чем Белкин Б.Н., и работающих в отделе, продающем ручки», выглядит следующим образом:

ЕМР

ФИО

ЗАРПЛАТА

РУКОВОДИТЕЛЬ

ОТДЕЛ

 

Р.

R> s

 

department

 

Белкин Б.Н.

s

 

 

SALES

ОТДЕЛ

ТОВАР

 

 

 

department

ручка

 

 

Результатом выполнения этого запроса будет таблица вида:

ЕМР

ФИО

ЗАРПЛАТА

 

Левин П.Г.

2200

 

Семин С.В.

2200

Здесь элемент примера department связывает две исходные таблицы по полю ОТДЕЛ, а элемент примера s используется для связи условий выбора в рамках одной исходной таблицы ЕМР.

Пример 8. Запрос, в шаблоне которого имеются две связи.

Пусть необходимо найти всех служащих, получающих больше своих руководителей. Этот запрос с помощью элементов примеров можно сформулировать так: «Вывести всех служащих, чьи руководители являются head и кто

92

Часть 1. Основы построения баз данных

получает больше, чем s, где s — зарплата head». Шаблон соответствующего запроса имеет следующий вид:

ЕМР

ФИО

ЗАРПЛАТА

РУКОВОДИТЕЛЬ

ОТДЕЛ

 

Р.

> s

head

 

 

head

s

 

 

Здесь элемент head используется для связи руководителя в первой строке шаблона и имени из второй строки, а элементу применяется для сравнения зарплат.

Для нашего примера результирующая таблица окажется такой:

ЕМР ФИО

Гофман В.Э.

В качестве условия выбора записей из таблиц можно использовать операцию отрицания.

Пример 9. Отбор с операцией отрицания.

Пусть необходимо вывести все отделы, продающие товары, не поставляемые компанией Pencraft. Этот запрос можно перефразировать: «Вывести названия отделов, продающих товары t, такие, что компания Pencraft не поставляет товары t».

SALES

ОТДЕЛ

ТОВАР

Р.t

SUPPLY

ТОВАР

ПОСТАВЩИК

 

-л t

Pencraft

Ответная таблица для сформулированного запроса имеет вид:

SALES ОТДЕЛ

хозтовары

косметика

игрушки

В случаях, когда условия отбора записей для выборки представляют большие выражения, которые неудобно или трудно задать в шаблоне, можно использовать блок условий. Он по виду напоминает пустой шаблон с одним полем и именем CONDITIONS. Блок условий предназначен для записи логических выражений.

Записанные в одном шаблоне логические выражения, в общем случае, могут включать в себя операции логического умножения (операция AND) и логического сложения (операция OR).