Tìm hiểu Subquery trong Oracle
Trong bài viết này chúng ta sẽ tìm hiểu một phần khá hay đó là subquery trong Oracle. Subquery hay còn gọi là truy vấn con, nghĩa là bạn sẽ tạo ra những truy vấn nhỏ để đưa nó vào truy vấn cha.
1. Subquery trong Oracle
Như các bạn biết lệnh SELECT sẽ trả về một bảng dữ liệu mới, bảng này sẽ không lưu vào hệ thống mà là một bảng tạm (local temporary) và sẽ tự giải phóng khi câu truy vấn kết thúc. Như vậy ta hoàn toàn có thể thực hiện một truy vấn trên bảng kết quả đó, và ta chỉ thực hiện được truy vấn tìm kiếm trên nó mà thôi.
Ví dụ: Tìm nhân viên có mức lương cao nhất
SELECT * FROM employees WHERE salary = ( SELECT max(salary) FROM employees );
Ở lệnh truy vấn con sẽ trả về row có mức lương cao nhất, sau đó sẽ thực hiện so sánh ở truy vấn cha và đưa ra kết quả chính xác.
Bài viết này được đăng tại [free tuts .net]
Đây chỉ là một ví dụ giúp các bạn hiểu, chứ thực tế bài này bạn không nên sử dụng subquery vì sẽ không tối ưu.
2. Một vài ví dụ Subquery trong Oracle
Dưới đây sẽ là một vài ví dụ, mình sẽ không giải thích ý nghĩa của từng lệnh mà thay vào đó bạn hãy tự đọc và suy ngẫm nhé.
Sử dụng ở FROM
SELECT count(*) FROM ( SELECT * FROM employees WHERE last_name LIKE 'A%' );
Sử dụng ở WHERE
SELECT * FROM employees e1 WHERE e1.salary = ( SELECT max(salary) FROM employees e2 WHERE e1.department_id = e2.department_id );
Sử dụng ở SELECT
SELECT ( SELECT avg(salary) FROM employees) AS avg_sal, salary FROM employees;
Nested Subquery
Nested subquery tức là bạn sử dụng nhiều lệnh truy vấn con trong một lệnh cha.
SELECT count(*) FROM ( SELECT salary, ( SELECT avg(salary) FROM employees) avg_sal FROM employees ) WHERE salary > avg_sal;
Oracle chỉ cho phép bạn sử dụng 255 cấp truy vấn con, một con số không ai sử dụng hết được :)
3. Lời kết
Nếu một bài toán có thể giải quyết được ở cách thông thường mà không cần sử dụng subquery thì bạn nên dùng cách thông thường nhé, bởi subquery sẽ tốn nhiều tài nguyên hơn.
Bài này đã hướng dẫn bạn subquery và gì và cách sử dụng trong Oracle, hẹn gặp lại các bạn ở bài tiếp theo.