При выполнении SQL-запросов важно понимать порядок вычисления условий и управлять им, чтобы можно было получить ожидаемые результаты.
Ниже приведены два примера одного запроса. Первый пример не использует группирование условий, и результаты получились не те, что ожидались. Во втором примере условия группируются, чтобы обеспечить правильный порядок операций для возврата ожидаемых результатов.
В этом сценарии представьте, что вы работаете с глобальной демографической базой данных и хотите найти все города Китая, в которых проживает не менее 100 000 человек или которые являются столицами провинций.
Пример 1: без группирования
Можно построить этот запрос с тремя условиями, как показано на рисунке ниже. При выполнении этого запроса он сначала находит все города в Китае, а затем фильтрует китайские города с населением более 100 000 человек. Затем на основе оператора Or выполняется оценка всего набора данных для возвращения столиц провинций. Конечными результатами являются китайские города с населением более 100 000 человек и любой город мира, который является столицей провинции, что не является ожидаемым результатом. Это произошло потому, что оператор And имеет более высокий приоритет, чем оператор Or, следовательно And оценивается сначала.
Пример 2: группирование
В этом случае, чтобы возвращались ожидаемые результаты, оператор Or должен обрабатываться первым. Можно сгруппировать условия, чтобы принудительно задать порядок операций. Сначала оцениваются условия внутри группы, а потом – условия за пределами группы.
Чтобы сгруппировать два или более условий, нажмите клавишу Shift при щелчке, чтобы выбрать их, затем нажмите кнопку Сгруппировать условия . Чтобы разгруппировать условия, выберите условие в группе и нажмите Разгруппировать условия .
С применением группировки запрос сначала оценивает условия в группе: имеет ли город по крайней мере 100 000 человек или является столицей провинции. Далее он оценивает, располагается ли это город в Китае. Оператор And гарантирует, что запрос правильно вернет города, соответствующие обоим критериям: китайские города с населением не менее 100 000 человек или столицы провинций.
Группировка условий похожа на вычисление выражений в скобках. В режиме SQL это запрос выглядит следующим образом:CNTRY_NAME = 'China' And (POP > 100000 Or STATUS = 'Provincial capital')