MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Inner Join

În subiectul anterior am examinat unirea implicită a tabelelor prin simpla selecție și consolidare a datelor. Cu toate acestea, abordarea mai comună pentru unirea datelor din tabele diferite implică utilizarea operatorului JOIN. Sintaxa formală generală a aplicării operatorului INNER JOIN este:

SELECT coloane
FROM tabelul1
   [INNER] JOIN tabelul2
   ON conditie1
   [[INNER] JOIN tabelul3
   ON conditie2]

După operatorul JOIN, urmează numele celei de-a doua tabele, din care trebuie să adăugăm date în selecție. Înainte de JOIN, se poate folosi cuvântul cheie opțional INNER. Prezența sau absența acestuia nu are niciun efect.

Apoi, după cuvântul cheie ON, se specifică condiția de unire. Această condiție stabilește modul în care cele două tabele vor fi comparate. În cea mai mare parte a cazurilor, pentru unire, se utilizează cheia primară a tabelului principal și cheia externă a tabelului dependent.

Vom lua tabelele cu datele din subiectul anterior:

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
);

Prin utilizarea JOIN, vom selecta toate comenzile și vom adăuga informații despre produse:

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

Deoarece tabelele pot conține coloane cu același nume, atunci când se specifică coloanele pentru selecție, se indică numele complet al acestora, împreună cu numele tabelului, de exemplu, "Orders.ProductCount".

Prin utilizarea de pseudonime pentru tabele, putem reduce codul:

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

De asemenea, putem atașa date direct din mai multe tabele. De exemplu, vom adăuga informații despre client la comandă din tabela Customers:

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

Datorită unirii tabelelor, putem utiliza coloanele acestora pentru filtrarea sau sortarea selecției:

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;

Condițiile după cuvântul cheie ON pot fi mai complexe în compoziție:

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;

În acest caz, selectăm toate comenzile pentru produsele ale căror branduri sunt Apple.

Când utilizați operatorul JOIN, trebuie să țineți cont că procesul de unire a tabelelor poate să consume resurse, prin urmare, este indicat să uniți doar acele tabele al căror date sunt cu adevărat necesare. Cu cât sunt unite mai multe tabele, cu atât scade performanța.

← Lecția anterioară Lecția următoare →