Рис. 11.12
В данном примере нас будут интересовать три поля: Код страны, Название_фирмы_ и Адрес. Введите их названия в бланк запроса, как вы уже делали это раньше. Чтобы отобрать именно российские фирмы, воспользуйтесь новым элементом – критерием. Он вводится в строке бланка, которая так и называется – Условие отбора. В нашем случае критерий следует указать в единственном поле таблицы Фирмы, связанном со страной, – Код страны. Здесь вы вводите условный код России – 06 (см. рис. 11.12).
Ясно, что это не самый удобный путь: придется или запоминать коды разных стран, или тратить время на поиски в специальном справочнике. Проще будет расширить запрос, включив в него две или более таблицы. Мы обсудим такой вариант чуть позже, а сейчас обратим внимание на один существенный момент. Как вы заметили, в поле бланка запроса Условие отбора значение кода заключено в прямые кавычки – «06». Когда вы задаете в Access какое-либо символьное выражение в качестве фильтра, условия, критерия и т. д. и приводите это значение полностью, Access 2002 поставит кавычки автоматически.
Заполнив бланк запроса, закройте окно конструктора. Когда вы подтвердите выполненные действия (см. рис. 11.6), запрос будет включен во вкладку Запросы окна базы данных. Если вы теперь откроете этот запрос, на экране появится таблица, показанная на рис. 11.13. В ней перечислены фирмы, отобранные по признаку страны.
Рис. 11.13
Теперь посмотрим, как выглядит инструкция SQL для нашего запроса (см. рис. 11.14).
Рис. 11.14
В предыдущих примерах вы переходили в окно SQL из окна конструктора запроса. Здесь такая возможность сохраняется, но проделать этот переход так же просто и из результирующей таблицы вида (см. рис. 11.13). Сначала щелкните правой кнопкой мыши в строке имени указанной таблицы. Затем в появившемся контекстном меню выберите, как и раньше, опцию Режим SQL.
Наряду с теми ключевыми словами, которые вам уже знакомы, здесь вы видите новое – WHERE с сопутствующими ему параметрами. Это слово – важнейшее в базе данных, когда речь идет об отборе информации. Поэтому параметры WHERE соответствуют критерию, который вы раньше ввели в бланк запроса. Слово WHERE не является обязательным, однако если оно присутствует, то должно следовать после FROM. Если не задавать условие WHERE, запрос возвратит все строки таблицы.
Запросы, в которых критерием является неполное значение поля
Теперь усложним условие, которое нужно задать в запросе. В таблице Fiie1 собрана информация обо всех авариях, случившихся в 1994 году. Предположим, нас интересуют лишь аварии на нефтепроводах. Конечно, можно отобрать те происшествия, что по классификации БД отнесены к группе Аварии на магистральных нефтепроводах (поле Наименование ЧС). Однако нам нужны данные об авариях на всех видах нефтепроводов, а не только на магистральных.
Есть другой вариант: отбирать записи, у которых в поле Характеристика ЧЭС упоминаются нефтепроводы. Но это слово может находиться в различном контексте, использоваться в разных падежах и т. д. В качестве критерия в запросе следует задать корневую часть слова, которая остается неизменной: в данном случае «нефтепровод». (Если бы нас интересовали, например, аварии при добыче и транспортировке нефти, то пришлось бы учитывать понятия «нефтепромысел», «нефтедобыча» и др. Тогда в запросе фигурировал бы критерий «нефте».) Итак, внесем слово «нефтепровод» в знакомую строку бланка запроса – Условие отбора (см. рис. 11.15). Обратите внимание на синтаксическое оформление критерия. В отличие от предыдущего примера здесь использован фрагмент текста, то есть часть поля. Поэтому нам понадобятся, кроме прямых кавычек, еще и звездочки. Критерий будет оформлен так: «*нефтепровод*» (см. рис. 11.15). К символьной последовательности, помещенной в звездочки, Access 2002 всегда добавляет слово Подобно. Таким образом задается команда на поиск записей, содержащих подобную подстроку. Как уже говорилось, кавычки вы можете и не ставить: Access 2002 не забудет сделать это за вас. А вот звездочки – исключительно ваша забота. Если корневая часть слова, которая используется в качестве критерия, находится на левой или правой границе поля, то с этой стороны звездочку можно опустить. Но, как правило, вам неизвестно точное расположение критерия. Поэтому звездочки лучше ставить всегда.
Рис. 11.15
В случае, который мы сейчас рассматриваем, в запрос включены все поля записи. Это можно сделать двумя способами. Первый путь: введите в бланк запроса каждое поле по отдельности, как вы делали раньше. Второй вариант: введите в бланк все поля сразу. Открыв пустое окно запроса, дважды щелкните мышью по строке имени таблицы на ее макете, чтобы выделить в нем все поля таблицы. Затем установите указатель мыши в выделенной области и нажмите левую кнопку мыши. Не отпуская ее, перетащите стрелку указателя в строку Поле первого столбца в бланке запроса. Теперь отпустите кнопку – все поля записи будут введены в бланк.
Дайте команду на выполнение созданного запроса (как это сделать, уже обсуждалось). В результате вы получите перечень аварий на нефтепроводах (см. рис. 11.16).
Рис. 11.16
Теперь посмотрим, как будет выглядеть в данном примере инструкция SQL, приведенная на рис. 11.17.
Рис. 11.17
Как видите, по своей структуре, то есть по составу ключевых параметров, эта инструкция совпадает с предыдущей. Разница лишь в том, что предложение с ключевым словом SELECT включает не одно, как в предшествующем случае, а все поля записи. Синтаксические правила записи каждого отдельного поля, естественно, не изменяются.
Разумеется, подобные критерии можно вводить одновременно в разные поля бланка запроса. В нашем случае используем логическую схему «И»: компонентами составного критерия будут отдельные критерии для различных полей записи базы данных. Поясним это на примере, который представляет собой расширенный вариант только что рассмотренной ситуации.
Запросы с несколькими критериями отбора, заданными в разных полях
Сформулируем новый запрос так: «По информации, собранной в таблице Fiie1 , выдать справку об авариях на нефтепроводах Тюменской области».
Окно конструктора для этого запроса показано на рис. 11.18. Как видите, здесь заданы два критерия: прежний – "*нефтепровод*", дополнительный – "Тюменская область". (Слово «область» можно было и не вводить: название Тюменская уникально и само по себе служит достаточным критерием.) Новый критерий тоже можно заключить в звездочки. Результатом выполнения запроса будет таблица, выведенная на рис. 11.19.
Рис. 11.18
Рис. 11.19
Обратите внимание, что в предыдущем примере, где не указывался конкретный регион, было отобрано 8 записей. В настоящий момент, как и следовало ожидать, их число сократилось: записей только 2.
Теперь изучим соответствующую инструкцию SQL (см. рис. 11.20). Как видно из рисунка, введение нового критерия отбора влияет только на предложение с ключевым словом WHERE. К этому предложению добавляется логическое выражение типа AND (И), операндами которого являются "*нефтепровод*" и "Тюменская область". В остальном инструкция SQL остается неизменной.
Рис. 11.20
Запросы с несколькими критериями отбора, заданными в одном поле
Мы уже привыкли к тому, что в одном запросе может быть много критериев для отбора записей. Это вполне естественно, когда речь идет о разных полях записи, потому что каждое из них подобно независимой (или почти независимой) оси координат, а каждый критерий – конкретному значению координаты по данной оси. Но когда требуется задать несколько критериев отбора применительно к одному полю записи, задача усложняется. Посмотрим, как ее следует решать.
Предположим, пользователя интересуют аварии не только на нефтепроводах, то есть при транспортировке самой нефти, но и шире – при транспортировке различных нефтепродуктов: бензина, мазута, газового конденсата и др. Как выбрать в таком случае критерий отбора? Можно просто ввести в поле подстроку «провод», поскольку этот корень входит во многие слова, связанные с нашей темой: нефтепровод, бензопровод и т. д. Но тогда в выборку неизбежно попадут аварии на газопроводах (которых тоже немало), что не входит в наши планы. Итак, нам неизбежно придется задавать несколько критериев отбора для одного и того же поля записи и связывать их определенными логическими соотношениями. Покажем на конкретном примере, как это делается.
Предположим, надо получить справку об авариях, которые произошли:
• на нефтепроводах;
• на мазутопроводах;
• на бензопроводах;
• на продуктопроводах.
Мы предусмотрели практически все виды нефтепродуктов. Теперь построим соответствующий запрос.