Предположим, что мы работаем с базой данных, которая состоит из отношений СЛУЖАЩИЕ {СЛУ_НОМ, СЛУ_ИМЯ, СЛУ_ЗАРП, ПРО_НОМ} и ПРОЕКТЫ {ПРО_НОМ, ПРОЕКТ_РУК, ПРО_ЗАРП} (в отношении ПРОЕКТЫ атрибут ПРОЕКТ_РУК содержит имена служащих, являющихся руководителями проектов, а атрибут ПРО_ЗАРП – среднее значение зарплаты, получаемой участниками проекта), и хотим узнать имена и номера служащих, которые являются руководителями проектов со средней заработной платой, превышающей 18000 руб.
Если бы для формулировки такого запроса использовалась реляционная алгебра, то мы получили бы, например, следующее алгебраическое выражение:
(СЛУЖАЩИЕ JOIN ПРОЕКТЫ WHERE (СЛУ_ИМЯ = ПРОЕКТ_РУК AND ПРО_ЗАРП > 18000.00)) PROJECT (СЛУ_ИМЯ, СЛУ_НОМ)
Это выражение можно было бы прочитать, например, следующим образом:
СЛУЖАЩИЕ и ПРОЕКТЫ по условию СЛУ_ИМЯ = ПРОЕКТ_РУК ;ПРО_ЗАРП > 18000.00 ;СЛУ_ИМЯ, СЛУ_НОМ.Мы четко сформулировали последовательность шагов выполнения запроса, каждый из которых соответствует одной
Если же сформулировать тот же запрос с использованием
и
и выражение
СЛУЖАЩИЙ.СЛУ_ИМЯ, СЛУЖАЩИЙ.СЛУ_НОМ WHERE .
Это выражение можно было бы прочитать, например, следующим образом: выдать значения СЛУ_ИМЯ и СЛУ_НОМ для каждого кортежа служащих такого, что существует кортеж проектов со значением ПРОЕКТ_РУК, совпадающим со значением СЛУ_ИМЯ этого кортежа служащих, и значением ПРО_ЗАРП, большим 18000.00.
Во второй формулировке мы указали лишь характеристики результирующего отношения, но ничего не сказали о способе его формирования. В этом случае система сама должна решить, какие операции и в каком порядке нужно выполнить над отношениями СЛУЖАЩИЕ и ПРОЕКТЫ. Обычно говорят, что алгебраическая формулировка является процедурной, т. е. задающей последовательность действий для выполнения запроса, а логическая – описательной (или декларативной), поскольку она всего лишь описывает свойства желаемого результата. Как мы указывали в начале лекции 3, на самом деле эти два механизма эквивалентны, и существуют не слишком сложные правила преобразования одного формализма в другой.
В зависимости от того, что является областью определения переменной, различают
Как и в лекциях, посвященных реляционной алгебре, в этой лекции нам не удастся избежать использования некоторого конкретного синтаксиса, который мы тем не менее формально определять не будем. Те или иные синтаксические конструкции будут вводиться по мере необходимости. В совокупности используемый синтаксис близок, но не полностью совпадает с синтаксисом языка баз данных QUEL, который долгое время являлся основным языком известной реляционной
Для определения СЛУЖАЩИЙ, областью определения которой является отношение СЛУЖАЩИЕ, нужно употребить конструкцию
Как уже говорилось, из этого определения следует, что в любой момент времени переменная СЛУЖАЩИЙ представляет некоторый СЛУЖАЩИЕ. При использовании СЛУ_ИМЯ переменной СЛУЖАЩИЙ, нужно употребить конструкцию СЛУЖАЩИЙ.СЛУ_ИМЯ.
Основой
СЛУЖАЩИЙ.СЛУ_НОМ = 2934 и
СЛУЖАЩИЙ.СЛУ_НОМ = ПРОЕКТ.ПРОЕКТ_РУК
являются простыми условиями. Первое условие принимает значение true в том и только в том случае, когда значение атрибута СЛУ_НОМ СЛУЖАЩИЙ равно 2934. Второе условие принимает значение true в том и только в том случае, когда значения атрибутов СЛУ_НОМ и ПРОЕКТ_РУК переменных СЛУЖАЩИЙ и ПРОЕКТ совпадают.
По определению, простое сравнение является
Более сложные варианты NOT, AND, OR и IF … THEN здесь обозначается одна из важных логических функций – IF a THEN b эквивалентно NOT a OR b. Хотя NOT > AND > OR ) и возможности расстановки скобок. Так, если form – comp – простое сравнение, то NOT form, comp AND form, comp OR form и IF comp THEN form являются
Для примеров воспользуемся отношениями СЛУЖАЩИЕ, ПРОЕКТЫ и НОМЕРА_ПРОЕКТОВ из предыдущей лекции (см. рис. 5.1).
(рис 5.1) Примерные значения отношений СЛУЖАЩИЕ, ПРОЕКТЫ и НОМЕРА_ПРОЕКТОВIF СЛУЖАЩИЙ.СЛУ_ИМЯ = 'Иванов' THEN (СЛУЖАЩИЙ.СЛУ_ЗАРП >= 22400.00 AND СЛУЖАЩИЙ.ПРО_НОМ = 1)
Эта формула будет принимать значение true для следующих значений СЛУЖАЩИЙ:
| СЛУ_НОМЕР | СЛУ_ИМЯ | СЛУ_ЗАРП | ПРО_НОМ |
|---|---|---|---|
| 2934 | Иванов | 22400.00 | 1 |
| 2935 | Петров | 29600.00 | 1 |
| 2936 | Сидоров | 18000.00 | 1 |
| 2937 | Федоров | 20000.00 | 1 |
| 2938 | Иванова | 22000.00 | 1 |
| 2935 | Петров | 29600.00 | 2 |
| 2939 | Сидоренко | 18000.00 | 2 |
| 2940 | Федоренко | 20000.00 | 2 |
| 2941 | Иваненко | 22000.00 | 2 |
Конечно, нужно представлять себе какой-нибудь способ реализации системы, которая сможет по заданной true. Очевидно, что результат эквивалентен выполнению алгебраической операции СЛУЖАЩИЕ WHERE (NOT (СЛУЖАЩИЙ.СЛУ_ИМЯ = 'Иванов') OR (СЛУЖАЩИЙ.СЛУ_ЗАРП >= 22400.00 AND СЛУЖАЩИЙ.ПРО_НОМ = 1)) над отношением, тело которого представляет собой область определения
Пусть имеется следующее определение ПРОЕКТ:
Вот еще пример
СЛУЖАЩИЙ.СЛУ_ИМЯ = ПРОЕКТ.ПРОЕКТ_РУК
Эта формула будет принимать значение true для следующих пар значений СЛУЖАЩИЙ и ПРОЕКТ:
| СЛУЖАЩИЕ | ПРОЕКТЫ | ||||
|---|---|---|---|---|---|
| СЛУ_НОМЕР | СЛУ_ИМЯ | СЛУ_ЗАРП | ПРО_НОМ | ПРО_НОМ | ПРОЕКТ_ РУК |
| 2934 | Иванов | 22400.00 | 1 | 1 | Иванов |
| 2941 | Иваненко | 22000.00 | 2 | 2 | Иваненко |
| 2934 | Иванов | 22400.00 | 2 | 1 | Иванов |
Очевидный способ реализации системы, которая по заданной СЛУЖАЩИЙ. Для каждого текущего кортежа из области определения переменной СЛУЖАЩИЙ просматривать область определения переменной ПРОЕКТ. Оставлять в области истинности те пары кортежей, для которых формула принимает значение true. Возможен и альтернативный подход: начать просмотр с области определения переменной ПРОЕКТ, и для каждого кортежа ПРОЕКТ просматривать область определения СЛУЖАЩИЙ.
Здесь нужно сделать несколько замечаний. Во-первых, если бы в данном случае формула была тождественно истинной (например, имела вид
((СЛУЖАЩИЙ.СЛУ_ИМЯ = СЛУЖАЩИЙ.СЛУ_ИМЯ) AND (ПРОЕКТ.ПРОЕКТ_РУК = ПРОЕКТ.ПРОЕКТ_РУК))
то областью истинности этой формулы являлось бы декартово произведение (в строгом математическом смысле) СЛУЖАЩИЙ и ПРОЕКТ. В реляционном
СЛУЖАЩИЙ.СЛУ_ИМЯ = ПРОЕКТ.ПРОЕКТ_РУК
следующим образом:
| СЛУЖАЩИЙ. СЛУ_НОМЕР | СЛУЖАЩИЙ. СЛУ_ИМЯ | СЛУЖАЩИЙ. СЛУ_ЗАРП | СЛУЖАЩИЙ. ПРО_НОМ | ПРОЕКТ. ПРО_НОМ | ПРОЕКТ. ПРОЕКТ_ РУК |
|---|---|---|---|---|---|
| 2934 | Иванов | 22400.00 | 1 | 1 | Иванов |
| 2941 | Иваненко | 22000.00 | 2 | 2 | Иваненко |
Во-вторых, как видно, показанное результирующее отношение в точности совпадает с результатом алгебраической операции СЛУЖАЩИЕ JOIN ПРОЕКТЫ WHERE СЛУ_ИМЯ = ПРОЕКТ_РУК с учетом особенности
При построении form – это var, то конструкции и FORALL var (form) представляют собой принимает значение true в том и только в том случае, если в области определения переменной var найдется хотя бы одно значение (кортеж), для которого form принимает значение true. Формула принимает значение true, если для всех значений переменной var из ее области определения form принимает значение true.
Переменные, входящие в true, то эти значения или , то в этой var является
Пусть здесь и далее в этом разделе СЛУ1 и СЛУ2 представляют собой две СЛУЖАЩИЕ. Тогда
для текущего кортежа переменной СЛУ1 принимает значение true в том и только в том случае, если во всем отношении СЛУЖАЩИЕ найдется такой кортеж (ассоциированный с переменной СЛУ2 ), чтобы значение его атрибута СЛУ_ЗАРП удовлетворяло внутреннему условию сравнения. Легко видеть, что эта формула принимает значение true только для тех значений СЛУ1, которые соответствуют служащим, не получающим минимальную зарплату. Соответствующее множество кортежей показано на рис. 5.2a (для СЛУЖАЩИЕ из рис. 5.1).
(рис 5.2) Примеры правильно построенных формул с кванторами
для текущего кортежа переменной СЛУ1 принимает значение true в том и только в том случае, если для всех СЛУЖАЩИЕ (связанных с переменной СЛУ2 ) значения атрибута СЛУ_ЗАРП удовлетворяют условию сравнения. Снова легко видеть, что формула принимает значение true только для тех значений СЛУ1, которые соответствуют служащим, получающим ) использовано условие СЛУ1.СЛУ_ЗАР > СЛУ2.СЛУ_ЗАРП, а второй формуле (с ) – СЛУ1.СЛУ_ЗАР >= СЛУ2.СЛУ_ЗАРП?
На самом деле, правильнее говорить не о var является form, то во всех form, вне form может использоваться вхождение того же имени переменной var, которое может быть свободным или связанным, но в любом случае не имеет никакого отношения к вхождению переменной var в form. Вот пример:
EXISTS СЛУ2 (СЛУ1.ПРО_НОМ = СЛУ2.ПРО_НОМ
AND СЛУ1.СЛУ_НОМЕР != СЛУ2.СЛУ_НОМЕР)
AND FORALL СЛУ2 (IF СЛУ1.ПРО_НОМ = СЛУ2.ПРО_НОМ
THEN СЛУ1.СЛУ_ЗАРП = СЛУ2.СЛУ_ЗАРП)
Эта формула принимает значение true только для тех значений переменной СЛУ1, которые соответствуют служащим, участвующим в проектах с более чем одним участником, причем все участники проекта получают одну и ту же зарплату. Здесь мы имеем два связанных вхождения переменной СЛУ2 с совершенно разным смыслом. Грубо говоря, для текущего значения переменной СЛУ1 переменная СЛУ2 два раза "пробежит" свою область определения – первый раз при вычислении части формулы с
FORALL СЛУ2 (IF (СЛУ1.ПРО_НОМ = СЛУ2.ПРО_НОМ AND
СЛУ1.СЛУ_НОМЕР != СЛУ2.СЛУ_НОМЕР)
THEN СЛУ1.СЛУ_ЗАРП = СЛУ2.СЛУ_ЗАРП)
Легко заметить, что кванторы можно трактовать как булевские функции (функции, принимающие значения true или false ) над множеством значений MIN (минимальное значение), MAX (максимальное значение), AVG (среднее значение) и т. д.
В этом случае можно было бы написать, например,
СЛУ1.СЛУ_ЗАРП > MIN СЛУ2.СЛУ_ЗАРП (СЛУ1.ПРО_НОМ = СЛУ2.ПРО_НОМ)
в области истинности которой содержатся все СЛУЖАЩИЕ, соответствующие тем служащим, которые получают заработную плату, превышающую минимальную зарплату служащих, участвующих в том же проекте. Понятно, что для получения результирующего отношения можно интерпретировать формулу таким же образом, как в обсуждавшемся выше случае наличия кванторов.
Итак,
var.attr, где var – имя attr – имя атрибута отношения, на котором определена переменная var ;var, что эквивалентно наличию подсписка var.attr1, var.attr2, ..., var.attrn, где {attr1, attr2, ..., attrn} включает имена всех атрибутов определяющего отношения;new_name = var.attr ; new_name – новое имя соответствующего атрибута результирующего отношения.Последний вариант требуется в тех случаях, когда в
target_list WHERE
В качестве простого примера покажем СЛУЖАЩИЕ DIVIDE BY НОМЕРА_ПРОЕКТОВ (рис. 3.11 из лекции 3):
СЛУ1, СЛУ2 RANGE IS СЛУЖАЩИЕ НОМЕР_ПРОЕКТА range is НОМЕРА_ПРОЕКТОВ СЛУ1.СЛУ_НОМЕР, СЛУ1.СЛУ_ИМЯ, СЛУ1.СЛУ_ЗАРП WHERE FORALL НОМЕР_ПРОЕКТА EXISTS СЛУ2 (СЛУ1.СЛУ_НОМЕР = СЛУ2.СЛУ_НОМЕР AND СЛУ1.ПРО_НОМ = НОМЕРА_ПРОЕКТА.ПРО_НОМ)
Конечно, результатом этого
| СЛУ_НОМЕР | СЛУ_ИМЯ | СЛУ_ЗАРП |
|---|---|---|
| 2934 | Иванов | 22400.00 |
| 2935 | Петров | 29600.00 |
В СЛУЖАЩИЕ-ПРОЕКТЫ можно говорить, например, о доменных переменных ИМЯ (значения – допустимые имена) или НОСЛУ (значения – допустимые номера служащих).
Основным формальным отличием R – это n -a1, a2, ..., an, то R (ai1 : vi1, ai2 : vi2, ..., aim : vim) (m <= n), где vij – это либо литерально задаваемая константа, либо имя доменной переменной. true в том и только в том случае, если в отношении R существует кортеж, содержащий указанные значения
указанных атрибутов. Если vij – константа, то на атрибут aij накладывается жесткое условие, не зависящее от текущих значений доменных переменных; если же vij – имя доменной переменной, то
Для большей ясности приведем пару примеров. Для простоты будем считать, что мы определили доменные переменные, имена которых совпадают с именами атрибутов отношения СЛУЖАЩИЕ, а в случае, когда требуется несколько доменных переменных, определенных на одном домене, мы будем добавлять в конце имени цифры.
СЛУЖАЩИЕ (СЛУ_НОМ:2934, СЛУ_ИМЯ:'Иванов', СЛУ_ЗАРП:22400.00, ПРО_НОМ:1)
примет значение true в том и только в том случае, когда в теле отношения СЛУЖАЩИЕ содержится кортеж <2934, 'Иванов', 22400.00, 1>. Соответствующие значения доменных переменных образуют область истинности этой
СЛУЖАЩИЕ (СЛУ_НОМ:2934, СЛУ_ИМЯ:'Иванов', СЛУ_ЗАРП:22400.00, ПРО_НОМ:ПРО_НОМ)
будет принимать значение true для всех комбинаций явно заданных значений и допустимых значений переменной ПРО_НОМ, которые соответствуют кортежам, входящим в СЛУЖАЩИЕ. При наличии СЛУЖАЩИЕ, показанного на рис. 5.1, областью истинности этой <2934, 'Иванов', 22400.00, 1> и <2934, 'Иванов', 22400.00, 2>.
Во всех остальных отношениях формулы и
Для примера
СЛУ_НОМ, СЛУ_ИМЯ WHERE EXISTS СЛУ_ЗАРП1 (СЛУЖАЩИЕ (СЛУ_ЗАРП1) AND СЛУЖАЩИЕ (СЛУ_НОМ, СЛУ_ИМЯ, СЛУ_ЗАРП) AND СЛУ_ЗАРП > СЛУ_ЗАРП1)
Реляционное
Этой лекцией мы завершаем обзор реляционной модели данных. В последних трех лекциях рассматривалась манипуляционная составляющая реляционной модели данных. Были представлены два варианта реляционной алгебры. Конечно, с формальной точки зрения можно было бы обойтись одним из вариантов, поскольку их выразительные средства эквивалентны. Но алгебра Кодда в большей степени базируется на теории множеств. Базовыми операциями являются переименование атрибутов, объединение, пересечение, взятие разности, декартово произведение, проекция и ограничение. Операция соединения общего вида, хотя и включается в алгебру, является вторичной и явно представляется через другие операции. Фундаментальная же в реляционном подходе операция естественного соединения выражается через соединение общего вида и в алгебру не включается. В терминах алгебры Кодда проще всего определяются алгебраические черты языка SQL, в частности общая семантика оператора SELECT.
Базисом Алгебры A являются операции реляционного отрицания (дополнения), реляционной конъюнкции (или дизъюнкции) и проекции (удаления атрибута). Реляционные аналоги логических операций определяются в терминах отношений на основе обычных теоретико-множественных операций и позволяют выражать напрямую операции пересечения, декартова произведения, естественного соединения, объединения отношений. Путем комбинирования базовых операций выражаются операции переименования атрибутов, соединения общего вида, взятия разности отношений. Алгебра A позволяет лучше осознать логические основы реляционной модели, хотя, безусловно, является в меньшей степени ориентированной на практическое применение, чем алгебра Кодда.
Реляционному исчислению мы отвели меньше места, поскольку не ставили перед собой задачу определить какой-либо полноценный логический язык запросов. Цель состояла в том, чтобы показать возможность декларативной логической формулировки запросов. В этом случае выполнение запроса происходит путем интерпретации логической формулы, а не вычисления алгебраического выражения. Были рассмотрены два варианта
Предположим, что мы работаем с базой данных, которая состоит из отношений СЛУЖАЩИЕ {СЛУ_НОМ, СЛУ_ИМЯ, СЛУ_ЗАРП, ПРО_НОМ} и ПРОЕКТЫ {ПРО_НОМ, ПРОЕКТ_РУК, ПРО_ЗАРП} (в отношении ПРОЕКТЫ атрибут ПРОЕКТ_РУК содержит имена служащих, являющихся руководителями проектов, а атрибут ПРО_ЗАРП – среднее значение зарплаты, получаемой участниками проекта), и хотим узнать имена и номера служащих, которые являются руководителями проектов со средней заработной платой, превышающей 18000 руб.
Если бы для формулировки такого запроса использовалась реляционная алгебра, то мы получили бы, например, следующее алгебраическое выражение:
(СЛУЖАЩИЕ JOIN ПРОЕКТЫ WHERE (СЛУ_ИМЯ = ПРОЕКТ_РУК AND ПРО_ЗАРП > 18000.00)) PROJECT (СЛУ_ИМЯ, СЛУ_НОМ)
Это выражение можно было бы прочитать, например, следующим образом:
СЛУЖАЩИЕ и ПРОЕКТЫ по условию СЛУ_ИМЯ = ПРОЕКТ_РУК ;ПРО_ЗАРП > 18000.00 ;СЛУ_ИМЯ, СЛУ_НОМ.Мы четко сформулировали последовательность шагов выполнения запроса, каждый из которых соответствует одной
Если же сформулировать тот же запрос с использованием
и
и выражение
СЛУЖАЩИЙ.СЛУ_ИМЯ, СЛУЖАЩИЙ.СЛУ_НОМ WHERE .
Это выражение можно было бы прочитать, например, следующим образом: выдать значения СЛУ_ИМЯ и СЛУ_НОМ для каждого кортежа служащих такого, что существует кортеж проектов со значением ПРОЕКТ_РУК, совпадающим со значением СЛУ_ИМЯ этого кортежа служащих, и значением ПРО_ЗАРП, большим 18000.00.
Во второй формулировке мы указали лишь характеристики результирующего отношения, но ничего не сказали о способе его формирования. В этом случае система сама должна решить, какие операции и в каком порядке нужно выполнить над отношениями СЛУЖАЩИЕ и ПРОЕКТЫ. Обычно говорят, что алгебраическая формулировка является процедурной, т. е. задающей последовательность действий для выполнения запроса, а логическая – описательной (или декларативной), поскольку она всего лишь описывает свойства желаемого результата. Как мы указывали в начале лекции 3, на самом деле эти два механизма эквивалентны, и существуют не слишком сложные правила преобразования одного формализма в другой.
В зависимости от того, что является областью определения переменной, различают
Как и в лекциях, посвященных реляционной алгебре, в этой лекции нам не удастся избежать использования некоторого конкретного синтаксиса, который мы тем не менее формально определять не будем. Те или иные синтаксические конструкции будут вводиться по мере необходимости. В совокупности используемый синтаксис близок, но не полностью совпадает с синтаксисом языка баз данных QUEL, который долгое время являлся основным языком известной реляционной
Для определения СЛУЖАЩИЙ, областью определения которой является отношение СЛУЖАЩИЕ, нужно употребить конструкцию
Как уже говорилось, из этого определения следует, что в любой момент времени переменная СЛУЖАЩИЙ представляет некоторый СЛУЖАЩИЕ. При использовании СЛУ_ИМЯ переменной СЛУЖАЩИЙ, нужно употребить конструкцию СЛУЖАЩИЙ.СЛУ_ИМЯ.
Основой
СЛУЖАЩИЙ.СЛУ_НОМ = 2934 и
СЛУЖАЩИЙ.СЛУ_НОМ = ПРОЕКТ.ПРОЕКТ_РУК
являются простыми условиями. Первое условие принимает значение true в том и только в том случае, когда значение атрибута СЛУ_НОМ СЛУЖАЩИЙ равно 2934. Второе условие принимает значение true в том и только в том случае, когда значения атрибутов СЛУ_НОМ и ПРОЕКТ_РУК переменных СЛУЖАЩИЙ и ПРОЕКТ совпадают.
По определению, простое сравнение является
Более сложные варианты NOT, AND, OR и IF … THEN здесь обозначается одна из важных логических функций – IF a THEN b эквивалентно NOT a OR b. Хотя NOT > AND > OR ) и возможности расстановки скобок. Так, если form – comp – простое сравнение, то NOT form, comp AND form, comp OR form и IF comp THEN form являются
Для примеров воспользуемся отношениями СЛУЖАЩИЕ, ПРОЕКТЫ и НОМЕРА_ПРОЕКТОВ из предыдущей лекции (см. рис. 5.1).
(рис 5.1) Примерные значения отношений СЛУЖАЩИЕ, ПРОЕКТЫ и НОМЕРА_ПРОЕКТОВIF СЛУЖАЩИЙ.СЛУ_ИМЯ = 'Иванов' THEN (СЛУЖАЩИЙ.СЛУ_ЗАРП >= 22400.00 AND СЛУЖАЩИЙ.ПРО_НОМ = 1)
Эта формула будет принимать значение true для следующих значений СЛУЖАЩИЙ:
| СЛУ_НОМЕР | СЛУ_ИМЯ | СЛУ_ЗАРП | ПРО_НОМ |
|---|---|---|---|
| 2934 | Иванов | 22400.00 | 1 |
| 2935 | Петров | 29600.00 | 1 |
| 2936 | Сидоров | 18000.00 | 1 |
| 2937 | Федоров | 20000.00 | 1 |
| 2938 | Иванова | 22000.00 | 1 |
| 2935 | Петров | 29600.00 | 2 |
| 2939 | Сидоренко | 18000.00 | 2 |
| 2940 | Федоренко | 20000.00 | 2 |
| 2941 | Иваненко | 22000.00 | 2 |
Конечно, нужно представлять себе какой-нибудь способ реализации системы, которая сможет по заданной true. Очевидно, что результат эквивалентен выполнению алгебраической операции СЛУЖАЩИЕ WHERE (NOT (СЛУЖАЩИЙ.СЛУ_ИМЯ = 'Иванов') OR (СЛУЖАЩИЙ.СЛУ_ЗАРП >= 22400.00 AND СЛУЖАЩИЙ.ПРО_НОМ = 1)) над отношением, тело которого представляет собой область определения
Пусть имеется следующее определение ПРОЕКТ:
Вот еще пример
СЛУЖАЩИЙ.СЛУ_ИМЯ = ПРОЕКТ.ПРОЕКТ_РУК
Эта формула будет принимать значение true для следующих пар значений СЛУЖАЩИЙ и ПРОЕКТ:
| СЛУЖАЩИЕ | ПРОЕКТЫ | ||||
|---|---|---|---|---|---|
| СЛУ_НОМЕР | СЛУ_ИМЯ | СЛУ_ЗАРП | ПРО_НОМ | ПРО_НОМ | ПРОЕКТ_ РУК |
| 2934 | Иванов | 22400.00 | 1 | 1 | Иванов |
| 2941 | Иваненко | 22000.00 | 2 | 2 | Иваненко |
| 2934 | Иванов | 22400.00 | 2 | 1 | Иванов |
Очевидный способ реализации системы, которая по заданной СЛУЖАЩИЙ. Для каждого текущего кортежа из области определения переменной СЛУЖАЩИЙ просматривать область определения переменной ПРОЕКТ. Оставлять в области истинности те пары кортежей, для которых формула принимает значение true. Возможен и альтернативный подход: начать просмотр с области определения переменной ПРОЕКТ, и для каждого кортежа ПРОЕКТ просматривать область определения СЛУЖАЩИЙ.
Здесь нужно сделать несколько замечаний. Во-первых, если бы в данном случае формула была тождественно истинной (например, имела вид
((СЛУЖАЩИЙ.СЛУ_ИМЯ = СЛУЖАЩИЙ.СЛУ_ИМЯ) AND (ПРОЕКТ.ПРОЕКТ_РУК = ПРОЕКТ.ПРОЕКТ_РУК))
то областью истинности этой формулы являлось бы декартово произведение (в строгом математическом смысле) СЛУЖАЩИЙ и ПРОЕКТ. В реляционном
СЛУЖАЩИЙ.СЛУ_ИМЯ = ПРОЕКТ.ПРОЕКТ_РУК
следующим образом:
| СЛУЖАЩИЙ. СЛУ_НОМЕР | СЛУЖАЩИЙ. СЛУ_ИМЯ | СЛУЖАЩИЙ. СЛУ_ЗАРП | СЛУЖАЩИЙ. ПРО_НОМ | ПРОЕКТ. ПРО_НОМ | ПРОЕКТ. ПРОЕКТ_ РУК |
|---|---|---|---|---|---|
| 2934 | Иванов | 22400.00 | 1 | 1 | Иванов |
| 2941 | Иваненко | 22000.00 | 2 | 2 | Иваненко |
Во-вторых, как видно, показанное результирующее отношение в точности совпадает с результатом алгебраической операции СЛУЖАЩИЕ JOIN ПРОЕКТЫ WHERE СЛУ_ИМЯ = ПРОЕКТ_РУК с учетом особенности
При построении form – это var, то конструкции и FORALL var (form) представляют собой принимает значение true в том и только в том случае, если в области определения переменной var найдется хотя бы одно значение (кортеж), для которого form принимает значение true. Формула принимает значение true, если для всех значений переменной var из ее области определения form принимает значение true.
Переменные, входящие в true, то эти значения или , то в этой var является
Пусть здесь и далее в этом разделе СЛУ1 и СЛУ2 представляют собой две СЛУЖАЩИЕ. Тогда
для текущего кортежа переменной СЛУ1 принимает значение true в том и только в том случае, если во всем отношении СЛУЖАЩИЕ найдется такой кортеж (ассоциированный с переменной СЛУ2 ), чтобы значение его атрибута СЛУ_ЗАРП удовлетворяло внутреннему условию сравнения. Легко видеть, что эта формула принимает значение true только для тех значений СЛУ1, которые соответствуют служащим, не получающим минимальную зарплату. Соответствующее множество кортежей показано на рис. 5.2a (для СЛУЖАЩИЕ из рис. 5.1).
(рис 5.2) Примеры правильно построенных формул с кванторами
для текущего кортежа переменной СЛУ1 принимает значение true в том и только в том случае, если для всех СЛУЖАЩИЕ (связанных с переменной СЛУ2 ) значения атрибута СЛУ_ЗАРП удовлетворяют условию сравнения. Снова легко видеть, что формула принимает значение true только для тех значений СЛУ1, которые соответствуют служащим, получающим ) использовано условие СЛУ1.СЛУ_ЗАР > СЛУ2.СЛУ_ЗАРП, а второй формуле (с ) – СЛУ1.СЛУ_ЗАР >= СЛУ2.СЛУ_ЗАРП?
На самом деле, правильнее говорить не о var является form, то во всех form, вне form может использоваться вхождение того же имени переменной var, которое может быть свободным или связанным, но в любом случае не имеет никакого отношения к вхождению переменной var в form. Вот пример:
EXISTS СЛУ2 (СЛУ1.ПРО_НОМ = СЛУ2.ПРО_НОМ
AND СЛУ1.СЛУ_НОМЕР != СЛУ2.СЛУ_НОМЕР)
AND FORALL СЛУ2 (IF СЛУ1.ПРО_НОМ = СЛУ2.ПРО_НОМ
THEN СЛУ1.СЛУ_ЗАРП = СЛУ2.СЛУ_ЗАРП)
Эта формула принимает значение true только для тех значений переменной СЛУ1, которые соответствуют служащим, участвующим в проектах с более чем одним участником, причем все участники проекта получают одну и ту же зарплату. Здесь мы имеем два связанных вхождения переменной СЛУ2 с совершенно разным смыслом. Грубо говоря, для текущего значения переменной СЛУ1 переменная СЛУ2 два раза "пробежит" свою область определения – первый раз при вычислении части формулы с
FORALL СЛУ2 (IF (СЛУ1.ПРО_НОМ = СЛУ2.ПРО_НОМ AND
СЛУ1.СЛУ_НОМЕР != СЛУ2.СЛУ_НОМЕР)
THEN СЛУ1.СЛУ_ЗАРП = СЛУ2.СЛУ_ЗАРП)
Легко заметить, что кванторы можно трактовать как булевские функции (функции, принимающие значения true или false ) над множеством значений MIN (минимальное значение), MAX (максимальное значение), AVG (среднее значение) и т. д.
В этом случае можно было бы написать, например,
СЛУ1.СЛУ_ЗАРП > MIN СЛУ2.СЛУ_ЗАРП (СЛУ1.ПРО_НОМ = СЛУ2.ПРО_НОМ)
в области истинности которой содержатся все СЛУЖАЩИЕ, соответствующие тем служащим, которые получают заработную плату, превышающую минимальную зарплату служащих, участвующих в том же проекте. Понятно, что для получения результирующего отношения можно интерпретировать формулу таким же образом, как в обсуждавшемся выше случае наличия кванторов.
Итак,
var.attr, где var – имя attr – имя атрибута отношения, на котором определена переменная var ;var, что эквивалентно наличию подсписка var.attr1, var.attr2, ..., var.attrn, где {attr1, attr2, ..., attrn} включает имена всех атрибутов определяющего отношения;new_name = var.attr ; new_name – новое имя соответствующего атрибута результирующего отношения.Последний вариант требуется в тех случаях, когда в
target_list WHERE
В качестве простого примера покажем СЛУЖАЩИЕ DIVIDE BY НОМЕРА_ПРОЕКТОВ (рис. 3.11 из лекции 3):
СЛУ1, СЛУ2 RANGE IS СЛУЖАЩИЕ НОМЕР_ПРОЕКТА range is НОМЕРА_ПРОЕКТОВ СЛУ1.СЛУ_НОМЕР, СЛУ1.СЛУ_ИМЯ, СЛУ1.СЛУ_ЗАРП WHERE FORALL НОМЕР_ПРОЕКТА EXISTS СЛУ2 (СЛУ1.СЛУ_НОМЕР = СЛУ2.СЛУ_НОМЕР AND СЛУ1.ПРО_НОМ = НОМЕРА_ПРОЕКТА.ПРО_НОМ)
Конечно, результатом этого
| СЛУ_НОМЕР | СЛУ_ИМЯ | СЛУ_ЗАРП |
|---|---|---|
| 2934 | Иванов | 22400.00 |
| 2935 | Петров | 29600.00 |
В СЛУЖАЩИЕ-ПРОЕКТЫ можно говорить, например, о доменных переменных ИМЯ (значения – допустимые имена) или НОСЛУ (значения – допустимые номера служащих).
Основным формальным отличием R – это n -a1, a2, ..., an, то R (ai1 : vi1, ai2 : vi2, ..., aim : vim) (m <= n), где vij – это либо литерально задаваемая константа, либо имя доменной переменной. true в том и только в том случае, если в отношении R существует кортеж, содержащий указанные значения
указанных атрибутов. Если vij – константа, то на атрибут aij накладывается жесткое условие, не зависящее от текущих значений доменных переменных; если же vij – имя доменной переменной, то
Для большей ясности приведем пару примеров. Для простоты будем считать, что мы определили доменные переменные, имена которых совпадают с именами атрибутов отношения СЛУЖАЩИЕ, а в случае, когда требуется несколько доменных переменных, определенных на одном домене, мы будем добавлять в конце имени цифры.
СЛУЖАЩИЕ (СЛУ_НОМ:2934, СЛУ_ИМЯ:'Иванов', СЛУ_ЗАРП:22400.00, ПРО_НОМ:1)
примет значение true в том и только в том случае, когда в теле отношения СЛУЖАЩИЕ содержится кортеж <2934, 'Иванов', 22400.00, 1>. Соответствующие значения доменных переменных образуют область истинности этой
СЛУЖАЩИЕ (СЛУ_НОМ:2934, СЛУ_ИМЯ:'Иванов', СЛУ_ЗАРП:22400.00, ПРО_НОМ:ПРО_НОМ)
будет принимать значение true для всех комбинаций явно заданных значений и допустимых значений переменной ПРО_НОМ, которые соответствуют кортежам, входящим в СЛУЖАЩИЕ. При наличии СЛУЖАЩИЕ, показанного на рис. 5.1, областью истинности этой <2934, 'Иванов', 22400.00, 1> и <2934, 'Иванов', 22400.00, 2>.
Во всех остальных отношениях формулы и
Для примера
СЛУ_НОМ, СЛУ_ИМЯ WHERE EXISTS СЛУ_ЗАРП1 (СЛУЖАЩИЕ (СЛУ_ЗАРП1) AND СЛУЖАЩИЕ (СЛУ_НОМ, СЛУ_ИМЯ, СЛУ_ЗАРП) AND СЛУ_ЗАРП > СЛУ_ЗАРП1)
Реляционное
Этой лекцией мы завершаем обзор реляционной модели данных. В последних трех лекциях рассматривалась манипуляционная составляющая реляционной модели данных. Были представлены два варианта реляционной алгебры. Конечно, с формальной точки зрения можно было бы обойтись одним из вариантов, поскольку их выразительные средства эквивалентны. Но алгебра Кодда в большей степени базируется на теории множеств. Базовыми операциями являются переименование атрибутов, объединение, пересечение, взятие разности, декартово произведение, проекция и ограничение. Операция соединения общего вида, хотя и включается в алгебру, является вторичной и явно представляется через другие операции. Фундаментальная же в реляционном подходе операция естественного соединения выражается через соединение общего вида и в алгебру не включается. В терминах алгебры Кодда проще всего определяются алгебраические черты языка SQL, в частности общая семантика оператора SELECT.
Базисом Алгебры A являются операции реляционного отрицания (дополнения), реляционной конъюнкции (или дизъюнкции) и проекции (удаления атрибута). Реляционные аналоги логических операций определяются в терминах отношений на основе обычных теоретико-множественных операций и позволяют выражать напрямую операции пересечения, декартова произведения, естественного соединения, объединения отношений. Путем комбинирования базовых операций выражаются операции переименования атрибутов, соединения общего вида, взятия разности отношений. Алгебра A позволяет лучше осознать логические основы реляционной модели, хотя, безусловно, является в меньшей степени ориентированной на практическое применение, чем алгебра Кодда.
Реляционному исчислению мы отвели меньше места, поскольку не ставили перед собой задачу определить какой-либо полноценный логический язык запросов. Цель состояла в том, чтобы показать возможность декларативной логической формулировки запросов. В этом случае выполнение запроса происходит путем интерпретации логической формулы, а не вычисления алгебраического выражения. Были рассмотрены два варианта
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.