Select * from tableA
Where gender=‘m and (job title = ‘manager or marital_status=‘m)
Какое условие будет выполнено первым в предложении where
?
То есть:
(job title= 'manager or marital_status='m)
(job title= 'manager or marital_status='m)
а затем проверяет наличие пола.В общем случае порядок вычисления выражения не установлен в SQL.
Механизмы базы данных могут свободно оцениваться в любом порядке, поскольку они могут оптимизировать запрос. Например:
Если таблица имеет индекс на job_title
, двигатель может FIRST использовать job_title
как "доступ", а THEN использовать marital_status
и gender
как "фильтрацию".
В качестве альтернативы, если таблица имеет индекс по gender
, двигатель может ПЕРВЫМ использовать gender
как "доступ", а THEN использовать marital_status
и job_title
качестве "фильтрации".
Вы четко видите разницу между доступом и фильтром? Все двигатели нуждаются в "предикате доступа" для извлечения данных, а затем они используют "предикаты фильтра", чтобы выбрать, какие строки должны быть возвращены.
Несколько раз мы хотели бы знать порядок оценки выражения, в частности, для коротких замыканий булевых условий. Это не работает в SQL - декларативный язык - то, как это делается на императивных языках (Java, PHP, С# и т.д.)