2014-11-30 3 views
-2

Я не понимаю, почему мы можем использовать предложение WHERE с функциями даты. Например, допустимSQL, где с функциями даты

SELECT name FROM table1 
WHERE DATEDIFF(year1,year2) < 10; 

И его работа. Я думал, что мы не можем использовать ГДЕ с функциями. Для этого мы должны использовать предложение HAVING. Итак, как это реально? Функции даты не совпадают с MAX, MIN, AVG и т. Д .;

+0

, который сказал вам, что вы не должны использовать функции в предложении WHERE? –

+1

Агрегатные функции' (MAX, MIN, AVG) ', безусловно, отличаются от' date functions'. Вы не можете использовать агрегатную функцию в 'where clause'. –

+0

Итак, нам нужно только искать функцию агрегата. Где правильный список для mysql? – user3402584

ответ

2

Неправильно, что вы не можете использовать функции в предложении WHERE. Вы можете поместить в него почти все (кроме агрегатов), если оно оценивает логическое истинное/ложное условие на основе столбцов задействованных таблиц или просто постоянных выражений. HAVING, с другой стороны, поддерживает агрегаты в дополнение ко всему остальному.

Разница между ними заключается в том, когда она выполнена, это актуально, если вы используете GROUP BY. WHERE, он накладывает условия, по которым строки из всех задействованных таблиц могут использоваться для формирования групп, а те, которые его не выполняют, не будут учитываться для агрегаций. Вы можете думать о WHERE, работая над необработанными табличными данными, прежде чем группироваться. HAVING оценивается после того, как группы уже сформированы, а агрегации вычисляются (поэтому вы можете использовать их здесь) и решили, какие конечные группы могут отображаться в конечном результате запроса.

Оба они работают в разное время и на разных наборах данных. Обратите внимание, что при отсутствии GROUP BY, WHERE и HAVING эквивалентны.

1

Вы не можете использовать агрегатные функции после предложения WHERE, потому что это не имеет смысла, тогда как DATEDIFF можно использовать. Это не имеет никакого смысла, так как это было бы, как говорят компьютер:

выбрать все строки, для которых максимум столбца идентификатора 34

, который может показаться несколько логичными, но не очень, и на самом деле то же самое, что и id < 35. этот второй путь также более ясен.

Реальная проблема заключается в том, что подсчет максимального столбца в выборке требует, чтобы выбор уже был сделан. Следовательно, MAX не может использоваться как условие для фактического выбора строк для оценки.

за DATEDIFF, он работает, потому что в результате вопрос, для компьютера, логично:

выбрать все строки, для которых разность между date1 и date2 составляет менее 10

Смежные вопросы