На наш взгляд, этот текст обладает одним существенным изъяном. Авторы объясняют, какие кнопки и в какой последовательности нажимать, а вот для чего это делать, что получится в результате – не ясно. Что означают слова “группировать …, т.е. отбирать записи по условию”? Что, группировка и отбор – это синонимы? И затем, по какому условию отбирать? Сначала говорится, что в фильтре задается несколько условий отбора, а потом - что в результате отбираются записи, которые удовлетворяют одному условию. Что это за условия, как из нескольких условий получается одно, авторы не разъясняют.
Конечно, если школьник пришел на урок информатики, чтобы поиграть на компьютере, или посмотреть “прикольные” картинки, если “болтовню” учителя он привык пропускать мимо ушей, то ему и так сойдет. Ну, а если он задумается над словами учителя? Что он поймет из такого объяснения?
Ю.Шафрин определяет фильтр так. “Совокупность условий (логическое выражение) которую указывает пользователь для выделения некоторого подмножества строк таблицы в реляционной базе данных. Частный случай запроса” (стр. 671).
Как мы видим, и здесь наблюдается некая коллизия единственного и множественного числа. С одной стороны – много условий, а с другой – одно логическое выражение. Опять неясно, как из многих условий получается одно логическое выражение.
Обратимся к “фирменным” источникам. Надо сказать, что фирма Microsoft очень не любит разрешать пользователям копаться в “подводной части айсберга”. Она пространно объясняет, как с данным понятием работать, но неохотно и крайне невнятно объясняет, что же это понятие означает.
Help определяет фильтр так. “Набор условий, применяемых для отбора подмножества записей или для сортировки записей. В Microsoft Access существуют фильтры четырех типов: фильтр по выделенному фрагменту, обычный фильтр, расширенный фильтр и фильтр по вводу.” В свою очередь, условие отбора определяется как “набор ограничительных условий, например, = "Россия" (означающее, что требуется строковое значение "Россия") или > 30000, используемых для вывода определенного набора записей при создании запроса или фильтра.”
Итак, фильтр - это набор (или даже набор наборов) условий вида = "Россия" или > 30000. И что это такое? Ну, искушенный читатель (или пользователь) может догадаться, что на самом деле речь идет об условиях вида Х= "Россия" или У> 30000, где Х и У - это, скорее всего, атрибуты. Но что значит “набор”? Просто совокупность таких условий? Нет, скажет вдумчивый ученик, тут что-то не так. Это все равно, что сказать, что дом - это совокупность кирпичей. Но ведь все дело в том, как эти кирпичи (или условия) связаны! Скажем, Х= "Россия" AND У> 30000 - это одно, а Х= "Россия" OR У> 30000 – совсем другое.
Примерно на таком же уровне определяется фильтр и во “взрослой” литературе.
В справочнике [2] на стр. 191 говорится: “Фильтр – это набор условий, которые можно применить к данным. Применение другого фильтра к результату предыдущего дополнительно урезает результирующий набор данных.” В том же справочнике на стр. 395 фильтр определяется так. “Режим, позволяющий отображать только некоторые записи таблицы. В программе Access с помощью фильтра можно также отсортировать информацию. В отличии от запросов, фильтры не являются объектами, и не появляются в окне базы данных.”
Так что же такое фильтр: режим или набор условий? Ни то, ни другое. Оказывается это – нечто!
“Фильтр – нечто, отсеивающее определенные элементы, - одно или несколько условий, которым должна удовлетворять запись, чтобы попасть на экран.” ([8], стр. 72)
На самом деле фильтр – это просто логическое выражение. Фильтрация таблицы – это отбор тех кортежей, для которых соответствующее выражение истинно.
Здесь мы согласны с Ю.Шафриным, определяющим фильтр как логическое выражение. Нужно только пояснить, как оно строится из пресловутых “условий”. Но прежде нам придется вспомнить, что такое арифметическое выражение.
Арифметические и логические выражения
Help определяет выражение так. “Любая комбинация операторов, констант, значений текстовых констант, функций, имен полей, элементов управления или свойств, результатом которой является конкретное значение.”
Нас такое определение не устраивает. Оно не конструктивно. Мы хотели бы, чтобы по виду текста можно было бы узнать, является ли оно выражением. А как узнать, является ли результатом данной комбинации “конкретное значение”?
Попробуем найти более конструктивное определение. Чтобы не загромождать изложение непринципиальными деталями, мы ограничимся случаем, когда в таблице все атрибуты – числовые (т.е. в клетках таблицы могут стоять только числа).
Как арифметические, так и логические выражения строятся из неких “кирпичей” с помощью определенного набора операций. В случае арифметических выражений “кирпичами” служат числа и атрибуты (других “кирпичей” мы для простоты не рассматриваем), а соединяют их обычные арифметические операции. Формально арифметические выражения определяются так.
1. Всякое число или атрибут есть арифметическое выражение.
Символы +, -, *, / и ** интерпретируются, соответственно, как операции сложения, вычитания, умножения, деления и возведения в степень.
Вот примеры арифметических выражений: 7, х, 2+2, 2*(х+3).
Имея формальное определение, мы можем доказать, что, скажем, выражение 2*(х+3) является арифметическим. Действительно, согласно правилу 1, выражения х и 3 являются арифметическими. Отсюда, по правилу 2, следует, что выражение (х+3) тоже является арифметическим. По правилу 1, выражение 2 – арифметическое. Значит, по правилу 2, и выражение 2*(х+3) - арифметическое. В этом смысле приведенное определение конструктивно.
Переходим к определению логических выражений. Мы будем считать, что “кирпичи” логических выражений имеют вид хq Т, где х – атрибут, Т – арифметическое выражение, а q - один из символов сравнения: = (равно), <> (не равно), < (меньше) или > (больше). Соединяются они при помощи логических операций AND, OR и NOT.
Как и для арифметических выражений, мы хотим дать формальное определение. Сначала определим простейшие логические выражения, или атомы.
Определение 1. Пусть х – атрибут, Т – арифметическое выражение. Тогда выражения х=Т, х<>Т, х<Т и х>Т являются атомами.
Теперь можно формально определить логические выражения. Мы будем обозначать их большими латинскими буквами.
Определение 2.
1. Всякий атом есть логическое выражение.
Вот примеры арифметических выражений: (NOT х = 7), (х = 2+2, AND у > 2*(х+3)).
Замечание 1. На практике при записи формул можно во многих случаях опускать скобки, что мы и будем делать без особых оговорок.
Теперь переходим к значениям выражений. Значениями арифметических выражений являются числа, а значениями логических выражений – Истина и Ложь.
Если мы знаем значения всех атрибутов, входящих в выражение, то мы можем вычислить и значение самого выражения. Скажем, если значение х и у есть, соответственно, 7 и 8, то значением выражения (х+2*у) есть 23. Значением атома х=(х+2*у) будет Ложь, потому что на самом деле 7 не равно 23.
Ну, а как вычислять значений логических выражений, не являющихся атомами?
Для этого служат так называемые таблицы истинности. Они позволяют вычислить значение логического выражения, если известны значения его подвыражений. Вот например таблица истинности для операции AND.
Х | У | Х AND У |
Истина | Истина | Истина |
Истина | Ложь | Ложь |
Ложь | Истина | Ложь |
Ложь | Ложь | Ложь |
Она показывает, как, зная значения выражений Х и У, вычислить значение выражения (Х AND У).
А вот таблицы истинности для OR и NOT:
Х | У | Х OR У |
Истина | Истина | Истина |
Истина | Ложь | Истина |
Ложь | Истина | Истина |
Ложь | Ложь | Ложь |
Х | NOT Х |
Истина | Ложь |
Ложь | Истина |
Зная значения атомов, вы можете с помощью этих таблиц вычислить значение любого выражения, построив для него свою таблицу истинности. В качестве примера построим такую таблицу для выражения NOT (Х OR У)
Х | У | Х OR У | NOT(Х OR У) |
Истина | Истина | Истина | Ложь |
Истина | Ложь | Истина | Ложь |
Ложь | Истина | Истина | Ложь |
Ложь | Ложь | Ложь | Истина |
Замечание 2. С подобными конструкциями мы встречаемся в естественных языках, например в русском. Там аналогами логических выражений являются повествовательные предложения, аналогами атомов – простые повествовательные предложения, а аналогами логических операций – слова И, ИЛИ, НЕТ и др. Конечно, аналогия здесь далеко не полная, но все же она позволяет понять основные идеи алгебры логики.
В самом деле, когда истинно предложение “На улице потемнело ИЛИ у меня устали глаза”? Когда истинно хотя бы одно из предложений “На улице потемнело” или “у меня устали глаза”. Таким образом, в данном случае ИЛИ действует аналогично операции OR (правда, в других фразах ИЛИ может употребляться в другом смысле). Точно так же союз И можно считать аналогом операции AND. Например, фраза “Вдруг заиграла музыка И в зал вошла она” истинна если и только истинны обе ее составные части: “вдруг заиграла музыка” и “в зал вошла она”. НЕ или НЕТ часто выступает аналогом операции NOT. Скажем предложение “я НЕ знаю этого человека” истинно в точности в тех случаях, когда ложна фраза “я знаю этого человека”. Вообще, язык алгебры логики можно рассматривать как попытку формализовать естественный язык.