Используя условия запроса, вы можете находить в базе данных Access определенные элементы. Если элемент соответствует всем введенным условиям, он отобразится в результатах запроса.
Чтобы добавить условие в запрос Access, откройте этот запрос в конструкторе. Затем определите поля (столбцы), на которые распространяется данное условие. Если нужное поле в бланке запроса отсутствует, добавьте его с помощью двойного щелчка. Затем в строке Условия введите для него условие. Дополнительные сведения см. в статье Общие сведения о запросах.
Условие запроса — это выражение, которое Access сравнивает со значениями в полях запроса, чтобы определить, следует ли включать в результат записи, содержащие то или иное значение. Например, = «Воронеж» — это выражение, которое Access сравнивает со значениями в текстовом поле запроса. Если значение этого поля в определенной записи равно «Воронеж», Access включает ее в результаты запроса.
Рассмотрим несколько примеров часто используемых условий, на основе которых вы можете создавать собственные условия. Примеры группируются по типам данных.
В этом разделе
-
Общие сведения об условиях запроса
-
Условия для текстовых полей, полей Memo и полей гиперссылок
-
Условия для числовых полей, полей с денежными значениями и полей счетчиков
-
Условия для полей «Дата/время»
-
Условия для полей «Да/Нет»
-
Условия для других полей
Общие сведения об условиях запроса
Условие похоже на формулу — это строка, которая может включать ссылки на поля, операторы и константы. В Access условия запроса также называются выражениями.
В следующей таблице показаны примеры условий и описано, как они работают.
Условия |
Описание |
---|---|
>25 and <50 |
Это условие применяется к числовому полю, такому как «Цена» или «ЕдиницНаСкладе». Оно позволяет вывести только те записи, в которых поле «Цена» или «ЕдиницНаСкладе» содержит значение больше 25 и меньше 50. |
DateDiff («гггг», [ДатаРождения], Date()) > 30 |
Это условие применяется к полю «Дата/время», такому как «ДатаРождения». В результаты запроса включаются только записи, в которых количество лет между датой рождения человека и текущей датой больше 30. |
Is Null |
Это условие можно применять к полям любого типа для отображения записей, в которых значение поля равно NULL. |
Как видите, условия могут значительно отличаться друг от друга в зависимости от типа данных в поле, к которому они применяются, и от ваших требований. Некоторые условия простые и включают только основные операторы и константы. Другие условия сложные: они содержат функции, специальные операторы и ссылки на поля.
В этой статье перечислено несколько часто используемых условий для различных типов данных. Если примеры не отвечают вашим потребностям, возможно, вам придется задать собственные условия. Для этого необходимо сначала ознакомиться с полным списком функций, операторов и специальных знаков, а также с синтаксисом выражений, которые ссылаются на поля и литералы.
Узнаем, где и как можно добавлять условия. Чтобы добавить условия в запрос, необходимо открыть его в Конструкторе. После этого следует определить поля, для которых вы хотите задать условия. Если поля еще нет на бланке запроса, добавьте его, перетащив его из окна конструктора запросов на сетку полей или дважды щелкнув поле (при этом поле автоматически добавляется в следующий пустой столбец в сетке). Наконец, введите условия в строку Условия.
Условия, заданные для разных полей в строке Условия, объединяются с помощью оператора AND. Другими словами, условия, заданные в полях «Город» и «ДатаРождения», интерпретируются следующим образом:
Город = «Воронеж» AND
ДатаРождения
<
DateAdd
(«
гггг
«, -40, Date())
1. Поля «Город» и «ДатаРождения» включают условия.
2. Этому условию соответствуют только записи, в которых поле «Город» имеет значение «Воронеж».
3. Этому условию соответствуют только записи людей, которым не менее 40 лет.
4. В результат будут включены только те записи, которые соответствуют обоим условиям.
Что делать, если требуется, чтобы выполнялось только одно из этих условий? Другими словами, как можно ввести альтернативные условия?
Если у вас есть альтернативные условия, то есть два набора независимых условий, из которых должен выполняться только один, используйте строки Условие отбора и Или на бланке.
1. 1. Условие «Город» указывается в строке «Условие отбора».
2. 2. Условие «ДатаРождения» указывается в строке «или».
Условия, заданные в строках Условие отбора и или, объединяются с помощью оператора OR, как показано ниже.
Город = «Чикаго» OR ДатаРождения < DateAdd(«гггг», -40, Date())
Если требуется задать несколько альтернативных условий, используйте строки под строкой или.
Прежде чем приступить к изучению примеров, обратите внимание на следующее:
-
Если условие является временным или часто меняется, можно фильтровать результаты запроса, вместо того чтобы постоянно менять условия. Фильтр — это временное условие, которое изменяет результат запроса, не изменяя его структуру. Дополнительные сведения о фильтрах см. в статье Применение фильтра для просмотра отдельных записей в базе данных Access.
-
Если используются одни и те же поля условий, но часто меняются значения, которые вам интересны, вы можете создать запрос с параметрами. Такой запрос предлагает указать значения полей, а затем использует их для создания условий. Дополнительные сведения о запросах с параметрами см. в статье Использование параметров в запросах и отчетах.
Условия для текстовых полей, полей Memo и полей гиперссылок
Примечание: Начиная с версии Access 2013, текстовые поля носят название Краткий текст, а поля Memo — Длинный текст.
Следующие примеры относятся к полю «СтранаРегион», основанном на таблице, в которой хранится информация о контактах. Условие задается в строке Условие отбора поля на бланке.
Условие, заданное для поля «Гиперссылка», по умолчанию применяется к отображаемому тексту, который указан в поле. Чтобы задать условия для конечного URL-адреса, используйте выражение HyperlinkPart. У него следующий синтаксис: HyperlinkPart([Таблица1].[Поле1],1) = «http://www.microsoft.com/», где «Таблица1» — это имя таблицы, содержащей поле гиперссылки, «Поле1» — это само поле гиперссылки, а «http://www.microsoft.com» — это URL-адрес, который вы хотите найти.
Чтобы добавить записи, которые… |
Используйте это условие |
Результат |
---|---|---|
Точно соответствуют определенному значению, например «Китай» |
«Китай» |
Возвращает записи, в которых поле «СтранаРегион» содержит значение «Китай». |
Не соответствуют определенному значению, например «Мексика» |
Not «Мексика» |
Возвращает записи, в которых значением поля «СтранаРегион» не является «Мексика». |
Начинаются с заданной строки символов, например «С» |
Like С* |
Возвращает записи всех стран или регионов, названия которых начинаются с буквы «С», таких как Словакия и США. Примечание: Символ «звездочка» (*) в выражении обозначает любую строку символов. Он также называется подстановочным знаком. Список таких знаков см. в статье Справочные сведения о подстановочных знаках в приложении Access. |
Не начинаются с заданной строки символов, например «С» |
Not Like С* |
Возвращает записи всех стран или регионов, названия которых не начинаются с буквы «С». |
Содержат заданную строку, например «Корея» |
Like «*Корея*» |
Возвращает записи всех стран или регионов, названия которых содержат строку «Корея». |
Не содержат заданную строку, например «Корея» |
Not Like «*Корея*» |
Возвращает записи всех стран или регионов, названия которых не содержат строку «Корея». |
Заканчиваются заданной строкой, например «ина» |
Like «*ина» |
Возвращает записи всех стран или регионов, названия которых заканчиваются на «ина», таких как «Украина» и «Аргентина». |
Не заканчиваются заданной строкой, например «ина» |
Not Like «*ина» |
Возвращает записи всех стран или регионов, названия которых не заканчиваются на «ина», как в названиях «Украина» и «Аргентина». |
Содержат пустые значения (или значения отсутствуют) |
Is Null |
Возвращает записи, в которых это поле не содержит значения. |
Не содержат пустых значений |
Is Not Null |
Возвращает записи, в которых это поле содержит значение. |
Содержат пустую строку |
«» (прямые кавычки) |
Возвращает записи, в которых поле имеет пустое значение (но не значение NULL). Например, записи о продажах другому отделу могут содержать пустое значение в поле «СтранаРегион». |
Не содержат пустых строк |
Not «» |
Возвращает записи, в которых поле «СтранаРегион» имеет непустое значение. |
Содержит нулевые значения или пустые строки |
«» Or Is Null |
Возвращает записи, в которых значение в поле отсутствует или является пустым. |
Ненулевые и непустые |
Is Not Null And Not «» |
Возвращает записи, в которых поле «СтранаРегион» имеет непустое значение, не равное NULL. |
При сортировке в алфавитном порядке следуют за определенным значением, например «Мексика» |
>= «Мексика» |
Возвращает записи с названиями стран и регионов, начиная с Мексики и до конца алфавита. |
Входят в определенный диапазон, например от А до Г |
Like «[А-Г]*» |
Возвращает страны и регионы, названия которых начинается с букв от «А» до «Г». |
Совпадают с одним из двух значений, например «Словакия» или «США» |
«Словакия» Or «США» |
Возвращает записи для США и Словакии. |
Содержат одно из значений, указанных в списке |
In(«Франция», «Китай», «Германия», «Япония») |
Возвращает записи всех стран или регионов, указанных в списке. |
Содержат определенные знаки в заданном месте значения поля |
Right([СтранаРегион], 1) = «а» |
Возвращает записи всех стран или регионов, названия которых заканчиваются на букву «а». |
Соответствуют заданной длине |
Len([СтранаРегион]) > 10 |
Возвращает записи стран или регионов, длина названия которых превышает 10 символов. |
Соответствуют заданному шаблону |
Like «Лив??» |
Возвращает записи стран или регионов, названия которых состоят из пяти символов и начинаются с «Лив», например Ливия и Ливан. Примечание: Символы ? и _ в выражении обозначают один символ. Они также называются подстановочными знаками. Знак _ нельзя использовать в одном выражении с символом ?, а также с подстановочным знаком *. Вы можете использовать подстановочный знак _ в выражении, где есть подстановочный знак %. |
Условия для числовых полей, полей с денежными значениями и полей счетчиков
Следующие примеры относятся к полю «ЦенаЗаЕдиницу», основанном на таблице, в которой хранится информация о товарах. Условие задается в строке Условие отбора поля на бланке запроса.
Чтобы добавить записи, которые… |
Условие |
Результат запроса |
---|---|---|
Точно соответствуют определенному значению, например 1000 |
100 |
Возвращает записи, в которых цена за единицу товара составляет 1000 ₽. |
Не соответствуют значению, например 10 000 |
Not 10 000 |
Возвращает записи, в которых цена за единицу товара не равна 10 000 ₽. |
Содержат значение, которое меньше заданного, например 1000 |
< 1000 |
Возвращает записи, в которых цена товара меньше 1000 ₽ (<1000). Второе выражение (<=1000) отображает записи, в которых цена не больше 1000 ₽. |
Содержат значение, которое больше заданного, например 999,99 |
>999,99 |
Возвращает записи, в которых цена товара больше 999,99 ₽ (>999,99). Второе выражение отображает записи, цена в которых не меньше 999,99 ₽. |
Содержат одно из двух значений, например 200 или 250 |
200 или 250 |
Возвращает записи, в которых цена товара равна 200 или 250 ₽. |
Содержат значение, которое входит в определенный диапазон |
>499,99 and <999,99 |
Возвращает записи товаров с ценами в диапазоне от 499,99 до 999,99 ₽ (не включая эти значения). |
Содержат значение, которое не входит в определенный диапазон |
<500 or >1000 |
Возвращает записи, в которых цена товара не находится в диапазоне от 500 до 1000 ₽. |
Содержит одно из заданных значений |
In(200, 250, 300) |
Возвращает записи, в которых цена товара равна 200, 250 или 300 ₽. |
Содержат значение, которое заканчивается на заданные цифры |
Like «*4,99» |
Возвращает записи товаров, цена которых заканчивается на 4,99, например 4,99 ₽, 14,99 ₽, 24,99 ₽ и т. д. Примечание: Знаки * и % в выражении обозначают любое количество символов. Они также называются подстановочными знаками. Знак % нельзя использовать в одном выражении с символом *, а также с подстановочным знаком ?. Вы можете использовать подстановочный знак % в выражении, где есть подстановочный знак _. |
Содержат пустые значения (или значения отсутствуют) |
Is Null |
Возвращает записи, для которых не введено значение в поле «ЦенаЗаЕдиницу». |
Содержат непустые значения |
Is Not Null |
Возвращает записи, в поле «ЦенаЗаЕдиницу» которых указано значение. |
Условия для полей «Дата/время»
Следующие примеры относятся к полю «ДатаЗаказа», основанном на таблице, в которой хранится информация о заказах. Условие задается в строке Условие отбора поля на бланке запроса.
Записи |
Используйте этот критерий |
Результат запроса |
---|---|---|
Точно соответствуют значению, например 02.02.2006 |
#02.02.2006# |
Возвращает записи транзакций, выполненных 2 февраля 2006 г. Обязательно ставьте знаки # до и после значений даты, чтобы Access мог отличить значения даты от текстовых строк. |
Не соответствуют значению, такому как 02.02.2006 |
Not #02.02.2006# |
Возвращает записи транзакций, выполненных в любой день, кроме 2 февраля 2006 г. |
Содержат значения, которые предшествуют определенной дате, например 02.02.2006 |
< #02.02.2006# |
Возвращает записи транзакций, выполненных до 2 февраля 2006 г. Чтобы просмотреть транзакции, выполненные в определенную дату или до нее, воспользуйтесь оператором <= вместо оператора <. |
Содержат значения, которые следуют за определенной датой, например 02.02.2006 |
> #02.02.2006# |
Возвращает записи транзакций, выполненных после 2 февраля 2006 г. Чтобы просмотреть транзакции, выполненные в определенную дату или после нее, воспользуйтесь оператором >= вместо оператора >. |
Содержат значения, которые входят в определенный диапазон дат |
>#02.02.2006# and <#04.02.2006# |
Возвращает записи транзакций, выполненных в период между 2 и 4 февраля 2006 г. Кроме того, для фильтрации по диапазону значений, включая конечные значения, вы можете использовать оператор Between. Например, выражение Between #02.02.2006# and #04.02.2006# идентично выражению >=#02.02.2006# and <=#04.02.2006#. |
Содержат значения, которые не входят в определенный диапазон |
<#02.02.2006# or >#04.02.2006# |
Возвращает записи транзакций, выполненных до 2 февраля 2006 г. или после 4 февраля 2006 г. |
Содержат одно из двух заданных значений, например 02.02.2006 или 03.02.2006 |
#02.02.2006# or #03.02.2006# |
Возвращает записи транзакций, выполненных 2 или 3 февраля 2006 г. |
Содержит одно из нескольких значений |
In (#01.02.2006#, #01.03.2006#, #01.04.2006#) |
Возвращает записи транзакций, выполненных 1 февраля 2006 г., 1 марта 2006 г. или 1 апреля 2006 г. |
Содержат дату, которая выпадает на определенный месяц (вне зависимости от года), например декабрь |
DatePart(«m»; [ДатаПродажи]) = 12 |
Возвращает записи транзакций, выполненных в декабре любого года. |
Содержат дату, которая выпадает на определенный квартал (вне зависимости от года), например первый |
DatePart(«q»; [ДатаПродажи]) = 1 |
Возвращает записи транзакций, выполненных в первом квартале любого года. |
Содержат текущую дату |
Date() |
Возвращает записи транзакций, выполненных сегодня. Если сегодняшняя дата — 02.02.2006 г., вы увидите записи, в поле «ДатаЗаказа» которых указано 2 февраля 2006 г. |
Содержат вчерашнюю дату |
Date()-1 |
Возвращает записи транзакций, выполненных вчера. Если сегодняшняя дата — 02.02.2006 г., вы увидите записи за 1 февраля 2006 г. |
Содержат завтрашнюю дату |
Date() + 1 |
Возвращает записи транзакций, которые будут выполнены завтра. Если сегодняшняя дата — 02.02.2006 г., вы увидите записи за 3 февраля 2006 г. |
Содержат даты, которые выпадают на текущую неделю |
DatePart(«ww»; [ДатаПродажи]) = DatePart(«ww»; Date()) and Year([ДатаПродажи]) = Year(Date()) |
Возвращает записи транзакций, выполненных за текущую неделю. Неделя начинается в воскресенье и заканчивается в субботу. |
Содержат даты, которые выпадают на прошлую неделю |
Year([ДатаПродажи])* 53 + DatePart(«ww»; [ДатаПродажи]) = Year(Date())* 53 + DatePart(«ww»; Date()) — 1 |
Возвращает записи транзакций, выполненных за прошлую неделю. Неделя начинается в воскресенье и заканчивается в субботу. |
Содержат даты, которые выпадают на следующую неделю |
Year([ДатаПродажи])* 53+DatePart(«ww»; [ДатаПродажи]) = Year(Date())* 53+DatePart(«ww»; Date()) + 1 |
Возвращает записи транзакций, которые будут выполнены на следующей неделе. Неделя начинается в воскресенье и заканчивается в субботу. |
Содержат дату, которая выпадает на последние 7 дней |
Between Date() and Date()-6 |
Возвращает записи транзакций, выполненных за последние 7 дней. Если сегодняшняя дата — 02.02.2006 г., вы увидите записи за период с 24 января 2006 г. по 2 февраля 2006 г. |
Содержат дату, которая выпадает на текущий месяц |
Year([ДатаПродажи]) = Year(Now()) And Month([ДатаПродажи]) = Month(Now()) |
Возвращает записи за текущий месяц. Если сегодняшняя дата — 02.02.2006 г., вы увидите записи за февраль 2006 г. |
Содержат дату, которая выпадает на прошлый месяц |
Year([ДатаПродажи])* 12 + DatePart(«m»; [ДатаПродажи]) = Year(Date())* 12 + DatePart(«m»; Date()) — 1 |
Возвращает записи за прошлый месяц. Если сегодняшняя дата — 02.02.2006 г., вы увидите записи за январь 2006 г. |
Содержат дату, которая выпадает на следующий месяц |
Year([ДатаПродажи])* 12 + DatePart(«m»; [ДатаПродажи]) = Year(Date())* 12 + DatePart(«m»; Date()) + 1 |
Возвращает записи за следующий месяц. Если сегодняшняя дата — 02.02.2006 г., вы увидите записи за март 2006 г. |
Содержат дату, которая выпадает на последние 30 дней или 31 день |
Between Date( ) And DateAdd(«M», -1, Date( )) |
Записи о продажах за месяц. Если сегодняшняя дата — 02.02.2006 г., вы увидите записи за период со 2 января 2006 г. по 2 февраля 2006 г. |
Содержат дату, которая выпадает на текущий квартал |
Year([ДатаПродажи]) = Year(Now()) And DatePart(«q»; Date()) = DatePart(«q»; Now()) |
Возвращает записи за текущий квартал. Если сегодняшняя дата — 02.02.2006 г., вы увидите записи за первый квартал 2006 г. |
Содержат дату, которая выпадает на прошлый квартал |
Year([ДатаПродажи])*4+DatePart(«q»;[ДатаПродажи]) = Year(Date())*4+DatePart(«q»;Date())- 1 |
Возвращает записи за прошлый квартал. Если сегодняшняя дата — 02.02.2006 г., вы увидите записи за последний квартал 2005 г. |
Содержат дату, которая выпадает на следующий квартал |
Year([ДатаПродажи])*4+DatePart(«q»;[ДатаПродажи]) = Year(Date())*4+DatePart(«q»;Date())+1 |
Возвращает записи за следующий квартал. Если сегодняшняя дата — 02.02.2006 г., вы увидите записи за второй квартал 2006 г. |
Содержат дату, которая выпадает на текущий год |
Year([ДатаПродажи]) = Year(Date()) |
Возвращает записи за текущий год. Если сегодняшняя дата — 02.02.2006 г., вы увидите записи за 2006 г. |
Содержат дату, которая выпадает на прошлый год |
Year([ДатаПродажи]) = Year(Date()) — 1 |
Возвращает записи транзакций, выполненных в прошлом году. Если сегодняшняя дата — 02.02.2006 г., вы увидите записи за 2005 г. |
Содержат дату, которая выпадает на следующий год |
Year([ДатаПродажи]) = Year(Date()) + 1 |
Возвращает записи транзакций, которые будут выполнены в следующем году. Если сегодняшняя дата — 02.02.2006 г., вы увидите записи за 2007 г. |
Содержат дату, которая приходится на период с 1 января до текущей даты (записи с начала года до настоящего момента) |
Year([ДатаПродажи]) = Year(Date()) and Month([ДатаПродажи]) <= Month(Date()) and Day([ДатаПродажи]) <= Day (Date()) |
Возвращает записи транзакций, которые приходятся на период с 1 января текущего года до сегодняшней даты. Если сегодняшняя дата — 02.02.2006 г., вы увидите записи за период с 1 января 2006 г. по 2 февраля 2006 г. |
Содержат прошедшую дату |
< Date() |
Возвращает записи транзакций, выполненных до сегодняшнего дня. |
Содержат будущую дату |
> Date() |
Возвращает записи транзакций, которые будут выполнены после сегодняшнего дня. |
Фильтр пустых (или отсутствующих) значений |
Is Null |
Возвращает записи, в которых не указана дата транзакции. |
Фильтр непустых значений |
Is Not Null |
Возвращает записи, в которых указана дата транзакции. |
Условия для полей «Да/Нет»
В качестве примера, в таблице «Клиенты» есть логическое поле «Активность», которое показывает текущую активность учетной записи клиента. В таблице отображается, как вычисляются значения, введенные в строке условий логического поля.
Значение поля |
Результат |
---|---|
«Да», «Истина», 1 или -1 |
Проверено для значения «Да». После ввода значение 1 или -1 изменяется на «Истина» в строке условий. |
«Нет», «Ложь» или 0 |
Проверено для значения «Нет». После ввода значение 0 изменяется на «Ложь» в строке условий. |
Нет значения (null) |
Не проверено |
Любое число, отличное от 1, -1 или 0 |
Нет результатов, если это единственное значение условия в поле |
Любая строка символов, отличная от «Да», «Нет», «Истина» или «Ложь» |
Не удается выполнить запрос из-за ошибки несоответствия типов данных. |
Условия для других полей
Вложения. В строке Условие отбора введите Is Null, чтобы включить записи, которые не содержат вложений. Введите Is Not Null, чтобы включить записи с вложениями.
Поля подстановки. Существует два типа полей подстановки: те, которые подставляют значения из существующего источника данных (с помощью внешнего ключа), и те, которые основаны на списке значений, заданном при их создании.
Поля подстановки, основанные на списке значений, имеют текстовый тип данных и принимают такие же условия, как другие текстовые поля.
Условия, которые можно использовать в поле подстановки, основанном на значениях из существующего источника данных, зависят от типа данных внешнего ключа, а не типа подставляемых данных. Например, у вас может быть поле подстановки, которое отображает имя сотрудника, но использует внешний ключ с числовым типом данных. Так как в поле хранится число, а не текст, вы можете использовать условия, которые подходят для чисел, такие как >2.
Если вы не знаете тип данных внешнего ключа, можно просмотреть исходную таблицу в Конструкторе, чтобы определить его. Для этого:
-
Найдите исходную таблицу в области навигации.
-
Откройте таблицу в Конструкторе, сделав одно из следующего:
-
Щелкните таблицу и нажмите клавиши CTRL+ВВОД.
-
Щелкните таблицу правой кнопкой мыши и выберите пункт Конструктор.
-
-
Тип данных для каждого поля указан в столбце Тип данных на бланке таблицы.
Многозначные поля. Данные в многозначных полях хранятся как строки скрытой таблицы, которые Access создает и заполняет для представления поля. В Конструкторе запроса они представлены в списке полей с помощью расширяемого поля. Чтобы задать условия для многозначного поля, необходимо указать их для одной строки скрытой таблицы. Для этого выполните указанные ниже действия.
-
Создайте запрос, содержащий многозначное поле, и откройте его в Конструкторе.
-
Разверните многозначное поле, щелкнув символ плюса (+) рядом с ним. Если поле уже развернуто, то выводится минус (—). Под именем поля вы увидите поле, представляющее одно значение многозначного поля. Это поле будет иметь то же имя, что и многозначное поле, но к нему будет добавлена строка .Значение.
-
Перетащите многозначное поле и поле его значения в различные столбцы на бланке. Если вы хотите, чтобы в результатах выводилось только полное многозначное поле, снимите флажок Показать для поля одного значения.
-
Введите в поле Условие отбора для поля с одним значением условия, подходящие для типа данных, который представляют собой значения.
-
Каждое значение в многозначном поле будет оцениваться по отдельности на основе указанных условий. Например, допустим, что в многозначном поле хранится список чисел. Если указать условия >5 AND <3, будут выведены все записи, в которых есть по крайней мере одно значение больше 5 и одно значение меньше 3.
См. также
Общие сведения о запросах
Создание простого запроса на выборку
В простейшем случае запрос реализует выбор из одной таблицы нужных полей, записей, соответствующих заданным условиям отбора, и просмотр результатов выполнения запроса.
Конструирование запросов на выборку с условиями отбора
Рассмотрим запросы на выборку в Access на примере получения информации из таблицы ТОВАР базы данных Поставка товаров.
Задача 1. Пусть необходимо выбрать ряд характеристик товара по его наименованию.
- Для создания запроса в окне базы данных выберите вкладку ленты — Создание (Create) и в группе Запросы (Queries) нажмите кнопку Конструктор запросов (Query Design). Откроется пустое окно запроса на выборку в режиме конструктора — ЗапросN (QueryN) и диалоговое окно Добавление таблицы (Show Table) (рис. 4.2).
- В окне Добавление таблицы (Show Table) выберите таблицу ТОВАР и нажмите кнопку Добавить (Add). Выбранная таблица будет отображена в области схемы данных запроса. Закройте окно Добавление таблицы (Show Table), нажав кнопку Закрыть (Close).
В результате выполненных действий в окне конструктора запросов (рис. 4.1) в верхней панели появится схема данных запроса, которая включает выбранные для данного запроса таблицы. В данном случае одну таблицу ТОВАР. Таблица представлена списком полей. Первая строка в списке полей таблицы, отмеченная звездочкой (*), обозначает все множество полей таблицы. Нижняя панель является бланком запроса, который нужно заполнить.
Кроме того, на ленте появляется и автоматически активизируется новая вкладка Работа с запросами | Конструктор (Query Tools | Design) (на рис. 4.3 представлена на часть этой вкладки), на которой цветом выделен тип созданного запроса — Выборка (Select). Таким образом, по умолчанию всегда создается запрос на выборку. Команды этой вкладки представляют инструментарий для выполнения необходимых действий при создании запроса. Эта вкладка открывается, когда в режиме конструктора создается новый запрос или редактируется существующий.
- Для удаления любой таблицы из схемы данных запроса установите на нее курсор мыши и нажмите клавишу <Delete>. Для добавления ― нажмите кнопку Отобразить таблицу ( Show Table) в группе Настройка запроса (Query Setup) на вкладке Работа с запросами | Конструктор (Query Tools | Design) или выполните команду Добавить таблицу (Show Table) в контекстном меню, вызываемом на схеме данных запроса.
- В окне конструктора (рис. 4.4) последовательно перетащите из списка полей таблицы ТОВАР поля НАИМ_ТОВ, ЦЕНА, НАЛИЧИЕ_ТОВ в столбцы бланка запроса в строку Поле (Field).
- Для включения нужных полей из таблицы в соответствующие столбцы запроса можно воспользоваться следующими приемами:
- в первой строке бланка запроса Поле (Field) щелчком мыши вызвать появление кнопки списка и выбрать из списка нужное поле. Список содержит поля таблиц, представленных в схеме данных запроса;
- дважды щелкнуть на имени поля таблицы в схеме данных запроса;
- для включения всех полей таблицы можно перетащить или дважды щелкнуть на символе * (звездочка) в списке полей таблицы в схеме данных запроса.
- Если вы по ошибке перетащили в бланке запроса ненужное поле, удалите его. Для этого переместите курсор в область маркировки столбца сверху, где он примет вид черной стрелки, направленной вниз, и щелкните кнопкой мыши. Столбец выделится. Нажмите клавишу <Delete> или выполните команду Удалить столбцы (Delete Columns) в группе Настройка запроса (Query Setup).
- В строке Вывод на экран (Show) отметьте поля, иначе они не будут включены в таблицу запроса.
- Запишите в строке Условия отбора (Criteria) наименование товара, как показа-но в бланке запроса на рис. 4.4. Так как выражение в условии отбора не содержит оператора, то по умолчанию используется оператор =. Используемое в выражении текстовое значение вводится в двойных кавычках, которые добавляются автоматически.
- Выполните запрос, щелкнув на кнопке Выполнить (Run) или на кнопке Режим (View) в группе Результаты (Results). На экране появится окно запроса в режиме таблицы с записью из таблицы ТОВАР, отвечающей заданным условиям отбора.
ЗАМЕЧАНИЕ
Окно запроса в режиме таблицы аналогично окну просмотра таблицы базы данных. Через некоторые таблицы запроса может производиться изменение данных базовой таблицы, лежащей в основе запроса. Запрос, просматриваемый в режиме таблицы, в отличие от таблицы базы данных Access 2010, не имеет столбца Щелкнуть для добавления (Click to Add), предназначенного для изменения структуры таблицы. В этом режиме на вкладке ленты Главная (Home) доступны те же кнопки, что и при открытии таблицы базы данных.
- Если при вводе сложного наименования товара вы допустили неточность, товар не будет найден в таблице. Использование операторов шаблона — звездочка (*) и вопросительный знак (?) (стандарт ANSI-89, используемый для запросов по умолчанию) или знак процента (%) и подчеркивания (_) (ANSI-92, рекомендуемый как стандарт для SQL Server), упрощает поиск нужных строк и позволяет избежать многих ошибок. Введите вместо полного имени товара Корпус* или Корпус%. Выполните запрос. Если в поле наименования товара одно значение начинается со слова «Корпус», результат выполнения запроса будет таким же, как в предыдущем случае. После выполнения запроса введенное выражение будет дополнено оператором Like «Корпус*». Этот оператор позволяет использовать символы шаблона при поиске в текстовых полях.
- Если необходимо найти несколько товаров, используйте оператор In. Он позволяет выполнить проверку на равенство любому значению из списка, который задается в круглых скобках. Запишите в строке условий отбора In («Корпуc MiniTower»;»HDD Maxtor 20GB»;»FDD 3,5″). В таблице запроса будет выведено три строки. В операторе In не допускается использование символов шаблона.
- Сохраните запрос, щелкнув на вкладке Файл (File) и выполнив команду Сохранить (Save). В окне Сохранение (Save As) введите имя запроса Пример1. Заметим, что имя запроса не должно совпадать не только с именами имеющихся запросов, но и с именами таблиц в базе данных.
- Закройте текущий запрос по команде контекстного меню Закрыть (Close) или нажав кнопку окна запроса Закрыть (Close).
- Выполните сохраненный запрос, выделив запрос в области навигации и выбрав в контекстном меню команду Открыть (Open).
- Для редактирования запроса выделите его в области навигации и выполните в контекстном меню команду Конструктор (Design View).
Задача 2. Пусть надо выбрать товары, цена которых не более 1000 руб., и НДС не более 10%, а также выбрать товары, цена которых более 2500 руб. Результат должен содержать наименование товара (НАИМ_ТОВ), его цену (ЦЕНА) и НДС (СТАВКА_НДС).
- Создайте новый запрос в режиме конструктора, добавьте таблицу ТОВАР. В окне конструктора (рис. 4.5) последовательно перетащите из списка полей таблицы ТОВАР в бланк запроса поля НАИМ_ТОВ, ЦЕНА, СТАВКА_НДС.
- Запишите Условия отбора (Criteria), как показано в бланке запроса на рис. 4.5. Между условиями, записанными в одной строке, выполняется логическая операция AND. Между условиями, записанными в разных строках, выполняется логическая операция OR.
- Выполните запрос, щелкните на кнопке Выполнить (Run) в группе Результаты (Results). На экране появится окно запроса в режиме таблицы с записями из таблицы ТОВАР, отвечающими заданным условиям отбора.
- Сохраните запрос, выполнив соответствующую команду в контекстном меню запроса, которое вызывается при установке курсора на заголовок запроса. Дайте ему имя Пример2.
Задача 3. Пусть надо выбрать все накладные за заданный период. Результат должен содержать номер накладной (НОМ_НАК), код склада (КОД_СК), дату отгрузки (ДАТА_ОТГР) и общую стоимость отгруженного товара (СУММА_НАКЛ).
- Создайте новый запрос в режиме конструктора, добавьте таблицу НАКЛАДНАЯ. В окне конструктора последовательно перетащите из списка полей таблицы НАКЛАДНАЯ в бланк запроса все необходимые поля.
- Для поля ДАТА_ОТГР в строке Условия отбора (Criteria) запишите Between #11.01.2008# And #31.03.2008#. Оператор Between задает интервал дат (в ANSI-92 вместо знака # используются одинарные кавычки ‘). Кроме того, этот оператор позволяет задать интервал для числового значения.
Для закрепления смотрим видеоурок:
Вычисляемые поля в запросах Access далее.
Содержание
- 1 Конструирование запросов на выборку с условиями отбора
- 2 Создание запросов в Microsoft Access
- 3 Легкий путь для новичков
- 4 Простой запрос
- 5 Перекрестный запрос
- 6 Повторяющиеся записи
- 7 Записи без подчиненных
- 8 Функции запросов в MS Access
- 9 Запрос на выборку
- 10 Запрос с параметрами
- 11 Расширенный перекрестный запрос
- 12 Краткие рекомендации
- 12.1 ПОСМОТРЕТЬ ЕЩЕ:
В простейшем случае запрос реализует выбор из одной таблицы нужных полей, записей, соответствующих заданным условиям отбора, и просмотр результатов выполнения запроса.
Конструирование запросов на выборку с условиями отбора
Рассмотрим запросы на выборку в Access на примере получения информации из таблицы ТОВАР базы данных Поставка товаров.
Задача 1. Пусть необходимо выбрать ряд характеристик товара по его наименованию.
- Для создания запроса в окне базы данных выберите вкладку ленты — Создание (Create) и в группе Запросы (Queries) нажмите кнопку Конструктор запросов (Query Design). Откроется пустое окно запроса на выборку в режиме конструктора — ЗапросN (QueryN) и диалоговое окно Добавление таблицы (Show Table) (рис. 4.2).
- В окне Добавление таблицы (Show Table) выберите таблицу ТОВАР и нажмите кнопку Добавить (Add). Выбранная таблица будет отображена в области схемы данных запроса. Закройте окно Добавление таблицы (Show Table), нажав кнопку Закрыть (Close).
В результате выполненных действий в окне конструктора запросов (рис. 4.1) в верхней панели появится схема данных запроса, которая включает выбранные для данного запроса таблицы. В данном случае одну таблицу ТОВАР. Таблица представлена списком полей. Первая строка в списке полей таблицы, отмеченная звездочкой (*), обозначает все множество полей таблицы. Нижняя панель является бланком запроса, который нужно заполнить.
Кроме того, на ленте появляется и автоматически активизируется новая вкладка Работа с запросами | Конструктор (Query Tools | Design) (на рис. 4.3 представлена на часть этой вкладки), на которой цветом выделен тип созданного запроса — Выборка (Select). Таким образом, по умолчанию всегда создается запрос на выборку. Команды этой вкладки представляют инструментарий для выполнения необходимых действий при создании запроса. Эта вкладка открывается, когда в режиме конструктора создается новый запрос или редактируется существующий.
- Для удаления любой таблицы из схемы данных запроса установите на нее курсор мыши и нажмите клавишу . Для добавления ― нажмите кнопку Отобразить таблицу ( Show Table) в группе Настройка запроса (Query Setup) на вкладке Работа с запросами | Конструктор (Query Tools | Design) или выполните команду Добавить таблицу (Show Table) в контекстном меню, вызываемом на схеме данных запроса.
- В окне конструктора (рис. 4.4) последовательно перетащите из списка полей таблицы ТОВАР поля НАИМ_ТОВ, ЦЕНА, НАЛИЧИЕ_ТОВ в столбцы бланка запроса в строку Поле (Field).
- Для включения нужных полей из таблицы в соответствующие столбцы запроса можно воспользоваться следующими приемами:
- в первой строке бланка запроса Поле (Field) щелчком мыши вызвать появление кнопки списка и выбрать из списка нужное поле. Список содержит поля таблиц, представленных в схеме данных запроса;
- дважды щелкнуть на имени поля таблицы в схеме данных запроса;
- для включения всех полей таблицы можно перетащить или дважды щелкнуть на символе * (звездочка) в списке полей таблицы в схеме данных запроса.
- Если вы по ошибке перетащили в бланке запроса ненужное поле, удалите его. Для этого переместите курсор в область маркировки столбца сверху, где он примет вид черной стрелки, направленной вниз, и щелкните кнопкой мыши. Столбец выделится. Нажмите клавишу или выполните команду Удалить столбцы (Delete Columns) в группе Настройка запроса (Query Setup).
- В строке Вывод на экран (Show) отметьте поля, иначе они не будут включены в таблицу запроса.
- Запишите в строке Условия отбора (Criteria) наименование товара, как показа-но в бланке запроса на рис. 4.4. Так как выражение в условии отбора не содержит оператора, то по умолчанию используется оператор =. Используемое в выражении текстовое значение вводится в двойных кавычках, которые добавляются автоматически.
- Выполните запрос, щелкнув на кнопке Выполнить (Run) или на кнопке Режим (View) в группе Результаты (Results). На экране появится окно запроса в режиме таблицы с записью из таблицы ТОВАР, отвечающей заданным условиям отбора.
ЗАМЕЧАНИЕ
Окно запроса в режиме таблицы аналогично окну просмотра таблицы базы данных. Через некоторые таблицы запроса может производиться изменение данных базовой таблицы, лежащей в основе запроса. Запрос, просматриваемый в режиме таблицы, в отличие от таблицы базы данных Access 2010, не имеет столбца Щелкнуть для добавления (Click to Add), предназначенного для изменения структуры таблицы. В этом режиме на вкладке ленты Главная (Home) доступны те же кнопки, что и при открытии таблицы базы данных.
- Если при вводе сложного наименования товара вы допустили неточность, товар не будет найден в таблице. Использование операторов шаблона — звездочка (*) и вопросительный знак (?) (стандарт ANSI-89, используемый для запросов по умолчанию) или знак процента (%) и подчеркивания (_) (ANSI-92, рекомендуемый как стандарт для SQL Server), упрощает поиск нужных строк и позволяет избежать многих ошибок. Введите вместо полного имени товара Корпус* или Корпус%. Выполните запрос. Если в поле наименования товара одно значение начинается со слова «Корпус», результат выполнения запроса будет таким же, как в предыдущем случае. После выполнения запроса введенное выражение будет дополнено оператором Like «Корпус*». Этот оператор позволяет использовать символы шаблона при поиске в текстовых полях.
- Если необходимо найти несколько товаров, используйте оператор In. Он позволяет выполнить проверку на равенство любому значению из списка, который задается в круглых скобках. Запишите в строке условий отбора In («Корпуc MiniTower»;»HDD Maxtor 20GB»;»FDD 3,5″). В таблице запроса будет выведено три строки. В операторе In не допускается использование символов шаблона.
- Сохраните запрос, щелкнув на вкладке Файл (File) и выполнив команду Сохранить (Save). В окне Сохранение (Save As) введите имя запроса Пример1. Заметим, что имя запроса не должно совпадать не только с именами имеющихся запросов, но и с именами таблиц в базе данных.
- Закройте текущий запрос по команде контекстного меню Закрыть (Close) или нажав кнопку окна запроса Закрыть (Close).
- Выполните сохраненный запрос, выделив запрос в области навигации и выбрав в контекстном меню команду Открыть (Open).
- Для редактирования запроса выделите его в области навигации и выполните в контекстном меню команду Конструктор (Design View).
Задача 2. Пусть надо выбрать товары, цена которых не более 1000 руб., и НДС не более 10%, а также выбрать товары, цена которых более 2500 руб. Результат должен содержать наименование товара (НАИМ_ТОВ), его цену (ЦЕНА) и НДС (СТАВКА_НДС).
- Создайте новый запрос в режиме конструктора, добавьте таблицу ТОВАР. В окне конструктора (рис. 4.5) последовательно перетащите из списка полей таблицы ТОВАР в бланк запроса поля НАИМ_ТОВ, ЦЕНА, СТАВКА_НДС.
- Запишите Условия отбора (Criteria), как показано в бланке запроса на рис. 4.5. Между условиями, записанными в одной строке, выполняется логическая операция AND. Между условиями, записанными в разных строках, выполняется логическая операция OR.
- Выполните запрос, щелкните на кнопке Выполнить (Run) в группе Результаты (Results). На экране появится окно запроса в режиме таблицы с записями из таблицы ТОВАР, отвечающими заданным условиям отбора.
- Сохраните запрос, выполнив соответствующую команду в контекстном меню запроса, которое вызывается при установке курсора на заголовок запроса. Дайте ему имя Пример2.
Задача 3. Пусть надо выбрать все накладные за заданный период. Результат должен содержать номер накладной (НОМ_НАК), код склада (КОД_СК), дату отгрузки (ДАТА_ОТГР) и общую стоимость отгруженного товара (СУММА_НАКЛ).
- Создайте новый запрос в режиме конструктора, добавьте таблицу НАКЛАДНАЯ. В окне конструктора последовательно перетащите из списка полей таблицы НАКЛАДНАЯ в бланк запроса все необходимые поля.
- Для поля ДАТА_ОТГР в строке Условия отбора (Criteria) запишите Between #11.01.2008# And #31.03.2008#. Оператор Between задает интервал дат (в ANSI-92 вместо знака # используются одинарные кавычки ‘). Кроме того, этот оператор позволяет задать интервал для числового значения.
Для закрепления смотрим видеоурок:
Вычисляемые поля в запросах Access далее.
Приложение СУБД MS Access – это полноценный помощник для создания и ведения баз данных, заключенных в таблицы и массивы. Если база имеет слишком большой объем, быстро найти необходимые значения довольно сложно.
Именно поэтому в Access существует такая функция, как запросы. Рассмотрим, что это такое, как работает, какие имеет особенности.
Создание запросов в Microsoft Access
Чтобы разобраться, как создавать запросы в Access, нужно знать основные положения работы с СУБД.
Существует два способа выполнить данную процедуру:
- Конструктор запросов.
- Мастер запросов.
Первый способ дает возможность создать любой из всех доступных запросов в ручном режиме, но с небольшой оговоркой, заключающейся в том, что пользователь имеет опыт работы с приложением Access. Также он должен разбираться хотя бы в основных его задачах. Что касается второго способа, то его нужно рассмотреть более подробно.
Легкий путь для новичков
Знающий человек за несколько кликов мышью выбирает те компоненты, которые потребуются пользователю для выполнения запроса, а затем быстро формирует реестр, в соответствии с собранными ключевыми значениями. Если это первое знакомство с СУБД, и пользователь не представляет, как создавать запросы в Access, то выбирается программа Мастер.
В данном режиме можно ознакомиться и разобраться со следующими типами запросов:
- Простой.
- Перекрестный.
- Записи без подчиненных.
- Повторяющиеся записи.
Данный выбор осуществляется уже на первом этапе работы с Мастером. А в дальнейшем, следуя четким указаниям, даже начинающий пользователь легко создаст запрос. Познакомимся с его разновидностями.
Простой запрос
Этот инструмент работы с таблицами собирает нужные данные из указанных пользователем полей. Уже по названию видно, что это самый популярный тип запросов для новичков. Его удобство заключается в том, что такая процедура открывается в новой вкладке. Поэтому ответ на вопрос, как создать запрос в Access 2010, становится очевидным уже после открытия первого меню Мастера.
Перекрестный запрос
Этот тип выборки более сложный. Чтобы разобраться, как создать перекрестный запрос в Access с помощью «Мастера» в данном режиме, нужно кликнуть по этой функции в первом окне.
На экране появится таблица, в которой можно выбрать до трех столбцов, расположенных в оригинале.
Одно из оставшихся не выбранных полей может быть использовано в качестве заголовков таблицы запроса. На третьем этапе процедуры (пересечение) выбирается еще одно значение с вариативностью функцию (среднее значение, сумма, первый, последний).
На фото показано, что перекрестный запрос создан, и что по заданным параметрам совершены необходимые действия.
Повторяющиеся записи
Как понятно из названия, основное предназначение данного запроса – выборка всех одинаковых строк в таблице по указанным параметрам. Выглядит это так:
Кроме того, доступен выбор дополнительных полей, чтобы подобрать соответствие сразу в нескольких строках.
Чтобы выбрать повторяющиеся записи, нужно раскрыть список запросов и создать там новую папку. Далее в окошке «Новый запрос» выбрать строку «Поиск повторяющихся записей». Далее нужно следовать указаниям Мастера.
Записи без подчиненных
Это последний тип запросов, доступный в режиме «Мастер – Записи без подчиненных».
В этом случае ведется выборка только тех значений, которые не задействованы ни в одном поле таблиц и запросов, но которые уже созданы.
Данный тип актуален только в случаях, когда баз данных несколько.
Все эти четыре типа запросов являются базовой точкой для работы со сложными элементами, но позволяют легко разобраться, как создать запрос в базе данных Access.
Разберемся, зачем нужно выполнять описанные выше действия. Задача всех простых и сложных запросов в СУБД Access заключается в следующем:
- Сбор необходимых данных в таблицах, их последующих просмотр, редактирование, добавление новых значений.
- Прекрасный исходный материал для подготовки всевозможных форм отчетности.
- Проведение математических и статистических счетных процедур над целыми массивами данных с выводом итогов на экран (среднее значение, сумма, отклонение, итоги).
Запрос на выборку
Этот тип работы с базами данных является сложным, так как требует участия нескольких таблиц.
Необходимо, чтобы во всех таблицах были общие ключевые поля. В противном случае совершить операцию не получится.
Повторим, как создать запрос на выборку в Access. Сначала нужно создать простой запрос с выбором нужных полей. Уже здесь можно редактировать данные, чтобы привести их в желаемый вид. К слову, внесенные изменения перенесутся и в исходные таблицы, так что этот момент нужно учитывать.
В открывшемся окне конструктора заполняется окно «Добавление таблиц». Здесь нужно добавить те таблицы или запросы, из которых нужно вытаскивать исходные значения.
После добавления можно приступить к заполнению условий запроса. Для этого нам нужна строка «Поле». В ней нужно подобрать те значения из таблиц, которые будут отображаться при запросе.
Чтобы завершить операцию, нужно нажать на кнопку «Выполнить».
Запрос с параметрами
Это еще одна разновидность сложной процедуры, которая потребует от пользователя определенных навыков работы с базами данных. Одним из главных направлений такого действия является подготовка к созданию отчетов с объемными данными, а также получение сводных результатов. Как создавать запросы в Access 2007 с помощью конструктора, будет рассмотрено ниже.
Начинать данную процедуру по выборке данных нужно с создания простого запроса, чтобы выбрать нужные поля. Далее через режим Конструктора обязательно нужно заполнить поле «Условие отбора» и, уже исходя из внесенного значения, будет осуществляться отбор.
Таким образом, на вопрос о том, как создать запрос с параметром в Access, ответ простой — внести исходные параметры для выборки. Чтобы работать с Конструктором необходимо пользоваться Мастером запросов. Там создается первичные данные для фильтрации, которые служат основой дальнейшей работы.
Расширенный перекрестный запрос
Продолжаем усложнять ситуацию. Еще труднее для понимания является информация о том, как создавать запросы в Access, если присутствует несколько таблиц с данными. Перекрестный запрос уже рассматривался выше, как один из вариантов работы с Мастером. Однако, и в режиме «Конструктора» можно создавать подобный запрос.
Для этого необходимо нажать «Конструктор запросов» — «Перекрестный».
Открывается меню добавления исходных таблиц, а также возможность заполнения выборочных полей. Единственное, на что следует обратить внимание, – пункты «групповая операция» и «перекрестная таблица». Их нужно заполнять правильно, иначе процедура не будет выполнена корректно.
Перекрестные запросы – это наиболее простой способ поиска и выборки информации из нескольких источников данных, плюс с возможностью формирования диаграмм и графиков.
Более того, при использовании данной процедуры быстрее выполняется поиск, даже с несколькими вариантами развития.
Конечно, присутствуют и «подводные камни», которые могут помешать в работе. Например, при создании запроса на сортировку базы данных по значению столбцов система выдает ошибку. То есть доступна только сортировка по стандартным пунктам – «возрастание и убывание».
Краткие рекомендации
Подводя итоги, нужно сказать, что решить, как создавать запросы в Access – с помощью Мастера или Конструктора, должен сам пользователь. Хотя, для большинства людей, которые используют СУБД MS Access, больше подойдет первый вариант. Ведь Мастер сам сделает всю работу, оставив для пользователя только несколько кликов мышью, при выборе условий запроса.
Чтобы использовать расширенные настройки, явно необходим опыт работы с базами данных на уровне профессионала. Если в работе задействованы большие базы, лучше всего обратиться к специалистам, дабы избежать нарушения работы СУБД и возможных потерь данных.
Есть один момент, который доступен лишь программистам. Так как основным языком СУБД является SQL, то нужный запрос можно написать в виде программного кода. Чтобы работать в данном режиме, достаточно нажать на строку уже созданного запроса, и в открывшемся контекстном меню выбрать «Режим SQL».
В большинстве современных СУБД имеется свой вариант QBE, незначительно отличающийся от первого описания QBE, предложенного в конце 70-х годов ХХ в. Рассмотрим некоторые возможности QBE СУБД MS Access.
Используем для примера таблицу БД, которая относится к торговле (рис. 3.10). Имя таблицы TYPE (типы товаров). Она имеет столбцы: товар – названия товара; цвет – его цвет; стоимость – стоимость товара.
Выборка данных может осуществляться по следующим вариантам:
1. Простая выборка, например: «Вывести товары зеленого цвета из таблицы TYPE».
2. Простая выборка с упорядочиванием.
3. Выборка с квалификаторами (условиями). Выбор записей из исходной таблицы может быть основан на: а) точном совпадении; б) частичном совпадении; в) сравнении.
Запросы позволяют получать результирующие таблицы, поля которых удовлетворяют определённым условиям (критериям). Эти условия задают в бланке запроса в строке Условия отбора. Условиями отбора являются логические выражения, состоящие из операторов и операндов. Используются операторы сравнения =, < , >, (не равно), Between, In, Like и и логические операторы And, Or, Not. Допускается применять шаблоны с подстановочными символами.
Рис. 3.10. Пример таблицы БД
Если точное значение не известно или необходимо вводить значение не полностью, то удобно использовать шаблон (образец) с подстановочными символами (знаками). Примеры подстановочных символов:
* — соответствует любому количеству любых символов. Пример: 77* — для нахождения всех телефонов с номерами, начинающимися на 77.
? — соответствует одному текстовому символу. Пример: 77-4?-0? — для нахождения всех телефонов с номерами, содержащими четыре указанные цифры.
Шаблоны используются совместно с оператором Like. Этот оператор позволяет создавать шаблоны, использующие подстановочные символы при поиске в текстовых полях. Например, фамилия сотрудника известна неточно. Это может быть Петров, Петровский, Пеотровский и т.п. Тогда следует использовать для выборки в строке Условие запись Like «Пе*».
Известно, что имя состоит из 4-х букв. Тогда подойдет запись Like «????».
Оператор Between задаёт интервал значений. Например, Between 1 And 5
(указанные края интервалов в выборку включаются).
Оператор In выполняет проверку на равенство любому значению из списка, заданному в круглых скобках. Например, In(«ручка»;»духи»).
Логические операции И, ИЛИ могут быть заданы явно в выражении условия с помощью операторов AND и OR. Например, «духи» OR «карандаш».
В качестве операндов в запросах могут использоваться литералы, константы, идентификаторы (ссылки).
Литералами являются конкретные значения, воспринимаемые системой так, как они записаны. Литералом может быть число, дата, строка. Например, 1146, #31.01.02 #, «Липецк».
Константами являются постоянные значения, которые определены в Access. Например, True, False, Null, Да, Нет.
Идентификаторосуществляет ссылку на поле, элемент управления или свойство. Идентификаторами могут быть имена полей, таблиц, форм, и так далее. Они заключаются в квадратные скобки. Ссылка на конкретное значение должна указывать на его местоположение в иерархии объектов в БД. Ссылка на поле в таблице имеет вид !. Например, !.
Условие отбора целесообразно формировать с помощью построителя выражений. Для этого следует открыть окно Построитель выражений,щёлкнув кнопку Построитьна панели инструментов или выбрав команду Построитьв контекстном меню. Предварительно необходимо установить курсор мыши в ячейке ввода условия.
Условие точного несовпадения значений одного из полей. Если в таблице надо найти записи, значения полей которых не удовлетворяют определенному условию, то используется оператор Not. Оператор Not или вводится перед сравниваемым значением. Пример. Отобрать все записи таблицы TYPE, за исключением записей «карандаш» в поле Товар. Для этого в бланке запроса в столбце поля Товар в строке Условие отбора вводится Not » карандаш».
Условие неточного совпадения. Выбор записей по условию неточного
совпадения значений можно осуществить, используя оператор Like. Этот оператор позволяет найти требуемые записи, зная лишь приблизительное написание текстовой величины. В операторе Like можно использовать шаблоны с подстановочными символами, что расширяет возможности поиска записей при неточном задании условий. Пример условия отбора: Like “*”. Здесь — (минус) соответствует любому символу из диапазона. Диапазон необходимо указывать по возрастанию (д-к, но не к-д).
Выбор записей по диапазону значений. Для задания диапазона значений в окне конструктора запросов используются операторы >, 100.00 AND < 500.00; Between # 01.01.97 # AND #31.03.97#; Like “*”. Напомним, что символ # применяется для данных типа «дата/время».
Пример 1. Запрос с точным несовпадением в одном поле и с условием сравнения в другом поле. Запрос на выборку из таблицы TYPE всех не красных товаров, цена которых более 5, представлен на рис. 3.11 (запрос создан в режиме Конструктора).
Результат выполнения этого запроса показан на рис. 3.12.
Пример 2. Запрос на частичное совпадение. Запрос на выборку из таблицы TYPE товаров, название которых состоит из 4-х букв и заканчивается на «хи». Результат выполнения запроса показан на рис. 3.14.
Рис. 3.11. Запрос на выборку товаров не красного цвета стоимостью более 5
Рис. 3.12. Результат выполнения запроса, сформированного на рис. 3.11
Рис. 3.13. Запрос на выборку товаров, название которых состоит из 4-х букв и заканчивается на «хи»
Рис. 3.14. Результат выполнения запроса, сформированного на рис. 3.13
Дата добавления: 2015-08-20; просмотров: 2641;
ПОСМОТРЕТЬ ЕЩЕ:
Лабораторная работа № 3
Цель работы: создание фильтров, условных запросов и запросов на выборку на основе учебной базы «Библиотека».
Краткие теоретические сведения
При работе с базами данных постоянно требуется организовывать просмотр, сортировку, фильтрацию, выборку данных и вычисление значений как в пределах одной таблицы, так и по всей базе данных. Например, нам нужно просмотреть все заказы, сделанные какой-либо фирмой, либо все заказы, сделанные за определенный месяц и т. п. В Microsoft Access поставленные задачи можно решать при помощи фильтров либо при помощи запросов.
Фильтры. Фильтры обычно используются при работе с одной таблицей. Они находят широкое применение при проектировании и эксплуатации баз данных в Microsoft Access. Преимуществом перед запросами является их простота. Кроме того, фильтры не занимают лишнего места на диске, в отличие от запросов. Для фильтрации данных в таблицах можно воспользоваться следующими способами:
Поиск данных. Чтобы выполнить простой поиск по одному полю, сначала выделите его (поместив курсор на заголовок поля, при этом записи в поле изменят цвет на инверсный). Затем в меню при помощи команд «Правка ® Найти» перейдите к диалоговому окну «Поиск в поле». В поле ввода «Образец» укажите значение, которое Access должен найти. В образе поиска можно использовать подстановочные символы. Символ * (звездочка) заменяет строку любой длины, а? (знак вопроса) – любой произвольный символ. Например, «*AB??DE*» совпадает с «ABERDEEN» и «TAB IDEA», но не с «LAB DEPARTMENT».
Фильтр по выделенному. Предположим, вам нужно в базе данных «Библиотека» выбрать все записи таблицы «Издательства», в которых в качестве города указан город Москва. Найдите одну запись, в которой указан город Москва, щелкните правой кнопкой мыши по этому полю и выберите «Фильтр по выделенному» либо через меню «Запись ® Фильтр ® Фильтр по выделенному». В результате будут отображены все записи, у которых поле «Город» имеет значение «Москва». Опция «Исключить выделенное» – наоборот, оставляет на экране поля, значения которых не совпадают с выделенной записью.
Чтобы отфильтровать записи по значениям в различных полях, используют опцию (пиктограмму) «Изменить фильтр», которая позволяет сформировать строку с необходимыми значениями с помощью простейших алгебраических и логических операторов. Просмотреть результат работы такого фильтра можно после нажатия на пиктограмму «Применить фильтр».
Запросы. При выполнении запроса происходит составление набора записей, содержащего отобранные данные. В большинстве случаев с набором записей можно работать как с обычной таблицей: вы можете просматривать и выбирать информацию, печатать и даже обновлять данные. Однако в отличие от реальной таблицы набор записей физически не существует в базе данных. Access создает его из данных таблиц только во время выполнения запроса.
Одно из преимуществ запросов состоит в том, что они позволяют достаточно быстро отобрать необходимые данные из нескольких связанных таблиц. Но запросы полезны и при работе с одной таблицей. Все приемы, используемые при работе с единственной таблицей, годятся и для сложных многотабличных запросов.
Существует немало различных видов запросов, но самые простые из них и к тому же используемые наиболее часто – это запросы на выборку. С них и принято начинать знакомство с созданием запросов. Цель запроса на выборку состоит в создании результирующей таблицы, в которой отображаются только нужные по условию запроса данные из базовых таблиц. Как и другие объекты Access, запросы можно создавать автоматически с помощью Мастера или вручную в режиме Конструктора.
Для создания запросов к базам данных существует специальный язык запросов. Он называется SQL (Structured Query Language – структурированный язык запросов). Но Access использует более простое средство, которое называется бланком запроса по образцу. С его помощью можно сформировать запрос простыми приемами, перетаскивая элементы запроса между окнами.
Рассмотрим выбор данных из одной таблицы на примере учебной базы данных «Библиотека». В данном примере организуем выборку читателей с фамилией «Бобров». Такой запрос будет называться условным.
Перейдите на вкладку «Запросы» и выберете «Создание запроса в режиме конструктора». Далее вам будет предложен список таблиц. Выберите таблицу «Читатели» и нажмите кнопку «Добавить». Так как мы ограничиваемся только одной таблицей, закройте это диалоговое окно. Приступим к заполнению конструктора запроса.
В строке запроса «Поле» в первом столбце выберите поле «Имя», во втором – «Отчество», в третьем – «Фамилия». Тот же результат будет получен, если последовательно выбирать эти поля в таблице двойным щелчком по нужному полю. В первом столбце, в строке «Условие отбора» введите фамилию: Бобров. Запрос должен иметь следующий вид (рис. 8).
Поле: |
Имя |
Отчество |
Фамилия |
Имя таблицы: |
Читатели |
Читатели |
Читатели |
Сортировка: |
|||
Вывод на экран: |
ü |
ü |
ü |
Условие отбора: |
Бобров |
||
Или: |
Рис. 8. Параметры запроса на выборку
Закройте окно конструктора запроса. Перед закрытием Access запросит имя, под которым следует сохранить запрос. Введите «Бобров». Для того чтобы просмотреть результат работы запроса, наведите на него указатель и нажмите кнопку «Открыть». В результате появится окно (рис. 9).
Имя |
Отчество |
Фамилия |
|
Бобров |
Виктор |
Иванович |
|
S |
Рис. 9. Результат выполнения запроса на выборку
Теперь рассмотрим пример выборки данных из нескольких таблиц. Просмотрим читателей, которые в 1996 г. заказали «Сборник задач» М. И Сканави. При этом пусть нам требуется вывести только название книги и фамилию читателя.
Для начала по вышеописанной процедуре откройте окно конструктора нового запроса и добавьте таблицы «Читатели», «Книги», «Выдача книг».
Переходим к заполнению параметров запроса. Так как нам следует организовать выборку по фамилиям читателей, названию книги и дате заказа, вводим соответствующие поля в бланк запроса. Далее вводим условие отбора для поля «Название книги» – «Сборник задач», а в условии отбора в поле «Дата заказа» – «Between 1.01.96 and 31.12.96». В данном случае мы используем оператор «Between … and», который организует выборку данных в указанном промежутке значений. Существует множество операторов для задания условия отбора, с которыми вы можете ознакомиться, используя справочную систему Access.
Строка «Вывод на экран» в бланке запроса предназначена для скрытия отображения поля в режиме просмотра запроса. Например, скроем поле «Дата заказа» в рассматриваемом примере, так как оно необходимо только для задания условия отбора. Бланк запроса должен иметь следующий вид (рис. 10).
Поле: |
Имя |
Название |
Дата заказа |
Имя таблицы: |
Читатели |
Книги |
Выдача книг |
Сортировка: |
|||
Вывод на экран: |
ü |
ü |
|
Условие отбора: |
Сборник задач |
Between 1.01.96 and 31.12.96 |
|
Или: |
Рис. 10. Многотабличный запрос на выборку
Сохраните запрос под именем «Сборник задач в 1996 году» и запустите его. В результате появится результат в следующем виде (рис. 11).
Имя |
Название |
|
Федосенко |
Сборник задач |
|
Захаров |
Сборник задач |
|
S |
Рис. 11. Результат многотабличного запроса на выборку
Вычисления в запросах. Поле, содержимое которого является результатом расчета по содержимому других полей, называется вычисляемым полем. Прежде чем мы научимся создавать и использовать вычисляемые поля, следует обратить внимание на то, что вычисляемое поле существует только в результирующей таблице запроса. В исходных (базовых) таблицах такое поле не создается, и при работе обычного запроса таблицы не изменяются.
Для создания запроса, производящего вычисления, служит тот же самый бланк запроса по образцу. Разница только в том, что в одном из столбцов вместо имени поля записывают формулу. В формулу входят заключенные в квадратные скобки названия полей, участвующих в расчете, а также знаки математических операций, например: сумма продажи: * .
В узкий столбец непросто записать длинную формулу, но если нажать комбинацию клавиш SHIFT+F2, то открывается вспомогательное диалоговое окно, которое называется «Область ввода». В нем можно ввести сколь угодно длинную формулу, а потом щелчком по кнопке «ОК» перенести ее в бланк запроса по образцу.
Если включить отображение вычисляемого поля, результаты расчетов будут выдаваться в результирующей таблице.
Ничто не мешает сделать вычисляемое поле полем сортировки, чтобы не только получать новые результаты, но и анализировать их.
Для построения условий отбора могут применяться элементарные математические функции (=, , =, ), логические функции сцепки and (и) or (или), функция Like «текст» для выбора по значению текстового поля, функция выбора по списку In (список значений через запятые).
Приведем примеры использования некоторых операторов:
Москва or Минск – издательства Москвы или Минска.
Not Москва – все кроме Москвы.
Like «С*» – все текстовые записи, которые начинаются с буквы «С».
1100 – все кроме указанного значения.
>#01/03/98# – начиная с указанной даты.
Для выборки данных, связанных с определенной датой, можно воспользоваться встроенными функциями обработки даты Microsoft Access. Это функции Date, Day, Month, Year, DatePart. Рассмотрим каждую из них.
Date () – возвращает текущую дату. Обычно используют, если требуется связать запрос с текущей датой, месяцем, годом и т. п.
Day (), Month (), Year () – для указанной даты возвращают целочисленное значение дня, месяца и года.
DatePart (интервал; ) – возвращает для указанной даты или времени целочисленное значение, заданное параметром «интервал». Этот параметр – строковая переменная. Допустимые значения: yyyy – год, Q – квартал, m – месяц, Y – день года, D – день месяца, w – день недели, ww – неделя, h – часы, n – минуты, s – секунды.
Пример: DatePart («Q», Date ()) – при этом будет выведен номер квартала для текущей даты.
Используя вышеприведенные функции, предыдущий запрос можно привести к следующему виду (рис. 12).
Поле: |
Имя |
Название |
Выражение1: Year (Дата заказа) |
Имя таблицы: |
Читатели |
Книги |
Выдача книг |
Сортировка: |
|||
Вывод на экран: |
ü |
ü |
|
Условие отбора: |
Сборник задач |
||
Или: |
Рис. 12. Создание выражений в полях запроса
Задание к лабораторной работе
1. Ознакомиться на практике с методами использования фильтров в СУБД Microsoft Access. Продемонстрировать выборку по трем начальным буквам фамилии, по двум полям одновременно.
2. При выполнении следующих заданий ознакомиться на практике с методикой создания условных запросов и запросов на выборку:
Запрос должен выводить только Ф. И.О. читателей в алфавитном порядке и их домашние телефоны.
Запрос должен осуществлять выбор книг издательства «Мир» в алфавитном порядке.
Запрос должен осуществлять поиск книг по заданному сочетанию букв «упр» в теме.
Запрос должен выводить в одном поле Ф. И.О. читателей, заказавших книги в 2002 г.
Чтобы вывести Ф. И.О. в одном поле, создадим выражение в поле запроса по формуле: &» «&&» «&. После нажатия на «Ввод», если нет ошибки, Access перед формулой добавит фразу «Выражение1:». Во второй строке этой колонки необходимо выбрать таблицу «Читатели» и установить отображение на экран.
3. Создать и сохранить запросы с использованием встроенных функций обработки даты в поле «Дата заказа», которые позволят произвести следующие выборки из нескольких таблиц:
· Информация о заказах на книги за последние 30 дней.
· Все книги, заказанные после 15 числа любого месяца.
· Читатели, сделавшие заказы на книги в 1998 году.
· Читатели, сделавшие заказы на книги в январе 1997 года.
· Читатели, сделавшие заказы на книги в текущем месяце текущего года.
· Читатели, сделавшие заказы на книги в первом квартале 1997 г.
3. Выполнить запрос на выборку в индивидуальном задании. Самостоятельно разработать задание и создать запрос с применением встроенных функций обработки данных в поле с типом дата/время для своей базы данных.
В SQL используется множество условий отбора, позволяющих эффективно и естественно создавать различные типы запросов. Ниже рассматриваются пять основных условий отбора (в стандарте ANSI/ISO они называются предикатами):
- Сравнение. Значение одного выражения сравнивается со значением другого выражения. Например, такое условие отбора используется для выбора всех офисов, находящихся в восточном регионе, или всех служащих, фактические объемы продаж которых превышают плановые.
- Проверка на принадлежность диапазону. Проверяется, попадает ли указанное значение в определенный диапазон значений. Например, такое условие отбора используется для нахождения служащих, фактические объемы продаж которых превышают
$100000
, но меньше$500000
. - Проверка наличия во множестве. Проверяется, совпадает ли значение выражения с одним из значений из заданного множества. Например, такое условие отбора используется для выбора офисов, расположенных в Нью- Йорке, Чикаго или Лос-Анджелесе.
- Проверка на соответствие шаблону. Проверяется, соответствует ли строковое значение, содержащееся в столбце, определенному шаблону. Например, такое условие отбора используется для выбора клиентов, имена которых начинаются с буквы «
Е
«. - Проверка на равенство значению NULL. Проверяется, содержится ли в столбце значение
NULL
. Например, такое условие отбора используется для нахождения всех служащих, которым еще не был назначен менеджер.
Предыдущие статьи:
- Простейщие запросы SQL: оператор SELECT
- Вычисления в SQL запросах Select
- Выборка всех данных из таблицы
- SELECT DISTINCT — выборка уникальных значений
- WHERE: отбор по условию в операторе SELECT
Сравнение (=, о, <, <=, >, >=)
Наиболее распространенным условием отбора в SQL является сравнение. При сравнении SQL вычисляет и сравнивает значения двух SQL-выражений для каждой строки данных. Выражения могут быть как очень простыми, например содержать одно имя столбца или константу, так и более сложными, например содержать арифметические операции. В SQL имеется шесть различных способов сравнения двух выражений, показанных на рис. 6.
Рис. 6. Синтаксическая диаграмма сравнения
Ниже приведены типичные примеры сравнения.
Найти имена всех служащих, принятых на работу до 2006 года.
SELECT NAME
FROM SALESREPS
WHERE HIRE_DATE < '2006-01-01';
NAME
------------
Sue Smith
Bob Smith
Dan Roberts
Paul Cruz
Заметим, что не все SQL-продукты обрабатывают даты одинаково, поскольку разные производители были вынуждены поддерживать даты еще до того, как был создан стандарт SQL. Формат YYYY-MM-DD
, показанный в предыдущем примере, работает в большинстве продуктов, но кое-где его следует изменить. В Oracle, например, вам надо либо заменить формат даты на принятый в Oracle по умолчанию ('01-JAN-88'
), либо изменить формат по умолчанию для вашей сессии при помощи следующей команды:
ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD';
Вывести список офисов, фактические объемы продаж в которых составили менее 80 процентов от плановых.
SELECT CITY, SALES, TARGET
FROM OFFICES
WHERE SALES < (.8 * TARGET);
CITY SALES TARGET
------- ------------ ------------
Denver $186,042.00 $300,000.00
Вывести список офисов, менеджером которых не является служащий с идентификатором 108.
SELECT CITY, MGR
FROM OFFICES
WHERE MGR <> 108;
CITY MGR
--------- ----
New York 106
Chicago 104
Atlanta 105
Как показано на рис. 6, в соответствии со спецификацией ANSI/ISO проверка на неравенство записывается как А <> B
. В ряде реализаций SQL используются альтернативные системы записи, как, например, А != B
(поддерживается в SQL Server, DB2, Oracle и MySQL). Иногда такая форма записи является одной из допустимых, а иногда — единственной.
Когда СУБД сравнивает значения двух выражений, могут быть получены три результата:
- если сравнение истинно, то результат проверки имеет значение
TRUE
; - если сравнение ложно, то результат проверки имеет значение
FALSE
; - если хотя бы одно из двух выражений имеет значение
NULL
, то результатом сравнения будетNULL
.
Выборка одной строки
Чаще всего используется сравнение, в котором определяется, равно ли значение столбца некоторой константе. Если этот столбец представляет собой первичный ключ, то запрос возвращает всего одну строку, как в следующем примере.
Узнать имя и лимит кредита клиента с идентификатором 2107.
SELECT COMPANY, CREDIT_LIMIT
FROM CUSTOMERS
WHERE CUST_NUM = 2107;
COMPANY CREDIT_LIMIT
------------------ -------------
Ace International $35,000.00
Этот тип запросов лежит в основе выборки из баз данных на основе форм вебстраниц. Пользователь вводит в форму идентификатор клиента, и программа использует его при создании и выполнении запроса. После этого она отображает извлеченные данные в форме. Обратите внимание на то, что инструкции SQL, предназначенные для выбора конкретного клиента по идентификатору, как в предыдущем примере, и для выбора всех клиентов, удовлетворяющих определенным параметрам (например, с лимитом кредита более $25000), имеют абсолютно одинаковый формат.
Значения NULL
Использование значений NULL
в запросах может привести к »очевидным» предположениям, которые истинны только на первый взгляд, но на самом деле таковыми не являются. Например, можно предположить, что каждая строка из таблицы SALESREPS
будет содержаться в результатах только одного из двух следующих запросов.
Вывести список служащих, превысивших плановый объем продаж.
SELECT NAME
FROM SALESREPS
WHERE SALES > QUOTA;
NAME
------------
Bill Adams
Mary Jones
Sue Smith
Sam Clark
Dan Roberts
Larry Fitch
Paul Cruz
Вывести список служащих, не выполнивших план.
SELECT NAME
FROM SALESREPS
WHERE SALES <= QUOTA;
NAME
--------------
Bob Smith
Nancy Angelli
Однако результаты этих запросов состоят из семи и двух строк соответственно, что дает в сумме девять строк, в то время как в таблице находится десять строк. Строка для Тома Снайдера (Tom Snyder) содержит значение NULL
в столбце QUOTA
, поскольку ему еще не был назначен плановый объем продаж. Эта строка не вошла ни в один запрос.
Как показывает приведенный пример, при определении условия отбора необходимо помнить об обработке значений NULL. В трехзначной логике, принятой в SQL, условие отбора может иметь значения TRUE
, FALSE
или NULL
. А в результаты запроса попадают только те игроки, для которых условие отбора равно TRUE
. Мы еще встретимся с NULL
позже в этой статье.
Проверка на принадлежность диапазону (BETWEEN)
Следующей формой условия отбора является проверка на принадлежность диапазону значений (оператор BETWEEN ... AND
), схематически изображенная на рис. 7. При этом проверяется, находится ли элемент данных между двумя заданными значениями. В условие отбора входят три выражения. Первое выражение определяет проверяемое значение; второе и третье выражения определяют нижнюю и верхнюю границы проверяемого диапазона. Типы данных трех выражений должны быть сравнимыми.
Рис. 7. Синтаксическая диаграмма проверки на принадлежность диапазону (between)
Следующий пример иллюстрирует типичную процедуру проверки на принадлежность диапазону.
Найти все заказы, сделанные в последнем квартале 2007 года.
SELECT ORDER_NUM, ORDER_DATE, MFR, PRODUCT, AMOUNT
FROM ORDERS
WHERE ORDER_DATE BETWEEN '2007-10-01' AND '2007-12-31';
ORDER_NUM ORDER_DATE MFR PRODUCT AMOUNT
---------- ----------- ---- -------- -----------
112961 2007-12-17 REI 2A44L $31,500.00
112968 2007-10-12 ACI 41004 $3,978.00
112963 2007-12-17 ACI 41004 $3,276.00
112983 2007-12-27 ACI 41004 $702.00
112979 2007-10-12 ACI 4100Z $15,000.00
112992 2007-11-01 ACI 41002 $760.00
112975 2007-10-12 REI 2A44G $2,100.00
112987 2007-12-31 ACI 4100Y $27,500.00
При проверке на принадлежность диапазону верхняя и нижняя границы считаются частью диапазона, поэтому в результаты запроса вошли заказы, сделанные 1 октября и 31 декабря. Далее приведен другой пример проверки на принадлежность диапазону.
Найти заказы, стоимости которых попадают в различные диапазоны.
SELECT ORDER_NUM, AMOUNT
FROM ORDERS
WHERE AMOUNT BETWEEN 20000.00 AND 29999.99;
ORDER_NUM AMOUNT
---------- -----------
113036 $22,500.00
112987 $27,500.00
113042 $22,500.00
SELECT ORDER_NUM, AMOUNT
FROM ORDERS
WHERE AMOUNT BETWEEN 30000.00 AND 39999.99;
ORDER_NUM AMOUNT
---------- -----------
112961 $31,500.00
113069 $31,350.00
SELECT ORDER_NUM, AMOUNT
FROM ORDERS
WHERE AMOUNT BETWEEN 40000.00 AND 49999.99;
ORDER_NUM AMOUNT
---------- -----------
113045 $45,000.00
Инвертированная версия проверки на принадлежность диапазону (NOT between
) позволяет выбрать значения, которые лежат за пределами диапазона, как в следующем примере.
Вывести список служащих, фактические объемы продаж которых не попадают в диапазон от 80 до 720 процентов плана.
SELECT NAME, SALES, QUOTA
FROM SALESREPS
WHERE SALES NOT BETWEEN (.8 * QUOTA) AND (1.2 * QUOTA);
NAME SALES QUOTA
-------------- ------------ ------------
Mary Jones $392,725.00 $300,000.00
Sue Smith $474,050.00 $350,000.00
Bob Smith $142,594.00 $200,000.00
Nancy Angelli $186,042.00 $300,000.00
Проверяемое выражение, задаваемое в операторе BETWEEN
, может быть любым допустимым выражением SQL, однако на практике оно обычно представляет собой имя столбца.
В стандарте ANSI/ISO определены относительно сложные правила обработки значений NULL
в проверке BETWEEN
.
- Если проверяемое выражение имеет значение
NULL
либо оба выражения, определяющие диапазон, равныNULL
, то проверкаBETWEEN
возвращаетNULL
. - Если выражение, определяющее нижнюю границу диапазона, имеет значение
NULL
, то проверка between возвращает false, когда проверяемое значение больше верхней границы диапазона, иNULL
— в противном случае. - Если выражение, определяющее верхнюю границу диапазона, имеет значение
NULL
, то проверка between возвращает false, когда проверяемое значение меньше нижней границы диапазона, иNULL
— в противном случае.
Однако прежде чем полагаться на эти правила, неплохо было бы поэкспериментировать со своей СУБД.
Необходимо отметить, что проверка на принадлежность диапазону не расширяет возможности SQL, поскольку ее можно выразить в виде двух сравнений. Проверка
A BETWEEN В AND С
полностью эквивалентна сравнению
(А > = В) AND (А <= С)
Тем не менее проверка BETWEEN
является более простым способом выразить условие отбора в терминах диапазона значений.
Проверка наличия во множестве (IN)
Еще одним распространенным условием отбора является проверка на наличие во множестве (in), схематически изображенная на рис. 8. В этом случае выполняется проверка, соответствует ли значение какому-либо элементу заданного списка. Ниже приведен ряд запросов с использованием проверки наличия во множестве.
Рис. 8. Синтаксическая диаграмма проверки наличия во множестве (IN)
Вывести список служащих, которые работают в Нью-Йорке, Атланте или Денвере.
SELECT NAME, QUOTA, SALES
FROM SALESREPS
WHERE REP_OFFICE IN (11, 13, 22);
NAME QUOTA SALES
-------------- ------------ ------------
Bill Adams $350,000.00 $367,911.00
Mary Jones $300,000.00 $392,725.00
Sam Clark $275,000.00 $299,912.00
Nancy Angelli $300,000.00 $186,042.00
Найти все заказы, сделанные в пятницы в январе 2008 года.
SELECT ORDER_NUM, ORDER_DATE, AMOUNT
FROM ORDERS
WHERE ORDER_DATE IN ('2008-01-04', '2008-01-11',
'2008-01-18', '2008-01-25');
ORDER_NUM ORDER_DATE AMOUNT
---------- ----------- ----------
113012 2008-01-11 $3,745.00
113003 2008-02-25 $5,625.00
Найти все заказы, полученные четырьмя конкретными служащими.
SELECT ORDER_NUM, REP, AMOUNT
FROM ORDERS
WHERE REP IN (107, 109, 101, 103);
ORDER_NUM REP AMOUNT
---------- ---- -----------
112968 101 $3,978.00
113058 109 $1,480.00
112997 107 $652.00
113062 107 $2,430.00
113069 107 $31,350.00
112975 103 $2,100.00
113055 101 $150.00
113003 109 $5,625.00
113057 103 $600.00
113042 101 $22,500.00
С помощью проверки NOT IN
можно проверить, что элемент данных не является членом заданного множества. Проверяемое выражение в операторе IN
может быть любым допустимым SQL-выражением, однако обычно оно представляет собой короткое имя столбца, как в предыдущих примерах. Если результатом проверяемого выражения является значение null, то проверка in также возвращает NULL
. Все элементы в списке заданных значений должны иметь один и тот же тип данных, который должен быть сравним с типом данных проверяемого выражения.
Как и проверка BETWEEN
, проверка IN
не добавляет в возможности SQL ничего нового, поскольку условие
X IN (А, В, С)
полностью эквивалентно условию
(X = A) OR (X = В) OR (X = С)
Однако проверка IN
предлагает гораздо более эффективный способ выражения условия отбора, особенно если множество содержит большое число элементов.
В стандарте ANSI/ISO не определено максимальное количество элементов множества, и в большинстве СУБД явный верхний предел не задан. По соображениям переносимости, лучше избегать множеств, содержащих один элемент.
CITY IN ('New York')
Их следует заменять простым сравнением:
CITY = 'New York'
Проверка на соответствие шаблону (LIKE)
Для выборки строк, в которых содержимое некоторого текстового столбца совпадает с заданным текстом, можно использовать простое сравнение. Например, следующий запрос извлекает строку из таблицы CUSTOMERS
по имени.
Показать лимит кредита для Smithson Corp.
SELECT COMPANY, CREDIT_LIMIT
FROM CUSTOMERS
WHERE COMPANY = 'Smithson Corp.';
Однако очень легко можно забыть, какое именно название носит интересующая нас компания: «Smith», «Smithson» или «Smithsonian». Проверка на соответствие шаблону позволяет выбрать из базы данных строки на основе частичного соответствия имени клиента.
Проверка на соответствие шаблону (оператор LIKE
), схематически изображенная на рис. 9, позволяет определить, соответствует ли значение данных в столбце некоторому шаблону. Шаблон представляет собой строку, в которую может входить один или несколько подстановочных символов. Эти символы интерпретируются особым образом.
Рис. 9. Синтаксическая диаграмма проверки на соответствие шаблону (LIKE)
Подстановочные знаки
Подстановочный знак %
совпадает с любой последовательностью из нуля или более символов. Ниже приведена измененная версия предыдущего запроса, в которой используется шаблон, содержащий знак процента.
SELECT COMPANY, CREDIT_LIMIT
FROM CUSTOMERS
WHERE COMPANY LIKE 'Smith% Corp.';
Оператор like
указывает SQL, что необходимо сравнивать содержимое столбца NAME
с шаблоном «Smith% Corp.». Этому шаблону соответствуют все перечисленные ниже имена.
Smith Corp.
Smithsen Corp.
Smithson Corp.
Smithsonian Corp.
А вот эти имена данному шаблону не соответствуют.
SmithCorp
Smithson Inc.
Подстановочный знак _
(символ подчеркивания) совпадает с любым отдельным символом. Например, если вы уверены, что название компании либо «Smithson», либо «Smithsen», то можете воспользоваться следующим запросом.
SELECT COMPANY, CREDIT_LIMIT
FROM CUSTOMERS
WHERE COMPANY LIKE 'Smiths_n Corp.';
В таком случае шаблону будет соответствовать любое из представленных ниже имен.
Smithson Corp.
Smithsen Corp.
Smithsun Corp.
А вот ни одно из следующих ему соответствовать не будет.
Smithsoon Corp.
Smithsn Corp.
Подстановочные знаки можно помещать в любое место строки шаблона, и в одной строке может содержаться несколько подстановочных знаков. Следующий запрос допускает как написание «Smithson» и «Smithsen», так и любое другое окончание названия компании, включая «Corp.», «Inc.» или какое-то другое.
SELECT COMPANY, CREDIT_LIMIT
FROM CUSTOMERS
WHERE COMPANY LIKE 'Smiths_n %';
С помощью формы NOT LIKE
можно находить строки, которые не соответствуют шаблону. Проверку LIKE
можно применять только к столбцам, имеющим строковый тип данных. Если в столбце содержится значение NULL
, то результатом проверки like
будет null
.
Вероятно, вы уже встречались с проверкой на соответствие шаблону в операционных системах, имеющих интерфейс командной строки (таких, как Unix). Обычно в этих системах звездочка (*
) используется для тех же целей, что и символ процента (%
) в SQL, а вопросительный знак (?
) соответствует символу подчеркивания (_
) в SQL, но в целом возможности работы с шаблонами строк в них такие же.
Управляющие символы *
При проверке строк на соответствие шаблону может оказаться, что подстановочные знаки входят в строку символов в качестве литералов. Например, нельзя проверить, содержится ли знак процента в строке, просто включив его в шаблон, поскольку SQL будет считать этот знак подстановочным. Как правило, это не вызывает серьезных проблем, поскольку подстановочные знаки довольно редко встречаются в именах, названиях товаров и других текстовых данных, которые обычно хранятся в базе данных.
В стандарте ANSI/ISO определен способ проверки наличия в строке литералов, использующихся в качестве подстановочных знаков. Для этого применяются управляющие символы. Когда в шаблоне встречается такой символ, то символ, следующий непосредственно за ним, считается не подстановочным знаком, а литералом. Непосредственно за управляющим символом может следовать либо один из двух подстановочных символов, либо сам управляющий символ, поскольку он также приобретает в шаблоне особое значение.
Символ пропуска определяется в виде строки, состоящей из одного символа, и предложения ESCAPE
(рис. 9). Ниже приведен пример использования знака доллара ($
) в качестве управляющего символа.
Найти товары, коды которых начинаются с четырех букв «A%ВС».
SELECT ORDER_NUM, PRODUCT
FROM ORDERS
WHERE PRODUCT LIKE 'A$%BC%' ESCAPE '$';
Первый символ процента в шаблоне, следующий за управляющим символом, считается литералом, второй — подстановочным символом.
Управляющие символы — распространенная практика в приложениях проверки на соответствие шаблону; именно поэтому они были включены и в стандарт ANSI/ISO. Однако они не входили в ранние реализации SQL и поэтому не очень распространены. Для обеспечения переносимости приложений следует избегать использования предложения ESCAPE
.
Проверка на равенство NULL (IS NULL)
Значения NULL
обеспечивают возможность трехзначной логики в условиях отбора. Для любой заданной строки результат применения условия отбора может быть TRUE
, FALSE
или NULL
(в случае, когда в одном из столбцов содержится значение null
). Иногда необходимо явно проверять значения столбцов на равенство NULL
и непосредственно обрабатывать их. Для этого в SQL имеется специальная проверка IS NULL
, синтаксическая диаграмма которой изображена на рис. 10.
Рис. 10. Синтаксическая диаграмма проверки на равенство null (is null)
В следующем запросе проверка на равенство NULL используется для нахождения в учебной базе данных служащего, который еще не был закреплен за офисом.
Найти служащего, который еще не закреплен за офисом.
SELECT NAME
FROM SALESREPS
WHERE REP_OFFICE IS NULL;
NAME
-----------
Tom Snyder
Инвертированная форма проверки на равенство NULL
(IS NOT NULL
) позволяет отыскать строки, которые не содержат значений null
.
Вывести список служащих, которые уже закреплены за офисами.
SELECT NAME
FROM SALESREPS
WHERE REP_OFFICE IS NOT NULL;
NAME
--------------
Bill Adams
Mary Jones
Sue Smith
Sam Clark
Bob Smith
Dan Roberts
Larry Fitch
Paul Cruz
Nancy Angelli
В отличие от условий отбора, описанных выше, проверка на равенство NULL
не может возвратить значение NULL
в качестве результата. Она всегда возвращает TRUE
ИЛИ FALSE
.
Может показаться странным, что нельзя проверить значение на равенство NULL
с помощью операции сравнения, например:
SELECT NAME
FROM SALESREPS
WHERE REP_OFFICE = NULL;
Ключевое слово NULL
здесь нельзя использовать, поскольку на самом деле это не настоящее значение; это просто свидетельство того, что значение неизвестно. Даже если бы сравнение
REP_OFFICE = NULL
было возможно, правила обработки значений NULL
в сравнениях привели бы к тому, что оно вело бы себя не так, как ожидается. Если бы СУБД обнаружила строку, в которой столбец REP_OFFICE
содержит значение null, выполнилась бы следующая проверка.
NULL = NULL
Что будет результатом этого сравнения: TRUE
или FALSE
? Так как значения по обе стороны знака равенства неизвестны, то, в соответствии с правилами логики SQL, условие отбора должно вернуть значение NULL
. Поскольку условие отбора возвращает результат, отличный от true
, строка исключается из таблицы результатов запроса — это противоположно тому, к чему вы стремились! Из-за правил обработки значений null в SQL необходимо использовать проверку IS NULL
.
Составные условия отбора (AND, OR и NOT)
Простые условия отбора, описанные в предыдущих разделах, после применения к некоторой строке возвращают значения TRUE
, FALSE
или NULL
. С помощью правил логики эти простые условия можно объединять в более сложные, как изображено на рис. 11. Обратите внимание на то, что условия отбора, объединяемые с помощью операторов AND
, OR
и NOT
, сами могут быть составными.
Рис. 11. Синтаксическая диаграмма предложения WHERE
Оператор OR используется для объединения двух условий отбора, из которых или одно, или другое (или оба) должно быть истинным.
Найти служащих, у которых фактический объем продаж меньше планового или меньше $300000.
SELECT NAME, QUOTA, SALES
FROM SALESREPS
WHERE SALES < QUOTA
OR SALES < 300000.00;
NAME QUOTA SALES
-------------- ------------ ------------
Sam Clark $275,000.00 $299,912.00
Bob Smith $200,000.00 $142,594.00
Tom Snyder NULL $75,985.00
Paul Cruz $275,000.00 $286,775.00
Nancy Angelli $300,000.00 $186,042.00
Для объединения двух условий отбора, оба из которых должны быть истинными, следует использовать оператор AND
.
Найти служащих, у которых фактический объем продаж меньше планового и меньше $300000.
SELECT NAME, QUOTA, SALES
FROM SALESREPS
WHERE SALES < QUOTA
AND SALES < 300000.00;
NAME QUOTA SALES
-------------- ------------ ------------
Bob Smith $200,000.00 $142,594.00
Nancy Angelli $300,000.00 $186,042.00
И наконец, можно использовать оператор NOT, чтобы выбрать строки, для которых условие отбора ложно.
Найти служащих, у которых фактический объем продаж меньше планового, но не меньше $150000.
SELECT NAME, QUOTA, SALES
FROM SALESREPS
WHERE SALES < QUOTA
AND NOT SALES < 150000.00;
NAME QUOTA SALES
-------------- ------------ ------------
Nancy Angelli $300,000.00 $186,042.00
С помощью логических операторов AND
, OR
, NOT
и круглых скобок можно создавать очень сложные условия отбора, как в следующем примере.
Найти всех служащих, которые: (а) работают в Денвере, Нью-Йорке или Чикаго; или (б) не имеют менеджера и были приняты на работу после июня 2006 года; или (в) у которых продажи превысили плановый объем, но не превысили $600000.
SELECT NAME
FROM SALESREPS
WHERE (REP_OFFICE IN (22, 11, 12))
OR (MANAGER IS NULL AND HIRE_DATE >= '2006-06-01')
OR (SALES > QUOTA AND NOT SALES > 600000.00);
Лично для меня остается загадкой, зачем может понадобиться такой список имен, однако приведенный пример является иллюстрацией довольно сложного запроса.
Как и в случае с простыми условиями отбора, значения NULL
влияют на интерпретацию составных условий отбора, вследствие чего результаты последних становятся не столь очевидными. В частности, результатом операции NULL OR TRUE
является значение TRUE
, а не NULL
, как можно было ожидать. Табл. 1-3 являются таблицами истинности для операторов AND
, OR
и NOT
соответственно в случае тернарной логики (со значениями NULL
).
Таблица 1. Таблица истинности оператора and
AND |
TRUE |
FALSE |
NULL |
TRUE |
TRUE |
FALSE |
NULL |
FALSE |
FALSE |
FALSE |
FALSE |
NULL |
NULL |
FALSE |
NULL |
Таблица 2. Таблица истинности оператора OR
OR |
TRUE |
FALSE |
NULL |
TRUE |
TRUE |
TRUE |
TRUE |
FALSE |
TRUE |
FALSE |
NULL |
NULL |
TRUE |
NULL |
NULL |
Таблица 3. Таблица истинности оператора NOT
NOT |
TRUE |
FALSE |
NULL |
FALSE |
TRUE |
NULL |
В соответствии со стандартом ANSI/ISO, если с помощью операторов AND
, OR
и NOT
объединяется более двух условий отбора, то оператор NOT
имеет наивысший приоритет, за ним следует AND
и только потом OR
. Однако чтобы гарантировать переносимость, всегда следует использовать круглые скобки; это позволит устранить все возможные неоднозначности.
В стандарте SQL2 (известном также как SQL-92 и SQL: 1992) появилось еще одно логическое условие отбора — проверка IS
. На рис. 12 изображена синтаксическая диаграмма этой проверки. Оператор IS
проверяет значение результата логического выражения.
Рис. 12. Синтаксическая диаграмма оператора IS
Например, проверку
((SALES - QUOTA) > 10000.00) IS UNKNOWN
можно использовать, чтобы отыскать строки, в которых нельзя выполнить сравнение из-за того, что либо столбец SALES
, либо столбец QUOTA
имеет значение NULL
. Подобным образом проверка
((SALES - QUOTA) > 10000.00) IS FALSE
позволяет выбрать строки, в которых значение столбца SALES
если и превышает значение столбца QUOTA
, то незначительно. Как показывает данный пример, на самом деле проверка IS
не привносит в SQL ничего нового, поскольку ее можно легко переписать в следующем виде.
NOT ((SALES - QUOTA) > 10000.00)
Хотя проверка IS внесена в стандарт SQL с 1992 года, ее поддерживает очень небольшое количество SQL-продуктов. Так что для обеспечения максимальной переносимости следует избегать подобных проверок и записывать выражения только с помощью операторов AND
, OR
и NOT
. Однако избежать проверки IS UNKNOWN
удается не всегда.
Вас заинтересует / Intresting for you:
Условия позволяют указать какие строки таблицы нужно вывести в результате выполнения запроса. Задаются они после указания необходимых столбцов и таблиц командой WHERE.
Условие на выборку добавляется при составлении большинства запросов. Они позволяют отсеять не нужные строки, путем указания тех или иных параметров отбора. В результате можно из больших таблиц быстро выбрать необходимые строки. Именно это и была основная задумка при создании языка запросов для БД.
Таблицу для примеров используем ту же, что и в предыдущей главе:
num (номер товара) |
title (название) |
price (цена) |
1 | Чайник | 300 |
2 | Чашка | 100 |
3 | Ложка | 25 |
4 | Тарелка | 100 |
Пример. Чтобы выбрать товыры стоимостью 100 рублей, нужно задать условие:
SELECT * FROM goods WHERE price = 100
Здесь, раздел SELECT и FROM указывают, какие столбцы из каких таблиц выводить.
WHERE – команда указывающая, что задается условие выбора.
price = 100 – критерий выбора строк.
Такой запрос отбросит все строки, не удовлетворяющие условию. В результате будет получен следующий набор данных:
Оператор | Значение |
= | равенство |
> | больше |
< | меньше |
!= | не равно |
>= | больше либо равно |
<= | меньше либо равно |
Есть еще другие операции для построения условий. Но об этом позже.
Стоит так же отметить возможность задавать несколько условий. Например, нужно выбрать все товары с номером больше 2 и ценой меньше 100:
SELECT * FROM goods WHERE num > 2 AND price < 100
Здесь, команда AND – это логический оператор И, который указывает что должны быть выбраны строки, где верно первое условие И так же верно второе условие. Под эти условия попадает только одна строка из таблицы.
num | title | price |
3 | Ложка | 25 |
Кроме, логического оператора И (AND), существуют еще ИЛИ (OR) и НЕ (NOT). OR указывает, что должно быть верно или первое условие или второе.
SELECT * FROM goods WHERE num > 2 OR price > 100
Под такие условия попадает следующие строки:
num | title | price |
1 | Чайник | 300 |
3 | Ложка | 25 |
4 | Тарелка | 100 |
Товар под номером 1 удовлетворяет условию price > 100, товары номер 3 и 4 — условию num > 2. В таком случае, если хотя бы одно из условий верно, строка таблицы будет включена в результат запроса.
Оператор NOT добавляет отрицание в условие:
SELECT * FROM goods WHERE NOT num > 2
Такое условие означает, что нужно выбрать строки, где условие не верно.
num | title | price |
1 | Чайник | 300 |
2 | Чашка | 100 |
NOT в отличие от AND и OR, располагается не между двух других условий, а является отрицанием того условия, перед которым он установлен.
Команда WHERE встречается в очень многих задачах, и использовать ее нужно будет постоянно. В других главах можно будет увидеть примеры еще более сложных конструкций с ее применением, а так же иные команды, позволяющие выполнять сложные выборки.
В следующей главе рассматривается сортировка данных в запросах.