Truy vấn lồng SQL

Truy vấn lồng SQL hay Subquery trong SQL

Thông thường chúng ta vẫn hay gặp những câu truy vấn SQL có dạng như thế này

SELECT MAX(SalesOrderID
FROM Sales.SalesOrderHeader

Không nói thì bạn cũng biết câu truy vấn này sẽ trả lại giá trị cao nhất trong cột SaleOrderHeader, nếu không biết thật thì xem bài này nhé. Nhưng nếu ta lấy câu lệnh trên và lồng nó vào một truy vấn chính thì chúng ta có thêm một truy vấn con xuất hiện trong câu truy vấn chính, ví dụ:

SELECT SalesOrderID, ProductID, OrderQty
FROM Sales.SalesOrderDetail
WHERE SalesOrderID = (
                                              SELECT MAX(SalesOrderID)
                                              FROM Sales.SalesOrderHeader
                                            )

Những mệnh đề mà GNV gạch chân ở dưới thì được gọi là truy vấn lồng SQL hay truy vấn con SQL hoặc tiếng anh thì là Subquery trong SQL

Hiểu một cách đơn giản, truy vấn lồng trong SQL là một truy vấn nhỏ được lồng trong truy vấn chính, nghe giống như hàm IF lồng trong Excel vậy. Truy vấn lồng SQL có thể xuất hiện ở mệnh đề SELECT, FROM hay thậm chí là WHERE.
Có hai loại subqueries mà Data Analyst thường sử dụng là Scalar Subqueries và Multi-values subqueries.

1/ Scalar Subqueries

Truy vấn lồng SQL –  Scalar Subqeries là truy vấn con được lồng trong mệnh đề Select chính, với mục tiêu trả lại một giá trị để phục vụ cho mệnh đề Select chính. Như ví dụ đầu tiên, nếu chúng ta thực hiện tìm giá trị lớn nhất trước sau đó thay giá trị lớn nhất vào mệnh đề Where ở câu lệnh thứ 2 vậy thì chúng ta phải chạy 2 câu lệnh mới ra được kết quả. Thay vì đó chúng ta lồng câu lệnh 1 vào câu lệnh 2 thì chúng ta chỉ cần chạy 1 câu lệnh là được.

VD: với bảng HR1, mình muốn tìm ra thông tin của nhan viên có điểm đào tạo cao nhất thì mình chỉ cần một câu truy vấn sau đây.

Thay vì mình phải tìm nhân viên có điểm đào tạo cao nhất là 99, sau đó thay vào câu lệnh tìm thông tin có điểm đào tạo cao nhất thì giờ tất cả chỉ cần 1 lần chạy. 

Scalar cúng có thể được sử dụng trong mệnh dề SELECT với ví dụ sau đây:

Mình muốn in ghi chép của nhân viên có điểm đào tạo lớn lơn điểm đào tạo trung bình ( 63). Câu lệnh này mình có sử dụng hai truy vấn lồng SQL, mệnh đề con một dùng để có thể biết dược điểm đào tạo trung bình là bao nhiêu và một câu lệnh truy vấn lông để tìm ra nhân viên có điểm đào tạo lớn hơn điểm đào tạo trung bình.

 

Bạn cũng có thể tạo câu truy ván lồng với truy vấn con đặc ở mệnh đề FROM.  Bạn có thể vận dụng linh hoạt các câu truy vấn phụ để có thể tạo ra câu lệnh truy vấn tốt hơn. 

Logic để viết các câu lệnh truy vấn lồng rất đơn giản, bạn phát triển từ câu lệnh chính, xem câu lệnh chính của mình có cần lấy dữ liệu từ bảng nào hay không, hay chúng cần điều kiện gì, từ đó chúng ta sẽ bổ sung các câu lệnh truy vấn lồng SQL vào chỗ cần thay thế đó. Tuy nhiên, chúng ta cũng cần thời gian để luyện tập và sử dụng thành thạo và trong một số trường hợp chúng ta sẽ gặp lỗi khi kết hợp truy vấn con. Chúng ta cần thực hành nhiều để có thể rút ra kinh nghiệm và hiểu được chúng.

Phần tiếp theo mình sẽ giúp các bạn hiểu được cách sử dụng câu lệnh truy vấn lồng SQL – multi-values Subqueries, bạn có thể xem bài viết này ở đây nhé.


Nội dung