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
ONcủ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à t2sử 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à productlinestrong 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
productCodevàproductNametừ bảngproducts. - Độ
textDescriptioncủa các dòng sản phẩm khỏi phảiproductlinesbà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
