Как связать 3 таблицы в SQL запросе?
нужно связать таблицу orders (orders.items_id связать с goods.id) структура таблицы :
categories| goods | orders --------- |--------------|------------- id(Pk) | id(Pk) | id(Pk) title | name | items_id ---- | category | ---
Отслеживать
задан 28 фев 2017 в 17:44
111 1 1 золотой знак 1 1 серебряный знак 11 11 бронзовых знаков
покажите структуру самих таблиц в субд
28 фев 2017 в 17:45
@Ep1demic исправил
28 фев 2017 в 17:50
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Если не ошибаюсь
SELECT categories.title, goods.name, goods.id FROM (categories INNER JOIN goods ON categories.id = goods.category) INNER JOIN orders ON orders.items_id = goods.id ORDER BY categories.id;
Отслеживать
ответ дан 28 фев 2017 в 17:55
260 1 1 серебряный знак 8 8 бронзовых знаков
Как присоединить три таблицы в SQL запросе — Пример в MySQL
Объединение трех таблиц в одном запросе SQL может быть очень сложно, если вы не очень хорошо понимаете объединение в SQL. Объединения SQL всегда были сложным не только для новых программистов, но и для профессионалов, которые уже долго занимаются программированием и используют SQL более чем 2 -х до 3 -х лет. Есть достаточно причин, чтобы запутаться в SQL 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 в любой другой базе данных.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Выборка данных из нескольких таблиц (JOIN)
Довольно часто приходится выбирать данные из нескольких таблиц. Для показа в одном запросе данных из нескольких таблиц Oracle позволяет выполнять так называемые соединения таблиц. Имеется два относящихся к соединению таблиц правила, о которых следует постоянно помнить. Данные из двух (или нескольких) таблиц могут быть объединены в том случае, если у обеих таблиц имеется совпадающий столбец (с тем же самым или с другим именем) и этот столбец в одной из таблиц является первичным ключом (или частью этого ключа).
Давайте рассмотрим пример оператора соединения (join), использующего традиционный синтаксис Oracle, где мы объединяем вместе содержимое таблиц emp и dept для получения перечня всех сотрудников и названий отделов, где они работают:
SELECT e.ename, e.deptno, d.dname FROM emp e, dept d WHERE e.deptno = d.deptno;
| ENAME | DEPTNO | DNAME |
|---|---|---|
| CLARK | 10 | ACCOUNTING |
| KING | 10 | ACCOUNTING |
| MILLER | 10 | ACCOUNTING |
| JONES | 20 | RESEARCH |
| FORD | 20 | RESEARCH |
| ADAMS | 20 | RESEARCH |
| SMITH | 20 | RESEARCH |
| SCOTT | 20 | RESEARCH |
| WARD | 30 | SALES |
| TURNER | 30 | SALES |
| ALLEN | 30 | SALES |
| JAMES | 30 | SALES |
| BLAKE | 30 | SALES |
| MARTIN | 30 | SALES |
Обратите внимание на многие важные компоненты этого соединения таблиц. Использование во фразе FROM двух таблиц четко указывает на то, что имеет место соединиения таблиц. Обратите также внимание на то, что перед именем каждой таблицы присутствует буква: e для таблицы emp или d для таблицы dept. Это служит иллюстрацией интересной концепции – столбцы могут иметь псевдонимы точно так же, как их имеют таблицы. Псевдонимы служат важной цели – они не дают Oracle запутаться в том, какую таблицу использовать при выводе данных в столбец deptno. Вспомните, что в обеих таблицах (emp и dept) имеются столбцы с именем deptno.
Неоднозначности при соединении таблиц можно также избежать, если в качестве префикса перед именем столбца указать имена таблиц.
SELECT emp.ename, emp.deptno, dept.dname FROM emp, dept WHERE emp.deptno = dept.deptno;
Заметьте, что в нашу фразу WHERE включено сравнение по полю deptno, соединяющему данные в emp с данными в dept. В случае отсутствия этой связи в выходные данные были вы включены все данные из emp и dept.
Синтаксис соединения по ANSI/ISO
В соответствии с синтаксисом ANSI/ISO, для того, чтобы соединить содержимое двух таблиц для получения единого результата, мы должны включить в SQL-оператор фразу JOIN имятаблицы ON условиесоединения. Если вы хотите в соответствии с этим синтаксисом выполнить то же соединение таблиц, которое мы делали раньше, наш оператор будет выглядеть следующим образом:
SELECT ename, emp.deptno, dname FROM emp JOIN dept ON emp.deptno = dept.deptno;
| ENAME | DEPTNO | DNAME |
|---|---|---|
| CLARK | 10 | ACCOUNTING |
| KING | 10 | ACCOUNTING |
| MILLER | 10 | ACCOUNTING |
| JONES | 20 | RESEARCH |
| FORD | 20 | RESEARCH |
| ADAMS | 20 | RESEARCH |
| SMITH | 20 | RESEARCH |
| SCOTT | 20 | RESEARCH |
| WARD | 30 | SALES |
| TURNER | 30 | SALES |
| ALLEN | 30 | SALES |
| JAMES | 30 | SALES |
| BLAKE | 30 | SALES |
| MARTIN | 30 | SALES |
Обратите внимание на различия между этим синтаксисом и синтаксисом Oracle. Во-первых, в синтаксисе ANSI/ISO сравнения, используемые для соединения, отделяются от всех остальных сравнений с помощью специального ключевого слова ON, указывающего на то, что именно это сравнение используется для соединения. Вы по-прежнему можете включать в соответствующие ANSI/ISO запросы на соединение фразу WHERE. Единственное отличие состоит в том, что фраза WHERE теперь будет содержать только дополнительные операторы сравнения, используемые дл дополнительной фильтрации данных. Кроме того, вы не должны теперь указывать во фразе FROM имена всех объединяемых таблиц. Вместо этого сразу же после фразы FROM вы должны использовать фразу JOIN, в которой и будут определены имена всех соединяемых таблиц.
Естественные соединения (NATURAL JOIN)
Естественным соединением называется соединение между двумя таблицами, в котором Oracle соединяет таблицы по одинаково называющемуся столбцу (столбцам) обеих таблиц (естественным образом!). Естественное соединение выполняется в том случае, если указано ключевое слово NATURAL.
Единственным совпадающим столбцом для таблиц emp и dept является столбец depnto,
SELECT ename, deptno, dname FROM emp NATURAL JOIN dept ORDER BY deptno;
| ENAME | DEPTNO | DNAME |
|---|---|---|
| CLARK | 10 | ACCOUNTING |
| KING | 10 | ACCOUNTING |
| MILLER | 10 | ACCOUNTING |
| JONES | 20 | RESEARCH |
| FORD | 20 | RESEARCH |
| ADAMS | 20 | RESEARCH |
| SMITH | 20 | RESEARCH |
| SCOTT | 20 | RESEARCH |
| WARD | 30 | SALES |
| TURNER | 30 | SALES |
| ALLEN | 30 | SALES |
| JAMES | 30 | SALES |
| BLAKE | 30 | SALES |
| MARTIN | 30 | SALES |
Нетрудно заменить, что естественные соединения позволяют в значительной степени упростить запросы с соединением за счет устранения псевдонимов таблиц и сравнений дл соединения.
Tags: Выборка данных из нескольких таблиц, JOIN
PL/SQL
tags: Администрирование Oracle DataBase || SQL & PL/SQL
Исходные коды проекта хранятся на github. Можете заводить Issue и Discussions, при необходимости.
Чтобы задать вопрос, добавить свои знания, исправить ошибки и неточности, пишите в телеграм чате.
Соединение таблиц по нескольким столбцам (визуальные инструменты для баз данных)
Таблицы можно соединять по нескольким столбцам. То есть можно создать запрос, который будет сопоставлять строки из двух таблиц, только если они удовлетворяют нескольким условиям. Если база данных содержит связь, которая сопоставляет несколько столбцов с внешними ключами в одной таблице первичному ключу из нескольких столбцов в другой, эту связь можно использовать для соединения по нескольким столбцам. Дополнительные сведения см. в статье Автоматическое соединение таблиц (визуальные инструменты для баз данных).
Даже если база данных не содержит связь с несколькими внешними ключами, соединение можно создать вручную.
Самостоятельное создание соединения по нескольким столбцам
- Добавьте на панель диаграммы таблицы, которые нужно соединить.
- Перетащите имя первого столбца соединения из окна первой таблицы на соответствующий столбец в окне второй таблицы. Соединение нельзя основывать на столбцах типа text, ntext или image.
Примечание Обычно столбцы соединения должны быть одного типа данных (или совместимых типов). Например, если столбец соединения в первой таблице содержит дату, его нужно связать со столбцом второй таблицы, также содержащем дату. С другой стороны, если первый столбец соединения содержит целые числа, связываемый с ним столбец также должен относиться к целочисленному типу данных, однако размер у него может быть другим. Однако могут быть случаи, когда благодаря неявному преобразованию типов можно соединить внешне несовместимые столбцы. Конструктор запросов и представлений не будет проверять типы данных соединяемых столбцов, но при выполнении запроса база данных отобразит ошибку, если типы данных несовместимы.
