Объединение таблиц при запросе (JOIN) в SQL

С помощью команды SELECT можно выбрать данные не только из одной таблицы, но и нескольких. Такая задача появляется довольно часто, потому что принято разносить данные по разным таблицам в зависимости от хранимой в них информации. К примеру, в одной таблице хранится информация о пользователях, во второй таблице о должностях компании, а в третьей и четвёртой о поставщиках и клиентах. Данные разбивают на таблицы так, чтобы с одной стороны получить самую высокую скорость выполнения запроса, а с другой стороны избежать ненужных объединений, которые снижают производительность.

Чем больше столбцов в таблице — тем сильнее падает скорость выборки из неё. Поэтому стараются делать в каждой таблице не больше 5-10 столбцов. Но чем сильнее данные разбиваются на разные таблицы, тем больше придётся делать объединений внутри запросов, что тоже снизит скорость получения выборки и увеличит нагрузку на базу.

Приведём пример запроса с объединением данных из двух таблиц. Для этого предположим, что существует две таблицы. Первая таблица будет иметь название USERS и будет иметь два столбца: ID и именами пользователей:

+-----------+
|   USERS   |
+-----------+
| ID | NAME |
+----+------+
| 1  | Мышь |
+----+------+
| 2  | Кот  |
+----+------+

Вторая таблица будет называться FOOD и будет содержать два столбца: USER_ID и NAME. В этой таблице будет содержаться список любимых блюд пользователей из первой таблицы. В столбце USER_ID содержится ID пользователя, а в столбце PRODUCT находится название любимого блюда.

+-------------------+
|        FOOD       |
+-------------------+
| USER_ID | PRODUCT |
+---------+---------+
| 1       | Сыр     |
+---------+---------+
| 2       | Молоко  |
+---------+---------+

Условимся что поле ID в таблице USERS и поле USER_ID в таблице FOOD являются первичными ключами (то есть имеют уникальные значения, которые не повторяются). Теперь попробуем использовать логику и найти любимое блюдо пользователя «Мышь», используя обе таблицы. Для этого мы сначала посмотрим в первую таблицу и найдём ID пользователя под именем «Мышь», а затем найдём название продукта под таким же ID во второй таблице. Объединяющие SQL запросы работают по такой же логике: нужен столбец, в по которому таблицы могут быть объединены.

Продемонстрируем запрос, объединяющий таблицы по столбцам ID и USER_ID:

SELECT * FROM `USERS` INNER JOIN `FOOD` ON `USERS`.`ID`=`FOOD`.`USER_ID`;

Разберём команду по словам. Начинается она как обычная выборка из одной таблицы со слов «SELECT * FROM USERS». Но затем идёт слово INNER, которое означает тип объединения. Существует три типа объединения таблиц: INNER, LEFT, RIGHT. Все они связаны с тем, что некоторым строкам в одной таблице может не найтись соответствующей строки во второй таблице. В таком случае при использовании «INNER» из результатов запроса будет удалены все строки, которым не нашлась соответствующая пара в другой таблице.

Если же использовать вместо «INNER» слово «LEFT» или «RIGHT», то будут удалены строки, которые не нашли совпадение из первой (левой) или второй (правой) таблицы.

После слова «INNER» стоит слово «JOIN» (которое переводится с английского как «ПРИСОЕДИНИТЬ»). После слова «JOIN» стоит название таблицы, которая будет присоединена. В нашем случае это таблица FOOD. После названия таблицы стоит слово «ON» и равенство USERS.ID=FOOD.USER_ID, которое задаёт правило присоединения. При выполнении выборки будут объединены две таблицы так, чтобы значения в столбце ID таблицы USERS равнялось значению USER_ID таблицы FOOD.

В результате выполнения этого SQL запроса мы получим таблицу с четырьмя столбцами:

+----+------+---------+---------+
| ID | NAME | USER_ID | PRODUCT |
+----+------+---------+---------+
| 1  | Мышь | 1       | Сыр     |
+----+------+---------+---------+
| 2  | Кот  | 2       | Молоко  |
+----+------+---------+---------+

Предлагаем модифицировать запрос, потому что нам не нужны все четыре столбца.

Уберём столбцы ID и USER_ID. Для этого вместо * в команде SELECT поставим название столбцов. Но необходимо сделать это, ставя сначала название таблицы и через точку название столбца. Чтобы получилось так:

SELECT `USERS`.`NAME`, `FOOD`.`PRODUCT` 
FROM `USERS` INNER JOIN `FOOD` ON `USERS`.`ID`=`FOOD`.`USER_ID`;

Теперь результат будет компактнее. И благодаря уменьшенному количеству запрашиваемых данных, результат будет получаться из базы быстрее:

+------+---------+
| NAME | PRODUCT |
+------+---------+
| Мышь | Сыр     |
+------+---------+
| Кот  | Молоко  |
+------+---------+

Если в двух таблицах имеются столбцы с одинаковыми названиями, то будет показан только последний столбце с таким названием. Чтобы этого не происходило, выбирайте определённый столбцы и используйте команду «AS» с помощью которой можно переименовать столбец в результатах выборки.

Давайте теперь решим логическую задачу, которую поставили в начале статьи. Попробуем выбрать в этой объединённой таблице только одну строку, которая соответствует пользователю «Мышь». Для этого используем условие WHERE в SQL запросе:

SELECT `USERS`.`NAME`, `FOOD`.`PRODUCT` 
FROM `USERS` INNER JOIN `FOOD` ON `USERS`.`ID`=`FOOD`.`USER_ID`
WHERE `USERS`.`NAME` LIKE 'Мышь';

Обратите внимание, что в условии WHERE название полей так же необходимо ставить вместе с названием таблицы через точку: USERS.NAME. В результате выполнения этого запроса появится такой результат:

+------+---------+
| NAME | PRODUCT |
+------+---------+
| Мышь | Сыр     |
+------+---------+

Отлично! Теперь мы знаем, как делать объединение таблиц.

Была ли эта статья полезна? Есть вопрос?

Закажите недорогой хостинг Заказать

всего от 290 руб

Многотабличные запросы, оператор JOIN

В предыдущих статьях описывалась работа только с одной таблицей базы данных. В реальности же очень часто приходится делать выборку из нескольких таблиц, каким-то образом объединяя их. В данной статье вы узнаете основные способы соединения таблиц.

Например, если мы хотим получить информацию о тратах на покупки, мы можем её получить следующим образом:

SELECT family_member, amount * unit_price AS price FROM Payments

family_memberprice
12000
22100
3100
4350
4300
5100
2120
25500
5230
32200
266000
140
3100
31200

В поле family_member полученной выборки отображаются идентификаторы записей из таблицы FamilyMembers, но для нас они мало что значат.

Вместо этих идентификаторов было бы гораздо нагляднее выводить имена тех, кто покупал (поле member_name из таблицы FamilyMember). Ровно для этого и существует объединение таблиц и оператор JOIN.

SELECT поля_таблиц
FROM таблица_1
[INNER] | [[LEFT | RIGHT | FULL][OUTER]] JOIN таблица_2
    ON условие_соединения
[INNER] | [[LEFT | RIGHT | FULL][OUTER]] JOIN таблица_n
    ON условие_соединения]

Как можно увидеть по структуре, соединение бывает:

  • внутренним INNER (по умолчанию)
  • внешним OUTER, при этом внешнее соединение делится на левое LEFT, правое RIGHT и полное FULL

С более подробными деталями, чем отличается внутреннее соединение от внешнего и как они работают, мы познакомимся в следующих статьях.

Пока нам достаточно лишь знать, что для вышеописанного примера с запросом на покупки нам понадобится именно запрос с внутренним соединением, который будет выглядеть следующим образом:

SELECT family_member, member_name, amount * unit_price AS price FROM Payments
INNER JOIN FamilyMembers ON Payments. family_member = FamilyMembers.member_id

family_membermember_nameprice
1Headley Quincey2000
2Flavia Quincey2100
3Andie Quincey100
4Lela Quincey350
4Lela Quincey300
5Annie Quincey100
2Flavia Quincey120
2Flavia Quincey5500
5Annie Quincey230
3Andie Quincey2200
2Flavia Quincey66000
1Headley Quincey40
3Andie Quincey100
3Andie Quincey1200

В данном запросе мы сопоставляем записи из таблицы Payments и записи из таблицы FamilyMembers.

Чтобы сопоставление работало, мы указываем как именно записи из двух разных таблиц должны находить друг друга. Это условие указывается после ON:

ON Payments.family_member = FamilyMembers.member_id

В нашем случае поле family_member указывает на идентификатор в таблице FamilyMembers и таким образом помогает однозначному сопоставлению.

В большинстве случаев условием соединения является равенство столбцов таблиц (таблица_1.поле = таблица_2.поле), однако точно так же можно использовать и другие операторы сравнения.

MySQL присоединяется к

❮ Предыдущий Далее ❯


Объединение таблиц MySQL

Предложение JOIN используется для объединения строк из двух или более таблиц на основе связанный столбец между ними.

Посмотрим на выборку из таблицы «Заказы»:

OrderID идентификатор клиента Дата заказа
10308 2 18 сентября 1996 г.
10309 37 1996-09-19
10310 77 1996-09-20

Затем посмотрите на выбор из таблицы «Клиенты»:

CustomerID ИмяКлиента Имя контакта Страна
1 Альфред Футтеркисте Мария Андерс Германия
2 Ана Трухильо Emparedados y helados Ана Трухильо Мексика
3 Антонио Морено Такерия Антонио Морено Мексика

Обратите внимание, что столбец «CustomerID» в таблице «Заказы» относится к «CustomerID» в таблице «Клиенты». Отношения между двумя таблицами выше является столбец «CustomerID».

Затем мы можем создать следующую инструкцию SQL (содержащую ВНУТРЕННЕЕ СОЕДИНЕНИЕ ), который выбирает записи, имеющие совпадающие значения в обеих таблицах:

Пример

SELECT Orders. OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;

Попробуйте сами »

и он выдаст что-то вроде этого:

OrderID ИмяКлиента Дата заказа
10308 Ана Трухильо Emparedados y helados 18.09.1996
10365 Антонио Морено Такерия 27.11.1996
10383 Вокруг Рога 16.12.1996
10355 Вокруг Рога 15.11.1996
10278 Berglunds snabköp 12.08.1996



Поддерживаемые типы соединений в MySQL

  • INNER JOIN : Возвращает записи, имеющие совпадающие значения в обеих таблицах
  • LEFT JOIN : возвращает все записи из левой таблицы и соответствующие записи из правой таблицы
  • RIGHT JOIN : возвращает все записи из правой таблицы и соответствующие записи из левой таблицы
  • CROSS JOIN : Возвращает все записи из обоих столы


Проверьте себя с помощью упражнений

Упражнение:

Вставьте недостающие части в предложение JOIN , чтобы соединить две таблицы Orders и Customers , используя поле CustomerID в обеих таблицах в качестве отношения между двумя таблицами.

ВЫБИРАТЬ *
ОТ заказов
ВЛЕВО ПРИСОЕДИНЯЙТЕСЬ к клиентам
= 
;

Начать упражнение

❮ Предыдущий Следующий ❯


ВЫБОР ЦВЕТА



Лучшие учебники
Учебное пособие по HTML
Учебное пособие по CSS
Учебное пособие по JavaScript
Учебное пособие
Учебное пособие по SQL
Учебное пособие по Python
Учебное пособие по W3.CSS
Учебное пособие по Bootstrap
Учебное пособие по PHP
Учебное пособие по Java
Учебное пособие по C++
Учебное пособие по jQuery

900 Справочник по HTML
Справочник по CSS
Справочник по JavaScript
Справочник по SQL
Справочник по Python
Справочник по W3.CSS
Справочник по Bootstrap
Справочник по PHP
Цвета HTML
Справочник по Java
Справочник по Angular
Справочник по jQuery

Основные примеры
Примеры HTML
Примеры CSS
Примеры JavaScript
Примеры инструкций
Примеры SQL
Примеры Python
Примеры W3. CSS
Примеры Bootstrap
Примеры PHP
Примеры Java
Примеры XML
Примеры jQuery

FORUM | О

W3Schools оптимизирован для обучения и обучения. Примеры могут быть упрощены для улучшения чтения и обучения. Учебники, ссылки и примеры постоянно пересматриваются, чтобы избежать ошибок, но мы не можем гарантировать полную правильность всего содержания. Используя W3Schools, вы соглашаетесь прочитать и принять наши условия использования, куки-файлы и политика конфиденциальности.

Copyright 1999-2023 Refsnes Data. Все права защищены.
W3Schools работает на основе W3.CSS.

Как соединить три таблицы в SQL-запросе – пример MySQL

Три таблицы JOIN, пример SQL

Соединение трех таблиц в одном SQL-запросе может быть очень сложным, если вы плохо разбираетесь в концепции SQL Join. Соединения SQL всегда были сложными не только для новых программистов, но и для многих других, кто занимается программированием и SQL более 2-3 лет. Их достаточно, чтобы запутать кого-то в SQL JOIN, начиная от различных типов SQL JOIN, таких как соединение INNER и OUTER, внешнее соединение LEFT и RIGHT, соединение CROSS и т. д. Среди всех этих основ самое важное в соединении — это объединение нескольких таблиц. . Если вам нужны данные из нескольких таблиц в одном запросе SELECT, вам нужно использовать либо подзапрос, либо JOIN.

В большинстве случаев мы объединяем только две таблицы, такие как Employee и Department, но иногда может потребоваться объединение более двух таблиц, и популярным случаем является объединение трех таблиц в SQL.

В случае объединения трех таблиц таблица 1 связана с таблицей 2, а затем таблица 2 связана с таблицей 3. Если вы внимательно посмотрите, вы обнаружите, что таблица 2 – это объединяющая таблица, которая содержит первичный ключ как из таблицы 1, так и из таблицы. 2. Как я уже сказал, может быть очень сложно понять объединение трех или более таблиц.

Я обнаружил, что понимание отношений между таблицами как первичного ключа и внешнего ключа помогает избежать путаницы, чем классическая парадигма сопоставления строк.

Объединение SQL также является очень популярной темой на собеседованиях по SQL, и всегда были некоторые вопросы по объединениям, например, о разнице между ВНУТРЕННИМ и ВНЕШНИМ СОЕДИНЕНИЕМ, SQL-запросе с СОЕДИНЕНИЕМ, например, отношение отдела сотрудников и разница между ЛЕВЫМ и ПРАВЫМ ВНЕШНИМ СОЕДИНЕНИЕМ и т. д. Короче говоря, это одна из самых важных тем в SQL как с точки зрения опыта, так и с точки зрения интервью.

Синтаксис JOIN для трех таблиц в SQL

Ниже приведен общий синтаксис запроса SQL для объединения трех или более таблиц. Этот SQL-запрос должен работать во всех основных реляционных базах данных, таких как MySQL, Oracle, Microsoft SQLServer, Sybase и PostgreSQL:

SELECT t1.col, t3.col
FROM table1
JOIN table2 ON 1,0275 table первичный ключ = таблица2.внешний ключ
ПРИСОЕДИНЯЙТЕСЬ таблица3 ON table2.primarykey = table3.foreignkey


Сначала мы объединяем таблицы 1 и 2, которые создают временную таблицу с объединенными данными из таблиц 1 и 2, которая затем соединяется с таблицей 3. Эта формула может быть расширена до более чем 3 таблиц до N таблиц. Вам просто нужно убедиться, что SQL-запрос должен иметь оператор соединения N-1, чтобы присоединиться к N таблицам. для соединения двух таблиц нам требуется 1 оператор соединения, а для соединения 3 таблиц нам нужны 2 оператора соединения.

Вот хорошая диаграмма, которая также показывает, как различные типы JOIN, например. внутренние, левые внешние, правые внешние и перекрестные соединения работают в SQL:


SQL-запрос для JOIN трех таблиц в MySQL

Чтобы лучше понять объединение трех таблиц в SQL-запросе , давайте рассмотрим пример. Рассмотрим популярный пример схемы Сотрудник и Отдел. В нашем случае мы использовали таблицу ссылок под названием «Реестр», которая связывает или связывает как сотрудника с отделом.

Первичный ключ таблицы «Сотрудник» (emp_id) является внешним ключом в таблице «Реестр», и аналогичным образом первичный ключ таблицы «Отдел» (dept_id) является внешним ключом в таблице «Реестр».

Кстати, единственный способ освоить SQL-соединение — делать как можно больше упражнений. Если бы вы могли решить большинство головоломок SQL из классической книги Джо Селко «Загадки SQL и ответы», 2-е издание, вы бы более уверенно справлялись с соединениями SQL, будь то две, три или четыре таблицы.

Чтобы написать SQL-запрос для печати имени сотрудника и названия отдела , нам нужно объединить 3 таблицы . Первый оператор JOIN соединит Employee и Register и создаст временную таблицу, которая будет иметь dept_id в качестве другого столбца. Теперь второй оператор JOIN соединит эту временную таблицу с таблицей отдела по dept_id, чтобы получить желаемый результат.

Вот полный пример SQL-запроса SELECT для объединения 3 таблиц, который можно расширить для объединения более 3 или N таблиц.



mysql> ВЫБЕРИТЕ * ИЗ Сотрудник;
+ ———+———-+———+
| emp_id | emp_name | зарплата |
+ ———+———-+———+
| 1      | Джеймс | 2000 |
| 2      | Джек     | 4000 |
| 3      | Генри | 6000 |
| 4      | Том      | 8000 |
+ ———+———-+———+
4 строки IN SET (0,00 сек)

mysql> ВЫБЕРИТЕ * ИЗ Отдел;
+ ———+————+
| dept_id | имя_отдела |
+ ———+————+
| 101     | Продажи     |
| 102     | Маркетинг |
| 103     | Финансы   |
+ ———+————+
3 ряда IN НАБОР (0,00 сек)

mysql> ВЫБРАТЬ * ИЗ Зарегистрировать;
+ ———+———+
| emp_id | dept_id |
+ ———+———+
| 1 | 101 |
| 2 | 102 |
| 3 | 103 |
| 4 | 102 |
+ ———+———+
4 строки IN SET (0,00 сек)

mysql> SELECT emp_name, dept_name 7 9 0 2  ROM
902 902 Сотрудник е
       JOIN Регистр r ON e. emp_id=r.emp_id
       JOIN Отдел d ON r.dept_id=d.dept_id;
+ ———-+————+
| emp_name | имя_отдела |
+ ———-+————+
| Джеймс | Продажи     |
| Джек     | Маркетинг |
| Генри | Финансы   |
| Том      | Маркетинг |
+ ———-+————+
4 ряда IN НАБОР (0,01 сек)

Если вы хотите понять это еще лучше, попробуйте объединить столы шаг за шагом. Таким образом, вместо объединения 3 таблиц за один раз, сначала соедините 2 таблицы и посмотрите, как будет выглядеть таблица результатов. Это все о том, как соединить три таблицы одним SQL-запросом в реляционной базе данных.

Кстати, в этом примере SQL JOIN мы использовали ANSI SQL, и он будет работать в другой реляционной базе данных, а также в Oracle, SQL Server, Sybase, PostgreSQL и т. д. Сообщите нам, если у вас возникнут какие-либо проблемы при запуске этого 3 таблица JOIN запроса в любой другой базе данных.