2013-03-12 2 views
4

Я пытаюсь понять разницу между HAVING и WHERE. Я понимаю, что HAVING используется с операторами GROUP BY. Тем не менее, я не могу понять, почему следующее заявление принято:Невозможно понять, почему принимается предложение WHERE

select SUM(child_id) from children WHERE child_ID = 5 GROUP BY Child_ID 

Не следует ли правильное утверждение быть select SUM(child_id) from children GROUP BY Child_ID HAVING child_ID = 5?

+0

Либо действительны, но предложение WHERE для меня фактически более стандартное использование. –

+0

@JasonWhisman - Значит, вы говорите, что мне даже не нужно вообще использовать предложение HAVING и можете выполнять все заявления с WHERE? –

+0

Правильно, все, кроме агрегатных статей. Таким образом, вам все равно придется делать «HAVING SUM (child_id)> 0', но в остальном все в порядке. –

ответ

6

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

+0

Итак, чтобы убедиться, что я понял, условия WHERE в основном применяются для фильтрации нормальных полей, в то время как предложение HAVING будет применяться, если вы хотите отфильтровать выбранный вами агрегат? –

+1

@DotNET: Именно. –

+0

Спасибо за помощь, +1 :) –

2

Предложение WHERE может использоваться, даже если используется HAVING. Это разные вещи. Способ думать об этом следующим образом:

  • ИНЕКЕ действует как фильтр на уровне записей
  • Все, что получает через затем в группы, указанные вашим GROUP BY
  • Затем предложения HAVING фильтрует группы, на основе совокупного (SUM, COUNT, MIN и т.д.) состояние

Так что, если у меня есть таблица: (store_id, STATE_CODE, SALES)

Select STATE, SUM(SALES) 
from MyTable 
Where SALES > 100 
Group By STATE 
Having Sum(Sales) > 1000 

Сначала будет фильтроваться, чтобы читать только записи магазина с объемом продаж более 100. Для каждой группы (по штату) она будет суммировать продажи только тех магазинов, где проданы 100 или более. Затем будет сброшено любое государство, если сумма государственного уровня не превысит 1000. [Примечание: суммирование в государстве исключает любой объем продаж 100 или менее.]

+0

@DotNET: Точно. Существует также случай, когда вы можете использовать HAVING без GROUP BY. Если вы объединяете все в одну строку вывода, вы все равно можете фильтровать либо получить эту строку, либо ничего не получить, таким образом: выберите SUM (Sales) из MyTable, имеющей сумму (Sales)> 50000 –

+0

Спасибо за помощь! +1 :) –

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