SQL Server - Truy vấn con

• Truy vấn con thi hành môt lần trước

truy vấn chính (truy vấn cha).

• Kết quả trả về từ truy vấn con được sử

dụng trong câu truy vấn chính.

pdf29 trang | Chuyên mục: SQL Server | Chia sẻ: dkS00TYs | Lượt xem: 3596 | Lượt tải: 1download
Tóm tắt nội dung SQL Server - Truy vấn con, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
1TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Truy vấn con
2TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Vấn đề cần giải quyết
Ai có mức lương cao hơn lương của 
‘Trần Hồng’ ?
Những nhân viên nào có mức lương lớn 
hơn lương của NV ‘Trần Hồng’?
Truy vấn chính:
?
Mức lương của Trần Hồng là 
bao nhiêu?
?
Truy vấn con
3TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Cú pháp truy vấn con
• Truy vấn con thi hành môt lần trước 
truy vấn chính (truy vấn cha).
• Kết quả trả về từ truy vấn con được sử 
dụng trong câu truy vấn chính.
SELECT ds_cot
FROM bang
WHERE bieu_thuc toan_tu
 (SELECT bieu_thuc
 FROM bang)
4TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
SELECT honv, tennv
FROM qlns.nhanvien
WHERE mucluong >
 (SELECT mucluong
 FROM qlns.nhanvien
 WHERE tennv = N‘Huyền');
Sử dụng truy vấn con
5.000.000
5TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Một số quy tắc khi sử dụng truy vấn con
• Câu truy vấn con phải nằm trong cặp ngoặc 
đơn. 
• Đặt truy vấn con bên phải điều kiện so sánh.
• Mệnh đề ORDER BY trong truy vấn con là 
không cần thiết ngoại trừ khi có sử dụng 
mệnh đề TOP.
• Sử dụng các toán tử một dòng với các truy 
vấn con trả về một dòng và sử dụng các toán 
tử nhiều dòng với các truy vấn con trả về 
nhiều dòng.
6TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Các dạng truy vấn con
Truy vấn chính
Truy vấn con 
Trả về
Một dòng
• Truy vấn con nhiều dòng
Nhiều dòng
Truy vấn chính
Truy vấn con 
Trả về
• Truy vấn con một dòng
7TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Truy vấn con một dòng
• Trả về duy nhất 1 dòng
• Sử dụng các toán tử so sánh một dòng
Toán tử
=
>
 >=
<
 <=
Ý nghĩa
Bằng
Lớn hơn
Lớn hơn hoặc bằng
Nhỏ hơn
Nhỏ hơn học bằng
Không bằng
8TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
SELECT tennv, macongviec, mucluong
FROM qlns.nhanvien
WHERE macongviec = 
 (SELECT macongviec
 FROM qlns.nhanvien
 WHERE manhanvien = 141)
AND mucluong >
 (SELECT mucluong
 FROM qlns.nhanvien
 WHERE manhanvien = 143);
Truy vấn con một dòng
TTHI
3.000.000
9TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
SELECT tennv, macongviec, mucluong
FROM qlns.nhanvien
WHERE mucluong = 
 (SELECT MIN(mucluong)
 FROM qlns.nhanvien);
Sử dụng hàm nhóm dữ liệu trong 
truy vấn con
1.200.000
10
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Mệnh đề HAVING với truy vấn con
• Các truy vấn con được thi hành trước tiên.
• Kết quả được trả về cho mệnh đề HAVING 
trong truy vấn chính.
SELECT maphong, MIN(mucluong)
FROM qlns.nhanvien
GROUP BY maphong
HAVING MIN(mucluong) >
 (SELECT MIN(mucluong)
 FROM qlns.nhanvien
 WHERE maphong = 60)
3.000.000
11
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
SELECT manhanvien, tennv
FROM qlns.nhanvien
WHERE mucluong =
 (SELECT MIN(mucluong)
 FROM qlns.nhanvien
 GROUP BY maphong)
Câu lệnh sau sai ở chỗ nào?
Toán tử một dòng được sử dụng với truy vấn 
con nhiều dòng
Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value….
12
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Câu lệnh sau có trả về kết quả nào không?
SELECT tennv, macongviec
FROM qlns.nhanvien
WHERE macongviec =
 (SELECT macongviec
 FROM qlns.nhanvien
 WHERE tennv = 'Haà');
Truy vấn con không trả về giá trị nào cả
13
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Truy vấn con nhiều dòng
• Trả về nhiều dòng
• Sử dụng các toán tử so sánh nhiều dòng
Toán tử
 IN
 ANY
 ALL
Ý nghĩa
Bằng một trong các giá trị
Chỉ cần thỏa một trong các giá trị trả về 
bởi truy vấn con
Phải thỏa tất cả các giá trị trả về bởi truy 
vấn con
14
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Sử dụng toán tử ANY
…
SELECT manhanvien, tennv, macongviec, mucluong
FROM qlns.nhanvien
WHERE mucluong < ANY
 (SELECT mucluong
 FROM qlns.nhanvien
 WHERE macongviec = ‘BHANG')
AND macongviec ‘BHANG';
1.200.000, 4.000.000
15
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
SELECT manhanvien, tennv, macongviec, mucluong
FROM qlns.nhanvien
WHERE mucluong < ALL
 (SELECT mucluong
 FROM qlns.nhanvien
 WHERE macongviec = ‘TPHONG')
AND macongviec ‘TPHONG';
Sử dụng toán tử ALL
9.000.000, 3.000.000 
16
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Cẩn thận với giá trị NULL trong truy 
vấn con
SELECT nv.tennv
FROM qlns.nhanvien nv
WHERE nv.manhanvien NOT IN
 (SELECT qly.manguoiquanly
 FROM qlns.nhanvien qly)
???
• Tìm những nhân viên không quản lý bất cứ người nào
17
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Thực hành
• Tạo truy vấn con để truy vấn các giá trị dựa trên những 
tiêu chí đã biết khác
• Sử dụng truy vấn con để tìm ra những giá trị nào có trong 
một tập dữ liệu này và không có trong những tập khác
18
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Phần mở rộng của Truy vấn con
19
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Mục tiêu
• Truy vấn con nhiều cột
• Truy vấn con trong mệnh đề FROM
• Sử dụng truy vấn con đơn trị (scalar subquery)
• Viết truy vấn con kết hợp (Correlated subquery)
• Sử dụng hàm EXISTS
20
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Truy vấn con trả về nhiều cột 
Liệt kê danh sách những nhân viên được quản lý bởi 
bởi cùng một người và làm trong cùng phòng với nhân 
viên có mã số là 143.
SELECT manhanvien, manguoiquanly, maphong
FROM qlns.nhanvien
WHERE (STR(manguoiquanly)+STR(maphong)) IN
 (SELECT STR(manguoiquanly)+STR(maphong)
 FROM qlns.nhanvien
 WHERE manhanvien = 143)
AND manhanvien NOT IN (143)
21
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
SELECT a.tennv, a.mucluong, 
 a.maphong, b.tb_luong
FROM qlns.nhanvien a, (SELECT maphong, 
 AVG(mucluong) tb_luong
 FROM qlns.nhanvien
 GROUP BY maphong) b
WHERE a.maphong = b.maphong
AND a.mucluong > b.tb_luong;
Sử dụng truy vấn con trong mệnh đề FROM
22
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Biểu thức truy vấn con đơn trị
• Biểu thức truy vấn con đơn trị (A scalar subquery expression) 
là một truy vấn con trả về duy nhất một cột và một dòng.
• Truy vấn con đơn trị có thể sử dụng:
− Trong các điều kiện và biểu thức của CASE
− Trong tất cả các mệnh đề của SELECT ngoại trừ GROUP BY 
23
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Ví dụ Truy vấn con đơn trị
Trong biểu thức CASE
SELECT manhanvien, tennv,
 (CASE
 WHEN maphong =
 (SELECT maphong FROM qlns.phong
WHERE makhuvuc = 1800) 
 THEN N‘Sài gòn' ELSE N‘Hà nội' END) diaban
FROM qlns.nhanvien
SELECT manhanvien, tennv
FROM qlns.nhanvien nv
ORDER BY (SELECT tenphong
 FROM qlns.phong ph
 WHERE nv.maphong = ph.maphong)
20
Trong mệnh đề ORDER BY
24
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Truy vấn con kết hợp
Truy vấn con kết hợp (Correlated subqueries) được sử 
dụng cho việc xử lý từng dòng. Mỗi truy vấn con sẽ 
được thi hành một lần ứng với mỗi dòng của truy vấn 
cha
GET
Đọc dòng (giá trị) từ truy vấn cha
EXECUTE
Truy vấn con thi hành theo giá trị vừa đọc
USE
Các giá trị trả về từ truy vấn con được 
sử dụng để xử lý hoặc hiển thị
25
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Truy vấn con kết hợp
 SELECT cot1, cot2, ...
 FROM bang1
 WHERE cot1 toan_tu 
 (SELECT cot1, cot2
 FROM bang2
 WHERE bieu_thuc1 = 
.bieu_thuc2)
bang_cha
Câu truy vấn con liên kết với cột từ bảng của truy vấn cha
bang_cha
26
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
SELECT tennv, mucluong, maphongFROM qlns.nhanvien BangCha
WHERE mucluong > (SELECT AVG(mucluong)
 FROM qlns.nhanvien
 WHERE maphong = 
 BangCha.maphong) 
Sử dụng truy vấn con kết hợp
Tìm tất cả những nhân viên có mức lương lớn 
hơn mức lương trung bình trong phòng của 
mình
Mỗi lần một dòng trong 
câu truy vấn bên ngoài 
được xử lý thì câu truy 
vấn con lại được tính lại
27
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Sử dụng hàm EXISTS
• Hàm EXISTS kiểm tra tồn tại kết quả trả 
về từ câu truy vấn con.
• Tìm thấy một dòng trong truy vấn con:
−
Kết thúc tìm kiếm trong truy vấn con
− Trả về kết quả TRUE
• Nếu chưa tìm thấy dòng nào:
− Trả về FALSE
− Tiếp tục tìm kiếm trong truy vấn con
28
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
SELECT manhanvien, tennv, macongviec, maphong
FROM qlns.nhanvien BangCha
WHERE EXISTS ( SELECT 'X'
 FROM qlns.nhanvien
 WHERE manguoiquanly = 
 BangCha.manhanvien)
Sử dụng hàm EXISTS
Tìm những nhân viên có quản lý ít nhất một người
29
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Thực hành
• Tạo truy vấn con nhiều cột
• Viết truy vấn con kết hợp
• Sử dụng truy vấn con đơn trị
• Sử dụng hàm EXISTS 

File đính kèm:

  • pdfSQL Server - Truy vấn con.pdf
Tài liệu liên quan