
- •Уровни представления данных в бд
- •Языки баз данных
- •Логическая структура данных
- •Операции над данными
- •10. Иерархическая модель данных
- •Реляционная модель данных
- •Основные понятия реляционной модели данных
- •Таким образом, отношение - это совокупность кортежей, т.Е. Таблица со всеми своими строками.
- •Ключи отношений
- •Поставщик изделие
- •Первичный ключ никогда не должен принимать нулевого значения, а в составном ключе ни одна из компонент никогда не должна быть нулевой.
- •Контроль ссылочной целостности
- •Нормализация отношений реляционной бд
- •Первая нормальная форма
- •Поставки1 поставки
- •Поставщик1 поставки
- •Операции над отношениями
- •Теоретико-множественные операции
- •Запрос 4
- •Язык sql - общие сведения
- •Язык запросов qbe
- •Запрос 1
- •Запрос 2
Запрос 4
Какие поставщики и по какому тарифу поставляют изделие И2?
Известное данное (номер изделия П2) находится в таблице ПОСТАВКИ, а искомые данные (имя поставщика и тариф) - в таблицах ПОСТАВЩИК и ДОСТАВКА. Поэтому для выработки ответа на запрос необходимо связать данные из трех таблиц.
Из отношения ПОСТАВКИ с помощью операции сцепления отношения с одноэлементным множеством {И2} выделим кортежи, содержащие номера поставщиков, поставляющих изделие И2. Затем выполним сцепление полученного отношения с отношением ПОСТАВЩИК по атрибуту П#. Получим отношение, содержащее атрибут с названиями городов, из которых доставляются изделия И2. Операция сцепления полученного отношения с отношением ДОСТАВКА по атрибуту Город сформирует отношение, содержащее атрибуты с искомыми данными. Наконец, выполнив проекцию этого отношения на атрибуты Имя поставщика и Тариф, выделим искомые данные.
Запишем формулу запроса.
1 2 3 4
ПОСТАВКИ * {И2} * ПОСТАВЩИК * ДОСТАВКА [Имя поставщика, Тариф]
Определим результаты выполнения каждой операции (все операции в формуле и получаемые результаты пронумерованы).
1. 2.
П1 |
И2 |
200 |
|
П1 |
И2 |
200 |
Восход |
Тула |
П2 |
И2 |
500 |
П2 |
И2 |
500 |
Заря |
Самара |
3. 4.
П1 |
И2 |
200 |
Восход |
Тула |
10 |
|
Восход |
10 |
П2 |
И2 |
500 |
Заря |
Самара |
15 |
Заря |
15 |
Можно заметить, что в результате последовательного выполнения нескольких операций сцепления арность отношений растет, т.е. в таблицах увеличивается количество столбцов. Рост объемов промежуточных результатов при выполнении такого запроса на ЭВМ может привести к увеличению времени выполнения каждой следующей операции, и общее время выполнения запроса может оказаться недопустимо большим.
Рассмотрим другой вариант формулы запроса. Для уменьшения объемов промежуточных таблиц используем дополнительные операции проекции. Это позволит на каждом этапе отсекать ненужные столбцы и оставлять лишь те столбцы, которые необходимы для выполнения последующей операции сцепления или для вывода искомых данных.
1 2 3 4 5
ПОСТАВКИ * {И2} [П#] * ПОСТАВЩИК [Имя поставщика, Город] *
5 6
*ДОСТАВКА [Имя поставщика, Тариф]
Результаты выполнения операций:
1. 2. 3. 4.
П1 |
И2 |
200 |
|
П1 |
|
П1 |
Восход |
Тула |
|
Восход |
Тула |
П2 |
И2 |
500 |
П2 |
П2 |
Заря |
Самара |
Заря |
Самара |
5. 6.
Восход |
Тула |
10 |
|
Восход |
10 |
Заря |
Самара |
15 |
Заря |
15 |
Используя булевы операторы, можно строить формулы для более сложных запросов. С помощью теоретико-множественных операций объединения и вычитания множеств, можно записывать формулы для запросов на добавление и удаление кортежей отношений.
Языки реляционных БД
Язык, основанный на реляционной алгебре
Язык данных, основанный на реляционной алгебре, был предложен Коддом. Это теоретический язык, позволяющий манипулировать данными в реляционных БД. Этот язык в полном объеме пока не реализован в СУБД. Однако большая часть операций языка так или иначе реализована в современных коммерческих СУБД.
Язык содержит девять операторов. Это операторы для выполнения операций теории множеств над отношениями: объединение, пересечение, произведение, разность отношений, а также операторы для выполнения операций, применимых только к отношениям. К числу последних относятся операция сцепления отношения с множеством (ее еще называют выборкой), операция сцепление двух отношений (или соединение) и операция проекции отношения на его компоненту. При рассмотрении предыдущего параграфа мы могли убедиться в том, что трех последних операций оказывается достаточно для составления разнообразных запросов к БД, связанных с поиском нужных сведений.
Рассмотрим операторы языка, предложенного Коддом.
UNION – объединение. Выполняет операцию объединения отношений.
INTERSECTION – пересечение. Выполняет операцию пересечения отношений.
DIFFERENCE (MINUS) – вычитание. Выполняет операцию вычитания отношений.
SELECT – выборка. Выполняет операцию сцепления отношения с множеством.
JOIN – соединить. Выполняет операцию сцепления двух отношений.
PROJECT – спроектировать. Выполняет операцию проекции отношения на его компоненты.
INSERT – включить. Выполняет операцию добавления кортежей в отношение.
DELETE – удалить. Выполняет операцию удаления кортежей из отношения.
UPDATE – обновить. Выполняет операцию изменения значений атрибутов отношения.
При составлении запросов используются , в основном, три операции: SELECT, JOIN и PROJECT.
Конструкция предложения SELECT такова:
SELECT <имя таблицы> WHERE <условие> GIVING TEMP
(выбрать, где, сформировать таблицу, содержащую результат).
Конструкция предложения JOIN:
JOIN <имя таблицы> AND <имя таблицы> OVER <имя атрибута, по которому выполняется сцепление> GIVING TEMP
(соединить, и, по, сформировать таблицу, содержащую результат).
Конструкция предложения PROJECT:
PROJECT <имя таблицы> OVER <имена атрибутов> GIVING TEMP
(спроектировать, на, сформировать таблицу, содержащую результат).
Предложения языка записываются в том порядке, в котором должны выполняться операции запроса. Сформированная каждым из предложений таблица (TEMP) является исходной для выполнения следующего предложения. Таблица, сформированная последним предложением запроса, содержит окончательный результат выполнения запроса (RESULT).
Составленные ранее запросы запишем с помощью этих операторов. Предложения запросов следуют в том же порядке, в котором следуют операции в записанных ранее формулах запросов.
Запрос 1
Сообщить название фирмы-поставщика П1
SELECT ПОСТАВЩИК WHERE П# = 'П1' GIVING TEMP1
PROJECT TEMP1 OVER Имя поставщика GIVING RESULT
Первое предложение формирует промежуточную таблицу TEMP1, второе предложение формирует результирующую таблицу RESULT. Результаты выполнения каждого предложения в точности соответствуют результатам выполнения операций, рассмотренным в предыдущем параграфе.
Запрос 2
В каком количестве поставляются изделия И2?
SELECT ПОСТАВКИ WHERE И# = 'И2' GIVING TEMP1
PROJECT TEMP1 OVER Кол GIVING RESULT
Запрос 3
Сколько изделий И2 поставляет фирма Заря?
SELECT ПОСТАВЩИК WHERE Имя поставщика = 'Заря' GIVING TEMP1
JOIN TEMP1 AND ПОСТАВКИ OVER П# GIVING TEMP2
SELECT TEMP2 WHERE И# = 'И2' GIVING TEMP3
PROJECT TEMP3 OVER Кол GIVING RESULT
Запрос 4
Какие поставщики и по какому тарифу поставляют изделия И2?
SELECT ПОСТАВКИ И# = 'И2' GIVING TEMP1
JOIN TEMP1 AND ПОСТАВЩИК OVER П# GIVING TEMP2
JOIN TEMP2 AND ДОСТАВКА OVER Город GIVING TEMP3
PROJECT TEMP3 OVER Имя поставщика, Тариф GIVING RESULT
В языках данных СУБД команды GIVING TEMP и GIVING RESULT не используются. Конец формулы запроса обозначается точкой или точкой с запятой. Кроме того, в современных СУБД принят несколько иной синтаксис формул запросов.
Рассмотрим примеры записи запросов на выполнение операций ведения БД.
Запрос 5
Добавить в отношение ПОСТАВЩИК кортеж {П4, Победа, Пенза}
ПОСТАВЩИК UNION {П4, Победа, Пенза} GIVING ПОСТАВЩИК
Запрос 6
Удалить из отношения сведения о поставках изделия И2.
ПОСТАВКИ MINUS {*, И2, *}
Удалить кортежи отношения можно также с помощью оператора DELETE.
DELETE ПОСТАВКИ WHERE И#=И2
Рассмотренный язык (язык SQL) обладает следующей особенностью: это процедурный язык обработки реляционных таблиц. Это означает, что в формуле запроса последовательно перечисляются все операции, которые надо выполнить над отношениями для выработки ответа. Пользователь, работающий с таким языком, должен иметь определенный уровень подготовки. Кроме того, один и тот же результат можно получить, составляя разные варианты запроса. При этом скорость выполнения запроса и необходимые объемы памяти для хранения промежуточных результатов зависят от того, как именно составлена формула: "лучшим" или "не лучшим" способом. И здесь существенное значение имеет уровень подготовки пользователя, его опыт и навыки. Кроме того, в языке слабо представлены средства арифметической обработки данных. Предусмотрен лишь оператор суммирования данных по столбцам SUMMARIZE.
Замечательным достоинством этого языка является его реляционная полнота. Это означает, что язык позволяет составить любые запросы на манипулирование данными в БД.
Желание освободиться от процедурности языка, которую принято считать его недостатком, привело к созданию непроцедурных коммерческих языков реляционных БД, использующих несколько иной принцип составления запросов. Непроцедурные языки (язык QBE) позволяют в запросе сформулировать, что нужно получить, а не как этого добиться.
Тремя наиболее важными реляционными языками БД являются: SQL - Structured Query Language (структурированный язык запросов), QBE - Query By Example (запрос по образцу) и QUEL - Query Language (язык запросов). Наибольшее распространение получили первые два.