ЗАРП_НЕ_22000
ЗАРП_БОЛЬШЕ_20000
ЗАРП_20000
СЛУЖАЩИЕ_1
СЛУ_НОМЕР | СЛУ_ИМЯ | СЛУ_ЗАРП | РУК_НОМ |
Иванов | 22000.00 | ||
Петров | 30000.00 | ||
Сидоров | 18000.00 | ||
Федоров | 20000.00 | ||
Иванова | 22000.00 | ||
Сидоренко | 18000.00 | ||
Федоренко | 20000.00 | ||
Иваненко | 22000.00 |
СОТР_ЗАРП |
20000.00 |
СЛУЖАЩИЕ_1 <AND> ЗАРП_20000
СЛУ_НОМЕР | СЛУ_ИМЯ | СЛУ_ЗАРП | РУК_НОМ |
Федоров | 20000.00 | ||
Федоренко | 20000.00 |
Рис. 4.8. Выражение WHERE (a = const) через <AND>
Если требуется найти служащих, получающих заработную плату в размере, большем 20000.00 руб., то возьмем отношение ЗАРП_БОЛЬШЕ_20000(рис. 4.9)**. Тогда снова результат операции СОТРУДНИКИ_1<AND> ЗАРП_БОЛЬШЕ_20000.00будет совпадать с результатом операции СОТРУДНИКИ_1 WHERE СОТР_ЗАРП> 20000.00(рис. 4.9).
СОТР_ЗАРП |
22000.00 |
30000.00 |
СЛУЖАЩИЕ_1 <AND> ЗАРП_БОЛЬШЕ_20000
СЛУ_НОМЕР | СЛУ_ИМЯ | СЛУ_ЗАРП | РУК_НОМ |
Иванов | 22000.00 | ||
Петров | 30000.00 | ||
Иванова | 22000.00 | ||
Иваненко | 22000.00 |
Рис. 4.9. Выражение WHERE (a > const) через <AND>
Понятно, что аналогичным образом выражаются через <AND> операции ограничения с условиями вида a comp_op const, в которых comp_op является “<”, “³” или “£”. Некоторый особый случай представляет условия вида a ¹ const, и мы проиллюстрируем этот случай на примере запроса “Выбрать всех служащих, не получающих заработную плату в размере 22000.00 руб.”. Возьмем отношение ЗАРП_НЕ_22000(рис. 4.10)*. Результат операции СЛУЖАЩИЕ_1<AND> ЗАРП_НЕ_22000будет совпадать с результатом операции СЛУЖАЩИЕ_1 WHERE СЛУ_ЗАРП¹ 22000.00 (рис. 4.10).
СЛУ_ЗАРП |
18000.00 |
20000.00 |
30000.00 |
СЛУЖАЩИЕ_1 <AND> ЗАРП_НЕ_22000
СЛУ_НОМЕР | СЛУ_ИМЯ | СЛУ_ЗАРП | РУК_НОМ |
Петров | 30000.00 | ||
Сидоров | 18000.00 | ||
Федоров | 20000.00 | ||
Сидоренко | 18000.00 | ||
Федоренко | 20000.00 |
Рис. 4.10. Выражение WHERE (a ¹ const) через <AND>
Теперь обратимся к ограничениям с простым условием вида a comp-op b. Опять начнем со случая, когда comp-op = “=”. Предположим, что нам требуется найти данные о служащих, являющихся руководителями проектов, т.е. выполнить операцию СЛУЖАЩИЕ_1 WHERE СЛУ_НОМЕР= РУК_НОМ.Утверждается, что результат этой операции совпадает с результатом следующего выражения*:
СЛУЖАЩИЕ_1<AND> ((((СЛУЖАЩИЕ_1<REMOVE> СЛУ_НОМЕР) <REMOVE> СЛУ_ИМЯ) <REMOVE> СЛУ_ЗАРП) <RENAME> (РУК_НОМ,СЛУ_НОМЕР))
Результат вычисления правого операнда операции < AND> и окончательный результат операции показаны на рис. 4.11.
(((СЛУЖАЩИЕ_1<REMOVE> СЛУ_НОМЕР) <REMOVE> СЛУ_ИМЯ) <REMOVE> СЛУ_ЗАРП) <RENAME> (РУК_НОМ,СЛУ_НОМЕР)
СЛУ_НОМЕР |
СЛУЖАЩИЕ_1<AND> ((((СЛУЖАЩИЕ 1<REMOVE> СЛУ_НОМЕР) <REMOVE> СЛУ_ИМЯ) <REMOVE> СЛУ_ЗАРП)
<RENAME> (РУК_НОМ,СЛУ_НОМЕР))
СЛУ_НОМЕР | СЛУ_ИМЯ | СЛУ_ЗАРП | РУК_НОМ |
Иванов | 22000.00 | ||
Иваненко | 22000.00 |
Рис. 4.11. Выражение WHERE (a = b) через <REMOVE>, <RENAME> и <AND>
Конечно же, можно выразить операцию СЛУЖАЩИЕ_1 WHERE СЛУ_НОМЕР= РУК_НОМ через операцию <AND> и используя “константное” отношение. Для этого можно воспользоваться отношением СЛУ_НОМЕР_РУК_НОМ, показанным на рис. 4.12**. Легко видеть, что в результате выполнения операции СЛУЖАЩИЕ_1<AND> СЛУ_НОМЕР_РУК_НОМ будет получен тот же результат, как и показанный на рис. 4.11.
СЛУ_НОМЕР | РУК_НОМ |
Рис. 4.12. Константное отношение СЛУ_НОМЕР_РУК_НОМ
Чтобы показать возможность выполнения операции ограничения вида r WHERE (a > b), предположим, что имеется отношение СЛУЖАЩИЕ_2{СЛУ_НОМЕР,СЛУ_ИМЯ,СЛУ_ЗАРП,СЛУ_ПРЕМ} (рис. 4.12), причем атрибут СЛУ_ПРЕМсодержит значения премиального вознаграждения служащего. Естественно, атрибуты СЛУ_ЗАРПи СЛУ_ПРЕМ определены на одном и том же домене (напомним, что в целях наших примеров, мы предполагаем, что множество значений доменов ограничено значениями, содержащимися в теле примерного отношения). Пусть нас интересуют данные о служащих, получающие премиальные вознаграждения в размере, превышающим размер основной зарплаты, т.е. нам нужен результат операции СЛУЖАЩИЕ_2WHERE (СЛУ_ПРЕМ> СЛУ_ЗАРП).
Возьмем отношение ПРЕМ_БОЛЬШЕ_ЗАРП{СЛУ_ПРЕМ,СЛУ_ЗАРП}, тело которого включает все соответствующие заголовку кортежи {b, s} такие, что b > s. Другими словами, отношение ПРЕМ_БОЛЬШЕ_ЗАРПснова является литеральной константой типа отношения с двумя атрибутами СЛУ_ПРЕМ и СЛУ_ЗАРП. Конечно, даже в случае нашего примера мощность тела этого отношения достаточно велика*. Тело отношения ПРЕМ_БОЛЬШЕ_ЗАРПпоказано в средней части рис. 4.13.
Результат выполнения операции СЛУЖАЩИЕ_2<AND> ПРЕМ_БОЛЬШЕ_ЗАРПпоказан в нижней части рис. 4.13. Легко видеть, что он совпадает с результатом операции СЛУЖАЩИЕ_2WHERE (СЛУ_ПРЕМ> СЛУ_ЗАРП).