Объединение трех таблиц в одном запросе SQL может быть очень сложно, если вы не очень хорошо понимаете объединение в SQL. Объединения SQL всегда были сложным не только для новых программистов, но и для профессионалов, которые уже долго занимаются программированием и используют SQL более чем 2 -х до 3 -х лет. Есть достаточно причин, чтобы запутаться командой JOIN в SQL, начиная от различных типов JOIN like INNER и OUTER join, LEFT и RIGHT outer join, CROSS join и т.д. Между всеми этими основами, наиболее важным является регистрация, объединения нескольких таблиц. Если вам нужны данные из нескольких таблиц в одном запросе SELECT, вам нужно использовать либо подзапрос либо JOIN. Большую часть времени мы только соединяем две таблицы, как Employee и Department, но иногда вам может потребоваться присоединение более двух таблиц и наиболее частый случай — объединения трех таблиц в SQL.
В случае присоединения трех таблиц, первая относится к таблице 2, а затем таблица 2 относится к таблице 3. Если вы посмотрите внимательно, то вы обнаружите , что таблица 2 представляет собой присоединенную таблицу, которая содержит первичный ключ из обеих таблиц 1 и 2. Как мы сказали, это может быть очень запутанным, чтобы понять объединение трех или более таблиц.
Мы обнаружили, что понимание отношение таблиц в качестве первичного ключа и внешнего ключа помогает облегчить задачу.
SQL Join также является очень популярной темой в SQL и там всегда были некоторые вопросы из соединений, как разница между INNER и OUTER JOIN, например SQL — запрос с JOIN Employee Department и разница между LEFT и RIGHT OUTER JOIN и т.д. Короче говоря это одна из самых важных тем в SQL как из опыта так и из точки зрения цели.
Единственный способ освоить SQL JOIN, это сделать как можно больше упражнений, насколько это возможно. Если бы вы могли решить большинство головоломок SQL из классической книги Джо Селко, SQL Puzzles and Answers, 2nd edition, вы были бы более уверены в работе с SQL JOIN, хоть это быть две, три или четыре таблицы.
Объединение трех таблиц, синтаксис в SQL
Вот общий синтаксис запроса SQL, чтобы присоединить три или более таблиц. Этот SQL-запрос должен работать во всех основных баз данных, например в базе данных MySQL, Oracle, Microsoft SQLServer, Sybase и PostgreSQL:
SELECT t1.col, t3.col FROM table1 join table2 ON table1.primarykey = table2.foreignkey join table3 ON table2.primarykey = table3.foreignkey
Мы сначала присоединим таблице 2 к таблице 1, которые создадут временную таблицу с комбинированными данными из table1 и table2, а затем присоединим к Table3. Эта формула может быть распространена на более чем 3 -х таблиц в N таблиц, Вам просто нужно убедиться, что SQL — запрос должен иметь N-1 join, чтобы присоединить N таблиц. Как для объединения двух таблиц мы требуем 1 join а для присоединения 3 таблиц нам нужно 2 join.
Вот хорошая схема, которая хорошо показывает, как применять различные типы присоединений, например как работают в SQL inner, left outer, right outer и cross joins:
SQL запрос по присоединению трех таблиц в MySQL
Для того, чтобы лучше понять присоединение 3 таблицы в SQL запросе, давайте рассмотрим пример. Рассмотрим популярный пример Employee и Department. В нашем случае мы использовали таблицу ссылок под названием Register, который связывает или имеет отношение Employee для Department. Первичный ключ таблицы Employee (emp_id) является внешним ключом в Register и аналогичным образом, первичный ключ таблицы Department (dept_id) является внешним ключом в таблице Register.
Для того , чтобы написать запрос SQL для печати имя сотрудника и название отдела мы должны присоединиться к трем таблицам. Первое присоединение Employee и Register и создают временную таблицу, с колонкой dept_id. Теперь второе присоединение таблицы Department к этой временной таблицы по колонке dept_id, чтобы получить желаемый результат. Вот полный SELECT, пример SQL — запроса, чтобы присоединиться к 3 таблицам, и она может быть расширена, чтобы присоединиться к более чем 3 или N таблицам.
mysql> SELECT * FROM Employee; +--------+----------+--------+ | emp_id | emp_name | salary | +--------+----------+--------+ | 1 | Антон | 1900 | | 2 | Макс | 3800 | | 3 | Артем | 5500 | | 4 | Дмитрий | 7600 | +--------+----------+--------+ 4 rows IN SET (0.00 sec) mysql> SELECT * FROM Department; +---------+-----------+ | dept_id | dept_name | +---------+-----------+ | 101 | Sales | | 102 | Marketing | | 103 | Finance | +---------+-----------+ 3 rows IN SET (0.00 sec) mysql> SELECT * FROM Register; +--------+---------+ | emp_id | dept_id | +--------+---------+ | 1 | 101 | | 2 | 102 | | 3 | 103 | | 4 | 102 | +--------+---------+ 4 rows IN SET (0.00 sec) mysql> SELECT emp_name, dept_name FROM Employee e JOIN Register r ON e.emp_id=r.emp_id JOIN Department d ON r.dept_id=d.dept_id; +----------+-----------+ | emp_name | dept_name | +----------+-----------+ | Антон | Sales | | Макс | Marketing | | Артем | Finance | | Дмитрий | Marketing | +----------+-----------+ 4 rows IN SET (0.01 sec)
Если вы хотите понять это лучше, попытайтесь объединить таблицы шаг за шагом. Таким образом, вместо того, чтобы присоединиться 3 таблицы за один раз, сначала соединить 2 таблицы и посмотреть, как будет выглядеть таблица результатов. Это все о том, как присоединить три таблицы в одном запросе SQL в реляционной базе данных. Кстати, в этом примере SQL JOIN, мы использовали ANSI SQL, и он будет работать в другой реляционной базы данных, а также, Oracle, SQL Server, Sybase, PostgreSQL и т.д. Дайте нам знать, если вы сталкивались с какой — либо проблемой во время объединения 3 таблицы запросом JOIN в любой другой базе данных.
Выводы
- JOIN-ы с несколькими таблицами — это расширение базового JOIN.
Чтобы объединить три таблицы, вы используете два JOIN-оператора — каждый связывает следующую таблицу по ключевому полю. - Понимание связей между таблицами обязательно.
Чтобы присоединение работало, между таблицами должны быть общие поля (например, первичный ключ и внешний ключ). - Тип JOIN важен для результата.
В примере используетсяINNER JOIN— он возвращает только совпадающие строки из всех таблиц. Но вы можете использовать такжеLEFT JOIN,RIGHT JOINили их комбинации — в зависимости от задачи. - Подход работает не только для трех таблиц.
Концепция масштабируется: для N таблиц нужно N−1 JOIN. - JOIN эффективнее подзапросов.
Вместо вложенных SELECT-ов лучше использовать JOIN-ы для объединения данных из нескольких таблиц — это читабельнее и зачастую быстрее.
FAQ
Можно ли присоединить три таблицы без использования JOIN?
Да — можно использовать старый стиль через WHERE, например:
SELECT s.*, m.*, d.* FROM student s, marks m, details d WHERE s.s_id=m.s_id AND m.school_id=d.school_id;
Но это менее явно и чаще приводит к ошибкам.
Что делать, если связи между таблицами косвенные?
Если таблица A связана с B, а B — с C (как в примере со Employee–Register–Department), то нужно обязательно проходить через «среднюю» таблицу:
FROM A JOIN B ON A.key = B.key JOIN C ON B.key2 = C.key2;
Просто так JOIN A и C напрямую без связи работать не будет.
Как выбрать только определённые поля, а не SELECT *?
Лучше перечислять поля явно — это улучшит читаемость и производительность. Например:
SELECT e.emp_name, d.dept_name FROM Employee e JOIN Register r ON e.emp_id=r.emp_id JOIN Department d ON r.dept_id=d.dept_id;
Это именно то, что показано в статье.
Разные типы JOIN — когда применять?
Выбор зависит от того, хотите ли вы включать записи без соответствующих данных в остальных таблицах.
- INNER JOIN — возвращает только совпадающие строки во всех таблицах.
- LEFT JOIN — сохраняет все строки из первой таблицы, даже без совпадений.
- RIGHT JOIN — сохраняет все строки из правой таблицы.
Можно ли соединить больше трёх таблиц?
Да, по той же логике: для 4 таблиц нужно три JOIN и так далее. Главное — обеспечить корректные условия ON между таблицами.
