SQL (3/14)

💻Логика построения запросов и оптимальный порядок операций: как SQL обрабатывает запросы (3/14)

Когда мы пишем SQL-запрос, мы видим его в определённом порядке. Начинаем с SELECT, затем FROM, WHERE и так далее. Но на самом деле база данных обрабатывает запрос не так, как он написан, а в логическом порядке, который важен для понимания, отладки и оптимизации.

Типичный SQL-запрос состоит из обязательных операторов SELECT и FROM, а также опциональных, таких как WHERE, GROUP BY, HAVING и ORDER BY. Все они относятся к категории Data Query Language (DQL). Важно знать, что порядок выполнения начинается с FROM и заканчивается LIMIT или SELECT, что противоположно порядку записи.

Рассмотрим простой пример с таблицей сотрудников employees из IT-отдела: у нас есть пять человек, разбитых на три группы, с указанием зарплаты.

| id | name  | group_id | salary  |  |----|--------|----------|---------|  | 1  | Alice  | 101      | 170000  |  | 2  | Boris  | 102      | 150000  |  | 3  | Mike   | 101      | 180000  |  | 4  | Dana   | 103      | 160000  |  | 5  | Elena  | 101      | 190000  |  Задача: найти общую сумму зарплат по каждой группе, включить только те, где сумма превышает 250 000, и отсортировать результат по сумме по убыванию.

Запрос будет таким:  SELECT group_id, SUM(salary) AS total_salary  FROM employees  GROUP BY group_id  HAVING SUM(salary) > 250000  ORDER BY total_salary DESC;

Пошагово SQL обработает запрос так:

1. FROM: Определяет таблицу employees как источник данных; все строки таблицы берутся для дальнейшей обработки (если нет WHERE).  2. WHERE: В запросе фильтрации строк нет, поэтому берутся все. Если бы было условие, например, WHERE salary > 100000, отсеивались бы строки ниже этого порога.  3. GROUP BY: Строки группируются по столбцу group_id. В итоге получаем группы:      - 101: [170000, 180000, 190000]      - 102: [150000]      - 103: [160000]  4. HAVING: Фильтрует группы по сумме зарплат, оставляя только те, у которых сумма больше 250000. В нашем случае это только группа 101 со суммой 540000.  5. SELECT: Выбирает столбцы group_id и вычисляет сумму зарплаты (total_salary) уже по отфильтрованным данным.  6. ORDER BY: Сортирует результат по total_salary в порядке убывания. В данном случае только одна группа, поэтому сортировка очевидна.

Пример

Рассмотрим таблицу products с колонками:

🎯product_id  🎯category  🎯price

| id | product | category    | price   |  |----|---------|-------------|---------|  | 1  | Laptop  | Electronics | 100000  |  | 2  | Phone   | Electronics | 7000    |  | 3  | Chair   | Furniture   | 1500    |  | 4  | Desk    | Furniture   | 3000    |  Ваша задача:

1. Посчитать общую стоимость товаров для каждой категории.  2. Исключить категории с суммой менее 5000.  3. Отсортировать по сумме стоимости товаров в порядке возрастания.

Запрос будет таким:

SELECT category, SUM(price) AS total_price  FROM products  GROUP BY category  HAVING SUM(price) >= 5000  ORDER BY total_price ASC;

Понимание логики выполнения SQL-запросов - это мощный инструмент для отладки и написания эффективного кода. Следите за порядком операций, чтобы запросы работали быстро и корректно.

Так же у нас есть ламповый чатик, где собралась уже 1 тысяча аналитиков! 🎉

Запомните, даже самый спокойный медведь умеет рычать, когда надо. Берегите голову, берегите данные — и пусть в вашем дне будет немного тишины, ясности и добрых переменных.

#SQL