ORDER BY — сортируем строки
Данные: таблица employees
id | first_name | department_id | salary |
1 | Иван | 1 | 70000 |
2 | Анна | 2 | 65000 |
3 | Сергей | 1 | 72000 |
4 | Елена | 3 | 80000 |
5 | Дмитрий | 2 | 60000 |
Шаг 1. Берём ВСЕ строки из employees
.
Шаг 2. Сортируем их по salary
по убыванию (DESC
).
SELECT id, first_name, department_id, salary
FROM employees
ORDER BY salary DESC;
Результат:
id | first_name | department_id | salary |
4 | Елена | 3 | 80000 |
3 | Сергей | 1 | 72000 |
1 | Иван | 1 | 70000 |
2 | Анна | 2 | 65000 |
5 | Дмитрий | 2 | 60000 |
Комбинированная сортировка: сначала по отделу ↑, внутри — по зарплате ↓.
SELECT id, first_name, department_id, salary
FROM employees
ORDER BY department_id ASC, salary DESC;
GROUP BY — объединяем строки в группы
Данные те же (employees
).
id | first_name | department_id | salary |
1 | Иван | 1 | 70000 |
2 | Анна | 2 | 65000 |
3 | Сергей | 1 | 72000 |
4 | Елена | 3 | 80000 |
5 | Дмитрий | 2 | 60000 |
Шаг 1. Делим строки на группы по department_id
.
Шаг 2. Для каждой группы считаем COUNT(*)
и AVG(salary)
.
SELECT
department_id,
COUNT(*) AS employee_count,
AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id;
Результат:
department_id | employee_count | avg_salary |
1 | 2 | 71000.00 |
2 | 2 | 62500.00 |
3 | 1 | 80000.00 |
Важно: в SELECT
можно выводить только поля из GROUP BY
или агрегаты.
HAVING — фильтруем уже сформированные группы
Шаг 1. Сначала формируем группы по department_id
.
Шаг 2. Считаем размер группы COUNT(*)
.
Шаг 3. Оставляем только группы, где сотрудников больше 1 — это делает HAVING
.
SELECT
department_id,
COUNT(*) AS employee_count
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 1;
Результат:
department_id | employee_count |
1 | 2 |
2 | 2 |
WHERE vs HAVING: WHERE
фильтрует отдельные строки до группировки, HAVING
— готовые группы после GROUP BY
.
Комбо-пример: сначала выберем только отделы 1 и 2 (WHERE), потом оставим группы с ср. зарплатой > 65k (HAVING).
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
WHERE department_id IN (1,2) -- фильтр строк ДО группировки
GROUP BY department_id
HAVING AVG(salary) > 65000; -- фильтр групп ПОСЛЕ группировки
Результат:
department_id | avg_salary |
1 | 71000.00 |