|
HAVING и WHERE
|
|||
---|---|---|---|
#18+
Здравствуйте, дорогие SQL'евцы! Я тоже по чуть-чуть начинаю становиться вашим коллегой. Взял с sql.ru книжку "Understanding SQL", распечатал, читаю, уже на середине, но мне очень мешает моё одновременное непонимание некоторых принципиальных вещей. Никак не могу до конца понять, в чём принципиальное отличие HAVING от WHERE. Да, понимаю, что предикаты оцениваются в терминах одиночной строки (WHERE), а агрегатные функции оцениваются в терминах групп строк (HAVING). Но почему тогда, чёрт возьми, автор книги приводит пример неправильного запроса: SELECT snum, odate, MAX (amt) FROM Oreders WHERE MAX ((amt)) > 3000.00 GROUP BY snum, odate; и правильного: SELECT snum, odate, MAX ((amt)) FROM Orders GROUP BY snum, odate HAVING MAX ((amt)) > 3000.00; Думаешь, наконец-то понял. Ан нет, в дальнейшем окончательно начинает запутывать. Оказывается, ко всему ещё и такие запросы неверны: SELECT snum, MAX (amt) FROM Orders GROUP BY snum HAVING odate = 10/03/1988; И это потому, что поле оdate не может быть вызвано предложением HAVING, потому что оно может иметь (и действительно имеет) больше чем одно значение на группу вывода. Допустим, тогда почему этот пример, напротив, верен? (см. ниже) SELECT snum, MAX (amt) FROM Orders GROUP BY snum HAVING snum B (1002,1007); А здесь тогда что ??? Одно значение на группу вывода? Или это у меня в глазах двоится? Помогите, пожалуйста!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2000, 08:01 |
|
HAVING и WHERE
|
|||
---|---|---|---|
#18+
Если HAVING snum IN (1002,1007) то все верно. Неважно сколько snum отберет HAVING - все сгруппировано по snum и запрос остается корректным. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2000, 01:30 |
|
HAVING и WHERE
|
|||
---|---|---|---|
#18+
Запомни одну очень простую вещь - HAVING отсеивает уже после того как выполнился SELECT, а WHERE в момент выполнения запроса. Очевидно 1 запрос неверен так как приходится сначала найти максимум, а затем уже отсекать конечный результат - что и показано во 2 и 4 примерах. Аналогично в третьем примере - конечный результат SELECT не содержит поля odate. Вот так - без огромного количества заумных слов! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2000, 08:09 |
|
|
start [/forum/topic.php?fid=46&fpage=3601&tid=1827756]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
484ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
others: | 277ms |
total: | 851ms |
0 / 0 |