0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: субд, базы данных, sql, sql server, having, where, sql-запросы</p>
1
<p>Теги: субд, базы данных, sql, sql server, having, where, sql-запросы</p>
2
<p>Обсудим такой популярный вопрос на собеседовании, как "Чем отличается WHERE от HAVING"?</p>
2
<p>Обсудим такой популярный вопрос на собеседовании, как "Чем отличается WHERE от HAVING"?</p>
3
SELECT username, COUNT(*) FROM table WHERE username = ‘Anna’ GROUP BY username HAVING COUNT(*)>1<p>Ой, скажет кто-то, зачем же спрашивать такие банальности? Как ни странно, довольно много разработчиков даже с сертификатами по<strong>SQL quering</strong>не понимают, что происходит в<strong>HAVING</strong>.</p>
3
SELECT username, COUNT(*) FROM table WHERE username = ‘Anna’ GROUP BY username HAVING COUNT(*)>1<p>Ой, скажет кто-то, зачем же спрашивать такие банальности? Как ни странно, довольно много разработчиков даже с сертификатами по<strong>SQL quering</strong>не понимают, что происходит в<strong>HAVING</strong>.</p>
4
<p>Давайте разберёмся. В сущности,<strong>HAVING</strong>очень похож на<strong>WHERE</strong>- это тоже фильтр. Вы можете написать в<strong>HAVING</strong>name = ‘Anna’, как и в<strong>WHERE</strong>, и ошибки не будет.</p>
4
<p>Давайте разберёмся. В сущности,<strong>HAVING</strong>очень похож на<strong>WHERE</strong>- это тоже фильтр. Вы можете написать в<strong>HAVING</strong>name = ‘Anna’, как и в<strong>WHERE</strong>, и ошибки не будет.</p>
5
<h2>В чём же ключевое различие?</h2>
5
<h2>В чём же ключевое различие?</h2>
6
<p>Во-первых, в<strong>HAVING</strong>и только в нём можно писать условия по агрегатным функциям (SUM, COUNT, MAX, MIN и т. д.). То есть если вы хотите сделать что-то вроде COUNT(<em>) > 10, то это возможно сделать только в</em><em>HAVING</em>*.</p>
6
<p>Во-первых, в<strong>HAVING</strong>и только в нём можно писать условия по агрегатным функциям (SUM, COUNT, MAX, MIN и т. д.). То есть если вы хотите сделать что-то вроде COUNT(<em>) > 10, то это возможно сделать только в</em><em>HAVING</em>*.</p>
7
<p>"Почему бы не оставить только<strong>HAVING</strong>?" - спросите вы. Всё кроется в том, как<strong>SQL Server</strong>выполняет запрос, в каком порядке происходит его разбор и работа с данными.<strong>WHERE</strong>выполняется до формирования групп<strong>GROUP BY</strong>. Это нужно для того, чтобы можно было оперировать как можно меньшим количеством данных и сэкономить ресурсы сервера и время пользователя.</p>
7
<p>"Почему бы не оставить только<strong>HAVING</strong>?" - спросите вы. Всё кроется в том, как<strong>SQL Server</strong>выполняет запрос, в каком порядке происходит его разбор и работа с данными.<strong>WHERE</strong>выполняется до формирования групп<strong>GROUP BY</strong>. Это нужно для того, чтобы можно было оперировать как можно меньшим количеством данных и сэкономить ресурсы сервера и время пользователя.</p>
8
<p>Следующим этапом формируются группы, которые указаны в<strong>GROUP BY</strong>. После того как сформированы группы, можно накладывать условия на результаты агрегатных функций. И тут как раз наступает очередь<strong>HAVING</strong>: выполняются условия, которые вы задали.</p>
8
<p>Следующим этапом формируются группы, которые указаны в<strong>GROUP BY</strong>. После того как сформированы группы, можно накладывать условия на результаты агрегатных функций. И тут как раз наступает очередь<strong>HAVING</strong>: выполняются условия, которые вы задали.</p>
9
<p>Главное отличие<strong>HAVING</strong>от<strong>WHERE</strong>в том, что в<strong>HAVING</strong>можно наложить условия на результаты группировки, потому что порядок исполнения запроса устроен таким образом, что на этапе, когда выполняется<strong>WHERE</strong>, ещё нет групп, а<strong>HAVING</strong>выполняется уже после формирования групп.</p>
9
<p>Главное отличие<strong>HAVING</strong>от<strong>WHERE</strong>в том, что в<strong>HAVING</strong>можно наложить условия на результаты группировки, потому что порядок исполнения запроса устроен таким образом, что на этапе, когда выполняется<strong>WHERE</strong>, ещё нет групп, а<strong>HAVING</strong>выполняется уже после формирования групп.</p>
10
<p><em>Остались вопросы? Пишите их в комментариях!</em></p>
10
<p><em>Остались вопросы? Пишите их в комментариях!</em></p>
11
11