Как объединить 3 и более таблицы

В данной статье мы рассмотрим объединение 3?х и более таблиц. В качестве примера мы будем использовать 2 подхода:

  • Использование выборки по внешним ключам
  • Механизм JOIN

Для начала создадим таблицы:

  • orders
  • customers
  • goods

(для проверки примеров можно использовать ресурс – http://sqlfiddle.com/)


CREATE TABLE customers (
    id INT PRIMARY KEY AUTO_INCREMENT,
    first_name VARCHAR(20),
    last_name VARCHAR(20),
    email VARCHAR(100)
);
                   
CREATE TABLE goods (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20),
    price DECIMAL
);
                   
CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    created DATE,
    customer_id INT NOT NULL,
    good_id INT NOT NULL,
    FOREIGN KEY (customer_id)
        REFERENCES customers (id),
    FOREIGN KEY (good_id)
        REFERENCES goods (id)
);

И добавим в них данные:


insert into customers VALUES(1, 'One', 'First', 'test1@mail.com');
insert into customers VALUES(2, 'Two', 'Second', 'test2@mail.com');
insert into customers VALUES(3, 'Three', 'Third', 'test3@mail.com');
insert into customers VALUES(4, 'Four', 'Fourth', 'test4@mail.com');
insert into customers VALUES(5, 'Five', 'Fifth', 'test5@mail.com');

insert into goods VALUES(1, 'good_1', 100.00);
insert into goods VALUES(2, 'good_2', 200.00);
insert into goods VALUES(3, 'good_3', 300.00);
insert into goods VALUES(4, 'good_4', 400.00);
insert into goods VALUES(5, 'good_5', 500.00);
insert into goods VALUES(6, 'good_6', 600.00);
insert into goods VALUES(7, 'good_7', 700.00);
insert into goods VALUES(8, 'good_8', 800.00);
insert into goods VALUES(9, 'good_9', 900.00);
insert into goods VALUES(10, 'good_10', 1000.00);

insert into orders VALUES(1, '2019-01-01', 1, 1);
insert into orders VALUES(2, '2019-01-02', 1, 2);
insert into orders VALUES(3, '2019-01-03', 2, 3);
insert into orders VALUES(4, '2019-01-04', 2, 4);
insert into orders VALUES(5, '2019-01-05', 3, 5);
insert into orders VALUES(6, '2019-01-06', 3, 6);
insert into orders VALUES(7, '2019-01-07', 4, 7);
insert into orders VALUES(8, '2019-01-08', 4, 8);
insert into orders VALUES(9, '2019-01-09', 5, 9);
insert into orders VALUES(10, '2019-01-10', 5, 10);

Использование внешних ключей:


SELECT 
    c.last_name, c.email, g.name, o.created
FROM
    customers c,
    goods g,
    orders o
WHERE
    c.id = o.customer_id
        AND o.good_id = g.id;

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

last_name email name created
First test1@mail.com good_1 2019-01-01
First test1@mail.com good_2 2019-01-02
Second test2@mail.com good_3 2019-01-03
Second test2@mail.com good_4 2019-01-04
Third test3@mail.com good_5 2019-01-05
Third test3@mail.com good_6 2019-01-06
Fourth test4@mail.com good_7 2019-01-07
Fourth test4@mail.com good_8 2019-01-08
Fifth test5@mail.com good_9 2019-01-09
Fifth test5@mail.com good_10 2019-01-10

Использование JOIN:


SELECT 
    c.last_name, c.email, g.name, o.created
FROM
    customers c
        INNER JOIN
    orders o ON o.customer_id = c.id
        INNER JOIN
    goods g ON g.id = o.good_id;

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

last_name email name created
First test1@mail.com good_1 2019-01-01
First test1@mail.com good_2 2019-01-02
Second test2@mail.com good_3 2019-01-03
Second test2@mail.com good_4 2019-01-04
Third test3@mail.com good_5 2019-01-05
Third test3@mail.com good_6 2019-01-06
Fourth test4@mail.com good_7 2019-01-07
Fourth test4@mail.com good_8 2019-01-08
Fifth test5@mail.com good_9 2019-01-09
Fifth test5@mail.com good_10 2019-01-10

В данной статье мы рассмотрели 2 способа объединения 3 и более 3?хтаблиц.