Biên soạn: Nguyễn Thị Mỹ Dung 5Ví dụ 2: Thêm dữ liệu sinh viên SV005 thực hiện tất cả đề tài.. VD2: Xóa bảng điểm của sinh viên khoa Tin họccó điểm bé hơn 2 DELETE FROM KETQUA FROM SINHV
Trang 1GVPT: NGUYỄN THỊ MỸ DUNG
SỐ TC: 2
SỐ TIẾT: LT: 20; TH: 20
1
Biên soạn: Nguyễn Thị Mỹ Dung
Chương 1: Tổng quan về SQL Server (LT: 2) Chương 2: Tạo và quản trị CSDL (LT: 6; TH: 6) Chương 3: Transact-SQL và truy vấn dữ liệu
Trang 2I Ngôn ngữ xử lý dữ liệu (DML - Data lation Language): thêm, sửa, xóa
Manipu-II Tìm kiếm trên một bảng III Tìm kiếm trên nhiều bảng
IV Truy vấn con lồng nhau
V Sắp xếp
VI Nhóm dữ liệu và thống kê
Bài tập chương 3
Biên soạn: Nguyễn Thị Mỹ Dung 3
1 Thêm dữ liệu vào bảng
Dạng 1: Thêm 1 dòng dữ liệu
INSERT INTO <Tên_bảng> [(ds_thuộc_tính)]
VALUES (<gt1>, <gt2>, …, <gtn>)
Dạng 2: Thêm nhiều dòng dữ liệu
INSERT INTO <Tên_bảng> [(ds_thuộc_tính)]
SELECT <th_tính_1>, …, <th_tính_n>
FROM <ds_bảng>
[ WHERE <đ_kiện>]
Trang 3Biên soạn: Nguyễn Thị Mỹ Dung 5
Ví dụ 2: Thêm dữ liệu sinh viên SV005 thực hiện tất
cả đề tài.
INSERT INTO SV_DT SELECT ‘SV005’,MADT, N‘Đồng Tháp’, 8 FROM DETAI
Ví dụ 1:
INSERT INTO SV_DT (Masv, MaDT, KQ) VALUES (‘SV001’, ‘DT08’, 8)
Nhận xét:
-Thứ tự các giá trị phải trùng với thứ tự các cột,
- Có thể thêm giá trị NULL ở những thuộc tínhkhông là khóa chínhhoặc NOT NULL,
- Các giátrị thuộc tính khóa không được trùng,
- Câu lệnh INSERT sẽ gặp lỗi nếu vi phạmRBTV (Khóa chính, tham chiếu, trùng tên,…), cácthuộc tính có ràng buộc NOT NULL bắt buộc phải cógiátrị
Trang 4Biên soạn: Nguyễn Thị Mỹ Dung 7
2 Cập nhật (Sửa) dữ liệu
UPDATE <Tên_bảng>
SET <thuộc_tính1> = <giá_trị_mới1>,…,
<thuộc_tính_n> = <giá_trị_mới_n>, [ FROM <Ds_bảng>]
[ WHERE <Điều_kiện>]
Ví dụ 1:
UPDATE DE_TAI SET KINHPHI = KINHPHI + 2
Ví dụ 2:
UPDATE SINHVIEN SET HOCLUC = 6.2, NAMSINH = 1991 WHERE MASV = ‘SV006’
TRUNCATE TABLE <Tên_bảng>
VD1: Xóa những môn học dưới 20 tiết DELETE FROM MON
WHERE SOTIET < 20
Trang 5VD2: Xóa bảng điểm của sinh viên khoa Tin học
có điểm bé hơn 2 DELETE FROM KETQUA FROM SINHVIEN S INNER JOIN KHOA K O N
S MAKH = K MAKH WHERE S MASV = KETQUA.MASV AND
TENKH LIKE N' TIN HỌC ' AND DIEM = 4 VD3: Xóa tất cả kết quả của sinh viên
TRUNCATE TABLE KETQUA
Biên soạn: Nguyễn Thị Mỹ Dung 9
VD4: Xóa tất cả những sinh viên chưa tham gia học tập môn học nào.
DELETE FROM SINHVIEN WHERE MASV NOT IN ( SELECT MASV FROM SV_DT)
danh.
Trang 6Biên soạn: Nguyễn Thị Mỹ Dung 11
Nhận xét:
- Các lệnh UPDATE, DELETE có thể gây ra
vi phạm RBTV ( không cho sửa, xóa , hoặc xóa luôn các dòng dữ liệu tham chiếu hoặc dữ liệu tham chiếu sẽ là Null ).
- Điều kiện trong mệnh đề WHERE sẽ được thực hiện cho các dòng thỏa điều kiện, nếu không
có mệnh đề WHERE toàn bộ bảng sẽ có ảnh hưởng.
- Tránh vi phạm RBTV khi xóa, nên xóa các
dữ liệu bảng nhiều trước, sau đó xóa bảng một.
1 Select không có điều kiện
SELECT * | <Col1,Col2, …, Coln>
FROM <Tên_bảng>
Ví dụ 1: In ra thông tin chi tiết của tất cả sviên
SELECT * FROM sinhvien
Ví dụ 2: In ra mã số, họ tên của tất cả sinh viên SELECT masv, hoten
FROM sinhvien
Trang 7Biên soạn: Nguyễn Thị Mỹ Dung 13
2/ Select có điều kiện
WHERE ( YEAR ( GETDATE ())-NAMSINH)>21
3 Select với Distinct | All
- Distinct:loại bỏ phần tử trùng nhau
- ALL: lấy tất cả các bộ kể cả phần tử trùngSELECT DISTINCT | All<danh_sách_cột>
SELECTDISTINCT MADTFROMSV_DT
WHERENOIA_D = 'DONG THAP'
Trang 8Ghi chú:
-Mệnh đề WHEREkết hợp với các toán tử:
AND, OR:kết hợp nhiều điều kiện
[NOT] LIKE: so sánh chuỗi
BETWEEN …AND…: so sánh trong khoảng
IS [NOT] NULL: tìm cácbộ là (không) rỗng
[NOT] IN: tìm trong/ ngoài danh sách
- Các ký tự so sánh đại diện đối với chuỗi: ‘%’
FROM <Tênbảng1> [bídanh1] <loạikếtnối>
<Tênbảng2> [bídanh2] ON<điềukiệnkếtnối>
[WHERE<điềukiệnkếtnối>[AND|OR<điềukiệnchọn>]
CROSS JOINJOIN:: kếtkết liênliên bảngbảng chocho phépphép kếtkết tấttấtcả
cả cáccác bộbộ cócó thểthể cócó (tương(tương tựtự phépphép kếtkết tíchtích đềđề các),các),khiđóđó khôngkhông cầncần bấtbất kỳkỳ điềuđiều kiệnkiện kếtkết nốinối nàonào
Trang 9Ví dụ 1: Tìm họ tên sinh viên thực hiện tên đề tài, kếtquả từ 9 trở lên
CáchCách 11::
SELECT HOTENSV, TENDT,KETQUAFROM SINHVIEN S,DETAI D, SV_DTSD
WHERES.MASV =SD.MASV ANDSD.MADT= D.MADT
ANDKETQUA >= 9;
CáchCách 22::
SELECTHOTENSV, TENDT,KETQUAFROM( SINHVIEN SINNER JOIN SV_DTSDON
S.MASV =SD.MASV) INNER JOIN DETAI D
ONSD.MADT = D.MADT)WHEREKETQUA >= 9;
Biên soạn: Nguyễn Thị Mỹ Dung 17
Vídụ 2: Tìm họ tên của tất cả sinh viên thực hiện đềtài (có thể có sinh viên không thực hiện đề tài) gồm,
họ tên sinh viên, mã đề tài, kết quảSELECTHOTENSV, MADT, KETQUAFROM SINHVIEN SLEFTJOIN SV_DT SDON
S.MASV =SD.MASVHoặc:
SELECTHOTENSV, MADT, KETQUAFROM SINHVIEN SFULL JOIN SV_DTSDON
S.MASV =SD.MASV
Ghi Ghi chú chú:: SV thựcthực hiệnhiện phépphép kết RightRight JoinJoin,, InnerJoin,, CrossCross JoinJoinđểđể soso sánhsánh kếtkết quảquả hiểnhiển thịthị bằngbằng SQLSQL
Trang 102 SELECT với INTO
INTO tạo ra bảng mới với thuộc tính được chọn
Union [ALL]()SELECT<ds_trường>
FROM<ds_bảng>
[WHERE<điều_kiện>]
UNIONSELECT<ds_trường>
FROM<ds_bảng>
[WHERE<điều_kiện>]
Vídụ: Tìm tất cả họ tênchủ nhiệm và sinh viênUSE QLDETAISVSELECTCHUNHIEMFROMDE_TAI
UNIONSELECTHOTENSVFROMSINHVIEN
Trang 11Intersect [ALL] ()SELECT<ds_trường>
FROM<ds_bảng>
[WHERE<điều_kiện>]
INTERSECTSELECT<ds_trường>
FROM<ds_bảng>
[WHERE<điều_kiện]
Ví dụ: Tìm MASV cóquê quán cùng với nơi ápdụng đề tài
USE QLDETAISVSELECTMASV, QUEQUAN
FROMSINHVIENINTERSECTSELECTMASV, NOIA_DFROMSV_DT
Biên soạn: Nguyễn Thị Mỹ Dung 21
Except [ALL](-)SELECT<ds_trường>
FROM<ds_bảng>
[WHERE<điều_kiện>]
EXCEPTSELECT<ds_trường>
FROMSINHVIENEXCEPT
SELECTMASV, NOIA_DFROMSV_DT
Trang 12Lưu Lưu ý ý 1 1:: Phép giao rs có thể viết theo nhiều cáchnhư sau:
CáchCách 11::
SELECT* FROM rINTERSECT
SELECT* FROM sCách
Cách 22::
SELECT* FROM rWHEREr.cIN(SELECTs.c FROMs)Cách
Cách 33::
SELECT* FROM rWHEREEXISTS (SELECT* FROM s
WHEREs.c=r.c)
Biên soạn: Nguyễn Thị Mỹ Dung 23
Lưu Lưu ý ý 2 2:: Phép trừ r-s có thể viết theo nhiều cách nhưsau:
CáchCách 11::
SELECT*FROMrEXCEPT
SELECT*FROMsCách
Cách 22::
SELECT*FROMrWHEREr.c NOT IN (SELECTs.c FROM s)Cách
Cách33::
SELECT*FROMrWHERE NOT EXISTS (SELECT*FROMs
WHEREs.c=r.c)
Trang 13Truy vấn con là một câu lệnh SELECT được lồngvào bên trong một câu lệnh SELECT, INSERT,UPDATE, DELETE hoặc bên trong một truy vấn khác.
Biên soạn: Nguyễn Thị Mỹ Dung 25
1 Sử dụng truy vấn con với toán tử IN
Khi cần thực hiện phép kiểm tra giá trị của mộtbiểu thức cóxuất hiện (không xuất hiện) trong tập cácgiá trị của truy vấn con, ta có thể sử dụng toán tử IN(NOT IN) như sau:
WHERE<biểu_thức> [NOT] IN (<truy_vấn_con>)
Vídụ: Tìm những sinh viên khôngthực hiện đề tàiSELECTHOTENSV, HOCLUC
FROMSINHVIENWHEREMASVNOT IN
(SELECTMASV FROM SV_DT)
Trang 142 Truy vấn con với EXISTS
Lượng từ EXISTS (NOT E XIS TS) để kiểm traxem một truy vấn con có trả về dòng kết quả nào haykhôngđược sử dụng trong truy vấn con dưới dạng:
WHERE [NOT]EXISTS (<truy_vấn_con>)
Ví dụ: cho biết họ tên của những sinh viên hiệnchưa có điểm thi của bất kỳ một môn học nào
SELECT hosv,tensv FROM sinhvien WHERE NOT EXISTS ( SELECT masv
FROM k etqua WHERE k etqua.masv=sinhvien.masv)
Biên soạn: Nguyễn Thị Mỹ Dung 27
3 Truy vấn con với mệnh đề HAVING
Một truy vấn con có thể được sử dụng trongmệnh đề HAVING của một truy vấn khác Kết quả củatruy vấn con được sử dụng để tạo điều kiện đối vớicác hàmgộp
Ví dụ: Cho biết mã, tên và trung bình điểm thi của
các môn học có trung bình lớn hơn trung bình điểmcủa tất cả các môn học
SELECTKETQUA.MAMH,TENMH, AVG(DIEM)FROMKETQUA,MONHOC
WHEREKETQUA.MAMH = MON.MAMHGROUP BYKETQUA.MAMH,TENMHHAVINGAVG(DIEM) >
(SELECTAVG(DIEM) FROM KETQUA)
Trang 154 Thực hiện phép chia với truy vấn lồng nhau
Sử dụng toán tử NOT EXISTS để thực hiện:
Cú pháp:
SELECT * FROM R
WHERE NOT EXISTS ( SELECT *
Biên soạn: Nguyễn Thị Mỹ Dung 29
Vídụ: Tìm thông tin sinh viênthực hiện tấttất cảcảcác đềtài
SELECT*FROM SINHVIENWHERENOT EXISTS (SELECT*FROM DETAI
WHERENOT EXISTS (SELECT*
FROM SV_DTWHERE SV_DT.MADT = DETAI.MADT
ANDSV_DT.MASV =SINHVIEN.MASV))
Trang 16Cho phép sắp xếp các dòng trong kết quả câu truy vấn theo thứ tự tăng dần (hoặc giảm dần) dựa trên một hoặc nhiều trường làm tiêu chí
ORDER BY <DS trường> ASC | DESC
ASC: giá trị mặc nhiên, sắp xếp kết quả theo thứ tự tăng dần.
DESC: sắp xếp kết quả theo thứ tự giảm dần
Biên soạn: Nguyễn Thị Mỹ Dung 31
Ví dụ: In ra thông tin gồm mã số, họ tên và kết quả tương ứng của sinh viên thực hiện các đề tài
có nơi áp dụng ở Đồng Tháp Danh sách được sắp thứ tự giảm dần theo kết quả thực hiện.
SELECT Sinhvien.MaSV, Hoten, KQ FROM Sinhvien INNER JOIN SV_DT
ON Sinhvien.MaSV = SV_DT.MaSV WHERE NoiA_D = N‘Đồng Tháp’
ORDER BY KQ DESC
Trang 17Sử dụng ORDER BY với TOP
Mệnh đề TOP dùng để hạn chế số bộ trong truyvấn Cú pháp:
SELECT TOP <số_lượng> <ds_trường>
FROM<danh_sách_bảng>
WHERE <điều_kiện>
ORDER BY<danh_sách_trường>ASC|DESC
Vídụ: Tìm những đề tài có kinh phí cao nhất và nhì
SELECTTOP 2 MADTFROM SV_DT
ORDER BYkinhphiDESC
Biên soạn: Nguyễn Thị Mỹ Dung 33
Sử dụng ORDER BY với hàm RANK()
Hàm RANK() dùng để xếp hạng theo ORDER
BY Cú pháp:
SELECT RANK() OVER (ORDER BY <COL>
[ASC | DESC])AS<tên_trường>, <ds_trường>
S.MASV =SD.MASV
Trang 18Sử dụng ORDER BY với hàm ROW_NUMBER()
Hàm ROW_NUMBER() dùng để đánh số thứ tựdòng theo ORDER BY Cú pháp:
SELECT ROW_NUMBER() OVER(ORDER BY(SELECT <col>))AS<tên_trường>, <ds_trường>
FROM<danh_sách_bảng>
[WHERE <điều_kiện>]
Vídụ: Thêm cột số thứ tự cho truy vấn
SELECTROW_NUMBER() OVER(ORDER BY
(SELECT1)) ASSTT, HOTENSV, KQFROMSINHVIEN SINNER JOIN SV_DTSDON
Các hàm kết tập bao gồm: SUM, MAX, MIN, AVG
và COUNT
Đặt lại tên trường: Trong một số trường hợp têntrường của kết quả truy vấn không phù hợp ta cần đặtlại tên trường
Cú pháp:<Tên_trường_cũ>AS<Tên_trường_mới>
Trang 19 Cách sử dụng các hàm:
a Hàm SUM (<Tên_trường>): Trả về tổng giá
trị của tất cả các dòng của một trường kiểu số
Ví dụ: Tính tổng kinh phí của tất cả các đề tài SELECT SUM (Kinhphi) as Tong_KP
FROM Detai;
b Hàm M AX (<Tên trường>): Trả về giá trị lớn
nhất trong tất cả các dòng của một trường
Ví dụ: Tìm kinh phí lớn nhất của tất cả các đề tài
SELECT MAX(Kinhphi) AS KP_MAX FROM Detai
Biên soạn: Nguyễn Thị Mỹ Dung 37
c Hàm MIN (<Tên trường>): Trả về giá trị nhỏ
nhất trong tất cả các dòng của một trường
Ví dụ: Tìm kinh phí nhỏ nhất của tất cả các đề
tài SELECT MIN(Kinhphi) AS KP_MIN FROM Detai
d Hàm AVG (<Tên_trường>): Trả về giá trị
trung bình cộng của tất cả các dòng một trường kiểu số
Ví dụ: Tính trung bình cộng kinh phí của tất cả
các đề tài SELECT AVG(Kinhphi) AS TBC_KP FROM Detai
Trang 20e Hàm COUNT (<Tên trường>): Đếm các dòng
trongbảng theo một hoặc một số trường nào đó
Ví dụ 1: In ra số lượng đề tài mà thầy Lê Đức Phúc
làmchủ nhiệmSELECTCOUNT(MaDT) ASSo_DTFROMDetai
WHEREChunhiem = ‘Lê Đức Phúc’
Ví dụ 2: In ra họ tên của các giáo viên chủ nhiệm
từ 2 đề tài trở lênSELECTChunhiem, COUNT(MaDT) ASSoLGFROMDetai
GROUP BYChunhiemHAVING COUNT(MaDT) >= 2
Biên soạn: Nguyễn Thị Mỹ Dung 39
2 Gom nhóm sử dụng Compute, Compute By
Các mệnh đề Compute và Compute By sinh ra cácdòng chitiết và một dòng tổng chính
Compute By sử dụng giống Group By Thứ tự trongCompute Bygiống thứ tự trong Order By
Trang 21VD1: Liệt kê bảng điểm chi tiết của sinh viên và chobiết điểm trung bình của cả lớp
SELECTS.MASV, (HOSV+' '+TENSV) AS HTSV, DIEMFROMSINHVIEN SINNER JOIN KETQUAKON
S.MASV =K.MASVCOMPUTEAVG(DIEM)
VD 2: Liệt kê bảng điểm chi tiết của sinh viên và chobiết điểm trung bình của từng sinh viên
SELECTS.MASV, (HOSV+' '+TENSV) AS HTSV, DIEMFROMSINHVIEN SINNER JOIN KETQUAKON
S.MASV =K.MASVORDER BYS.MASV
COMPUTEAVG(DIEM)BYS.MASV
Biên soạn: Nguyễn Thị Mỹ Dung 41
3 Gom nhóm tổng hợp với Rollup, Cube
Để thêm các dòng thống kê từng nhóm, thêm toán tử Rollup hoặc Cube với mệnh đề Group by
Trang 22VD 1: Liệt kê bảng điểm chi tiết của sinh viên và cho biết điểm trung bình của từng sinh viên
SELECT S MASV, (HOSV+' '+TENSV) AS
HOTENSV, MAMH, AVG (DIEM) AS ĐTB FROM SINHVIEN S INNER JOIN KETQUA K
ON S MASV = K MASV GROUP BY S.MASV, HOSV, TENSV, MAMH WITH ROLLUP
VD2: SV thực hiện yêu cầu của VD1 với câu lệnh với CUBE để so sánh kết quả thực hiện.
Biên soạn: Nguyễn Thị Mỹ Dung 43
- Ngôn ngữ xử lý dữ liệu ( Insert , Update , Delete )
- Truy vấn dữ liệu trên một và nhiều bảng ( select
… from … where …)
- Truy vấn sử dụng hàm kết tập (SUM, MAX, MIN , AVG, COUNT)
- Truy vấn sắp xếp dữ liệu ( ORDER BY , TOP ,
RANK , ROW_NUMBER ,…)
- Truy vấn thống kê trên nhóm (GROUP BY ,