LEFT JOIN
LEFT JOIN оставляет все строки левой таблицы, даже если справа нет пары. Для таких строк столбцы правой таблицы заполнены NULL. В уроке работаем с tutorial.crunchbase_companies и tutorial.crunchbase_acquisitions.
Сначала INNER JOIN
Заголовок раздела «Сначала INNER JOIN»Посмотрим на обычное соединение компаний и покупок:
SELECT companies.permalink AS companies_permalink, companies.name AS companies_name, acquisitions.company_permalink AS acquisitions_permalink, acquisitions.acquired_at AS acquired_dateFROM tutorial.crunchbase_companies companiesJOIN tutorial.crunchbase_acquisitions acquisitions ON companies.permalink = acquisitions.company_permalinkORDER BY 1LIMIT 10;Одна компания может появиться в списке дважды. Так бывает, если у неё две записи о покупке. Обе записи присоединяются к строке компании.
Тот же запрос как LEFT JOIN
Заголовок раздела «Тот же запрос как LEFT JOIN»SELECT companies.permalink AS companies_permalink, companies.name AS companies_name, acquisitions.company_permalink AS acquisitions_permalink, acquisitions.acquired_at AS acquired_dateFROM tutorial.crunchbase_companies companiesLEFT JOIN tutorial.crunchbase_acquisitions acquisitions ON companies.permalink = acquisitions.company_permalinkORDER BY 1LIMIT 10;Теперь в результате много строк с NULL в столбцах acquisitions_permalink и acquired_date. Это компании, которых никто не купил.
Правило: LEFT JOIN возвращает все строки таблицы из FROM, независимо от того, есть ли пара в таблице из LEFT JOIN.
Строки без пары
Заголовок раздела «Строки без пары»Частый приём: найти строки левой таблицы, у которых нет пары. Для этого фильтруем NULL из правой таблицы:
SELECT companies.permalink, companies.nameFROM tutorial.crunchbase_companies companiesLEFT JOIN tutorial.crunchbase_acquisitions acquisitions ON companies.permalink = acquisitions.company_permalinkWHERE acquisitions.company_permalink IS NULLLIMIT 10;Практика
Заголовок раздела «Практика»Решайте сами, без AI. Сначала напишите запрос, потом сверьтесь с проверкой, и только потом открывайте решение.
Задание 1
Заголовок раздела «Задание 1»Выполните INNER JOIN таблиц tutorial.crunchbase_acquisitions и tutorial.crunchbase_companies. Вместо списка строк посчитайте непустые значения ключа в каждой таблице.
Проверка: обе колонки равны 5941.
Решение
SELECT COUNT(companies.permalink) AS companies_rowcount, COUNT(acquisitions.company_permalink) AS acquisitions_rowcountFROM tutorial.crunchbase_companies companiesJOIN tutorial.crunchbase_acquisitions acquisitions ON companies.permalink = acquisitions.company_permalink;Задание 2
Заголовок раздела «Задание 2»Измените запрос выше на LEFT JOIN. Обратите внимание на разницу в результатах.
Проверка: companies_rowcount — 66562, acquisitions_rowcount — 5941.
Решение
SELECT COUNT(companies.permalink) AS companies_rowcount, COUNT(acquisitions.company_permalink) AS acquisitions_rowcountFROM tutorial.crunchbase_companies companiesLEFT JOIN tutorial.crunchbase_acquisitions acquisitions ON companies.permalink = acquisitions.company_permalink;Задание 3
Заголовок раздела «Задание 3»Посчитайте по штатам число уникальных компаний и число уникальных купленных компаний. Не включайте строки, где штата нет. Отсортируйте по числу купленных компаний от большего к меньшему.
Проверка: первая строка: CA, 12900, 1937. Вторая: MA, 2542, 396.
Решение
SELECT companies.state_code, COUNT(DISTINCT companies.permalink) AS unique_companies, COUNT(DISTINCT acquisitions.company_permalink) AS unique_companies_acquiredFROM tutorial.crunchbase_companies companiesLEFT JOIN tutorial.crunchbase_acquisitions acquisitions ON companies.permalink = acquisitions.company_permalinkWHERE companies.state_code IS NOT NULLGROUP BY 1ORDER BY 3 DESC;