Thời gian đọc: 6 phút
INNER JOIN là loại liên kết (JOIN) phổ biến nhất trong MySQL. Nó được sử dụng để kết hợp các hàng từ hai hoặc nhiều bảng dựa trên một điều kiện nào đó, và chỉ trả về các bản ghi mà điều kiện kết hợp giữa các bảng được thỏa mãn.
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
Giả sử bạn có hai bảng trong cơ sở dữ liệu như sau:
Bảng Customers
(thông tin khách hàng):
CustomerID | CustomerName | Country |
---|---|---|
1 | John Smith | USA |
2 | Ana Williams | Canada |
3 | Maria Anders | Germany |
Bảng Orders
(thông tin đơn hàng):
OrderID | CustomerID | Product |
---|---|---|
101 | 1 | Laptop |
102 | 2 | Smartphone |
103 | 1 | Tablet |
Bạn muốn lấy thông tin về các khách hàng đã đặt hàng và thông tin về sản phẩm họ đã mua. Bạn có thể sử dụng INNER JOIN để kết hợp hai bảng này dựa trên cột CustomerID.
SELECT Customers.CustomerName, Orders.Product
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
CustomerName | Product |
---|---|
John Smith | Laptop |
John Smith | Tablet |
Ana Williams | Smartphone |
Trong ví dụ này:
Customers
và Orders
chỉ khi giá trị của CustomerID trong cả hai bảng trùng khớp.
SELECT column_name(s)
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name
INNER JOIN table3 ON table2.column_name = table3.column_name;
INNER JOIN là công cụ mạnh mẽ để kết hợp và xử lý dữ liệu một cách linh hoạt trong MySQL, đặc biệt hữu ích trong các hệ thống có nhiều bảng dữ liệu liên kết chặt chẽ.
Giả sử bạn có ba bảng trong cơ sở dữ liệu về cửa hàng trực tuyến:
Bảng Customers
(thông tin khách hàng):
CustomerID | CustomerName | Country |
---|---|---|
1 | John Smith | USA |
2 | Ana Williams | Canada |
3 | Maria Anders | Germany |
Bảng Orders
(thông tin đơn hàng):
OrderID | CustomerID | ProductID | OrderDate |
---|---|---|---|
101 | 1 | 1001 | 2024-01-01 |
102 | 2 | 1002 | 2024-01-03 |
103 | 1 | 1003 | 2024-01-05 |
Bảng Products
(thông tin sản phẩm):
ProductID | ProductName | Price |
---|---|---|
1001 | Laptop | 800 |
1002 | Smartphone | 500 |
1003 | Tablet | 300 |
Bạn muốn kết hợp dữ liệu từ ba bảng này để lấy thông tin về khách hàng, sản phẩm mà họ đã mua và giá của sản phẩm.
SELECT Customers.CustomerName, Products.ProductName, Products.Price, Orders.OrderDate
FROM Customers
INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID
INNER JOIN Products ON Orders.ProductID = Products.ProductID;
CustomerName | ProductName | Price | OrderDate |
---|---|---|---|
John Smith | Laptop | 800 | 2024-01-01 |
John Smith | Tablet | 300 | 2024-01-05 |
Ana Williams | Smartphone | 500 | 2024-01-03 |
Customers
và Orders
: Kết hợp hai bảng dựa trên cột CustomerID, chỉ lấy các hàng khi có giá trị khớp giữa khách hàng và đơn hàng.Orders
và Products
: Kết hợp bảng Orders
với bảng Products
dựa trên cột ProductID để lấy tên sản phẩm và giá tiền.Giả sử bạn chỉ muốn lấy các đơn hàng có giá trên 400, bạn có thể thêm điều kiện WHERE vào truy vấn:
SELECT Customers.CustomerName, Products.ProductName, Products.Price, Orders.OrderDate
FROM Customers
INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID
INNER JOIN Products ON Orders.ProductID = Products.ProductID
WHERE Products.Price > 400;
CustomerName | ProductName | Price | OrderDate |
---|---|---|---|
John Smith | Laptop | 800 | 2024-01-01 |
Ana Williams | Smartphone | 500 | 2024-01-03 |
Trong ví dụ này, điều kiện WHERE Products.Price > 400 đã loại bỏ sản phẩm Tablet của John Smith có giá 300, vì nó không thỏa mãn điều kiện.
Nếu bạn muốn tính tổng giá trị các đơn hàng mà mỗi khách hàng đã đặt, bạn có thể sử dụng hàm tổng hợp SUM() và kết hợp với GROUP BY.
SELECT Customers.CustomerName, SUM(Products.Price) AS TotalSpent
FROM Customers
INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID
INNER JOIN Products ON Orders.ProductID = Products.ProductID
GROUP BY Customers.CustomerName;
CustomerName | TotalSpent |
---|---|
John Smith | 1100 |
Ana Williams | 500 |
Trong ví dụ này:
Để làm cho truy vấn của bạn ngắn gọn và dễ đọc hơn, bạn có thể sử dụng bí danh cho bảng và cột.
SELECT C.CustomerName, P.ProductName, P.Price, O.OrderDate
FROM Customers C
INNER JOIN Orders O ON C.CustomerID = O.CustomerID
INNER JOIN Products P ON O.ProductID = P.ProductID;
Kết quả vẫn giống như truy vấn trước, nhưng việc sử dụng bí danh (C, O, P) giúp câu truy vấn ngắn gọn và dễ theo dõi hơn khi có nhiều bảng tham gia.