Inner Join

Поділитись

В прошлой теме было рассмотрено неявное соединение таблиц с помощью простой выборки путем сведения данных. Но, как правило, более распространенный подход соединения данных из разных таблиц представляет применение оператора JOIN. Общий формальный синтаксис применения оператора INNER JOIN:

1
2
3
4
5
6
SELECT столбцы
FROM таблица1
[INNER] JOIN таблица2
ON условие1
[[INNER]OIN таблица3
ON условие2]

После оператора JOIN идет название второй таблицы, из которой надо добавить данные в выборку. Перед JOIN может использоваться необязательное ключевое слово INNER. Его наличие или отсутствие ни на что не влияет. Затем после ключевого слова ON указывается условие соединения. Это условие устанавливает, как две таблицы будут сравниваться. В большинстве случаев для соединения применяется первичный ключ главной таблицы и внешний ключ зависимой таблицы.

Возьмем таблицы с данными из прошлой темы:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE TABLE Products
(Id INT AUTO_INCREMENT PRIMARY KEY,
ProductName VARCHAR(30) NOT NULL,
Manufacturer VARCHAR(20) NOT NULL,
ProductCount INT DEFAULT 0,
Price DECIMAL NOT NULL);
CREATE TABLE Customers
(
Id INT AUTO_INCREMENT PRIMARY KEY,
FirstName VARCHAR(30) NOT NULL);
CREATE TABLE Orders
(Id INT AUTO_INCREMENT PRIMARY KEY,
ProductId INT NOT NULL,
CustomerId INT NOT NULL,
CreatedAt DATE NOT NULL,
ProductCount INT DEFAULT 1,
Price DECIMAL NOT NULL,
FOREIGN KEY (ProductId)
REFERENCES Products(Id)
ON DELETE CASCADE,
FOREIGN KEY (CustomerId)
REFERENCES Customers(Id)
ON DELETE CASCADE);

Используя JOIN, выберем все заказы и добавим к ним информацию о товарах:

1
2
3
SELECT Orders.CreatedAt, Orders.ProductCount,
Products.ProductName
FROM OrdersJOIN Products ON Products.Id = Orders.ProductId;

Поскольку таблицы могут содержать столбцы с одинаковыми названиями, то при указании столбцов для выборки указывается их полное имя вместе с именем таблицы, например, «Orders.ProductCount».

Inner Join в MySQL

Используя псевдонимы для таблиц, можно сократить код:

1
2
3
4
SELECT O.CreatedAt, O.ProductCount, P.ProductName
FROM Orders
AS OJOIN Products AS P
ON P.Id = O.ProductId;

Также можно присоединять данные сразу из нескольких таблиц. Например, добавим к заказу информацию о покупателе из таблицы Customers:

1
2
3
4
SELECT Orders.CreatedAt, Customers.FirstName, Products.ProductName
FROM OrdersJOIN Products
ON Products.Id = Orders.ProductIdJOIN Customers
ON Customers.Id=Orders.CustomerId;
Соединение таблиц в MySQL

Благодаря соединению таблиц мы можем использовать их столбцы для фильтрации выборки или ее сортировки:

1
2
3
4
5
6
SELECT Orders.CreatedAt, Customers.FirstName, Products.ProductName
FROM OrdersJOIN Products
ON Products.Id = Orders.ProductIdJOIN Customers
ON Customers.Id=Orders.CustomerId
WHERE Products.Price > 45000
ORDER BY Customers.FirstName;

Условия после ключевого слова ON могут быть более сложными по составу:

1
2
3
4
5
SELECT Orders.CreatedAt, Customers.FirstName, Products.ProductName
FROM OrdersJOIN Products
ON Products.Id = Orders.ProductId AND Products.Manufacturer='Apple'JOIN Customers
ON Customers.Id=Orders.CustomerId
ORDER BY Customers.FirstName;

В данном случае выбираем все заказы на товары, производителем которых является Apple.

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


Поділитись