Перейти к содержанию

Предложение HAVING, ORDER BY

Введение

При анализе данных в базах данных часто требуется:

  • отфильтровать результаты группировки;
  • упорядочить результат запроса в нужном порядке.

Для этого в языке SQL используются:

  • предложение HAVING — фильтрация сгруппированных данных;
  • оператор ORDER BY — сортировка результата запроса.

Эти конструкции обычно применяются совместно с SELECT, WHERE, GROUP BY и агрегатными функциями.


Место HAVING и ORDER BY в SQL-запросе

Общий логический порядок выполнения запроса:

  1. FROM — выбор таблиц;
  2. WHERE — отбор строк;
  3. GROUP BY — группировка данных;
  4. HAVING — фильтрация групп;
  5. SELECT — формирование результата;
  6. ORDER BY — сортировка результата.

Понимание этого порядка важно для правильного построения запросов.


Предложение HAVING

1. Назначение HAVING

HAVING используется для фильтрации результатов после группировки.

В отличие от WHERE, оно работает с группами, а не с отдельными строками.

HAVING применяется:

  • только при использовании GROUP BY;
  • для условий с агрегатными функциями (COUNT, SUM, AVG и др.).

2. Отличие WHERE и HAVING

WHERE HAVING
Фильтрует строки Фильтрует группы
Работает до GROUP BY Работает после GROUP BY
Не использует агрегатные функции Использует агрегатные функции

3. Общий синтаксис HAVING

SELECT столбец, агрегатная_функция(столбец)
FROM таблица
GROUP BY столбец
HAVING условие;

4. Пример использования HAVING

Найти группы, в которых количество записей больше заданного значения:

SELECT group_id, COUNT(*)
FROM Students
GROUP BY group_id
HAVING COUNT(*) > 5;

В результате будут показаны только те группы, где количество студентов превышает 5.

5. HAVING с несколькими условиями

HAVING COUNT(*) > 5 AND COUNT(*) < 20;

Оператор ORDER BY

1. Назначение ORDER BY

ORDER BY используется для сортировки результата запроса по одному или нескольким столбцам.

Сортировка может быть:

  • по возрастанию;
  • по убыванию;
  • по вычисляемым значениям.

2. Общий синтаксис ORDER BY

SELECT столбцы
FROM таблица
ORDER BY столбец;

3. Направление сортировки

  • ASC — по возрастанию (по умолчанию);
  • DESC — по убыванию.
ORDER BY birth_date ASC;
ORDER BY score DESC;

4. Сортировка по нескольким столбцам

ORDER BY group_id ASC, full_name DESC;

Сначала данные сортируются по group_id, а внутри группы — по full_name.

5. Сортировка по агрегатным значениям

ORDER BY может применяться к результатам агрегатных функций:

SELECT group_id, COUNT(*) AS cnt
FROM Students
GROUP BY group_id
ORDER BY cnt DESC;

Совместное использование HAVING и ORDER BY

SELECT group_id, COUNT(*) AS student_count
FROM Students
GROUP BY group_id
HAVING COUNT(*) > 3
ORDER BY student_count DESC;

В этом запросе:

  • сначала группируются данные;
  • затем отбираются группы по HAVING;
  • в конце результат сортируется.

Типичные ошибки

  1. Попытка использовать агрегатные функции в WHERE.
  2. Использование HAVING без GROUP BY.
  3. Ожидание, что ORDER BY повлияет на данные в таблице (он влияет только на вывод).

7. Итоги

  • HAVING используется для фильтрации сгруппированных данных.
  • ORDER BY используется для сортировки результата запроса.
  • WHERE и HAVING выполняют разные задачи и не взаимозаменяемы.
  • ORDER BY всегда применяется последним этапом запроса.