Phép Join trong MySQL

Như mình đã nói ở trên thì phép JOIN giúp bạn truy vấn dữ liệu từ hai hay nhiều bảng dữ liệu với nhau. Trên thực tế thì đôi khi bạn không cần phép JOIN bạn cũng có khả năng giải quyết bài toán của bạn nhưng nó sẽ phức tạ

Như mình đã nói ở trên thì phép JOIN giúp bạn truy vấn dữ liệu từ hai hay nhiều bảng dữ liệu với nhau. Trên thực tế thì đôi khi bạn không cần phép JOIN bạn cũng có khả năng giải quyết bài toán của bạn nhưng nó sẽ phức tạp hơn. Số lượng kết nối tới mấy chủ CSDL sẽ nhiều hơn ảnh hưởng trực tiếp tới hiệu năng xử lý của hệ thống.

Thì trong bài viết này mình sẽ tóm tắt các phép JOIN trong MySQL.

Trong MySQL có ba phép JOIN chính.(Mệnh đề JOIN và INNER JOIN là tương đương)

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • OUTER JOIN
    • LEFT OUTER JOIN
    • RIGHT OUTER JOIN
  • CROSS JOIN

Thì điều kiện gì để thực hiện một phép JOIN thành công ở đây chúng ta chỉ sét là INNER JOIN và OUTER JOIN là giữa các bảng này phải có các trường liên kết. Nếu các bảng không có sự liên kết với nhau thì các bạn nên nghĩ tới CROSS JOIN hoặc sử dụng UNION trong MySQL. 

Các trường liên kết có thể hiểu nó giống như là một sợi dây liên kết vậy. Bạn cứ tưởng tượng trong thực tế là làm sao để Cô A có quan hệ huyết thống mẹ con với Anh B. Thì chúng ta sẽ nghĩ ngay đó chính là hai nghười họ có ADN gần giống nhau.

Hoặc quan hệ giữa hai bảng orders và order_details là trong bảng order_details giữ khóa chính(orderID hoặc orderNumber) của bảng orders làm khóa ngoại của mình. 

Giả sử bây giờ mình muốn lấy chi tiết của một đơn hàng có orderNumber = 10100 thì chúng ta se lấy hết record ở bảng orders và những records ở bảng orderdetails có orderNumber= 10100.

1
2
3
4
SELECT *
FROM orders t1
INNER JOIN orderdetails t2 ON t1.orderNumber = t2.orderNumber
WHERE t1.orderNumber = '10100'

Try In Out

Chúng ta sẽ đi tìm hiểu từng lệnh phép JOIN trong MySQL. Và chúng ta sẽ sử dụng CSDL mẫu để làm ví dụ cho bài viết này nhé.

1. INNER JOIN 

Lệnh trả về kết quả là các bản ghi mà trường được JOIN ở hai bảng khớp nhau, các bản ghi chỉ xuất hiện ở một trong hai bảng sẽ không xất hiện ở trong kết quả.

Lưu ý:

Mệnh đề MySQL INNER JOIN là một phần tùy chọn của câu lệnh SELECT. Nó xuất hiện ngay sau mệnh đề FROM của câu lệnh SELECT.

Chúng ta sẽ có điều kiện cần và đủ để thực hiện truy vấn sử dụng mệnh đề INNER JOIN hay JOIN

  • Trước tiên, bạn phải xác định bảng chính xuất hiện trong mệnh đề FROM.
  • Thứ hai, bạn cần chỉ định bảng mà bạn muốn JOIN với bảng chính, xuất hiện trong mệnh đề INNER JOIN. Về mặt lý thuyết, bạn có thể JOIN một bảng với nhiều bảng. Tuy nhiên, để có kết quả truy vấn tốt hơn, bạn nên giới hạn số lượng bảng cần JOIN.
  • Thứ ba, bạn cần chỉ định điều kiện kết nối(JOIN). Điều kiện kết nối xuất hiện sau từ khoá ON của mệnh đề INNER JOIN. Điều kiện kết nối là quy tắc để kết hợp các hàng giữa bảng chính và các bảng khác.
1
2
3
4
5
6
SELECT [Danh_sách_cột]
FROM [Bảng_1]
INNER JOIN [Bảng_2] ON [Điều_Kiện_JOIN_1]
INNER JOIN [Bảng_3] ON [Điều_Kiện_JOIN_2]
...
WHERE [Điều_Kiện];

Ví dụ: Chúng ta sẽ tiến hành thực hiện một ví dụ như sau. Chúng ta sử dụng hai bảng là products và productlines.

  • Hai field productName và productCode từ bảng products
  • Kết hợp với một file txtDescription  từ bảng productlines.
1
2
3
4
5
6
7
SELECT
    productCode,
    productName,
    textDescription
FROM
    products t1
INNER JOIN productlines t2 ON t1.productline = t2.productline;

Try In Out

2. LEFT JOIN

Lấy về các records có mặt trong bảng bến trái(A) và cả các records phù hợp với điều kiện khớp nối trong bảng bên phải. Với các bảng ghi không phù hợp xuấy hiện trong bảng bên phải sẽ được điền giá trị NULL.

1
2
3
4
5
SELECT [Danh_sách_các_cột]
FROM [Bảng_1] AS A
LEFT JOIN [Bảng_2] AS B ON A.column_name = B.column_name
....
;

Khi chúng ta nối bảng A vào bảng B bằng cách mệnh đề LEFT JOIN, nếu một hàng từ bảng bên trái A khớp với một hàng từ bảng bên phải B dựa trên điều kiện khớp nối (A.column_name = B.column_name ). Thì những records xuất hiện trong bảng B sẽ bao gồm trong tập kết quả.

Ví dụ. Chúng ta sẽ sử dụng hai bảng customers và orders để thực hiện ví dụ. Trong ví dụ này mình sẽ lấy các field  customerNumber, customerName trong bảng customers kết hợp với hai trường orderNumber,statustrong bảng orders

1
2
3
4
5
6
7
8
SELECT
 c.customerNumber,
 c.customerName,
 orderNumber,
 o.status
FROM
 customers c
LEFT JOIN orders o ON c.customerNumber = o.customerNumber;

Try In Out

3. RIGHT JOIN

Ngược với LEFT JOIN là trả về các records xuất hiện trong bảng bên phải và các records phù hợp trong bảng bên trái.

1
2
3
4
5
SELECT [Danh_sách_các_cột]
FROM [Bảng_1] AS A
RIGHT JOIN [Bảng_2] AS B ON A.column_name = B.column_name
....
;

Ví dụ: Chúng ta vẫn sẽ sử dụng hai bảng customers và orders để thực hiện ví dụ. Trong ví dụ này mình sẽ lấy các field  customerNumber, customerName trong bảng customers kết hợp với hai trường orderNumber,statustrong bảng orders

1
2
3
4
5
6
7
8
9
10
SELECT
    o.orderNumber,
    o.STATUS,
    c.customerName,
    c.customerNumber
FROM
    orders o
RIGHT JOIN customers c ON o.customerNumber = c.customerNumber
WHERE
    o.customerNumber IS NULL;

Try In Out

3. CROSS JOIN

Kết quả là mỗi bản ghi của bảng A được kết hợp với tất cả các bản ghi của bảng B.

Cú pháp:

1
2
SELECT [Danh_sách_các_cột]
FROM [Bảng_1] CROSS JOIN [Bảng_2];

Một điểm khác biệt giữa INNER JOIN hoặc LEFT JOIN với CROSS JOIN là CROSS JOIN không có điều kiện kết hợp(điều kiện JOIN)

Giả sử mỗi một bảng bạn có 1.000.000 records thì sau khi sử dụng CROSS JOIN bạn sẽ có tập kết quả là 1.000 * 1.000 = 1,000,000.

Chú ý: Nếu bạn thêm một mệnh đề WHERE, Trong trường hợp bảng A và bảng B có mối quan hệ, CROSS JOIN hoạt động giống như mệnh đề INNER JOIN:

1
2
3
SELECT [Danh_sách_các_cột]
FROM [Bảng_1] CROSS JOIN [Bảng_2]
WHERE [Bảng_1].id=[Bảng_2].id

Ví dụ: Tiếp tục chúng ta sẽ sử dụng hai bảng customers và orders.

1
2
3
4
5
6
7
8
SELECT
    o.orderNumber,
    o.`status`,
    c.customerName,
    c.customerNumber
FROM
    orders o
CROSS JOIN customers c

Try In Out

Tổng kết.

Qua bài viết này mình đã hướng dẫn các bán sử dụng phép JOIN trong MySQL. Có thể nói rằng mệnh đề JOIN là mệnh đề khá quan trọng. Bạn cứ tưởng tượng nếu không có phép JOIN thì số lượng truy vấn của bạn tới CSDL sẽ là rất lớn. Lúc đó ứng dụng của bạn sẽ ì ạch chạy từng command. Trong các phép JOIN trên thì có lẽ INNER JOIN sẽ được sử dụng nhiều nhất nên các bạn cần lắm thật kỹ bộ quy tắc của nó.


Code Dev

144 Blog posts

Comments