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.

Cú pháp cơ bản của INNER JOIN:

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

Giải thích:

  • SELECT column_name(s): Chọn các cột bạn muốn lấy dữ liệu.
  • FROM table1: Xác định bảng đầu tiên.
  • INNER JOIN table2: Xác định bảng thứ hai mà bạn muốn kết hợp với bảng đầu tiên.
  • ON table1.column_name = table2.column_name: Điều kiện kết hợp giữa hai bảng dựa trên các cột tương ứng có giá trị khớp nhau.

Ví dụ thực tế:

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;

Kết quả:

CustomerName Product
John Smith Laptop
John Smith Tablet
Ana Williams Smartphone

Trong ví dụ này:

  • INNER JOIN đã kết hợp các hàng từ bảng CustomersOrders chỉ khi giá trị của CustomerID trong cả hai bảng trùng khớp.
  • Kết quả chỉ bao gồm những khách hàng đã có đơn hàng (John Smith và Ana Williams).

Một số lưu ý khi sử dụng INNER JOIN:

  1. Chỉ các hàng có giá trị khớp được trả về: Nếu có khách hàng mà không có đơn hàng, như Maria Anders trong ví dụ trên, thông tin của họ sẽ không xuất hiện trong kết quả.
  2. Sử dụng với nhiều bảng: Bạn có thể kết hợp nhiều bảng với INNER JOIN bằng cách thêm các bảng và điều kiện kết hợp tương ứng.
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;

Khi nào nên sử dụng INNER JOIN?

  • Khi bạn chỉ muốn lấy dữ liệu ở các bảng có giá trị chung.
  • Khi cần kết hợp dữ liệu từ nhiều bảng dựa trên một hoặc nhiều điều kiện cụ thể.

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ẽ.

Ví dụ nâng cao về INNER JOIN trong MySQL

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ài toán:

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.

Truy vấn nâng cao sử dụng INNER JOIN trên ba bảng:

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;

Kết quả:

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

Giải thích:

  • INNER JOIN giữa CustomersOrders: 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.
  • INNER JOIN giữa OrdersProducts: 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.
  • Kết quả trả về: Chỉ các khách hàng có đơn hàng và sản phẩm tương ứng sẽ được hiển thị, cùng với giá của sản phẩm và ngày đặt hàng.

Ví dụ nâng cao với điều kiện bổ sung

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;

Kết quả:

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.

Ví dụ với các hàm tổng hợp (Aggregate Functions)

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;

Kết quả:

CustomerName TotalSpent
John Smith 1100
Ana Williams 500

Giải thích:

  • SUM(Products.Price): Tính tổng giá trị đơn hàng của mỗi khách hàng.
  • GROUP BY Customers.CustomerName: Nhóm kết quả theo tên khách hàng để tính toán tổng giá trị đơn hàng của từng người.

Trong ví dụ này:

  • John Smith đã mua hai sản phẩm (Laptop và Tablet) với tổng giá trị 1100.
  • Ana Williams đã mua một sản phẩm (Smartphone) với giá 500.

Kết hợp INNER JOIN với Alias (bí danh)

Để 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.