Trong bài viết này, bạn sẽ học được cách sử dụng mệnh đề INNER JOIN
trong MySQL để chọn dữ liệu từ nhiều bảng dựa trên các điều kiện nối.
Giới thiệu về mệnh đề INNER JOIN trong MySQL
Hàm INNER JOIN
khớp từng hàng trong một bảng với mọi hàng trong các bảng khác và cho phép bạn truy vấn các hàng chứa các cột từ cả hai bảng.
INNER JOIN
là một mệnh đề tùy chọn (không bắt buộc dùng) của câu lệnh SELECT
. Nó xuất hiện ngay sau mệnh đề FROM
. Đây là cú pháp của mệnh đề INNER JOIN
:
SELECT select_list FROM t1 INNER JOIN t2 ON join_condition1 INNER JOIN t3 ON join_condition2 ...;
Trong cú pháp này:
- Đầu tiên, chỉ định bảng chính xuất hiện trong mệnh đề
FROM
(t1
). - Thứ hai, chỉ định bảng sẽ được nối với bảng chính, xuất hiện trong mệnh đề
INNER JOIN
(t2
,t3
,…). - Thứ ba, chỉ định điều kiện nối sau từ khóa
ON
của mệnh đềINNER JOIN
. Điều kiện nối chỉ định quy tắc khớp hàng giữa bảng chính và bảng xuất hiện trong mệnh đềINNER JOIN
.
Giả sử rằng bạn muốn nối hai bảng t1
và t2
.
Câu lệnh sau minh họa cách nối hai bảng t1
và t2
sử dụng mệnh đề INNER JOIN
:
SELECT select_list FROM t1 INNER JOIN t2 ON join_condition;
Mệnh đề INNER JOIN
so sánh từng hàng trong bảng t1
với từng hàng trong bảng t2
dựa trên điều kiện nối.
Nếu các hàng từ cả hai bảng làm cho điều kiện nối được ước tính thành TRUE
, thì INNER JOIN
sẽ tạo một hàng mới có các cột chứa tất cả các cột của các hàng từ các bảng và bao gồm hàng mới này trong tập kết quả.
Trong trường hợp không có hàng nào giữa các bảng làm cho điều kiện nối được ước tính thành TRUE
, thì INNER JOIN
sẽ trả về kết quả một tập hợp kết quả trống. Logic này cũng được áp dụng khi bạn tham gia nhiều hơn 2 bảng.
Biểu đồ Venn sau đây minh họa cách hoạt động của mệnh đề INNER JOIN
:
Ví dụ về INNER JOIN trong MySQL
Chúng ta sẽ dử dụng hai bảng products
và productlines
trong cơ sở dữ liệu mẫu .
Trong sơ đồ này, bảng products
có cột productLine
tham chiếu đến cột productline
của bảng productlines
. Cột productLine
trong bảng products
được gọi là cột khóa ngoại .
Thông thường, bạn tham gia các bảng có mối quan hệ khóa ngoại như bảng productlines
và bảng products
.
Giả sử bạn muốn lấy:
- Các
productCode
vàproductName
từ bảngproducts
. - Độ
textDescription
của các dòng sản phẩm khỏi phảiproductlines
bàn .
Để thực hiện việc này, bạn cần chọn dữ liệu từ cả hai bảng bằng cách so khớp các hàng dựa trên các giá trị trong cột productline
bằng cách sử dụng mệnh đề INNER JOIN
như sau:
SELECT productCode, productName, textDescription FROM products t1 INNER JOIN productlines t2 ON t1.productline = t2.productline;
Kết quả:
Vì các cột đã nối của cả hai bảng có cùng tên là productline
nên bạn có thể sử dụng cú pháp USING
:
SELECT productCode, productName, textDescription FROM products INNER JOIN productlines USING (productline);
Truy vấn trả về cùng một tập hợp kết quả. Tuy nhiên, cú pháp USING
ngắn hơn và sạch hơn nhiều.
Sử dụng INNER JOIN với mệnh đề GROUP BY
Sử dụng hai bảng orders
và bảng orderdetails
:
Truy vấn này trả về số đơn đặt hàng, trạng thái đơn đặt hàng và tổng doanh số từ các bảng orders
và orderdetails
bằng cách sử dụng mệnh đề INNER JOIN
với mệnh đề GROUP BY
:
SELECT t1.orderNumber, t1.status, SUM(quantityOrdered * priceEach) total FROM orders t1 INNER JOIN orderdetails t2 ON t1.orderNumber = t2.orderNumber GROUP BY orderNumber;
Kết quả:
Tương tự, truy vấn sau đây sử dụng INNER JOIN
với cú pháp USING
:
SELECT orderNumber, status, SUM(quantityOrdered * priceEach) total FROM orders INNER JOIN orderdetails USING (orderNumber) GROUP BY orderNumber;
Ví dụ sử dụng INNER JOIN với ba bảng
Chúng ta sẽ sử dụng 3 bảng products
, orders
và orderdetails
:
Truy vấn này sử dụng hai mệnh đề INNER JOIN
để nối ba bảng orders
, orderdetails
và products
:
SELECT orderNumber, orderDate, orderLineNumber, productName, quantityOrdered, priceEach FROM orders INNER JOIN orderdetails USING (orderNumber) INNER JOIN products USING (productCode) ORDER BY orderNumber, orderLineNumber;
Một phần kết quả sẽ xuất hiện như hình bên dưới:
Ví dụ sử dụng INNER JOIN với bốn bảng
Chúng ta sẽ sử dụng 4 bảng sau: orders
, orderdetails
, customers
và products
.
Ví dụ này sử dụng ba mệnh đề INNER JOIN
để truy vấn dữ liệu từ bốn bảng trên:
SELECT orderNumber, orderDate, customerName, orderLineNumber, productName, quantityOrdered, priceEach FROM orders INNER JOIN orderdetails USING (orderNumber) INNER JOIN products USING (productCode) INNER JOIN customers USING (customerNumber) ORDER BY orderNumber, orderLineNumber;
Kết quả:
Ví dụ sử dụng INNER JOIN với các toán tử khác
Cho đến giờ, bạn đã thấy rằng điều kiện nối đã sử dụng toán tử bằng (=) cho các hàng phù hợp.
Ngoài toán tử bằng (=), bạn có thể sử dụng các toán tử khác như toán tử lớn hơn ( >
), nhỏ hơn ( <
) và không bằng nhau ( <>
) để tạo thành điều kiện nối.
Truy vấn sau đây sử dụng phép nối nhỏ hơn ( <
) để tìm giá bán của sản phẩm có mã S10_1678
thấp hơn giá bán lẻ đề xuất của nhà sản xuất (MSRP) cho sản phẩm đó.
SELECT orderNumber, productName, msrp, priceEach FROM products p INNER JOIN orderdetails o ON p.productcode = o.productcode AND p.msrp > o.priceEach WHERE p.productcode = 'S10_1678';
Kết quả:
Tổng Kết
Trong bài viết này, bạn sẽ học được cách sử dụng mệnh đề INNER JOIN
trong MySQL để chọn dữ liệu từ nhiều bảng dựa trên các điều kiện nối.
Bài viết liên quan:
- Cách sử dụng MySQL GROUP BY.
- Mệnh đề JOIN.
- Giới thiệu về aliases table và aliases column.
Các bạn có thể xem thêm ở đây: https://www.mysqltutorial.org/mysql-inner-join.aspx