Объединение данных из разных таблиц SQL: Joins и Unions

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы извлечь данные из разных таблиц, применяйте SQL JOIN. INNER JOIN возвращает строки, где значения соответствуют заданным критериям в обеих таблицах:

SQL
Скопировать код
SELECT a.name, b.price
FROM products AS a
INNER JOIN sales AS b ON a.id = b.product_id;

В результате данного запроса мы получим названия товаров и их цены из таблицы продаж при условии, что идентификаторы товаров совпадают.

Кинга Идем в IT: пошаговый план для смены профессии

Понимание JOIN-ов и псевдонимов для таблиц

JOIN в SQL позволяет объединять строки из двух или более таблиц по совпадению данных в определённом столбце. Знание разницы между типами JOIN-ов важно для составления запросов, которые затрагивают несколько таблиц:

  • INNER JOIN: Возвращает строки, где значения в соответствующих столбцах обеих таблиц совпадают.
  • LEFT JOIN (или LEFT OUTER JOIN): Возвращает все строки из левой таблицы и строки из правой таблицы, соответствующие левой.
  • RIGHT JOIN (или RIGHT OUTER JOIN): Возвращает все строки из правой таблицы и строки из левой таблицы, соответствующие правой.
  • FULL JOIN (или FULL OUTER JOIN): Возвращает все строки, где есть хотя бы одно совпадение в любой из таблиц.

Использование псевдонимов для таблиц (AS) повышает читаемость запросов и помогает избежать путаницы с названиями столбцов:

SQL
Скопировать код
SELECT p.product_name, s.sale_date
FROM products p
INNER JOIN sales s ON p.id = s.product_id;

Здесь p и s используются как псевдонимы для таблиц products и sales.

Применение операторов множеств и подзапросов для сложной фильтрации

Операторы множеств, такие как UNION и INTERSECT, и подзапросы позволяют реализовать сложную фильтрацию данных:

  • UNION: Объединяет результаты нескольких SELECT-запросов, убирая повторяющиеся строки.
  • UNION ALL: Также объединяет результаты запросов, но оставляет дубликаты строк.

Вложенные запросы, или подзапросы, привносят дополнительные возможности для составления SQL запросов:

SQL
Скопировать код
SELECT name
FROM products
WHERE id IN (SELECT product_id FROM sales);

В данном случае подзапрос выбирает идентификаторы товаров из таблицы sales для последующей фильтрации товаров.

Особенности синтаксиса SQL и производительности

При объединении нескольких таблиц не забывайте учитывать значения NULL:

SQL
Скопировать код
SELECT a.name, b.price
FROM products AS a
LEFT JOIN sales AS b ON a.id = b.product_id;
-- возвращает NULL для товаров, которые не продавались

Для исключения дублирования строк и повышения производительности запроса Вы можете использовать ключевое слово DISTINCT.

Визуализация

Markdown
Скопировать код
**Таблицы**: Их можно сравнить с `ингредиентами` для вашего блюда-запроса.
**Запрос**: Это ваш `рецепт`, по которому вы собираетесь готовить блюдо.

Объединим ингредиенты с помощью JOIN:

Markdown
Скопировать код
SELECT dishName
FROM kitchen AS k
JOIN ingredients ON k.id = ingredients.kitchen_id;

И вуаля, перед вами Блюдо из данных:

Markdown
Скопировать код
🍽️: [Комбинация элементов данных, каждый из которых привносит свой уникальный вкус из исходной таблицы]

Группировка и агрегация сложных наборов данных

Применение агрегатных функций таких как SUM, AVG, MIN, MAX или COUNT помогает получить важные выводы из анализируемых данных.

SQL
Скопировать код
SELECT a.category, COUNT(*)
FROM products a
JOIN sales b ON a.id = b.product_id
GROUP BY a.category;

В результате мы получаем статистику по количеству продаж в каждой категории.

Великое противостояние времени: использование функций LEAST и GREATEST

Когда время играет ключевую роль, функции LEAST и GREATEST становятся незаменимыми при определении самых ранних или поздних дат.

SQL
Скопировать код
SELECT GREATEST(a.date_modified, b.date_modified) AS last_update -- Финальное сражение властителей времени
FROM table_a a
JOIN table_b b ON a.id = b.foreign_id;