Similar presentations:
join
1.
JOIN - Все Виды, КакРаботают, Алгоритмы,
Примеры, Практика
Сомов Артур ОП-923/3
2.
Что такое JOIN?• Что такое JOIN? Это операция в SQL, которая объединяет строки из двух или более
таблиц на основе связанного столбца (обычно ключа).
• Зачем нужен? Для извлечения связанных данных без дублирования.
• Виды JOIN: INNER, LEFT, RIGHT, CROSS, SELF.
• Алгоритм общий: Сравниваем строки по условию JOIN, объединяем совпадения (в
зависимости от типа).
3.
INNER JOINКак работает: Возвращает только строки, где есть совпадение в обеих
таблицах. Исключает "сиротские" записи.
Алгоритм: Для каждой строки левой таблицы ищем совпадения в правой по
условию. Если совпадение найдено, объединяем. Иначе — пропускаем.
Пример: Показать продавцов и их клиентов. SELECT s.sname, c.cname
FROM sellers s
INNER JOIN customers c ON s.snum = c.snum;
Результат: Только продавцы с клиентами (Peel с Hoffman и Clemens, Axelrod с
Giovanni, и т.д.).
4.
LEFT (OUTER) JOINКак работает: Возвращает все строки из левой таблицы, плюс совпадения из
правой. Если совпадения нет — NULL в правой части.
Алгоритм: Берем все строки левой таблицы. Для каждой ищем совпадения в
правой; если найдено — объединяем, если нет — добавляем NULL.
Пример: Все продавцы и их клиенты (даже если у продавца нет клиентов).
SELECT s.sname, c.cname
FROM sellers s
LEFT JOIN customers c ON s.snum = c.snum;
Результат: Все продавцы, включая Rifkin без клиентов (NULL).
5.
RIGHT (OUTER) JOINКак работает: Возвращает все строки из правой таблицы, плюс совпадения из
левой. Если совпадения нет — NULL в левой части.
Алгоритм: Аналогично LEFT, но начинаем с правой таблицы.
Пример: Все клиенты и их продавцы (даже если клиент не связан с продавцом,
но в наших данных все связаны). SELECT s.sname, c.cname
FROM sellers s
RIGHT JOIN customers c ON s.snum = c.snum;
Результат: Все клиенты, с их продавцами. (В SQLite RIGHT JOIN работает, но
если нужно эмулировать, можно перевернуть LEFT.)
6.
CROSS JOINКак работает: Возвращает декартово произведение — все комбинации строк
из обеих таблиц (без условия).
Алгоритм: Для каждой строки левой таблицы комбинируем с каждой строкой
правой.
Пример: Все комбинации продавцов и клиентов. SELECT s.sname, c.cname
FROM sellers s
CROSS JOIN customers c;
Результат: 5 продавцов × 7 клиентов = 35 строк.
7.
SELF JOINКак работает: Объединяем таблицу саму с собой, используя алиасы.
Алгоритм: Трактуем таблицу как две копии, соединяем по условию.
Пример: Клиенты из одного города (например, London). SELECT c1.cname AS
client1, c2.cname AS client2
FROM customers c1
INNER JOIN customers c2 ON c1.city = c2.city AND c1.cnum != c2.cnum;
Результат: Пары клиентов из одинаковых городов.
8.
ЗадачиЗадача 1: Найдите всех клиентов и их продавцов с помощью INNER JOIN.
Покажите имена.
2. Задача 2: Используя LEFT JOIN, выведите всех продавцов и суммы их заказов
(если есть). Суммируйте по продавцу.
3. Задача 3: Найдите пары клиентов из одного города с помощью SELF JOIN
(исключая самого себя).
1.
9.
Ответ №1SQL-запрос:
SELECT c.cname AS customer_name, s.sname AS seller_name
FROM customers c
INNER JOIN sellers s ON c.snum = s.snum;
Объяснение:Этот запрос использует INNER JOIN для соединения таблиц customers и sellers по полю snum (код
продавца). Мы выбираем только тех клиентов, у которых есть соответствующий продавец (внутреннее соединение
исключает записи без совпадений). Выводятся имена клиентов (cname) и продавцов (sname).
Ожидаемый результат (на основе ваших данных):Это вернёт список всех клиентов и их продавцов:
Hoffman - Peel
Giovanni - Axelrod
Liu - Serres
Grass - Serres
Clemens - Peel
Cisneros - Rifkin
Pereira - Motika
10.
Ответ №2SQL-запрос:
SELECT s.sname AS seller_name, COALESCE(SUM(o.amt), 0) AS total_orders
FROM sellers s
LEFT JOIN orders o ON s.snum = o.snum
GROUP BY s.sname;
Объяснение:Здесь LEFT JOIN соединяет таблицу sellers с orders по snum, чтобы включить всех
продавцов, даже если у них нет заказов (в таком случае сумма будет 0 благодаря COALESCE). Мы
суммируем суммы заказов (amt) для каждого продавца с помощью GROUP BY и SUM. Если заказов нет,
выводится 0.
Ожидаемый результат (на основе ваших данных):
Peel: 767.19 + 4723.00 + 9891.88 = 12382.07
Serres: 5160.45 + 75.75 + 1309.95 = 6546.15
Motika: 1900.10
Rifkin: 18.69 + 1098.16 = 1116.85
Axelrod: 1713.23
11.
Ответ №3SQL-запрос:
SELECT c1.cname AS customer1, c2.cname AS customer2, c1.city
FROM customers c1
JOIN customers c2 ON c1.city = c2.city AND c1.cnum < c2.cnum;
Объяснение:SELF JOIN соединяет таблицу customers сама с собой (c1 и c2), где города совпадают
(city), но исключает самого себя (c1.cnum < c2.cnum, чтобы избежать дубликатов и
самосоединений). Это покажет уникальные пары клиентов из одного города. Если нужно показать
все комбинации (включая обратные), можно использовать c1.cnum != c2.cnum, но условие <
упрощает вывод.
Ожидаемый результат (на основе ваших данных):
Hoffman и Clemens (London)
Liu и Cisneros (SanJose)
Giovanni и Pereira (Rome)
database