Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Базы данных. Лекции по курсу. В 4 частях. Ч.1. Учебное пособие
.pdf
Приведем примеры записи средствами языка реляционного исчисления с переменными-кортежами формул, соответствующих операциям реляционной алгебры.
операция объединения R S {t | R(t) S(t)};
операция разности R – S {t | R(t) S(t)};
операция декартова произведения T = R S
t | (u, w) (R(u) S(w) t = u w)};
{
операция проекции
(k)
{
t
| (u) (R(u) ((t[1] = u(i1))…. (t[k] = u(ik))}.
i, i2,…i
(R)
k
Подобным образом можно записать формулы и для остальных операций реляционной алгебры.
Вернемся к исходной задаче «Получить имена и табельные номера
сотрудников, являющихся начальниками отделов с количеством сотрудников больше пятидесяти». Для краткости введем обозначения:
Сотрудники (Таб_номер, Сотр_имя, Сотр_зарпл, Отдел_ном) – R(u);
Отделы (Отдел_ном, Отдел_нач, Кол_во) – S(w).
Тогда формулу на языке реляционного исчисления с переменнымикортежами, дающую решение задачи, можно записать следующим образом:
(2)
{
r
| (u, w) (R(u) S(w) (u[4] = w[1]) (w[3] > 50)
r[1] = u[1]) (r[2] = w[2])}.
(
В более прагматическом и не столь теоретическом варианте используется несколько другая запись, более близкая к языку SQL (язык
SQL построен на языке реляционного исчисления).
1. Вместо номера компонента в кортежной переменной
зуется выражение
2. Кванторы и заменяются фразами
S.[имя_атрибута].
FORALL и EXISTS.
S[i] исполь-
3. Общий вид формулы реляционного исчисления имеет вид
[список переменных-кортежей]
WHERE [формула реляционного
исчисления]
21

4. Перечень переменных-кортежей вводится фразой
[список переменных-кортежей]
RANGE IS [имя отношения]
Ниже приведена запись на языке реляционного исчисления в данном диалекте для задачи «Получить имена и табельные номера сотрудников, являющихся начальниками отделов с количеством сотрудников
больше пятидесяти».
Сотрудник RANGE IS Сотрудники
Отдел RANGE IS Отделы
Сотрудник.Сотр_имя, Сотрудник.Таб_номер
WHERE EXISTS
AND Отдел.Отдел_Кол > 50
(Сотрудник.Сотр_имя = Отдел.Отдел_нач
)
Как можно видеть, приведенная запись достаточно близка к записи
на языке SQL.
Ниже приведен один пример
ного исчисления с переменными-кортежами
ЩИЕ, ПРОЕКТЫ, НОМЕРА_ПРОЕКТОВ
записи формулы на языке реляцион-
для отношений СЛУЖА-
.
СЛУ1, СЛУ2 RANGE IS СЛУЖАЩИЕ
НОМЕР_ПРОЕКТА RANGE IS НОМЕРА_ПРОЕКТОВ
СЛУ1.СЛУ_НОМЕР, СЛУ1.СЛУ_ИМЯ, СЛУ1.СЛУ_ЗАРП
WHERE FORALL НОМЕР_ПРОЕКТА EXISTS СЛУ2
СЛУ1.ПРО_НОМ = НОМЕРА_ПРОЕКТОВ.ПРО_НОМ
(СЛУ1.СЛУ_НОМЕР = СЛУ2.СЛУ_НОМЕР AND
)
Выражение генерирует следующий результат:
СЛУ_НОМЕР СЛУ_ИМЯ СЛУ_ЗАРП
2934 Иванов 22 400
2935 Петров 29 600
22

Записанная формула является эквивалентом операции реляционной
алгебры
DIVIDE.
СЛУЖАЩИЕ DIVIDE BY НОМЕРА_ПРОЕКТОВ.
Ниже приведены формулы на языке реляционного исчисления
с переменными-кортежами для учебной базы данных поставщиков,
деталей, поставок, являющиеся решениями указанных хадач.
Учебная база данных поставщиков, деталей, поставок:
Create table S (n_post char(5) not NULL, name char(20), reiting
smallint, town char
(15));
Create table P (n_det char
smallint, town char
(15));
(6), name char(20), cvet char(7), ves
Create table SPJ (n_post char(5), n_det char(6), kol smallint).
Переменные на кортежах: SX, SY RANGE IS S
SPX, SPY RANGE IS SP
PX RANGE IS P
1. Определить номера поставщиков из Парижа со статусом, боль-
шим 20:
(SX.n_post, SX.reiting) WHERE (SX.town =’Париж’ AND SX.reiting > 20).
2. Найти все пары номеров поставщиков, в которых два поставщи-
ка находятся в одном городе:
SX.n_post, SY.n_post) WHERE (SX.town = SY.town
(
AND SX.n_post < SY.n_post).
3. Определить поставщиков детали с номером 'Р2'
SX .n_post, SX.name, SX.reiting, SX.town)
(
WHERE EXISTS SPX (SPX.n_post = SX.n_post AND SPX.n_det = ‘P2’).
Сокращенная запись того же запроса выглядит следующим образом:
SX WHERE EXISTS SPX (SPX.n_post = SX.n_post AND SPX.n_det = ‘P2’).
23

4. Определить имена поставщиков хотя бы одной красной детали:
SX.name WHERE EXISTS SPX ( SX.n_post = SPX.n_post AND
EXISTS PX (PX.n_det = SPX.n_det AND PX.cvet = 'Красный')).
Тот же запрос можно записать и в несколько ином виде:
SX.name WHERE EXISTS SPX (EXISTS PX (SX.n_post = SPX.n_post AND
SPX.n_det = PX.n_det AND PX.cvet = 'Красный')).
1.2.2. РЕЛЯЦИОННОЕ ИСЧИСЛЕНИЕ
С ПЕРЕМЕННЫМИ-ДОМЕНАМИ
В реляционном исчислении с переменными-доменами областью
определения переменных являются не отношения, а домены.
Общая форма записи формулы: {x1, x2, . . . xk, | (x1, x2, . . . xk)}.
В правой части формулы записан предикат (формула), обладающий
тем свойством, что
x
, x2, . . . xk – переменные на доменах. Ниже приве-
1
дены переменные на доменах для учебной базы данных поставщиков,
деталей, поставок.
Домен Переменная домена x1, x2, . . . xk
n_post SX, SY – переменные на одном домене
n_det PX, PY
name NAMEX, NAMEY
cvet CVETX, CVETY
reiting REITINGX, REITINGY
town TOWNX, TOWNY
Виды атомов, из которых строятся предикаты:
1.
R(x
, x2, . . . xk), где R – k-арное отношение, xi – константа или пе-
1
ременная на некотором домене;
ния
x
, должны быть выбраны таким образом, чтобы (x1, x2, . . . xk) было
i
кортежем отношения
2.
x y, где x, y – переменные или константы на домене.
R.
R(x
, x2, … xk) указывает, что значе-
1
24

Например, формула {x1, x2 | R1(x1, x2) (y) ( R2(x1, y) R2(x2, y))}
представляет собой множество кортежей в
R
таких, что ни один из их
1
компонентов не является первым компонентом какого-либо кортежа
отношения
R
.
2
Теорема 2. Для любого безопасного выражения реляционного ис-
числения с переменными-кортежами существует эквивалентная безопасная формула реляционного исчисления с переменными-доменами.
Теорема 3. Для любой безопасной формулы реляционного исчис-
ления с переменными-доменами существует эквивалентное выражение
реляционной алгебры.
Ниже приведена формула реляционного исчисления с переменными-доменами в классическом виде, дающая решение задачи «Найти
имена менеджеров, зарплата которых превышает 25 000 единиц».
{
fname, lname | position, salary
(
Staff(lname, position, salary) position = ’Manager’ salary >25 000)}.
Ниже приведены примеры формул исчисления с переменнымидоменами в более прагматической форме записи языка для учебной
базы данных поставщиков, деталей, поставок:
SX – множество всех номеров поставщиков;
SX WHERE S(n_post:SX) – множество всех номеров поставщиков
в отношении
S;
SX WHERE S(n_post:SX, town:’Лондон’) – множество номеров по-
ставщиков из Лондона;
SX WHERE EXISTS REITINGX
(S (n_post:SX, reiting:REITINGX, CITY:'Париж' ) AND REITINGX > 20) –
номера поставщиков из Парижа с рейтингом, большим 20;
NAMEX WHERE EXISTS SX EXISTS PX (S(n_post:SX, name:NAMEX)
AND SP(n_post:SX, n_det:PX ) AND P(n_det:PX, cvet:'Красный'))
– имена поставщиков хотя бы одной красной детали.
25

ВОПРОСЫ
1. В чем принципиальное различие между языками реляционной
алгебры и реляционного исчисления?
2. В чем проявляется замкнутость языков реляционной алгебры и
реляционного исчисления относительно понятия отношения?
3. В чем проявляется эквивалентность языков реляционной алгебры
и реляционного исчисления относительно понятия отношения?
4. Перечислите операции реляционной алгебры и дайте им опреде-
ление.
5. Как классифицируются
операции реляционной алгебры?
6. Что такое отношения-синонимы?
7. Запишите дополнительные операции реляционной алгебры (пе-
ресечение, соединение, эквисоединение, деление) через основные операции.
8. Запишите каждую операцию реляционной алгебры на языке
SQL.
9. Чем различаются операции «эквисоединение» и «внешнее соеди-
нение»?
10. Чем различают полное, левое и правое внешние соединения?
11. Как сервер баз
данных выбирает план выполнения запроса?
12. Что является областью определения в языке реляционного ис-
числения с переменными-кортежами?
13. Что является областью определения в языке реляционного ис-
числения с переменными-доменами?
14. Какова общая форма записи формулы реляционного исчисления
с переменными-кортежами в классическом варианте?
15. Как строятся атомы в формуле реляционного исчисления
с пере-
менными-кортежами?
16. Какова общая форма записи формулы реляционного исчисления
с переменными-кортежами в прагматическом варианте?
17. Как строятся атомы в формуле реляционного исчисления с пере-
менными-доменами?
18. Запишите операции реляционной алгебры на языке реляционно-
го исчисления с переменными-кортежами.
26

19. Какова общая форма записи формулы реляционного исчисле-
ния с переменными-доменами в классическом варианте?
20. Какова общая форма записи формулы реляционного исчисле-
ния с переменными-доменами в прагматическом варианте?
21. Пусть база данных «Гостиницы» содержит следующие отно-
шения:
Гостиницы (код гостиницы, название, адрес);
Номера (код номера, код гостиницы, тип номера, цена);
Регистрация (код, код постояльца, имя, адрес, дата прибытия,
дата отъезда, код номера, код гостиницы
).
Напишите выражения реляционной алгебры, позволяющие выполнить запрос: «Составить список имен и адресов всех постояльцев
двухместных номеров гостиницы Северная».
22. Учебная база данных поставщиков, деталей, поставок опреде-
лена следующим образом:
Create table S (n_post char(5) not NULL, name char(20), reiting
smallint, town cha
r(15));
Create table P (n_det char(6), name char(20), cvet char(7), ves
smallint, town char
(15));
Create table SP (n_post char(5), n_det char(6), date_post date, kol
smallint
).
Объясните, в чем состоит некорректность SQL-запроса
Select * from S x where reiting > any (Select ves from P y where
y.town=‘Париж’
)?
23. Для учебной базы данных, определенной в вопросе 22, запиши-
те выражение реляционной алгебры, дающее решение задачи «Определить номера изделий, детали для которых полностью поставляются
поставщиком с номером '
S1'».
24. Для учебной базы данных, определенной в вопросе 22, запишите выражение реляционной алгебры, дающее решение задачи «Получить имена поставщиков, по крайней мере, одной детали, поставляемой как минимум одним поставщиком, который поставляет хотя бы
одну красную деталь».
27

25. Для учебной базы данных, определенной в вопросе 22, запиши-
те выражение реляционной алгебры, дающее решение задачи «Определить номера изделий, для которых поставляется хотя бы одна деталь из
множества деталей, поставляемых поставщиком с номером '
26. Тождественно ли выражение (
(
A MINUS B) выражению (A INTERSECT B) UNION (B MINUS A)?
27. Тождественно ли выражение (
(
A MINUS B) выражению (A INTERSECT B) INTERSECT (B MINUS
(
A MINUS B))?
28. Является ли запись
A INTERSECT B = A MINUS (A MINUS B)
A INTERSECT B) MINUS
A INTERSECT B) MINUS
S1'».
тождеством?
29. Является ли запись
A INTERSECT B = (A MINUS B) MINUS
(B MINUS A) тождеством?
30. Для учебной базы данных, определенной в вопросе 22, объясните, в чем состоит некорректность SQL-запроса
Select * from S x where reiting > all (Select ves from P y)?
28

2. ЯЗЫК SQL. ОПТИМИЗАЦИЯ ЗАПРОСОВ
Работа по созданию языка SQL была начата сразу после появления
статьи Э. Кодда в 1970 г. в лабораториях компании IBM для проверки
возможностей реляционной модели. Прототипом языка SQL был язык
SEQUEL для экспериментальной исследовательской системы System
R. Первые прототипы, основанные на языке SQL, появились в 1973–
1976 годах сначала в IBM, а затем в других компаниях.
На рубеже 1970–1980 годов появились
коммерческих реализациях:
1979 – Oracle (Relation Software Inc. – Oracle corp.);
1981–1982 – DB2 (IBM), Ingres – CA-OpenIngres (Relation Tech-
nology Inc. – Computer Associates);
1984 – Informix (Informix Software);
1986 – Sybase (Sybase Corp.)
Одновременно были начаты работы по стандартизации языка SQL.
К числу особенностей развития языка SQL следует отнести:
язык SQL реализован во всех коммерческих реляционных СУБД;
все фирмы провозглашают соответствие стандарту SQL;
реализованные диалекты очень близки;
путь «сверху вниз» – уточнение и упрощение SQL System R;
путь «снизу вверх» (наращивание возможностей);
нередко отсутствие полного описания языка.
Первый международный стандарт языка SQL появился в 1989 году.
В 1992 году был принят второй международный стандарт (стандарт
SQL2 или SQL92).
В 1995 г. стандарт был дополнен спецификацией интерфейса уровня вызова Call-Level Interface – SQL/CLI, ODBC (Open Database
Connectivity) и JDBC (Java Database Connectivity).
первые разработки SQL в
29

Стандарт SQL:1999 (SQL3) – третий основной стандарт SQL, используемый в настоящее время. Стандарт SQL:1999 состоит из пяти
частей. Первая часть (SQL/Framework) посвящена описанию концептуальной структуры стандарта: приводится развернутая аннотация следующих четырех частей.
Вторая часть SQL:1999 (SQL/Foundation) образует базис стандарта.
Вводится система типов языка, формулируются правила определения
функциональных зависимостей и возможных ключей, определяется
синтаксис и семантика основных
операторов определения и манипулирования схемой базы данных;
операторов манипулирования данными;
операторов управления транзакциями (расширенные модели
операторов SQL:
транзакций, контрольные точки, многозвенные транзакции);
операторов управления подключениями к базе данных и т. д.
Третью часть занимает уточненная по сравнению с SQL/92 спецификация SQL/CLI. В четвертой части специфицируется SQL/PSM –
синтаксис и семантика языка определения хранимых процедур (стандарт синтаксиса триггеров и процедур). Наконец, в пятой части –
SQL/Bindings – определяются правила связывания SQL для стандартных версий языков программирования FORTRAN, COBOL, PL/1,
Pascal, Ada, C и MUMPS.
конце 2003 года был принят и опубликован новый вариант меж-
В
дународного стандарта SQL:2003.
стандарт управления распределенными транзакциями (SQL/
Transaction);
стандарт поддержки темпоральных свойств данных (SQL/
Temporal);
стандарт управления внешними данными (SQL/MED);
поддержка оперативной аналитической обработки (SQL/OLAP).
2.1. ОСНОВНЫЕ ПРАВИЛА ИСПОЛЬЗОВАНИЯ
ЯЗЫКА SQL
Написанный пользователем SQL-запрос передается серверу баз
данных, который, обрабатывая запрос, строит план его выполнения
(алгоритм), от которого зависит:
скорость выполнения запроса;
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
