ПРОЕКТЫ

Тесты

Заключение

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

 

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

 

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

 

СОТР_НОМ, СОТР_ИМЯ WHERE EXISTS СОТР_ЗАРП1
(СОТРУДНИКИ (СОТР_ЗАРП1) AND
СОТРУДНИКИ (СОТР_НОМ, СОТР_ИМЯ, СОТР_ЗАРП) AND
СОТР_ЗАРП > СОТР_ЗАРП1)

 

Реляционное исчисление доменов является основой большинства языков запросов, основанных на использовании форм. В частности, на этом исчислении базировался известный язык Query-by-Example, который был первым (и наиболее интересным) языком в семействе языков, основанных на табличных формах.

 

 

Этой лекцией мы завершаем обсуждение реляционной модели данных. В последних трех лекциях обсуждалась манипуляционная составляющая реляционной модели данных. Были рассмотрены два варианта реляционной алгебры. Конечно, с формальной точки зрения можно было бы обойтись любым одним вариантом, поскольку их выразительные средства эквивалентны. Но алгебра Кодда в большей степени базируется на теории множеств. Базовыми операциями являются переименование атрибутов, объединение, пересечение, взятие разности, декартово произведение, проекция и ограничение. Операция соединения общего вида, хотя и включается в алгебру, является вторичной и явно представляется через другие операции. Фундаментальная же в реляционном подходе операция естественного соединения выражается через соединение общего вида и в алгебру не включается. В терминах алгебры Кодда проще всего определяются алгебраические черты языка SQL, в частности, общая семантика оператора SELECT (см. лекцию 12).

 

Базисом Алгебры A являются операции реляционного отрицания (дополнения), реляционной конъюнкции (или дизъюнкции) и проекции (удаления атрибута). Реляционные аналоги логических операций определяются в терминах отношений на основе обычных теоретико-множественных операций и позволяют выражать напрямую операции пересечения, декартова произведения, естественного соединения, объединения отношений. Путем комбинирования базовых операций выражаются операции переименования атрибутов, соединения общего вида, взятия разности отношений. Алгебра A позволяет лучше осознать логические основы реляционной модели, хотя, безусловно, является в меньшей степени ориентированной на практическое применение, чем алгебра Кодда.

 

Реляционному исчислению мы отвели меньше места, поскольку не ставили перед собой задачу определить какой-либо полноценный логический язык запросов. Цель состояла лишь в том, чтобы показать возможность декларативной логической формулировки запросов. В этом случае выполнение запроса происходит путем интерпретации логической формулы, а не вычисления алгебраического выражения. Были обсуждены два варианта реляционного исчисления, первый из которых – реляционное исчисление кортежей – был определен сравнительно полно, а для второго – реляционного исчисления доменов – были только отмечены и проиллюстрированы основные отличительные черты.

 

 

В упражнениях к этой лекции мы снова будем использовать отношения СЛУЖАЩИЕ и ПРОЕКТЫ. Для удобства еще раз воспроизведем их примерные значения.

 

СЛУЖАЩИЕ

 

СЛУ_НОМЕР СЛУ_ИМЯ СЛУ_ЗАРП ПРО_НОМ
Иванов 22400.00
Петров 29600.00
Сидоров 18000.00
Федоров 20000.00
Иванова 22000.00
Иванов 22400.00
Петров 29600.00
Сидоренко 18000.00
Федоренко 20000.00
Иваненко 22000.00
ПРО_НОМ ПРОЕКТ_РУК
Иванов
Иваненко

Будем считать, что определены кортежные переменные СЛУ и ПРО на отношениях СЛУЖАЩИЕ и ПРОЕКТЫ соответственно. При потребности в дополнительных переменных будем считать, что они также определены и именуются путем добавления цифр в конце имен СЛУ и ПРО.

 

1 (1) Какое из приведенных ниже отношений является областью истинности WWF

 

IF (СЛУ.СЛУ_ЗАРП > 18000.00 AND СЛУ.СЛУ_ЗАРП < 22000.00 AND
IF (СЛУ.СЛУ_ИМЯ = ‘Федоров’) THEN (СЛУ.ПРО_НОМ = 1))
THEN (СЛУ.СЛУ_НОМЕР = 2941)?

 

(а) +

 

СЛУ_НОМЕР СЛУ_ИМЯ СЛУ_ЗАРП ПРО_НОМ
Иванов 22400.00
Петров 29600.00
Сидоров 18000.00
Иванова 22000.00
Иванов 22400.00
Петров 29600.00
Сидоренко 18000.00
Иваненко 22000.00

 

(б) -

 

СЛУ_НОМЕР СЛУ_ИМЯ СЛУ_ЗАРП ПРО_НОМ
Иванов 22400.00
Петров 29600.00
Иванова 22000.00
Иванов 22400.00
Петров 29600.00
Иваненко 22000.00

 

(в) -

 

СЛУ_НОМЕР СЛУ_ИМЯ СЛУ_ЗАРП ПРО_НОМ
Иванов 22400.00
Петров 29600.00
Сидоренко 18000.00
Федоренко 20000.00
Иваненко 22000.00

 

1 (2) Какое из приведенных ниже отношений является областью истинности WWF

 

IF (СЛУ.СЛУ_НОМЕР != 2941)
THEN (СЛУ.СЛУ_ЗАРП > 18000.00 AND СЛУ.СЛУ_ЗАРП < 22000.00 AND
IF (СЛУ.СЛУ_ИМЯ = ‘Федоров’) THEN (СЛУ.ПРО_НОМ = 1))?

 

(а) -

 

СЛУ_НОМЕР СЛУ_ИМЯ СЛУ_ЗАРП ПРО_НОМ
Федоренко 20000.00
Федоренко 20000.00

 

(б) +

 

СЛУ_НОМЕР СЛУ_ИМЯ СЛУ_ЗАРП ПРО_НОМ
Федоров 20000.00
Федоренко 20000.00
Иваненко 22000.00

 

(в) -

 

СЛУ_НОМЕР СЛУ_ИМЯ СЛУ_ЗАРП ПРО_НОМ
Иванов 22400.00
Петров 29600.00
Иванова 22000.00
Иванов 22400.00
Петров 29600.00
Иваненко 22000.00

 

1 (3) Какое из приведенных ниже отношений является областью истинности WWF

 

IF (СЛУ.СЛУ_НОМЕР = 2941 AND СЛУ.СЛУ_ЗАРП > 18000.00)
THEN IF (СЛУ.СЛУ_НОМЕР = 2937 AND СЛУ.СЛУ_ЗАРП < 22000.00)
THEN (СЛУ.СЛУ_ИМЯ = ‘Федоров’)?

 

(а) -

 

СЛУ_НОМЕР СЛУ_ИМЯ СЛУ_ЗАРП ПРО_НОМ
Иванов 22400.00
Петров 29600.00
Сидоров 18000.00
Иванова 22000.00
Иванов 22400.00
Петров 29600.00
Сидоренко 18000.00
Иваненко 22000.00

 

(б) -

 

СЛУ_НОМЕР СЛУ_ИМЯ СЛУ_ЗАРП ПРО_НОМ
Иванов 22400.00
Петров 29600.00
Сидоров 18000.00
Федоров 20000.00
Иванова 22000.00
Иванов 22400.00
Петров 29600.00
Сидоренко 18000.00
Иваненко 22000.00

 

(в) +

 

СЛУ_НОМЕР СЛУ_ИМЯ СЛУ_ЗАРП ПРО_НОМ
Иванов 22400.00
Петров 29600.00
Сидоров 18000.00
Федоров 20000.00
Иванова 22000.00
Иванов 22400.00
Петров 29600.00
Сидоренко 18000.00
Иваненко 22000.00

 

2 (1) Какому из следующих запросов соответствует выражение

 

ПРО WHERE (EXIST СЛУ1 ((ПРО.ПРО_НОМ = СЛУ1.ПРО_НОМ)
AND (ПРО.ПРО_РУК = СЛУ1.СЛУ_ИМЯ)
AND FORALL СЛУ2 ((ПРО.ПРО_НОМ = СЛУ2.ПРО_НОМ)
AND (СЛУ1.СЛУ_ЗАРП ³ СЛУ2.СЛУ_ЗАРП))?

 

(а)-

получить данные о проектах, участники которых получают максимальную зарплату

 

(б)+

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

 

(в) -

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

 

2 (2) Какому из следующих запросов соответствует выражение

 

СЛУ1.СЛУ_ИМЯ
WHERE EXIST СЛУ2 ((CЛУ1.СЛУ_НОМЕР = СЛУ2.СЛУ_НОМЕР)
AND (СЛУ1.ПРО_НОМ ¹ СЛУ2.ПРО_НОМ)
AND FORALL ПРО ((ПРО.ПРОЕКТ_РУК ¹ СЛУ1.СЛУ_ИМЯ)?

 

(а) +

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

 

(б) -

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

 

(в) -

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

 

2 (3) Какому из следующих запросов соответствует выражение

 

СЛУ1.СЛУ_ИМЯ, СЛУ1.СЛУ_ЗАРП
WHERE FORALL ПРО IF (СЛУ1.ПРО_НОМ ¹ ПРО.ПРО_НОМ)
THEN EXISTS СЛУ2 ((СЛУ2.ПРО_НОМ = ПРО.ПРО_НОМ)
AND (СЛУ1.СЛУ_ЗАРП > СЛУ2.СЛУ_ЗАРП))

 

(а) -

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

 

(б) +

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

 

(в)

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

 

3 (1) Какое из приведенных ниже выражений реляционного исчисления кортежей правильно соответствует запросу “выдать имена служащих, участвующих хотя бы в одном проекте, среди участников которого имеется хотя бы один служащий, получающий максимальную зарплату среди всех служащих”?

 

(а) +

СЛУ1.СЛУ_ИМЯ
WHERE EXISTS ПРО ((СЛУ1.ПРО_НОМ = ПРО.ПРО_НОМ)
AND EXISTS СЛУ2 ((СЛУ2.ПРО_НОМ = ПРО.ПРО_НОМ)
AND FORALL СЛУ3 (СЛУ3.СЛУ_ЗАРП ³ СЛУ2.СЛУ_ЗАРП))

 

(б) +

СЛУ1.СЛУ_ИМЯ
WHERE EXISTS СЛУ2 ((СЛУ1.ПРО_НОМ = СЛУ2.ПРО_НОМ)
AND FORALL СЛУ3 (СЛУ3.СЛУ_ЗАРП ³ СЛУ2.СЛУ_ЗАРП))

 

(в) -

СЛУ1.СЛУ_ИМЯ
WHERE FORALL СЛУ2 IF (СЛУ1.ПРО_НОМ = СЛУ2.ПРО_НОМ)

THEN FORALL СЛУ3 (СЛУ3.СЛУ_ЗАРП ³ СЛУ2.СЛУ_ЗАРП)

 

3 (2) Какое из приведенных ниже выражений реляционного исчисления кортежей правильно соответствует запросу “выдать имена руководителей проектов, ни один из участников которых не получает минимальную зарплату среди всех служащих”?

 

(а) +

СЛУ1.СЛУ_ИМЯ
WHERE EXISTS ПРО ((СЛУ1.СЛУ_ИМЯ = ПРО.ПРОЕКТ_РУК)
AND FORALL СЛУ2 ((СЛУ2.ПРО_НОМ ¹ СЛУ1.ПРО_НОМ)
OR EXISTS СЛУ3 (СЛУ2.СЛУ_ЗАРП > СЛУ3.СЛУ_ЗАРП))

 

(б) -

СЛУ1.СЛУ_ИМЯ
WHERE (СЛУ1.СЛУ_ИМЯ = ПРО.ПРОЕКТ_РУК)
AND FORALL СЛУ2 ((СЛУ2.ПРО_НОМ = СЛУ1.ПРО_НОМ)
AND EXISTS СЛУ3 (СЛУ2.СЛУ_ЗАРП > СЛУ3.СЛУ_ЗАРП))

 

(в) +

СЛУ1.СЛУ_ИМЯ
WHERE (СЛУ1.СЛУ_ИМЯ = ПРО.ПРОЕКТ_РУК)
AND FORALL СЛУ2 IF (СЛУ2.ПРО_НОМ = СЛУ1.ПРО_НОМ)
THEN EXISTS СЛУ3 (СЛУ2.СЛУ_ЗАРП > СЛУ3.СЛУ_ЗАРП))

 

3 (3) Какое из приведенных ниже выражений реляционного исчисления кортежей правильно соответствует запросу “выдать имена служащих и имена руководителей проектов, в которых они участвуют, для тех проектов, в которых хотя бы один из участников получает минимальную заплату среди всех участников всех проектов с тем же самым руководителем”?

 

(а) +

СЛУ1.СЛУ_ИМЯ, ПРО1.ПРОЕКТ_РУК
WHERE (СЛУ1.ПРО_НОМ = ПРО1.ПРО_НОМ)
AND FORALL ПРО2
IF (ПРО1.ПРОЕК_РУК = ПРО2.ПРОЕКТ_РУК)
THEN EXISTS СЛУ2 ((СЛУ2.ПРО_НОМ = СЛУ1.ПРО_НОМ)
AND FORALL СЛУ3 IF (СЛУ3.ПРО_НОМ = ПРО2.ПРО_НОМ)
THEN (СЛУ2.СЛУ_ЗАРП £ СЛУ3.СЛУ_ЗАРП))

 

(б) -

СЛУ1.СЛУ_ИМЯ, ПРО1.ПРОЕКТ_РУК
WHERE FORALL ПРО1 ((СЛУ1.ПРО_НОМ = ПРО1.ПРО_НОМ)
AND IF (ПРО1.ПРОЕК_РУК = ПРО2.ПРОЕКТ_РУК)
THEN EXISTS СЛУ2 ((СЛУ2.ПРО_НОМ = СЛУ1.ПРО_НОМ)
AND FORALL СЛУ3 IF (СЛУ3.ПРО_НОМ = ПРО2.ПРО_НОМ)
THEN (СЛУ2.СЛУ_ЗАРП £ СЛУ3.СЛУ_ЗАРП))

 

(в) -

СЛУ1.СЛУ_ИМЯ, ПРО1.ПРОЕКТ_РУК
WHERE (СЛУ1.ПРО_НОМ = ПРО1.ПРО_НОМ)
AND IF (ПРО1.ПРОЕК_РУК = ПРО2.ПРОЕКТ_РУК)
THEN EXISTS СЛУ2 ((СЛУ2.ПРО_НОМ = СЛУ1.ПРО_НОМ)
AND FORALL СЛУ3 IF (СЛУ3.ПРО_НОМ = ПРО2.ПРО_НОМ)
THEN (СЛУ2.СЛУ_ЗАРП £ СЛУ3.СЛУ_ЗАРП))

 

В следующих упражнениях мы будем считать, что определены доменные переменные, имена которых совпадают с именами атрибутов отношений СЛУЖАЩИЕ и ПРОЕКТЫ, а в случае, когда требуется несколько доменных переменных, определенных на одном домене, мы будем добавлять в конце имени цифры.

 

4 (1) Какое из приведенных ниже выражений реляционного исчисления доменов правильно соответствует запросу “выдать имена служащих и имена руководителей проектов, в которых они участвуют, для тех проектов, в которых хотя бы один из участников получает минимальную заплату среди всех участников всех проектов с тем же самым руководителем”?

 

(а) -

СЛУ_ИМЯ1, ПРОЕКТ_РУК1
WHERE FORALL ПРО_НОМ1
(СЛУЖАЩИЕ (СЛУ_ИМЯ:СЛУ_ИМЯ1, СЛУ_ЗАРП:СЛУ_ЗАРП1, ПРО_НОМ:ПРО_НОМ1)
AND ПРОЕКТЫ (ПРО_НОМ:ПРО_НОМ1, ПРОЕКТ_РУК:ПРОЕКТ_РУК)
AND IF ПРОЕКТЫ (ПРО_НОМ:ПРО_НОМ2, ПРОЕКТ_РУК:ПРОЕКТ_РУК)
THEN EXISTS СЛУ_ЗАРП2
(СЛУЖАЩИЕ (СЛУ_ЗАРП:СЛУ_ЗАРП2, ПРО_НОМ:ПРО_НОМ1)
AND FORALL СЛУ_ЗАРП3
IF (СЛУЖАЩИЕ (СЛУ_ЗАРП:СЛУ_ЗАРП3, ПРО_НОМ:ПРО_НОМ2)
THEN СЛУ_ЗАРП2 £ СЛУ_ЗАРП3))

 

(б) +

СЛУ_ИМЯ1, ПРОЕКТ_РУК1
WHERE СЛУЖАЩИЕ (СЛУ_ИМЯ:СЛУ_ИМЯ1, СЛУ_ЗАРП:СЛУ_ЗАРП1,
ПРО_НОМ:ПРО_НОМ1)
AND ПРОЕКТЫ (ПРО_НОМ:ПРО_НОМ1, ПРОЕКТ_РУК:ПРОЕКТ_РУК)
AND FORALL ПРО_НОМ2
IF ПРОЕКТЫ (ПРО_НОМ:ПРО_НОМ2, ПРОЕКТ_РУК:ПРОЕКТ_РУК)
THEN EXISTS СЛУ_ЗАРП2
(СЛУЖАЩИЕ (СЛУ_ЗАРП:СЛУ_ЗАРП2, ПРО_НОМ:ПРО_НОМ1)
AND FORALL СЛУ_ЗАРП3 IF
СЛУЖАЩИЕ (СЛУ_ЗАРП:СЛУ_ЗАРП3, ПРО_НОМ:ПРО_НОМ2)
THEN СЛУ_ЗАРП2 £ СЛУ_ЗАРП3)

 

(в) -

СЛУ_ИМЯ1, ПРОЕКТ_РУК1
WHERE СЛУЖАЩИЕ (СЛУ_ИМЯ:СЛУ_ИМЯ1, СЛУ_ЗАРП:СЛУ_ЗАРП1,
ПРО_НОМ:ПРО_НОМ1)
AND IF ПРОЕКТЫ (ПРО_НОМ:ПРО_НОМ1, ПРОЕКТ_РУК:ПРОЕКТ_РУК)
THEN EXISTS СЛУ_ЗАРП2
(СЛУЖАЩИЕ (СЛУ_ЗАРП:СЛУ_ЗАРП2, ПРО_НОМ:ПРО_НОМ1)
AND FORALL СЛУ_ЗАРП3 IF
СЛУЖАЩИЕ (СЛУ_ЗАРП:СЛУ_ЗАРП3, ПРО_НОМ:ПРО_НОМ2)
THEN СЛУ_ЗАРП2 £ СЛУ_ЗАРП3)

 

4 (2) Какое из приведенных ниже выражений реляционного исчисления доменов правильно соответствует запросу “выдать имена служащих, участвующих хотя бы в одном проекте, среди участников которого имеется хотя бы один служащий, получающий максимальную зарплату среди всех служащих”?

 

(а) +

СЛУ_ИМЯ

WHERE СЛУЖАЩИЕ (СЛУ_ИМЯ:СЛУ_ИМЯ, ПРО_НОМ:ПРО_НОМ)
AND EXISTS СЛУ_ЗАРП1 (СЛУЖАЩИЕ (СЛУ_ЗАРП:СЛУ_ЗАРП1, ПРО_НОМ:ПРО_НОМ)
AND FORALL СЛУ_ЗАРП2 (СЛУЖАЩИЕ (СЛУ_ЗАРП:СЛУ_ЗАРП2)
AND СЛУ_ЗАРП2 ³ СЛУ_ЗАРП1)

 

(б) -

СЛУ_ИМЯ

WHERE СЛУЖАЩИЕ (СЛУ_ИМЯ:СЛУ_ИМЯ, ПРО_НОМ:ПРО_НОМ)
AND FORALL СЛУ_ЗАРП1
IF СЛУЖАЩИЕ (СЛУ_ЗАРП:СЛУ_ЗАРП1, ПРО_НОМ:ПРО_НОМ)
THEN FORALL СЛУ_ЗАРП2 (СЛУ_ЗАРП2 ³ СЛУ_ЗАРП1)

 

(в) -

СЛУ_ИМЯ

WHERE СЛУЖАЩИЕ (СЛУ_ИМЯ:СЛУ_ИМЯ, ПРО_НОМ:ПРО_НОМ)
AND EXISTS СЛУ_ЗАРП1
(СЛУЖАЩИЕ (СЛУ_ИМЯ:СЛУ_ИМЯ, СЛУ_ЗАРП:СЛУ_ЗАРП1, ПРО_НОМ:ПРО_НОМ)
AND FORALL СЛУ_ЗАРП2
(СЛУЖАЩИЕ (СЛУ_ИМЯ:СЛУ_ИМЯ, СЛУ_ЗАРП:СЛУ_ЗАРП2, ПРО_НОМ:ПРО_НОМ)
AND СЛУ_ЗАРП2 ³ СЛУ_ЗАРП1)

 

4 (3) Какое из приведенных ниже выражений реляционного исчисления доменов правильно соответствует запросу “выдать имена руководителей проектов, ни один из участников которых не получает минимальную зарплату среди всех служащих”?

 

(а) -

СЛУ_ИМЯ

WHERE СЛУЖАЩИЕ (СЛУ_ИМЯ:СЛУ_ИМЯ, ПРО_НОМ:ПРО_НОМ)
AND ПРОЕКТЫ (ПРО_НОМ:ПРО_НОМ, ПРОЕКТ_РУК:СЛУ_ИМЯ)
AND FORALL СЛУ_ЗАРП1
(IF СЛУЖАЩИЕ (СЛУ_ЗАРП:СЛУ_ЗАРП1, ПРО_НОМ:ПРО_НОМ)
THEN FORALL СЛУ_ЗАРП2 (IF СЛУЖАЩИЕ (СЛУ_ЗАРП:СЛУ_ЗАРП2)
THEN СЛУ_ЗАРП1 > СЛУ_ЗАРП2))

 

(б) +

СЛУ_ИМЯ

WHERE СЛУЖАЩИЕ (СЛУ_ИМЯ:СЛУ_ИМЯ, ПРО_НОМ:ПРО_НОМ)
AND ПРОЕКТЫ (ПРОЕКТ_РУК:СЛУ_ИМЯ)
AND FORALL СЛУ_ЗАРП1
(IF СЛУЖАЩИЕ (СЛУ_ЗАРП:СЛУ_ЗАРП1, ПРО_НОМ:ПРО_НОМ)
THEN FORALL СЛУ_ЗАРП2 (IF СЛУЖАЩИЕ (СЛУ_ЗАРП:СЛУ_ЗАРП2)
THEN СЛУ_ЗАРП1 > СЛУ_ЗАРП2))

 

(в) -

СЛУ_ИМЯ

WHERE СЛУЖАЩИЕ (СЛУ_ИМЯ:СЛУ_ИМЯ, ПРО_НОМ:ПРО_НОМ)
AND ПРОЕКТЫ (ПРОЕКТ_РУК:СЛУ_ИМЯ)
AND FORALL СЛУ_ЗАРП1
(IF СЛУЖАЩИЕ (СЛУ_ЗАРП:СЛУ_ЗАРП1)
THEN FORALL СЛУ_ЗАРП2 (IF СЛУЖАЩИЕ (СЛУ_ЗАРП:СЛУ_ЗАРП2)
THEN СЛУ_ЗАРП1 > СЛУ_ЗАРП2))