Перейти к содержимому
TelegramGitHub

UNION

JOIN добавляет столбцы из другой таблицы. UNION добавляет строки. Он ставит результат одного запроса под результатом другого. Работаем с таблицами tutorial.crunchbase_investments_part1 и tutorial.crunchbase_investments_part2. Это две половины таблицы инвестиций Crunchbase: первая содержит компании на буквы от A до L, вторая — от M до Z.

SELECT *
FROM tutorial.crunchbase_investments_part1
UNION
SELECT *
FROM tutorial.crunchbase_investments_part2;

UNION убирает полные дубликаты. Если строка из второго запроса точно совпадает со строкой из первого, останется одна.

UNION ALL оставляет все строки, ничего не убирает.

SELECT *
FROM tutorial.crunchbase_investments_part1
UNION ALL
SELECT *
FROM tutorial.crunchbase_investments_part2;

Проверим на наших данных:

ЗапросЧисло строк
UNION ALL168647
UNION168591

Разница в 56 строк — полные дубликаты внутри данных. UNION их убрал.

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

Каждый SELECT пишется отдельно. Поэтому можно по-разному фильтровать части:

SELECT company_permalink,
company_name,
investor_name
FROM tutorial.crunchbase_investments_part1
WHERE company_name ILIKE 'A%'
UNION ALL
SELECT company_permalink,
company_name,
investor_name
FROM tutorial.crunchbase_investments_part2
WHERE company_name ILIKE 'Z%';

Решайте сами, без AI. Сначала напишите запрос, потом сверьтесь с проверкой, и только потом открывайте решение.

Объедините две таблицы инвестиций через UNION ALL, сохранив дубликаты. Из первой таблицы возьмите компании с названием на букву D, из второй — на букву T (без учёта регистра). Оставьте столбцы company_permalink, company_name и investor_name.

В оригинальном курсе брали буквы T и M. В наших данных первая часть содержит A–L, а вторая M–Z. Поэтому мы выбрали D и T.

Проверка: 15710 строк (5680 из первой части и 10030 из второй).

Решение
SELECT company_permalink,
company_name,
investor_name
FROM tutorial.crunchbase_investments_part1
WHERE company_name ILIKE 'D%'
UNION ALL
SELECT company_permalink,
company_name,
investor_name
FROM tutorial.crunchbase_investments_part2
WHERE company_name ILIKE 'T%';

Напишите запрос с тремя столбцами. Первый — из какой части данные (investments_part1 или investments_part2). Второй — статус компании. Третий — число уникальных инвесторов. Подсказка: понадобится таблица tutorial.crunchbase_companies и группировка по статусу и части данных.

Проверка: 8 строк (4 статуса на 2 части). Для investments_part1: acquired — 3955, closed — 3060, ipo — 1226, operating — 16912.

Решение
SELECT 'investments_part1' AS dataset_name,
companies.status,
COUNT(DISTINCT investments.investor_permalink) AS investors
FROM tutorial.crunchbase_companies companies
LEFT JOIN tutorial.crunchbase_investments_part1 investments
ON companies.permalink = investments.company_permalink
GROUP BY 1, 2
UNION ALL
SELECT 'investments_part2' AS dataset_name,
companies.status,
COUNT(DISTINCT investments.investor_permalink) AS investors
FROM tutorial.crunchbase_companies companies
LEFT JOIN tutorial.crunchbase_investments_part2 investments
ON companies.permalink = investments.company_permalink
GROUP BY 1, 2
ORDER BY 1, 2;