9/5/2016<br />
<br />
CƠ SỞ DỮ LIỆU<br />
SQL NÂNG CAO<br />
<br />
Cơ sở dữ liệu – Tổng quan hệ thống cơ sở dữ liệu<br />
<br />
GIÁ TRỊ NULL<br />
Định nghĩa<br />
• Null là giá trị đặc biệt, không phải là hằng số, mà là giá trị không<br />
biết<br />
Đặc trưng<br />
• Các phép toán số học liên quan tới Null cho giá trị là Null<br />
• Các phép toán so sánh liên quan tới Null cho giá trị là Unknown<br />
• Phép toán so sánh IS NULL và IS NOT NULL<br />
Ví dụ<br />
• Liệt kê danh sách nhân viên không có lãnh đạo trực tiếp<br />
SELECT *<br />
FROM<br />
EMPLOYEE<br />
WHERE supervisorSSN IS NULL<br />
Ths. Trịnh Hoàng Nam, namth@buh.edu.vn<br />
<br />
Cơ sở dữ liệu – Tổng quan hệ thống cơ sở dữ liệu<br />
<br />
TOÁN TỬ AS<br />
Toán tử AS trong SQL<br />
• Được sử dụng để đổi tên cột hiển thị trong phần kết<br />
quả của câu truy vấn mà không ảnh hưởng đến bản<br />
thân các quan hệ trong mệnh đề WHERE của câu<br />
truy vấn đó<br />
Ví dụ<br />
• Liệt kê danh sách nhân viên và tên lãnh đạo trực tiếp<br />
SELECT E.EName AS ‘Tên nhân viên’,<br />
S.EName AS ‘Tên lãnh đạo trực tiếp’<br />
FROM EMPLOYEE E, EMPLOYEE S<br />
WHERE E.supervisorSSN=S.ESSN<br />
<br />
Ths. Trịnh Hoàng Nam, namth@buh.edu.vn<br />
<br />
1<br />
<br />
9/5/2016<br />
<br />
Cơ sở dữ liệu – Tổng quan hệ thống cơ sở dữ liệu<br />
<br />
TRUY VẤN LỒNG<br />
Định nghĩa<br />
• Câu lệnh truy vấn chứa câu lệnh truy vấn khác bên<br />
trong các thành phần của nó<br />
Đặc trưng<br />
• Kết quả trả về của câu truy vấn này được sử dụng<br />
trong một mệnh đề của câu truy vấn khác<br />
• Kết quả trả về của một câu truy vấn có thể là một giá<br />
trị đơn hoặc một quan hệ với nhiều bộ, nhiều thuộc<br />
tính<br />
• Một số toán tử so sánh: IN, NOT IN, ANY, SOME, ALL<br />
<br />
Ths. Trịnh Hoàng Nam, namth@buh.edu.vn<br />
<br />
Cơ sở dữ liệu – Tổng quan hệ thống cơ sở dữ liệu<br />
<br />
TRUY VẤN LỒNG<br />
Ví dụ<br />
• Cho biết danh sách các dự án có sự tham gia của<br />
nhân viên tên là ‘Lê Duy Anh’<br />
SELECT<br />
<br />
p.*<br />
<br />
FROM<br />
<br />
PROJECT p, EMPLOYEE e, WORKSON w<br />
<br />
WHERE<br />
<br />
p.ProNum = w.PNum AND w.ESSN = e.ESSN<br />
AND e.EName = N’Lê Duy Anh’<br />
<br />
?<br />
<br />
Độ phức tạp của truy vấn<br />
<br />
Ths. Trịnh Hoàng Nam, namth@buh.edu.vn<br />
<br />
Cơ sở dữ liệu – Tổng quan hệ thống cơ sở dữ liệu<br />
<br />
TRUY VẤN LỒNG<br />
Ví dụ<br />
• Cho biết danh sách các dự án có sự tham gia của<br />
nhân viên tên là ‘Lê Duy Anh’<br />
SELECT *<br />
FROM PROJECT<br />
WHERE PNumber IN (SELECT w.PNum<br />
FROM<br />
WORKSON w, EMPLOYEE e<br />
WHERE w.ESSN=e. ESSN<br />
AND e.EName = N’Lê Duy Anh’)<br />
<br />
?<br />
<br />
Độ phức tạp của truy vấn<br />
<br />
Ths. Trịnh Hoàng Nam, namth@buh.edu.vn<br />
<br />
2<br />
<br />
9/5/2016<br />
<br />
Cơ sở dữ liệu – Tổng quan hệ thống cơ sở dữ liệu<br />
<br />
TRUY VẤN LỒNG<br />
Ví dụ<br />
• Cho biết danh sách các dự án có sự tham gia của<br />
nhân viên tên là ‘Lê Duy Anh’<br />
SELECT *<br />
FROM PROJECT<br />
WHERE PNumber IN (SELECT w.PNum<br />
FROM<br />
WORKSON w<br />
WHERE w.ESSN IN (SELECT e.ESSN<br />
FROM<br />
EMPLOYEE e<br />
WHERE e.EName = N’…’)<br />
)<br />
<br />
?<br />
<br />
Độ phức tạp của truy vấn<br />
Ths. Trịnh Hoàng Nam, namth@buh.edu.vn<br />
<br />
Cơ sở dữ liệu – Tổng quan hệ thống cơ sở dữ liệu<br />
<br />
TRUY VẤN LỒNG<br />
Hàm EXISTS trong SQL<br />
• Được sử dụng để kiểm tra kết quả của câu truy vấn lồng<br />
xem có rỗng hay không<br />
Ví dụ<br />
• Cho biết tên các nhân viên chưa tham gia bất kỳ dự án nào<br />
của công ty<br />
SELECT EName<br />
FROM EMPLOYEE E<br />
WHERE NOT EXISTS (SELECT *<br />
FROM WOKRSON<br />
WHERE E.ESSN=ESSN)<br />
<br />
Ths. Trịnh Hoàng Nam, namth@buh.edu.vn<br />
<br />
Cơ sở dữ liệu – Tổng quan hệ thống cơ sở dữ liệu<br />
<br />
TRUY VẤN LỒNG<br />
Hàm EXISTS trong SQL<br />
• Được sử dụng để kiểm tra kết quả của câu truy vấn lồng xem<br />
có rỗng hay không<br />
• Có thể được viết lại bằng cách sử dụng toán tử so sánh IN<br />
Ví dụ<br />
• Cho biết tên các nhân viên chưa tham gia bất kỳ dự án nào<br />
của công ty<br />
SELECT EName<br />
FROM EMPLOYEE<br />
WHERE ESSN NOT IN (SELECT ESSN<br />
FROM WOKRSON)<br />
<br />
Ths. Trịnh Hoàng Nam, namth@buh.edu.vn<br />
<br />
3<br />
<br />
9/5/2016<br />
<br />
Cơ sở dữ liệu – Tổng quan hệ thống cơ sở dữ liệu<br />
<br />
BẢNG KẾT TRONG SQL<br />
Giới thiệu<br />
• Phép kết thể hiện thông qua việc sử dụng<br />
nhiều quan hệ trong mệnh đề FROM và các<br />
điều kiện kết tương ứng trong mệnh đề<br />
WHERE<br />
• Phép kết được thực hiện ngay trong mệnh<br />
đề FROM thông qua việc sử dụng các toán<br />
tử INNER JOIN, OUTER JOIN đi kèm điều<br />
kiện kết tương ứng<br />
<br />
Ths. Trịnh Hoàng Nam, namth@buh.edu.vn<br />
<br />
Cơ sở dữ liệu – Tổng quan hệ thống cơ sở dữ liệu<br />
<br />
BẢNG KẾT<br />
Ví dụ<br />
• Hiển thị tên và mức lương của các nhân viên trong<br />
phòng ‘Nghiên cứu’<br />
• Sử dụng phép nhân chéo và phép chọn:<br />
SELECT EName, ESalary<br />
FROM EMPLOYEE, DEPARTMENT<br />
WHERE DNum = DNumber AND DName=N’Phòng Nghiên cứu’<br />
<br />
• Sử dụng bảng kết:<br />
SELECT EName, ESalary<br />
FROM EMPLOYEE JOIN DEPARTMENT ON DNum = DNumber<br />
WHERE DName=N’Phòng Nghiên cứu’<br />
<br />
Ths. Trịnh Hoàng Nam, namth@buh.edu.vn<br />
<br />
Cơ sở dữ liệu – Tổng quan hệ thống cơ sở dữ liệu<br />
<br />
BẢNG KẾT<br />
Ví dụ<br />
<br />
SELECT EName, ESalary<br />
FROM EMPLOYEE, DEPARTMENT<br />
WHERE DNum = DNumber<br />
AND DName=N’Phòng Nghiên cứu’<br />
<br />
SELECT EName, ESalary<br />
FROM EMPLOYEE JOIN DEPARTMENT<br />
ON DNum = DNumber<br />
WHERE DName=N’Phòng Nghiên cứu’<br />
<br />
Ths. Trịnh Hoàng Nam, namth@buh.edu.vn<br />
<br />
4<br />
<br />
9/5/2016<br />
<br />
Cơ sở dữ liệu – Tổng quan hệ thống cơ sở dữ liệu<br />
<br />
BẢNG KẾT<br />
Ví dụ<br />
• Với mỗi nhân viên hãy hiển thị tên của người đó và<br />
tên của lãnh đạo trực tiếp của họ<br />
• Sử dụng phép nhân chéo và phép chọn:<br />
SELECT e.EName as ‘Employee’, s.EName as ‘Supervisor’<br />
FROM EMPLOYEE e, EMPLOYEE s<br />
WHERE e.supervisorSSN = s.ESSN<br />
<br />
• Sử dụng bảng kết:<br />
SELECT e.EName as ‘Employee’, s.EName as ‘Supervisor’<br />
FROM EMPLOYEE e JOIN EMPLOYEE s<br />
ON e.supervisorSSN = s.ESSN<br />
<br />
Ths. Trịnh Hoàng Nam, namth@buh.edu.vn<br />
<br />
Cơ sở dữ liệu – Tổng quan hệ thống cơ sở dữ liệu<br />
<br />
BẢNG KẾT<br />
Ví dụ<br />
<br />
SELECT e.EName as ‘Employee’,<br />
s.EName as ‘Supervisor’<br />
FROM EMPLOYEE e, EMPLOYEE s<br />
WHERE e.supervisorSSN = s.ESSN<br />
<br />
SELECT e.EName as ‘Employee’,<br />
s.EName as ‘Supervisor’<br />
FROM EMPLOYEE e JOIN EMPLOYEE s<br />
ON e.supervisorSSN = s.ESSN<br />
<br />
Ths. Trịnh Hoàng Nam, namth@buh.edu.vn<br />
<br />
Cơ sở dữ liệu – Tổng quan hệ thống cơ sở dữ liệu<br />
<br />
BẢNG KẾT<br />
Ví dụ<br />
• Với mỗi nhân viên hãy hiển thị tên của người đó và<br />
tên của lãnh đạo trực tiếp của họ<br />
• Tuy nhiên, trong bảng EMPLOYEE có tất cả 21 bộ với<br />
15 bộ có giá trị khác NULL tại thuộc tính supervisor<br />
ứng với 15 bộ trả về bởi câu truy vấn<br />
SELECT e.EName as ‘Employee’,<br />
s.EName as ‘Supervisor’<br />
FROM EMPLOYEE e JOIN EMPLOYEE s<br />
ON e.supervisorSSN = s.ESSN<br />
<br />
• Làm thế nào để hiển thị hết đầy đủ 21 bộ của quan hệ<br />
EMPLOYEE theo yêu cầu đề bài?<br />
Ths. Trịnh Hoàng Nam, namth@buh.edu.vn<br />
<br />
5<br />
<br />