Примеры сложных запросов
Реальные сценарии для продвинутого подсчета
1. Условный подсчет по нескольким таблицам
SELECT
d.department_name,
COUNT(CASE WHEN e.performance_rating > 4 THEN 1 END) AS high_performers,
COUNT(CASE WHEN e.salary > (SELECT AVG(salary) FROM employees) THEN 1 END) AS above_avg_salary
FROM
departments d
LEFT JOIN
employees e ON d.department_id = e.department_id
GROUP BY
d.department_name;
Вложенный условный подсчет
2. Иерархический подсчет с использованием подзапросов
SELECT
project_id,
project_name,
(SELECT COUNT(*)
FROM tasks
WHERE tasks.project_id = projects.id AND status = 'Completed') AS completed_tasks,
(SELECT COUNT(*)
FROM tasks
WHERE tasks.project_id = projects.id AND status = 'In Progress') AS ongoing_tasks
FROM
projects;
Сложные методы агрегации
3. Условный подсчет на основе времени
SELECT
YEAR(hire_date) AS hire_year,
COUNT(CASE WHEN age < 30 THEN 1 END) AS young_employees,
COUNT(CASE WHEN age BETWEEN 30 AND 45 THEN 1 END) AS mid_career_employees,
COUNT(CASE WHEN age > 45 THEN 1 END) AS senior_employees
FROM
employees
GROUP BY
YEAR(hire_date)
ORDER BY
hire_year;
Анализ сложности запросов
| Уровень сложности |
Характеристики |
Влияние на производительность |
| Простой |
Базовые условия WHERE |
Минимальное |
| Средний |
Несколько операторов CASE |
Среднее |
| Сложный |
Подзапросы, несколько соединений |
Значительное |
Процесс условного подсчета
graph TD
A[Start Complex Counting] --> B{Query Type}
B --> |Multi-Table| C[Join and Aggregate]
B --> |Nested Conditions| D[Subquery Counting]
B --> |Time-Based Analysis| E[Temporal Grouping]
C --> F[Apply Conditions]
D --> F
E --> F
F --> G[Generate Result Set]
Продвинутые стратегии оптимизации
- Используйте индексированные столбцы в условной логике
- Минимизируйте сложность подзапросов
- Используйте материализованные представления для повторяющихся сложных запросов
Общие проблемы при сложном подсчете
- Управление производительностью запросов
- Обработка значений NULL
- Балансирование между читаемостью и эффективностью
LabEx рекомендует постепенно подходить к освоению сложных методов подсчета в MySQL, начиная с простых запросов и постепенно добавляя сложности.