Диго С.М. Базы данных проектирование и использование (1084447), страница 40
Текст из файла (страница 40)
Работа с несколькими таблицами в конкретных СУБД различается не только тем, каким способом можно определить связь между таблицами. Так, например, некоторые системы обязывают пользователя связать те таблицы/файлы, которые указываются как исходные для запроса; другие автоматически связывают открытые файлы по тем полям, которые система воспринимает как поля связи (чаще всего это поля, имеющие одинаковые имена, тип и длину); третьи - оставляют эти таблицы изолированными, если пользователь не указал, как они должны быть связаны, четвертые - выполняют декартово произведение открытых таблиц. Например, в dBase IV вызвать несколько файлов БД на панель запросов и не связать их было нельзя. В MS Query, Access если таблицы не связаны, то при выполнении запроса это приводит к связыванию каждой записи одной таблицы с каждой записью другой.
Внимание! Будьте внимательными при реализации запросов, в которых открыты несколько таблиц. Не открывайте таблиц больше, чем это действительно требуется для реализации каждого конкретного запроса!
Описание ответа. Кроме задания условия отбора данных, при описании запроса должна быть возможность указать, какие атрибуты и в какой последовательности входят в ответ. В ответ могут выдаваться не только реальные поля, которые хранятся в одной из базовых таблиц, но и вычисляемые поля.
Можно выделить два вида вычислений, которые могут выполняться в запросах, формах, отчетах: это агрегирующие операторы, которые выполняют операции над группой записей, и обычные вычисления, затрагивающие отдельные поля одной или нескольких связанных записей.
Агрегирующие показатели могут быть включены не только в «Запросы», но и в «Отчеты». Возможности включения агрегирующих показателей в запросы и отчеты различаются между собой. Результатом запроса всегда является плоская таблица. Поэтому в запросах могут быть получены только одноуровневые итоги. В отчетах же может быть получено несколько степеней итогов.
Набор агрегирующих функций может быть различным в разных системах. Обычно во всех реализациях СУБД включены следующие функции: Sum (сумма), Min (минимум), Мах (максимум), Avg (среднее), Count (подсчет). Некоторые системы включают дополнительные статистические функции, такие, как отклонение, стандартное отклонение, дисперсия и др.
Использование агрегирующих функций предполагает, что таблица упорядочена по тому полю (полям), по которому ведется агрегирование. Некоторые СУБД сами автоматически выполняют упорядочение данных по необходимым полям, другие - нет. В последнем случае, если пользователь не задаст правильно требуемое упорядочение, результат, выводимый в ответ, будет искаженным.
Результаты вычислений, выводящиеся в поле, не запоминаются в базовой таблице. Вместо этого вычисления снова проводятся всякий раз, когда выполняется запрос, поэтому результаты всегда представляют текущее содержимое базы данных. Обновить вычисленные результаты вручную невозможно (таблица, содержащая вычисляемое поле, имеет статус «только для чтения»).
Для удобства восприятия ответа часто требуется определить упорядоченность данных в ответе. Язык QBE обеспечивает такую возможность. Опять-таки возможности задания упорядочения ответа различаются в разных СУБД: некоторые системы разрешают проводить упорядочение по произвольным полям, другие требуют, чтобы поле упорядочения стояло в ответе обязательно первым, а если упорядочение ведется по нескольким полям, то чтобы эти поля следовали в ответе друг за другом в порядке их старшинства; некоторые СУБД различают обычное и словарное упорядочение (когда учитывается и не учитывается регистр соответственно), другие - нет; в некоторых системах, даже если не задано никакое упорядочение, ответ всегда выдается упорядоченным по первому полю таблицы ответа и т.п.
Дополнительные возможности. Кроме собственно поисковых запросов язык QBE позволяет выполнять и другие операции, например корректировку данных. Набор допустимых операций, а также способы их задания несколько различаются в разных системах.
Кроме того, некоторые СУБД позволяют формировать запросы специальных видов: параметрические, перекрестные и некоторые другие (не все из них, наверное, могут быть отнесены к QBE, но они реализованы одними и теми же компонентами СУБД и в связи с этим будут здесь рассмотрены).
Запросы, сформулированные на QBE, могут быть запомнены для их последующего многократного использования.
Некоторые языки запросов, которые носят название QBE, построены совсем на других принципах, чем те, что были изложены выше, и было бы хорошо найти для них другое название. Так, например, язык RQBE FoxPro не является табличным двухмерным языком запросов. Он является «построителем» запросов (в том числе SQL). Сложный запрос реализуется в нем просто вводом каждого элементарного условия на отдельной строке. Если две строки не разделены никакой операцией, то считается, что они соединяются операцией «И». Операцию «ИЛИ» нужно указывать явно между соединяемыми строками.
Все языки запросов имеют много общего. Но, с другой стороны, даже языки, относящиеся к одному классу, отличаются в деталях своей реализации. Начиная работать с новой для вас СУБД, проведите серию экспериментов, чтобы убедиться, что ваше понимание логики реализации запросов соответствует той, что заложена в данной конкретной системе.
6.2. Реализация ОВЕ в Access
6.2.1. Общие сведения
После описания таблиц и заполнения их данными к базе данных можно формулировать разнообразные запросы. В табличном языке запросов в Access реализованы те общие принципы, о которых шла речь выше. Но, естественно, имеются и особенности реализации языка в этой конкретной системе.
В явном виде понятие наполнителя в QBE в Access не вводится. Связывание таблиц выполняется визуально. Для задания в запросе соотношения полей внутри таблицы вместо наполнителя можно просто задать соответствующее выражение для вычисляемого поля и для этого выражения задать условия отбора.
Для задания запроса в Access следует перейти к объекту Запросы в окне базы данных. Для создания нового запроса следует щелкнуть по кнопке Создать - появится окно Новый запрос (рис. 6.5).
Для построения запросов могут быть использованы различные мастера. Но чаще всего используется возможность создания запроса с помощью Конструктора.
Первым шагом при создании запроса является определение таблиц, которые содержат исходную информацию. Допускается также создание запроса на основании других запросов или одновременно и таблиц, и запросов. Использование предварительно созданных запросов при создании нового запроса может помочь сделать сложный запрос, содержащий большое число взаимосвязанных таблиц и много разнообразных условий отбора, более простым для его формулирования.
Любой запрос можно сохранить для последующего использования. Это можно сделать несколькими способами, например, выбирая позиции меню Файл/Закрыть, ответив «Да» на вопрос о сохранении файла и задав после этого имя запроса. Имя запроса не может совпадать не только с именем другого запроса, но и с именем какой-либо таблицы в данной базе данных.
Сохраненный запрос можно впоследствии «открывать», что означает его выполнение. Сохраненный запрос может быть скорректирован, если открыть его в режиме Конструктор.
-
Добавление таблиц в запросе
Возможно использование нескольких способов включения таблиц, на которых базируется запрос.
Для добавления таблицы можно в режиме Конструктор запроса щелкнуть по кнопке Добавить таблицу на панели инструментов или выбрать в меню Запрос команду Добавить таблицу - открывается окно диалога Добавление таблицы.
Пользователь имеет также возможность добавить в запрос таблицу или запрос, выбрав их имена в окне базы данных и переместив их с помощью мыши в верхнюю часть окна запроса.
Кроме того, можно позиционироваться на свободное место в верхней части окна запроса, нажать правую кнопку мыши и в появившемся ниспадающем меню выбрать позицию Добавить таблицу.
Для добавления в запрос таблицы из другой базы данных или другого приложения следует сначала присоединить эту таблицу к активной базе данных.
Это присоединение выполняется путем использования команды Присоединить таблицу (меню Файл).
При создании нового запроса без помощи мастера по разработке запросов окно диалога Добавление таблицы выводится автоматически (рис. 6.6). Для того чтобы указать, на чем будет базироваться создаваемый запрос (таблице, запросе или том и другом одновременно), нужно просто выбрать соответствующую вкладку.
Установив в появившемся списке доступных таблиц/запросов указатель на имя добавляемой таблицы или запроса, нужно или выполнить двойной щелчок «мышью», или нажать клавишу [Enter].
Допускается одновременное добавление в запрос нескольких таблиц или запросов. Для этого следует, удерживая нажатой клавишу [Ctrl], выбрать имена добавляемых таблиц или запросов и щелкнуть по кнопке Добавить.
В верхней части окна запроса выводится список полей добавленных таблицы или запроса.
Действия, описанные выше, повторяются для добавления других таблиц или запросов.
-
Удаление таблицы из запроса
Существует несколько способов удаления таблицы из запроса:
-
выбрать имя удаляемой таблицы или запроса в соответствующем списке и нажать клавишу [Del] или выбрать в меню Запрос команду Удалить таблицу;
-
двойным щелчком мыши выделить нужную таблицу в соответствующей зоне экрана и затем нажать клавишу [Del].
Имена полей удаленной таблицы или запроса удаляются из бланка запроса QBE. Удаление из запроса таблицы или запроса, на которых он базируется, не приводит к их удалению из базы данных.
Различают несколько типов запросов: запрос на выборку (Select), перекрестный запрос (Crosstab), создание таблицы (Make-table), запрос на обновление (Update), добавление (Append), удаление (Delete). Наиболее часто используемым типом запросов является запрос на выборку. Именно с него мы и начнем изучение возможностей задания запросов в Access.
6.2.4. Включение полей в запрос
После того как определены исходные таблицы/запросы, нужно выбрать поля, используемые в создаваемом запросе. Существует несколько способов переноса поля в бланк запроса: «буксировка» с помощью мыши, двойной щелчок мыши по имени соответствующего поля в списке полей, выбор поля в раскрывающемся списке полей, который появляется, если нажать на знак «стрелки» в строке Поле бланка запроса.
Можно переносить в бланк запроса не по одному полю, а сразу требуемую совокупность полей. Выделение полей, подлежащих переносу, осуществляется стандартным для Windows-систем способом (нажать клавишу [Shift] для выделения полей, расположенных друг за другом, и, удерживая ее, выбрать первое и последнее поле набора; выбирать поля при нажатой клавише [Ctrl] для полей, располагающихся в произвольном порядке не подряд друг за другом).
Можно перенести в бланк запроса одновременно все поля. Для этого следует установить указатель на заголовок списка полей и дважды щелкнуть кнопкой мыши или установить указатель на символ звездочки (*) и нажать кнопку мыши.
6.2.5. Поля, выводимые в ответ
Не все поля, которые используются при формировании запроса, должны обязательно отражаться в ответе. Так, например, поле может быть необходимо для задания условия отбора, но надобность в его появлении в ответе отсутствует.