Таблицы бывают большими...
А ведь действительно, вскоре после начала эксплуатации любой базы данных составляющие ее таблицы быстро прибавляют в длине, и чем активнее работа, тем она больше. До этого времени я описывал в основном лишь то, каким образом эти таблицы создаются и какие подводные камни существуют при их проектировании. Теперь настала пора рассказать о том, как пользоваться этими таблицами, иначе какой от них прок?
Как вы сами понимаете, таблицы заполняются фактическими данными по мере их накопления. Если это база данных продаж автомобилей, то ее размер растет по мере увеличения числа счастливых владельцев новеньких авто. Если это база крупного универсального магазина, то ее информацией станут покупки разнообразных товаров. Однако при всем своем разнообразии практически все СУБД имеют одно свойство, их объединяющее, оно называется бессистемность. Какие бы данные ни фиксировались, они отсортированы лишь по времени их внесения в базу, то есть в таблицу. С точки зрения хранения данных эта тонкость не играет никакой роли. Правда, для отдела маркетинга этот нюанс является причиной большой головной боли. Представьте себе длинную, метра в два, распечатку недельных продаж такого магазина, как, например, "ДОМ ТОРГОВЛИ НА НЕМИГЕ", в которой среди нескольких десятков тысяч товарных позиций есть сотни две упоминаний о женских итальянских полуботинках из некрашеной кожи, а ваша задача заключается в том, чтобы определить - стоит ли продолжать продавать эти полусапожки или нет. Хотя в теории дело "проще пареной репы", на практике все обстоит куда сложнее, ибо крупицы полезной информации следует выловить из прорвы совершенно бесполезных данных. Считается, что для решения этой задачи нужно сконструировать специальный запрос и заставить Microsoft Access 97 его выполнить. Только зачем городить огород, когда можно ограничиться уже имеющимся в этой СУБД механизмом сортировки данных непосредственно в самой таблице?
Если не требуется ничего особо сложного, то самое эффективное решение -использовать два встроенных инструмента, которые представлены кнопками на инструментальной панели, на которых изображены две буквы "А" и "Я" в сочетании со стрелкой, направленной вверх или вниз. Эти инструменты называются Сортировка по возрастанию и Сортировка по убыванию. Полагаю, особо объяснять их смысл совершенно излишне. Первый переставляет записи с начала в конец, а второй - с конца к началу. Предположим, мне требуется рассортировать записи о проданных книгах в строгом соответствии с их жанровой принадлежностью. Результат покажет, какой из жанров пользуется наибольшим спросом у покупателей, а значит - какой из отделов целесообразно расширять в самую первую очередь. Чтобы получить желаемый результат, нужно выделить столбец, содержащий параметр, по которому следует отсортировать все записи, и нажать мышью на соответствующий инструмент: Сортировка по возрастанию или Сортировка по убыванию. В зависимости от выбранного варианта Microsoft Access 97 переставит строки, хотя, как вы сами понимаете, это касается лишь экранного отображения, но для пользователя разницы нет (см. рис. 1). Как видно из примера, программа отсортировала записи в порядке возрастания кода рубрики. Точно так же могут быть отсортированы текстовые строки в порядке чередования символов или, например, столбец с ценами. Однако этот слишком простой и примитивный механизм не позволяет сортировать сразу по нескольким параметрам или выбирать из общего массива лишь те записи, которые удовлетворяют некоторому условию.
Чтобы облегчить пользователю жизнь, разработчики Microsoft Access 97 предусмотрели такое свойство таблицы, как фильтр. Фильтр - это специальный механизм, позволяющий указать таблице, в соответствии с чем она должна делать вывод о необходимости вывода на экран той или иной записи. В определенном смысле фильтр есть тот же запрос, разве что значительно упрощенный, позволяющий отбирать записи по принципу подобия контрольного параметра. Вариантом фильтра может являться, например, такое правило: "из всех обувных кремов меня интересует лишь черный и строго торговой марки КИВИ". В соответствии с подобным правилом программа отфильтрует из всей таблицы, какой бы длинной та ни была, только удовлетворяющие ему строки. Делается это просто. Предположим, со временем наша таблица продаж книг настолько разрослась, что, как говорят профессионалы, "потеряла читабельность". Чтобы не тратить лишнее время на распечатывание и выписывание нужных строк, выяснить, сколько детективов продано, можно с помощью фильтра.
Как и в случае с сортировкой, сначала непременно требуется "сказать" программе, какое поле будет ключевым, в противном случае Microsoft Access 97 в качестве такового воспользуется тем, где в данный момент "стоит" маркер ввода. Попробуем выяснить, сколько и каких книг издательства "Вагриус" у нас было продано. Для этого кликаем по любому полю столбца " Издательство" и нажимаем правую клавишу мыши, что приводит к появлению на экране контекстно-зависимого меню (см. рис. 2), в котором выбираем режим ФИЛЬТР ПО ВЫДЕЛЕННОМУ. Microsoft Access 97 немедленно отфильтрует записи, сравнивая их с содержимым того поля, в котором находился маркер ввода, то есть мигающая вертикальная черта, обозначающая место, в которое будет вставляться информация с клавиатуры. По окончанию процесса (зависящего от скорости конкретного компьютера и размеров таблицы) таблица переменит свой внешний вид, и, вместо всех записей, в ней останутся лишь итоги фильтрации (см. рис. 3). Причем полученный результат является опять-таки лишь экранным, то есть на самом деле ни одной строки из таблицы никуда не пропало, и обладает всеми свойствами полноценной самостоятельной таблицы. Его можно продолжать фильтровать и сортировать уже по другому критерию. Например, отсортировать по параметру возрастания стоимости книг (см. рис. 4).
Когда нужда в отфильтрованных данных отпала, предположим, вы их распечатали и приложили к своему еженедельному отчету для вышестоящего начальства, таблице можно вернуть ее первозданный вид. Для этого достаточно опять поместить маркер ввода в любую ячейку и в меню, выводимом правой клавишей мыши, выбрать режим УДАЛИТЬ ФИЛЬТР. В мгновение ока все вернется на свои места.
Между прочим, процесс фильтрования можно применять не только в прямом направлении, то есть когда на экране остается лишь то, что соответствует условию, но и в обратном, то есть на экране остается то, что выбранному условию НЕ соответствует. Допустим, нас совершенно не интересует такой писатель, как Роберт Хайнлайн. Он и так мировая знаменитость, пользуется огромной популярностью и вопрос о приобретении его книг для торговли даже не обсуждается. Нас в данном случае интересуют лишь новые или малоизвестные авторы и желательно побыстрее. Для этого нужно поместить маркер ввода в ячейку с надписью Р. Хайнлайн, вызвать контекстно-зависимое меню и выбрать в нем режим ИСКЛЮЧИТЬ ВЫДЕЛЕННОЕ. Как вы можете убедиться, Microsoft Access 97, как вышколенный и пунктуальный цензор, за секунду полностью изымет из таблицы все строки, где в поле " Автор" упоминался многоуважаемый Хайнлайн. Результат опять же допускается дальше фильтровать и сортировать как того пожелает душа пользователя. И точно так же, как в первом случае, при помощи режима УДАЛИТЬ ФИЛЬТР все эти выкрутасы можно отменить, вернув таблицу с данными в исходное состояние.
Вы можете сказать: "Все это прекрасно, но каким образом при помощи фильтра можно отобрать записи, соответствующие условию не строго, например, те, в которых цена книги превышает десять рублей?" Действительно, обычный фильтр с подобной постановкой вопроса не справится, так как он оперирует строгим равенством, как это это было в примере с издательством ВАГРИУС и с писателем-фантастом Робертом Хайнлайном. Однако на этот случай существует фильтр, который называется ФИЛЬТР ДЛЯ. В контекстно-зависимом меню непосредственно с названием этого фильтра расположено белое поле ввода того параметра, для которого, собственно, фильтр и будет применяться. Только пользоваться им следует осмотрительно. Чтобы Microsoft Access 97 без понукания "поняла", к чему конкретно относится заданное пользователем условие, следует "попасть" маркером ввода в любую из ячеек интересующего его столбца. Так как заданный вопрос касается цены книг, то в данном примере маркер ввода размещается в любой ячейке столбца " Стоимость". Открыв контекстно-зависимое меню и выбрав режим ФИЛЬТР ДЛЯ, вам понадобится ввести в этом самом белом поле, которое расположено справа, интересующее вас условие в формате, понятном СУБД. Для нашего примера это комбинация символов "> 10" (см. рис. 5). Как только вы закончите и нажмете на клавиатуре кнопку " ВВОД", Microsoft Access 97 мгновенно выполнит пожелание (см. рис. 6). Как видите, из всего массива остались только семь строк, хранящих записи о книгах, чья цена превышала те самые десять рублей. Аналогичным образом, только в несколько приемов, из сколь угодно длинной таблицы можно сначала "выбросить" все, что превосходит верхнюю границу интервала (например, все марки стирального порошка, объем реализации которых за отчетный период превысил сто тонн), а к результату выборки применить фильтр, "отсекающий" все, что "не дотягивает" до нижней границы интервала (например, все марки стирального порошка, объем реализации которых за отчетный период оказался менее десяти килограмм). В итоге вы легко и быстро получите прекрасную выборку по тем "сыпучим моющим средствам", которые, так сказать, "ни то - ни се".
Таким образом, даже сама по себе, таблица является не только удобным хранилищем данных для последующих над ними операций, она показывает себя с весьма выгодной стороны в тех случаях, когда интересующая вас информация полностью находится в этой таблице, как это было в использованных мною примерах. Тут уж фильтры и сортировщики показывают себя во всей красе. Быстро и необременительно вы с помощью самого компьютера можете безошибочно отделить "семена от плевел". Правда, эта легкость несколько обманчива, и следует при первой же возможности "набить руку", так как неверно заданные условия приведут к получению неверного результата, ошибочность которого может оказаться неочевидной и быть вскрыта слишком поздно. Вот один простой пример: использованное ранее выражение "> 10", с точки зрения компьютера, означает строго больше десяти, то есть все, что равно десяти в выборку уже не попадет. Если удовлетворяющих условию значений окажется много, например более полутора экранов шрифта высотой в восемь-десять пунктов, то вы можете и не заметить сразу, что фильтр сработал "как-то не так", что вы хотели учесть и все, что "=10", а Microsoft Access 97 сию тонкость напрочь проигнорировала. Хотя правила машинной логики чрезвычайно просты по своей природе, они все же отличаются от логики человеческой, поэтому, во избежание ошибок, требуется определенный опыт и элементарная внимательность. Зато тогда не вы будете трудиться на компьютер, а он - на вас, что, согласитесь, куда приятнее.
Александр Запольскис
Как вы сами понимаете, таблицы заполняются фактическими данными по мере их накопления. Если это база данных продаж автомобилей, то ее размер растет по мере увеличения числа счастливых владельцев новеньких авто. Если это база крупного универсального магазина, то ее информацией станут покупки разнообразных товаров. Однако при всем своем разнообразии практически все СУБД имеют одно свойство, их объединяющее, оно называется бессистемность. Какие бы данные ни фиксировались, они отсортированы лишь по времени их внесения в базу, то есть в таблицу. С точки зрения хранения данных эта тонкость не играет никакой роли. Правда, для отдела маркетинга этот нюанс является причиной большой головной боли. Представьте себе длинную, метра в два, распечатку недельных продаж такого магазина, как, например, "ДОМ ТОРГОВЛИ НА НЕМИГЕ", в которой среди нескольких десятков тысяч товарных позиций есть сотни две упоминаний о женских итальянских полуботинках из некрашеной кожи, а ваша задача заключается в том, чтобы определить - стоит ли продолжать продавать эти полусапожки или нет. Хотя в теории дело "проще пареной репы", на практике все обстоит куда сложнее, ибо крупицы полезной информации следует выловить из прорвы совершенно бесполезных данных. Считается, что для решения этой задачи нужно сконструировать специальный запрос и заставить Microsoft Access 97 его выполнить. Только зачем городить огород, когда можно ограничиться уже имеющимся в этой СУБД механизмом сортировки данных непосредственно в самой таблице?
Если не требуется ничего особо сложного, то самое эффективное решение -использовать два встроенных инструмента, которые представлены кнопками на инструментальной панели, на которых изображены две буквы "А" и "Я" в сочетании со стрелкой, направленной вверх или вниз. Эти инструменты называются Сортировка по возрастанию и Сортировка по убыванию. Полагаю, особо объяснять их смысл совершенно излишне. Первый переставляет записи с начала в конец, а второй - с конца к началу. Предположим, мне требуется рассортировать записи о проданных книгах в строгом соответствии с их жанровой принадлежностью. Результат покажет, какой из жанров пользуется наибольшим спросом у покупателей, а значит - какой из отделов целесообразно расширять в самую первую очередь. Чтобы получить желаемый результат, нужно выделить столбец, содержащий параметр, по которому следует отсортировать все записи, и нажать мышью на соответствующий инструмент: Сортировка по возрастанию или Сортировка по убыванию. В зависимости от выбранного варианта Microsoft Access 97 переставит строки, хотя, как вы сами понимаете, это касается лишь экранного отображения, но для пользователя разницы нет (см. рис. 1). Как видно из примера, программа отсортировала записи в порядке возрастания кода рубрики. Точно так же могут быть отсортированы текстовые строки в порядке чередования символов или, например, столбец с ценами. Однако этот слишком простой и примитивный механизм не позволяет сортировать сразу по нескольким параметрам или выбирать из общего массива лишь те записи, которые удовлетворяют некоторому условию.
Чтобы облегчить пользователю жизнь, разработчики Microsoft Access 97 предусмотрели такое свойство таблицы, как фильтр. Фильтр - это специальный механизм, позволяющий указать таблице, в соответствии с чем она должна делать вывод о необходимости вывода на экран той или иной записи. В определенном смысле фильтр есть тот же запрос, разве что значительно упрощенный, позволяющий отбирать записи по принципу подобия контрольного параметра. Вариантом фильтра может являться, например, такое правило: "из всех обувных кремов меня интересует лишь черный и строго торговой марки КИВИ". В соответствии с подобным правилом программа отфильтрует из всей таблицы, какой бы длинной та ни была, только удовлетворяющие ему строки. Делается это просто. Предположим, со временем наша таблица продаж книг настолько разрослась, что, как говорят профессионалы, "потеряла читабельность". Чтобы не тратить лишнее время на распечатывание и выписывание нужных строк, выяснить, сколько детективов продано, можно с помощью фильтра.
Как и в случае с сортировкой, сначала непременно требуется "сказать" программе, какое поле будет ключевым, в противном случае Microsoft Access 97 в качестве такового воспользуется тем, где в данный момент "стоит" маркер ввода. Попробуем выяснить, сколько и каких книг издательства "Вагриус" у нас было продано. Для этого кликаем по любому полю столбца " Издательство" и нажимаем правую клавишу мыши, что приводит к появлению на экране контекстно-зависимого меню (см. рис. 2), в котором выбираем режим ФИЛЬТР ПО ВЫДЕЛЕННОМУ. Microsoft Access 97 немедленно отфильтрует записи, сравнивая их с содержимым того поля, в котором находился маркер ввода, то есть мигающая вертикальная черта, обозначающая место, в которое будет вставляться информация с клавиатуры. По окончанию процесса (зависящего от скорости конкретного компьютера и размеров таблицы) таблица переменит свой внешний вид, и, вместо всех записей, в ней останутся лишь итоги фильтрации (см. рис. 3). Причем полученный результат является опять-таки лишь экранным, то есть на самом деле ни одной строки из таблицы никуда не пропало, и обладает всеми свойствами полноценной самостоятельной таблицы. Его можно продолжать фильтровать и сортировать уже по другому критерию. Например, отсортировать по параметру возрастания стоимости книг (см. рис. 4).
Когда нужда в отфильтрованных данных отпала, предположим, вы их распечатали и приложили к своему еженедельному отчету для вышестоящего начальства, таблице можно вернуть ее первозданный вид. Для этого достаточно опять поместить маркер ввода в любую ячейку и в меню, выводимом правой клавишей мыши, выбрать режим УДАЛИТЬ ФИЛЬТР. В мгновение ока все вернется на свои места.
Между прочим, процесс фильтрования можно применять не только в прямом направлении, то есть когда на экране остается лишь то, что соответствует условию, но и в обратном, то есть на экране остается то, что выбранному условию НЕ соответствует. Допустим, нас совершенно не интересует такой писатель, как Роберт Хайнлайн. Он и так мировая знаменитость, пользуется огромной популярностью и вопрос о приобретении его книг для торговли даже не обсуждается. Нас в данном случае интересуют лишь новые или малоизвестные авторы и желательно побыстрее. Для этого нужно поместить маркер ввода в ячейку с надписью Р. Хайнлайн, вызвать контекстно-зависимое меню и выбрать в нем режим ИСКЛЮЧИТЬ ВЫДЕЛЕННОЕ. Как вы можете убедиться, Microsoft Access 97, как вышколенный и пунктуальный цензор, за секунду полностью изымет из таблицы все строки, где в поле " Автор" упоминался многоуважаемый Хайнлайн. Результат опять же допускается дальше фильтровать и сортировать как того пожелает душа пользователя. И точно так же, как в первом случае, при помощи режима УДАЛИТЬ ФИЛЬТР все эти выкрутасы можно отменить, вернув таблицу с данными в исходное состояние.
Вы можете сказать: "Все это прекрасно, но каким образом при помощи фильтра можно отобрать записи, соответствующие условию не строго, например, те, в которых цена книги превышает десять рублей?" Действительно, обычный фильтр с подобной постановкой вопроса не справится, так как он оперирует строгим равенством, как это это было в примере с издательством ВАГРИУС и с писателем-фантастом Робертом Хайнлайном. Однако на этот случай существует фильтр, который называется ФИЛЬТР ДЛЯ. В контекстно-зависимом меню непосредственно с названием этого фильтра расположено белое поле ввода того параметра, для которого, собственно, фильтр и будет применяться. Только пользоваться им следует осмотрительно. Чтобы Microsoft Access 97 без понукания "поняла", к чему конкретно относится заданное пользователем условие, следует "попасть" маркером ввода в любую из ячеек интересующего его столбца. Так как заданный вопрос касается цены книг, то в данном примере маркер ввода размещается в любой ячейке столбца " Стоимость". Открыв контекстно-зависимое меню и выбрав режим ФИЛЬТР ДЛЯ, вам понадобится ввести в этом самом белом поле, которое расположено справа, интересующее вас условие в формате, понятном СУБД. Для нашего примера это комбинация символов "> 10" (см. рис. 5). Как только вы закончите и нажмете на клавиатуре кнопку " ВВОД", Microsoft Access 97 мгновенно выполнит пожелание (см. рис. 6). Как видите, из всего массива остались только семь строк, хранящих записи о книгах, чья цена превышала те самые десять рублей. Аналогичным образом, только в несколько приемов, из сколь угодно длинной таблицы можно сначала "выбросить" все, что превосходит верхнюю границу интервала (например, все марки стирального порошка, объем реализации которых за отчетный период превысил сто тонн), а к результату выборки применить фильтр, "отсекающий" все, что "не дотягивает" до нижней границы интервала (например, все марки стирального порошка, объем реализации которых за отчетный период оказался менее десяти килограмм). В итоге вы легко и быстро получите прекрасную выборку по тем "сыпучим моющим средствам", которые, так сказать, "ни то - ни се".
Таким образом, даже сама по себе, таблица является не только удобным хранилищем данных для последующих над ними операций, она показывает себя с весьма выгодной стороны в тех случаях, когда интересующая вас информация полностью находится в этой таблице, как это было в использованных мною примерах. Тут уж фильтры и сортировщики показывают себя во всей красе. Быстро и необременительно вы с помощью самого компьютера можете безошибочно отделить "семена от плевел". Правда, эта легкость несколько обманчива, и следует при первой же возможности "набить руку", так как неверно заданные условия приведут к получению неверного результата, ошибочность которого может оказаться неочевидной и быть вскрыта слишком поздно. Вот один простой пример: использованное ранее выражение "> 10", с точки зрения компьютера, означает строго больше десяти, то есть все, что равно десяти в выборку уже не попадет. Если удовлетворяющих условию значений окажется много, например более полутора экранов шрифта высотой в восемь-десять пунктов, то вы можете и не заметить сразу, что фильтр сработал "как-то не так", что вы хотели учесть и все, что "=10", а Microsoft Access 97 сию тонкость напрочь проигнорировала. Хотя правила машинной логики чрезвычайно просты по своей природе, они все же отличаются от логики человеческой, поэтому, во избежание ошибок, требуется определенный опыт и элементарная внимательность. Зато тогда не вы будете трудиться на компьютер, а он - на вас, что, согласитесь, куда приятнее.
Александр Запольскис
Компьютерная газета. Статья была опубликована в номере 11 за 1999 год в рубрике soft :: субд