В предыдущем уроке мы изучили фундаментальную концепцию соединения таблиц для получения связанных данных. Самый распространенный и часто используемый тип соединения - это INNER JOIN. В этом уроке мы подробно рассмотрим его логику, синтаксис и практическое применение.
INNER JOIN - это операция, которая объединяет строки из двух таблиц только в том случае, если в обеих таблицах есть совпадающее значение по заданному условию. Если строка в таблице А не имеет соответствующего совпадения в таблице Б, эта строка исключается из результирующего набора. Аналогично, любые строки в таблице Б, которые не соответствуют таблице А, также не попадают в результат.
Представьте это как пересечение двух наборов данных.
Визуализация:
Таблица A (customer) Таблица B (payment)
+----+----------+ +----+----------+
| id | name | | id | amount |
+----+----------+ +----+----------+
| 1 | Alice | <--------> | 1 | 10.00 | (Совпадение!)
| 2 | Bob | | 1 | 15.00 | (Совпадение!)
| 3 | Charlie | | 4 | 20.00 | (Нет совпадения для Charlie или ID 4)
+----+----------+ +----+----------+
В этом примере Charlie исключен, так как у него нет платежей, а платеж с customer_id 4 исключен, так как нет клиента с таким ID.
Стандартный синтаксис для INNER JOIN выглядит так:
SELECT
table1.column1,
table2.column2
FROM
table1
INNER JOIN
table2 ON table1.common_column = table2.common_column;
INNER JOIN: Указывает, что нам нужны только совпадающие строки.ON: Определяет условие для сопоставления (обычно это первичный ключ одной таблицы и внешний ключ другой).Примечание: В большинстве баз данных SQL (таких как MySQL, PostgreSQL и SQL Server) ключевое слово
INNERявляется необязательным. НаписаниеJOINиINNER JOINдаст один и тот же результат.
Таблица city содержит столбец country_id, который ссылается на таблицу country. Чтобы увидеть название города рядом с названием страны, мы используем INNER JOIN.
SELECT
ci.city,
co.country
FROM
city AS ci
INNER JOIN
country AS co ON ci.country_id = co.country_id;
Этот запрос возвращает только те города, которые связаны с существующей страной.
Чтобы узнать, где живет каждый сотрудник, мы соединяем таблицы staff и address.
SELECT
s.first_name,
s.last_name,
a.address,
a.district
FROM
staff AS s
INNER JOIN
address AS a ON s.address_id = a.address_id;
Вы можете последовательно использовать несколько условий INNER JOIN, чтобы собрать информацию из нескольких таблиц сразу. Например, чтобы увидеть, в каких фильмах снимался актер, нам понадобятся три таблицы: actor, film и промежуточная таблица film_actor.
SELECT
a.first_name,
a.last_name,
f.title
FROM
actor AS a
INNER JOIN
film_actor AS fa ON a.actor_id = fa.actor_id
INNER JOIN
film AS f ON fa.film_id = f.film_id
LIMIT 10;
Как это работает:
actor и film_actor по actor_id.film по film_id.INNER JOIN.AS ci, AS co) делает сложные соединения более читаемыми.