PostgreSQL JOIN: Как объединять таблицы в PostgreSQL
PostgreSQL JOIN - это оператор, который позволяет объединять данные из двух или более таблиц в одном запросе. Оператор JOIN используется для соединения таблиц по определенным условиям совпадения.
Существует несколько видов JOIN, таких как INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL OUTER JOIN. Давайте рассмотрим каждый из них более подробно.
INNER JOIN
INNER JOIN также известен как JOIN. Он выбирает строки из двух таблиц, для которых существует соответствующее совпадение в обеих таблицах. Например, давайте рассмотрим две таблицы - users и orders:
users:
id | name | email | phone_number
---+------+-------+-------------
1 | John | john@example.com | 1234567890
2 | Jane | jane@example.com | 2345678901
3 | Eric | eric@example.com | 3456789012
orders:
id | user_id | product_name | quantity
---+---------+--------------+---------
1 | 1 | iPhone 12 | 1
2 | 2 | Samsung S21 | 2
3 | 1 | iPad Pro | 1
4 | 3 | MacBook Air | 1
Мы можем использовать INNER JOIN для объединения этих таблиц по user_id:
SELECT users.name, orders.product_name
FROM users
INNER JOIN orders ON users.id = orders.user_id;
Результат будет следующим:
name | product_name
-----+-------------
John | iPhone 12
Jane | Samsung S21
John | iPad Pro
Eric | MacBook Air
В этом примере мы объединяем таблицы users и orders по user_id и возвращаем данные только для тех строк, где user_id имеет соответствующее значение в обоих таблицах.
LEFT JOIN
LEFT JOIN возвращает все строки из левой таблицы и только те строки из правой таблицы, которые имеют соответствующее значение в левой таблице. Если в правой таблице нет соответствующего значения, то для него будут выбраны значения NULL. Давайте рассмотрим тот же пример, но с использованием LEFT JOIN:
SELECT users.name, orders.product_name
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
Результат будет следующим:
name | product_name
-----+-------------
John | iPhone 12
Jane | Samsung S21
John | iPad Pro
Eric | MacBook Air
NULL | NULL
Здесь мы снова объединяем таблицы users и orders по user_id, но используем LEFT JOIN. Как видите, в результате мы получаем все строки из таблицы users, даже те, которые не имеют соответствующей строки в таблице orders, и для которых значения product_name равны NULL.
RIGHT JOIN
RIGHT JOIN - это оператор, который возвращает все строки из правой таблицы и только те строки из левой таблицы, которые имеют соответствующее значение в правой таблице. Если в левой таблице нет соответствующего значения, то для него будут выбраны значения NULL. Давайте рассмотрим тот же пример, но с использованием RIGHT JOIN:
SELECT users.name, orders.product_name
FROM users
RIGHT JOIN orders ON users.id = orders.user_id;
Результат будет следующим:
name | product_name
------+-------------
John | iPhone 12
Jane | Samsung S21
John | iPad Pro
Eric | MacBook Air
NULL | iPhone 11
Здесь мы объединяем таблицы users и orders по user_id, но используем RIGHT JOIN. В результате мы получаем все строки из таблицы orders, даже те, которые не имеют соответствующей строки в таблице users, и для которых значения name равны NULL.
FULL OUTER JOIN
FULL OUTER JOIN возвращает все строки из обеих таблиц, где имеется соответствующее значение в одной из таблиц. Если в одной из таблиц нет соответствующего значения, то для него будут выбраны значения NULL. Практически никогда не используется в реальной работе, но для примера представим, что мы хотим получить все данные из обоих таблиц.
SELECT users.name, orders.product_name
FROM users
FULL OUTER JOIN orders ON users.id = orders.user_id;
Результат будет следующим:
name | product_name
--------+-------------
John | iPhone 12
Jane | Samsung S21
John | iPad Pro
Eric | MacBook Air
NULL | iPhone 11
NULL | NULL
В этом примере мы сначала объединяем таблицы users и orders по user_id с использованием FULL OUTER JOIN, и затем выводим все строки из обоих таблиц с NULL в случае отсутствия соответствующих значений.
Вот примеры кода на языке SQL для использования JOIN на примере таблицы:
-- Создадим таблицу users
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT,
email TEXT UNIQUE,
phone_number TEXT
);
-- Создадим таблицу orders
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id),
product_name TEXT,
quantity INTEGER
);
-- Вставим некоторые данные в таблицы
INSERT INTO users (name, email, phone_number)
VALUES ('John', 'john@example.com', '1234567890'),
('Jane', 'jane@example.com', '2345678901'),
('Eric', 'eric@example.com', '3456789012');
INSERT INTO orders (user_id, product_name, quantity)
VALUES (1, 'iPhone 12', 1),
(2, 'Samsung S21', 2),
(1, 'iPad Pro', 1),
(3, 'MacBook Air', 1);
-- INNER JOIN
SELECT users.name, orders.product_name
FROM users
INNER JOIN orders ON users.id = orders.user_id;
-- LEFT JOIN
SELECT users.name, orders.product_name
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
-- RIGHT JOIN
SELECT users.name, orders.product_name
FROM users
RIGHT JOIN orders ON users.id = orders.user_id;
-- FULL OUTER JOIN
SELECT users.name, orders.product_name
FROM users
FULL OUTER JOIN orders ON users.id = orders.user_id;
Этот код создаст две таблицы - users и orders, а затем заполнит их данными. Затем мы можем использовать различные операторы JOIN для объединения данных в таблицах.