В прошлой теме было рассмотрено неявное соединение таблиц. Оно производилось на основе простой выборки неявно путем сведения данных. Для явного соединения данных из двух таблиц применяется оператор JOIN. Общий формальный синтаксис применения оператора INNER JOIN:
1
2
3
4
5
6
| SELECT столбцы FROM таблица1 [ INNER ] JOIN таблица2 ON условие1 [[ INNER ] JOIN таблица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
| USE productsdb; CREATE TABLE Products ( Id INT IDENTITY PRIMARY KEY , ProductName NVARCHAR(30) NOT NULL , Manufacturer NVARCHAR(20) NOT NULL , ProductCount INT DEFAULT 0, Price MONEY NOT NULL ); CREATE TABLE Customers ( Id INT IDENTITY PRIMARY KEY , FirstName NVARCHAR(30) NOT NULL ); CREATE TABLE Orders ( Id INT IDENTITY PRIMARY KEY , ProductId INT NOT NULL REFERENCES Products(Id) ON DELETE CASCADE , CustomerId INT NOT NULL REFERENCES Customers(Id) ON DELETE CASCADE , CreatedAt DATE NOT NULL , ProductCount INT DEFAULT 1, Price MONEY NOT NULL ); |
Используя JOIN, выберем все заказы и добавим к ним информацию о товарах:
1
2
3
| SELECT Orders.CreatedAt, Orders.ProductCount, Products.ProductName FROM Orders JOIN Products ON Products.Id = Orders.ProductId |
Поскольку таблицы могут содержать столбцы с одинаковыми названиями, то при указании столбцов для выборки указывается их полное имя вместе с именем таблицы, например, "Orders.ProductCount".
Также используя псевдонимы, мы можем сократить код:
1
2
3
4
| SELECT O.CreatedAt, O.ProductCount, P.ProductName FROM Orders AS O JOIN Products AS P ON P.Id = O.ProductId |
Подобным образом мы можем присоединять и другие таблицы. Например, добавим к заказу информацию о покупателе из таблицы Customers:
1
2
3
4
| SELECT Orders.CreatedAt, Customers.FirstName, Products.ProductName FROM Orders JOIN Products ON Products.Id = Orders.ProductId JOIN Customers ON Customers.Id=Orders.CustomerId |
Благодаря соединению таблиц мы можем использовать их столбцы для фильтрации выборки или ее сортировки:
1
2
3
4
5
6
| 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 могут быть более сложными по составу:
1
2
3
4
5
| 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 следует учитывать, что процесс соединения таблиц может быть ресурсоемким, поэтому следует соединять только те таблицы, данные из которых действительно необходимы. Чем больше таблиц соединяется, тем больше снижается производительность.
Комментариев нет:
Отправить комментарий