Управление порядком операций в запросе SQL

При выполнении 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')

Связанные разделы