bài 4.4 - sql (structured query language) - sql server
Post on 26-May-2015
2.842 Views
Preview:
TRANSCRIPT
11
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Truy vấn con
22
TRƯỜ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ếtAi 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
33
TRƯỜ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_cotFROM bangWHERE bieu_thuc toan_tu
(SELECT bieu_thuc FROM bang)
44
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
SELECT honv, tennvFROM qlns.nhanvienWHERE mucluong > (SELECT mucluong FROM qlns.nhanvien WHERE tennv = N‘Huyền');
Sử dụng truy vấn con
5.000.000
55
TRƯỜ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.
66
TRƯỜ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òngTruy vấn chính
Truy vấn con Trả về
• Truy vấn con một dòng
77
TRƯỜ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òngToá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
88
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
SELECT tennv, macongviec, mucluongFROM qlns.nhanvienWHERE 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
99
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
SELECT tennv, macongviec, mucluongFROM qlns.nhanvienWHERE 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
1010
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.nhanvienGROUP BY maphongHAVING MIN(mucluong) > (SELECT MIN(mucluong) FROM qlns.nhanvien WHERE maphong = 60)
3.000.000
1111
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
SELECT manhanvien, tennvFROM qlns.nhanvienWHERE 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 1Subquery returned more than 1 value….
1212
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, macongviecFROM qlns.nhanvienWHERE macongviec = (SELECT macongviec FROM qlns.nhanvien WHERE tennv = 'Haà');
Truy vấn con không trả về giá trị nào cả
1313
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òngToá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
1414
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, mucluongFROM qlns.nhanvienWHERE mucluong < ANY (SELECT mucluong FROM qlns.nhanvien WHERE macongviec = ‘BHANG')AND macongviec <> ‘BHANG';
1.200.000, 4.000.000
1515
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
SELECT manhanvien, tennv, macongviec, mucluongFROM qlns.nhanvienWHERE 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
1616
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.tennvFROM qlns.nhanvien nvWHERE 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
1717
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
1818
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
1919
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
2020
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, maphongFROM qlns.nhanvienWHERE (STR(manguoiquanly)+STR(maphong)) IN (SELECT STR(manguoiquanly)+STR(maphong) FROM qlns.nhanvien WHERE manhanvien = 143)AND manhanvien NOT IN (143)
2121
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_luongFROM qlns.nhanvien a, (SELECT maphong, AVG(mucluong) tb_luong FROM qlns.nhanvien GROUP BY maphong) bWHERE a.maphong = b.maphongAND a.mucluong > b.tb_luong;
Sử dụng truy vấn con trong mệnh đề FROM
2222
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
2323
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 CASESELECT 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) diabanFROM qlns.nhanvien
SELECT manhanvien, tennvFROM qlns.nhanvien nvORDER BY (SELECT tenphong FROM qlns.phong ph
WHERE nv.maphong = ph.maphong)
20
Trong mệnh đề ORDER BY
2424
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ợpTruy 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
EXECUTETruy vấn con thi hành theo giá trị vừa đọc
USECác giá trị trả về từ truy vấn con được
sử dụng để xử lý hoặc hiển thị
2525
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
2626
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 BangChaWHERE mucluong > (SELECT AVG(mucluong)
FROM qlns.nhanvien WHERE maphong =
BangCha.maphong)
Sử dụng truy vấn con kết hợpTì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
2727
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
2828
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
SELECT manhanvien, tennv, macongviec, maphongFROM qlns.nhanvien BangChaWHERE EXISTS ( SELECT 'X' FROM qlns.nhanvien WHERE manguoiquanly = BangCha.manhanvien)
Sử dụng hàm EXISTSTìm những nhân viên có quản lý ít nhất một người
2929
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
top related