LINUX.ORG.RU

Повышают энтропию. Очевидно же.

anonymous
()

GROUP BY нужен, чтобы выполнить операции над группами. Например, чтобы для всех модераторов ЛОРа вычислить сумму IQ, нужно сначала сгруппировать юзеров при признаку модератор или нет.

HAVING нужен, чтобы фильтровать после группировки, т.е. по признакам групп, а не отдельных членов. Например, HAVING MAX(IQ) > 100 оставит только те группы, где нет анонимусов. Если мы вместо этого сделаем WHERE IQ > 100 перед GROUP BY, то мы из остальных групп уберём дебилов, а нам нужно только убрать группы, где есть дебилы. Это важно, если, например, далее мы захотим SELECT MIN(IQ), т.к. если мы с помощью WHERE уберём всех дебилов, их не окажется ни в одной группе, что, очевидно, неверно.

queen3 ★★★★★
()
Ответ на: комментарий от queen3

Например, HAVING MAX(IQ) > 100 оставит только те группы, где нет анонимусов

модератор или нет

Я просто оставлю это здесь :)

buddhist ★★★★★
()
Ответ на: комментарий от queen3

ну а чем будет отличаться, условно:

select sum(iq) from users where moder=1

от

select sum(iq) from users group by moder

p.s. я так понял, что во втором случае будет 2 суммы, одна группы модераторов, а вторая нет а во втором только 1 сумма?

pashazz ★★★★
() автор топика
Ответ на: комментарий от pashazz

т.е. иными словами, group by полезно только для агрегатных функций, совершающих при селекте некую операцию, SUM, COUNT, MIN, MAX и т.п., регулируя количество строк в выхлопе, я правильно понял?

pashazz ★★★★
() автор топика
Ответ на: комментарий от pashazz

ну и соответственно фильтруя данные конкретно для расчета под агрегатную ф-цию..

pashazz ★★★★
() автор топика
Ответ на: комментарий от pashazz

В принципе да. В первом случае ты отводишь в сторонку тех, кто moder=1, и считаешь iq (определять можно по лицу или по наклейке Apple на ноуте в руках). Во втором случае ты командуешь - «эти налево, эти направо», а потом уже в каждой группе суммируешь. Очевидно, что в первом случае кучка будет только одна.

Это же визуально совершенно разные вещи. В одном случае выдёргиваем пациентов и далее работаем только с ними. Во втором случае старательно сортируем по головам. Конечно, если надо просто посчитать сумму, разницы особой нет.

queen3 ★★★★★
()
Ответ на: комментарий от queen3

Ну хз, книжку-то долго писать, я один всю эту канитель оплачивать не потяну, сколько вам нынче за SQL платят. Если только со временем скомпилировать из ответов на ЛОРе.

Hoodoo ★★★★★
()
Ответ на: комментарий от pashazz

Не обязательно при селекте. Например, нужно узнать, юзеры каких дистрибутивов умнее убунтоидов:

SELECT usertype
FROM users
GROUP BY usertype
HAVING AVG(IQ) > 10

Здесь нас интересует не результат расчёта IQ, его в селекте нет. Замечу что WHERE IQ > 10 тут приведёт к неправильному результату, т.к. в любой группе будут такие люди и в списке будут все.

Или вот некоторые даже используют GROUP BY вместо DISTINCT. А потому что можно дополнительно отфильтровать, например.

SELECT usertype FROM users GROUP BY usertype HAVING COUNT(*) > 10

Показать, какие дистрибутивы ещё не совсем потеряли юзерскую базу. Просто SELECT DISTINCT usertype не позволит отфильтровать затем по количеству оставшихся пользователей, и как узнать, сколько ещё осталось пользователей слаквари?

queen3 ★★★★★
()
Ответ на: комментарий от queen3

спасибо ещё раз, очень информативно и понятно.

pashazz ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.