Джойны (JOINs) и агрегация в SQL
SQL (Structured Query Language) — это язык программирования, используемый для работы с реляционными базами данных. Он позволяет выполнять различные операции, такие как выборка данных, вставка, обновление, удаление, а также агрегация и соединение данных из нескольких таблиц. В этом ответе я расскажу о джойнах (соединениях) и агрегации в SQL.
Джойны (JOINs)
Джойны используются для объединения данных из двух или более таблиц на основе связанных столбцов. Основные типы джойнов:
- INNER JOIN
Возвращает только те строки, которые имеют совпадения в обеих таблицах.
SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;
- LEFT JOIN (или LEFT OUTER JOIN)
Возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если совпадений нет, то в правой таблице будут значенияNULL
.
SELECT employees.name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;
- RIGHT JOIN (или RIGHT OUTER JOIN)
Возвращает все строки из правой таблицы и соответствующие строки из левой таблицы. Если совпадений нет, то в левой таблице будут значенияNULL
.
SELECT employees.name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.department_id;
- FULL JOIN (или FULL OUTER JOIN)
Возвращает все строки из обеих таблиц. Если совпадений нет, то в недостающих местах будут значенияNULL
.
SELECT employees.name, departments.department_name
FROM employees
FULL JOIN departments ON employees.department_id = departments.department_id;
- CROSS JOIN
Возвращает декартово произведение двух таблиц (все возможные комбинации строк).
SELECT employees.name, departments.department_name
FROM employees
CROSS JOIN departments;
Агрегация
Агрегация используется для выполнения вычислений над набором данных, таких как подсчет суммы, среднего значения, минимального или максимального значения и т.д. Основные агрегатные функции:
- COUNT()
Подсчитывает количество строк.
SELECT COUNT(*) AS total_orders
FROM orders;
- SUM()
Вычисляет сумму значений в столбце.
SELECT SUM(price) AS total_sales
FROM sales;
- AVG()
Вычисляет среднее значение.
SELECT AVG(price) AS average_price
FROM products;
- MIN()
Находит минимальное значение.
SELECT MIN(price) AS min_price
FROM products;
- MAX()
Находит максимальное значение.
SELECT MAX(price) AS max_price
FROM products;
- GROUP BY
Группирует строки по указанному столбцу для выполнения агрегации.
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id;
- HAVING
Фильтрует результаты агрегации (аналогWHERE
, но для агрегированных данных).
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 50000;
Пример с джойнами и агрегацией
Предположим, у нас есть две таблицы: orders
(заказы) и customers
(клиенты). Мы хотим узнать общую сумму заказов для каждого клиента.
SELECT customers.customer_name, SUM(orders.amount) AS total_amount
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id
GROUP BY customers.customer_name
HAVING SUM(orders.amount) > 1000;
Этот запрос:
- Соединяет таблицы
customers
иorders
поcustomer_id
. - Группирует результаты по имени клиента.
- Считает общую сумму заказов для каждого клиента.
- Фильтрует клиентов, у которых общая сумма заказов превышает 1000.