MySQL so sánh JOIN và Subquery (truy vấn lồng hoặc truy vấn con)

0
562

Một truy vấn JOIN là một truy vấn kết hợp các bản ghi từ hai hoặc nhiều bảng dữ liệu. Một phép JOIN sẽ được thực hiện bất cứ khi nào nhiều bảng xuất hiện sau mệnh đề FROM của câu truy vấn. Danh sách lựa chọn của câu truy vấn có thể chọn bất kỳ cột nào từ bất kỳ bảng nào trong số các bảng. Nếu điều kiện nối bị bỏ qua hoặc không hợp lệ thì câu truy vấn chưa tốt. Nếu truy vấn bất kỳ hai bảng nào trong số các bảng có trùng tên cột, thì các cột này phải đủ điều kiện trong suốt truy vấn với các tên bảng hoặc bí danh bảng để tránh sự mơ hồ làm câu truy vấn chạy chậm. Hầu hết các truy vấn JOIN đều chứa ít nhất một điều kiện, sau mệnh đề FROM hoặc trước mệnh đề WHERE.

1. MySQL truy vấn con Subquery nghĩa là gì?

Truy vấn con hoặc Truy vấn bên trong hoặc Truy vấn lồng nhau là một truy vấn trong truy vấn SQL và được nhúng trong mệnh đề WHERE hoặc bên ngoài mệnh đề WHERE. Truy vấn con là một câu lệnh SELECT được nhúng trong một mệnh đề của câu lệnh SQL khác. Chúng có thể rất hữu ích để chọn các hàng từ một bảng với điều kiện phụ thuộc vào dữ liệu trong cùng một bảng hoặc một bảng khác. Truy vấn con được sử dụng để trả về dữ liệu sẽ được sử dụng trong truy vấn chính như một điều kiện để hạn chế hơn nữa dữ liệu được truy xuất. Truy vấn con có thể được đặt trong các mệnh đề SQL sau, chúng là mệnh đề WHERE, mệnh đề HAVING, mệnh đề FROM.

Ví dụ:

SELECT a.*
FROM product AS a
WHERE a.category_id IN (SELECT c.category_id WHERE product_category AS c)

Hoặc
SELECT 
 c.*,
 (SELECT COUNT(a.product_id) FROM product AS a WHERE a.category_id = 7) AS total_products_per_category
FROM product_category AS c
WHERE c.category_id = 7

... vv

Tùy vào bài toán cụ thể sẽ có rất nhiều kiểu phát biểu truy vấn con MySQL Subquery bên trong một câu truy vấn.

MySQL MariaDB Subquery

Quay trở lại bài toán so sánh JOIN vs Subquery ta cùng đi xét một vài ưu nhược điểm của JOIN và Subquery

2. Ưu điểm của truy vấn dùng JOIN

  • Lợi thế cho phép kết nối phát biểu nhanh câu truy vấn – thực thi nhanh.
  • Truy xuất kết nối hầu như luôn nhanh hơn truy vấn con (*).
  • Bằng cách sử dụng phép nối, bạn có thể tối đa hóa gánh nặng tính toán trên cơ sở dữ liệu, tức là thay vì nhiều truy vấn sử dụng một truy vấn nối. Điều này có nghĩa là bạn có thể sử dụng tốt hơn khả năng của cơ sở dữ liệu để tìm kiếm, lọc, sắp xếp, v.v.

3. Nhược điểm của truy vấn dùng JOIN

  • Bất lợi của việc sử dụng các phép nối bao gồm việc chúng không dễ đọc như các truy vấn con.
  • Nhiều tham gia hơn trong một truy vấn có nghĩa là máy chủ cơ sở dữ liệu phải thực hiện nhiều công việc hơn, có nghĩa là quá trình truy xuất dữ liệu tốn nhiều thời gian hơn (**).
  • Vì có nhiều loại phép nối khác nhau, nên có thể gây nhầm lẫn không biết phép nối nào là kiểu phép nối thích hợp để sử dụng để mang lại tập kết quả mong muốn chính xác hoặc performance tốt hơn (**).
  • Không thể tránh được phép nối khi truy xuất dữ liệu từ cơ sở dữ liệu chuẩn hóa, nhưng điều quan trọng là phép nối phải được thực hiện chính xác, vì phép nối không chính xác có thể dẫn đến giảm hiệu suất nghiêm trọng và kết quả truy vấn không chính xác.

4. Ưu điểm của Subquery

  • Truy vấn con chia các câu truy vấn phức tạp thành các phần riêng biệt để có thể chia truy vấn phức tạp thành một chuỗi các bước hợp lý.
  • Nó dễ hiểu và việc bảo trì mã cũng dễ dàng.
  • Truy vấn con cho phép bạn sử dụng kết quả của một truy vấn khác trong truy vấn bên ngoài.
  • Trong một số trường hợp, các truy vấn con có thể thay thế các phép nối và liên kết phức tạp.

5. Nhược điểm của Subquery

  • Trình tối ưu hóa dành cho MYSQL cho các phép nối hơn là cho các truy vấn con, vì vậy trong nhiều trường hợp, một câu lệnh sử dụng một truy vấn con có thể được thực thi hiệu quả hơn nếu bạn viết lại nó dưới dạng phép nối.
  • Chúng ta không thể sửa đổi một bảng và chọn từ cùng một bảng trong một truy vấn con trong cùng một câu lệnh SQL.

Kết luận

  • Truy vấn con dễ viết hơn, nhưng một liên kết có thể được máy chủ tối ưu hóa tốt hơn. Ví dụ, kết nối Left Outer thường hoạt động nhanh hơn vì các máy chủ tối ưu hóa nó.
  • Bài viết dựa trên cách sử dụng. Nếu xét về yếu tố hiệu năng, công năng – performance của DB (*), (**) còn phải tùy thuộc vào bài toán thực tế. Đối với các dữ liệu của một bảng có số records dưới 1 triệu items bạn sẽ khó để so sánh cái này sử dụng tốt hơn, chạy nhanh hơn cái nào, nhưng khi với các dự liệu DB lớn hàng Gb thì lúc đó sẽ thấy công năng – performance thực tế cái nào hơn cái nào, nếu không dựa trên kinh nghiệm phát biểu truy vấn MySQL có thể bạn sẽ làm cho Server DB chạy rất chậm do câu truy vấn kết nối nhiều items hoặc quá nhiều điều kiện tính toán trước khi trả về giá trị cần lấy ra.

Có thể bạn quan tâm: >> MySQL cách truy vấn chỉ lấy 2 sản phẩm của mỗi danh mục category

nhantam
Thiết kế web tại Panpic.vn

BÌNH LUẬN

Vui lòng nhập bình luận của bạn
Vui lòng nhập tên của bạn ở đây

28 − = 26