HTML Diff
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(*)&gt;1<p>Ой, скажет кто-то, зачем же спрашивать такие банальности? Как ни странно, довольно много разработчиков даже с сертификатами по<strong>SQL quering</strong>не понимают, что происходит в<strong>HAVING</strong>.</p>
3 SELECT username, COUNT(*) FROM table WHERE username = ‘Anna’ GROUP BY username HAVING COUNT(*)&gt;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>) &gt; 10, то это возможно сделать только в</em><em>HAVING</em>*.</p>
6 <p>Во-первых, в<strong>HAVING</strong>и только в нём можно писать условия по агрегатным функциям (SUM, COUNT, MAX, MIN и т. д.). То есть если вы хотите сделать что-то вроде COUNT(<em>) &gt; 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