Tìm hiểu INNER JOIN trong MySQL


- Trong hệ quản trị cơ sở dữ liệu MySQL, lệnh INNER JOIN được sử dụng để kết hợp các hàng (từ hai cái bảng) lại thành một cái bảng tổng hợp.

- Trong đó, việc kết hợp các hàng sẽ được thực hiện dựa trên nguyên tắc như sau:

  • Tất cả các hàng bên trong cái bảng thứ nhất (table1) sẽ được bắt cặp lần lượt với tất cả các hàng bên trong cái bảng thứ hai (table2)
  • Những hàng mà dữ liệu trên nó thỏa điều kiện (condition) thì sẽ được giữ lại, còn những hàng mà dữ liệu trên nó không thỏa điều kiện thì sẽ bị loại bỏ.
SELECT *
FROM table1
INNER JOIN table2
ON condition;
table1
table2

- Lưu ý: Khi hai cái bảng được kết hợp với nhau, các hàng trong cái bảng thứ nhất (table1) sẽ được đặt bên trái, các hàng trong cái bảng thứ hai (table2) sẽ được ghép bên phải.

MỘT SỐ VÍ DỤ THAM KHẢO

- Trong bài học này, tôi sẽ sử dụng hai cái bảng Customers & Orders như bên dưới để làm một số ví dụ minh họa.

CustomerID CustomerName City
1 Nguyễn Thành Nhân Cần Thơ
2 Hoàng Nghĩa Tuyến Vĩnh Long
3 Trần Nguyễn Anh Thư Hậu Giang
4 Đinh Nguyên Dương Trà Vinh
OrderID OrderDate CustomerID Total
1 2019-02-07 4 180000
2 2019-02-18 1 140000
3 2019-03-11 7 280000
4 2019-04-22 3 235000
5 2019-06-13 4 220000
Ví dụ 1:
SELECT *
FROM Customers
INNER JOIN Orders
ON City="Vĩnh Long" AND OrderID > 3
ORDER BY Customers.CustomerID ASC, OrderID ASC;

- Sau khi thực thi câu lệnh phía trên thì tôi sẽ lấy được một bảng dữ liệu như sau.

CustomerID CustomerName City OrderID OrderDate CustomerID Total
2 Hoàng Nghĩa Tuyến Vĩnh Long 4 2019-04-22 3 235000
2 Hoàng Nghĩa Tuyến Vĩnh Long 5 2019-06-13 4 220000
Ví dụ 2:
SELECT Customers.CustomerID, CustomerName, City, OrderID, OrderDate, Total
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerID ASC, OrderID ASC;

- Sau khi thực thi câu lệnh phía trên thì tôi sẽ lấy được một bảng dữ liệu như sau.

CustomerID CustomerName City OrderID OrderDate Total
1 Nguyễn Thành Nhân Cần Thơ 2 2019-02-18 140000
3 Trần Nguyễn Anh Thư Hậu Giang 4 2019-04-22 235000
4 Đinh Nguyên Dương Trà Vinh 1 2019-02-07 180000
4 Đinh Nguyên Dương Trà Vinh 5 2019-06-13 220000

GIẢI THÍCH VÍ DỤ 1

CustomerID CustomerName City
1 Nguyễn Thành Nhân Cần Thơ
2 Hoàng Nghĩa Tuyến Vĩnh Long
3 Trần Nguyễn Anh Thư Hậu Giang
4 Đinh Nguyên Dương Trà Vinh
OrderID OrderDate CustomerID Total
1 2019-02-07 4 180000
2 2019-02-18 1 140000
3 2019-03-11 7 280000
4 2019-04-22 3 235000
5 2019-06-13 4 220000
SELECT *
FROM Customers
INNER JOIN Orders
ON City="Vĩnh Long" AND OrderID > 3
ORDER BY Customers.CustomerID ASC, OrderID ASC;

- Tất cả các hàng bên trong cái bảng thứ nhất (Customers) sẽ được bắt cặp lần lượt với tất cả các hàng bên trong cái bảng thứ hai (Orders)

CustomerID CustomerName City OrderID OrderDate CustomerID Total
1 Nguyễn Thành Nhân Cần Thơ 1 2019-02-07 4 180000
1 Nguyễn Thành Nhân Cần Thơ 2 2019-02-18 1 140000
1 Nguyễn Thành Nhân Cần Thơ 3 2019-03-11 7 280000
1 Nguyễn Thành Nhân Cần Thơ 4 2019-04-22 3 235000
1 Nguyễn Thành Nhân Cần Thơ 5 2019-06-13 4 220000
2 Hoàng Nghĩa Tuyến Vĩnh Long 1 2019-02-07 4 180000
2 Hoàng Nghĩa Tuyến Vĩnh Long 2 2019-02-18 1 140000
2 Hoàng Nghĩa Tuyến Vĩnh Long 3 2019-03-11 7 280000
2 Hoàng Nghĩa Tuyến Vĩnh Long 4 2019-04-22 3 235000
2 Hoàng Nghĩa Tuyến Vĩnh Long 5 2019-06-13 4 220000
3 Trần Nguyễn Anh Thư Hậu Giang 1 2019-02-07 4 180000
3 Trần Nguyễn Anh Thư Hậu Giang 2 2019-02-18 1 140000
3 Trần Nguyễn Anh Thư Hậu Giang 3 2019-03-11 7 280000
3 Trần Nguyễn Anh Thư Hậu Giang 4 2019-04-22 3 235000
3 Trần Nguyễn Anh Thư Hậu Giang 5 2019-06-13 4 220000
4 Đinh Nguyên Dương Trà Vinh 1 2019-02-07 4 180000
4 Đinh Nguyên Dương Trà Vinh 2 2019-02-18 1 140000
4 Đinh Nguyên Dương Trà Vinh 3 2019-03-11 7 280000
4 Đinh Nguyên Dương Trà Vinh 4 2019-04-22 3 235000
4 Đinh Nguyên Dương Trà Vinh 5 2019-06-13 4 220000

- Những hàng nào thỏa điều kiện City="Vĩnh Long" AND OrderID > 3 thì được giữ lại, còn những hàng không thỏa điều kiện thì bị loại bỏ.

CustomerID CustomerName City OrderID OrderDate CustomerID Total
2 Hoàng Nghĩa Tuyến Vĩnh Long 4 2019-04-22 3 235000
2 Hoàng Nghĩa Tuyến Vĩnh Long 5 2019-06-13 4 220000

GIẢI THÍCH VÍ DỤ 2

CustomerID CustomerName City
1 Nguyễn Thành Nhân Cần Thơ
2 Hoàng Nghĩa Tuyến Vĩnh Long
3 Trần Nguyễn Anh Thư Hậu Giang
4 Đinh Nguyên Dương Trà Vinh
OrderID OrderDate CustomerID Total
1 2019-02-07 4 180000
2 2019-02-18 1 140000
3 2019-03-11 7 280000
4 2019-04-22 3 235000
5 2019-06-13 4 220000
SELECT Customers.CustomerID, CustomerName, City, OrderID, OrderDate, Total
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerID ASC, OrderID ASC;

- Tất cả các hàng bên trong cái bảng thứ nhất (Customers) sẽ được bắt cặp lần lượt với tất cả các hàng bên trong cái bảng thứ hai (Orders)

CustomerID CustomerName City OrderID OrderDate CustomerID Total
1 Nguyễn Thành Nhân Cần Thơ 1 2019-02-07 4 180000
1 Nguyễn Thành Nhân Cần Thơ 2 2019-02-18 1 140000
1 Nguyễn Thành Nhân Cần Thơ 3 2019-03-11 7 280000
1 Nguyễn Thành Nhân Cần Thơ 4 2019-04-22 3 235000
1 Nguyễn Thành Nhân Cần Thơ 5 2019-06-13 4 220000
2 Hoàng Nghĩa Tuyến Vĩnh Long 1 2019-02-07 4 180000
2 Hoàng Nghĩa Tuyến Vĩnh Long 2 2019-02-18 1 140000
2 Hoàng Nghĩa Tuyến Vĩnh Long 3 2019-03-11 7 280000
2 Hoàng Nghĩa Tuyến Vĩnh Long 4 2019-04-22 3 235000
2 Hoàng Nghĩa Tuyến Vĩnh Long 5 2019-06-13 4 220000
3 Trần Nguyễn Anh Thư Hậu Giang 1 2019-02-07 4 180000
3 Trần Nguyễn Anh Thư Hậu Giang 2 2019-02-18 1 140000
3 Trần Nguyễn Anh Thư Hậu Giang 3 2019-03-11 7 280000
3 Trần Nguyễn Anh Thư Hậu Giang 4 2019-04-22 3 235000
3 Trần Nguyễn Anh Thư Hậu Giang 5 2019-06-13 4 220000
4 Đinh Nguyên Dương Trà Vinh 1 2019-02-07 4 180000
4 Đinh Nguyên Dương Trà Vinh 2 2019-02-18 1 140000
4 Đinh Nguyên Dương Trà Vinh 3 2019-03-11 7 280000
4 Đinh Nguyên Dương Trà Vinh 4 2019-04-22 3 235000
4 Đinh Nguyên Dương Trà Vinh 5 2019-06-13 4 220000

- Những hàng nào thỏa điều kiện Customers.CustomerID = Orders.CustomerID thì được giữ lại, còn những hàng không thỏa điều kiện thì bị loại bỏ.

CustomerID CustomerName City OrderID OrderDate CustomerID Total
1 Nguyễn Thành Nhân Cần Thơ 2 2019-02-18 1 140000
3 Trần Nguyễn Anh Thư Hậu Giang 4 2019-04-22 3 235000
4 Đinh Nguyên Dương Trà Vinh 1 2019-02-07 4 180000
4 Đinh Nguyên Dương Trà Vinh 5 2019-06-13 4 220000

- Ngoài ra, bởi vì lệnh SELECT chỉ lấy sáu cột Customers.CustomerID CustomerName City OrderID OrderDate Total cho nên cột CustomerID từ bảng Orders sẽ bị loại bỏ khỏi bảng kết hợp phía trên.

CustomerID CustomerName City OrderID OrderDate Total
1 Nguyễn Thành Nhân Cần Thơ 2 2019-02-18 140000
3 Trần Nguyễn Anh Thư Hậu Giang 4 2019-04-22 235000
4 Đinh Nguyên Dương Trà Vinh 1 2019-02-07 180000
4 Đinh Nguyên Dương Trà Vinh 5 2019-06-13 220000