Giới thiệu về mệnh đề INNER JOIN trong MySQL

03/05/2023 - lượt xem
Chia sẻ
 
5/5 - (1 bình chọn)

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 ( t2t3,…).
  • 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à 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 productCode và productName từ bảng products.
  • Độ textDescription của các dòng sản phẩm khỏi phải productlinesbà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 ordersorderdetails 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,  ordersorderdetails:

Truy vấn này sử dụng hai mệnh đề INNER JOIN để nối ba bảng ordersorderdetails 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:  ordersorderdetailscustomers 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

    Liên hệ với chúng tôi

    Để lại thông tin để nhận được các bài viết khác

    5/5 - (1 bình chọn)

    Xem thêm nhiều bài tin mới nhất về MySql Cơ Bản

    Xem thêm