Изучаем SQL. №17. Внешние ключи и связи между таблицами. Многие ко многим.

Изучаем SQL
Продолжаем изучать SQL. Итак, сегодня речь будет идти о связи между таблицами, которую называют «многие ко многим». Самый простой и классический пример, это пример с учениками и учителями. У каждого учителя может быть много учеников, но в то же время у каждого ученика может быть много учителей.
Для организации связи многие ко многим между двумя таблицами необходимо создать третью таблицу, которая будет промежуточной между ними.
От слов к делу. Открываем ваш HeidiSQL и создаем таблицу school. Фанаты же консоли и минимализма могут использовать такие команды как:

CREATE DATABASE school;
USE school;


Теперь создадим две таблицы pupil и teacher у обойх поля id и name:

CREATE TABLE pupil (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50));
CREATE TABLE teacher (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50));

И сразу же приступим к созданию промежуточной таблички:

CREATE TABLE pl_tr (pl_id INT NOT NULL, tr_id INT NOT NULL, PRIMARY KEY(pl_id,tr_id), FOREIGN KEY(pl_id) REFERENCES pupil(id), FOREIGN KEY(tr_id) REFERENCES teacher(id));

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

INSERT INTO pupil (name) VALUES ('Иван');
INSERT INTO pupil (name) VALUES ('Алексей');
INSERT INTO pupil (name) VALUES ('Дмитрий');
INSERT INTO pupil (name) VALUES ('Виталий');
INSERT INTO pupil (name) VALUES ('Егор');
SELECT * FROM pupil; 

Учителя:

INSERT INTO teacher (name) VALUES ('Химик');
INSERT INTO teacher (name) VALUES ('Физик');
INSERT INTO teacher (name) VALUES ('Физрук');
INSERT INTO teacher (name) VALUES ('Математик');
INSERT INTO teacher (name) VALUES ('Историк');
SELECT * FROM teacher; 

Теперь заполним промежуточную таблицу:

INSERT INTO pl_tr VALUES (1,1);
INSERT INTO pl_tr VALUES (1,2);
INSERT INTO pl_tr VALUES (3,1);
INSERT INTO pl_tr VALUES (2,2);
INSERT INTO pl_tr VALUES (5,1);
INSERT INTO pl_tr VALUES (4,2);
INSERT INTO pl_tr VALUES (3,5);
INSERT INTO pl_tr VALUES (2,4);
INSERT INTO pl_tr VALUES (1,3);
SELECT * FROM pl_tr;

А теперь сделаем запрос выборку из всех табличек участвующих в соединение многие ко многим:

SELECT p.name as Ученик,t.name as Учитель FROM pupil p 
LEFT JOIN pl_tr pl ON p.id = pl.pl_id 
LEFT JOIN teacher t ON t.id = pl.tr_id;
+---------+-----------+
| Ученик  | Учитель   |
+---------+-----------+
| Иван    | Химик     |
| Дмитрий | Химик     |
| Егор    | Химик     |
| Иван    | Физик     |
| Алексей | Физик     |
| Виталий | Физик     |
| Иван    | Физрук    |
| Алексей | Математик |
| Дмитрий | Историк   |
+---------+-----------+

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

×