Смекни!
smekni.com

Замечание 3. Выше мы говорили о классической, двузначной логике, когда имеется всего два значения истинности ДА и НЕТ (употребляются еще и другие обозначения, скажем ИСТИНА и ЛОЖЬ или TRUE и FALSE). Кроме двузначной логики в принципе можно рассматривать и другие логики, например трехзначную, в которой кроме ДА и НЕТ есть еще и третье значение – НЕИЗВЕСТНО (в Access оно обозначается как Null). На самом деле в Access реализована некая мешанина из двузначной и трехзначной логики. Оговоримся сразу, что мы не рекомендуем учителю выходить за рамки классической логики. Тем не менее, для полного понимания работы Access нам придется коснуться и трехзначной логики.

Наличие в Access трехзначной логики связано с тем, что в таблицах Access допускаются пустые клетки (так называемые Null-значения). Например, таблица ЗНАКОМЫЕ может выглядеть так:

Фамилия Имя Отчество
Иванов Петр

(Отчество Иванова мы не знаем.)

Спрашивается, как должна такая БД отвечать на запрос “Верно ли, что у Петра Иванова отчество – Сергеевич?” Ясно, что ни ДА, ни НЕТ тут не подходит. Необходимо ввести третье значение.

Надо сказать, что попытки ввести в БД Null-значения и трехзначную логику многим авторам представляются неуместными. Вот что говорит по этому поводу известный специалист в области БД К.Дейт в своей последней монографии. “Автор данной книги разделяет мнение многих других авторов о том, что null-значения и трехзначная логика являются ошибочными понятиями и им нет места в число формальных системах, подобных реляционной модели.” ([4], стр. 544).

На наш взгляд, забивать школьнику голову трехзначной логикой и Null-значениями при изучении Access не стоит. Дай Бог ему разобраться с обычной, двузначной логикой.

Мы рекомендуем ограничиться случаем, когда таблицы не имеют пустых клеток. Можно даже установить значение ДА параметра Свойства поля/Обязательное поле. В этом случае Access будет сам следить, чтобы все клетки были заполнены. Тогда пользователь гарантирован ото всех неприятностей, связанных с Null-значениями.

Замечание 4. Обычно логику определяют как науку о правильных рассуждениях ([1, 3, 5, 9]). На наш взгляд, это не совсем верно. В вычислительной науке и, в особенности, в теории баз данных на первый план выходит другой аспект. Здесь логика используется как формальная модель естественного языка. На это, конечно, можно возразить, что язык и мышление тесно связаны. Но ведь мышление отнюдь не сводится к дедуктивным (т.е. основанным на доказательствах) методам.

Пусть логическое выражение Х не содержит атрибутов, кроме х1, х2, … , хк. Придав этим атрибутам некоторые значения, мы, тем самым, придаем числовые значения всем арифметическим выражениям, входящим в Х. Выполнив соответствующие сравнения, мы узнаем значения всех атомов, входящих в Х. Далее, с помощью таблиц истинности, мы можем вычислить и значение выражения Х.

Теперь пусть у нас есть кортеж К с атрибутами х1, х2, … , хк. Он сопоставляет каждому из этих атрибутов некоторое число. Следовательно, он обращает выражение Х либо в ИСТИНУ, либо в ЛОЖЬ.

Итак, мы доказали следующее утверждение.

Теорема 1. Пусть Х логическое выражение, не содержащее атрибутов, кроме х1, х2, …, хк, а К - кортеж с атрибутами х1, х2, … , хк. Тогда выражение Х либо истинно, либо ложно.

В первом случае мы говорим, что выражение Х ИСТИННО на кортеже К, а во втором – что оно ЛОЖНО.

Таким образом, логическое выражение можно трактовать как функцию, перерабатывающую кортеж в одно из двух значений ИСТИНА или ЛОЖЬ.


Теорема 1 позволяет использовать логические выражения в качестве фильтров. Каждое такое выражение будет выбирать из таблицы те кортежи, на которых оно истинно.

Как задать фильтр?

Теперь переходим к процедурной части. Чтобы посмотреть фильтр (если он есть), нужно открыть соответствующую таблицу в режиме конструктора и выполнить команду “Свойства” меню Вид или контекстного меню. Откроется окно “Свойства таблицы”, в котором есть строка “Фильтр”.


Установив курсор в поле Фильтр, вы можете распахнуть его с помощью комбинации Shift+F2.


Если фильтра еще нет, то вы можете создать его прямо в этом окне. Там же можно и корректировать его.

Однако, это не единственный способ задания фильтра. Вы можете воспользоваться также специальным окном “Фильтр”, вызываемым командой Записи½ Фильтр½ Расширенный фильтр.



В окне “Фильтр” находится бланк QBE.


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

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

Этот бланк удобно применять, если фильтр имеет некоторый специальный вид, о котором мы сейчас поговорим. Это так называемая дизъюнктивная нормальная форма (сокращенно – ДНФ). Она заслуживает внимание не только в связи с изучением Access, и поэтом мы уделим ей особое внимание.

Вот примеры выражений в ДНФ (мы будем для краткости называть их ДНФ-выражениями).

(Вес = 2 AND NOT (Высота >3) AND Ширина <4) OR (Вес = 3 AND Высота >5 AND NOT (Ширина <7)) OR (Вес >4 AND Высота >6 AND Ширина <8)

(Возраст >80 AND NOT (Зарплата <100)) OR (NOT (Возраст >80) AND Зарплата <100)

А вот примеры выражений не в ДНФ.

NOT ((Возраст >80 AND NOT (Зарплата <100)) OR (NOT (Возраст >80) AND Зарплата <100))

(Возраст >80 OR NOT (Зарплата <100)) AND (NOT (Возраст >80) AND Зарплата <100)

Формально ДНФ- выражения определяются так.

Определение 3. AND-выражением назовем всякое логическое выражение вида (Х1 AND Х2 AND … AND Хк), где Х1, Х2, … , Хк – либо атомы, либо их отрицания. ДНФ-выражением назовем всякую дизъюнкцию AND-выражений.

Напомним, что у нас все атомы имеют вид хq Т, где где х – атрибут, Т – арифметическое выражение, а q - один из символов сравнения. Поэтому всякое ДНФ-выражение имеет вид

(a 11 х1 q 11 Т11 AND a 12 х2 q 12 Т12 AND …) OR

(a 21 х1 q 21 Т21 AND a 22 х2 q 22 Т22 AND …) OR …

где где хi – атрибуты, Тij – арифметические выражения, а q ij - символы сравнения.

На бланке QBE этот фильтр будет выглядеть так.

Поле х1 х2
Условие отбора a 11 q 11 Т11 a 12 q 12 Т12
Или a 21 q 21 Т21 a 22 q 22 Т22

Например, фильтр

(Вес = 2 AND NOT (Высота >3) AND Ширина <4) OR (Вес = 3 AND Высота >5 AND NOT (Ширина <7)) OR (Вес >4 AND Высота >6 AND Ширина <8)

на бланке QBE будет выглядеть так.

Поле Вес Высота Ширина
Условие отбора = 2 NOT >3 <4
Или = 3 >5 NOT <7
>4 >6 <8

Кстати, отметим, что знак равенства на бланке QBE можно опускать.

Конечно, приведенное выше описание записи фильтра на бланке QBE несколько громоздко, и, возможно, будет понятно не каждому школьнику. Но все же, мы считаем, что его надо привести. Мы считаем, что каждый школьник (а тем более – учитель) имеет право знать точное определение, поэтому оно должно присутствовать в учебнике.

Для сравнения можно привести изложение того же материала в учебнике Шафрина. Говоря о запросах, он так поясняет бланк QBE. “Условные выражения, набранные в разных столбцах строки Условие отбора …по умолчанию соединяются между собой знаком AND. Например, если соседние столбцы имеют имена Балл и Код, и вы набираете в них =5 и > 18, то тем самым вы сформулировали логическое выражение [ Балл] =5 AND [ Код] > 18.

Условные выражения, набранные в соседних строках одного и того же столбца, соединяются между собой знаком OR. Например, если столбец имеет имя Балл и набрали в строке Условие отбора: =8, а в строке Или: =12, то тем самым вы сформулировали логическое выражение [ Балл] =5 OR [ Балл] =12.” ([ Ш] , стр. 614).

Это, конечно, верно. Но отсюда нельзя понять, как записать на бланке, скажем, выражение [ Балл] =5 OR [ Код] > 18. Мы считаем, что примеры должны не заменять точных определений, а дополнять их. (Правда, еще раз подчеркнем, что мы не претендуем на формализацию Access в полном объеме. Мы предлагаем формально описать лишь некоторый его фрагмент).