Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Access_2007.doc
Скачиваний:
257
Добавлен:
17.03.2015
Размер:
20.6 Mб
Скачать

Малоизвестная или недооцененная возможность. Запросы на базе запросов

В примерах этой главы предполагается, что вы создаете запрос на базе таблицы из ва­шей БД. Но внимательные читатели могли заметить и другой возможный выбор — а именно возможность создания запроса, отбирающего результаты другого запроса. Если вы создаете запрос в окне Конструктора, нужно просто использовать вкладку Запросы в диалоговом окне Добавление таблицы (вместо вкладки Таблицы). Если же запрос создается с помощью мастера, все ваши запросы выводятся вместе с таблицами в рас­крывающемся списке Таблицы и запросы в первом окне мастера.

Чаще всего запрос строится на другом запросе, если вы хотите повторно использовать плоды вашего напряженного труда и упростить сложные запросы. Например, вы хотите создать запрос к БД Boutique Fudge, который находит клиентов, поместивших заказ в текущем месяце, и извлекает всю информацию об этих клиентах. На основе этого запро­са, возможно, вам захочется создать более специализированный итоговый запрос (см. разд. "Итоговые данные" главы 7), который объединяет клиентов в группы с учетом го­рода, в котором они живут, и подсчитывает, сколько у вас недавних покупателей в каж­дом регионе.

Можно создать один запрос, выполняющий оба этапа. Но разделив логику на две части, вы сможете легко повторно использовать первый запрос (недавние клиенты) для созда­ния множества связанных запросов.

Режим SQL

За кадром каждый запрос в действительности — текстовая команда, написанная на экзоти­ческом языке, именуемом SQL (Structured Query Language, язык структурированных запро­сов). Язык SQL— один из главных компонентов мира БД, он поддерживается всеми основ­ными программными продуктами для управления БД, хотя и с незначительными вариациями и индивидуальными отличительными особенностями.

Примечание

Гуру БД все еще спорят о том, как произносить название языка: "Эс-ку-эль" (что исторически корректно) или "Сиквэл" (именно это название применяется в программном обеспечении кор­порации Microsoft SQL Sever). В этой книге мы полагаем, что вы пользуетесь более продвину­тым вариантом "Сиквэл".

Когда вы создаете запрос в Конструкторе (или с помощью Мастера запроса), программа Access генерирует соответствующую команду SQL. Когда вы сохраняете запрос, Access про­сто сохраняет в вашей БД текст этой команды. Это все, что нужно программе для выполне­ния запроса в дальнейшем.

Чаще всего вы не будете тратить много времени на обдумывание SQL, прячущегося за вашими запросами. Но иногда нужно посмотреть на него повнимательнее. Далее перечисле­ны возможные причины.

  • Вы хотите выполнить действие, которое поддерживается языком SQL, но не доступно в Конструкторе запросов. Конечно, для редактирования команды нужно знать о языке больше, чем самая малость. Далее в этой главе вы узнаете, как с помощью Режима SQL создать запрос на объединение, содержащий в окне результатов данные двух похожих таблиц.

  • Вы хотите выучить язык SQL. Это неплохая идея, если вы хотите делать карьеру администратора БД, но это лишнее, если вы привязаны к программе Access.

  • Вы собираетесь перенести команду в другую программу управления БД. Вы можете находиться в состоянии переноса БД из Access в более мощную БД Oracle. Это работа, требующая усилий, и можно столкнуться с тем, что несмотря на возможность переноса данных в другое хранилище, перемещение других объектов, таких как запросы, невозможно. Вам придется познакомиться поближе с лежащим в основе запросов языком SQL, который можно использовать для реконструкции запроса в новой БД.

  • Вы просто любознательны без всякой задней мысли. Изучение команд SQL для ваших запросов снимает налет таинственности с принципов работы программы Access.

  • Вы — суперспециалист по написанию кода на языке SQL, и Конструктор запросов только тормозит вашу работу.

Для просмотра команды SQL для вашего запроса щелкните заголовок вкладки правой кнопкой мыши и выберите команду Режим SQL (SQL View). На рис. 6.13 показана команда, которую вы увидите.

Рис. 6.13. На экране команда SQL для запроса TopProducts, который находит товары, стоящие больше 50 долларов. Если вас испугал этот режим, в любой момент можно вернуться в другой, щелкнув правой кнопкой мыши заголовок вкладки и выбрав Конструктор или Режим таблицы

Анализ запроса

Несмотря на то, что язык SQL на первый взгляд кажется сложным, все запросы готовятся из одних и тех же ингредиентов. Рассмотрим запрос для поиска дорогостоящих заказов, кото­рые приведены далее (каждая строка пронумерована для облегчения ссылок), сводятся по сути к одним и тем же ингредиентам:

  1. SELECT Products.ID, Products.ProductName, Products.Price

  2. FROM Products

  3. WHERE (((Products.Price)>50))

  4. ORDER BY Products.Price;

Проанализируем первые две строки.

Строка 1 начинается со слова SELECT, означающего, что перед вами запрос, который выбирает записи (как и все запросы, с которыми вы имели дело в этой главе).

За словом SELECT следует разделенный запятыми список полей, которые вы хотите ви­деть. Каждое поле записано в длинном формате ИмяТаблицы. ИмяПоля, на случай если вы решите создать запрос, использующий несколько таблиц.

  • Строка 2 начинается со слова from, указывающего на таблицу (таблицы), которую вы исследуете. В данном случае нужные вам записи есть в таблице Products. В этих двух строках представлен законченный действующий запрос. Но часто в вашей

команде будут дополнительные строки, задающие параметры фильтрации и сортировки.

Строка 3 начинается со слова WHERE, указывающего на начало ваших условий отбора. В данном случае есть только одно условие — цена продукта должна быть больше 50 долларов. Если вы задали несколько условий отбора в разных полях, здесь будут представлены все они, объединенные с помощью оператора and.

Примечание

Программа Access несколько странным образом применяет скобки в условиях отбора. Предложение языка SQL WHERE ( ( (Products . Price) >50) ) можно упростить до следующего WHERE Products. Price>50. Access использует скобки, поскольку они облегчают анализ сложных запросов с множественными условиями отбора.

Строка 4 начинается со слов ORDER BY, которые определяют порядок сортировки.

В данном случае записи отсортированы по возрастанию значений в поле Price (цена).

Если задана сортировка по убыванию, вы увидите сокращение desc после имени поля.

Если сортируется несколько полей, вы увидите разделенный запятыми список полей.

Команда заканчивается завершающей точкой с запятой ( ; ). Программе Access эта деталь не нужна, но таковы соглашения в мире языка SQL.

Резюме приведенного урока состоит в том, что любой запрос, который вы создаете, фор­мируется из нескольких общих ингредиентов, представленных разделами SELECT, FROM, WHERE и ORDER BY.

Программа Access следит за синхронизацией разных режимов представления запроса. Если вы вносите изменение в текст SQL, а затем возвращаетесь в режим Конструктора, то

увидите только что откорректированную версию запроса (пока вы не допустили ошибку, при возникновении которой Access выводит на экран сообщение об ошибке).

Для проверки этого свойства можно изменить текст SQL так, чтобы выбирался дополни­тельный столбец и сортировка выполнялась по двум полям таким образом, чтобы продукты с одинаковой ценой выводились в алфавитном порядке (новые текстовые фрагменты выде­лены жирным шрифтом):

SELECT Products.ID, Products.ProductName, Products.Price, Products.Description

FROM Products

WHERE (((Products.Price)>100))

ORDER BY Products.Price, Products.ProductName;

Щелкните правой кнопкой мыши заголовок вкладки, затем выберите Конструктор для того, чтобы увидеть, как внесенные изменения отражены в режиме Конструктора.

Создание запроса на объединение

Конструктор не распознает некоторые редкие методы языка SQL. Их можно применить, только откорректировав команду SQL в Режиме SQL, и после внесения этих изменений вы больше не сможете просмотреть ваш запрос в Конструкторе (пока позже не удалите непод­держиваемое изменение).

Запрос на объединение (union query) — один из примеров запросов, временами очень по­лезных, но не поддерживаемых в Конструкторе запросов. Запрос на объединение объединя­ет результаты из нескольких таблиц и затем представляет их на общем листе данных.

По сути, запрос на объединение составляется из двух (или нескольких) отдельных за­просов на выборку. Тонкость заключается в том, что структура результатов всех запросов на выборку должна быть одинаковой. Таким образом, следует извлечь аналогичные столбцы из каждой таблицы в одном и том же порядке. Если вы выполнили все перечисленные требова­ния, остается только вставить слово union между двумя запросами.

Далее приведен запрос на объединение, который представляет список имен и фамилий, полученный из двух таблиц — Customers и Employees:

SELECT Customers.FirstName, Customers.LastName

FROM Customers

UNION

SELECT Employees . FirstName, Employees . LastName

FROM Employees

Этот запрос функционирует, несмотря на то, у таблиц Customers и Employees разная структура. Но гораздо важнее то, что структура результатов запросов к обеим таблицам, в данном случае поля FirstName и LastName, совпадает.

ПРИМЕЧАНИЕ

Создать запрос на объединение можно, даже если имена столбцов отличаются — если в таб­лице Employees содержатся столбцы с именами F_Name и L_Name, запрос все равно будет выполняться. Программа Access просто использует имена столбцов из первого запроса при выводе результатов на лист данных.

В данном примере, когда вы просматриваете результаты запроса, на экран выводится список имен и фамилий клиентов, за которым следует список имен и фамилий сотрудников, хотя вы не сможете с уверенностью определить, где заканчивается одна таблица и начинает­ся другая. Вы также не сможете редактировать данные — запросы на объединение предна­значены исключительно для просмотра сведений, а не для их изменения. Программа Access не позволит вам редактировать запросы на объединение в Конструкторе запросов. Если вы щелкнете правой кнопкой мыши заголовок вкладки и выберете Конструктор, вместо конст­руктора вы попадете в Режим SQL.

Программа помещает запросы па объединение в группу Несвязанные объекты (Unrelated Objects) в области переходов и применяет для их обозначения пиктограмму, от­личающуюся от пиктограммы обычного запроса (рис. 6.14).

Примечание

Если в результатах запроса на объединение выявляются совпадения, на экран выводится одна копия. Это поведение можно изменить, если заменить слово UNION словосочетанием UNION ALL. В предыдущем примере этот шаг вызовет повторное отображение в объединенных ре­зультатах человека, являющегося и клиентом, и сотрудником.

Рис. 6.14. Запросы на объединение появляются в области переходов с другой пиктограммой. Две пересекающиеся окружности обозначают несколько наборов результатов, отображаемых совместно

Запросы на объединение — это хороший способ соединения двух аналогичных таблиц, которые были разделены из соображений производительности, безопасности или способа распространения. (См. в разд. "Подготовка вашей базы данных" главы 18 различные причи­ны деления одного набора данных на несколько разных таблиц.) Эти запросы неудобны для обработки отношений "родитель — потомок". Для этой задачи вам нужны запросы на вы­борку с объединением таблиц (join queries), описанные в следующем разделе.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]