MySQL INNER JOIN


У минулій темі було розглянуто неявне з'єднання таблиць за допомогою простої вибірки шляхом зведення даних. Але, як правило, більш поширений підхід з'єднання даних з різних таблиць представляє застосування оператора JOIN . Загальний формальний синтаксис застосування оператора INNER JOIN :

SELECT стовпець
FROM таблиця1
    [INNER] JOIN таблиця2
    ON умова1
    [[INNER] JOIN таблиця3
    ON умова2]

Після оператора JOIN йде назва другої таблиці, з якої треба додати дані до вибірки. Перед JOIN може використовуватися необов'язкове ключове слово INNER . Його наявність або відсутність ні на що не впливає. Потім після ключового слова ON вказується умова з'єднання. Ця умова встановлює, як дві таблиці будуть порівнюватися. У більшості випадків для з'єднання застосовується первинний ключ головної таблиці і зовнішній ключ залежної таблиці.

Візьмемо таблиці з даними з минулої теми:

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 , виберемо всі замовлення і додамо до них інформацію про товари:

SELECT Orders.CreatedAt, Orders.ProductCount, Products.ProductName
FROM Orders
JOIN Products ON Products.Id = Orders.ProductId;

Оскільки таблиці можуть містити стовпці з однаковими назвами, то при вказівці стовпців для вибірки вказується їх повне ім'я разом з ім'ям таблиці, наприклад, "Orders.ProductCount ".

Використовуючи псевдоніми для таблиць, можна скоротити код:

SELECT O.CreatedAt, O.ProductCount, P.ProductName
FROM Orders AS O
JOIN Products AS P
ON P.Id = O.ProductId;

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

SELECT Orders.CreatedAt, Customers.FirstName, Products.ProductName
FROM Orders
JOIN Products ON Products.Id = Orders.ProductId
JOIN Customers ON Customers.Id=Orders.CustomerId;

Завдяки поєднанню таблиць ми можемо використовувати їх стовпці для фільтрації вибірки або її сортування:

SELECT Orders.CreatedAt, Customers.FirstName, Products.ProductName
FROM Orders
JOIN Products ON Products.Id = Orders.ProductId
JOIN Customers ON Customers.Id=Orders.CustomerId
WHERE Products.Price > 45000
ORDER BY Customers.FirstName;

Умови після ключового слова ON можуть бути більш складними за складом:

SELECT Orders.CreatedAt, Customers.FirstName, Products.ProductName
FROM Orders
JOIN Products ON Products.Id = Orders.ProductId AND Products.Manufacturer='Apple'
JOIN Customers ON Customers.Id=Orders.CustomerId
ORDER BY Customers.FirstName;

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


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

 


Наш партнер:
beta test mp3 playlist downloader