Chương 3: Transact-SQL
1
GVPT: NGUYỄN THỊ MỸ DUNG SỐ TC: 2 SỐ TIẾT: LT: 20; TH: 20
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
(LT: 6: TH: 8)
Chương 4: Lập trình với Transact-SQL (LT: 4:
TH: 4)
Chương 5: Bảo Mật và Phân Quyền (LT: 2; TH:
2)
2
Chương 6: Kết nối CSDL (Tự học)
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 1
Chương 3: Transact-SQL
I. Ngôn ngữ xử lý dữ liệu (DML - Data Manipu-
lation Language): thêm, sửa, xóa
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ê
3
Bài tập chương 3
Biên soạn: Nguyễn Thị Mỹ Dung
1. Thêm dữ liệu vào bảng Dạng 1: Thêm 1 dòng dữ liệu
INSERT INTO
Dạng 2: Thêm nhiều dòng dữ liệu
INSERT INTO
4
SELECT
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 2
Chương 3: Transact-SQL
Ví dụ 1:
INSERT INTO SV_DT (Masv, MaDT, KQ) VALUES (‘SV001’, ‘DT08’, 8)
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
5
SELECT ‘SV005’,MADT, N‘Đồng Tháp’, 8 FROM DETAI
Biên soạn: Nguyễn Thị Mỹ Dung
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ính
không là khóa chính hoặ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ạm RBTV (Khóa chính, trùng tên,…), các tham chiếu, thuộc tính có ràng buộc NOT NULL bắt buộc phải có giá trị.
6
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 3
Chương 3: Transact-SQL
2. Cập nhật (Sửa) dữ liệu
UPDATE
[FROM
Ví dụ 2: Ví dụ 1:
UPDATE DE_TAI SET KINHPHI = KINHPHI + 2 UPDATE SINHVIEN SET HOCLUC = 6.2, NAMSINH = 1991
7
WHERE MASV = ‘SV006’
Biên soạn: Nguyễn Thị Mỹ Dung
3. Xóa dữ liệu bảng
Dạng 1: Xóa một số bộ từ bảng
DELETE FROM
TRUNCATE TABLE
VD1: Xóa những môn học dưới 20 tiết
8
DELETE FROM MON WHERE SOTIET < 20
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 4
Chương 3: Transact-SQL
VD2: 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 FROMFROM 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
9
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
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)
Lưu ý: Lưu ý:
Delete sẽsẽ xóaxóa tất cả dữ liệu trên
- Câu lệnh Delete nhất. bảng FROMFROM gầngần nónó nhất bảng
- Nếu có nhiều FROM trong câu lệnh Delete không được đặtđặt bíbí Delete không
10
thì Bảng tại FROMFROM gầngần Delete danh. danh
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 5
Chương 3: Transact-SQL
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
11
dữ liệu bảng nhiều trước, sau đó xóa bảng một.
Biên soạn: Nguyễn Thị Mỹ Dung
1. Select không có điều kiện
SELECT * |
SELECT * FROM sinhvien
Ví dụ 2: In ra mã số, họ tên của tất cả sinh viên
12
SELECT masv, hoten FROM sinhvien
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 6
Chương 3: Transact-SQL
2/ Select có điều kiện
SELECT * |
21 tuổi trở lên.
SELECT MASV, HOTEN, NAMSINH
13
FROM SINHVIEN WHERE (YEAR(GETDATE())-NAMSINH)>21
Biên soạn: Nguyễn Thị Mỹ Dung
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ùng
SELECT DISTINCT | All
FROM
[WHERE <Điều_kiện>];
VD1: in ra mã đề tài của các sinh viên thực hiện
SELECTALL MADT FROM SV_DT
VD2: in ra mã đề tài có nơi áp dụng là ‘Dong Thap’
SELECT DISTINCT MADT FROM SV_DT WHERE NOIA_D = 'DONG THAP'
14
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 7
Chương 3: Transact-SQL
Ghi chú:
- Mệnh đề WHERE kế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ác bộ 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: ‘%’
(nhiều ký tự), ‘_’ (một ký tự).
- Khi so sánh các ký tự có dấu, đặt ‘NN’ trước
chuỗi so sánh: N‘chuỗi’
15
Biên soạn: Nguyễn Thị Mỹ Dung
1. Select nhiều bảng
SELECT * |
FROM [bídanh1]
kết trong (thường sử dụng)
kết trái kết phải kết đầy đủ kếtkết liênliên bảngbảng chocho phép
phép kếtkết tất tất các), (tương tựtự phépphép kếtkết tíchtích đềđề--các),
[bídanh2] ON <điềukiệnkếtnối>
[WHERE<điềukiệnkếtnối>[AND|OR<điềukiệnchọn>]
Trong đó :
INNER JOIN:
LEFT [OUTER] JOIN:
RIGHT [OUTER] JOIN:
FULL [OUTER] JOIN:
CROSS JOINJOIN::
CROSS
cảcả cáccác bộbộ cócó thểthể cócó (tương
khikhi đóđó không
khô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..
16
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 8
Chương 3: Transact-SQL
Ví dụ 1: Tìm họ tên sinh viên thực hiện tên đề tài, kết
quả từ 9 trở lên
CáchCách 11:: SELECT HOTENSV, TENDT,KETQUA FROM SINHVIEN S,DETAI D, SV_DT SD WHERE S.MASV = SD.MASV AND SD.MADT= D.MADT
AND KETQUA >= 9;
CáchCách 22::
SELECT HOTENSV, TENDT,KETQUA
FROM ((SINHVIEN S INNER JOIN SV_DT SD ON
S.MASV = SD.MASV) INNER JOIN DETAI D
ON SD.MADT = D.MADT)
WHERE KETQUA >= 9;
17
Biên soạn: Nguyễn Thị Mỹ Dung
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ả
SELECT HOTENSV, MADT, KETQUA FROM SINHVIEN S LEFT JOIN SV_DT SD ON
S.MASV = SD.MASV
Hoặc:
SELECT HOTENSV, MADT, KETQUA FROM SINHVIEN S FULL JOIN SV_DT SD ON
S.MASV = SD.MASV
GhiGhi chúchú:: SVSV thực
JoinJoin,, CrossCross JoinJoin đểđể soso sánh
thực hiệnhiện phépphép kếtkết RightRight JoinJoin,, sánh kếtkết quảquả hiểnhiển thị
Inner Inner thị bằngbằng SQLSQL
18
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 9
Chương 3: Transact-SQL
2. SELECT với INTO
INTO tạo ra bảng mới với thuộc tính được chọn
từ SELECT…. FROM….
SELECT ,.. ,
INTO
FROM
[WHERE <Điều_kiện>]
VD: Tạo bảng SV với các thông tin MaSV, HotenSV, hocluc từ bảng SINHVIEN và ketqua thực hiện đề tài từ bảng SV_DT
SELECT MASV, HOTENSV, HOCLUC, KQ INTO SV FROM SINHVIEN S INNER JOIN SV_DT SD
ON S.MASV = SD.MASV
19
Biên soạn: Nguyễn Thị Mỹ Dung
3. Các phép toán tập
Ví dụ: Tìm tất cả họ tên
chủ nhiệm và sinh viên
hợp Union [ALL]()
USE QLDETAISV
SELECT CHUNHIEM
FROM DE_TAI
SELECT
FROM
[WHERE <điều_kiện>]
UNION
UNION
SELECT HOTENSV
FROM SINHVIEN
SELECT
FROM
[WHERE <điều_kiện>]
20
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 10
Chương 3: Transact-SQL
Intersect [ALL] ()
SELECT
Ví dụ: Tìm MASV có quê quán cùng với nơi áp dụng đề tài
FROM
USE QLDETAISV
[WHERE <điều_kiện>]
SELECT MASV, QUEQUAN
INTERSECT
FROM SINHVIEN
SELECT
INTERSECT
FROM
SELECT MASV, NOIA_D
[WHERE <điều_kiện]
FROM SV_DT
21
Biên soạn: Nguyễn Thị Mỹ Dung
Except [ALL](-)
SELECT
Ví dụ: Tìm tất cả MASV có quê quán khác với nơi áp dụng đề tài
FROM
USE QLDETAISV
[WHERE <điều_kiện>]
SELECT MASV, QUEQUAN
EXCEPT
FROM SINHVIEN
SELECT
EXCEPT
FROM
SELECT MASV, NOIA_D
[WHERE <điều_kiện>]
FROM SV_DT
22
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 11
Chương 3: Transact-SQL
LưuLưu ýý 11:: Phép giao rs có thể viết theo nhiều cách
như sau: CáchCách 11::
SELECT * FROM r INTERSECT SELECT * FROM s
CáchCách 22::
SELECT * FROM r WHERE r.c IN (SELECT s.c FROM s)
CáchCách 33::
SELECT * FROM r WHERE EXISTS (SELECT * FROM s
WHERE s.c=r.c)
23
Biên soạn: Nguyễn Thị Mỹ Dung
LưuLưu ýý 22:: Phép trừ r-s có thể viết theo nhiều cách như
sau:
CáchCách 11::
SELECT * FROM r EXCEPT SELECT * FROM s
CáchCách 22::
SELECT * FROM r WHERE r.c NOT IN (SELECT s.c FROM s)
CáchCách33::
SELECT * FROM r WHERE NOT EXISTS (SELECT * FROM s WHERE s.c=r.c)
24
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 12
Chương 3: Transact-SQL
Truy vấn con là một câu lệnh SELECT được lồng INSERT,
vào bên trong một câu lệnh SELECT, UPDATE, DELETE hoặc bên trong một truy vấn khác.
Cú pháp:
SELECT [ALL | DISTINCT]
FROM
WHERE <điềukiện> AND | OR
(SELECT FROM
[WHERE <điềukiện_s>])
25
Biên soạn: Nguyễn Thị Mỹ Dung
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ột biểu thức có xuất hiện (không xuất hiện) trong tập các giá trị của truy vấn con, ta có thể sử dụng toán tử IN (NOT IN) như sau:
WHERE [NOT] IN ()
không thực hiện đề tài
Ví dụ: Tìm những sinh viên không SELECT HOTENSV, HOCLUC FROM SINHVIEN WHERE MASV NOT IN
(SELECT MASV FROM SV_DT)
26
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 13
Chương 3: Transact-SQL
2. Truy vấn con với EXISTS
Lượng từ EXISTS (NOT E XIS TS) để kiểm tra xem một truy vấn con có trả về dòng kết quả nào hay không được sử dụng trong truy vấn con dưới dạng:
WHERE [NOT] EXISTS ()
Ví dụ: cho biết họ tên của những sinh viên hiện
chư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)
27
Biên soạn: Nguyễn Thị Mỹ Dung
3. Truy vấn con với mệnh đề HAVING
Một
truy vấn con có thể được sử dụng trong mệnh đề HAVING của một truy vấn khác. Kết quả của truy vấn con được sử dụng để tạo điều kiện đối với các hàm gộ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ểm của tất cả các môn học.
SELECT KETQUA.MAMH,TENMH, AVG(DIEM) FROM KETQUA,MONHOC WHERE KETQUA.MAMH = MON.MAMH GROUP BY KETQUA.MAMH,TENMH HAVING AVG(DIEM) >
(SELECT AVG(DIEM) FROM KETQUA)
28
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 14
Chương 3: Transact-SQL
4. 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 *
FROM S WHERE NOT EXISTS (SELECT *
FROM R_S WHERE R_S.C1 = S.C1 AND
29
R_S.C2 = R.C2))
Biên soạn: Nguyễn Thị Mỹ Dung
Ví dụ: Tìm thông tin sinh viên thực hiện tất
tất cảcả các đề
tài
SELECT *
FROM SINHVIEN
WHERE NOT EXISTS (SELECT *
FROM DETAI
WHERE NOT EXISTS (SELECT *
FROM SV_DT
WHERE SV_DT.MADT = DETAI.MADT
AND
SV_DT.MASV = SINHVIEN.MASV))
30
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 15
Chương 3: Transact-SQL
Cho 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í
Cú pháp:
SELECT
31
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
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’
32
ORDER BY KQ DESC
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 16
Chương 3: Transact-SQL
Sử dụng ORDER BY với TOP
Mệnh đề TOP dùng để hạn chế số bộ trong truy
vấn. Cú pháp:
SELECT TOP
FROM
WHERE <điều_kiện>
ORDER BY ASC|DESC
Ví dụ: Tìm những đề tài có kinh phí cao nhất và nhì.
SELECT TOP 2 MADT FROM SV_DT ORDER BY kinhphi DESC
33
Biên soạn: Nguyễn Thị Mỹ Dung
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
[ASC | DESC]) AS ,
FROM
[WHERE <điều_kiện>]
Ví dụ: Xếp hạng sinh viên theo kết quả thực hiện đề
tài từ cao đến thấp.
SELECT RANK() OVER (ORDER BY KQ DESC) AS
XEPHANG, HOTENSV, KQ FROM SINHVIEN S INNER JOIN SV_DT SD ON
S.MASV = SD.MASV
34
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 17
Chương 3: Transact-SQL
Sử 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 )) AS ,
FROM
[WHERE <điều_kiện>]
Ví dụ: Thêm cột số thứ tự cho truy vấn. SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS STT, HOTENSV, KQ
FROM SINHVIEN S INNER JOIN SV_DT SD ON
S.MASV = SD.MASV
35
Biên soạn: Nguyễn Thị Mỹ Dung
1. Thống kê với các hàm kết tập
Cú pháp:
SELECT [,]
FROM
[WHERE <Điều_Kiện>]
[GROUP BY ]
[HAVING <ĐK trên nhóm>]
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ên trường của kết quả truy vấn không phù hợp ta cần đặt lại tên trường
Cú pháp: AS
36
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 18
Chương 3: Transact-SQL
Cách sử dụng các hàm:
a. Hàm SUM (
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 MAX (
nhất trong tất cả các dòng của một trường
37
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
c. Hàm MIN (
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 (
Ví dụ: Tính trung bình cộng kinh phí của tất cả
các đề tài
38
SELECT AVG(Kinhphi) AS TBC_KP FROM Detai
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 19
Chương 3: Transact-SQL
e. Hàm COUNT (): Đếm các dòng
trong bả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àm chủ nhiệm
SELECT COUNT(MaDT) AS So_DT FROM Detai WHERE Chunhiem = ‘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ên
SELECT Chunhiem, COUNT(MaDT) AS SoLG FROM Detai GROUP BY Chunhiem HAVING COUNT(MaDT) >= 2
39
Biên soạn: Nguyễn Thị Mỹ Dung
2. Gom nhóm sử dụng Compute, Compute By Các mệnh đề Compute và Compute By sinh ra các
dòng chi tiết và một dòng tổng chính.
Compute By sử dụng giống Group By. Thứ tự trong
Compute By giống thứ tự trong Order By
Cú pháp:
SELECT ,
FROM
WHERE <Điều_Kiện>
[ORDER BY ]
[COMPUTE ]
[BY ]
40
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 20
Chương 3: Transact-SQL
VD1: 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 cả lớp
SELECT S.MASV, (HOSV+' '+TENSV) AS HTSV, DIEM FROM SINHVIEN S INNER JOIN KETQUA K ON
S.MASV = K.MASV
COMPUTE AVG(DIEM) VD 2: 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 HTSV, DIEM FROM SINHVIEN S INNER JOIN KETQUA K ON
S.MASV = K.MASV
ORDER BY S.MASV COMPUTE AVG(DIEM) BY S.MASV
41
Biên soạn: Nguyễn Thị Mỹ Dung
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
Cú pháp:
SELECT
42
[WITH ROLLUP | CUBE]
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 21
Chương 3: Transact-SQL
VD 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
43
lệnh với CUBE để so sánh kết quả thực hiện.
Biên soạn: Nguyễn Thị Mỹ Dung
- 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…)
tập UNION, hợp (UNION
- Truy INTERSECT, EXCEPT INTERSECT vấn dữ liệu EXCEPT), truy vấn lồng nhau
- 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,
44
ROLLUP, CUBE, COMPUTE, COMPUTE BY)
Biên soạn: Nguyễn Thị Mỹ Dung
BG_SQL_SERVER 22