Xem mẫu
- CH4: LẬP TRÌNH TRANSACT - SQL
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)
Chương 6: Kết nối CSDL (Tự học)
Biên soạn: Nguyễn Thị Mỹ Dung
1
- CH4: LẬP TRÌNH TRANSACT - SQL
I. Thiết kế View, Index
II. Lập trình trong T-SQL
III. Stored Procedure
IV. Trigger
Biên soạn: Nguyễn Thị Mỹ Dung
1. Thiết kế View
- Là một bảng ảo được tạo ra từ tập con của các
bảng (Table) thật khác. Đối với người dùng View là
bảng thật.
- Cũng tương tự như truy vấn dữ liệu là dùng để
xem dữ liệu từ nhiều bảng khác nhau trong CSDL.
- Làm giảm sự phức tạp của CSDL bảo vệ dữ
liệu đối với người dùng không được phép truy cập.
- Các lệnh sử dụng trên View tương tự như trên
Table trong CSDL.
- Nhược điểm của View là mất thời gian truy cập
dữ liệu từ bảng (table) gốc.
Biên soạn: Nguyễn Thị Mỹ Dung
2
- CH4: LẬP TRÌNH TRANSACT - SQL
(khung nhìn):
CREATE VIEW
AS
SELECT
FROM
[WHERE
GROUP BY ]
Biên soạn: Nguyễn Thị Mỹ Dung
Ví dụ: Tạo View Ketquadetai gồm hotensv, học
lực, điểm trung bình đề tài
USE QLDETAISV
CREATE VIEW KETQUADETAI
AS
SELECT SINHVIEN.MASV, HOCLUC,
ROUND(AVG(KQ),2) AS DIEMTBDT
FROM SINHVIEN LEFT JOIN SV_DT ON
SV_DT.MASV = SINHVIEN.MASV
GROUP BY SINHVIEN.MASV, HOCLUC
Biên soạn: Nguyễn Thị Mỹ Dung
3
- CH4: LẬP TRÌNH TRANSACT - SQL
:
ALTER VIEW
AS
SELECT
FROM
[WHERE
GROUP BY ]
:
DROP VIEW
Biên soạn: Nguyễn Thị Mỹ Dung
VD1: Sửa View Ketquadetai gồm hotensv, học lực
từ 7 điểm trở lên và điểm trung bình đề tài.
USE QUANLYDETAISV
ALTER VIEW KETQUADETAI
AS
SELECT SINHVIEN.MASV, HOCLUC,
ROUND(AVG(KETQUA),2) AS DIEMTBDT
FROM SINHVIEN LEFT JOIN SV_DT ON
SV_DT.MASV = SINHVIEN.MASV
GROUP BY SINHVIEN.MASV, HOCLUC
WHERE HOCLUC >= 7
VD2:
DROP VIEW KETQUADETAI
Biên soạn: Nguyễn Thị Mỹ Dung
4
- CH4: LẬP TRÌNH TRANSACT - SQL
Lưu ý 1:
- Có thể sử dụng các câu truy vấn trên view tương
tự như trên bảng (Table)
- Có thể truy vấn trên vừa trên bảng và vừa trên
View.
Ví dụ:
SELECT MASV, HOTENSV, HOCLUC, DTBDT
FROM KETQUADETAI KQ, SINHVIEN S
WHERE KQ.MASV = S.MASV AND
DTBDT >= 8
- Khi thay đổi (xóa, thêm, sửa) dữ liệu trên View thì
dữ liệu trên bảng gốc cũng thay đổi theo.
Biên soạn: Nguyễn Thị Mỹ Dung
Lưu ý 2:
- Khi tạo View có sử dụng hàm kết tập thì không thể
thực hiện được các thao tác: Insert, Update, Delete.
VD:
CREATE VIEW KETQUADT
AS
SELECT S.MASV, HOTENSV, AVG(KQ) AS DTBDT
FROM SV_DT SD, SINHVIEN S
WHERE SD.MASV = S.MASV
GROUP BY S.MASV, HOTENSV
Biên soạn: Nguyễn Thị Mỹ Dung
5
- CH4: LẬP TRÌNH TRANSACT - SQL
2. Tạo Index (chỉ mục)
Chỉ mục được tạo ra nhằm để các dòng trong
bảng được truy xuất nhanh và hiệu quả hơn.
Chỉ mục có thể được tạo trên một hoặc nhiều
cột của bảng, và mỗi chỉ mục được đặt một tên.
Người dùng không thấy được các chỉ mục này.
Lưu ý:
Khi bảng đã được tạo chỉ mục thì việc cập nhật
hay thêm dòng mới vào bảng sẽ mất nhiều thời gian
hơn là đối với bảng không có chỉ mục.
Chỉ nên tạo chỉ mục cho các cột thường xuyên
dùng trong các tác vụ tìm kiếm.
Biên soạn: Nguyễn Thị Mỹ Dung
Chỉ mục đơn nhất (Unique Index)
Cú pháp:
CREATE [UNIQUE] INDEX
ON
UNIQUE: bắt buộc hai dòng bất kỳ của bảng sẽ
không được phép mang cùng giá trị ở cột được tạo chỉ
mục.
Ví dụ 1:
CREATE UNIQUE INDEX TENDT_ID
ON DE_TAI(TENDT)
Ví dụ 2: Tạo chỉ mục nhiều cột
CREATE INDEX SV_Index
ON SINHVIEN (Hosv, Tensv)
Biên soạn: Nguyễn Thị Mỹ Dung
6
- CH4: LẬP TRÌNH TRANSACT - SQL
Xóa chỉ mục
DROP INDEX
Ví dụ:
DROP INDEX DE_TAITENDT_ID
DROP INDEX SINHVIEN.SV_ID
Biên soạn: Nguyễn Thị Mỹ Dung
1. Khái niệm
Giống như NNLT khác, SQL cũng sử dụng biến,
các lệnh rẽ nhánh (if.. else, Case … end) và vòng
lặp (while) đơn giản. Ngoài ra, SQL cũng hỗ trợ
xây dựng thủ tục, hàm. Điểm khác biệt với NNLT
khác là SQL cho phép thiết lập trigger (bẫy lỗi sự
kiện), cussor,…
- Biến trong SQL dùng để lưu giá trị tạm thời
trong quá trình xử lý tính toán.
- Các lệnh cấu trúc dùng để hỗ trợ trong lập
trình SQL.
- Chương trình con, trigger giúp SQL thực hiện
các ràng buộc dữ liệu trong CSDL.
Biên soạn: Nguyễn Thị Mỹ Dung
7
- CH4: LẬP TRÌNH TRANSACT - SQL
2. Khai báo biến
Khai báo biến cục bộ
DECLARE {
@local_variable [AS] data_type,
…
}
Trong đó:
@local_variable: tên biến cục bộ, phải bắt
đầu bằng ký hiệu @.
data_type: kiểu dữ liệu hệ thống hoặc kiểu
dữ liệu người dùng.
Biên soạn: Nguyễn Thị Mỹ Dung
Sử dụng biến
Câu lệnh SET hoặc SELECT (lấy giá trị từ bảng
dữ liệu) dùng để gán giá trị cho biến.
SET @local_variable = value
OR: SELECT @local_variable = value
VD1:
DECLARE @x int, @y int
SET @y = 5
SET @x = @y + 3
VD2:
DECLARE @TBKP FLOAT
SELECT @TBKP = ([SELECT] AVG(Kinhphi)
FROM DETAI
WHERE MADT = 'DT001')
Biên soạn: Nguyễn Thị Mỹ Dung
8
- CH4: LẬP TRÌNH TRANSACT - SQL
Hiển thị giá trị biến
Sử dụng câu lệnh PRINT hoặc SELECT để
hiển thị giá trị của biến.
VD:
PRINT @x
PRINT @y
SELECT @x, @y
Biên soạn: Nguyễn Thị Mỹ Dung
Lưu ý:
- Khi gán trị cho biến có dữ liệu từ bảng dữ liệu
phải sử dụng từ khóa SELECT
- Khi in dữ liệu vừa có chuỗi và vừa có biến
bằng lệnh PRINT phải chuyển đổi kiểu cho biến
sang chuỗi với hàm CONVERT
CONVERT.
Cú pháp: CONVERT (, )
VD:
CONVERT (CHAR(5), MAXKP)
CONVERT (VARCHAR(5), SUMKP)
Biên soạn: Nguyễn Thị Mỹ Dung
9
- CH4: LẬP TRÌNH TRANSACT - SQL
VD1: Tính tổng 2 số
DECLARE @tong float, @a float, @b float
SET @a = 10.0
SET @b = 2.0
SET @tong = @a * @b
PRINT @tong
SELECT @a as so1, @b as so2, @tong as tong
VD2: Tính điểm trung bình của sinh viên A02 từ
bảng KETQUA
DECLARE @DiemTB float
SET @DiemTB=(SELECT AVG(Diem)
FROM KetQua
WHERE MaSV='A02')
SELECT @DiemTB as DTB
Biên soạn: Nguyễn Thị Mỹ Dung
VD3
VD 3: Lấy tổng kinh phí tất cả các đề tài từ bảng đề
tài.
DECLARE @tongkp float
SELECT @tongkp = sum(kinhphi)
FROM DETAI
VD4
VD 4: Tìm max kinh phí và min kinh phí của đề tài
DECLARE @maxkp int, @minkp int
SELECT @maxkp=MAX(kinhphi),@minkp = MIN
(kinhphi)
FROM DETAI
PRINT N'Kinh phí cao nhất là: ' +
CONVERT (CHAR,@maxkp)
PRINT N'Kinh phí thấp nhất là: ' +
CONVERT (CHAR,@minkp)
Biên soạn: Nguyễn Thị Mỹ Dung
10
- CH4: LẬP TRÌNH TRANSACT - SQL
Biến hệ thống
– Biến hệ thống là biến có sẵn và hệ thống quản lý.
– Biến hệ thống trong SQL Server được đặt tên bắt
đầu bởi 2 ký hiệu @.
Ví dụ:
PRINT @@CPU_BUSY
PRINT @@VERSION
SELECT @@SERVERNAME
SELECT @@DATEFIRST AS SONGAYTUAN
SELECT @@CONNECTIONS AS SLGNOIKET
Biên soạn: Nguyễn Thị Mỹ Dung
Danh sách biến và ý nghĩa một số biến hệ thống
BIẾN Ý NGHĨA
@@CONNECTIONS Số các kết nối đến Server
@@CPU_BUSY Số lượng xử lý công việc của SQL
@@CURSOR_ROWS Số bản ghi trong cursor mở gần nhất
@@DATEFIRST Số ngày trong tuần
@@ERROR Mã lỗi xảy ra gần nhất
@@FETCH_STATUS = 0: nếu truy xuất thành công, = 1: ngược lại
@@IDENTITY Giá trị identity gần nhất được sinh ra
@@LANGUA GE Ngôn ngữ sử dụng
@@MAX_CONNECTIONS Số lượng nối kết tối đa
@@ROWCOUNT Số bản ghi bị tác động bởi SQL
@@SERV ICENA ME Dịch vụ SQL trên máy chủ
@@TRANSCOUNT Số giao dịch đang hoạt động trên nối kết hiện tại
@@VERSION Phiên bản của SQL
Biên soạn: Nguyễn Thị Mỹ Dung
11
- CH4: LẬP TRÌNH TRANSACT - SQL
3. Khối lệnh
Một tập lệnh SQL được thực thi sẽ được đặt trong
khối lệnh BEGIN … END
Cú pháp:
BEGIN
|
END
VD:
BEGIN
DECLARE @DIEMTB_DT NUMERIC,
…
PRINT @DIEMTB_DT
END
Biên soạn: Nguyễn Thị Mỹ Dung
3. Các lệnh cấu trúc lựa chọn
Chúng ta có thể thực thi các tập lệnh SQL khác
nhau dựa vào các điều kiện chọn khác nhau.
a. IF … ELSE
Cú pháp:
IF
< lệnh sql1> |
[ ELSE
[IF
< lệnh sql2>|< tập lệnh2>
[ELSE]] ]
Biên soạn: Nguyễn Thị Mỹ Dung
12
- CH4: LẬP TRÌNH TRANSACT - SQL
VD1: TÌM SỐ LỚN NHẤT TRONG 3 SỐ
DECLARE @A INT, @B INT, @C INT, @MAX INT
SET @A = 4
SET @B = 2
SET @C = 10
SET @MAX = @A
IF @A > @MAX
SET @MAX = @A
ELSE BEGIN
IF @B > @MAX
SET @MAX = @B
ELSE
SET @MAX = @C
END
PRINT N'SỐ LỚN NHẤT: '+ CONVERT(CHAR,@MAX)
Biên soạn: Nguyễn Thị Mỹ Dung
VD2: Tìm xem có đề tài nào có kinh phí trên 20 tr
không? Nếu có in ra thông, không có hiển thị thông báo
IF (SELECT COUNT(*) FROM DETAI
WHERE KINHPHI > 20 ) > 0
BEGIN
PRINT N'DANH SÁCH ĐỀ TÀI CÓ KINH PHÍ
TRÊN 20 TRIỆU: '
SELECT MADT, TENDT, CHUNHIEM, KINHPHI
FROM DETAI WHERE KINHPHI > 20
END
ELSE
PRINT N'KHÔNG CÓ ĐỀ TÀI NÀO
TRÊN 20 TRIỆU!!!'
Biên soạn: Nguyễn Thị Mỹ Dung
13
- CH4: LẬP TRÌNH TRANSACT - SQL
b. IF với EXISTS
IF có kết hợp từ khóa EXISTS Để kiểm tra sự
tồn tại của các dòng dữ liệu bên trong bảng.
IF EXISTS (Câu_lệnh_SELECT)
Câu_lệnh1 | Khối_lệnh1
[ ELSE
Câu _lệnh2 | Khối_lệnh2 ]
Biên soạn: Nguyễn Thị Mỹ Dung
VD1: Tìm những đề tài có kinh phí lớn hơn kinh phí
trung bình tất cả các đề tài.
DECLARE @TBKP FLOAT
SET @TBKP = (SELECT AVG(KINHPHI) FROM DETAI)
IF EXISTS (SELECT KINHPHI FROM DETAI WHERE
KINHPHI > @TBKP)
BEGIN
PRINT N'CÁC ĐỀ TÀI CÓ KINH PHÍ CAO:' +
CONVERT(CHAR, @TBKP)
SELECT MADT, TENDT, CHUNHIEM,
KINHPHI
FROM DETAI
WHERE KINHPHI > @TBKP
END
Biên soạn: Nguyễn Thị Mỹ Dung
14
- CH4: LẬP TRÌNH TRANSACT - SQL
VD2: Tìm thông tin những đề tài có nhiều hơn 3 sinh
viên thực hiện, nếu không có in ra thông báo để biết.
IF EXISTS (SELECT MASV, COUNT (MADT) FROM SV_DT
GROUP BY MASV HAVING COUNT (MADT) > 3)
BEGIN
PRINT N'CÁC ĐỀ TÀI CÓ SỐ LƯỢNG TRÊN 2 SINH
VIÊN THỰC HIỆN!'
SELECT DISTINCT D.MADT, TENDT, CHUNHIEM,
KINHPHI, COUNT(SD.MASV) AS SL_SV
FROM DETAI D INNER JOIN SV_DT SD ON
D.MADT = SD.MADT
GROUP BY D.MADT, TENDT, CHUNHIEM, KINHPHI
HAVING COUNT(SD.MASV) > 3
END
ELSE
PRINT N'KHÔNG CÓ ĐỀ TÀI NÀO TRÊN 3 SINH VIÊN
THỰC HIỆN!'
Biên soạn: Nguyễn Thị Mỹ Dung
4. Câu lệnh Case… end
Dùng để lựa chọn nhiều giá trị, nếu
sau Case xuất hiện khi biểu thức có kiểu dữ liệu
số.
Case []
when then
when then
…..
[Else ]
End
Biên soạn: Nguyễn Thị Mỹ Dung
15
- CH4: LẬP TRÌNH TRANSACT - SQL
Ví dụ1:
DECLARE @TEN CHAR(3), @XUAT NVARCHAR(100)
SET @TEN = 'PHI'
SET @XUAT = (CASE @TEN
WHEN 'MR' THEN N'Xin chào quý ông!!!'
WHEN 'Mrs' THEN N'Xin chào quý bà!!!'
WHEN 'Ms' THEN N'Xin chào quý cô!!!'
ELSE N'XIN CHÀO MỌI NGƯỜI!!!'
END)
PRINT @XUAT
Biên soạn: Nguyễn Thị Mỹ Dung
Ví dụ 2: Xếp loại học lực cho sinh viên
SELECT SINHVIEN.MASV,HOTENSV, HOCLUC,
XEPLOAI= (CASE
WHEN HOCLUC =5 AND HOCLUC=7 AND HOCLUC
- CH4: LẬP TRÌNH TRANSACT - SQL
5. Lệnh vòng lặp
Các câu lệnh được thực thi nhiều lần (lặp) khi
nào điều kiện vẫn còn đúng.
WHILE
BEGIN
--Các câu lệnh
END
- Break: lệnh break nằm bên trong vòng lặp
while dùng để kết vòng lặp.
- Continue: lệnh continue nằm bên trong vòng
lặp while để bỏ qua các lệnh phía sau nó và bắt
đầu vòng lặp mới.
Biên soạn: Nguyễn Thị Mỹ Dung
VD1: In tổng từ 1 đến 10
DECLARE @TONG INT, @I INT
SET @TONG = 0
SET @I = 1
WHILE (@I
- CH4: LẬP TRÌNH TRANSACT - SQL
VD2: Tính tổng các số chẵn từ 1 đến 20
DECLA RE @TONGCHA N INT, @I INT
SET @TONGCHA N = 0
SET @I = 1
WHILE (@I
- CH4: LẬP TRÌNH TRANSACT - SQL
2. Tạo procedure
Procedure có thể sử dụng để kiểm tra tham số đầu
vào, đầu ra cho các thao tác dữ liệu.
- Cú pháp:
CREATE PROC | PROCEDURE
[()]
AS
--Tập lệnh SQL
--…
GO
- Thực thi lời gọi thủ tục:
EXEC | EXECUTE
Biên soạn: Nguyễn Thị Mỹ Dung
VD1: Viết thủ tục nhập vào một tên. Xác định:
VD1
- Nếu nhập ‘Mr’ thì print ‘Xin chào quý ông!’
- Nếu nhập ‘Mrs’ thì print ‘Xin chào quý bà!’
- Nếu nhập ‘Ms’ thì print ‘Xin chào quý cô!’
--Tham khảo
CREATE PROC Kt (@tensv nvarchar(3))
AS
IF (@tensv='Mr')
PRINT (N'Xin chào quý ông!!!')
IF (@tensv='Mrs')
PRINT (N'Xin chào quý bà!!!')
IF (@tensv = 'Ms')
PRINT (N'Xin chào quý cô!!!')
GO
EXECUTE kt 'Ms KIM'
Biên soạn: Nguyễn Thị Mỹ Dung
19
- CH4: LẬP TRÌNH TRANSACT - SQL
VD2 : Kiểm tra MASV, MADT khi nhập dữ liệu vào bảng SV_DT
CREATE PROC PRO_SV_DT (@MASV NVARCHAR(10), @MADT NVARCHAR(10),
@NOIA_D NVARCHAR(40), @KETQUA FLOAT)
AS
IF EXISTS (SELECT MASV FROM SINHVIEN WHERE MASV = @MASV)
BEGIN
IF EXISTS (SELECT MADT FROM DETAI WHERE MADT = @MADT)
BEGIN
INSERT INTO SV_DT (MASV, MADT, NOIA_D, KETQUA)
VALUES (@MASV, @MADT, @NOIA_D, @KETQUA)
PRINT N'ĐÃ THÊM THÀNH CÔNG'
END
END
ELSE PRINT 'KHÔNG THE INSERT DO MASV HAY MADT KHÔNG TON TAI'
RETURN 0
GO --Thực hiện lệnh để kiểm tra
EXEC PRO_SV_DT 'SV12','DT04','AN GIANG',8
Biên soạn: Nguyễn Thị Mỹ Dung
VD3: Giả sử ta cần thực hiện một chuỗi các thao tác
như sau trên cơ sở dữ liệu
1. Thêm vào danh sách đề tài (MADT, TênDT, Chủ
nhiệm, Kinh phí): DT1001, Xây dựng Website hỗ trợ việc
làm, Trần Kiến Quốc, 20
2. Lập danh sách sinh viên thực hiện đề tài DT1001 cho
tất cả sinh viên có học lực trên 8.
Cách 1: Theo cách thông thường
INSERT INTO DETAI
VALUES (‘DT1001', N‘Xây dựng Website hỗ trợ việc làm’,
N‘Trần Kiến Quốc’, 20)
INSERT INTO SV_DT (MASV,MADT)
SELECT MASV, ‘DT1001'
FROM SINHVIEN
WHERE HOCLUC>8
Biên soạn: Nguyễn Thị Mỹ Dung
20
nguon tai.lieu . vn