Урок 5.2: INNER JOIN - Соединение совпадающих строк
В предыдущем уроке мы изучили фундаментальную концепцию соединения таблиц для получения связанных данных. Самый распространенный и часто используемый тип соединения - это INNER JOIN. В этом уроке мы подробно рассмотрим его логику, синтаксис и практическое применение.
Что такое 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
Стандартный синтаксис для 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даст один и тот же результат.
Практические примеры (база данных Sakila)
1. Соединение городов и стран
Таблица 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;
Этот запрос возвращает только те города, которые связаны с существующей страной.
2. Список сотрудников и их адресов
Чтобы узнать, где живет каждый сотрудник, мы соединяем таблицы 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 - это тип соединения по умолчанию в SQL.
- Он возвращает строки только тогда, когда есть совпадение в обеих таблицах.
- Строки, которые не соответствуют условию соединения, отбрасываются из результата.
- Вы можете соединять несколько таблиц, добавляя последующие операторы
INNER JOIN. - Использование псевдонимов таблиц (
AS ci,AS co) делает сложные соединения более читаемыми.