Арифметические операторы, как следует из названия, выполняют сложение, вычитание, умножение и деление. Арифметические операторы оперируют только с числовыми значениями и должны, за исключением
унарного минуса,
иметь два числовых операнда.
В табл. 4.2 приведен список арифметических операторов для выражений Access.
Функция так же, как и идентификатор, используется для возвращения значения в точку вызова. Значение, возвращаемое функцией, определяется ее типом, например функция NOW () возвращает дату и время часов компьютера. Синтаксически функция выделяется круглыми скобками, следующими сразу же за ее идентификатором. Многие функции требуют наличия аргументов, которые записываются в этих скобках через запятую при обращении к функции. Функции можно использовать для создания нового выражения или функции.
(Об использовании функций рассказывается в гл. 13.)
Встроенные в Access функции можно сгруппировать по следующим категориям (забегая вперед, скажем, что именно так они сгруппированы в специальном инструменте, помогающем правильно создавать сложные выражения, который называется Построитель выражений (Expression Builder)).
Статистические функции по подмножествам записей—
это те же статистические функции SQL, но работающие по большей части с вычисляемыми значениями, а не со значениями, содержащимися в полях запросов.
Примером статистической функции SQL является stDev(), а соответствующей ей статистической функцией по подмножеству записей— DStDevf). Обе они вычисляют стандартное отклонение для заданного множества значений.
Замечание
Еще раз обратим внимание, что описание всех функций (а их более 100) с подробными примерами выходит за рамки этой книги, тем более что справочная система Access и VBA предлагает развернутое изложение использования каждой функции, сопровождаемое примерами. При необходимости применения в дальнейшем изложении какой-либо незнакомой функции мы будем стараться кратко описать ее назначение и применение.
Глава 4. Отбор и сортировка записей с помощью запросов Запросы и фильтры Создание простого запроса с помощью Мастера запросов Создание и изменение запроса с помощью Конструктора запросов Создание вычисляемых полей в запросах Виды соединений Внутреннее соединение Внешнее соединение Рекурсивное соединение Запросы с параметрами Создание запроса из фильтра Выполнение запроса Изменение данных в результирующем множестве запроса Печать результатов запроса Передача результатов запроса в другие приложения Использование выражений в запросах Выражения в Access Арифметические операторы Операторы присваивания и сравнения Логические операторы Операторы слияния строковых значений (конкатенации) Операторы идентификации Операторы сравнения с образцом Идентификаторы объектов Константы Функции Создание выражений с помощью Построителя выражений Выводы |
Любой объект Access имеет имя, по которому его можно однозначно идентифицировать в некоторой системе объектов. Кроме обозначения коротким именем объекта, идентификатор можно обозначить
квалифицированным
(или
полным}
именем, когда объект идентифицируется как один из объектов в семействе объектов. В этом случае имя идентификатора состоит из
имени семейства
(класс объекта), отделенного от
присвоенного имени
(имени объекта) восклицательным знаком или точкой (символами операции идентификации "!" и "."). Поэтому имена объектов не должны содержать символов "!" и "." В SQL разделитель имен объектов — точка, в Access для разделения имен таблиц и имен полей используется "!", а точка разделяет объекты и их свойства. Используя идентификаторы, можно возвращать значения полей в объекты форм и отчетов, а также строить новые выражения.
Пример идентификаторов объектов в базе данных "Борей" (Northwind):
[Заказы]![ДатаНазначения]
идентификатор поля "ДатаНазначения", находящегося в таблице "Заказы" (Orders).
При работе с объектами Access очень широко -используются
выражения.
Примеры простых выражений приводились ранее, например при вводе условий на значение поля в таблице
(см. "Работа с таблицами" гл. 2).
Выражения активно используются в запросах для описания критериев выборки записей, как уже упоминалось раньше в данной главе. В дачьнейших главах книги при описании объектов Access мы будем постоянно указывать, где и как могут использоваться выражения. В этом разделе мы опишем правила создания выражений в Access, которые должны использоваться в дальнейшем во всех случаях применения выражений.
Когда результат запроса отображается в виде таблицы, возникает желание не только просматривать, но и изменять данные в этой таблице. Поскольку эта таблица является виртуальной, на самом деле редактирование полей запроса означает редактирование полей в таблицах, на основе которых строился запрос. Однако такое редактирование не всегда возможно, и при попытке изменить значение некоторого поля вы можете получить сообщение, что данные в запросе не являются обновляемыми, или просто звуковой сигнал. В настоящем разделе мы рассмотрим условия, при которых данные в запросе могут обновляться.
Является ли запрос обновляемым, можно достаточно легко обнаружить визуально: при отображении результатов запроса в конце записей должна быть пустая строка, которая помечена значком звездочки (*) в области выделения записи слева. Тогда в эту строку можно вводить данные, которые создадут новую запись. Если такая строка отсутствует, добавлять записи в запрос и изменять поля запроса нельзя.
Любой запрос имеет два свойства:
Уникальные значения
(Unique Values) и
Уникальные записи
(Unique Rows). Свойство
Уникальные записи
(Unique Row) исключает из результирующего набора дублированные записи, т. е. в результат запроса будут включены записи, которые имеют уникальные значения хотя бы в одном из полей. Свойство
Уникальные значения
(Unique Values) требует включения в результирующий набор только тех записей, которые имеют уникальные значения во всех полях. Значения этих свойств не могут одновременно быть равными Да (Yes), хотя оба могут иметь значения
Нет
(No). Значения этих свойств могут устанавливаться в окне свойств запроса. Большинство запросов, свойство
Уникальные записи
(Unique Row) которых имеет значение Да (Yes), могут использоваться для обновления данных. Запросы, свойство
Уникальные значения
(Unique Values) которых имеет значение Да (Yes), не допускают ни обновления имеющихся в них записей, ни добавления новых.
Вы не сможете добавлять и изменять записи в запросах, если:
Условия, при которых можно добавить или обновить записи в запросе:
Замечание
В таблице "один", связанной с другой таблицей отношением "один-ко-многим", можно изменять поля только в том случае, если ни одно поле таблицы "многие" не включено в результат запроса, а используется только для отбора записей.
В этом разделе описываются константы в их явном представлении. Кроме явного представления константы могут быть именованными. Именованные константы создаются пользователем и используются в программах на Visual Basic для приложений (VBA). Кроме того, Access имеет много встроенных констант, имена которых рассматриваются как зарезервированные слова и не могут использоваться для других целей.
Access различает три вида констант: числовые, строковые и константы даты и времени.
Пример записи числовых констант: 12345; -12.345; -6.76Е-23.
Примером сложной строковой константы может служить выражение:
Chr$(9) & "Отступ" & Chr${10)& Chr$(13)& "Новая строка"
Здесь Chr$ (9) — символ табуляции <Tab>; Chr$ (10), символ возврата каретки; Chr$(13), символ перевода строки. Все подстроки объединены с помощью оператора конкатенации.
Пример констант даты и времени: #26/04/75#, #22-Маг-74#, #10:35:30#.
Логические (булевы) операторы используются для объединения результатов двух или более выражений сравнения в единое целое:
Они могут состоять только из выражений, возвращающих логические значения True, False или Null. В противном случае выполняется побитовое сравнение. Логические операторы всегда требуют двух операндов, за исключением Not — логического эквивалента унарного минуса.
В табл. 4.4—4.6 приведены результаты логических операторов Access в зависимости от значения операндов.
Операторы идентификации применяются в качестве разделителей в ссылках на объекты (оператор "!"), их методы или свойства (оператор "."):
КлассОбъекта!ИмяОбъекта
КлассОбъекта!ИмяОбъекта.Свойство
КлассОбъекта!ИмяОбъекта.Метод()
ИмяОбъекта.Свойство
ИмяОбъекта.Метод().
Эти операторы позволяют объединять имена объектов и классов объектов для отбора специфических объектов или их свойств, различать имена объектов и их свойств, идентифицировать определенные поля в таблицах.
Например:
Благодаря наличию операторов идентификации можно присваивать полям разных объектов одни и те же имена (поэтому, например, свойство Caption есть у большинства объектов).
Обычно в качестве оператора присваивания значения объекту, переменной или константе используется знак равенства (=). Например, выражение =Now() может присваивать полю таблицы значение по умолчанию, и тогда знак равенства действует как оператор присваивания. С другой сторону, знак = представляет собой оператор сравнения, определяющий, равны ли два операнда.
Оператор сравнения соотносит значения двух операндов и возвращает логические значения (True или False), соответствующие результату сравнения. Основное назначение операторов сравнения — создание условий на значение, установление критериев выборки записей в запросах, определение действий макросов и контроль выполнения программ в VBA. В табл. 4.3 приведен список операторов сравнения Access.
Стандартный значок оператора конкатенации SQL, амперсант (&), является более предпочтительным, чем значок плюса (+), хотя оба они приводят к одинаковому результату: объединению двух текстовых значений в единую строку символов. Применение значка плюс (+) двусмысленно, его основное назначение — сложение двух числовых операндов.
Пример: слияние "Visual" & "Basic" дает "Visual Basic". Обратите внимание на дополнительный пробел в первом слове, без него результат выглядел бы несколько иначе: "VisualBasic".
Остальные операторы Access (табл. 4.7) упрощают создание выражений для выборки записей в запросах и относятся к операторам сравнения с образцом. Эти операторы возвращают True или False, в зависимости от соответствия значения в поле выбранной спецификации оператора. Наличие этих операторов в условиях на значение позволяет либо включать запись в запрос, если логическое значение, возвращаемое выражением, равно True, либо отвергать, если это значение — False.
Одним из семи стандартных объектов Microsoft Access является
запрос.
Запросы используются для просмотра, анализа и изменения данных в одной или нескольких таблицах. Например, можно использовать запрос для отображения данных из одной или нескольких таблиц и отсортировать их в определенном порядке, выполнить вычисления над группой записей, осуществить выборку из таблицы по определенным условиям. Запросы могут служить источником данных для форм и отчетов Microsoft Access. Сам запрос не содержит данных, но позволяет выбирать данные из таблиц и выполнять над ними ряд операций. В Microsoft Access существует несколько видов запросов: запросы к серверу, которые используются для выборки данных с сервера; запросы на автоподстановку, автоматически заполняющие поля для новой записи; запросы на выборку, выполняющие выборку данных из таблиц; запросы на изменение, которые дают возможность модифицировать данные в таблицах (в том числе удалять, обновлять и добавлять записи); запросы на создание таблицы, создающие новую таблицу на основе данных одной или нескольких существующих таблиц, а также другие типы запросов. В данной главе основное внимание уделяется запросам на выборку, как одному из наиболее часто применяемых типов запросов. Ниже рассматриваются следующие вопросы:
Описание других типов запросов приводится в гл. 8.
Печать результатов запроса
Результаты запроса можно не только посмотреть на экране, но и напечатать. Сделать это можно несколькими способами:
В Microsoft Access имеются возможности быстрой передачи результатов запросов в другие приложения Microsoft Office. Рассмотрим эти возможности.
Существуют четыре способа использования данных Microsoft Access в Microsoft Word.
Чтобы создать составной документ Microsoft Word с помощью мастера, необходимо:
Откроется пустой документ Word, и отобразится панель инструментов
Слияние
(Mail Merge). Чтобы вставить в документ нужные поля, используйте кнопку
Добавить поле слияния
(Insert Merge Field) на этой панели.
В качестве примера рекурсивного соединения рассмотрим запрос к базе данных "Борей" (Northwind), в котором выводятся заказы клиентов, принятые и выполненные в один день.
Для создания такого запроса мы будем использовать таблицу "Заказы" (Orders):
По окончании работы Мастера простых запросов в зависимости от выбора способа дальнейшей работы с запросом откроется или окно запроса в режиме просмотра (рис. 4.4), или окно Конструктора запросов, в котором можно модифицировать запрос. В качестве примера построения простого запроса с помощью Мастера простых запросов рассматривается создание запроса, содержащего имена, фамилии, адреса и телефоны сотрудников фирмы "Борей" (Northwind) (в качестве исходных данных взяты таблицы демонстрационной базы данных "Борей"). Этот запрос строится на основе таблицы "Сотрудники" (Employees). На первом шаге Мастера простых запросов была выбрана исходная таблица "Сотрудники" (Employees) в поле со списком
Таблицы и запросы
(Tables/Queries) и в список
Выбранные поля
(Selected Fields) были перенесены следующие поля: "Имя" (First Name), "Фамилия" (Last Name), "Адрес" (Address), "Домашний телефон" (Home Phone). На втором шаге Мастера простых запросов в поле названия запроса было введено имя "Сотрудники Запрос" и выбран способ дальнейшего отображения запроса: просмотр информации. Результатом работы Мастера запросов стал запрос "Сотрудники Запрос", изображенный на рис. 4.4.
Рис. 4.4. Окно запроса в режиме просмотра
Внимание
Иногда Конструктор устанавливает лишние связи, основываясь только на именах и типах полей. Это может привести к некорректным результатам запроса, поэтому нужно обязательно проверять, как отображаются связи между таблицами в окне Конструктора запросов, и удалить вручную лишние связи. Для этого выделите лишнюю связь, щелкнув по ней левой кнопкой мыши, и нажмите клавишу <Delete>. Работа со связями в окне Конструктора запросов выполняется точно так же, как в окне Схема данных (Relationship) (см. разд. "Связывание таблиц на схеме данных" гл. 2).
Примеры разных способов включения полей в результат запроса в режиме Конструктора запросов приведены на рис. 4.9—4.11.
Чтобы добавить в запрос еще одну таблицу или другой запрос, необходимо:
Замечание
Если нужная таблица находится в другой базе данных или другом приложении, необходимо сначала присоединить эту таблицу к текущей базе данных.
Замечание
Добавить таблицу или еще один запрос в окно Конструктора запросов можно также путем перетаскивания мышью названия таблицы или запроса из окна базы данных.
Чтобы удалить базовую таблицу из запроса, необходимо выделить ее, щелкнув на любом месте в списке ее полей, и нажать клавишу <Delete>.
Чтобы удалить поле из запроса, выделите нужный столбец в бланке запроса, а затем нажмите клавишу <Delete>. Чтобы выделить столбец, пользуйтесь областью выделения столбцов — узкой серой полоской над столбцами в бланке запроса. Когда вы подводите указатель мыши к этой области, он преобразуется в жирную стрелку, направленную вниз.
Поля в таблице, являющейся результатом запроса, отображаются в том порядке, в котором они следуют в бланке запроса. Если требуется изменить порядок их следования, переставьте соответствующим образом столбцы в бланке запроса. Делается это стандартным способом, т. е. сначала выделяется нужный столбец или несколько столбцов, а затем они перетаскиваются мышью на новое место. При этом отпускать кнопку мыши нужно тогда, когда указатель мыши окажется перед тем столбцом, который делжен быть справа от вставляемого столбца. После вставки все столбцы, расположенные справа от указателя, сдвигаются вправо. Если вы перемещаете столбцы в конец запроса, то отпускайте кнопку мыши, когда указатель окажется перед первым свободным столбцом.
В режиме Конструктора запросов можно изменять имена полей запроса. Чтобы переименовать поле, необходимо установить курсор в бланке запроса перед первой буквой его имени и ввести новое имя и символ двоеточия. Пример запроса с измененными именами полей приведен на рис. 4.12. Изменение имени поля в бланке запроса приводит к изменению заголовка столбца при просмотре запроса в режиме таблицы. Кроме того, если на основе запроса создать новый объект, например форму или отчет, в новом объекте будет использовано новое имя поля. Имя поля базовой таблицы при этом не изменяется. Это имя также не изменяется в тех формах и отчетах, которые были созданы на основе запроса до изменения имени поля. Имена полей в запросах должны соответствовать соглашениям об именах Microsoft Access.
Совет
Чтобы использовать новое имя поля только в заголовках столбцов в режиме таблицы или как подпись полей в формах и отчетах, следует задать для этого поля свойство
Подпись
(Caption), а не переименовывать поле в бланке. (Об установке свойств поля см. разд. "Настройка свойств полей в запросе и свойств самого запроса" гл. 8.)
Ширина столбцов в бланке запроса также может меняться. Осуществляется это простым перетаскиванием мышью границы столбца или двойным щелчком мыши по линии границы, как это делается в таблице Excel.
Замечание
Изменение ширины столбцов в окне Конструктора запросов или в окне расширенного фильтра не влияет на ширину столбцов запроса в режиме Таблицы или объекта, для которого применен фильтр.
В строке Условие отбора (Criteria) и в строке или (Or) указываются условия отбора записей. Такими условиями могут быть логические выражения. Например, (>30), (='Иванов'), (=10) и т. п. (0 создании выражений в условиях запроса см. разд. "Использование выражений" ниже в этой главе.)
Условия, находящиеся в одной строке, но в разных столбцах бланка, объединяются по логическому оператору And (И). Если нужно объединить условия отбора по логическому оператору Or (ИЛИ), разместите эти условия в разных строках бланка запроса. Пример использования нескольких условий отбора приведен на рис. 4.13.
Если критерий отбора очень сложный, можно вставлять дополнительные строки условий. Для этого необходимо:
Для удаления строки условий отбора:
Чтобы установить порядок сортировки записей в запросе, используйте строку
Сортировка
(Sort). Для каждого поля, по которому должны сортироваться записи, выберите из списка соответствующий порядок сортировки:
по возрастанию
(Ascending) или
по убыванию
(Descending). По умолчанию во всех полях запроса устанавливается значение
(отсутствует)
(Not sorted). Пример использования поля со списком
Сортировка
(Sort) приведен на рис. 4.14.
Если нужно отсортировать записи в запросе по нескольким полям, разместите их в бланке запроса таким образом, чтобы они были упорядочены слева направо — именно в таком порядке будет выполняться сортировка.
Можно легко удалить поле из результирующей таблицы запроса, если просто сбросить флажок
Вывод на экран
(Show) в этом столбце бланка запроса. По умолчанию этот флажок установлен для всех полей запроса. Ситуация, когда поле не должно отображаться в результате запроса, возникает обычно, когда оно включается в бланк запроса только для того, чтобы указать условие отбора или сортировки записей. Пример такого запроса приведен на рис. 4.15. В запрос включены все поля таблицы "Товары" (Products) (это задано в первом столбце бланка запроса), а поля "КодТипа" и "Марка" включены только для того, чтобы указать порядок сортировки. Поэтому флажок
Вывод на экран
(Show) у этих полей сброшен. В противном случае эти поля вывелись бы дважды.
Если вы хотите очистить бланк запроса для того, чтобы создать новый, нужно выполнить команду
Правка, Очистить бланк
(Edit, Clear Grid).
После формирования бланка запроса его можно сохранить, нажав на кнопку
Сохранить
(Save) на панели инструментов или выполнив команду меню
Файл, Сохранить
(File, Save). При этом появляется диалоговое окно, в котором нужно ввести имя сохраняемого запроса (рис. 4.16). Запрос можно сохранить и закрыв его.
Результаты выполнения запроса можно увидеть, переключившись в режим Таблицы (Datasheet View) с помощью кнопки
Вид
(View) или нажав кнопку
Запуск
(Run) на панели инструментов.
Результат выполнения запроса, созданного в режиме Конструктора, приведен на рис. 4.17.
Рис. 4.17. Результат выполнения запроса, созданного в режиме Конструктора
Совет
Если выражение длинное, его неудобно писать в строке Поле (Field). Нажмите комбинацию клавиш <Shift>+<F2>. Появится диалоговое окно Область ввода (Zoom) (рис. 4.19), в котором вводить выражение удобнее. Можно также использовать Построитель выражений, вызвав его щелчком по кнопке Построить (Build) на панели инструментов. (Подробнее об использовании Построителя выражений и о правилах составления выражений в Access см. последний раздел данной главы.)
Вы можете создать сколько угодно вычисляемых столбцов в запросе, используя при этом сколь угодно сложные выражения. С другими примерами создания таких столбцов вы познакомитесь в следующих главах книги.
Нажмите кнопку
Запуск
(Run) либо выберите
Режим таблицы
(Query View) в списке кнопки Вид (View) на панели инструментов для отображения результата запроса (рис. 4.22). Обратите внимание на то, что заголовками полей в созданном наборе записей являются подписи полей таблицы (включающие пробелы), а не их имена, в которых пробелы обычно не используются.
После выполнения запроса Microsoft Access выводит на экран результирующее множество, записи которого упорядочены по значению первичного ключа (так же, как и при просмотре таблицы). Чтобы изменить порядок сортировки, например, упорядочить записи по убывающей цене товара:
Аналогично создаются запросы, в которых участвует несколько связанных таблиц, образующих цепочку. При этом в результат запроса могут быть включены поля из всех таблиц, участвующих в запросе, или только поля из таблиц, находящихся на концах такой цепочки (рис. 4.24). Во втором случае таблицы на концах цепочки оказываются связанными косвенно, и чтобы правильно построить запрос, соединяющий поля этих таблиц, необходимо включить в запрос каждую таблицу, участвующую в соединении. Например, можно вывести названия стран, товары из которых покупаются клиентами. В данном случае косвенно оказываются связанными таблицы "Клиенты" (Customers) и "Поставщики" (Suppliers), а промежуточными таблицами оказываются таблицы "Заказы" (Orders), "Заказано" (Order Details), "Товары" (Products). Microsoft Access автоматически показывает связи, в том числе и промежуточные, между таблицами.
После добавления в бланк запроса полей "Название" (CompanyName) из таблицы "Клиенты" (Customers) и "Страна" (Country) из таблицы "Поставщики" (Suppliers) выберите команду
Вид, Режим SQL
(View, SQL View) для того, чтобы просмотреть инструкцию SQL, соответствующую данному запросу (рис. 4.25). Соединения таблиц задаются операцией INNER JOIN. . .ON. . . При таком положении косвенные соединения основываются на выражении INNER JOIN ... ON... ON...
(Подробнее об инструкциях языка SQL см. разд. "Создание запросов SQL" гл. 8.)
Запросы, соединяющие косвенно связанные записи, часто используются при анализе данных с помощью статистических функций SQL или перекрестных запросов Access.
Замечание
Традиционно термин JOIN, который применяется к операции соединения таблиц, переводился как "объединение", хотя на самом деле операция объединения таблиц — это UNION, которая позволяет объединить все записи из одной таблицы и все записи из другой, а потом удалить дублирующиеся записи. Тем не менее, при локализации диалоговых окон Access по-прежнему, как мы видим, используется термин "объединение" по отношению к операции JOIN.
Рекурсивные соединения крайне редко используются в приложениях Access благодаря возможности задания ограничений значений и обеспечению целостности данных.
В одном запросе можно ввести несколько параметров. При выполнении такого запроса для каждого из параметров будут поочередно выводиться диалоговые окна
Введите значение параметра
в том порядке, в котором параметры перечислены в бланке запроса.
Совет
При использовании запроса с параметрами делайте понятными их имена, т . к. именно они будут выводиться в диалоговом окне для пользователя.
Сохраненный фильтр может быть легко использован в дальнейшем, приием двумя способами.
Замечание
Обратите внимание, что в списке фильтров не присутствуют другие запросы, а присутствует только фильтр, сохраненный как запрос.
Обратите внимание, что хотя в режиме Таблицы запрос отображал все столбцы исходной таблицы, в бланке запроса указан только один столбец "Должность" (ContactTitle), который содержит условие отбора, и тот не включен в результат запроса. Чтобы понять, почему так происходит, откройте запрос в режиме SQL. Для этого нужно нажать кнопку
Вид, Режим SQL
(View, SQL View). Появится диалоговое окно, содержащее инструкцию языка SQL, которая и обрабатывается при выполнении запроса (рис. 4.37). Эта инструкция имеет вид:
SELECT *
FROM Клиенты
WHERE (((Клиенты.Должность)= "Менеджер по продажам"));
Значок * означает, что выбираются все поля из таблицы "Клиенты".
В виде запроса можно также сохранить так называемый
расширенный фильтр.
Расширенный фильтр используется в том случае, если требуется задать сложные критерии отбора и сортировки записей. Чтобы создать расширенный фильтр для открытой таблицы, необходимо выполнить команду
Записи, Фильтр, Расширенный фильтр
(Records, Filter, Advanced Filter/Sort). При этом появляется окно расширенного фильтра, которое очень напоминает окно Конструктора запроса. На рис. 4.38 представлено окно расширенного фильтра для таблицы "Заказы" (Orders). Чтобы создать такой фильтр, мы выполнили следующие действия:
Окно расширенного фильтра действительно очень похоже на окно Конструктора запросов, однако панель инструментов очень сильно отличается от панели инструментов Конструктора запросов. Например, нельзя добавить еще одну таблицу (расширенный фильтр строится только для одной таблицы — в данном примере вторая таблица отображает поле подстановки) или выполнить группировку записей. На панели инструментов есть только две важные кнопки: Применение фильтра (Apply filter) и Сохранить как запрос (Save as query). В бланке фильтра отсутствует строка, содержащая флажки включения поля в запрос. Это означает, что фильтр не влияет на состав столбцов в результирующей таблице — всегда отображаются все столбцы, фильтруются только записи. Однако критерии отбора записей могут быть установлены сколь угодно сложные. Задаются они по тем же правилам, что и в запросах.
Настройка параметров печати при печати запроса выполняется так же, как и при печати обычной таблицы
(см. разд. "Работа с таблицами"гл. 2).
Совет
Перед выводом запроса на печать полезно посмотреть его в режиме Предварительного просмотра. Для этого нужно нажать кнопку
Предварительный просмотр
(Print Preview) на панели инструментов. Назначение кнопок панели инструментов и возможные действия с запросом в режиме Предварительного просмотра аналогичны описанным е разд. "Печать таблицы" гл. 2.
Можно напечатать результат запроса и прямо из окна базы данных, не открывая его. Для этого необходимо:
Для того чтобы осуществить экспорт запроса в файл данных составного документа Microsoft Word, необходимо:
Microsoft Access автоматически создает файл данных, содержащий имена полей и все данные из таблицы. Пример такого файла, полученного путем экспорта запроса "Список имеющихся товаров", приведен на рис. 4.41.
Чтобы сохранить запрос в файле формата RTF, необходимо:
Файл в формате RTF, открытый в редакторе Word для запроса "Список имеющихся товаров", приведен на рис. 4.42.
Если вы хотите экспортировать запрос в документ Word и сразу увидеть результат операции экспорта, используйте команду меню
Сервис, Связи с Office, Публикация в MS Word
(Tools, Office Links, Publish It With MS Word). При этом результирующие записи запроса сохраняются в файле формата RTF в папке, в которую установлен Microsoft Access. Word загружается автоматически, и в нем открывается сохраненный файл.
Чтобы проанализировать данные запроса в Microsoft Excel, используйте команду меню
Сервис, Связи с Office, Анализ в MS Excel
(Tools, Office Links, Analize It With MS Excel). Результаты выбранного запроса при этом будут сохранены в файле Microsoft Excel в папке, в которую установлен Microsoft Access. Microsoft Excel запускается автоматически и открывает этот файл. Пример пересылки данных из запроса MS Access в MS Excel приведен на рис. 4.43.
Запрос можно преобразовать в любой из форматов, в который экспортируются данные из таблиц Access, и присоединить к сообщению электронной почты. Для этого необходимо:
Microsoft Access открывает новое почтовое сообщение и присоединяет к нему объект в указанном формате (рис. 4.45).
Рис. 4.45. Сообщение Outlook с присоединенным файлом в формате RTF
Как видите, создание выражений является не таким уж сложным делом, особенно с таким помощником, как Построитель выражений.
Для изменения уже существующих запросов и для создания новых запросов используется Конструктор запросов. Для того чтобы открыть запрос в режиме Конструктора, выделите в списке один из существующих запросов, например только что созданный запрос "Сотрудники Запрос", и нажмите кнопку
Конструктор
(Design) на панели инструментов окна
База данных
(Database).
Появляется окно Конструктора запросов (рис. 4.5). В верхней части окна отображается таблица (или несколько таблиц, если запрос многотабличный) в том виде, в каком таблицы отображаются в окне
Схема данных
(Relationship). Таблицы — источники данных для запроса, мы будем называть
базовыми
таблицами запроса. В нижней части окна находится
бланк запроса
— таблица, ячейки которой используются для определения запроса. В бланке отображаются все столбцы, включенные в результирующее множество запроса.
Для того чтобы просматривать полностью бланк запроса и все исходные таблицы, используют линейки прокрутки.
В области панелей инструментов Access отображается панель инструментов
Конструктор запросов
(Queries Design). Эта панель представлена на рис. 4.6, а в табл. 4.1 приведено описание кнопок этой панели инструментов и соответствующие им команды меню.
Наиболее просто создается запрос при помощи Мастера запросов. Чтобы создать простой запрос с помощью Мастера запросов, необходимо:
Создание запросов интересно не только тем, что вы можете в виде одной таблицы представить данные из нескольких связанных таблиц и отобрать нужные записи из этих таблиц. Вы можете создавать столбцы в запросе, которые являются результатом вычислений над значениями других столбцов. Такие столбцы называются
вычисляемыми.
Это существенно расширяет возможности запросов. Простейшим примером вычисляемого поля в запросе может быть поле, которое объединяет имя и фамилию человека. На рис. 4.18 показан пример такого поля в запросе, созданном на базе таблиц "Сотрудники" (Employees) и "Заказы" (Orders).
Чтобы создать вычисляемое поле, нужно ввести выражение, которое вычисляет требуемое значение, в строку
Поле
(Field) свободного столбца бланка запроса. В данном примере это выражение представляет собой конкатенацию полей, содержащих имя и фамилию сотрудника, с пробелом между ними. В этом выражении мы используем ссылки на поля таблицы, которые в выражении заключаются в квадратные скобки. Перед выражением нужно написать имя поля: ФИО и отделить его двоеточием от выражения.
Ввод выражений возможен в. среде Access не только вручную, но и с помощью удобного инструмента, называемого Построитель выражений (Expression Builder).
Построитель выражений (Expression Builder) вызывается всякий раз, когда в поле свойства объекта Access, например в ячейке бланка Конструктора запросов, вы щелкаете кнопку Построителя (кнопка с тремя точками) или нажимаете кнопку
Построить
(Build) на панели инструментов.
Для демонстрации работы Построителя выражений воспользуемся демонстрационной базой "Борей" (Northwind). После создания и проверки запроса можно применить критерий отбора, чтобы ограничить количество записей в результирующем множестве запроса:
Еще одним способом создания запроса является сохранение фильтра в виде запроса. Выше мы говорили, что фильтр используется при просмотре таблицы для отбора нужных записей. Если вы создали достаточно сложный фильтр в- окне
Фильтр
(Filter by Form) и знаете, что его придется использовать и в дальнейшем, можно сохранить его в базе данных в виде запроса. Для этого достаточно нажать кнопку
Сохранить как запрос
(Save as query) на панели инструментов при открытом окне
Фильтр
(Filter by Form).
Кнопка |
Описание |
Команда меню |
||
Вид (View) |
Отображение запроса в различных режимах. Чтобы изменить режим отображения запроса, нажмите стрелку справа от кнопки и в появившемся списке выделите нужный элемент. Если просто нажать эту кнопку, запрос будет отображен в режиме Таблицы |
Вид, Режим таблицы
(View, Datasheet View) |
||
Сохранить (Save) |
Сохранение активного запроса |
Файл, Сохранить
(File, Save) |
||
Печать (Print) |
Печать результатов запроса без открытия диалогового окна Печать |
Нет вЬ |
||
Предварительный просмотр
(Print Preview) |
Предварительный просмотр запроса перед печатью |
Файл, Предварительный просмотр
(File, Print Preview) |
||
Орфография
(Spelling) |
Проверка орфографии в текстовых полях запроса |
Сервис, Орфография
(Tools, Spelling) |
||
Кнопка
|
Описание
|
Команда меню
|
||
Вырезать (Cut) |
Удаление выделенных объектов из запроса в буфер обмена Windows |
Правка, Вырезать
(Edit, Cut) |
||
Копировать (Сору) |
Копирование выделенных объектов запроса в буфер обмена |
Правка, Копировать
(Edit, Copy) |
||
Вставить (Paste) |
Вставка содержимого буфера обмена в запрос |
Правка, Вставить
(Edit, Paste) |
||
Формат по образцу
(Format Painter) |
Копирование параметров форматирования из одного выделенного объекта в другой такого же типа |
Нет |
||
Отменить (Undo) |
Отмена последнего изменения запроса |
Правка, Отменить
(Edit, Undo) |
||
Тип запроса (Query Туре) |
Изменение типа запроса. Для изменения типа запроса щелкните по стрелке справа от кнопки и выберите из списка нужный тип запроса |
Запрос, Выборка
(Query, Select Query) |
||
Запуск (Run) |
Выполнение запроса |
Запрос, Запуск
(Query, Run) |
||
Отобразить таблицу (Show Table) |
Выводится диалоговое окно Добавление таблицы (Show Table) |
Запрос, Добавить таблицу (Query, Show Table) |
||
Групповые операции (Totals) |
Группировка записей в запросе и расчет итоговых значений |
Вид, Групповые операции (View, Totals) |
||
Набор значений
(Top Values) |
Отобразить только первые записи запроса. Количество отображаемых записей указывается в поле ввода либо в штуках, либо в процентах |
Нет |
||
Свойства
(Properties) |
Открытие окон свойств выделенных объектов: запроса или поля запроса |
Вид, Свойства
(View, Properties) |
||
Построитель (Build) |
Вызов построителя для создания выражения. Кнопка доступна только тогда, когда активизировано свойство запроса или поля запроса, которое допускает ввод выражения, например Условие отбора (Criteria) |
Нет |
||
Окно базы данных
(Database Window) |
Отображение окна базы данных |
Окно, 1 (Window, 1) |
||
Новый объект
(New Object) |
Создание нового объекта базы данных. Чтобы выбрать тип создаваемого объекта, нажмите стрелку справа от кнопки |
Нет |
||
Справка по Microsoft Access
(Microsoft Access Help) |
Вызов помощника и получение справки по Access 2002 |
Справка, Справка по Microsoft Access
(Help, Microsoft Access Help) |
||
С использованием кнопок панели инструментов вы будете знакомиться по мере изучения работы с запросами, как в данной главе, так и
в гл. 8.
А теперь рассмотрим, как создать новый запрос с помощью Конструктора запросов. Для этого необходимо:
Оператор
|
Пример
|
Описание
|
||
+ |
[Итог] + [Надбавка] |
Складывает два операнда |
||
- |
Date () - 7 |
Считает разность двух операндов |
||
- (унарный) |
-12345 |
Меняет знак операнда |
||
* |
[Коробок] * [Цена коробки] |
Перемножает два операнда |
||
/ |
[Количество] / 12.55 |
Делит один операнд на другой |
||
Оператор
|
Описание |
Пример | ||
\ |
Делит один целый операнд на другой нацело. При использовании деления нацело операнды с десятичными дробями округляются до целого, а дробные части отбрасываются |
[Коробок] \ 2 | ||
Mod | [Коробок] Mod 12 |
Возвращает остаток от деления нацело. Например, 15 Mod 12 равно 3 |
||
^ | Возводит операнд Основание в степень Показатель | ^ [Показатель] |
В таблице отсутствует знак равенства (=), поскольку он отнесен к группе операторов присваивания и сравнения.
Оператор
|
Пример
|
Результат
|
Описание
|
||
< |
1 < 100 |
True |
Меньше |
||
<= |
1 <= 1 |
True |
Меньше либо равно |
||
= |
1 = 100 |
False |
Равно |
||
>= |
100 >= 1 |
True |
Больше либо равно |
||
> |
100 > 100 |
False |
Больше |
||
<> |
1 <> 100 |
True |
Неравно |
||
Замечание
Если один из операндов имеет значение Null (пустое значение), то любое" сравнение возвращает значение Null (тоже пустое значение).
|
A=True B=False |
A=True B=True |
A=False B=False |
A=False B=True |
||
A And В |
False |
True |
False |
False |
||
A Or В |
True |
True |
False |
True |
||
Not A |
False |
False |
True |
True |
||
А Хог В |
True |
False |
False |
True |
||
A Eqv В |
False |
True |
True |
False |
||
A Imp В |
False |
True |
True |
True |
||
Для всех логических операторов, кроме Imp, значение одного из операндов Null приводит к значению результата Null.
|
A=Null B=False
|
A=Null B=True
|
A=False B=Null
|
A=True B=Null
|
A=Null B=Null
|
||
A Imp В |
Null |
True |
True |
Null |
Null |
||
В случае если сравниваются два выражения и, по крайней мере, одно из них не является константой из множества (True, False, Null), логические операторы приводят к побитовому сравнению выражений-операндов (табл. 4.6).
Значения соответствующего бита результата |
битА=1
бит В=0 |
6итА=1
битВ=1 |
битА=0
бит В=0 |
бит А=0
бит В=1 |
||
A And В |
0 |
1 |
0 |
0 |
||
A Or В |
1 |
1 |
0 |
1 |
||
Not A |
0 |
0 |
1 |
1 |
||
А Хог В |
1 |
0 |
0 |
1 |
||
A Eqv В |
0 |
1 |
1 |
0 |
||
A Imp В |
0 |
1 |
1 |
1 |
||
Оператор
|
Пример
|
Описание
|
||
Between |
Between (-100) And (100) |
Определяет, находится ли числовое значение в определенном диапазоне значений |
||
Is |
Is Null Is Not Null |
При использовании вместе с Null определяет, является ли значение Null или Not Null |
||
In |
In ("Москва", "Киев", "Санкт-Петербург") |
Определяет, является ли строковое значение элементом списка значений |
||
Like |
Like "Ив*" Like "db??" |
Определяет, начинается ли строковое значение с указанных символов (для правильной работы Like нужно добавить символ шаблона "*" или один или несколько символов "?") |
||
Для пользователей, знакомых с шаблонами командной строки DOS, применение знаков (символов шаблона) "*" и "?" в операторах Like не вызовет затруднений. Точно так же, как в DOS, символ "*" замещает любое число знаков, а символ шаблона "?" замещает только один знак, поэтому Like "Ив*" вернет True для значений "Иванов", "Иващенко", "Иволгин". Для "dbl" или "dbl00" значение оператора Like "db??" будет False, но тот же оператор вернет для "dbl0" и "dbXX" значение True. Символы шаблона "*" и "?" могут стоять в любом месте шаблонной строки, . например:
Наиболее распространенным является
внутреннее соединение (эквисоедшение).
Если таблицы связаны отношением "один-ко-многим", соединения основываются на уникальном значении поля первичного ключа в одной таблице и значениях поля внешнего ключа в другой таблице. В результирующее множество запроса попадают все записи из главной таблицы (таблицы на стороне "один"), для которых имеются соответствующие записи в подчиненной таблице (таблице на стороне "многие"). Если в подчиненной таблице записи с заданной величиной отсутствуют, то соответствующие записи в главной таблице в результирующее множество не включаются. Подобного рода соединения между таблицами Access создает автоматически, если:
Замечание
"Согласованные типы" в большинстве случаев означают одинаковые типы. Исключением является поле типа Счетчик, которое может иметь размер Длинное целое или Код репликации и может связываться с числовыми полями соответствующего размера.
Результатом такого запроса являются все записи, значения связанных полей которых в обеих таблицах совпадают. Другими словами, эквисоединение связывает записи в таблицах отношением равенства значений связывающих полей.
Для создания запроса, объединяющего все записи из одной таблицы, и только те записи из второй, в которых связанные поля совпадают, используют
внешнее соединение.
В этом случае независимо от того, имеются ли соответствующие записи во второй таблице, все записи первой попадают в результирующее множество запроса.
Если необходимо связать данные любым отношением, кроме отношения равенства, используют
соединение по отношению
или
тэта-соединение).
Соединение по отношению не отображается в окне
Схема данных
(Relationships) и не выводится в окне Конструктора запросов.
Для обозначения внутренних соединений в Access используются зарезервированные слова ANSI SQL INNER JOIN, а для указания внешних соединений — слова LEFT JOIN или RIGHT JOIN. Выражение WHERE <поле1>=<поле2> соответствует внутреннему соединению, a WHERE поле1>поле2 — соединению по отношению (одному из таких соединений).
Для связывания данных в одной таблице применяют рекурсивное соединение. Оно создается путем добавления в запрос копии таблицы (в результате чего Access назначает псевдоним для копии) и связывания полей идентичных таблиц.
Внешние соединения бывают левыми или правыми. Запрос, в котором участвуют таблицы с левым внешним соединением (LEFT JOIN или *= в SQL), выводит все записи таблицы "один", в независимости от того, имеются ли соответствующие им записи в таблице "многие". И наоборот, запрос, в котором участвуют таблицы с правым внешним соединением (RIGHT JOIN или =* в SQL), выводит все записи таблицы "многие", в независимости от того, имеются ли соответствующие им записи в таблице "один".
Рассмотрим в качестве примера, как с помощью левого внешнего соединения создать запрос в базе данных "Борей" (Northwind), который обнаруживает клиентов, не сделавших ни одного заказа:
Внутреннее соединение двух таблиц по одному полю в реляционной базе данных строится на основе отношения "один-ко-многим". Примером может служить демонстрационная база данных "Борей" (Northwind), в которой все соединения являются внутренними соединениями по одному полю на основе указанного отношения. В ходе разработки баз данных, в которых предполагается использование запросов на основе внутренних соединений, придерживайтесь следующих правил.
В качестве примера использования запроса на основе внутреннего соединения по одному полю в базе данных "Борей" (Northwind) построим отчет с указанием марки товара, его поставщика, единицы измерения товара и его цены:
После этого на экране появляется таблица, которая содержит только те записи, которые удовлетворяют критериям отбора, указанным в запросе, и те поля, которые указаны в бланке запроса. Если в запросе указан порядок сортировки записей, они выводятся на экран в соответствующем порядке.
Внешне отображение результатов запроса не отличается от отображения таблицы. Все режимы работы с таблицей, описанные в
гл. 2,
применимы и к результирующей таблице запроса. С ней можно работать так же, как и с обычной таблицей, в частности не только просматривать, но и изменять данные. Изменения сохраняются в записях базовой таблицы, на основе которой построен запрос. Если запрос создан на основе двух и более связанных таблиц, то не всегда столбцы в запросе можно редактировать.
(Подробнее об этом см. следующий раздел.)
Для выполнения запроса из режима Конструктора достаточно просто переключиться
в Режим таблицы
(Datasheet View) с помощью кнопки
Вид
(View) на панели инструментов, как мы это уже не раз делали, или с помощью команды
Режим таблицы
(Datasheet View) из меню
Вид
(View).
В Access 2002 запрос можно открыть не только в режиме Таблицы. Вы можете выполнить обработку результатов запроса и получить на их основе сводную таблицу или диаграмму, аналогичные тем, которые можно создать на базе таблицы Excel. Это новое удобное средство обработки данных запроса мы рассмотрим подробно в гл. 8.
Каждое выражение может содержать один или несколько операторов и одну или несколько констант, идентификаторов или функций. Выражение может быть сколь угодно сложным.
Замечание
Если имя поля или таблицы содержит пробелы, его идентификатор обязан в выражении заключаться в квадратные скобки. Чтобы упростить ввод идентификаторов, рекомендуется не использовать пробелы в названиях таблиц, полей в таблицах и названиях других объектов Access.
Для создания выражений в Access существует шесть категорий операторов: арифметические, операторы присваивания, логические операторы, операторы конкатенации, идентификации и сравнения с образцом.
Ниже рассмотрены:
Запрос на выборку содержит условия отбора данных и возвращает выборку, соответствующую указанным условиям, без изменения возвращаемых данных. В Microsoft Access существует также понятие
фильтра,
который в свою очередь является набором условий, позволяющих отбирать подмножество записей или сортировать их. Сходство между запросами на выборку и фильтрами заключается в том, что и в тех и в других производится извлечение подмножества записей из базовой таблицы или запроса. Однако между ними существуют различия, которые нужно понимать, чтобы правильно сделать выбор, в каком случае использовать запрос, а в каком — фильтр.
Основные отличия запросов и фильтров заключаются в следующем.
Запросы могут использоваться только с закрытой таблицей или запросом. Фильтры обычно применяются при работе в режиме Формы или в режиме Таблицы для просмотра или изменения подмножества записей. Запрос можно использовать:
Запросы с параметрами
Запрос в Access является объектом, который сохраняется в файле базы данных и может многократно повторяться. Все запросы, которые мы демонстрировали до сих пор, содержали конкретные значения дат, названий, имен и т. д. Если требуется повторить такой запрос с другими значениями в условиях отбора, его нужно открыть в режиме Конструктора, изменить условие и выполнить. Чтобы не делать многократно этих операций, можно создать запрос с параметрами. При выполнении такого запроса выдается диалоговое окно
Введите значение параметра
(Enter Parameter Value), в котором пользователь может ввести конкретное значение и затем получить нужный результат.
Покажем, как создавать запросы с параметрами на примере запроса "Отсортированный список товаров", который мы создавали ранее. Теперь мы с помощью этого запроса попробуем отобрать товары, поставляемые определенным поставщиком. Для этого: