A. Subquery NON-correlated: truy vấn con độc lập với truy vấn bên ngoài. Truy vấn con đượ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
B. Subquery correlated: Truy vấn con không độc lập hay có liên quan với truy vấn bên ngoài. 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
YÊU CẦU:
- Hiển thị thông tin các nhân viên có mức lương cao nhất
- Hiển thị thông tin nhân viên có mức lương lớn hơn mức lương trung bình của toàn công ty
- Hiển thị thông tin nhân viên có mức lương lớn hơn tất cả các mức lương của nhân viên trong phòng PB001
- Hiển thị thông tin nhân viên có mức lương lớn hơn một trong các mức lương của nhân viên trong phòng PB001
- Hiển thị thông tin nhân viên thuộc các phòng ban có chữ "San Xuat"
- Hiển thị các phòng ban không có nhân viên nào
- Hiển thị thông tin nhân viên mà nhân viên đó chưa được phân bổ phòng ban
- Hiển thị thông tin các nhân viên trong nhóm có lương cao thứ 3
THỰC HIỆN
Sử dụng database của bài trước (bài 5)
1. Hiển thị thông tin các nhân viên có mức lương cao nhất
SELECT * FROM nhan_vien
WHERE luong = (
SELECT MAX(luong) FROM nhan_vien);
2. Hiển thị thông tin nhân viên có mức lương lớn hơn mức lương trung bình của toàn công ty
SELECT * FROM nhan_vien
WHERE luong > (
SELECT AVG(luong) FROM nhan_vien);
3. Hiển thị thông tin nhân viên có mức lương lớn hơn tất cả các mức lương của nhân viên trong phòng PB001
SELECT * FROM nhan_vien
WHERE luong > ALL (
SELECT luong FROM nhan_vien WHERE phongban_id = "PB001" );
4. Hiển thị thông tin nhân viên có mức lương lớn hơn một trong các mức lương của nhân viên trong phòng PB001
SELECT * FROM nhan_vien
WHERE luong > ANY (
SELECT luong FROM nhan_vien WHERE phongban_id = "PB001" );
5. Hiển thị thông tin nhân viên thuộc các phòng ban có chữ "San Xuat"
SELECT * FROM nhan_vien
WHERE phongban_id IN (
SELECT id FROM phong_ban WHERE ten_pb LIKE "San Xuat%");
6. Hiển thị các phòng ban không có nhân viên nào
SELECT * FROM phong_ban
WHERE NOT EXISTS (
SELECT * FROM nhan_vien WHERE phong_ban.id = nhan_vien.phongban_id);
-- có thể dùng LEFT JOIN để so sánh kết quả
SELECT * FROM phong_ban
LEFT JOIN nhan_vien ON phong_ban.id = nhan_vien.phongban_id
WHERE nhan_vien.id IS NULL;
7. Hiển thị thông tin nhân viên mà nhân viên đó chưa được phân bổ phòng ban
SELECT * FROM nhan_vien
WHERE NOT EXISTS (
SELECT * FROM phong_ban WHERE phong_ban.id = nhan_vien.phongban_id);
-- không dùng subquery, chúng ta có thể dùng câu này để so sánh kết quả
SELECT * FROM nhan_vien WHERE phongban_id IS NULL;
SELECT * FROM nhan_vien
WHERE luong = (
SELECT DISTINCT luong
FROM nhan_vien
ORDER BY luong DESC
LIMIT 2, 1 -- bỏ qua 2 dòng và lấy 1 dòng
)
;
Xong!
No comments:
Post a Comment