Поделиться через


Соглашения об объединении условий поиска в панели критериев (визуальные средства администрирования баз данных)

Область применения:SQL Server

Вы можете создавать запросы, включающие любое количество условий поиска, связанных с любым количеством операторов AND и OR. Запрос с сочетанием предложений AND и OR может стать сложным, поэтому полезно понять, как такой запрос интерпретируется при выполнении и как такой запрос представлен в области критериев и области SQL.

Ниже приведены сведения о следующем:

  • Приоритет И И ИЛИ в запросах, содержащих оба.

  • Как условия в предложениях 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 в области условий

Однако если связанные предложения OR имеют приоритет над предложением AND, предложение AND повторяется для каждого предложения OR. Это приводит к распространению предложения AND для каждого предложения OR. Например, в области SQL можно создать предложение WHERE, например следующее:

WHERE (hire_date < '01/01/95' ) AND   
  ( (job_lvl = 100) OR   
  (status = 'R') )  

Конструктор запросов и представлений представляет это условие WHERE в панели критериев следующим образом:

Несколько условий AND и OR в области критериев

Если связанные предложения OR включают только один столбец данных, конструктор запросов и представлений может поместить все предложение OR в одну ячейку сетки, избегая необходимости повторять предложение AND. Например, в панели SQL вы можете создать условие WHERE, такое как следующее:

WHERE (hire_date < '01/01/95' ) AND   
  ((status = 'R') OR (status = 'A'))  

Конструктор запросов и представлений представляет это условие WHERE в области условий следующим образом:

Связанные условия OR, определенные в области условий

При внесении изменений в запрос (например, изменение одного из значений в области условий) конструктор запросов и представлений повторно создает инструкцию SQL на панели SQL. Повторно созданная инструкция SQL будет выглядеть как панель условий, а не исходная инструкция. Например, если область условий содержит распределенные предложения AND, результирующая инструкция в области SQL будет воссоздана с явными распределенными предложениями AND. Дополнительные сведения см. в разделе "Как работает оператор И с несколькими логическими операциями OR" в предыдущем разделе.

См. также

укажите критерии поиска (визуальные инструменты для баз данных)