Truy vấn lồng • Các câu lệnh SELECT có thể lồng nhau ở nhiều mức • Các câu truy vấn con trong cùng một mệnh đề WHERE được kết hợp bằng phép nối logic • Câu truy vấn con thường trả về một
Trang 1CƠ SỞ DỮ LIỆU
GV: ThS Lương Thị Ngọc Khánh
Email: ltnkhanh@it.tdt.edu.vn
Web: it.tdt.edu.vn/~ltnkhanh
Trang 2Chương III
NGÔN NGỮ SQL NÂNG CAO
Câu truy vấn dữ liệu phức tạp Bảng ảo View
Hàm – thủ tục - trigger Bài tập
Trang 3– DeAn(tenda, mada, ddiemda, maphong)
– PhanCong(manv, mada, thoigian)
– ThanNhan(manv, tentn, phai, ngaysinh, quanhe)
Trang 4Truy vấn lồng
• Các câu lệnh SELECT có thể lồng nhau ở nhiều mức
• Các câu truy vấn con trong cùng một mệnh
đề WHERE được kết hợp bằng phép nối logic
• Câu truy vấn con thường trả về một tập các giá trị
Trang 6Truy vấn lồng (tt)
• Mệnh đề WHERE của câu truy vấn cha
– <biểu thức> <so sánh tập hợp> <truy vấn con> – So sánh tập hợp thường đi cùng với một số toán
tử
• IN, NOT IN
• ALL
• ANY hoặc SOME
– Kiểm tra sự tồn tại
• EXISTS
• NOT EXISTS
Trang 7– Câu truy vấn con sẽ được thực hiện trước, 1 lần
• Lồng tương quan
– Mệnh đề WHERE của truy vấn con tham chiếu ít nhất một thuộc tính của các bảng trong mệnh đề FROM ở truy vấn cha
– Khi thực hiện, câu truy vấn con sẽ được thực hiện nhiều lần, mỗi lần tương ứng với một bộ của truy vấn cha
Trang 8Truy vấn lồng (tt)
– Ví dụ truy vấn lồng phân cấp:
SELECT MANV, TENNV
FROM NHANVIEN, DDPhong
WHERE DIADIEM = ‘ TP HCM’ AND phong = maphong
– Tương đương với câu truy vấn lồng sau:
SELECT MANV, TENNV
Trang 10Truy vấn lồng (tt)
– Ví dụ truy vấn lồng tương quan:
SELECT MANV, TENNV
SELECT MANV, TENNV
FROM NHANVIEN, PHONGBAN
WHERE TENPHONG=‘Nghien cuu’ AND PHONG=MAPHONG
Trang 13– <tên cột> IN <câu truy vấn con>
– Thuộc tính ở mệnh đề SELECT của truy vấn con phải có cùng kiểu dữ liệu với thuộc tính ở mệnh đề WHERE của truy vấn cha
Trang 14– COUNT(DISTINCT <tên thuộc tính>) đếm số giá trị khác nhau và khác NULL của thuộc tính
• MIN, MAX, SUM, AVG
Trang 15– Select sum(luong) as ‘tong luong’,
min(luong) as ‘luong nho nhat’, max(luong) as ‘luong lon nhat’, avg(luong) as ‘luong tb’
From NhanVien
– Cho biết số lượng nhân viên của phòng „Nghien cuu‟
Trang 16Hàm kết hợp và gom nhóm (tt)
• Gom nhóm:
– Nhóm các bộ có cùng giá trị ở một tập các thuộc tính lại với nhau
– Cú pháp:
SELECT <danh sách các cột>
FROM <danh sách các bảng>
WHERE <điều kiện>
GROUP BY <danh sách các cột gom nhóm>
Trang 18FROM PHANCONG, NHANVIEN WHERE MANVIEN=MANV
GROUP BY MA_NVIEN, HONV, TENNV
– Cho biết những nhân viên tham gia từ 2 đề án trở lên
Trang 19WHERE <điều kiện>
GROUP BY <danh sách các cột gom nhóm>
HAVING <điều kiện trên nhóm>
• Ví dụ: Cho biết những nhân viên tham gia
từ 2 đề án trở lên
Trang 21• Mệnh đề HAVING
– Sử dụng các hàm kết hợp trong mệnh đề SELECT
để kiểm tra một số điều kiện nào đó
– Chỉ kiểm tra điều kiện trên nhóm, không là điều kiện lọc trên từng bộ
– Sau khi gom nhóm điều kiện trên nhóm mới được thực hiện
Hàm kết hợp và gom nhóm (tt)
Trang 22• Thứ tự thực hiện câu truy vấn có mệnh đề GROUP BY và HAVING
– (1) Chọn ra những dòng thỏa điều kiện trong mệnh
Hàm kết hợp và gom nhóm (tt)
Trang 2323
01-2014 504009 – Ngôn ngữ SQL nâng cao
Hàm kết hợp và gom nhóm (tt)
• Ví dụ:
– Tìm phòng ban có lương trung bình cao nhất
– Tìm 3 nhân viên có lương cao nhất
– Tìm tên các nhân viên được phân công làm tất
cả các đồ án
Trang 24Điều kiện kết ở mệnh đề FROM
• Thông thường điều kiện của phép kết nối được chỉ định trong mệnh đề where của câu truy vấn
• Chuẩn SQL2 đưa ra một cách khác để biểu diễn cho phép nối Trong cách biểu diễn này: – Điều kiện của phép kết nối được chỉ định ngay trong mệnh đề From
– Ưu điểm: Cho phép biểu diễn phép nối và điều kiện nối rõ ràng (đặc biệt trong trường hợp phép nối được thực hiện từ 3 bảng trở lên)
Trang 2525
01-2014 504009 – Ngôn ngữ SQL nâng cao
Điều kiện kết ở mệnh đề FROM (tt)
• Kết nối bằng (kết nối trong)
Trang 26Điều kiện kết ở mệnh đề FROM (tt)
• Kết nối bằng (kết nối trong)
- Ví dụ: Hiển thị họ tên và ngày sinh, tên lớp của ds sinh viên lớp „Cong nghe thong tin 01‟
select hoten, ngaysinh, tenlop From SinhVien, LopHoc
Where SinhVien.malop = LopHoc.malop
and tenlop = ‘Cong nghe thong tin 01’
- Hoặc có thể viết:
select hoten, ngaysinh, tenlop From SinhVien INNER JOIN LopHoc ON SinhVien.malop = LopHoc.malop
Where tenlop = ‘Cong nghe thong tin 01’
Trang 2727
01-2014 504009 – Ngôn ngữ SQL nâng cao
Điều kiện kết ở mệnh đề FROM (tt)
• Kết nối ngoài
– Cú pháp:
SELECT <danh sách các cột>
FROM R1 LEFT|RIGHT|FULL [OUTER] JOIN R2
ON <biểu thức> WHERE <điều kiện>
– Ví dụ:
Trang 28Điều kiện kết ở mệnh đề FROM (tt)
• Kết nối ngoài
– Ví dụ: ta có 2 bảng NhanVien và DonVi như sau:
• Khi đó, phép kết nối ngoài trái 2 bảng trên cho kết quả sau:
select *
from NhanVien left join DonVi
Trang 2929
01-2014 504009 – Ngôn ngữ SQL nâng cao
Điều kiện kết ở mệnh đề FROM (tt)
• Kết nối ngoài
– Ví dụ: ta có 2 bảng NhanVien và DonVi như sau:
• Phép kết nối ngoài phải 2 bảng trên cho kết quả sau:
select *
from NhanVien right join DonVi
on NhanVien.madv = DonVi.madv
Trang 30Điều kiện kết ở mệnh đề FROM (tt)
• Kết nối ngoài
– Ví dụ: ta có 2 bảng NhanVien và DonVi như sau:
• Phép kết nối ngoài đầy đủ 2 bảng trên cho kết quả sau:
select *
from NhanVien full join DonVi
Trang 3131
01-2014 504009 – Ngôn ngữ SQL nâng cao
Điều kiện kết ở mệnh đề FROM (tt)
Trang 32Điều kiện kết ở mệnh đề FROM (tt)
• Ví dụ:
– Tìm họ tên các nhân viên và tên các đề án nhân viên tham gia nếu có
Trang 33– Không được lưu trữ vật lý (bảng ảo)
– Không chứa dữ liệu
– Được định nghĩa từ những bảng khác
– Có thể truy vấn hay cập nhật thông qua khung nhìn
Trang 34• Số dòng phụ thuộc vào điều kiện ở mệnh đề WHERE
• Dữ liệu được lấy từ các bảng ở mệnh đề FROM
• Xóa bỏ khung nhìn:
DROP VIEW <tên khung nhìn>
Khung nhìn (View)
Trang 35WHERE PHG=5
• Sử dụng khung nhìn như một bảng
SELECT TENNV FROM NVP5
WHERE luong > 2000
Trang 36Khung nhìn (View)
• Sinh viên tự tìm hiểu thêm về: Cập nhật, bổ sung và xóa dữ liệu qua view
Trang 37THỦ TỤC LƯU TRỮ - HÀM -
TRIGGER
37
Trang 38Biến cục bộ
• Biến là một đối tượng có thể chứa dữ liệu
• Dữ liệu có thể đưa vào các câu lệnh SQL dùng cục bộ
• Tên các biến cục bộ phải bắt đầu bằng @
– Ví dụ:
Trang 40Biến cục bộ (tt)
• Ví dụ:
– Ta có LĐQH CTDONDH(mavtu, sohd, sldat)
• Để tính ra số lượng đặt hàng cao nhất của mặt hàng
“Đầu DVD Hitachi 1 đĩa” có mã vật tư là “DD01” Sử dụng lệnh SELECT như sau:
DECLARE @MaxSldat INT
SELECT @MaxSldat=MAX(SLDAT)
FROM CTDONDH
WHERE MAVTU=‘DD01’
Trang 4141
01-2014 504009 – Ngôn ngữ SQL nâng cao
Biến cục bộ (tt)
– Xem giá trị của biến
• PRINT @Tên_biến | Biểu_thức_chuỗi
– Ví dụ: Tính giá trị số lượng đặt hàng thấp nhất
và cao nhất, hiển thị kết quả ra màn hình
DECLARE @MinSldat INT, @MaxSldat INT
Trang 4545
01-2014 504009 – Ngôn ngữ SQL nâng cao
VÍ dụ
45
Trang 46Ví dụ (tt)
Viết thủ tục thêm một mặt hàng vào bảng MATHANG
CREATE PROC SP_THEMMATHANG (
INSERT INTO MATHANG VALUES(@MAHANG, @TENHANG,
@MANCC, @SOLUONG, @DVT, @GIAHANG)
END
Trang 48Thủ tục thêm một mặt hàng vào bảng MATHANG có kiểm tra ràng buộc khóa chính và khóa ngoại với bảng NHACUNGCAP
CREATE PROC SP_THEMMATHANG (
@MAHANG CHAR(2),
@TENHANG NVARCHAR(20),
@MANCC CHAR(3), @SOLUONG INT,
@DVT NVARCHAR(20), @GIAHANG INT)
AS
BEGIN
IF (@MAHANG IN (SELECT MAHANG FROM MATHANG))
PRINT 'MA HANG KHONG HOP LE !' else IF (@MANCC NOT IN(SELECT MANCC FROM NHACUNGCAP))
PRINT 'MA NHA CUNG CAP KHONG HOP LE !' else
INSERT INTO MATHANG VALUES(@MAHANG,
@TENHANG, @MANCC, @SOLUONG, @DVT, @GIAHANG)
Trang 4949
01-2013 504009 – Ngôn ngữ SQL nâng cao
• Viết thủ tục đếm số lượng bán được của mặt hàng có mã nhập vào từ bàn phím
CREATE PROC SP_THONGKE(
WHERE MAHANG = @MAHANG GROUP BY MAHANG
PRINT 'SO LUONG BAN DUOC CUA MAT HANG CO MA "' +
@MAHANG + '" LA: ' + CONVERT(VARCHAR(10),@SLBAN)
Trang 5151
01-2014 504009 – Ngôn ngữ SQL nâng cao
• Câu lệnh ALTER PROCEDURE được sử dụng để sửa một thủ tục lưu trữ
• Cú pháp giống như lệnh CREATE PROCEDURE
• Sự thay đổi này vẫn giữ lại các quyền người dùng
Trang 5353
01-2014 504009 – Ngôn ngữ SQL nâng cao
Hàm (function)
• Là đối tượng CSDL tương tự thủ tục
• Điểm khác biệt giữa hàm và thủ tục:
– Hàm trả về một giá trị thông qua tên hàm còn thủ tục thì không
• Có thể sử dụng hàm như là một thành phần của một biêu thức
• Do HQT CSDL cung cấp sẵn
• Có thể được định nghĩa bởi người sử dụng
53
Trang 5555
01-2014 504009 – Ngôn ngữ SQL nâng cao
Hàm trả về kiểu bảng
([danh_sách_tham_số]) RETURNS TABLE
55
Trang 58Hàm trả về kiểu bảng
• Lưu ý:
– Cấu trúc bảng trả về bởi hàm được xác định dựa vào định nghĩa của bảng trong mệnh đề RETURNS
– Biến @<biến_bảng> trong mệnh đề RETURNS có
phạm vi sử dụng trong hàm và được sử dụng như một tên bảng
– Câu lệnh RETURN trong thân hàm không chỉ định giá trị trả về Giá trị trả về của hàm chính là các dòng dữ
liệu trong bảng có tên là @<biếnbảng> được định
nghĩa trong mệnh đề RETURNS
Trang 5959
01-2013 504009 – Ngôn ngữ SQL nâng cao
Ví dụ: Hàm thống kê số lượng sinh viên của mỗi khoa
CREATE FUNCTION Func_Tongsv(@khoahoc SMALLINT) RETURNS
FROM khoa k, lop lh, sinhvien sv
WHERE k.makhoa = lh.makhoa and lh.malop = sv.malop
Trang 60Ví dụ (tt)
• Câu lệnh:
SELECT * FROM dbo.func_TongSV(25)
– Sẽ cho kết quả thống kê tổng số sinh viên khoá
25 của mỗi khoa:
Trang 61– Khóa chính (PRIMARY KEY)
– Khóa ngoại (FOREIGN KEY)
– CHECK
• Nhưng làm thế nào để đảm bảo sĩ số của 1 lớp phải luôn đúng trong CSDL sau :
– SINHVIÊN ( MaSV, TenSV, MaLop)
– LỚP (MaLop, TenLop, SiSo)
Trang 62Trigger (tt)
• Với loại ràng buộc trên, khi người dùng :
– Thêm 1 sinh viên
– Sửa mã lớp trên bảng SINHVIÊN
– Hay xóa 1 sinh viên
đều ảnh hưởng tới sĩ số của 1 lớp
• Để đảm bảo tính đúng đắn của sĩ số, ta cần
1 loại đối tượng có thể tự động gọi khi người
trên bảng SINHVIÊN
Trang 64dụ cộng sĩ số thêm 1 nếu thêm 1 sinh viên, trừ
sĩ số đi 1 nếu xóa 1 sinh viên …
Trang 6565
01-2014 504009 – Ngôn ngữ SQL nâng cao
Ưu/ nhược điểm Trigger
Trang 6767
01-2014 504009 – Ngôn ngữ SQL nâng cao
Ví dụ Trigger
• Ví dụ cho 2 lđqh sau:
– Sinhvien(masv, tensv, malop)
– Lop(malop, tenlop, siso)
• cập nhật sĩ số lớp khi thêm 1 sinh viên
CREATE TRIGGER trg_CapNhatSiSo
ON SINHVIEN
FOR INSERT
AS
UPDATE LOP
SET LOP.SiSo = LOP.SiSo + 1
FROM LOP INNER JOIN INSERTED
ON LOP.MaLop = INSERTED.MaLop
Trang 68• Dữ liệu bảng DELETED là các dòng dữ liệu
bị xóa ra khỏi bảng khi chạy câu lệnh DELETE
• Khi chạy lệnh UPDATE, dòng dữ liệu cũ sẽ copy vào DELETED, dòng dữ liệu mới (sau cập nhật) sẽ được copy vào INSERTED
Trang 69Bảng INSERTED, DELETED
Bảng SINHVIEN trước khi chạy INSERT
INSERT SINHVIEN VALUES (‘02’,’Trung’,
Trang 70Bảng INSERTED, DELETED
Bảng SINHVIEN trước khi chạy DELETE
DELETE SINHVIEN WHERE MaSV = ‘02’
Trong câu lệnh trigger :
Trang 71Bảng INSERTED, DELETED
Bảng SINHVIEN trước khi chạy UPDATE
UPDATE SINHVIEN SET TenSV = ‘Thanh’ WHERE MaSV = ‘02’
Trong câu lệnh trigger :
Trang 72AS UPDATE LOP SET LOP.SiSo = LOP.SiSo + 1 FROM LOP INNER JOIN INSERTED
ON LOP.MaLop = INSERTED.MaLop UPDATE LOP
SET LOP.SiSo = LOP.SiSo – 1 FROM LOP INNER JOIN DELETED
Trang 73• Cú pháp :
IF UPDATE (Tên_Cột)
đổi
Trang 74Ví dụ Trigger 3
• Ví dụ cập nhật sĩ số lớp khi cập nhật mã lớp của sinh viên
CREATE TRIGGER trg_CapNhatSinhVienMaLop
SET LOP.SiSo = LOP.SiSo + 1
FROM LOP INNER JOIN INSERTED
ON LOP.MaLop = INSERTED.MaLop
UPDATE LOP
SET LOP.SiSo = LOP.SiSo – 1
FROM LOP INNER JOIN DELETED
ON LOP.MaLop = DELETED.MaLop
Trang 7575
01-2014 504009 – Ngôn ngữ SQL nâng cao
Thay đổi Trigger
• Nếu muốn thay đổi Trigger ta dùng câu lệnh
ALTER TRIGGER Tên_Trigger
ON Tên_Bảng
FOR Câu_Lệnh
AS
Câu lệnh mới
• Nếu muốn xóa trigger, ta dùng :
DROP TRIGGER Tên_Trigger
Trang 76Hủy sự thay đổi dữ liệu
• Nếu trong trigger ta dùng câu lệnh :
AS
ROLLBACK TRANSACTION
• Kết quả : câu lệnh DELETE sẽ không bao giờ
có hiệu lực
Trang 77– Nếu nhiều trigger được gán vào 1 bảng, cho cùng
sẽ được kích hoạt (không biết được thứ tự thực hiện)
– Khi viết trigger phải xác định được : trigger viết
?
Trang 78Bài tập chương III
• Cho lược đồ csdl QLBanHang được mô tả như sau:
Trang 7979
01-2014 504009 – Ngôn ngữ SQL nâng cao
Bài tập chương III (tt)
– Tạo csdl và tạo các bảng, nhập dữ liệu cho các bảng trong csdl – Cho biết mã và tên của các mặt hàng có giá lớn hơn 10 và số
lượng hiện có ít hơn 20 – Cho biết thông tin những khách hàng nào đã mua mặt hàng áo
Việt Tiến – Cho biết thông tin những mặt hàng nào chưa từng được khách
hàng đặt mua?
– Cho biết tổng số lượng bán được của mỗi mặt hàng
– Bổ sung ràng buộc cho bảng DONDATHANG rang buộc kiểm tra
ngày giao hàng và ngày chuyển hàng phải sau hoặc bằng với ngày đặt hàng
– Cho biết thông tin những khách hàng có cùng ngày sinh
– Thống kê số lượng hóa đơn đã lập của mỗi nhân viên
Trang 80Bài tập chương III (tt)
• Viết trigger thực hiện các công việc sau trên
– Đảm bảo khi chèn thêm một nhân viên hay cập nhật lương của nhân viên thì đảm bảo lương của nhân viên không lớn hơn lương của trưởng phòng đó
– Khi thông tin nhân viên làm việc cho một dự án thay đổi, nếu tổng số giờ làm việc của nhân viên cho các
dự án lớn hơn 40h/tuần hoặc nhỏ hơn 20h/tuần thì hiển thị thông báo
– Khi một nhân viên bị xóa, hãy xóa các thông tin về việc tham gia dự án và các thân nhân của nhân viên