Truy vấn con trong SQL (SubQuery)

Databases Schema Example:

Database Schema Example

1. Khái niệm truy vấn con

Để kết hợp các bảng dữ liệu với nhau, ngoài các phép nối và các toán tử tập hợp, SQL cung cấp một cách khác để trả lại dữ liệu từ nhiều bảng gọi là truy vấn con (subquery). Khi một câu lệnh SELECT được sử dụng trong một câu lệnh khác, câu lệnh SELECT bên trong được gọi là truy vấn con (subquery), cách gọi khác là truy vấn lồng (nested query), truy vấn trong (inner query). Cơ bản một truy vấn con có thể được sử dụng ở bất cứ nơi đâu mà một biểu thức có thể được sử dụng.

Ví dụ: Đưa ra các đơn hàng gần đây nhất

Truy vấn con  SELECT MAX(orderDate) FROM orders trả lại ngày gần đây nhất trong các đơn hàng và giá trị này sẽ được sử dụng trong mệnh đề WHERE của truy vấn ngoài. Kết hợp hai truy vấn trên sẽ trả lại danh sách các đơn hàng của ngày gần nhất.

sub query example 1

 

Truy vấn con được chia làm hai loại: truy vấn con không tương quan (subquery non-correlated) và truy vấn con có tương quan (subquery correlated)

2.Truy vấn con không tương quan (subquery non-correlated)

Một truy vấn con không tương quan là truy vấn con độc lập với truy vấn bên ngoài. Truy vấn con không tương quan được thi hành thi hành đầu tiên và một lần duy nhất cho toàn bộ câu lệnh. Kết quả của truy vấn con được điền vào truy vấn bên ngoài, và cuối cùng thi hành truy vấn bên ngoài.

Ví dụ: đưa các các sản phẩm không có mặt trong bất kỳ một đơn hàng nào. Truy vấn con bên trong sẽ trả về các mã sản phẩm có trong bảng orderdetails. Truy vấn bên ngoài sẽ trả về các sản phẩm có mã không trong danh sách các mã sản phẩm đó.

sub query non-correlated 1

Ví dụ:đưa ra các sản phẩm có mặt trong các đơn hàng

sub query non-correlated 2

3.Truy vấn con tương quan (subquery correlated)

Truy vấn con tương quan không độc lập với truy vấn bên ngoài. Một truy vấn con tương quan là một truy vấn con sử dụng các giá trị từ truy vấn bên ngoài trong mệnh đề WHERE của nó. Quá trình thực hiện như sau: các truy vấn bên ngoài được thực hiện trước tiên và sau đó thi hành truy vấn con bên trong cho mỗi dòng kết quả của truy vấn bên ngoài.

Ví dụ: Đưa ra các sản phẩm có số lượng trong kho lớn hơn trung bình số lượng trong kho của các sản phẩm cùng loại.

sub query correlated

Quá trình thực hiện truy vấn như sau: với mỗi dòng sản phẩm của truy vấn bên ngoài, câu lệnh truy vấn bên trong sẽ tìm ra số lượng sản phẩm trung bình của của sản phẩm cùng loại với sản phẩm đó và kết quả của truy vấn con sẽ được đưa vào mệnh đề WHERE để kiểm tra.

Ví dụ: đưa ra các sản phẩm có mặt trong các đơn hàng, cách viết dưới đây là một cách khác của ví dụ ở phần trước. Sử dụng toán tử EXISTS để kiểm tra sự tồn tại.

sub query correlated 2

4.Sử dụng truy vấn con (subquery)

Ngoài sử dụng truy vấn con trong mệnh đề WHERE, truy vấn con còn có thể được sử dụng trong danh sách các cột của câu lệnh SELECT hoặc trong mệnh đề FROM.

Ví dụ: với mỗi dòng đơn hàng, đưa vào thêm tên của sản phẩm.

sub query use example 1

Trong ví dụ trên tên của sản phẩm là kết quả của truy vấn con trên bảng products

Ví dụ: với mỗi sản phẩm, đưa kèm thêm tổng số lượng sản phẩm đó đã được đặt hàng

sub query use example 2

Trong ví dụ trên giá trị tổng số lượng được đặt là kết quả của truy vấn từ bảng orderDetails

Ví dụ trên có thể viết lại bằng cách coi kết quả của truy vấn con như một bảng dữ liệu, sau đó nối bảng products với bảng kết quả này.

Kết quả của truy vấn cho kết quả tương tự như truy vấn trước

sub query use example 3

 

5.Bài tập thực hành theo schema example

  1. Sử dụng truy vấn con đưa ra các sản phẩm có đơn đặt hàng trong tháng 3/2005.
  2. Tương tự như câu hỏi 1 nhưng dùng phép nối bảng thay vì sử dụng truy vấn con.
  3. Sử dụng truy vấn con đưa ra các thông tin về các đơn hàng trong tháng gần nhất (sử dụng thông tin từ bảng orders).
  4. Sử dụng truy vấn con đưa ra thông tin về các đơn hàng và tổng giá trị đơn hàng (sử dụng thông tin từ bảng orders và orderdetails).
  5. Cũng như câu hỏi 4, nhưng sử dụng phép nối bảng thay vì sử dụng truy vấn con.

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">