NGÔN NGỮ SQLCác truy vấn lồng nhau Để tìm mã số và tên những nhân viên phòng ‘Kỹ thuật’ có thể dùng câu truy vấn sau SELECT manv, ho_ten FROM nhan_vien WHERE ma_dv IN SELECT ma_dv FROM p
Trang 1NGÔN NGỮ SQL
Các truy vấn lồng nhau
Để tìm mã số và tên những nhân viên phòng ‘Kỹ thuật’ có thể dùng câu truy vấn sau
SELECT manv, ho_ten
FROM nhan_vien
WHERE ma_dv IN
(SELECT ma_dv
FROM phong
WHERE ten_phong = ‘Kỹ thuật’);
58
Trang 2NGÔN NGỮ SQL
Các truy vấn lồng nhau
Xét câu hỏi: ‘Tìm tên của những nhân viên có lương đạt trên mức lương trung bình của tất cả các nhân viên, đồng thời cho biết luôn mức chênh lệch này’
SELECT ho_ten , luong – (SELECT AVG(luong) FROM
nhan_vien) AS hieu
FROM nhan_vien
WHERE luong >
(SELECT AVG(luong)
FROM nhan_vien);
Trang 3NGÔN NGỮ SQL
Các truy vấn lồng nhau
Câu ORDER BY không được sử dụng trong một câu truy vấn con mặc dù nó có thể được dùng trong câu truy vấn ngoài
cùng
Danh sách các mục được liệt kê bởi câu truy vấn con
SELECT phải chứa tên của một cột hoặc một biểu thức trừ phi câu truy vấn con này dùng từ khóa EXISTS
Trang 4NGÔN NGỮ SQL
Các truy vấn lồng nhau
Theo ngầm định, các tên cột trong câu truy vấn con tham chiếu đến tên bảng trong câu FROM của truy vấn con này, hoặc có thể tham chiếu đến bảng trong câu FROM của truy vấn ngoài bằng việc xác định tên cột đó
Khi một câu truy vấn con là một trong hai toán hạng của một biểu thức so sánh thì truy vấn con này phải xuất hiện ở vế phải của so sánh
Trang 5NGÔN NGỮ SQL
Các truy vấn lồng nhau
Muốn biết thông tin về những nhân viên làm việc cho đơn vị có địa điểm là ’23 Lý Thường Kiệt’, có thể dùng truy vấn như sau
SELECT *
FROM nhan_vien
WHERE ma_dv IN
(SELECT ma_dv
FROM dia_diem_dv
WHERE dia_diem = ’23 Lý Thường Kiệt);
Trang 6NGÔN NGỮ SQL
Các truy vấn lồng nhau
“ Tìm tên và lương của những người có lương cao hơn lương mọi nhân viên thuộc đơn vị mã P2 “
SELECT ho_ten
FROM nhan_vien
WHERE luong > ALL
(SELECT luong
FROM nhan_vien
WHERE ma_dv = ’P2’);
Trang 7NGÔN NGỮ SQL
Các truy vấn lồng nhau
Câu hỏi “ Cho biết thông tin về những nhân viên có lương cao hơn ít nhất một nhân viên làm ở phòng kỹ thuật”
SELECT ho_ten
FROM nhan_vien
WHERE luong > SOME
(SELECT luong
FROM nhan_vien
WHERE ma_dv IN
(SELECT ma_dv
FROM phong
WHERE ten_phong = ‘Kỹ thuật’) );
Trang 8NGÔN NGỮ SQL
Các truy vấn lồng nhau
“ Cho biết tên phòng có trung bình lương cao nhất” sẽ được viết là
SELECT ten_phong
FROM phong
WHERE ma_dv IN
(SELECT ma_dv
FROM nhan_vien
GROUP BY ma_dv HAVING AVG(luong) >= ALL
(SELECT AVG(luong)
FROM nhan_vien
GROUP BY ma_dv)
Trang 9NGÔN NGỮ SQL
Dùng các biến bộ
Để tìm thông tin về tên và lương của trưởng phòng nghiên cứu phát triển
SELECT nv.ho_ten, nv.luong
FROM nhan_vien nv, phong p
WHERE nv.manv = p.ma_tp AND
p.ten_phong = ‘Nghiên cứu và phát triển’
Các biến bộ rất hữu ích trong việc so sánh hai bộ trong cùng một quan hệ
Trang 10NGÔN NGỮ SQL
Dùng các biến bộ
Có thể tìm nhân viên có lương cao hơn ít nhất lương của một nữ nhân viên bằng câu lệnh sau :
SELECT DISTINCT nv.ho_ten, nv.luong
FROM nhan_vien a, nhan_vien b
WHERE a.luong > b.luong AND b.gioi_tinh = ‘nu’
Trang 11NGÔN NGỮ SQL
Các quan hệ được dẫn xuất và khung nhìn
SQL-92 cho phép dùng câu hỏi con trong
câu FROM, trong đó bảng kết quả của câu hỏi con phải được đặt tên và các cột được phép đổi tên Một kết quả như vậy được gọi
là một quan hệ (bảng) được dẫn xuất.
Trang 12NGÔN NGỮ SQL
Các quan hệ được dẫn xuất và khung nhìn
“Tìm lương trung bình của các phòng có lương trung bình lớn hơn 2 100 000”, trong SQL (chuẩn 92) có thể viết như sau:
SELECT ma_phong, luong_tb
FROM (SELECT ma_dv, AVG(luong)
FROM nhan_vien
GROUP BY ma_dv)
AS ket_qua (ma_phong, luong_tb)
WHERE luong_tb > 2 100 000
Trang 13Xin cảm ơn !