Эти два оператора в SQL на первый взгляд делают похожее — они «объединяют» таблицы. Но делают это по-разному и для разных целей.
Вкратце: JOIN объединяет по горизонтали (добавляются столбцы из разных таблиц), тогда как UNION объединяет по вертикали (добавляются строки из разных запросов).
JOIN — склеиваем строки по какому-то условию
JOIN берёт строки из одной таблицы и дополняет их данными из другой. Главное — задать условие, по которому строки связаны (ON ...). Можно так склеить столбцы из большого числа таблиц.
Оператор JOIN имеет много вариаций, все описаны подробно здесь.
UNION — просто склеиваем выборки
UNION берёт результаты двух запросов и объединяет их в один список. Таблицы не обязательно связаны, но важно, чтобы в обоих подзапросах было одинаковое количество столбцов и совместимые типы.
Например, у нас есть две таблицы «online sales» и «offline sales»:
online_sales
| product | revenue |
|---|---|
| Phone | 1000 |
| Laptop | 2000 |
offline_sales
| product | revenue |
|---|---|
| Monitor | 1500 |
| Laptop | 2000 |
Тогда объединение этих таблиц:
|
1 2 3 |
SELECT product, revenue FROM online_sales UNION SELECT product, revenue FROM offline_sales; |
| product | revenue |
|---|---|
| Phone | 1000 |
| Laptop | 2000 |
| Monitor | 1500 |
Обратите внимание, что в объединение таблиц не вошли дубликаты. Если дубликаты отсекать не нужно, то используйте UNION ALL.
|
1 2 3 |
SELECT product, revenue FROM online_sales UNION ALL SELECT product, revenue FROM offline_sales; |
| product | revenue |
|---|---|
| Phone | 1000 |
| Laptop | 2000 |
| Monitor | 1500 |
| Laptop | 2000 |