Запросы на базе запросов
В примерах этой главы предполагается, что вы создаете запрос на базе таблицы из вашей БД. Но внимательные читатели могли заметить и другой возможный выбор — а именно возможность создания запроса, отбирающего результаты другого запроса. Если вы создаете запрос в окне Конструктора, нужно просто использовать вкладку Запросы в диалоговом окне Добавление таблицы (вместо вкладки Таблицы). Если же запрос создается с помощью мастера, все ваши запросы выводятся вместе с таблицами в раскрывающемся списке Таблицы и запросы в первом окне мастера.
Чаще всего запрос строится на другом запросе, если вы хотите повторно использовать плоды вашего напряженного труда и упростить сложные запросы. Например, вы хотите создать запрос к БД 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;
Щелкните правой кнопкой мыши заголовок вкладки, затем выберите Конструктор для того, чтобы увидеть, как внесенные изменения отражены врежиме Конструктора.