Основой WFF являются простые условия, представляющие собой операции сравнения скалярных значений (значений атрибутов переменных или литерально заданных констант). Например, конструкции
СЛУЖАЩИЙ.СЛУ_НОМ = 2934 и
СЛУЖАЩИЙ.СЛУ_НОМ = ПРОЕКТ.ПРОЕКТ_РУК
являются простыми условиями. Первое условие принимает значение true в том и только в том случае, когда значение атрибута СЛУ_НОМ кортежной переменной СЛУЖАЩИЙ равно 2934. Второе условие принимает значение true в том и только в том случае, когда значения атрибутов СЛУ_НОМ и ПРОЕКТ_РУК переменных СЛУЖАЩИЙ и ПРОЕКТ совпадают.
По определению, простое сравнение является WFF, а WFF, заключенная в круглые скобки, представляет собой простое сравнение.
Более сложные варианты WFF строятся с помощью логических связок NOT, AND, OR и IF ... THEN1) с учетом обычных приоритетов операций (NOT > AND > OR) и возможности расстановки скобок. Так, если form – WFF, а comp – простое сравнение, то NOT form, comp AND form, comp OR form и IF comp THEN form являются WFF.
Для примеров воспользуемся отношениями СЛУЖАЩИЕ, ПРОЕКТЫ и НОМЕРА_ПРОЕКТОВ из предыдущей лекции (смотри рис. 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 |
Конечно, нужно представлять себе какой-нибудь способ реализации системы, которая сможет по заданной WFF при существующем состоянии базы данных произвести такой результат. И таким очевидным способом является следующий: в некотором порядке просмотреть область определения переменной и к каждому очередному кортежу применить условие.
Результатом будет то множество кортежей, для которых при вычислении условия производится значение true. Очевидно, что результат эквивалентен выполнению алгебраической операции СЛУЖАЩИЕ WHERE (NOT (СЛУЖАЩИЙ.СЛУ_ИМЯ = 'Иванов') OR (СЛУЖАЩИЙ.СЛУ_ЗАРП >= 22400.00 AND СЛУЖАЩИЙ.ПРО_НОМ = 1) над отношением, тело которого представляет собой область определения кортежной переменной.
Пусть имеется следующее определение кортежной переменной ПРОЕКТ:
RANGE ПРОЕКТ IS ПРОЕКТЫ
Вот еще пример правильно построенной формулы:
СЛУЖАЩИЙ.СЛУ_ИМЯ = ПРОЕКТ.ПРОЕКТ_РУК
Эта формула будет принимать значение true для следующих пар значений кортежных переменных СЛУЖАЩИЙ и ПРОЕКТ:
2934 | Иванов | 22400.00 | 1 | 1 | Иванов |
2934 | Иванов | 22400.00 | 2 | 1 | Иванов |
2941 | Иваненко | 22000.00 | 2 | 2 | Иваненко |
2934 | Иванов | 22400.00 | 1 | 1 | Иванов |
2941 | Иваненко | 22000.00 | 2 | 2 | Иваненко |