Глава 8.
Редактирование и анализ данных с помощью запросов
В первой части
книги мы познакомили вас с одним из важнейших объектов базы данных Access —
запросами. При этом рассматривался только один вид запросов — запросы на выборку
данных из таблиц. Microsoft Access, однако, позволяет не только выбирать нужные
данные, но и изменять их с помощью специальных запросов. Такие запросы
называются запросами на изменение (Action Query). Существует четыре типа
запросов на изменение.
Если таблицы
содержат большое количество данных, важно не только извлечь нужные данные, но и
как-то обработать их, т. е. представить в виде, удобном для анализа. В
предыдущих версиях Access для этого существовал специальный вид запросов —
перекрестные запросы. В Access 2002 для анализа данных можно применять сводные
таблицы — мощное и удобное средство анализа, уже давно прекрасно
зарекомендовавшее себя в Microsoft Excel. Сводные данные можно теперь
представить не только в табличном, но и в графическом виде с помощью сводных
диаграмм.
Более простым
способом обработки результирующих данных запроса является группировка и
вычисление различных итоговых значений. Это можно сделать прямо в запросе на
выборку, определив поля для группировки и используя статистические
функции.
И наконец, для
создания запросов можно использовать специальный язык — Jet SQL, т. е. диалект
языка структурированных запросов, который используется ядром базы данных Access
— процессором обработки данных Jet.
Итак, в этой
главе описывается:
Создание таблиц с помощью запроса
С помощью этого
вида запроса вы можете выбрать нужные данные из уже существующей таблицы с
помощью обычного запроса на выборку, а затем поместить их в новую таблицу,
структура которой определяется структурой записей результирующего множества
запроса. Таким образом, процесс создания таблицы с помощью запроса состоит из
трех шагов:
Созданию
различных запросов на выборку мы уделили достаточно внимания в гл. 4.
Оставшиеся два этапа описаны ниже на примере запроса на выборку "Холодные
клиенты", созданного в базе данных "Борей" при описании внешнего соединения в
гл. 4.
Замечание
Это нужно сделать, чтобы
поле не попало в новую таблицу. Поле "КодЗаказа" в таблице "Заказы" определено
как Счетчик и не может иметь значение Null. Это свойство наследуется новой
таблицей, поэтому если флажок не сбросить, то при выполнении запроса будет
выдаваться сообщение об ошибке.
Преобразование запроса на выборку в запрос на
изменение
Чтобы создать
таблицу из результатов запроса, использовавшегося для отбора записей в связанных
таблицах, его нужно преобразовать из запроса на выборку в запрос на изменение.
Для этого:
Внимание
В базе данных Access не
должно быть таблицы и запроса с одинаковыми именами.
В этом
диалоговом окне можно определить также, где должна быть создана таблица — в
текущей базе данных (переключатель в текущей базе данных (Current
Database) выбран по умолчанию) или в другой базе данных. В последнем случае
нужно выбрать переключатель в другой базе данных (Another Database) и
ввести имя этой базы данных.
Рис. 8.1.
Диалоговое окно Создание таблицы
Рис. 8.2.
Запрос на изменение в окне базы данных
Выполнение запроса на изменение
Выполнение
запроса на изменение приведет к появлению новой таблицы с запися--ми, которые
будут идентичны результирующему набору записей того запроса на изменение,
который был создан на первом этапе.
Для выполнения
запроса:
Внимание
Одно из важных правил во
время работы с запросами на изменение — нужно обязательно создавать резервную
копию таблицы, в которую вносятся изменения. Дело в том, что исправления,
внесенные запросами на изменение, необратимы, к тому же часто нелегко обнаружить
записи, измененные ошибочным запросом.
Рис. 8.3.
Предупреждающее сообщение о числе новых записей
Рис. 8.4.
Новая таблица в окне оазы данных
Рис. 8.5.
Таблица, созданная при помощи запроса
Запрос на
создание таблицы может использоваться многократно для создания временных таблиц,
при этом каждый раз будет создаваться новая таблица и удаляться
старая.
Создание запросов на доьавление данных
Поэтому сначала
создается запрос на выборку данных, в результат которого включаются те поля,
которые должны составлять добавляемые записи, а также поля, в которых
устанавливаются критерии отбора записей.
В качестве
примера мы рассмотрим запрос, который будет выбирать из базы данных все заказы
за 1996 год и переносить их в другую таблицу так, чтобы таблица "Заказы"
(Orders) содержала только актуальные данные. Для этого сначала создадим таблицу,
которая будет хранить устаревшие данные:
В списке
появляется новая таблица, пока пустая, т. к. мы скопировали только структуру
таблицы "Заказы" (Orders). Теперь создадим запрос на добавление, который
позволит перенести в новую таблицу данные из таблицы "Заказы".
Рис. 8.6.
Диалоговое окно Добавление
Замечание
Если записи добавляются в
таблицу, которая уже непуста, то наиболее часто встречающейся ошибкой при
выполнении этого запроса является попытка вставить записи, у которых значение
первичного ключа совпадает с ключами уже имеющихся в ней записей. Такие записи
вставлены не будут, будет только выдано сообщение об их
количестве.
Рис. 8.7.
Бланк запроса на добавление
Создание запросов на обновление
таблиц
Запросы на
обновление используются главным образом для того, чтобы внести изменения сразу в
большое количество записей с помощью одного запроса. Классическим примером
такого запроса является изменение цены в таблице "Товары" (Products) на
некоторый постоянный коэффициент, например можно увеличить цену одной из
категорий товара на 20%. Чтобы создать такой запрос:
Рис. 8.8.
Запрос на обновление записей
Совет
Прежде чем выполнять запрос
на обновление, щелкните левой кнопкой мыши по стрелке на кнопке Вид
(View) и выберите Режим таблицы (Datasheet View). Вы увидите все
записи, которые будут обновлены, хотя данные в обновляемых полях будут еще
старые. И только убедившись, что отобраны нужные записи, можно выполнять
запрос.
В приведенном
примере изменялись значения в поле, которое не является первичным ключом в
таблице "Товары" (Products). Особый случай возникает, когда требуется обновить
значение первичного ключа в таблице. Если эта таблица связана отношением
"один-ко-многим" с другими таблицами, то при изменении первичного ключа записи
должны одновременно измениться значения внешних ключей во всех связанных записях
подчиненных таблиц. Access обеспечивает выполнение такого изменения
автоматически, т. к. поддерживает каскадное обновление записей. При определении
связи между таблицами можно установить флажок каскадное обновление связанных
полей (Cascade Update Related Fields) (см. разд. "Поддержка целостности
данных" гл. 2).
Если такой
флажок установлен, то при изменении значения первичного ключа в главной таблице
Access автоматически выполняет специальный запрос, с помощью которого
обновляются внешние ключи всех связанных записей в подчиненной
таблице.
Убедиться в том,
как работает такой запрос, можно на примере таблиц "Сотрудники" (Employees) и
"Заказы" (Orders). Для этого нам придется сначала сделать копии этих таблиц и
установить связь между ними:
Рис. 8.9.
Диалоговое окно Изменение связей
Для выполнения
каскадного обновления:
Рис. 8.10.
Каскадное обновление записей
Создание запросов на удаления записей
Запросы на
удаление записей позволяют отобрать требуемые записи и удалить их за один прием.
Принцип создания такого запроса аналогичен созданию запроса на обновление,
однако, удаляя записи из связанных таблиц, необходимо помнить о том, что при
этом не должна нарушаться целостность данных.
Если две таблицы
связаны отношением "один-ко-многим", нельзя удалять записи из таблицы "один"
если в таблице "многие" присутствуют соответствующие им записи. Сначала должны
быть удалены записи в таблице "многие" и только потом — соответствующие им
записи в таблице "один". Для того чтобы упростить этот процесс, Access позволяет
при определении связей между таблицами установить флажок каскадное удаление
связанных записей (Cascade Delete Related Records). Такой флажок установлен,
например, для связи таблиц "Заказы" (Orders) и "Заказано" (Order Details).
Действительно, если требуется удалить из базы данных какой-то заказ,
должны быть удалены не
только запись об этом заказе в таблице "Заказы", но ч все позиции данного заказа
в таблице "Заказано".
Для создания
запроса на удаления мы воспользуемся уже имеющимся запросом на добавление
записей "Копирование заказов".
Рис.
8.11. Запрос на удаление записей из таблицы
"Заказы"
Однако такое
каскадное удаление записей не всегда возможно. Например, для рассмотренной нами
в предыдущем разделе связи таблиц "Сотрудники" и "Заказы" нельзя устанавливать
флажок каскадное удаление связанных записей (Cascade Delete Related
Records), т. к. удаление записи о сотруднике из таблицы "Сотрудники" не должно
повлечь за собой удаление всех его заказов. Если вы попытаетесь удалить
какую-либо запись о сотруднике и в таблице "Заказы" (Orders) окажутся заказы,
принятые этим сотрудником, Access выдаст сообщение об ошибке (рис.
8.12).
Рис. 8.12.
Сообщение о невозможности удаления записей
Замечание
Для того чтобы выполнялась
автоматическая проверка целостности данных, не забудьте для всех связей в базе
данных установить флажок Обеспечение целостности данных (Enforce
Referential Integrity).
Анализ данных с помощью запросов
Еще одной
функцией запросов Access является анализ данных, которые распределены по разным
таблицам. Анализ данных может выполняться с помощью:
Перекрестные
запросы — это запросы, в которых происходит статистическая обработка данных,
результаты которой выводятся в виде таблицы, очень похожей на сводную таблицу
Excel. Перекрестные запросы обладают следующими достоинствами:
Однако они имеют
и недостатки — например, нельзя сортировать таблицу результатов по значениям,
содержащимся в столбцах, т. к. в подавляющем большинстве случаев одновременное
упорядочивание данных в столбцах по всем строкам невозможно. При этом вы можете
задать сортировку по возрастанию или по убыванию для заголовков
строк.
Перекрестные
запросы удобны для представления данных в виде таблицы, но т. к такая таблица
часто имеет разное количество столбцов, на них довольно сложно строить отчеты.
Создание отчета на базе перекрестного запроса будет рассматриваться в гл.
13.
В качестве
примера сформируем два перекрестных запроса к базе данных "Борей" для вывода
ежемесячных продаж товара (по его коду) и ежеквартальных продаж товара (по его
типу). Подобные таблицы, содержащие итоги, которые подводятся через определенные
промежутки времени, например через каждый месяц или квартал, обычно используются
в качестве данных для графиков.
В описываемой
ниже пошаговой процедуре создания перекрестного запроса показано, как можно
пользоваться выражениями для создания новых вычисляемых полей в
запросах.
Итак, мы будем
создавать перекрестный запрос, в котором в строках выводятся товары, а в
столбцах — соответствующие им ежемесячные объемы продаж. Для
этого:
Объем продаж:
Sum([Количество]*[Заказано].[Цена])
Это будет поле, значение
которого вычисляется с помощью описанного выражения, а название поля — "Объем
продаж". В выражении используются поля из таблиц, которые включены в запрос,
однако обратите внимание, что сами поля в результат запроса не включены. Это
означает, что при создании вычисляемого поля в выражение можно включать ссылки
не только на поля самого запроса, но и на поля, которые не включаются в
результат запроса. Важно, чтобы они были в исходных таблицах. При ссылке на
поле "Цена" в выражении мы указали еще имя таблицы "Заказано", а при ссылке на
поле "Количество" не указывали. Указать имя таблицы пришлось потому, что поле
с именем "Цена" присутствует и в таблице "Товары" и в таблице "Заказано". Если
не указать в выражении имени таблицы, Access не сможет определить, из какой
таблицы брать значения, поэтому при выполнении запроса выдаст сообщение об
ошибке, как это представлено на рис. 8.13.
Рис. 8.13.
Сообщение об ошибке в выражении вычисляемого поля
Выберите в ячейке Групповая операция (Total) того же столбца значение Выражение (Expression), а затем в ячейке Перекрестная таблица — значение Значение (Value). В столбце "Объем продаж" вычисляется общий объем заказов на каждый товар, который будет подставляться в ячейки результирующей таблицы запроса.
Рис. 8.14.
Перекрестный запрос в режиме Конструктора
Рис. 8.15.
Результирующее множество перекрестного запроса
Стоит обратить
внимание, что выведенная перекрестная таблица обладает одним недостатком:
расположение столбцов определяется алфавитным порядком их заголовков, а не
хронологической очередностью. Избежать этой неприятности можно. Для этого
необходимо задать порядок сортировки заголовков столбцов. В следующем разделе мы
покажем, как это можно сделать.
Использование фиксированных заголовков столбцов в перекрестных
запросах
Для того чтобы в
построенном запросе вывести столбцы в порядке календарной очередности месяцев,
нужно задать фиксированные заголовки столбцов:
После ключевого
слова IN указываются, если они есть, фиксированные названия
столбцов.
Рис. 8.16.
Задание значения свойства Заголовки
столбцов
Рис. 8.17.
Перекрестный запрос на SQL
Замечание
В ANSI SQL слова TRANSFORM
и PIVOT не являются зарезервированными словами, а ключевое слово IN
интерпретируется по-разному в Access и ANSI SQL. Обратите также внимание на
формат даты в инструкции SQL: сначала пишется номер месяца, а потом число
месяца, разделителем является косая черта, и все выражение содержится между
значками #. Именно в таком формате должны быть всегда написаны даты в
предложении SQL, хотя, как вы видели, в бланке запроса можно писать даты в
привычном нам европейском формате. Нужное преобразование Конструктор выполняет
автоматически.
Рис. 8.18.
Перекрестная таблица с фиксированными заголовками
столбцов
Изменение уровня детализации в запросе
Для создания
удобного для анализа представления или наглядного графика можно сократить число
строк и столбцов в результатах построенного запроса. С этой целью создадим
перекрестный запрос, который выводит ежеквартальную выручку от продаж по типам
товаров. Чтобы создать такой запрос:
Рис. 8.19.
Запрос для вывода выручки от продаж по типам
товаров
Рис. 8.20.
Перекрестная таблица с итогами по кварталам
Статистические функции для выполнения расчетов
Статистические функции используются в запросах главным образом для
вычисления всевозможных итоговых значений, например для числового поля таблицы
можно вычислить среднее значение или сумму значений для всех или отобранных
записей, можно посчитать количество записей, возвращаемых
запросом.
Статистические
функции, которые можно использовать в запросах Access, входят в состав Access
SQL. Описание этих функций, а также типов полей, к которым они могут быть
применены, приведено в табл. 8.1.
|
Функция |
Типы
полей |
Описание |
||
|
Avg() |
Все типы полей,
исключая Текстовый (Text), Поле Memo (Memo) и Поле объекта OLE (OLE
Object). |
Вычисляет
арифметическое среднее набора чисел, содержащихся в указанном поле
запроса |
||
|
Count (
) |
Все типы
полей |
Вычисляет количество
непустых записей, возвращаемых запросом |
||
|
First (
) |
Все типы
полей |
Возвращает значение
поля из первой записи результирующего набора |
||
|
Last
() |
Все типы
полей |
Возвращает значение
поля из последней ' записи результирующего набора |
||
|
Max() |
Все типы полей,
исключая Текстовый, Поле Memo и Поле объекта OLE |
Возвращает
максимальное значение из набора, содержащегося в указанном
поле |
||
|
Min() |
Все типы полей,
исключая Текстовый, Поле Memo и Поле объекта OLE |
Возвращает
минимальное значение из набора, содержащегося в указанном
поле |
||
|
StDev()
StDevP() |
Все типы полей,
исключая Текстовый, Поле Memo и Поле объекта OLE |
Возвращают смещенное
и несмещенное значение среднеквадратичного отклонения, вычисляемого по
набору значений, содержащихся в указанном поле |
||
|
Sum(
) |
Все типы полей,
исключая Текстовый, Поле Memo и Поле объекта OLE |
Возвращает сумму
набора значений, содержащихся в заданном поле |
||
|
Var() VarP (
) |
Все типы полей,
исключая Текстовый, Поле Memo и Поле объекта OLE |
Возвращают значение
смещенной и не смещенной дисперсии, вычисляемой по набору значений,
содержащихся в указанном поле |
||
Перечисленных
функций обычно достаточно для решения большинства задач. Тем не менее, при
необходимости пользователь может самостоятельно написать функцию на языке VBA,
которая будет выполнять сложные статистические, научные или инженерные расчеты
над данными, и использовать эту функцию в запросах.
Замечание
Все статистические функции
Access SQL поддерживаются стандартом ANSI SQL, но не все из них поддерживаются
другими СУБД. Например, не все серверные базы данных поддерживают функции
StDev(), StDevP(), Var () и VarP (). Поэтому, если вы планируете в дальнейшем
перенести свою базу данных на сервер, прежде чем использовать эти функции, нужно
убедиться, поддерживаются ли они сервером. Иначе потом придется изменять все
объекты, в которых встречаются эти функции.
Использование
статистических функций для расчета итоговых значений тесно связано с применением
групповых операций в запросе. Групповые операции позволяют задать группы, для
которых выполняются вычисления. Ниже мы приведем примеры таких расчетов как на всем множестве
записей, так и на подмножествах, выбранных по условиям запроса.
Вычисления на всем диапазоне записей
Первый запрос,
который мы предлагаем построить, должен ответить на вопрос: "Сколько заказов и
на какую сумму разместил каждый клиент?". Для этого нам придется построить
многотабличный запрос. Воспользуемся уже существующим в базе данных "Борей"
запросом "Сведения о заказах" (Oreder Details Extended), а также таблицами
"Клиенты" (Customers) и "Заказы" (Orders):
Рис. 8.21.
Использование статистических функций в запросе
Рис. 8.22.
Запрос "Итоги по клиентам"
Вычисления на выделенных записях таблицы
В предыдущем
примере расчеты производились над всеми имеющимися в таблице "Заказы" (Orders)
записями. Однако часто требуется выполнить вычисления над определенным набором
данных и, основываясь на них, составить статистику. Для этого нужно добавить в
запрос условия для выборки нужного набора записей. Например, мы можем изменить
предыдущий запрос таким образом, чтобы получить данные не по всем клиентам, а
только по тем, которые находятся в Германии. Для этого:
В ней используются две
статистические функции— Count () и Sum () — и предложение WHERE, содержащее
условие отбора записей.
Рис. 8.23.
Задание условия отбора записей в запросе "Итоги по
клиентам"
Рис. 8.24.
Сообщение об ошибке при попытке отобразить поле, для которого задано
условие
Рис. 8.25.
Результаты запроса "Итоги по клиентам в Германии"
Статистические
функции можно использовать также в вычисляемых полях запроса. Например, для
создания запроса "Итоги по клиентам" мы могли бы нместо запроса "Сведения о
заказах" использовать прямо таблицу "Заказано". На рис. 8.26 показано
вычисляемое поле "Стоимость". В выражение для этого поля включена функция Sum
():
Стоимость:
Sum(CCur([Заказано].[Цена]*[Количество]*(1-[Скидка])/100) *100)
Тогда в строке
Групповая операция (Total) для этого столбца должен быть выбран элемент
Выражение (Expression). При использовании группировки по полю
"КодЗаказа", поле "Стоимость" будет содержать общую стоимость
заказа.
Можно создать и
другое вычисляемое поле:
Стоимость:
CCur([Заказано].[Цена]*[Количество]*(1-[Скидка])/100) *100,
а функцию Sum ()
использовать в строке Групповая операция (Total). Оба варианта будут
правильны.
Можно изменить
этот запрос таким образом, чтобы посчитать общее число клиентов, заказов и общую
сумму всех заказов. В этом случае результатом запроса будет одна строка,
содержащая итоговые значения по всем полям. К сожалению, нельзя построить
запрос, результатом которого была бы таблица, содержащая как детальные, так и
итоговые данные, как это обычно бывает в таблицах Excel. Такое представление
данных можно организовать только в сводных таблицах.
Рис. 8.26.
Использование статистической функции в выражении для вычисляемого
поля
Внимание
Статистические функции при
вычислениях не обрабатывают записи, которые имеют значение Null в том поле, к
которому они применяются. Поэтому нужно быть осторожным при использовании
функции Count (). Она будет считать только те записи, которые не содержат пустых
значений. Если нужно сосчитать все записи в результирующем наборе или группе,
используйте функцию Nz (<имя поля>), которая преобразует пустое значение в
0, и только потом суммируйте.
Отбор повторяющихся записей и записей без
подчиненных
Типичной
операцией, которую приходится выполнять в базе данных, является поиск
дубликатов, т. е. повторяющихся записей в таблице. Например, можно выяснить, не
встречается ли в таблице "Клиенты" (Customers) одна и та же фирма несколько раз.
При этом необходимо сначала определить, какие записи считать дубликатами. В
данном случае дубликатами мы будем считать организации с одинаковыми названиями
и адресами. Можно создать запрос, который найдет все такие записи. Для этого
проще всего воспользоваться соответствующим мастером:
Рис. 8.27.
Диалоговое окно Мастера поиска повторяющихся
записей
Рис. 8.28.
Запрос, отбирающий повторяющиеся записи в таблице
"Клиенты"
In (SELECT [Название] FROM
[Клиенты] As Tmp GROUP BY [Название],[Адрес] HAVING Count(*)>l And [Адрес]
= [Клиенты].[Адрес])
Это выражение включает
еще один запрос. Такой запрос называется подчиненным запросом
(подробнее о подчиненных запросах см. разд. "Создание подчиненных запросов"
в конце данной главы). Чтобы посмотреть, как полностью выглядит инструкция
SQL, соответствующая этому запросу, нужно перейти в режим
SQL.
Совет
Мы рекомендуем при работе с
запросами в режиме Конструктора чаще открывать окно Режим SQL (SQL View).
Изучая, как Access создает инструкции SQL, можно постепенно выучить этот язык. Правда, помните,
что в данном случае мы имеем дело с диалектом стандартного языка SQL — Access
SQL. Ниже мы расскажем, чем он отличается от стандартного языка SQL (см. разд.
"Сравнение ANSI и Jet SQL" данной главы).
Такой поиск
разумно выполнять также в таблицах, которые экспортированы из другой среды,
например Excel. Эти таблицы могут содержать дублирующие записи, которые нужно
найти и удалить. Для удаления дубликатов можно воспользоваться процедурой,
которая описана в справке Access в разделе Работа с запросами, Работа с
запросами на изменение, Удаление повторяющихся записей из
таблицы.
Еще один мастер
позволяет найти все записи в главной таблице, которые не имеют связанных записей
в подчиненной таблице (обратной ситуации быть не должно, если вы правильно
установили флажки, обеспечивающие целостность данных) (см. также разд.
"Поддержка целостности данных" гл. 2).
Чтобы создать
запрос, который покажет всех клиентов, которые не имеют заказов:
В бланке запроса
в столбце "КодКлиента" задано условие — Is Null. Это означает, что выбираются
все клиенты, код которых отсутствует в таблице "Заказы" (Orders). Вы можете
использовать это условие всякий раз, когда нужно отыскать записи, у которых одно
из полей пусто.
Рис. 8.29.
Запрос для поиска записей, не имеющих подчиненных
записей
Сводная
таблица — это еще одно удобное средство для анализа данных. Они позволяют
превратить обычную таблицу или результирующее множество запроса, содержащее
большое число записей и непригодное для анализа, в компактную таблицу,
включающую только итоговые данные. Причем, в отличие от перекрестных запросов,
структура сводной таблицы легко трансформируется, позволяя просматривать данные
в различных разрезах и с различной степенью детализации, что и требуется для
анализа. Кроме того, данные, представленные в табличной форме, могут быть легко
преобразованы в графическую форму с помощью сводных диаграмм, что делает их еще
более наглядными.
Замечание
Режим Сводная таблица может
быть применен и к таблице, и к запросу, и к форме. Но, на наш взгляд, он
наиболее применим именно к запросу, который обычно объединяет данные из
нескольких таблиц и эти данные нужно иметь возможность представить в удобном для
анализа виде.
Для того чтобы
продемонстрировать возможности сводных таблиц, рассмотрим запрос "Счета"
(Invoices). Раскройте список запросов и откройте этот запрос в режиме Таблицы.
Вы увидите таблицу, которая содержит свыше двух тысяч записей и более двух
десятков полей. Теперь попробуем представить этот запрос в виде сводной
таблицы.
Рис. 8.30.
Макет сводной таблицы
Рис. 8.31.
Запрос "Счета" в режиме сводной таблицы
Когда таблица
отображается в режиме Сводная таблица, в верхней части окна приложения видна
специальная панель инструментов Сводные таблицы (Pivot Table). Эта панель
инструментов представлена на рис. 8.32.
Рис. 8.32.
Панель инструментов Сводные таблицы
Краткое описание
кнопок этой панели приведено в табл. 8.2.[Как и в других случаях, в таблице
представлены те кнопки, которые используются только в данном режиме.] В
дальнейших разделах этой главы мы познакомимся с большинством функций, связанных
с этими кнопками.
Таблица
8.2. Описание кнопок панели инструментов Сводные
таблицы
|
Кнопка |
Описание |
Команда
меню |
||
|
Автофильтр (AutoFilter) |
Устанавливает и
сбрасывает фильтры |
Сводная таблица,
Автофильтр (PivotTable,
AutoFilter) |
||
|
Показать верхние и
нижние элементы (Show Top/Bottom
Items) |
Устанавливает фильтр,
отображая заданное число первых или последних строк в' отсортированной
таблице |
Сводная таблица,
Показать верхние и нижние элементы (PivotTable, Show
Top/Bottom Items) |
||
|
Автовычисления (AutoCalc) |
Позволяет вычислить
промежуточные итоги по каждой группе записей |
Сводная таблица,
Автовычисления (PivotTable, AutoCalc) |
||
|
Итоги (Subtotal) |
Позволяет отображать
или скрывать итоговые столб- |
Сводная таблица,
Итоги (PivotTable, Subtotal
с) |
||
|
|
цы или
строки |
|
||
|
Вычисляемые итоги и
поля (Calculated Total and Fields) |
Позволяет задать
формулы для расчета как специальных полей, так и итоговых
данных |
Сводная таблица,
Вычисляемые итоги и поля (PivotTable, Calculated Total and
Fields) |
||
|
Отобразить как (Show
As) |
Позволяет отображать
итоговые значения в процентах относительно общего итога по столбцу, строке
или родительскому элементу на оси столбца или
строки |
Сводная таблица,
Отобразить как (PivotTable, Show As) |
||
|
Кнопка |
Описание |
Команда
меню |
||
|
Свернуть
(Collapse) |
Уменьшает на один шаг
уровень детализации отобра- |
Сводная таблица,
Свернуть (PivotTable,
Collapse) |
||
|
|
жаемых данных в
выделенной области таблицы |
|
||
|
Развернуть
(Expand) |
Увеличивает на один
шаг уровень детализации отображаемых данных в выделенной области
таблицы |
Сводная таблица,
Развернуть (PivotTable,
Expand) |
||
|
Скрыть
подробности (Hide
Details) |
Позволяет скрыть
детальные данные и оставить только подытоги и
итоги |
Сводная таблица,
Скрыть подробности (PivotTable, Hide Details) |
||
|
Подробности (Show
Details) |
Отображает все данные
в строках или столбцах таблицы |
Сводная таблица,
Подробности (PivotTable, Show
Details) |
||
|
Обновить
(Refresh) |
Обновляет сводную
таблицу, выполняя повторный запрос к базе данных |
Сводная таблица,
Обновить (PivotTable,
Refresh) |
||
|
Экспорт в Microsoft
Excel (Export to Microsoft Excel) |
Обеспечивает экспорт
сводной таблицы в интерактивный сводный отчет Microsoft
Excel |
Сводная таблица,
Экспорт в Microsoft Excel (PivotTable, Export to Microsoft
Excel) |
||
|
Список полей (Field
List) |
Отображает диалоговое
окно со списком полей таблицы |
Вид, Список полей
(Field List) |
||

Рис. 8.33.
Отображение итоговых данных в режиме сводной
таблицы
Определим
итоговые столбцы.
Окончательный
вид таблицы представлен на рис. 8.33.
Фильтрация данных сводной таблицы
Сейчас в таблице
отображаются данные о продажах по всем товарам и всем странам. Она напоминает
результат перекрестного запроса, но далее вы убедитесь, как легко можно с ней
манипулировать, отображая в ней разные данные. Например, она может быть очень
легко изменена когда требуется посмотреть выборочно данные по отдельной стране
или странам и некоторым товарам, т. е. по тем полям, которые отображаются в
области фильтра, области строк и области столбцов.
Справа от
названия каждого из этих полей видна небольшая стрелка вниз. Щелкните по этой
стрелке в поле "Страна" (Country) в области фильтра. Появится небольшое окно со
списком значений поля, которые присутствуют в исходных данных. По умолчанию у
каждой страны установлен флажок (рис. 8.34).
Рис. 8.34.
Выпадающий список значений поля
Сбросьте флажок
у первой строки — Все (АН), щелкнув по нему мышкой. Все флажки одновременно
сбросятся. Затем установите его только у одной страны, например Бельгия, и
нажмите кнопку ОК. Теперь ваша таблица отображает данные только по
Бельгии. Под названием поля "Страна" (Country) отображается название выбранной
страны.
Если нужно
отобразить данные сразу для нескольких стран (но не всех), просто установите в
списке значений флажки у этих стран. Данные в таблице опять изменятся, только, к
сожалению, не видно, какие страны участвуют в выборке — под названием поля в
области фильтра указывается просто несколько элементов (Multiple
Items).
Однако таблицу
можно настроить таким образом, чтобы она не позволяла делать множественный выбор
в полях фильтра.[Слово "полях" мы употребили не случайно, т. к. в этой
области может быть несколько полей.]
Для
этого:
Рис. 8.35.
Диалоговое окно Свойства
Рис. 8.36.
Окно значений поля с отключением множественного
выбора
Теперь рассмотрим, как можно
фильтровать отображаемые в таблице данные по значениям поля "Марка"
(ProductName), которое находится в области строк.
Раскройте список
значений поля, щелкнув по стрелке справа от названия поля. Сбросьте флажок
Все (Аll) и установите флажки напротив нужных товаров. Нажмите кнопку
ОК. Таблица стала намного короче, а в названии столбца появился значок
фильтра (рис. 8.37).
Рис. 8.37.
Сводная таблица с фильтром по товарам
Чтобы сбросить
установленный фильтр, нажмите кнопку Автофильтр (AutoFilter) на панели
инструментов. Обратите внимание, что при этом сбрасываются все фильтры, в том
числе установленные в области фильтра. Последний установленный фильтр
сохраняется, и если вы нажмете эту кнопку еще раз, то снова увидите
отфильтрованные данные.
Можно установить
фильтр и другими • способами. Например, можно отобразить только те товары,
которые принесли больше всего или меньше всего дохода. Проще всего для этого
воспользоваться специальной кнопкой на панели инструментов.
Чтобы убрать
этот фильтр, достаточно нажать ту же кнопку еще раз и выбрать элемент
Показать все (Show All).
Кнопка
Показать верхние и нижние элементы (Show Top/Bottom Items) позволяет
фильтровать данные, основываясь на значениях в области детальных и итоговых
данных. Более гибко устанавливать фильтр можно, задавая значения в окне
Свойства (Properties).
Рис. 8.38.
Товары — лидеры продаж
Рис. 8.39.
Фильтр для первых элементов сводной таблицы
Сводные таблицы
предназначены только для чтения, данные в них нельзя изменять. Но зато
пользователь может очень легко трансформировать сводную таблицу: добавлять новые
строки и столбцы, менять их местами, изменять названия полей и уровень
детализации отображаемых данных.
В каждой области
таблицы может размещаться не одно, а несколько полей данных. Чтобы добавить
неиспользованные поля запроса в сводную таблицу, просто перетащите их мышью в
нужную область.
Например, можно
добавить в область фильтра поле "Клиенты. Название" (CompanyName), что позволит
фильтровать данные не только по странам, но и по клиентам. Перетащите поле
"Клиенты. Название" (CompanyName) из списка полей в область фильтра и поместите
его рядом с полем "Страна" (Country). Устанавливая флажки против нужных
клиентов, вы сможете получать сводные данные по счетам для каждого
клиента.
Чтобы удалить
поле строки, столбца или фильтра из таблицы, перетащите его мышью за пределы
сводной таблицы (при этом рядом с курсором появится изображение креста). Поле
исчезнет из таблицы.
Вы можете легко
поменять местами поля из области фильтра и из области столбцов или строки
поменять местами со столбцами. Переместите поле "Клиенты.Название" (CompanyName)
в область столбцов, а поле "Годы" (Year) — в область фильтра. Теперь в столбцах
таблицы будут отображаться данные по продажам для каждого клиента (рис. 8.40),
а, используя поле "Дата размещения по месяцам" (Order Date By Month), вы сможете
фильтровать эти данные.
Рис. 8.40.
Отображение в сводной таблице данных по клиентам
Совет
При переносе полей
обращайте внимание на форму указателя мыши. Когда он попадает в одну из областей
таблицы — строк, столбцов, данных или фильтра — его форма меняется, и по ней
можно определить, когда следует отпускать кнопку мыши.
В отличие от
аналогичных таблиц в перекрестном запросе, данные в сводной таблице легко
сортировать. Для этого используются стандартные кнопки Сортировать по
возрастанию (Sort Ascending) и Сортировать по убыванию (Sort
Descending) на панели инструментов.
Нужно выделить
поле, по которому вы хотите отсортировать данные, и нажать соответствующую
кнопку на панели инструментов. Если выделить поле в области строк, то данные
будут отсортированы в порядке возрастания или убывания значений этого поля (в
нашем примере названия товаров будут отсортированы в алфавитном порядке). Если
выделить поле в области столбцов, то столбцы в таблице будут отсортированы в
порядке возрастания значений в заголовках столбцов (в данном примере клиенты
будут выведены в алфавитном порядке). Если выделить область детальных и итоговых
данных таблицы, то она будет отсортирована в порядке возрастания (или убывания)
значений в столбце "Общие итоги" (Grand Total).
Вернемся к
первоначальному виду таблицы, когда в столбцах отображались данные по годам (см.
рис. 8.33). Рассмотрим, как можно изменить уровень детализации данных, выводимых
в сводной таблице.
Обратите
внимание, что в наименованиях поля столбцов справа виден маркер развертывания
(значок плюса в квадратике). Это означает, что в данный момент отображаются
данные самого верхнего уровня детализации.
Замечание
Обратите внимание, что,
выполняя все эти операции, мы не создавали никаких вычисляемых полей. Так,
Access 2002 умеет работать с данными типа Дата
(Date/Time).
Рис. 8.41.
Детализация данных по столбцам сводной таблицы
Для того чтобы
отображать или скрывать детальные данные, можно использовать также маленькие
кнопочки с изображением знаков плюса и минуса, находящиеся у каждого значения
поля, как в строках, так и в столбцах.
Рис. 8.42.
Итоговые данные по строкам сводной таблицы
Аналогично
отображаются и скрываются данные и для столбцов таблицы.
Детализация
данных может быть изменена также при добавлении новых полей в область строк или
столбцов. Например, можно добавить в область строк поле "Категория" (Category) и
сгруппировать все товары по категориям.
Поле "Категория"
отсутствует в исходном запросе "Счета" (Invoices), поэтому сначала нужно перейти
в режим Конструктора, добавить к запросу таблицу "Типы" (Categories), затем
добавить в бланк запроса поле "Категория" (CategoryName) из этой таблицы и снова
вернуться в режим сводной таблицы. В списке полей появится новое поле. Далее
необходимо осуществить следующие действия.
Рис. 8.43.
Добавление поля в область строк
Рис. 8.44.
Отображение товаров, сгруппированных по категориям
Как вы уже
убедились, при создании сводной таблицы Microsoft Access автоматически добавляет
общие итоги для строк и столбцов. Кроме того, если в области строки или столбца
содержится больше одного поля, то выводятся и промежуточные итоги. Вы научились
скрывать детальные данные, отображая в таблице только итоговые. Но можно
скрывать при желании и итоговые данные, оставляя в таблице только детальные.
Кроме того, для расчета итоговых значений можно использовать несколько функций,
а не только суммирование, как это было показано в приведенном выше примере. И,
наконец, для расчета итоговых значений можно создавать и добавлять в таблицу
вычисляемые поля. Об этих возможностях и будет рассказано в данном
разделе.
Чтобы скрыть
общий итог по строкам, необходимо выделить крайнее левое поле в области строк (в
нашем примере "Категория" (CategoryName)) и нажать кнопку Итоги
(Subtotal) на панели инструментов. Аналогично, чтобы скрыть общий итог по
всем столбцам, нужно выделить самое левое поле в области столбцов и нажать ту же
кнопку. На рис. 8.45 показана таблица нашего примера со скрытыми значениями
общих итогов.
Чтобы снова
отобразить общий итог, опять выделите нужное поле и нажмите эту кнопку второй
раз.
Если вы выделите
любое другое поле в области строк или столбцов и нажмете кнопку Итоги
(Subtotal), будут скрыты промежуточные итоги для этого поля.
Для создания
итоговых значений мы использовали команду Автовычисления (AutoCalc). Эта
команда в зависимости от типа данных в поле, по которому подводятся итоги, сама выбирает подходящую
функцию. Например, если поле числового типа, обычно используется функция Sum (),
если текстового — Count (). Вообще говоря, для расчета итоговых значений можно
использовать почти те же статистические функции, что и при группировке в
запросах на выборку. Список этих функций приведен в табл. 8.1 (см. разд.
"Статистические функции для выполнения расчетов" выше в этой главе). В
данном случае отсутствуют только функции First () и Last ().
Рис. 8.45.
Сводная таблица со скрытыми общими итогами
Например, если
сводная таблица содержит данные с оценками по всем предметам учеников в школьном
классе, то итоговым значением, скорее всего, будет средний бал, для вычисления
которого можно использовать функцию Avg (). В одной сводной таблице может быть
представлено несколько типов итоговых значений. Например, в нашей таблице можно
в качестве итоговых значений отображать не только общие суммы, вырученные за
проданные товары, но и количество выписанных счетов. Для того чтобы добавить еще
одно итоговое поле, выделите поле "Марка" (ProductName) в области строк и
нажмите кнопку Автовычисления (AntoCalc). Выберите из списка функцию
Count (). Через несколько секунд в сводной таблице для каждого года будет
отображено два столбца:
Но второй
столбец с итоговыми значениями может быть отображен и по-другому — в виде
строки. Для этого:
Рис. 8.46.
Сводная таблица с несколькими итоговыми полями

Рис. 8.47.
Создание вычисляемого поля
Для отображения
итоговых значений могут быть использованы также вычисляемые поля. Для добавления
вычисляемого поля нажмите кнопку Итоги и вычисляемые поля (Calculated
Total and Fields) на панели инструментов и выберите из раскрывшегося меню
значение Создание вычисляемого итога (Create Calculated Total). В области
данных появятся дополнительные строки или столбцы, и будет открыта вкладка
Вычисление (Calculated) диалогового окна Свойства (Properties)
(рис. 8.47).
Вы должны ввести
имя нового поля в поле Имя (Name), а формулу для расчета значения — в большое
поле, расположенное ниже. Если для составления выражения нужно сослаться на
какое-то поле, выберите имя этого поля в списке в нижней части вкладки и нажмите
кнопку Добавить ссылку на (Insert Reference to). Когда выражение будет
готово, нажмите кнопку Изменить (Change).
Аналогично можно
добавить вычисляемое поле и в детальные данные таблицы, хотя в этом случае
вычисляемое поле можно создать и в исходном запросе.
Форматирование сводной таблицы
Для
форматирования полей сводной таблицы используется диалоговое окно Свойства
(Properties). Можно задать формат для полей области фильтра, строк, столбцов и
детальных данных. Для этого сначала нужно выделить поле, а затем раскрыть
вкладку Формат (Format) диалогового окна свойств. Эта вкладка показана на
рис. 8.48.
Рис. 8.48.
Диалоговое окно Свойства сводной таблицы, вкладка
Формат
Из этого рисунка
видно, что для поля можно определить:
Если в области
данных отображаются числовые поля, даты или время,-то можно задать формат
отображения данных в этих полях — либо выбрать из списка стандартный формат,
либо задать нужный формат с помощью маски. Используйте для этого поле Число
(Number).
Кроме того,
можно задать формат заголовков полей сводной таблицы, для чего предназначена
вкладка Заголовки (Caption) (рис. 8.49).
Рис. 8.49.
Диалоговое окно Свойства сводной таблицы, вкладка
Заголовки
В поле
Заголовок (Caption) можно задать текст, который будет отображен в
названии поля, и затем формат этого текста.
Для того чтобы
отображение данных было еще более наглядным, можно использовать сводные
диаграммы. Сводная диаграмма строится автоматически на основе уже созданной
сводной таблицы, но может также строиться и самостоятельно, на основе исходной
таблицы или запроса. Когда диаграмма построена, ее можно перестраивать,
перетаскивая поля, аналогично тому, как это делается в сводных
таблицах.
Создать
диаграмму на основе сводной таблицы очень просто. Переключитесь в режим
Сводная диаграмма (PivotChart View), и на экране появится сводная
диаграмма, примерно такая, как на рис. 8.50.
Как и сводная
таблица, она имеет поле фильтра — "Страна" (Country), которое отображается в
левом верхнем углу экрана, поля строк и столбцов, которые здесь отображаются
справа и снизу. Эта сводная диаграмма тесно связана с таблицей. Если вы
переключитесь в режим сводной таблицы и измените ее структуру, это изменение
будет отображено и на сводной диаграмме, и наоборот, если сейчас изменить
структуру сводной
диаграммы, то это изменение появится и на сводной таблице, когда вы вновь
переключитесь в тот режим.
Рис. 8.50.
Сводная диаграмма, построенная на основе сводной
таблицы
Но можно создать
диаграмму и непосредственно на базе запроса или таблицы. При этом одновременно
будет создаваться и сводная таблица. Сводная таблица и сводная диаграмма — это
две формы представления одних и тех же данных.
В качестве
примера предлагается построить сводную диаграмму для запроса "Продажи по
сотрудникам и странам" (Employee Sales by Country).
Рис. 8.51.
Макет сводной диаграммы
Рис. 8.52.
Сводная диаграмма "Продажи по сотрудникам и
странам"
Рис. 8.53.
Сводная таблица "Продажи по сотрудникам и странам"
Примечание
Каи уже говорилось выше,
одновременно со сводной диаграммой создается и сводная -
таблица.
Так же, как и
сводная таблица, сводная диаграмма является очень гибкой, и ее можно легко
трансформировать, добавляя и удаляя поля, перемещая их из одной области в
другую. Кроме того, можно изменить тип диаграммы, например, превратить ее из
гистограммы в график (рис. 8.54). В этом случае каждая ломаная линия
соответствует серии столбцов на столбчатой диаграмме. Каждая линия выделяется
своим цветом и видом точек. Легенда описывает, какому значению поля "Годы"
(Year) соответствует каждая линия.
Рис. 8.54.
Диаграмма в виде графика
Для того чтобы
изменить тип диаграммы, щелкните мышью в любом месте области диаграммы и
убедитесь, что эта область выделена. Тогда становится доступна кнопка Тип
диаграммы (Chart Type) на панели инструментов (рис. 8.55). Нажмите эту
кнопку. В диалоговом окне Свойства (Properties) раскроется вкладка Тип
(Туре). На ней представлены все типы диаграмм, которые могут быть построены.
Выберите нужный тип из
списка, а затем подтип справа и остановитесь на том типе, который вам больше
нравится.
Рис. 8.55.
Изменение типа сводной диаграммы
Можно очень
легко поменять местами поля рядов и категорий. Для этого достаточно нажать
кнопку По строке или по столбцу (By Row/By Column) на панели
инструментов. И диаграмма мгновенно трансформируется (рис. 8.56). Остальные
кнопки панели инструментов, такие как Свернуть (Collapse), Развернуть
(Expand), Автовычисления (AutoCalc), работают так же, как и в сводной
таблице.
Можно
поворачивать диаграмму по часовой или против часовой стрелки. Для этого, выделив
область диаграммы, необходимо открыть вкладку Общие (General) диалогового
окна Свойства (Properties) и использовать четыре кнопки: Отразить
справа налево (Flip Horizontal), Отразить сверху вниз (Flip
Vertical), Повернуть на 90° по часовой стрелке (Rotate Clockwise) и
Повернуть на 90° против часовой стрелки (Rotate Counter
Clockwise).
Рис. 8.56.
Трансформация сводной диаграммы
Форматирование элементов сводной диаграммы
Форматирование
элементов сводной диаграммы выполняется с помощью различных вкладок диалогового
окна Свойства (Properties):
Мы не будем
здесь описывать подробно все возможности форматирования диаграммы (их очень
много), поскольку вы сами сможете легко понять, как изменяются параметры в окне
Свойства (Properties), и получать диаграммы, удовлетворяющие самого
требовательного начальника.
Настройка свойств полей в запросе и свойств самого
запроса
По умолчанию
поля в запросе наследуют все свойства, которые определены для поля
соответствующей таблицы. Однако можно изменить значение этих свойств, и эти
изменения будут влиять только на поля в запросе и не будут влиять на поля в
исходной таблице.
К вычисляемому
полю в запросе применимы только свойства, заданные в запросе, т. к. данные,
отображаемые в вычисляемом поле, не хранятся в исходной таблице. Например, если
значение в поле вычисляется путем перемножения чисел, которые не являются
целыми, следует установить свойство Формат (Format) для этого поля. Можно
также, вместо того, чтобы устанавливать свойство Формат, применить
функцию Format (<имя поля>, <формат>) или подходящую функцию
преобразования типов данных, чтобы получить отображение данных в столбце в
требуемом формате.
Существует
несколько способов вывода на экран диалогового окна, содержащего свойства
запроса или свойства поля в запросе. Сначала нужно щелкнуть левой кнопкой мыши в
нужном столбце или на свободном поле в верхней панели запроса (для вывода
свойств самого запроса), затем нажать кнопку Свойства (Properties) на
панели инструментов или выполнить команду Вид, Свойства (View,
Properties). Появится диалоговое окно, содержащее соответствующий список
свойств. Кроме того, можно щелкнуть правой кнопкой мыши в столбце бланка запроса
и выбрать в контекстном меню команду Свойства (Properties). Самый быстрый
способ вывода окна свойств запроса — это дважды щелкнуть левой кнопкой мыши по
свободной области верхней части окна запроса.
В окне свойств
поля можно задать значения четырех свойств:
Каждое из
перечисленных свойств соответствует соглашениям о свойствах полей таблиц.
Присваивание значения свойству Подпись (Caption) эквивалентно указанию
префикса в строке Поле (Field) в бланке запроса для этого поля. Значение
свойства Маска ввода (Input Mask) необязательно соответствует значению
свойства Формат поля (Format). Например, поле с типом данных
Дата/время (Date/Time) может иметь средний формат даты для вывода, а в
маске ввода можно задать короткий формат.
Диалоговое окно
Свойства запроса (Query Properties) представлено на рис.
8.57.
Рис. 8.57.
Диалоговое окно Свойства запроса
Последние пять
свойств позволяют задать свойства подчиненной таблицы, если в запросе
отображаются записи как главной, так и подчиненной таблиц: имя таблицы,
связывающие поля в главной и подчиненной таблицах, высота таблицы и будет ли она
по умолчанию отображаться или же будет скрыта.
Все запросы,
которые мы рассматривали до сих пор, создавались либо с помощью мастера, либо с
помощью Конструктора запросов. Конструктор запросов представляет собой
графический инструмент для создания запросов по образцу (QBE — Query By
Example). Однако на самом деле любой запрос хранится в базе данных в формате SQL
(Structured Query Language — язык структурированных запросов). Основное
достоинство этого языка состоит в том, что он является стандартом для
большинства реляционных СУБД. SQL имеет унифицированный набор инструкций,
которые можно использовать во всех СУБД, поддерживающих этот язык. Действующим
на данный момент стандартом языка SQL является принятая Американским
национальным институтом стандартов (American National Standards Institute —
ANSI) версия SQL-92. Фирмы — разработчики СУБД при реализации языка SQL могут
вносить в него расширения, но обязаны реализовать базовый набор команд ASNSI
SQL.
Процессор
обработки данных Jet является составной частью Access и выполняет инструкции
Access SQL (Jet SQL), который отличается от ANSI SQL существенно (как правило,
настольные СУБД, совместимые со стандартом SQL, реализуют не все инструкции ANSI
SQL).
Замечание
В дальнейшем для
обозначения используемого в Access диалекта языка SQL мы будем применять термин
Jet SQL. Это будет правильнее, т. к. процессор обработки данных используется не
только в приложениях, созданных в среде Access, но и в приложениях,
разработанных с помощью Microsoft Visual Basic.
В данном разделе
мы собираемся дать обзор используемого в Access языка SQL и показать, как можно
создать запросы, которые невозможно создать с помощью Конструктора
запросов.
Язык Jet SQL
почти соответствует стандарту ANSI SQL-89. В реализацию языка SQL для Microsoft
Jet 4.x (используемого, начиная с версии Microsoft Access 2000) внесены
несколько расширений, которые приближают его к стандарту ANSI SQL-92
и
Transact-SQL —
диалекту языка SQL для Microsoft SQL Server. Для тою чтобы обеспечить
совместимость с предыдущими версиями Microsoft Jet, эти расширения можно
использовать только в специальном режиме — ANSI SQL-92.
Замечание
Режим ANSI SQL-92 доступен
только при использования программы Microsoft OLE DB Provider для
Jet.
Все запросы,
которые создаются в режиме ANSI SQL-92, помечаются специальным флажком, причем в
одной базе данных могут храниться как обычные SQL-запросы, так и запросы,
созданные в расширенном синтаксисе.
Основные различия языков Jet SQL и ANSI SQL состоят в следующем:
Зарезервированные слова Jet SQL
Приведенные
здесь таблицы предназначены для сравнения зарезервированных слов ANSI SQL и Jet
SQL.
Ниже
перечисляются зарезервированные слова Jet SQL, которые идентичны
зарезервированным словам ANSI SQL (знаком звездочки помечены слова, которые
доступны только в режиме ANSI SQL-92):
|
ADD |
COMMIT* |
FETCH* |
MAX |
ROLLBACK* |
||
|
ALL |
CONSTRAINT |
FROM |
MIN |
SELECT |
||
|
ALTER |
COUNT |
FOREIGN |
NOT |
SET |
||
|
ANY |
CREATE |
GRANT* |
NULL |
SOME |
||
|
ALIAS |
CREATE
VIEW* |
HAVING |
ON |
TRANSACTION* |
||
|
AS |
CURRENT* |
IN |
OR |
UNION |
||
|
ASC |
CURSOR* |
INDEX |
ORDER |
UNIQUE |
||
|
AUTHORAZATI
ON* |
DECLARE* |
INNER |
OUTER |
UPDATE |
||
|
AVG |
DELETE |
INSERT |
PARAMETERS |
VALUE |
||
|
BEGIN* |
DESC |
INTO |
PRIMARY |
VALUES |
||
|
BETWEEN |
DISALLOW |
IS |
PRIVILEGES* |
WHERE |
||
|
BY |
DISTINCT |
JOIN |
PROCEDURE |
WORK* |
||
|
CHECK* |
DROP |
KEY |
REFERENCES |
|
||
|
CLOSE* |
DROP
VIEW* |
LEFT |
REVOKE* |
|
||
|
COLUMN |
EXISTS |
LIKE |
RIGHT |
|
||
Зарезервированные слова, обозначающие типы данных, не включены в этот
список, т. к. соответствие типов данных ANSI SQL и Jet SQL приводится ниже, в
табл. 8.6. Большинство операторов сравнения в ANSI SQL и Jet SQL совпадают: =,
<, <=, > и =>. Исключение составляет оператор неравенства. Оператору
неравенства ! = в ANSI SQL соответствует оператор <> в Jet
SQL.
Как и в ANSI
SQL, зарезервированное слово Jet SQL IN может быть использовано для задания
списка значений в предложении WHERE или списка, созданного подчиненным запросом.
Оператор IN также может использоваться для идентификации таблицы в другой базе
данных.
Хотя в последней
версии Jet SQL появились новые инструкции, связанные с обработкой транзакций
(раньше они реализовывались с помощью процедур VBA), тем не менее существует
отличие в механизме выполнения транзакции от рекомендуемого ANSI
SQL:
В обычном режиме
ряд инструкций ANSI SQL не поддерживается, однако их можно реализовать другими
средствами Access: меню, кнопками, диалоговыми окнами. В табл. 8.3 приведен
список инструкций ANSI SQL и эквивалентные им средства Access.
Таблица
8.3. Зарезервированные слова ANSI SQL, не поддерживаемые Access
SQL
|
Зарезервированное
слово |
Эквивалент в
Access |
||
| AUTHORIZATION | Диалоговое окно прав доступа | ||
| BEGIN | Метод Access VBA BeginTrans
|
||
| CHECK | Свойство Условие на значение поля таблицы | ||
| CLOSE | Кнопка системного меню Закрыть | ||
|
COMMIT |
Метод Access VBA
CommitTrans |
||
|
CREATE
VIEW |
Режим конструктора
запросов и фильтры |
||
|
CURRENT |
Запрос в режиме
таблицы, области выделения записи |
||
|
CURSOR |
Запрос в режиме
таблицы |
||
|
DECLARE |
Запрос в режиме
таблицы (курсор поддерживается автоматически) |
||
|
DROP
VIEW |
Режим конструктора
запросов |
||
|
FETCH |
Поля в форме или
отчете |
||
|
GRANT, PRIVILEGES,
REVOKE |
Диалоговое окно прав
доступа |
||
|
ROLLBACK |
Метод Access VBA
RollbackTrans |
||
|
TRANSACTION |
Методы транзакций в
Access VBA |
||
|
VALUES |
Значения, введенные в
таблицы или формы |
||
|
WORK |
Метод Access VBA
BeginTrans |
||
Функции и
операторы Access, используемые вместо ключевых слов ANSI
SQL
Часть
зарезервированных слов ANSI SQL заменяется в Jet SQL операторами или функциями.
В табл. 8.4 перечислены функции и операторы Jet SQL, которые соответствуют
зарезервированным словам ANSI SQL.
Таблица
8.4. Функции и операторы Access, используемые вместо
зарезервированных слов ANSI SQL
|
Access |
ANSI
SQL |
||
|
;
And |
AND |
||
|
Avg (
) |
AVG() |
||
|
Between |
BETWEEN |
||
|
Count (
) |
COUNT |
||
|
Is |
IS |
||
|
Like |
LIKE |
||
|
Access |
ANSI
SQL |
||
|
Мах(
) |
MAX() |
||
|
Min(
) |
MIN() |
||
|
Not |
NOT |
||
|
Null |
NULL |
||
|
Or |
OR |
||
|
Sum(
) |
SUM |
||
Функция Access
IsNull(), возвращающая значение True (-1), если ее аргумент равен лустому
значению, и False (0) — в обратном случае, не имеет эквивалента в ANSI SQL и не является заменой
модификаторов is Null или is Not Null в предложении WHERE. Кроме того, Jet SQL
не поддерживает статистические функции по подмножеству, аргументом которых
является любое выражение с параметром DISTINCT, например AVG (DISTINCT
имя__поля). В таких случаях требуется использовать параметр DISTINCTROW в
инструкции SELECT. Выражения, в которых применяются операторы, такие как,
например, And или Or, заключаются в инструкциях Jet SQL в скобки.
Оператор
Between. . .And, который имеет синтаксис
<выражение>
[NOT] Between <значение_1> And <значение_2>
по-разному
трактуется в языках Jet SQL и ANSI SQL. В языке Jet SQL значение_1 может
превышать значение_2; в ANSI SQL значение_1 должно быть меньше или равно
значение_2.
Зарезервированные слова Jet SQL и функции, не входящие в ANSI
SQL
Существует
несколько зарезервированных слов Jet SQL, которые не имеют аналогов в ANSI SQL.
Это слова:
Кроме того, Jet
позволяет использовать четыре статистические функции по подмножеству, не
включенные в ANSI SQL (табл. 8.5).
Таблица
8.5. Дополнительные статистические функции Access
SQL
|
Функция
Access |
Назначение |
||
|
StdDev() |
Смещенное значение
среднеквадратичного отклонения для выборки |
||
|
StdDevP (
) |
Несмещенное значение
среднеквадратичного отклонения для выборки |
||
|
Var
() |
Значение смещенной
дисперсии для выборки |
||
|
VarP (
) |
Значение несмещенной
дисперсии для выборки |
||
Эквивалентные типы данных Jet SQL и ANSI SQL
В табл. 8.6
перечислены типы данных ANSI SQL, эквивалентные им типы данных языка Jet SQL и
допустимые синонимы.
Таблица
8.6. Эквивалентные типы данных Jet SQL и ANSI SOL
|
Типы данных ANSI
SQL |
Типы данных Jet
SQL |
Синоним |
Примечание |
||
|
BIT, BIT
VARYING |
BINARY |
VARBINARY, BINARY
VARYING BIT VARYING |
He является
стандартным типом данных Access |
||
|
He
поддерживается |
BIT |
BOOLEAN, LOGICAL,
LOGICAL1, YESNO |
В Access эквивалентно
типу данных Логический |
||
|
He
поддерживается |
TINYINT |
INTEGER 1,
BYTE |
Целое число длиной 1
байт |
||
|
He
поддерживается |
COUNTER |
AUTOINCREMENT |
|
||
|
He
поддерживается |
MONEY |
CURRENCY |
В Access эквивалентно
типу данных Денежный |
||
|
DATE, TIME,
TIMESTAMP |
DATETIME |
DATE,
TIME |
В Access эквивалентно
типу данных Дата/Время |
||
|
He
поддерживается |
UNIQUEIDEN
TIFIER |
QUID |
|
||
|
DECIMAL |
DECIMAL |
NUMERIC,
DEC |
|
||
|
REAL |
REAL |
SINGLE, FLOAT4,
IEEESINGLE |
Тип данных Числовой
(с плавающей точкой, 4 байта) |
||
|
DOUBLE PRECISION,
FLOAT |
FLOAT |
DOUBLE, FLOATS,
IEEEDOUBLE, NUMBER |
Тип данных Числовой
(с плавающей точкой, 8 байтов) |
||
|
SMALLINT |
SMALLINT |
SHORT,
INTEGER2 |
Тип данных Числовой
(2 байта) |
||
|
INTEGER |
INTEGER |
LONG, INT,
INTEGER4 |
Тип данных Числовой
(длинное целое) |
||
|
INTERVAL |
He
поддерживается |
|
|
||
|
He
поддерживается |
IMAGE |
LONGBINARY, GENERAL,
OLEOBJECT |
Тип данных поля
объекта OLE |
||
|
He
поддерживается |
TEXT |
LONGTEXT, LONGCHAR,
MEMO, NOTE, NTEXT |
Тип данных Поле
Memo |
||
|
CHARACTER, CHARACTER
VARYING, NATIONAL CHARACTER, NATIONAL CHARACTER
VARYING |
CHAR |
TEXT(n),
ALPHANUMERIC, CHARACTER, STRING, VARCHAR, CHARACTER VARYING, NCHAR,
NATIONAL CHARACTER, NATIONAL CHAR, NATIONAL CHARACTER VARYING, NATIONAL
CHAR VARYING |
Тип данных
Текстовый |
||
Реализация SQL
процессора Jet 4.x имеет существенные отличия в типах данных от
предыдущей версии Jet SQL, а именно:
Подстановочные знаки при сравнении строк
В данном случае
речь идет о трех подстановочных знаках, приведенных в табл. 8.7.
Таблица
8.7. Соответствие подстановочных знаков
|
Jet
SQL |
ANSI
SQL |
Примечание |
||
|
? |
(подчеркивание) |
Любой одиночный
символ |
||
|
* |
% |
Произвольное
количество символов |
||
|
# |
He имеет
эквивалента |
Любая цифра от 0 до
9 |
||
|
[список_знаков] |
Не имеет
эквивалента |
Любой одиночный знак,
входящий в список
знаков |
||
|
[!
список_знаков] |
Не имеет
эквивалента |
Любой одиночный знак,
не входящий в список знаков |
||
Язык SQL
Microsoft Jet поддерживает использование в операторе Like как подстановочных
знаков ANSI SQL (_ и #), так и подстановочных знаков ядра Microsoft Jet (? и
*). Однако подстановочные знаки ANSI SQL доступны только в режиме ANSI SQL-92, в
противном случае они воспринимаются просто как строковые константы. И наоборот,
в режиме ANSI SQL-92 подстановочные знаки Jet SQL трактуются как строковые
константы. Таким образом, нельзя в одном запросе смешивать эти
знаки.
Ниже перечислены
важные правила установления совпадения оператором Like.
Зарезервированные слова DISTINCTROW w
DISTINCT
Зарезервированные слова DISTINCTROW и DISTINCT в инструкции SELECT Jet
SQL позволяют исключить из результирующего множества повторяющиеся строки.
Разница между этими словами состоит в том, как при их использовании определяются
повторяющиеся записи.
Если в
инструкции SELECT используется слово DISTINCTROW, то для сравнения записей
применяются все поля исходной таблицы, независимо от того, какие из этих полей
включены в запрос.
Если в
инструкцию SELECT входит слово DISTINCT, то для сравнения записей используются
данные в строках результирующего множества запроса, т. е. только те поля,
которые включены в запрос.
Замечание
Модификаторы могут
использоваться не только в инструкции SELECT, но также и в запросах на
добавление записей и на создание таблицы.
Для того чтобы
понять, как влияет включение этих слов в запрос на его результат, построим
запрос, который будет показывать, какие товары приобрел каждый
клиент:
Вы должны
получить результирующее множество, которое содержит 2169 записей. При этом те
клиенты, которые не сделали ни одного заказа, в результирующее множество .не
попадут, однако клиенты, которые заказывали один и тот же товар несколько раз,
могут попасть в таблицу несколько раз. Теперь добавим в инструкцию SQI, SELECT слово DISTINCTROW для
зтого:
Рис. 8.58.
Инструкция SQL с модификатором DISTINCTROW
В данном случае
разницы между употреблением этих модификаторов нет (в других случаях может
получиться иной результат). Однако при попытке редактировать данные в таблице вы
убедитесь, что при использовании модификатора DISTINCT результирующий набор
записей получается необновляемым, а модификатор DISTINCTROW допускает изменение
данных в результирующем наборе.
Вместо того
чтобы вносить эти модификаторы вручную в режиме SQL, можно просто установить
соответствующие свойства запроса. Чтобы открыть диалоговое окно свойств запроса,
щелкните правой кнопкой мыши по свободному полю в верхней панели окна
Конструктора запроса и выберите из контекстного меню команду Свойства
(Properties). Появляется диалоговое окно, представленное на рис.
8.57.
Два свойства в
этом окне определяют использование модификаторов DISTINCTROW и DISTINCT:
Уникальные значения (Unique Values) и Уникальные записи (Unique
Rows). Свойство Уникальные значения соответствует модификатору DISTINCT,
a свойство
Уникальные записи — модификатору DISTINCTROW. Если вы попробуете
установить эти значения, то увидите, что Access не позволит установить значения
Да (Yes) для обоих свойств. Если одно из них имеет значение Да (Yes), то
для второго автоматически устанавливается значение Нет (No). Если оба
свойства имеют значение Нет (No), запрос будет включать в результирующий
набор все записи.
Замечание
Свойство Уникальные
записи имеет смысл только для запроса, который строится по нескольким
таблицам. Если запрос имеет только одну таблицу, значение этого свойства
игнорируется.
Использование разделителей и символов SQL
Разделителями в
SQL также являются запятая, точка, точка с запятой и двоеточие. Описанные ниже
разделители применяются с небольшими отличиями в ANSI SQL и в Jet SQL. Так в Jet
SQL:
В инструкциях
SQL, разбитых на несколько строк, часто встречаются отступы, которые указывают
на продолжение предыдущей строки или на фрагмент, связанный с расположенным на
предыдущей строке ключевым словом.
Использование инструкций SQL для создания
запросов
Есть несколько
типов запросов, которые невозможно создать с помощью Конструктора запросов. Их
можно создать, вводя соответствующую инструкцию в окне SQL. Для этого
нужно:
Ниже рассматриваются запросы, которые могут быть введены только в режиме SQL.
Создание запросов на объединение записей
Этот тип запроса
позволяет объединить в одном результирующем наборе результаты нескольких
запросов, таблиц и инструкций SELECT. Синтаксис этого запроса
следующий:
[TABLE] запрос_1
UNION [ALL] [TABLE] запрос_2 [UNION [ALL] [TABLE] запрос_п [ ... ]],
где
запрос_1,
запрос_2, ... запрос_п — инструкция SELECT, имя сохраненного запроса или имя
сохраненной таблицы, перед которым стоит зарезервированное слово TABLE.
В каждом
аргументе запрос_1 допускается применение предложения GROUP BY или HAVING для
группировки возвращаемых данных. В конец последнего аргумента запрос_п можно
включить предложение ORDER BY, чтобы отсортировать возвращенные данные. Таким
образом, группировка записей может выполняться в каждом из объединяемых запросов
или таблиц, а сортировка выполняется только в результирующем множестве записей
запроса на объединение. В качестве поля для сортировки нужно указывать имена
полей из первого запроса или таблицы, т. к. именно эти имена будут выступать в
качестве имен полей в результирующем множестве запроса.
По умолчанию
записи, повторяющиеся в объединяемых таблицах и запросах, не включаются в
результирующее множество запроса. Использование предиката ALL в запросе
позволяет включить все записи. Кроме того, такие запросы выполняются
быстрее.
Все запросы,
включенные в операцию UNION, должны отбирать одинаковое число полей; при этом
типы данных и размеры полей не обязаны совпадать. Если число полей не совпадает,
выводится сообщение об ошибке.
Для создания
запроса на объединение существует специальная команда меню Запрос, Запрос
SQL, Запрос на объединение (Query, SQL Specific, Union), которая доступна в
режиме Конструктора запросов. При выполнении этой команды открывается пустое
окно Режим SQL, в которое нужно ввести инструкцию.
На рис. 8.59
показана инструкция SQL, содержащая операцию UNION, для запроса "Клиенты и
поставщики по городам" (Customers and Suppliers by City), который содержится в
базе данных "Борей". Чтобы открыть окно SQL, откройте список запросов в окне
базы данных, выделите запрос "Клиенты и поставщики по городам" и нажмите кнопку Конструктор
(Design). При этом кнопка и команда меню Вид, Конструктор (View,
Design View) становятся недоступными.
Результат
выполнения запроса на объединение "Клиенты и поставщики по городам" приведен па
рис. 8.60.
Рис. 8.59.
Запрос на объединение
Рис. 8.60.
Результирующее множество запроса "Клиенты и поставщики по
городам"
Еще одним типом
запроса SQL является запрос к серверу. Он обрабатывается не процессором Jet, как
все остальные запросы, а непосредственно передается на сервер базы данных, к
которому выполняется обращение, например Microsoft SQL
Server. Главной
особенностью этого запроса является то, что он должен использовать синтаксис
языка SQL сервера базы данных (для Microsoft SQL Server это — Transact-SQL).
Создается этот запрос аналогично запросу на объединение с помощью команды меню
Запрос, Запрос SQL, К серверу (Query, SQL Specific, Pass-Through).
Запросы к серверу применяются в приложениях, имеющих архитектуру
"клиент-сервер".
Управляющие
запросы относятся к третьему типу запросов, которые создаются в окне Режим
SQL и используют инструкции Jet SQL. Такие запросы позволяют работать с
таблицами и индексами — создавать, изменять и удалять таблицы, создавать
индексы.
Инструкции SQL,
которые при этом используются, относятся к подмножеству SQL, называющемуся DDL —
язык определения данных. Набор этих инструкций в Jet SQL существенно сокращен по
сравнению со стандартом ANSI SQL, т. к. многие операции можно выполнить с
помощью других средств (команд меню или окна базы данных).
В обычном режиме можно использовать следующие инструкции SQL:
В режиме ANSI
SQL-92 возможны дополнительно следующие инструкции:
Замечание
Запросы данного типа обычно
используются в программах на языке Visual Basic для приложений (VBA) тогда,
когда нужно выполнить соответствующие операции программно. В противном случае
для этого гораздо удобнее и быстрее применять средства пользовательского
интерфейса Access.
В рамках данной
книги мы не описываем подробно синтаксис всех инструкций SQL. Заинтересованному
читателю рекомендуется обратиться к разделу Справочник Microsoft Jet SQL
Справочной системы Access.
Инструкции Jet SQL, такие как SELECT, SELECT. .. INTO, INSERT...INTO, DELETE или UPDATE позволяют для вычисления предиката в предложении WHERE использовать другой запрос. Этот запрос называется подчиненным запросом.
Подчиненный
запрос включается в главный запрос одним из следующих способов:
где:
сравнение —
выражение и оператор сравнения, который сравнивает это выражение с результатами подчиненного
запроса;
выражение — выражение, для которого проводится поиск в результирующем наборе записей подчиненного запроса;
инструкцияSQL —
инструкция SELECT, которая представляет подчиненный запрос.
Предикаты ANY
или SOME являются синонимами и используются если в главном запросе нужно выбрать
записи, удовлетворяющие сравнению со всеми записями, выбранными в подчиненном
запросе. Ниже приведен пример запроса, который выбирает из таблицы "Товары"
(Products) все товары, цена которых не ниже, чем цена товаров у
конкурентов:
SELECT * FROM
Товары WHERE Товары.Цена > ANY
(SELECT
ТоварыКонкурентов.Цена FROM ТоварыКонкурентов)
Предикат ALL
используется для выбора в главном запросе только тех записей, которые
удовлетворяют сравнению со всеми записями, выбранными в подчиненном запросе. В
следующем примере выбираются все заказы, сделанные в 1998 году, стоимость
которых ниже стоимости любого заказа, размещенного в 1997 году:
SELECT DISTINCTROW
Заказы.КодЗаказа
FROM
Заказы
WHERE
Year(Заказы.ДатаРазмещения) = 1998
AND
Заказы.СуммаЗаказа < ALL (SELECT Заказы.СуммаЗаказа FROM Заказы WHERE
Year(Заказы.ДатаРазмещения) = 1997);
Предикат IN
используется для выбора в главном запросе только тех записей, которые содержат
значения, совпадающие с одним из значений, выбранных подчинен-ным_ запросом.
Например, чтобы выбрать клиентов, которые разместили заказы в январе 1998 года,
можно написать следующий запрос:
SELECT * FROM Клиенты WHERE КодКлиента IN
(SELECT КодКлиента
FROM Заказы
WHERE ДатаРазмещения
BETWEEN #l/l/98#
AND #31/1/981;
И наоборот,
предикат NOT IN используется для выбора в главном запросе только тех записей,
которые содержат значения, не совпадающие ни с одним из значений, отобранных
подчиненным запросом.
Предикат EXISTS
используется в логическом выражении для определения того, должен ли подчиненный
запрос возвращать какие-либо записи. Например, чтобы выбрать всех поставщиков
для товаров в некотором заказе, можно использовать следующую инструкцию
SQL:
SELECT DISTINCTROW
Поставщики.Название FROM Поставщики WHERE Exists (SELECT Заказано.КодТовара FROM
Заказано
WHERE КодЗаказа
= 121 AND Заказано.КодТовара = Поставщики.КодТовара); В подчиненном запросе
можно-использовать псевдонимы таблиц для ссылки на таблицы, перечисленные в
предложении FROM, расположенном вне подчиненного запроса. В следующем примере
выбираются фамилии и имена сотрудников, чья зарплата равна или больше средней
зарплаты сотрудников, имеющих ту же должность. В предыдущем примере можно
присвоить таблице "Сотрудники" (Employees) псевдоним Т1, и тогда запрос будет
выглядеть следующим образом:
SELECT DISTINCTROW Поставщики.Название
FROM Поставщики As П1
WHERE
Exists
(SELECT Заказано.КодТовара
FROM
Заказано
WHERE КодЗаказа
= 121 AND Заказано.КодТовара = П1.КодТовара); Некоторые подчиненные запросы
можно использовать в перекрестных запросах как предикаты в предложении WHERE.
Подчиненные запросы, применяемые для вывода результатов (в списке SELECT),
нельзя применять в перекрестных запросах.
В отличие от
запросов на объединение, подчиненный запрос можно создать в режиме Конструктора.
В строке Условия отбора (Criteria) в качестве условия отбора следует
указать, например, зарезервированное слово IN, а затем ввести инструкцию SELECT.
А можно сначала создать в режиме Конструктора подчиненный запрос, переключиться
в режим SQL, скопировать получившуюся инструкцию SQL в буфер
обмена, а затем
создать главный запрос и скопировать в строку Условия отбора (Criteria)
подчиненный запрос из буфера.
Запросы являются
основой для большинства разрабатываемых в Access форм и отчетов. Во многих
случаях запросы создаются и сохраняются в базе данных исключительно для
конкретной формы, отчета или страницы. Запросы, которые мы рассмотрели в этой
главе, позволяют выполнять множественные изменения в таблицах, анализировать
данные разными способами, автоматически сортировать и фильтровать
данные.
Мы говорили о
новых режимах, которые появились в Microsoft Access 2002 для просмотра
содержимого таблиц и результатов запросов. И хотя сводные таблицы и диаграммы,
получаемые в Access, немного отличаются от своих аналогов в Microsoft Excel, тем
не менее, это уже большой шаг в усовершенствовании средств для анализа
данных.
В последних
разделах главы мы привели описание языка Jet SQL. Возможно, это изложение
показалось вам недостаточно полным. Однако применение языка Jet SQL в
приложениях Access все-таки является достаточно ограниченным. В большинстве
случаев для создания запросов можно использовать графический интерфейс
Конструктора запросов. И даже при написании программ на VBA, в которых
используются инструкции SQL, можно сначала построить нужный запрос в
Конструкторе, а потом просто скопировать его через буфер обмена из окна Режим
SQL Конструктора запросов. Читателю, желающему основательно изучить SQL, мы
рекомендуем обратиться к специальной литературе.
В дальнейших главах нашей книги мы будем рассматривать запросы для создания других объектов Access: форм, отчетов, страниц доступа к данным.
Последние комментарии