<< Пред. стр. 3 (из 8) След. >>
Рис. 6. Схема операций реляционной алгебры
Основная идея реляционной алгебры состоит в том, что средства манипулирования отношениями, рассматриваемыми как множества, основаны на традиционных множественных операциях, дополненных некоторыми специфическими операциями для БД.
Существует много подходов к определению реляционной алгебры, которые различаются набором операций и способами их интерпретации, но в принципе все они более или менее равносильны. Опишем вариант алгебры, предложенный Коддом. В этом варианте набор алгебраических операций состоит из восьми основных.
Проекция отношения – при осуществлении проекции отношения на заданный набор его атрибутов будет получено отношение, кортежи которого взяты из соответствующих кортежей первоначального отношения. Алгебраическая запись проекции имеет вид:
Т = R[X],
где R – исходное отношение,
T – результирующее отношение,
X – список атрибутов в структуре отношения Т (условие проекции).
Пример
Рассмотрим два отношения:
Т1, содержащее сведения о заявке на изделия и Т2, в котором указаны цены на изделия и комплектующие.
Т1
Отправитель Получатель Адрес получателя Изделие Количество на месяц
Прибор Полет Русская, 86 ХТ - 12 1000
Дальтехника Скала Луговая,91 АМ - 18 350
Прибор Сокол Карбышева, 86 ХТ - 12 800
Звезда Луч Калинина,80 ЛН - 15 500
Т2
Изделие Цена Комплектующие
ХТ - 12 100 АСК
АМ - 18 150 ТРН
ЛН - 15 130 НЕК
Если требуется отношение Х1, содержащее сведения только о получателе, то оно образуется в результате выполнения проекции
Х1 = Т1[Получатель, адрес получателя]
и имеет вид
Х1
Получатель Адрес получателя
Полет Русская, 86
Скала Луговая,52
Сокол Карбышева, 16
Луч Калинина, 80
Выборка отношения – результатом выборки отношения по некоторому условию является отношение, которое включает только те кортежи первоначального отношения, которые удовлетворяют этому условию. Существуют две простейшие разновидности условия выборки:
Условие вида Имя_атрибута <знак сравнения > Значение, где допускаются знаки сравнения =, #, >, =>, <, <=. Например, Количество < 20.
Условие вида Имя_атрибута 1<знак сравнения > Имя атрибута 2. Например, Факт > План.
Алгебраическая запись выборки имеет вид
T = R[p],
где R – исходное отношение,
T – результирующее отношение,
р – условие выборки.
Например, X2 = T1[Количество в месяц > 800].
Х2
Отправитель Получатель Адрес получателя Изделие Количество на месяц
Прибор Полет Русская, 86 ХТ - 12 1000
Прибор Сокол Карбышева, 86 ХТ - 12 800
При выполнении операции объединения двух отношений будет получено отношение, включающее все кортежи, входящие в участвующие в операции отношения.
Х3 = U(R1, R2).
В качестве результата операции пересечения двух отношений получается отношение, включающее все кортежи, входящие в оба первоначальные отношения,
Х4 = I(R1, R2).
Отношение, являющееся разностью двух отношений, включает все кортежи, входящие в первое отношение и одновременно такие, что ни один из них не входит в отношение являющееся вторым,
Х5 = M(R1, R2).
При соединении двух отношений по некоторому условию образуется результирующее отношение, кортежи которого являются сочетанием кортежей первого и второго отношений, удовлетворяющим этому условию. Условие соединения имеет вид:
Имя_ атрибута_1 <знак сравнения > Имя_атрибута_2,
где Имя_ атрибута_1 находится в одном исходном отношении, Имя_ атрибута_2 в другом.
Операция имеет следующее обозначение
Х6 = R1[p]R2,
где p – условие соединения.
Наиболее важный частный случай соединения называется натуральным соединение и имеет следующие особенности:
знаком сравнения в условии соединения является =;
Имя_ атрибута_1 и Имя_атрибута_2 должны совпадать, а точнее содержать пересечение списков атрибутов исходных отношений;
список атрибутов результирующего отношения образуется в результате объединения списков атрибутов исходных отношений.
Обозначение натурального соединения не содержит условия соединения и имеет вид
Х7 = R1*R2.
Операция натурального соединения имеет ряд свойств, например коммутативность и ассоциативность.
Свойство коммутативности означает, что операции
X8 = R*S и X9 = S*R
порождают одно и то же отношение.
Свойство ассоциативности означает, что операция X10 = (R*S)*Т и операция X11 = R*(S*Т) дают одинаковый результат.
Описание операции деления начнем с примера.
Пусть существует отношение Х12, в котором для каждого специалиста указано программное средство, которым он владеет. Определить специалистов, которые владеют MS Excel и Project-Expert.
Х12
ФИО Программное средство
Иванов MS Excel
Иванов Project-Expert
Петров MS Word
Петров MS Excel
Петров MS Access
Сидоров MS Word
Сидоров MS Excel
Сидоров Project-Expert
Определим операцию, называемую «образ». В отношении Т(А, В) образом значения а атрибута А является множество значений атрибута В, и каждый элемент b этого множества образует вместе с а некоторую строку (или часть строки) отношения Т.
im B(a) = {b1, b2, …, bk},
где im – знак операции «образ»,
а – значение, образ которого вычисляется,
B – имя атрибута для образа значения а
b1, b2, …, bk – значения атрибута В.
Задача решается путем вычисления образа значений MS Excel и Project-Expert и последующего пересечения найденных образов.
im ФИО(«MS Excel») = {«Иванов», «Петров», «Сидоров»}
im ФИО(«Project-Expert») = {«Иванов», «Сидоров»}
im ФИО(«MS Excel») ? im ФИО(«Project-Expert») = {«Иванов», «Сидоров»}
Таким образом, выполнена операция деления исходного отношения на отношение, которое имеет вид:
Х13
MS Excel
Project-Expert
Результат деления содержит следующие значения:
Х14
Иванов
Сидоров
Операция деления имеет вид:
Q = D(W, V), где
D – знак операции деления.
§ 2.1.3. Операции над отношениями с применением
конструкций языка SQL
Structured Query Language – язык структурированных запросов – используется при:
формировании запросов к реляционным базам данных, таким как MS Access;
обновлении реляционных баз данных;
управлении реляционными базами данных.
Результаты выполнения запросов можно обрабатывать с помощью специальных групповых функций, таких как максимум, минимум, среднее значение и т.д.
Список операторов, предикатов и директив
с соответствующими параметрами
Ключевое слово Перевод
Select <список полей> Выбрать
From <имена таблиц> Из
Where условие поиска При
In <имя внешней базы данных> В
Inner join Объединяя
Group by <список полей> Группируя по
Having <условие поиска> Имеющие
Order by <список полей> Упорядочивая по
As <псевдонимы> Как
All, distinct Все, различные
Distinctrow, top Различные ряды, первые
При составлении запросов необходимо руководствоваться следующими правилами:
составляющие один запрос директивы не должны быть разделены символами «конец строки». Для принудительного перехода можно использовать комбинацию клавиш Ctrl+Enter;
обязательными компонентами запроса являются Select и From;
Select является первым в определении запроса;
при указании более, чем одного поля , их имена отделяются запятыми;
перечислять имена полей необходимо в той последовательности, в которой они будут показаны в запросе;
если имя поля содержит знак пробела или другой разделитель, имя следует заключить в квадратные скобки;
если в запросе обрабатывается несколько таблиц, то во избежание неопределенности в списках полей рекомендуется приводить полную спецификацию поля, т.е. <имя_таблицы>, <имя_поля>;
каждый запрос заканчивается ;
Оператор SELECT
SELECT Клиенты.Фирма
FROM Клиенты, [Заинтересованные лица]
WHERE Клиенты.Фирма = [Заинтересованные лица].Фирма;
Выборка будет содержать все фирмы, которые присутствуют как в таблице «Заинтересованные лица», так и в таблице «Клиенты».
Директива FROM
SELECT Клиенты.*
FROM Клиенты;
С помощью * из таблицы можно выбрать все поля.
Директива WHERE
Является необязательной, но если присутствует, то должна следовать за директивой FROM. Access выберет записи данных, которые соответствуют определенным в WHERE условиям отбора.
Если WHERE отсутствует, то будут выбраны все записи данных.
Параметр IN
Данный параметр используется при работе с базами данных других форматов, с которыми может работать Access, а так же для отбора данных из неактивной базы Access.
SELECT Клиенты.Фирма
FROM Клиенты, [Заинтересованные лица]
IN C:\DBASE\DATA\CLEENTS «DBASEIV;»
WHERE Клиенты.Фирма = [Заинтересованные лица].Фирма;
С помощью данного параметра можно сформировать только одну связь к внешней БД. Для указания формата этой БД необходимо после формата поставить ; и все выражение взять в кавычки.
Предикаты
1. ALL
SELECT ALL Фамилия, Имя, Отчество
FROM Клиенты;
Access выберет перечисленные поля из всех записей данных в таблице Клиенты. Предикат представляет собой дополнительный фильтр. Если предикаты не используются, то по умолчанию считается, что применен предикат ALL. Следующие два примера позволяют выполнить одинаковые выборки.
SELECT ALL *
FROM Клиенты;
SELECT *
FROM Клиенты;
2. DISTINCT
SELECT DISTINCT Клиенты.Фирма
FROM Клиенты, Заинтересованные лица
WHERE Клиенты.Фирма = Заинтересованные лица.Фирма;
Директива WHERE задает условия отбора, в соответствии с которыми в выборку включаются те фирмы, которые присутствуют как в таблице Клиенты, так и в таблице Заинтересованные лица.
Предикат DISTINCT используется в том случае, если нужно включить в выборку только уникальные значения для выбираемых полей. Предикат DISTINCT приводит к отбрасыванию дублируемых значений поля «Фирма».
DISTINCTROW
SELECT DISTINCTROW [Название фирмы]
FROM Клиенты INNER JOIN Заказы
ON Клиенты.[Код клиента] = Заказы.[Код клиента]
ORDER BY [Название фирмы];
Предикат DISTINCTROW используется, когда следует пропустить данные, представляющие собой полностью дублирующие записи в выборке, но не дублирование значений отдельных полей. Приведен пример запроса для составления списка фирм, которые сделали хотя бы один заказ.
Предикат TOP
Используется для включения в выборку определенного числа записей, расположенных в начале или в конце группы записей, отобранных с помощью критерия отбора WHERE, упорядоченных с помощью директивы ORDER BY.
Предположим, что нужно отобрать 25 лучших студентов выпуска 2001 года:
SELECT TOP 25[Фамилия], [Имя], [Отчество]
FROM Студенты
WHERE [Год выпуска] = 2001
ODER BY [Средний балл] DESC;
Можно использовать ключевое слово для того, чтобы включить в выборку определенный процент из верхней или нижней части диапазона, отсортированного с помощью директивы ORDER BY.
SELECT TOP 10 PERCENT [Фамилия], [Имя], [Отчество]
FROM Студенты
WHERE [Год выпуска] = 2001
ORDER BY [Средний балл] DESC;
Используемое число в предикате TOP должно быть целым без знака.
Операция объединения INNER JOIN
Операция формирует связь эквивалентности, являясь частью параметра FROM Такая связь является наиболее употребительным типом объединения. Объединение производится при условии равенства содержимого полей, приведенных после ключевого слова ON в записях таблиц, указанных в операции INNER JOIN. Записи их двух таблиц объединяются при обнаружении совпадающих значений в указанных полях. Такое объединение записей используется наиболее часто.
ТАБЛИЦА 1 INNER JOIN ТАБЛИЦА 2
ON ТАБЛИЦА 1.Поле А = ТАБЛИЦА 2.Поле В
В данном случае устанавливается связь между ТАБЛИЦА 1 и ТАБЛИЦА 2. В выходной набор будут включены записи из этих таблиц при условии равенства содержимого: ТАБЛИЦА 1.Поле А = ТАБЛИЦА 2.Поле В.
В операции могут участвовать два числовых поля любого типа или , если поля не числовые, поля одинакового типа и размера.
Директива GROUP BY
При использовании директивы GROUP BY все записи, содержащие в заданном поле идентичные значения, объединяются в один элемент выходного набора. В нашем примере повторяющиеся имена фирм будут включены в выходной набор только один раз. Используя параметр GROUP BY, необходимо учитывать, что этот параметр не является обязательным, а является уточняющим при использовании параметра FROM и WHERE.
SELECT [Название товара], Sum([Стоимость товара])
FROM Товары
GROUP BY [Название товара];
Директива HAVIHG
Эта директива используется для фильтрации записей после группирования только в случае использования в запросе директивы GROUP BY.
Отличие WHERE и HAVING
Директива WHERE определяет, какие записи данных должны участвовать в группировании, т. е. фильтрует записи до группировки. HAVING oпределяет, какие из получившихся в результате группировки записи будут включены в результирующую выборку, т. е. фильтрует записи после группирования.
SELECT Отдел, Count([Отдел])
FROM Сотрудники
GROUP BYОтдел
HAVING Count(Отдел)>50;
В выборку будут включены отделы, в которых число сотрудников более 50 человек.
Директива ORDER BY
Директива определяет список полей и порядок сортировки записей данных, включенных в выборку. Директива является обязательной только при использовании предиката TOP. В других случаях необязательна. По умолчанию используется сортировка по возрастанию. Этому порядку сортировки соответствует ключевое слово ASC. Ключевое слово DESC задает сортировку по убыванию.
ORDER BY Является последней директивой в запросе.
Порядок перечисления полей задает иерархию сортировки. Прежде всего записи в выборке сортируются по первому указанному в ORDER BY полю, затем записи с совпадающими значениями первого поля сортируются по второму по второму и т. д.
Групповые функции
С помощью групповых функций можно получить ряд обобщающей статистической информации. К групповым функциям относятся следующие функции:
Обозначение Функция Назначение
Sum Сумма Вычисляет сумму сгруппированных значений
Avg Среднее Вычисляет среднее значение сгруппированных значений
Min Минимум Находит наименьшее из сгруппированных значений
Max Максимум Находит наибольшее из сгруппированных значений
Count Счетчик Находит количество сгруппированных записей