Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения:SQL Server
Вы можете создавать запросы, включающие любое количество условий поиска, связанных с любым количеством операторов AND и OR. Запрос с сочетанием предложений AND и OR может стать сложным, поэтому полезно понять, как такой запрос интерпретируется при выполнении и как такой запрос представлен в области критериев и области SQL.
Примечание.
Дополнительные сведения о условиях поиска, содержащих только один оператор AND или OR, см. в разделе "Указание нескольких условий поиска" для одного столбца (визуальные инструменты базы данных) и указание нескольких условий поиска для нескольких столбцов (визуальные инструменты для баз данных).
Ниже приведены сведения о следующем:
Приоритет И И ИЛИ в запросах, содержащих оба.
Как условия в предложениях AND и OR связаны логически друг с другом.
Как конструктор запросов и визуализатор отображает запросы в области критериев, содержащие как "AND", так и "OR".
Чтобы разобраться в приведенном ниже обсуждении, представьте, что вы работаете с таблицей employee
, содержащей столбцы hire_date
, job_lvl
и status
. В примерах предполагается, что необходимо знать информацию, например о том, как долго сотрудник работал с компанией (т. е. дата найма сотрудника), какой тип работы выполняется сотрудником (что такое уровень работы), а также состояние сотрудника (например, выход на пенсию).
Приоритет AND и OR
При выполнении запроса сначала вычисляются предложения, связанные с AND, а затем связанные с OR.
Примечание.
Оператор NOT имеет приоритет над как AND, так и OR.
Например, чтобы найти сотрудников, которые проработали в компании более пяти лет на нижних должностях, или сотрудников со средними должностями, независимо от даты их найма, можно создать условие WHERE, например следующее:
WHERE
hire_date < '01/01/95' AND
job_lvl = 100 OR
job_lvl = 200
Чтобы переопределить приоритет по умолчанию для AND над OR, можно поместить круглые скобки вокруг определенных условий в области SQL. Условия в скобках всегда вычисляются первыми. Например, чтобы найти всех сотрудников, которые были с компанией более пяти лет в более низких или средних рабочих местах, можно создать предложение WHERE, например следующее:
WHERE
hire_date < '01/01/95' AND
(job_lvl = 100 OR job_lvl = 200)
Подсказка
Для ясности рекомендуется всегда включать скобки при объединении предложений AND и OR вместо того, чтобы полагаться на приоритет по умолчанию.
Как "AND" работает с несколькими условиями "OR"
Понимание того, как предложения AND и OR связаны между собой при объединении, поможет вам создавать и понимать сложные запросы в конструкторе запросов и представлений.
При связывании нескольких условий с помощью AND первый набор условий, связанных с AND, применяется ко всем условиям во втором наборе. Другими словами, условие, связанное оператором AND с другим условием, распространяется на все условия во втором наборе. Например, следующее представление схемы показывает условие AND, связанное с набором условий OR:
A AND (B OR C)
Приведенное выше представление логически эквивалентно следующему схемному представлению, в котором показано, как условие AND распространяется на второй набор условий:
(A AND B) OR (A AND C)
Этот принцип распространения влияет на использование конструктора запросов и представлений. Например, представьте, что вы ищете всех сотрудников, которые были с компанией более пяти лет в более низких или средних рабочих местах. Введите следующее предложение WHERE в инструкцию в области SQL:
WHERE (hire_date < '01/01/95' ) AND
(job_lvl = 100 OR job_lvl = 200)
Предложение, связанное с AND, применяется к обоим предложениям, связанным с OR. Явным способом выразить это является повторение условия AND один раз для каждого условия в предложении OR. Следующая инструкция является более явной (и более длинной), чем предыдущая инструкция, но логически эквивалентна ей:
WHERE (hire_date < '01/01/95' ) AND
(job_lvl = 100) OR
(hire_date < '01/01/95' ) AND
(job_lvl = 200)
Принцип распространения предложений AND для связанных предложений OR применяется независимо от количества отдельных условий. Например, предположим, что вы хотите найти более высоких или средних сотрудников, которые были с компанией более пяти лет или уходят на пенсию. Предложение WHERE может выглядеть следующим образом:
WHERE
(job_lvl = 200 OR job_lvl = 300) AND
(hire_date < '01/01/95' ) OR (status = 'R')
После распространения условий, связанных с AND, предложение WHERE будет выглядеть следующим образом:
WHERE
(job_lvl = 200 AND hire_date < '01/01/95' ) OR
(job_lvl = 200 AND status = 'R') OR
(job_lvl = 300 AND hire_date < '01/01/95' ) OR
(job_lvl = 300 AND status = 'R')
Как представлены множественные операторы AND и OR в панели условий
Конструктор запросов и представлений представляет условия поиска в области условий. Однако в некоторых случаях с несколькими предложениями, связанными с И и ИЛИ, представление в области условий может отличаться от того, что вы ожидаете. Кроме того, если вы изменяете запрос в области условий или области диаграммы, вы можете обнаружить, что инструкция SQL была изменена с введенных вами данных.
Как правило, эти правила определяют, как предложения AND и OR отображаются в области условий:
Все условия, связанные с AND, отображаются в столбце сетки фильтра или в одном столбце Or...
Все условия, связанные с OR, отображаются в отдельных столбцах Or.
Если логический результат сочетания предложений AND и OR заключается в том, что И распространяется на несколько предложений OR, область условий представляет это явно путем повторения предложения AND столько раз, сколько необходимо.
Например, в области SQL можно создать условие поиска, например следующее, в котором два предложения, связанные с AND, имеют приоритет над третьей связанной с OR:
WHERE (hire_date < '01/01/95' ) AND
(job_lvl = 100) OR
(status = 'R')
Конструктор запросов и представлений представляет это предложение WHERE в Панель критериев следующим образом:
Однако если связанные предложения OR имеют приоритет над предложением AND, предложение AND повторяется для каждого предложения OR. Это приводит к распространению предложения AND для каждого предложения OR. Например, в области SQL можно создать предложение WHERE, например следующее:
WHERE (hire_date < '01/01/95' ) AND
( (job_lvl = 100) OR
(status = 'R') )
Конструктор запросов и представлений представляет это условие WHERE в панели критериев следующим образом:
Если связанные предложения OR включают только один столбец данных, конструктор запросов и представлений может поместить все предложение OR в одну ячейку сетки, избегая необходимости повторять предложение AND. Например, в панели SQL вы можете создать условие WHERE, такое как следующее:
WHERE (hire_date < '01/01/95' ) AND
((status = 'R') OR (status = 'A'))
Конструктор запросов и представлений представляет это условие WHERE в области условий следующим образом:
При внесении изменений в запрос (например, изменение одного из значений в области условий) конструктор запросов и представлений повторно создает инструкцию SQL на панели SQL. Повторно созданная инструкция SQL будет выглядеть как панель условий, а не исходная инструкция. Например, если область условий содержит распределенные предложения AND, результирующая инструкция в области SQL будет воссоздана с явными распределенными предложениями AND. Дополнительные сведения см. в разделе "Как работает оператор И с несколькими логическими операциями OR" в предыдущем разделе.
См. также
укажите критерии поиска (визуальные инструменты для баз данных)