Павел Дубнов - Access 2002: Самоучитель
Рис. 11.34
Пояснения к инструкции SQL
Теперь более подробно исследуем инструкцию SQL, приведенную на рис. 11.35. Мы несколько раз усложняли структуру запроса, поэтому и инструкция нуждается в определенном комментарии.
Рис. 11.35В предложении с ключевым словом SELECT содержится перечень используемых в запросе таблиц и их полей. Как уже говорилось, группы (Имя таблицы. Имя поля) разделяются между собой запятыми, а внутри группы имя таблицы отделяется от имени поля точкой. Если в имени есть пробел, оно заключается в квадратные скобки. Параметр SELECT имеет следующий синтаксис:
SELECT [предикат] [* | таблица.* |] [таблица. ]поле 1
[AS псевдоним 1] [, [таблица. ]поле 2 [AS псевдоним 2] […]]}
FROM выражение […] [IN внешняя База Данных]
[WHERE…]
[GROUP BY…]
[HAVING…]
[ORDER BY…]
[WITH OWNERACCESS OPTION]Перечислим аргументы ключевого слова SELECT:
• предикат. Задается один из следующих предикатов отбора:
– ALL;
– DISTINCT;
– DISTINCTROW;
– TOP.
Предикаты ограничивают число возвращаемых записей. Если предикат не указан, по умолчанию используется ALL. Это означает, что выбраны все поля заданной таблицы или таблиц;
• таблица. Указывается имя таблицы, из которой надо отобрать записи;
• поле_1, поле_2. Указываются имена полей, откуда следует отбирать данные. Сведения будут извлекаться из полей в том порядке, в каком они перечислены;
• псевдоним_1, псевдоним_2. Задаются имена, которые станут заголовками столбцов вместо названий, заданных по умолчанию;
• выражение. Здесь указываются имена одной или нескольких таблиц, содержащих необходимые данные;
• внешняя База Данных. Вводится имя той базы данных, где расположены таблицы, которые указаны с помощью аргумента выражение, но находятся за пределами текущей БД.
При выполнении операции SELECT Access 2002 находит указанную таблицу или таблицы, извлекает из нее (из них) необходимые столбцы, выделяет строки, которые отвечают условию отбора, а затем сортирует или группирует результирующие строки в заданном порядке. (Отметим, что инструкции SELECT не изменяют ни сами данные, ни их расположение в БД.)
Обычно слово SELECT является первым словом инструкции SQL, поскольку большая часть этих инструкций относится к типу SELECT или SELECT… INTO.
Минимальный синтаксис инструкции SELECT таков:SELECT поля FROM таблица
Чтобы были отобраны все поля таблицы, добавьте символ звездочки (*).
Если несколько таблиц, включенных в предложение FROM, содержат одноименные поля, то перед именем каждого из таких полей следует ввести имя таблицы и оператор «точка» (.).
Предложение с ключевым словом FROM описывает связи между таблицами. По мере усложнения этих связей все более важную роль играет конструкция INNER JOIN… ON, которая имеет следующий синтаксис:FROM таблица 1 INNER JOIN таблица 2 ON таблица 1.поле 1 оператор таблица 2.поле 2
Ниже перечислены аргументы операции INNER JOIN:
• таблица_1, таблица_2. Здесь указываются имена таблиц, записи которых нужно объединить;
• поле_1, поле_2. Задаются названия объединяемых полей. Если они не являются числовыми, то должны быть однотипными и содержать однотипные данные. В то же время объединяемые поля могут иметь разные имена;
• оператор. Выбирается любой оператор сравнения (символы, входящие в каждый оператор, заключены в прямые кавычки):
– "=,";
– "<,";
– ">,";
– "<=,";
– ">=,";
– "<>".
Параметр WHERE содержит условия отбора – критерии, вводимые в запрос, и имеет следующий синтаксис:WHERE условие отбора
Создание объединенной выборки
В предыдущих разделах мы рассмотрели большую группу запросов на выборку, в том числе запросы с использованием нескольких таблиц, объединенных связями. Однако в системе Access 2002 предусмотрены и запросы других типов:
• на создание таблицы;
• на добавление записей в таблицу;
• на удаление записей из таблицы;
• на обновление записей в таблице;
• перекрестный запрос.
Запросы всех названных типов могут не только использоваться по прямому назначению, но и быть частью более сложных, комплексных запросов. Предположим, вам необходимо получить выборку записей из таблиц, не объединенных связями. Мы подробно рассмотрим пример такого запроса, а заодно и работу с запросами перечисленных типов.
Пример сложного запроса
Как вы помните, в объединенном банке данных содержатся три базы данных. Все они имеют различное происхождение. БД ЧЭС и Контроль ЧС непосредственно связаны с оперативной информацией о всевозможных чрезвычайных ситуациях (ЧС). Следовательно, вполне естественна такая постановка задачи: получить из этих двух баз данных единую выборку сведений о ЧС определенного типа (скажем, происшедших в конкретном регионе).
В том, что таблицы этих БД не соединены связями, нет никакого скрытого подвоха. Конечно, разное происхождение баз данных наложило отпечаток на их структуру: записи из различных БД построены неодинаково, отличаются по составу и формату полей. Все это осложняет работу пользователя. В принципе многие таблицы из разных БД достаточно легко объединить с помощью связей. Однако в каждой базе данных есть свои словари, на которых должны основываться важнейшие таблицы (об этом шла речь в главе 3), поэтому коды одних и тех же понятий могут не совпадать. Информация в базах данных может дублироваться (дата возникновения ЧС, регион и т. д.). Таким образом, связи между обеими БД не реализованы отнюдь не по принципиальным, а скорее по методическим причинам. Но интеграция возможна и в этих условиях. Мы хотели показать читателю, что система Access 2002 позволяет преодолевать серьезные трудности, даже если иногда они создаются несколько искусственно.
Итак, приступим к решению поставленной задачи. Оно включает по крайней мере три последовательных этапа:
• выборка данных из одной таблицы (обычно выбирать записи по каким-либо критериям не нужно, поэтому можно взять исходную таблицу целиком). Назовем этот этап – запрос на выборку;
• создание таблицы, в которую будут сведены записи из различных исходных таблиц, – запрос на создание таблицы;
• добавление в новую таблицу записей из следующей (следующих) таблицы (таблиц) – запрос на добавление записей.
Операцию выборки мы уже изучили выше. Теперь рассмотрим по отдельности второй и третий этапы, а затем всю процедуру объединения записей в комплексе.
Запрос на выборку
В конечном счете полученная выборка должна содержать поля из таблиц Fiie1 и ES_OPER. В исходном виде эти таблицы содержат сотни и тысячи записей. Поэтому, чтобы не оперировать с очень большими массивами информации (что, впрочем, неизбежно, если надо создать единый банк данных из разнородных информационных структур), введем, как мы уже это делали, дополнительные критерии, позволяющие отфильтровать информацию.
Сначала сформируйте новый запрос на выборку. Он должен указывать те поля, которые вы хотите скопировать в создаваемую таблицу. Как и в предыдущих разделах книги, запрос будет построен с помощью конструктора. Все операции, связанные с созданием запроса, вам уже знакомы. Итак, введите в него все поля таблицы ES_OPER, а также условия отбора: в поле Текст сообщения — составной критерий (*Тюменск* AND * нефтепровод*) – рис. 11.36.
Рис. 11.36
Теперь с помощью кнопки
проверьте, правильно ли производится отбор (см. рис. 11.37). Убедившись в этом, можете формировать запрос на создание таблицы.
Рис. 11.37Щелкните по стрелке прокрутки справа от кнопки
(Тип запроса) на панели инструментов (см. окно, показанное на рис. 11.36). Активизируйте режим Запрос на создание таблицы. После этого Access 2002 попросит вас назвать таблицу. Назовите ее просто Выборка1 (см. рис. 11.38).
Рис. 11.38Запрос на выборку будет автоматически преобразован в запрос на создание таблицы, как показано на рис. 11.39. Как легко убедиться, по своей структуре он полностью совпадает с запросом, показанным на рис. 11.36, различаются лишь названия этих запросов. Если теперь вы дадите команду выполнить этот запрос, то во вкладке Таблицы окна базы данных появится таблица Выборка1. Ее содержание полностью соответствует тому, что вы видели на рис. 11.37. Остается реализовать вторую часть задачи: сформировать и выполнить запрос на добавление записей в таблицу.
Рис. 11.39
Запрос на объединение разнородных таблиц в одну таблицу
Такой запрос позволит добавить в уже имеющуюся таблицу новые записи из другой таблицы. Существенно, что таблицы могут быть как похожими, так и различными по структуре; они могут иметь неодинаковое количество полей с разными именами. Как мы уже знаем, чтобы включить новые данные в таблицу, надо сначала создать и выполнить обычный запрос на выборку, а затем указать, в какие именно поля какой таблицы следует поместить поля с новыми записями.