Зарегистрируйтесь, чтобы продолжить обучение

Несколько таблиц SQL: Join

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

Данные в таблицах

Как правило, таблицы содержат однотипные данные, которые могут относиться к одной сущности - курсы, пользователи, посты, комментарии. Если добавляется новая сущность, то добавляется новая таблица. Каждая таблица содержит информацию о сущности независимо от других таблиц.

Например, данные из таблицы topics не связаны никак с таблицей users. Но по смыслу они связаны через колонки id в таблице users и user_id в таблице topics

users

id first_name last_name
1 Lucienne Feil
2 Ramiro Wolf
3 Maureen Romaguera
4 Jennyfer Flatley
5 Caleigh Connelly
6 Whitney Jenkins
7 Prudence McGlynn
8 Abigale Turner
9 Phyllis Kassulke
10 Kelli Zemlak

topics

id user_id title
29 2 soluta dolor occaecati
8 6 quam placeat suscipit
12 9 odio praesentium placeat
1 10 est iste corporis
9 10 et recusandae dolores

Если изменить данные в одной таблице, то в другой они останутся неизменными

UPDATE topics SET user_id = 1337 WHERE id = 29;

SELECT id, first_name, last_name FROM users LIMIT 10 ORDER BY id ASC;

Содержимое таблицы users не изменилось

id first_name last_name
1 Lucienne Feil
2 Ramiro Wolf
3 Maureen Romaguera
4 Jennyfer Flatley
5 Caleigh Connelly
6 Whitney Jenkins
7 Prudence McGlynn
8 Abigale Turner
9 Phyllis Kassulke
10 Kelli Zemlak

View on DB Fiddle

Аналогично, если удалить строки из таблицы users, то поле user_id в таблице topics не изменится.

DELETE FROM users WHERE id = 6;
SELECT id, first_name, last_name FROM users WHERE id BETWEEN 1 AND 10 ORDER BY id ASC;

Из таблицы users удалена запись с id = 6

id first_name last_name
1 Lucienne Feil
2 Ramiro Wolf
3 Maureen Romaguera
4 Jennyfer Flatley
5 Caleigh Connelly
7 Prudence McGlynn
8 Abigale Turner
10 Kelli Zemlak
| 9 | Phyllis | Kassulke |
SELECT
    id,
    user_id,
    title
FROM topics
WHERE user_id BETWEEN 1 AND 10
ORDER BY user_id
LIMIT 10;

Содержимое таблицы topics не изменилось

id user_id title
8 6 quam placeat suscipit
12 9 odio praesentium placeat
1 10 est iste corporis
9 10 et recusandae dolores

View on DB Fiddle

Мы видим, что таблицы не имеют физической связи. Изменение данных в одной таблице, не приводит к изменениям в других. Но таблицы могут быть связаны по смыслу. Рассмотрим, какие связи бывают

Связь один ко многим

Связь "один ко многим" означает, что каждому элементу из одной таблицы соответствует несколько элементов из другой таблицы. Например, у пользователя может быть несколько топиков (сообщений), но сообщение имеет только одного создателя.

SELECT
    id,
    first_name,
    last_name
FROM users WHERE id = 10;

Запись из таблицы users с id = 10

id first_name last_name
10 Kelli Zemlak
SELECT
    id,
    user_id,
    title,
    body,
    created_at
FROM topics
WHERE user_id = 10;

Записи из таблицы topics которые относятся к записи из таблицы users с id = 10

id user_id title body created_at
1 10 est iste corporis Architecto id autem modi. 2022-06-14T12:09:50.532Z
9 10 et recusandae dolores iste 2022-06-14T17:51:46.633Z

View on DB Fiddle

Один к одному

Связь "один к одному" означает, что каждому элементу из одного набора соответствует только один элемент из другой таблицы. Например, у одного пользователя может быть только один привязанный аккаунт Github

Многие ко многим

Связь "многие ко многим" (или "много к многим") означает, что несколько элементов из одной таблицы могут соответствовать нескольким элементам из другой таблицы. Примером такой связи может быть связь между студентами и курсами. Каждому студенту может соответствовать несколько курсов, и каждый курс может иметь несколько студентов. Таким образом, это создает многие ко многим отношение между студентами и курсами.

Для представления такой связи часто используется связующая таблица, которая содержит значения обоих наборов элементов.

SELECT
    id,
    user_id,
    course_id
FROM course_members
LIMIT 5;

связующая таблица course_members

id user_id course_id
1 26 47
2 85 48
3 37 54
4 5 97
5 27 69
SELECT
    id,
    first_name,
    last_name
FROM users
WHERE id IN (26, 85, 37, 5, 27)
LIMIT 5;

users

id first_name last_name
5 Caleigh Connelly
26 Andy Huel
27 Jarrod Schumm
37 Alvena Rutherford
85 Araceli Wisozk
SELECT
    id,
    name,
    body
FROM courses
WHERE id IN (47, 48, 54, 97, 69)
LIMIT 5;

courses

id name body
47 voluptates temporibus ipsa Earum dolorem eius omnis ipsa et tempora quia omnis.
48 sed facere officia quia
54 sunt qui quia porro
69 dolor reprehenderit aut Doloribus molestiae quia eveniet maiores commodi.
97 commodi ipsum maxime Distinctio omnis consequuntur aperiam officia nam. Est sint natus.

View on DB Fiddle

Таблица course_members является связующей. Она содержит поля user_id и course_id для создания связей между двумя таблицами.

Выводы

В этом уроке мы познакомились с концепцией нескольких таблиц и связей между ними. Повторим ключевые мысли:

  • Данные в таблицах хранятся независимо. Если их изменить в одной таблице, то в другой ничего не поменяется
  • Таблицы связываются через общее значение полей. Чаще всего связываются через общие по смыслу поля. Например, идентификатор пользователя
  • Связь один ко многим означает что у записи из первой таблицы есть несколько связанных записей из другой таблицы. Например, курс и его уроки
  • Связь один к одному означает, что у записи из первой таблицы есть только одна связанная запись из другой таблицы. Например, пользователь и его аккаунт в Github
  • Для связи многие ко многим используется связующая таблица. Она соединяет несколько записей из первой таблицы и из второй. Например, студенты и курсы, которые они проходят

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff