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.
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:
FROM
( t1
).INNER JOIN
( t2
, t3
,…).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
:
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:
productCode
và productName
từ bảng products
.textDescription
của các dòng sản phẩm khỏi phải productlines
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 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;
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:
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ả:
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ả:
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ác bạn có thể xem thêm ở đây: https://www.mysqltutorial.org/mysql-inner-join.aspx
Bình luận: