Внутреннее объединение в PostgreSQL

Читать первым в Telegram

Данная статья относится к циклу статей, посвященных PostgreSQL. В предыдущей статье мы говорили об объединениях в PostgreSQL. Теперь же мы углубимся в изучение каждого объединения PostgreSQL по отдельности. Начнём со внутреннего объединения, именуемого INNER JOIN, при помощи которого мы будем выбирать данные из нескольких таблиц.

Введение в условие PostgreSQL INNER JOIN

В предыдущих уроков мы научились выбирать данные из таблицы, необходимые нам столбцы и строки, а также сортировать результирующий набор в определённом порядке.

Настало время перейти к важнейшей концепции баз данных, называемой объединением, которая позволяет связывать данные одной таблицы с данными других таблиц. Существует несколько видов объединений: INNER JOIN, OUTER JOIN и self-join. В данном руководстве мы сфокусируемся на INNER JOIN.

Предположим вам необходимо получить данные из таблиц A и B. Таблица B содержит поле fka, которое относится к первичному ключу таблицы A.

Чтобы получить данные из обеих таблиц, используйте условие INNER JOIN в вызове оператора SELECT следующим образом:

SELECT
    A.pka,
    A.c1,
    B.pkb,
    B.c2
FROM
    A
INNER JOIN B ON A .pka = B.fka;

Чтобы объединить таблицу A с таблицей B, вам необходимо:

  • Во-первых, указать столбцы обеих таблиц, из которых вы хотите выбрать данные в условии SELECT.
  • Во-вторых, указать главную таблицу, то есть A, в условии FROM.
  • В-третьих, указать таблицу, с которой вы объединяете главную таблицу, то есть B, в условии INNER JOIN. Кроме того, вы устанавливаете условие объединения после ключевого слова ON, то есть A.pka = B.fka.

Для каждой строки таблицы A, PostgreSQL анализирует таблицу B, чтобы проверить, существует ли какая-либо строка, удовлетворяющая условию, то есть A.pka = B.fka. Если такая строка найдена, то PostgreSQL объединяет столбцы обеих строк в одну и добавляет объединенную строку в возвращаемый набор результатов.

Первичный ключ столбца (pka) и внешний ключ столбца (fka) обычно индексируются, следовательно, PostgreSQL должен проверять только соответствие в индексах, что делает его невероятно быстрым.

Порой, таблицы A и B могут иметь столбцы с одинаковыми именами, поэтому мы должны ссылаться на столбец как table_name.column_name (имя_таблицы.имя_столбца), чтобы избежать неоднозначности. Если имя таблицы достаточно длинное, вы можете использовать псевдоним таблицы, например, tbl, и ссылаться на столбец как tbl.column_name.

Следующая диаграмма Венна иллюстрирует работу условия PostgreSQL INNER JOIN:

Условие INNER JOIN вернёт строки таблицы A, имеющие соответствующие строки в таблице B.

Примеры использования условия PostgreSQL INNER JOIN

Пример использования условия PostgreSQL INNER JOIN для объединения двух таблиц

В качестве примера возьмём таблицы customer и payment из примера базы данных.

Каждый клиент может иметь как множество платежей, так и ни одного. Каждый платёж относится к одному и только одному клиенту. Поле customer_id устанавливает связь между двумя таблицами.

Используйте условие INNER JOIN для объединения таблицы клиентов с таблицей платежей следующим образом:

SELECT
    customer.customer_id,
    first_name,
    last_name,
    email,
    amount,
    payment_date
FROM
    customer
INNER JOIN payment ON payment.customer_id = customer.customer_id;

Вы можете добавить условие ORDER BY для сортировки набора результатов по customer_id, как показано ниже:

SELECT
    customer.customer_id,
    first_name,
    last_name,
    email,
    amount,
    payment_date
FROM
    customer
INNER JOIN payment ON payment.customer_id = customer.customer_id
ORDER BY
    customer.customer_id;

Для фильтрации клиентов, используйте условие WHERE. Следующий запрос возвращает данные об аренде для клиента с идентификатором 2:

SELECT
    customer.customer_id,
    first_name,
    last_name,
    email,
    amount,
    payment_date
FROM
    customer
INNER JOIN payment ON payment.customer_id = customer.customer_id
WHERE
    customer.customer_id = 2;

Пример использования условия PostgreSQL INNER JOIN для объединения трёх таблиц

Следующая диаграмма отображает отношения между тремя таблицами: staff (персонал), payment (платёж), customer (клиент).

  • Каждый сотрудник может быть связан как с множеством платежей, так и не связан вообще ни с каким.
  • Каждый платёж обрабатывается одним и только одним сотрудником.

Для их объединения нам необходимо добавить второе условие INNER JOIN после первого INNER JOIN следующим образом:

SELECT
    customer.customer_id,
    customer.first_name customer_first_name,
    customer.last_name customer_last_name,
    customer.email,
    staff.first_name staff_first_name,
    staff.last_name staff_last_name,
    amount,
    payment_date
FROM
    customer
INNER JOIN payment ON payment.customer_id = customer.customer_id
INNER JOIN staff ON payment.staff_id = staff.staff_id;

Чтобы объединить более трёх таблиц, воспользуйтесь той же самой техникой.

Итак, мы рассмотрели внутреннее объединение и готовы двигаться дальше, к левому объединению.

Источник: PostgreSQL Tutorial from Scratch

Поддержать проект

Социальные сети проекта:

Подпишись, чтобы ничего не пропустить!