Сегодня на 30-ом уроке мы погрузимся в одну из тем работы с базами данных, это объединение таблиц с помощью JOIN. Если вы мечтаете стать полноценным backend-разработчиком, этот урок станет вашим ключом к пониманию сложных запросов.
Зачем нужно объединение таблиц?
Представьте, что вы создаёте интернет-магазин. У вас есть таблица users (пользователи) и orders (заказы). Каждый заказ связан с пользователем через его user_id. Но как вывести список всех заказов с именами пользователей? Вот здесь и пригодится JOIN!
Объединение таблиц позволяет:
- Избежать дублирования данных (например, не хранить имя пользователя в каждой записи заказа).
- Строить гибкие запросы, комбинируя данные из разных таблиц.
- Оптимизировать структуру базы данных (это называется нормализацией).
Типы JOIN: INNER и LEFT
В SQL существует несколько типов объединений, но сегодня мы разберём два самых популярных: INNER JOIN и LEFT JOIN.
INNER JOIN
INNER JOIN возвращает только те строки, где есть совпадение в обеих таблицах. Например, если пользователь не сделал ни одного заказа, он не появится в результате.
Синтаксис:
SELECT столбцы FROM таблица1 INNER JOIN таблица2 ON условие_соединения;
Пример:
Допустим, у нас есть таблицы:
users(id, name)orders(id, user_id, product)
Запрос:
SELECT users.name, orders.product FROM users INNER JOIN orders ON users.id = orders.user_id;
Этот запрос выведет имена пользователей и их заказы, но только для тех, у кого есть заказы.
LEFT JOIN
LEFT JOIN возвращает все строки из левой таблицы (первой в запросе), даже если в правой таблице нет совпадений. Если совпадений нет, поля из правой таблицы будут NULL.
Пример:
Мы хотим вывести всех пользователей, даже если у них нет заказов.
SELECT users.name, orders.product FROM users LEFT JOIN orders ON users.id = orders.user_id;
Здесь в результате будут все пользователи. Если заказов нет, в колонке product будет NULL.
Практические примеры на PHP
Давайте реализуем эти запросы в PHP. Предположим, мы используем PDO для работы с базой данных.
Пример 1: INNER JOIN
<?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->prepare("
SELECT users.name, orders.product
FROM users
INNER JOIN orders ON users.id = orders.user_id
");
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "<h2>Список заказов:</h2>";
echo "<table border='1'>";
echo "<tr><th>Имя</th><th>Товар</th></tr>";
foreach ($results as $row) {
echo "<tr><td>{$row['name']}</td><td>{$row['product']}</td></tr>";
}
echo "</table>";
} catch (PDOException $e) {
die("Ошибка: " . $e->getMessage());
}
?>
Пример 2: LEFT JOIN
<?php
$stmt = $pdo->prepare("
SELECT users.name, orders.product
FROM users
LEFT JOIN orders ON users.id = orders.user_id
");
// Остальной код аналогичен предыдущему примеру
?>
В этом случае в таблице будут все пользователи, включая тех, у кого product = NULL.
Практические задачи
Закрепим знания на реальных кейсах!
Задача 1: Количество заказов каждого пользователя
Напишите запрос, который выведет имя пользователя и количество его заказов. Используйте LEFT JOIN и GROUP BY.
Решение:
SELECT users.name, COUNT(orders.id) AS total_orders FROM users LEFT JOIN orders ON users.id = orders.user_id GROUP BY users.id;
Задача 2: Пользователи без заказов
Найдите всех пользователей, которые не сделали ни одного заказа.
Решение:
SELECT users.name FROM users LEFT JOIN orders ON users.id = orders.user_id WHERE orders.id IS NULL;
Советы
- Всегда проверяйте условие соединения (
ON). Ошибка здесь может привести к некорректным данным или огромному количеству строк. - Используйте алиасы для таблиц, чтобы упростить запрос:
SELECT u.name, o.product FROM users AS u INNER JOIN orders AS o ON u.id = o.user_id;
- Тестируйте запросы в консоли СУБД (например, phpMyAdmin), прежде чем встраивать их в код.
JOIN это мощный инструмент, без которого невозможно представить работу с реляционными базами данных. Практикуйтесь с разными типами соединений и скоро вы будете чувствовать себя уверенно даже в сложных запросах.
Хотите освоить PHP от основ до профессионального уровня? Перейти к полному курсу по PHP для начинающих
Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.


