1.Giới thiệu 2 1 Giới thiệu Tài liệu này hướng dẫn thực hành lập trình cơ sở dữ liệu với ngôn ngữ T-SQL trong môi trường hệ quản trị SQL Server.. 2 Biến 2.1 Kiểu dữ liệu T-SQL sử dụn
Trang 1Tài liệu hướng dẫn: Lập trình CSDL
1
Tài liệu hướng dẫn: Lập trình CSDL
Người thực hiện
Hoàng Anh Tú
Nội dung
1 Giới thiệu 2
2 Biến 2
2.1 Kiểu dữ liệu 2
2.2 Khai báo biến 2
2.3 Gán giá trị 2
2.4 In giá trị của biến ra màn hình 3
2.5 Chuyển đổi kiểu dữ liệu 3
3 Toán tử 5
3.1 Toán tử số học 5
3.2 Toán tử nối chuỗi 5
3.3 Toán tử so sánh 5
3.4 Toán tử luận lý 5
4 Cấu trúc điều khiển 6
4.1 Cấu trúc rẽ nhánh IF…ELSE 6
4.1.1 Kết hợp IF với truy vấn 6
4.2 Cấu trúc lặp WHILE 7
5 Cursor 7
5.1 Khái niệm Cursor 7
5.2 Cú pháp 8
5.2.1 Khai báo Cursor 8
5.2.2 Mở Cursor 8
5.2.3 Lấy dữ liệu từ Cursor 8
5.2.4 Đóng Cursor 8
5.3 Ví dụ 8
5.3.1 Duyệt qua tất cả sinh viên có trong dữ liệu 8
5.3.2 Xuất ra danh sách sinh viên của từng lớp 9
Trang 21.Giới thiệu
2
1 Giới thiệu
Tài liệu này hướng dẫn thực hành lập trình cơ sở dữ liệu với ngôn ngữ T-SQL trong môi trường hệ quản trị SQL Server Nội dung chính bao gồm những phần sau:
Các thao tác lập trình cơ bản
Các cấu trúc điều khiển trong T-SQL: if, while, case,…
Đối tượng truy xuất dữ liệu: cursor
2 Biến
2.1 Kiểu dữ liệu
T-SQL sử dụng các biến với các kiểu dữ liệu có sẵng trong SQL Server như: int, float, double, varchar, nvarchar, char, nchar, datetime, decimal,…
2.2 Khai báo biến
Biến trong T-SQL được sử dụng để lưu trữ lại 1 giá trị tạm thời trong quá trình xử lý
Cú pháp khai báo biến:
DECLARE @ten_bien kieu_du_lieu
Ví dụ:
DECLARE @hoTen NVARCHAR ( 50 )
Biến trong T-SQL phải có tên bắt đầu bằng @
2.3 Gán giá trị
Cú pháp lệnh gán giá trị cho 1 biến:
- Gán giá trị cụ thể cho 1 biến bằng lệnh SET SET @ten_bien = giá_trị
- Gán giá trị cho biến từ 1 câu truy vấn SELECT @ten_bien = tên_cột FROM tên_bảng
Ví dụ:
DECLARE @hoTen NVARCHAR ( 50 )
SET @hoTen = N'Hoàng Anh Tú'
DECLARE @soLuong INT
SELECT @soLuong = COUNT (*) FROM SINHVIEN
PRINT @soLuong
Trang 32.Biến
3
2.4 In giá trị của biến ra màn hình
Sử dụng lệnh PRINT để in giá trị của biến ra màn hình
DECLARE @hoTen NVARCHAR ( 50 )
SET @hoTen = N'Hoàng Anh Tú'
PRINT @hoTen
Kết quả in ra màn hình như sau đây:
Hình 1 Kết quả in ra màn hình bằng lệnh PRINT
Lệnh PRINT chỉ in ra thông điệp trong màn hình cửa sổ “Messages” mà không thực
sự trả về giá trị Nếu muốn trả về giá trị ta dùng lệnh SELECT Lúc này, giá trị biến sẽ hiển thi trong tab “Results”
Hình 2 Kết quả in ra màn hình bằng lệnh SELECT
2.5 Chuyển đổi kiểu dữ liệu
SQL Server sẽ tự động chuyển đổi giá trị của biến với 1 số kiểu dữ liệu có tương thích với nhau: như từ int sang float hay float sang int
DECLARE @int INT
DECLARE @float FLOAT
Trang 42.Biến
4
SET @float = 2.6
SET @int = @float
PRINT @int
Màn hình sẽ in ra giá trị “2”
Tuy nhiên, trong 1 số trường hợp, SQL Server sẽ không tự động chuyển đổi kiểu dữ liệu Khi đó, câu lệnh sau sẽ báo lỗi hệ thống:
Hình 3 Lỗi hệ thống khi thực hiện phép cộng số và chuỗi
Để chuyển đổi giá trị của 1 biến từ 1 kiểu dữ liệu này qua kiểu dữ liệu khác ta có thể
sử dụng hàm CAST hoặc CONVERT
Hình 4 Sử dụng hàm CAST để chuyển đổi kiểu dữ liệu
Trang 53.Toán tử
5
3 Toán tử
3.1 Toán tử số học
Các toán tử số học được sử dụng trên các biến kiểu dữ liệu là các con số như: int, float, double, …
STT Toán tử Ý nghĩa
5 % Chia lấy phần dư
Bảng 1 Các toán tử số học
3.2 Toán tử nối chuỗi
Để nối 2 chuỗi trong T-SQL ta sử dụng toán tử +
Ví dụ:
DECLARE @hoTen NVARCHAR ( 50 )
SET @hoTen = N'Hoàng Anh Tú'
PRINT N'Xin chào ' + @hoTen
Màn hình sẽ in ra chuỗi “Xin chào Hoàng Anh Tú”
3.3 Toán tử so sánh
Các toán tử so sánh có thể được dùng để so sánh các số, ngày tháng, ký tự, chuỗi,…
STT Toán tử Ý nghĩa
1 = So sánh bằng
2 > So sánh lớn hơn
3 < So sánh nhỏ hơn
4 >= So sánh lớn hơn hoặc bằng
5 <= So sánh nhỏ hơn hoặc bằng
6 <> So sánh khác
7 != So sánh khác
8 !< So sánh không nhỏ hơn
9 !> So sánh không lớn hơn
Bảng 2 Các toán tử so sánh trong T-SQL
3.4 Toán tử luận lý
Các toán tử sử dụng để kết hợp các biểu thức điều kiện lại với nhau như: AND, OR, NOT thường sử dụng trong các câu lệnh truy vấn SQL
Ví dụ:
Trang 64.Cấu trúc điều khiển
6
Câu truy vấn lấy về danh sách sinh viên thuộc dân tộc Kinh và sinh sau năm 1984
SELECT *
FROM SINHVIEN S
WHERE S DANTOC = N'Kinh'
AND S NAMSINH > 1984
Sử dụng toán tử luận lý trong IF
IF (@float >= 1 AND @float <= 2) BEGIN
PRINT N'Số thực nằm từ 1 đến 2' END
4 Cấu trúc điều khiển
4.1 Cấu trúc rẽ nhánh IF…ELSE
Cú pháp:
IF biểu_thức_điều_kiện BEGIN
các_lệnh_xử_lý_khi_thỏa_điều_kiện END
ELSE BEGIN
các_lệnh_xử_lý_khi_không_thỏa_điều_kiện END
Ví dụ:
DECLARE @soLuong INT
SELECT @soLuong = COUNT (*) FROM SINHVIEN
IF @soLuong > 0 BEGIN
PRINT @soLuong END
ELSE BEGIN
PRINT N'Không có sinh viên' END
4.1.1 Kết hợp IF với truy vấn
Ta có thể kết hợp lệnh IF với các câu truy vấn để kiểm tra điều kiện trả về trên câu truy vấn
- Kết hợp IF với EXISTS
IF EXISTS( SELECT * FROM SINHVIEN ) BEGIN
Trang 75.Cursor
7
PRINT N'Có dữ liệu sinh viên' END
ELSE BEGIN
PRINT N'Không có dữ liệu sinh viên' END
- Kết hợp IF với các dạng truy vấn khác
IF ( SELECT COUNT (*) FROM SINHVIEN ) > 0 BEGIN
PRINT N'Có dữ liệu sinh viên' END
ELSE BEGIN
PRINT N'Không có dữ liệu sinh viên' END
4.2 Cấu trúc lặp WHILE
Cú pháp:
WHILE biểu_thức_điều_kiện BEGIN
các_lệnh_xử_lý_khi_thỏa_điều_kiện END
Ví dụ:
DECLARE @i INT
SET @i = 1
WHILE @i < 100 BEGIN
PRINT @i SET @i = @i + 1 END
Ví dụ trên sẽ in ra dãy các con số từ 1 đến 99
5 Cursor
5.1 Khái niệm Cursor
Các lệnh trong SQL như: SELECT, UPDATE, DELETE,… đều thao tác lên nhiều dòng dữ liệu thỏa điều kiện WHERE cùng lúc mà không thể thao tác lên từng dòng dữ liệu cụ thể Cursor là kiểu dữ liệu cơ bản dùng để duyệt qua từng dòng dữ liệu trả về
từ câu truy vấn SELECT đó giúp ta có thể có những xử lý khác nhau cho từng dòng
dữ liệu cụ thể
Cursor có 1 số đặc điểm:
Trang 85.Cursor
8
- Cho phép thao tác lên từng dòng dữ liệu trả về từ lệnh SELECT
- Do phải lặp qua từng dòng dữ liệu nên đây là cách xử lý chậm nhất
5.2 Cú pháp
Cú pháp của Cursor luôn tuân theo 1 số bước
5.2.1 Khai báo Cursor
DECLARE tên_cursor CURSOR
FOR lệnh_select
Ngoài ra, có thể khai báo riêng CURSOR rồi sau đó mới gán lệnh SELECT vào
CURSOR sau
DECLARE @tên_cursor CURSOR
SET @tên_cursor = CURSOR FOR lệnh_select
5.2.2 Mở Cursor
OPEN tên_cursor
5.2.3 Lấy dữ liệu từ Cursor
FETCH NEXT FROM tên_cursor INTO @biến1 , @biến2 ,
Sau khi lấy dữ liệu ra bằng lệnh FETCH, ta có thể kiểm tra có lấy được dữ liệu ra không bằng biến @@FETCH_STATUS:
- Nếu @@FETCH_STATUS = 0: lấy dữ liệu thành công
- Nếu @@FETCH_STATUS <> 0: lấy dữ liệu không thành công Có thể lúc này
ta đã đi lấy hết tất cả các dòng dữ liệu trả về
5.2.4 Đóng Cursor
Tại mỗi thời điểm không thể mở 2 cursor có cùng 1 tên Do đó, ta cần phải đóng cursor ngay và giải phóng vùng nhớ lưu trữ dữ liệu trả về từ lệnh SELECT
CLOSE tên_cursor
DEALLOCATE tên_cursor
5.3 Ví dụ
5.3.1 Duyệt qua tất cả sinh viên có trong dữ liệu
DECLARE @cursor CURSOR
SET @cursor = CURSOR FOR SELECT ma , hoTen FROM SINHVIEN
OPEN @cursor
DECLARE @mssv VARCHAR ( 10 ), @hoTen NVARCHAR ( 50 )
FETCH NEXT FROM @cursor INTO @mssv , @hoTen
Trang 95.Cursor
9
WHILE ( @@FETCH_STATUS = 0 ) BEGIN
PRINT N'Sinh viên ' + @mssv + N' họ tên: '
FETCH NEXT FROM @cursor INTO @mssv , @hoTen END
CLOSE @cursor
DEALLOCATE @cursor
5.3.2 Xuất ra danh sách sinh viên của từng lớp
DECLARE cursor_lop CURSOR FOR SELECT ma FROM LOP
DECLARE @cursor_sv CURSOR
OPEN cursor_lop
DECLARE @mssv VARCHAR ( 10 ), @hoTen NVARCHAR ( 50 ), @maLop
varchar ( 10 )
FETCH NEXT FROM cursor_lop INTO @maLop
WHILE ( @@FETCH_STATUS = 0 ) BEGIN
PRINT N'Lớp: ' + @maLop + N' gồm sinh viên:' SET @cursor_sv = CURSOR
FOR SELECT ma , hoten
FROM SINHVIEN WHERE maLop = @maLop
OPEN @cursor_sv FETCH NEXT FROM @cursor_sv INTO @mssv , @hoTen
WHILE ( @@FETCH_STATUS = 0 ) BEGIN
PRINT N' -Sinh viên ' + @hoTen + N' có mã số: ' + @mssv
FETCH NEXT FROM @cursor_sv INTO @mssv , @hoTen END
CLOSE @cursor_sv DEALLOCATE @cursor_sv FETCH NEXT FROM cursor_lop INTO @maLop END
CLOSE cursor_lop
DEALLOCATE cursor_lop
Màn hình sẽ xuất ra như sau:
Trang 105.Cursor
10
Hình 5 Kết quả in sinh viên của từng lớp học