Các truy vấn con đơn giản nhất có thể được thực hiện một lần cho tất cả, và kết quả được sử dụng trong truy vấn mức cao hơn. Việc sử dụng các truy vấn con lồng nhau phức tạp hơn đòi hỏi truy vấn con được thực hiện nhiều lần, mỗi lần đối với một phép gán giá trị cho một mục nào đó trong truy vấn con. Giá trị gán xuất phát từ một biến bộ ở bên ngoài truy vấn con. Một truy vấn con kiểu như vậy được gọi là một truy vấn con tương quan. Chúng ta bắt đầu bằng một ví dụ.
Ví dụ 19: Chúng ta muốn đưa ra Họđệm và Tên của các nhân viên có lương lớn hơn lương trung bình của đơn vị của họ. Chúng ta xem xét lần lượt các bộ của quan hệ NHÂNVIÊN, với mỗi bộ như vậy, chúng ta đòi hỏi trong một truy vấn con liệu giá trị của Lương có lớn hơn trung bình lương của đơn vị có mã số giống như giá trị của thành phần MãsốĐV của bộ hay không. Toàn bộ truy vấn được viết như sau:
SELECT Họđệm, Tên
FROM NHÂNVIÊN NV
WHERE (Lương >
(SELECT (AVG(Lương)
FROM NHÂNVIÊN
WHERE MãsốĐV = NV.MãsốĐV;
Giống như với các truy vấn lồng nhau khác, chúng ta hãy bắt đầu từ truy vấn con trong cùng, các dòng từ 4) đến 6). Nếu NV.MãsốĐV dòng 6 được thay bằng một số nguyên như là 5, chúng ta có thể hiểu nó hoàn toàn dễ dàng như là một truy vấn hỏi trung bình lương của đơn vị có mã số là
Truy vấn con hiện tại có khác một tý. Vấn đề là ở chỗ chúng ta không biết MãsốĐV có giá trị như thế nào. Tuy nhiên, như chúng ta sắp xếp trên các bộ của truy vấn ngoài từ dòng 1) đến dòng 3), mỗi bộ cung cấp một giá trị của Mã sốĐV. Sau đó chúng ta thực hiện truy vấn từ dòng 4) đến dòng 6) với giá trị đó của Mã sốĐV để quyết định chân trị của mệnh đề WHERE trải trên các dòng từ 3) đến 6). Điều kiện của dòng 3) là đúng nếu có một đơn vị có trung bình lương nhỏ hơn lương của bộ đang xét.
Kết quả
Họđệm Tên
Trần Đức Nam
Nguyễn Sơn
Phạm Bằng
Hoàng Giáp
Khi viết một truy vấn tương quan, điều quan trọng là chúng ta phải nhận thức được quy tắc phạm vi đối với các tên. Nói chung, một thuộc tính trong một truy vấn con thuộc về một trong các biến bộ của mệnh đề FROM của truy vấn con đó nếu một quan hệ nào đó của biến bộ có thuộc tính đó trong lược đồ của nó. Nếu không, chúng ta tìm ở truy vấn trực tiếp ngay bên ngoài ….
Tuy nhiên, chúng ta có thể sắp xếp cho một thuộc tính thuộc về một biến bộ khác nếu chúng ta viết trước nó một biến bộ và một dấu chấm. Điều đó là vì chúng ta đã đưa ra bí danh NV cho quan hệ NHÂNVIÊN của truy vấn ngoài và vì chúng ta tham chiếu đến NV.Mã sốĐV trong dòng 6). Chú ý rằng nếu hai quan hệ trong các mệnh đề FROM của các dòng 2) và 5) là khác nhau, chúng ta không cần đến bí danh. Dĩ nhiên, trong truy vấn con, chúng ta có thể tham chiếu trực tiếp đến các thuộc tính của quan hệ được chỉ ra trong dòng 2).