Основы JOIN
Курс “Аналитический SQL”
Реляционная модель
До этого на вход поступала только одна таблица.
Теперь будем рассматривать несколько таблиц.
Таблицы будут логически связаны.
В реляционной модели связь между таблицами удобнее всего использовать для формализации функций. Это отношение “многие к одному”.
Для частично определенных функций (многие к одному или нулю) есть оговорки.
Отношение “многие ко многим” затронем позднее.
CALENDAR
Список дат и их характеристики. Первичный ключ: calendar_dt
Например, когда начинается и заканчивается первая неделя года.
Интерпретация: функции на датах, аргумент calendar_dt.
CORE_ACCOUNT
Депозиты клиентов. Первичный ключ: account_rk + valid_from_dttm
Это события обновления информации по депозитам.
Депозиты бывают закрытыми (объект прекратил существование). Наоборот, клиенты из CD_CUSTOMERS все бессмертные.
CORE_ACCOUNT
CORE_ACCOUNT
Если депозит закрыт, то его последняя версия будет “закрыта” в прошлом!
CORE_ACCOUNT
Модель данных логическая для аналитики
Декартово произведение множеств
Декартово произведение двух множеств — это (неупорядоченное) множество, элементами которого являются всевозможные упорядоченные пары элементов исходных множеств.
Мощность результата равна произведению мощностей! �Иногда это очень много!
Декартово произведение множеств
???
Декартово произведение множеств
{2,4,7}x{2,4,7} = {(2,2),(2,4),(2,7),(4,2),(4,4),(4,7),(7,2),(7,4),(7,7)}
Декартово произведение таблиц
Таблица - множество строк.
???
Декартово произведение таблиц
Таблица - множество строк.
Декартово произведение таблиц
В (разумной) таблице не может быть двух разных столбцов об одном и том же
Проблема одноименности столбцов: с самого начала старайтесь не использовать слишком общие имена, например ID
Хотел сделать фото в ИТАЛИИ
Ожидание
Хотел сделать фото в ИТАЛИИ
Реальность
Реляционная алгебра. Ожидание и реальность.
В реляционной алгебре:
В базах данных:
�Последнее нужно всячески избегать на этапе проектирования таблиц и работы с данными. В правильной базе данных ожидание = реальность!
Свойства декартова произведения таблиц
В отношении (таблице) колонки не упорядочены.�Это отличает декартово произведение таблиц от декартова произведения множеств.
TABLE1 x TABLE2 = TABLE2 x TABLE1�
TABLE1 x (TABLE2 x TABLE3) = (TABLE1 x TABLE2) x TABLE3
Соединение
Декартово
произведение
Фильтр�(WHERE)
Еще множество
Увеличивает результат
Уменьшает результат
Соединение (JOIN)
Соединение двух таблиц
Декартово произведение - основа любого соединения!�Остальное определяется типом соединения и может отсутствовать.
Соединения двух таблиц бывают разного типа
Соединение
Декартово
произведение
Фильтр�(WHERE)
Еще множество
Увеличивает результат
Уменьшает результат
Соединения
Соединения 3-х и более таблиц представляется последовательной цепочкой соединений двух таблиц.
Соединения таблиц ассоциативны.
�Некоторые соединения не коммутативны.
SELECT
В SELECT после ключевого слова FROM может быть более одной таблицы. Например, вот так:
SELECT ...�FROM TABLE1, TABLE2, ... , TABLEN;
Это и есть соединение таблиц.
В соединении возможно повторение одной и той же таблицы.
SELECT
В SELECT можно указывать поля из всех участвующих в соединении таблиц и выражения с ними.���select TEST_TABLE02.customer_rk, first_nm, balance_amt �from asql.TEST_TABLE02, asql.TEST_TABLE03;
Для колонок, которые есть в обеих таблицах, нужно явно указать откуда она.�
Слишком громоздко?
SELECT
Используем алиасы.����select a.customer_rk, first_nm, balance_amt �from asql.TEST_TABLE02 a, asql.TEST_TABLE03 b;
SELECT
Как ни странно, но так работать будет.��
select * �from asql.TEST_TABLE02, asql.TEST_TABLE03;
В чем проблема?
CROSS JOIN соединение
Декартово произведение в чистом виде (без дополнительных условий и множеств) называется CROSS JOIN. Можно записать двумя способами.�
select a.customer_rk, first_nm, balance_amt �from asql.TEST_TABLE02 a, asql.TEST_TABLE03 b;
select a.customer_rk, first_nm, balance_amt �from asql.TEST_TABLE02 a CROSS JOIN asql.TEST_TABLE03 b;
Вопрос
Таблица�N строк
Таблица�??? строк
CROSS JOIN
Таблица�M строк
INNER JOIN соединение
Декартово произведение с фильтром называется INNER JOIN. Можно записать двумя способами.
select a.customer_rk, first_nm, balance_amt �from asql.TEST_TABLE02 a, asql.TEST_TABLE03 b�where a.customer_rk = b.customer_rk;
select a.customer_rk, first_nm, balance_amt �from asql.TEST_TABLE02 a INNER JOIN asql.TEST_TABLE03 b� on a.customer_rk = b.customer_rk;
INNER JOIN соединение
Фильтр (условие) может быть любым.
select a.customer_rk, first_nm, balance_amt �from asql.TEST_TABLE02 a, asql.TEST_TABLE03 b�where a.monthly_income_amt >= b.balance_amt;
INNER JOIN
select * �from asql.TEST_TABLE02 a, asql.TEST_TABLE03 b�where a.customer_rk = b.customer_rk;
INNER JOIN
Логику можно представить по другому.
В результат попадут
Вопрос
Таблица�N строк
Таблица�??? строк
INNER JOIN
Таблица�M строк
LEFT JOIN соединение
Декартово произведение с фильтром и дополнительным множеством из левой таблицы называется LEFT OUTER JOIN, или сокращенно LEFT JOIN.
�select a.customer_rk, first_nm, balance_amt �from asql.TEST_TABLE02 a LEFT JOIN asql.TEST_TABLE03 b� on a.customer_rk = b.customer_rk;
�Дополнительно к INNER JOIN из левой таблицы берутся строки, для которых не нашлось ни одного совпадения по условию ON. Для таких записей поля, соответствующие правой таблице, заполняются значениями NULL.
LEFT JOIN
select * �from asql.TEST_TABLE02 a LEFT JOIN asql.TEST_TABLE03 b � on a.customer_rk = b.customer_rk;
LEFT JOIN
В результат попадет декартово произведение где останутся
Плюс
LEFT JOIN
В результирующей таблице встретятся ровно один раз, причём остальные поля будут содержать NULL
В результат LEFT JOIN всегда попадут все строки из левой таблицы вне зависимости от условия ON.
Те строки, для которых условие ON выполняется хотя бы раз
В результирующей таблице встретятся ровно столько раз, сколько сработало условие ON
Те строки, для которых условие ON ни разу не выполнилось
Задача
Вывести клиентов (customer_rk) с количеством их действующих рублевых депозитов, причём только тех клиентов, у которых есть хотя бы один такой депозит.
Подсказка: соединения таблиц вам пока не понадобятся.
Задача
Вывести клиентов (customer_rk) с количеством их действующих рублевых депозитов, причём только тех клиентов, у которых есть хотя бы один такой депозит.
Задача
Вывести всех клиентов (customer_rk) с количеством их действующих рублевых депозитов.
Задача
Задача
Вывести всех клиентов (customer_rk) с количеством их действующих рублевых депозитов и количеством их действующих долларовых депозитов.
Задача
RIGHT JOIN соединение
Декартово произведение с фильтром и дополнительным множеством из правой таблицы называется RIGHT OUTER JOIN. Или RIGHT JOIN.
�select a.customer_rk, first_nm, balance_amt �from asql.TEST_TABLE02 a RIGHT JOIN asql.TEST_TABLE03 b� on a.customer_rk = b.customer_rk;
�RIGHT JOIN - это тоже самое что и LEFT JOIN, но для правой таблицы.
RIGHT JOIN
RIGHT JOIN - зеркальное отражение LEFT
A RIGHT JOIN B = B LEFT JOIN A
RIGHT JOIN
RIGHT JOIN - зеркальное отражение LEFT
Почему в зеркале лево/право меняется местами, а верх и низ - нет?
A RIGHT JOIN B = B LEFT JOIN A
RIGHT JOIN vs LEFT JOIN
RIGHT JOIN всегда можно заменить на LEFT JOIN.
Старайтесь избегать RIGHT JOIN там, где есть возможность использовать LEFT JOIN. “Левое” соединение интуитивно более понятно и гораздо легче читается в коде, чем “правое”. Ведь читаем мы слева направо.
OUTER JOIN соединение
Декартово произведение с фильтром и дополнительным множеством из обеих таблиц называется FULL OUTER JOIN. Или OUTER JOIN. Или FULL JOIN.
select a.customer_rk, first_nm, balance_amt �from asql.TEST_TABLE02 a OUTER JOIN asql.TEST_TABLE03 b� on a.customer_rk = b.customer_rk;��Из левой таблицы берутся строки для которых не нашлось ни одного совпадения по условию ON. Для таких записей поля, соответствующие правой таблице, заполняются значениями NULL. ��Из правой таблицы берутся строки для которых не нашлось ни одного совпадения по условию ON. �Для таких записей поля, соответствующие левой таблице, заполняются значениями NULL.
OUTER JOIN
В результат попадет декартово произведение, где останутся
Плюс
Вопрос
Таблица�N строк
Таблица�??? строк
FULL JOIN
Таблица�M строк
Задача 3.1
Вывести текущее состояние клиентов (customer_rk + ФИО) с указанием “степени популярности” их ФИО.
Степень популярности - это количество таких ФИО среди всех клиентов на текущий момент времени.
Задача 3.2
На каждую дату вывести количество открытых, но еще не закрытых депозитов к этой дате включительно. Даты: включительно с даты открытия первого счета по сегодня. Пролонгированный депозит считается открытым.
Примечание. Не в каждую дату происходит открытие или закрытие депозита. Даже если этого не произошло, дата все равно должна попасть в итоговый список.
Задача 3.3
Для каждого года вывести количество
Пролонгация - новый период действия старого депозита.