29
1 1 TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Truy vấn con

Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

Embed Size (px)

Citation preview

Page 1: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

11

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

Truy vấn con

Page 2: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 3: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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)

Page 4: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 5: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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.

Page 6: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 7: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 8: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 9: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 10: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 11: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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….

Page 12: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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ả

Page 13: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 14: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 15: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 16: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 17: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 18: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 19: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 20: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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)

Page 21: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 22: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 23: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 24: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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ị

Page 25: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 26: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 27: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 28: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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

Page 29: Bài 4.4 - SQL (STRUCTURED QUERY LANGUAGE) - SQL server

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