Bài giảng Hệ quản trị cơ sở dữ liệu - Tạ Thị Thu Phượng

Chương 1
TỔNG QUAN VỀ HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU
I. Giới thiệu
Thông tin là nguồn tài nguyên quý giá của một tổ chức. Các phần mềm máy tính là
những công cụ hiệu quả để xử lý thông tin và hệ quản trị cơ sở dữ liệu là công cụ phổ
biến cho phép lưu trữ và rút trích thông tin một cách hiệu quả.
Hệ quản trị cơ sở dữ liệu quan hệ là hệ quản trị cơ sở dữ liệu phổ biến nhất hiện nay
và được hỗ trợ bởi nhiều nhà cung cấp phần mềm. Tính hiệu quả của các ứng dụng phụ
thuộc vào chất lượng của việc tổ chức dữ liệu. Những cải tiến trong kỹ thuật và xử lý cơ
sở dữ liệu đưa đến các cơ hội sử dụng thông tin một cách linh hoạt và hiệu quả khi dữ liệu
được tổ chức và lưu trữ trong các cấu trúc quan hệ. Hệ quản trị cơ sở dữ liệu là một thành
công trong lĩnh vực thương mại.
Mục tiêu của hệ quản trị cơ sở dữ liệu.
Hệ quản trị cơ sở dữ liệu phải đảm bảo các mục tiêu sau: dữ liệu sẵn dùng (data
availability), tính toàn vẹn dữ liệu (data integrity), an toàn dữ liệu (data secutity), và độc
lập dữ liệu (data independency).
o Dữ liệu sẵn dùng (data availability): dữ liệu được tổ chức sao cho mọi người dùng
có thể truy cập dễ dàng theo chức năng và nhiệm vụ của họ.
o Tính toàn vẹn dữ liệu (data integrity): dữ liệu lưu trữ trong cơ sở dữ liệu là đúng
đắn, đáng tin cậy.
o An toàn dữ liệu (data secutity): Chỉ những người dùng được phép mới có thể truy
cập dữ liệu. Nếu nhiều người dùng truy cập chung một mục dữ liệu cùng lúc thì hệ
quản trị cơ sở dữ liệu không cho phép họ thực hiện những thay đổi gây mâu thuẫn
dữ liệu.
o Độc lập dữ liệu (data independency): hệ quản trị cơ sở dữ liệu phải cho phép tất cả
mọi người dùng được phép lưu trữ, cập nhật và rút trích dữ liệu hiệu quả mà không
cần nắm chi tiết về cấu trúc của cơ sở dữ liệu được biểu diễn và cài đặt.
Quá trình phát triển của hệ quản trị cơ sở dữ liệu.
Quá trình phát triển của DBMS như sau:
- Flat files: 1960s – 1980s
- Hierarchical: 1970s –1990s
- Network : 1970s – 1990s
- Relational: 1980s – đến nay
- Object-oriented: 1990s – đến nay 
pdf 115 trang thiennv 08/11/2022 4080
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Hệ quản trị cơ sở dữ liệu - Tạ Thị Thu Phượng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pdfbai_giang_he_quan_tri_co_so_du_lieu_ta_thi_thu_phuong.pdf

Nội dung text: Bài giảng Hệ quản trị cơ sở dữ liệu - Tạ Thị Thu Phượng

  1. Bài giảng tóm tắt Hệ quản trị cơ sở dữ liệu 9 − Tên các cột trong cùng một bảng không được trùng nhau. − Thông tin về các bảng, các ràng buộc được lưu trong bảng hệ thống sysobjects Ví dụ: đọc thông tin về các bảng trong database hiện hành: Select * from sysobjects where type = ‘U’ − Một số thủ tục SQL Server cung cấp để quản lý bảng và cấu trúc bảng: o sp_databases o sp_tables [‘table_name’] [, ‘owner’][,‘database_name’][, “ ‘type’ ”] Ví dụ: Exec sp_tables null, null, null, “ ‘TABLE’ ” o sp_help [object_name]  sp_help cho biết các thông tin về đối tượng bất kỳ trong database (đối tượng có chứa trong sysobjects). Ví dụ: Exec sp_help HOCSINH o sp_columns object [, owner] [, database] [,column] o sp_helpconstraint ‘table_name’ o 3. Cài đặt ràng buộc toàn vẹn đơn giản SQL Server cung cấp sẵn cơ chế để kiểm tra các loại ràng buộc toàn vẹn (RBTV) sau: o Khóa chính (primary key constraint). o Khóa ngoại (foreign key constraint). o Giá trị duy nhất (unique constraint). o Check constraint (Kiểm tra ràng buộc miền giá trị). Có thể khai báo ràng buộc trong lúc tạo bảng hoặc khi bảng đã tồn tại. Thông thường nên khai báo ràng buộc toàn vẹn trước khi nhập dữ liệu. a. Khai báo ràng buộc trong lúc tạo bảng Cú pháp: Create table Table_name ( [, constraint Constraint_name { primary key (Column_name [, n]) | unique ( Column_name [, n]) | check ( logical_expression ) } ] [ n] ) Ví dụ
  2. Bài giảng tóm tắt Hệ quản trị cơ sở dữ liệu 10 Create table SinhVien ( MaSV char(10) not null, HoTen nvarchar(30) not null, Nam tinyint, CMND char(10), Khoa char(5), constraint pk_SV primary key (MaSV), constraint u_CMND unique (CMND), constraint chk_Nam check (Nam > 0 and Nam <= 4) ) b. Khai báo ràng buộc trên bảng đã tồn tại Cú pháp: Alter table table_name [with check| with nocheck] Add { constraint constraint_name { primary key ( column_name [, n] ) | unique ( column_name [, n] ) | check ( logical_expression ) | foreign key ( column_name [, n] ) references ref_table ( ref_column [, n] ) [ on delete {cascade| no action} ] [ on update {cascade| no action} ] } [, n] Ví dụ /* giả sử đã tồn tại bảng KHOA( MaKhoa, ) */ Alter table SINHVIEN with check add constraint u_CMND unique (CMND), constraint chk_Nam check (Nam in (1, 2, 3, 4) ), constraint fk_SV_maKhoa foreign key (Khoa), references KHOA(MaKhoa) c. Kiểm tra / không kiểm tra ràng buộc Cú pháp: Alter table Table_name {Check| Nocheck} constraint { All | constraint_name [, n] } Ví dụ: alter table SINHVIEN nocheck constraint u_CMND, chk_Nam d. Xoá ràng buộc Cú pháp:
  3. Bài giảng tóm tắt Hệ quản trị cơ sở dữ liệu 11 Alter table table_name Drop { [constraint ] constraint_name } [, n] Ví dụ: Alter table SINHVIEN drop constraint u_CMND, chk_Nam e. Rule − Rule là một qui định chung được tạo ra trong một CSDL. − Một rule có thể được áp dụng cho nhiều thuộc tính của nhiều bảng khác nhau, hoặc cho các kiểu dữ liệu người dùng định nghĩa trong database. Tạo rule Cú pháp: Create rule rule_name as logical_expression (trong đó “logical_expression” phải chứa một biến. Biến này tương ứng với đối tượng sẽ được áp dụng rule). Ví dụ: create rule r_SoDuong as @value >0 Kết buộc/ gỡ kết buộc rule Kết buộc rule: dùng thủ tục: sp_bindrule ‘rule_name’, ‘object’, [ ‘futureonly’ ] trong đó:  Tùy chọn futureonly chỉ dùng khi kết buộc rule với kiểu dữ liệu người dùng định nghĩa, có nghĩa các cột thuộc kiểu dữ liệu này trước đó không bị ảnh hưởng bởi rule. Ví dụ: sp_bindrule ‘r_SoDuong’, ‘SinhVien.Nam’  Rule mới kết buộc sẽ ngầm gỡ rule cũ trên đối tượng. Gỡ kết buộc sp_unbindrule ‘object’, [ ‘futureonly’ ] Ví dụ: sp_unbindrule ‘SinhVien.Nam’ Xoá rule Cú pháp: Drop rule {rule_name} [, n] Lưu ý: Chỉ xóa được rule khi nó không còn kết buộc với đối tượng nào. V. Các thao tác trên dữ liệu Chú ý khi thêm/ xóa/ cập nhật dữ liệu:
  4. Bài giảng tóm tắt Hệ quản trị cơ sở dữ liệu 12 – Dữ liệu nhập phải phù hợp với kiểu dữ liệu. – Đảm bảo các ràng buộc toàn vẹn. – Định dạng giá trị kiểu chuỗi unicode, kiểu datetime. – Nhập giá trị rỗng (Null). 1. Các dạng lệnh insert − Thêm từng dòng dữ liệu vào bảng Insert [into] Table_name[ (column_name[, n] )] values ( value [, n] ) − Thêm 0-n dòng dữ liệu từ bảng khác/ từ kết quả của một câu truy vấn Insert [into] Table_name Select_statement Lưu ý: trong câu select, ta có thể đọc dữ liệu từ các bảng trong database khác. Khi đó, tên bảng được viết đầy đủ như sau: Database_name.Owner.Table_name Ví dụ: select * from QLSinhVien.dbo.SinhVien 2. Lệnh cập nhật dữ liệu update table_name set column_name_1= value1, , column_name_m= value_m [where conditional_expression] 3. Lệnh xoá dữ liệu delete [from] table_name [where conditional_expression] VI. Truy vấn dữ liệu 1. Câu truy vấn tổng quát Cú pháp tổng quát của câu truy vấn dữ liệu: SELECT [tính chất] FROM [WHERE ] [GROUP BY ] [HAVING ] [ORDER BY [ASC | DESC]] trong đó: − Tính chất là một trong các từ khóa: ALL (chọn ra tất cả các dòng trong bảng), DISTINCT (loại bỏ các dòng trùng lắp thông tin), TOP (chọn n dòng đầu tiên thỏa mãn điều kiện).
  5. Bài giảng tóm tắt Hệ quản trị cơ sở dữ liệu 13 − Danh sách các thuộc tính_1: tên các thuộc tính cho biết thông tin cần lấy. Chú ý:  Các thuộc tính cách nhau bởi dấu ‘,’.  Nếu lấy tất cả các thuộc tính của 1 bảng R thì dùng: R.*  Nếu sau FROM chỉ có 1 bảng và lấy tất cả các cột của bảng đó thì dùng select *.  Nếu tồn tại 1 thuộc tính sau select xuất hiện ở 2 bảng sau FROM thì phải chỉ định rõ thuộc tính đó thuộc bảng nào. − Danh sách các table/query/view: các bảng, câu truy vấn, hoặc khung nhìn chứa thông tin cần lấy. Khi tìm kiếm thông tin trên nhiều hơn 2 bảng/truy vấn thì phải kết các bảng lại với nhau (có thể đặt điều kiện kết đặt sau where hoặc đặt trong mệnh đề From join/ left join/ right join/full join on ). − Alias: bí danh (tên tắt) của bảng dùng cho các bảng có tên quá dài, hoặc một bảng được dùng nhiều lần trong mệnh đề from của câu truy vấn. − điều kiện_1: là điều kiện để lọc dữ liệu (chọn các bộ thoả điều kiện). − danh sách các thuộc tính_2: dữ liệu sẽ được gom nhóm theo các cột này, độ ưu tiên tính từ trái sang. − điều kiện_2: điều kiện lọc các nhóm theo một tiêu chí đại diện cho cả nhóm. − danh sách các thuộc tính_3:sắp xếp dữ liệu theo cột nào, thứ tự là tăng (ASC) hoặc giảm (DESC). Mặc định là dữ liệu được sắp theo thứ tự tăng dần. Việc sắp xếp được thực hiện theo thứ tự ưu tiên từ trái qua phải. Lưu ý:  Nếu câu truy vấn không có mệnh đề Group By thì cũng không có mệnh đề Having.  Nếu câu truy vấn có chứa mệnh đề Group By thì Danh sách các thuộc tính_1 chỉ chứa các thuộc tính hoặc biểu thức liên quan đến các thuộc tính trong danh sách các thuộc tính_2 và các hàm gộp (max, min, avg, sum, count). 2. Các hàm thường dùng − Các hàm gộp (Aggregate functions): max, min, sum, avg, count − Các hàm thời gian. − Các hàm toán học. − Các hàm xử lý chuỗi. − . (Sinh viên có thể tra cứu theo từ khóa trong Books Online).
  6. Bài giảng tóm tắt Hệ quản trị cơ sở dữ liệu 14 VII. Tạo và sử dụng khung nhìn (View) 1. Khái niệm khung nhìn: Khung nhìn (View) là một bảng ảo, có cấu trúc như một bảng, khung nhìn không lưu trữ dữ liệu mà dữ liệu của nó được tạo ra khi sử dụng, khung nhìn là đối tượng thuộc CSDL. Khung nhìn được tạo ra từ câu lệnh truy vấn dữ liệu (lệnh Select), truy vấn từ một hoặc nhiều bảng dữ liệu. 2. Sử dụng khung nhìn o Khung nhìn được sử dụng khai thác dữ liệu như một bảng dữ liệu, có thể được chia sẻ bởi nhiều người dùng, an toàn trong khai thác. o Có thể thực hiện truy vấn dữ liệu trên cấu trúc của khung nhìn. o Các khung nhìn được tạo từ nhiều bảng hoặc trong khung nhìn có chứa từ khóa DISTINCT, hàm gộp, mệnh đề group by đều không cho phép cập nhật dữ liệu từ khung nhìn vào các bảng gốc trong cơ sở dữ liệu. Cú pháp tạo khung nhìn: Create View view_name As Select_statement VIII. Tạo và sử dụng chỉ mục (Index) Chỉ mục (Index) là một phần quan trọng đối với CSDL, đặc biệt là cơ sở dữ liệu lớn. Chỉ mục được thiết lập từ một hoặc nhiều cột dữ liệu của bảng dữ liệu. Các giá trị của Chỉ mục sẽ được sắp xếp và lưu trữ theo một danh sách (bảng khác). Mỗi giá trị chỉ mục là duy nhất trong danh sách và nó sẽ liên kết đến giá trị trong bảng dữ liệu (liên kết dạng con trỏ). Việc lưu trữ dữ liệu của bảng có khóa chỉ mục được thực hiện theo cấu trúc B-Cây nhằm tăng tốc độ truy xuất dữ liệu đối với ổ đĩa (thiết bị thứ cấp). Khi tìm kiếm một giá trị trong cột dữ liệu, mà cột này tham gia tạo Chỉ mục, đầu tiên câu lệnh xác định vị trí của giá trị nằm trong Chỉ mục bằng phép duyệt cây, sau đó thực hiện tìm theo liên kết đến bản ghi chứa giá trị tương ứng với khóa trong bảng. 1. Lựa chọn chỉ mục • Không có chỉ mục, hệ quản trị CSDL thực hiện truy vấn bằng cách duyệt qua từng dòng trong bảng. • Cài đặt các chỉ mục cho bảng giúp truy vấn thông tin nhanh hơn (tìm kiếm trên B-Cây). • Khóa chính và các ràng buộc unique hiển nhiên là các chỉ mục của bảng. • Cơ sở để chọn cài đặt chỉ mục: dựa vào các nhu cầu truy vấn thực hiện thường xuyên trên CSDL.
  7. Bài giảng tóm tắt Hệ quản trị cơ sở dữ liệu 15 • Nên cài đặt chỉ mục cho các trường hợp sau: – Trường hợp 1: Có nhu cầu truy vấn thường xuyên các bộ của bảng Q theo một số (tập) thuộc tính nào đó. Ví dụ: GiaoDich(MãGD, ,NgàyGD): Có nhu cầu truy xuất thường xuyên các bộ của giao dịch trong một ngày hoặc trong một khoảng thời gian nhất định: cài đặt chỉ mục trên thuộc tính NgayGD của quan hệ GiaoDich. – Trường hợp 2: tập thuộc tính tham gia vào phép kết của một câu truy vấn xảy ra thường xuyên. Ví dụ: cho 2 lược đồ quan hệ: HocSinh(STT, Lop, HoTen, ) KetQua(STT, Lop, Mon, Diem) Thường xuyên có nhu cầu truy vấn: cho biết kết quả học tập của một học sinh. Câu lệnh truy vấn như sau: select hs.STT, hs.Lop, hs.HoTen, kq.Mon, kq.Diem from HocSinh hs join KetQua kq on hs.STT = kq.STT and hs.Lop = kq.Lop  Cài đặt chỉ mục (STT, Lop) cho quan hệ KetQua Tổng quát: trên mô hình quan hệ, xác định các con đường truy xuất thường xuyên:  Từ một bộ của Q1(một giá trị cụ thể a của A) có nhu cầu truy xuất thường xuyên các bộ của Q2 tương ứng (tìm kiếm các bộ của Q2 với A = a): khai báo chỉ mục (A) cho Q2. Lưu ý: một chỉ mục (AB) khác với hai chỉ mục (A) và (B). 2. Các loại chỉ mục Có hai loại chỉ mục: – Clustered index – Nonclustered index Clustered index: • Dữ liệu thật sự được sắp xếp vật lý theo chỉ mục (thật sự nằm ở nút lá của cây). • Mỗi bảng chỉ có thể có một clustered chỉ mục, thường là khóa chính.
  8. Bài giảng tóm tắt Hệ quản trị cơ sở dữ liệu 16 Nonclustered index: • Chỉ mục logic, dữ liệu thật sự không được sắp xếp vật lý theo chỉ mục. • Nút lá là con trỏ trỏ đến vị trí của bộ dữ liệu, hoặc trỏ đến giá trị của clustered chỉ mục (trong trường hợp bảng có clustered index). – Không có clustered index: – Có clustered index
  9. Bài giảng tóm tắt Hệ quản trị cơ sở dữ liệu 17 • Một số cân nhắc khi chọn chỉ mục: – Sử dụng nhiều chỉ mục tăng tốc độ truy vấn, nhưng làm giảm hiệu quả của các thao tác thêm/xoá/cập nhật dữ liệu. – Không nên tạo chỉ mục trên các bảng quá nhỏ (vài trăm dòng). – Chỉ nên chọn chỉ mục mà mỗi giá trị của nó tương ứng với một số ít bộ. Nếu mỗi giá trị chỉ mục ứng với trên 20% số lượng bộ trong bảng, thực hiện truy vấn bình thường bằng cách duyệt qua các dòng trong bảng sẽ hiệu quả hơn. – Các giá trị chỉ mục phải phân bố đều các bộ trong bảng. – Cố gắng dùng các chỉ mục với số thuộc tính ít (chiếm ít không gian và cần ít chi phí duy trì hơn chỉ mục với số thuộc tính lớn). – Clustered index phải nhỏ (số thuộc tính ít, kích thước nhỏ), vì các chỉ mục nonclustered đều phải gắn kết tới nó. 3. Cài đặt chỉ mục với SQL Server Một số qui định: 1. Một bảng có tối đa 249 nonclustered chỉ mục (bao gồm cả những chỉ mục ngầm định khi khai báo khóa chính và chỉ mục). 2. Kích thước tối đa của một chỉ mục (tổng kích thước các thuộc tính tham gia vào chỉ mục) không quá 900 bytes. 3. Mặc định: chỉ mục clustered được khai báo ngầm định cùng với khai báo khóa chính, các trường hợp khác là nonclustered (tất nhiên có thể chỉ định khác đi). Cú pháp khai báo chỉ mục: Create [ Unique ][ Cluster| Nonclustered] Chỉ mục chỉ mục_name
  10. Bài giảng tóm tắt Hệ quản trị cơ sở dữ liệu 18 On {table | view } (column [ Asc | Desc] [ , n ]) Ví dụ: Create nonclustered chỉ mục idx_STTHS_Lop On KETQUA (STTHS, Lop) Cú pháp xóa chỉ mục: Drop Chỉ mục table_name (chỉ mục_name) Ví dụ: Drop Chỉ mục KETQUA(idx_STTHS_Lop) IX. Chuyển đổi dữ liệu với các ứng dụng khác (xem các tài liệu hướng dẫn thực hành SQL Server kèm theo)
  11. Bài giảng tóm tắt Hệ quản trị cơ sở dữ liệu 19 Chương 3 T-SQL NÂNG CAO I. Khai báo và sử dụng biến 1. Biến cục bộ − Là một đối tượng có thể chứa giá trị thuộc một kiểu dữ liệu nhất định, tên biến bắt đầu bằng một ký tự @. – Biến cục bộ có giá trị trong một query batch hoặc trong một thủ tục thường trú (stored procedure) hoặc hàm (function). – Khai báo biến cục bộ bằng lệnh declare: cung cấp tên biến và kiểu dữ liệu: Declare tên_biến Kiểu_dữ_liệu Ví dụ: Declare @MaSinhVien char(10) Declare @HoTen nvarchar(30) Declare @Sum float, @Count int – Để gán giá trị cho một biến cục bộ dùng lệnh set. Giá trị gán cho biến phải phù hợp với kiểu dữ liệu của biến. Set tên_biến = giá_trị Set tên_biến = tên_biến Set tên_biến = biểu_thức Set tên_biến = kết_quả_truy_vấn Ví dụ: Set @MaLop = ‘TH2001’ Set @SoSV = (select count (*) from SinhVien) Set @MaLop = ‘TH’+Year(@NgayTuyenSinh) Đưa kết quả truy vấn vào biến: SV(MaSV: int; HoTen: nvarchar(30), Tuoi int) Select @Var1 = HoTen, @Var1 = Tuoi from SV where MaSV = 1 Lưu ý: nếu câu truy vấn trả về nhiều dòng, các biến chỉ nhận giá trị tương ứng của dòng đầu tiên. 2. Biến toàn cục – Là các biến hệ thống do SQL Server cung cấp, tên biến bắt đầu bằng 2 ký tự @ – SQL tự cập nhật giá trị cho các biến này, người sử dụng không thể gán giá trị trực tiếp. − Một số biến hệ thống thuờng dùng o @@error: thông báo mã lỗi, nếu @@error = 0: thao tác thực hiện thành công.
  12. Bài giảng tóm tắt Hệ quản trị cơ sở dữ liệu 20 o @@rowcount: cho biết số dòng bị ảnh hưởng bởi lệnh cuối (insert, update, delete). o @@trancount: cho biết số giao dịch đang hoạt động trên kết nối hiện tại. o @fetch_status: cho biết thao tác lấy dữ liệu từ cursor có thành công không. II. Cấu trúc điều khiển 1. Lệnh If else − Chức năng: xét điều kiện để quyết định những lệnh T-SQL nào sẽ được thực hiện − Cú pháp: If biểu_thức_điều kiện Lệnh| Khối_lệnh [Else Lệnh| Khối_lệnh] Khối lệnh là một hoặc nhiều lệnh nằm trong cặp từ khóa begin end Ví dụ: xét 2 lược đồ quan hệ (LĐQH) HocPhan(MaHP, TenHP, SiSo) DangKy(MaSV, MaHP) Viết lệnh để thêm một đăng ký mới cho sinh viên có mã số 001 vào học phần HP01 (giả sử học phần này đã tồn tại trong bảng HocPhan). Lời giải như sau: Declare @SiSo int select @SiSo = SiSo from HocPhan where MaHP= ‘HP01’ if @SiSo < 50 Begin insert into DANG_KY(MaSV, MaHP) values(‘001’, ’HP01’) print N’Đăng ký thành công’ End Else print N’Học phần đã đủ SV’ 2. Lệnh While − Chức năng: thực hiện lặp lại một đoạn lệnh T-SQL khi điều kiện còn đúng. − Cú pháp:
  13. Bài giảng tóm tắt Hệ quản trị cơ sở dữ liệu 21 While biểu_thức_điều_kiện Lệnh| Khối lệnh – Có thể sử dụng Break và Continue trong khối lệnh của while  Break: thoát khỏi vòng while hiện hành.  Continue : trở lại đầu vòng while, bỏ qua các lệnh sau đó. Ví dụ: xét lược đồ quan hệ SinhVien(MaSV: int, HoTen: nvarchar(30)) Viết lệnh xác định một mã sinh viên mới theo qui định: mã sinh viên tăng dần, nếu có chỗ trống thì mã mới xác định sẽ chèn vào chỗ trống đó. Chẳng hạn, nếu trong bảng sinhvien đã có các mã sinh viên 1, 2, 3, 7  mã sinh viên mới là 4. Giải: Declare @STT int Set @STT = 1 While exists(select * from SV where MaSV = @STT) set @STT = @STT+1 Insert into SV(MaSV, HoTen) values(@STT, ‘Nguyen Van A’) 3. Lệnh Case − Chức năng: kiểm tra một dãy các điều kiện và trả về kết quả phù hợp với điều kiện đúng. Lệnh case được sử dụng như một hàm trong câu select. − Cú pháp: Có hai dạng:  Dạng 1 (simple case): Case Biểu_thức_đầu_vào When Giá_trị then kết_quả [ n] [ Else kết_quả_khác] End  Dạng 2 (searched case): Case When biểu_thức_điều kiện then kết_quả [ n] [ Else kết_quả_khác] End Ví dụ: xét LĐQH NHAN_VIEN(MaNV, HoTen, NgaySinh, CapBac,Phai)
  14. Bài giảng tóm tắt Hệ quản trị cơ sở dữ liệu 22 Cho biết những nhân viên đến tuổi nghỉ hưu biết rằng tuổi về hưu của nam là 60, của nữ là 55). Giải: select * from NHAN_VIEN where datediff(yy, NgaySinh, getdate()) > = Case Phai when ‘Nam’ then 60 when ‘Nu’ then 55 End Cho biết mã NV, họ tên và loại nhân viên (cấp bậc <=3:bình thường, cấp bậc = null: chưa xếp loại, còn lại: cấp cao). Giải: Select MaNV, HoTen, ‘Loai’ = Case when CapBac<=3 then ‘Binh Thuong’ when CapBac is null then ‘Chua xep loai’ else ‘Cap Cao’ End From NhanVien III. Thủ tục thường trú (Stored Procedures) 1. Khái niệm Thủ tục thường trú (Stored Procedures - SP) chứa các lệnh T_SQL. Tương tự như một thủ tục trong các ngôn ngữ lập trình, SP trong SQL Server có thể truyền tham số, có tính tái sử dụng. Các thủ tục này được dịch và lưu trữ thành một đối tượng trong CSDL. Ý nghĩa: − Tính tái sử dụng, tính uyển chuyển nhờ hệ thống tham số. − Khi biên dịch SP, các lệnh trong của nó được tối ưu hóa nó sao cho thực thi hiệu quả nhất. Kết quả tối ưu hóa được lưu bền vững. Khi gọi thực thi thủ tục không cần biên dịch và tối ưu hóa lại  lời gọi thủ tục tiết kiệm thời gian và tài nguyên hơn khối lệnh tương đương thân thủ tục. − Trong ứng dụng triển khai theo môi trường client/server, client gửi lời gọi SP lên server thì chiếm đường truyền ít hơn rất nhiều lần so với việc gửi khối lệnh tương đương trong thân thủ tục  Giảm khối lượng thông tin trao đổi khi ứng dụng gửi yêu cầu thực hiện công việc về cho server do đó tránh nghẽn đường truyền, giảm trì trệ.
  15. Bài giảng tóm tắt Hệ quản trị cơ sở dữ liệu 23 − Đóng gói chỉ các thao tác cho phép trên CSDL vào các SP và quy định truy xuất dữ liệu phải thông qua SP. Ngoài ra còn có thể phân quyền trên SP  Hỗ trợ tốt hơn cho việc đảm bảo an toàn (security) cho CSDL. − SP giúp cho việc kết xuất báo biểu bằng Crystal Report trở nên đơn giản và hiệu quả hơn rất nhiều so với việc kết xuất dữ liệu trực tiếp từ các bảng và khung nhìn. 2. Khai báo và sử dụng thủ tục Cú pháp khai báo: Create {proc | procedure} procedure_name {Parameter_name DataType [=default] [output] }[, n] As { khối lệnh } Go Lưu ý:  Tên tham số đặt theo qui tắc như tên biến cục bộ.  Giá trị trả về của SP dùng một (hay một số) tham số output. Ví dụ: − Xây dựng SP cho biết danh sách sinh viên của một lớp có mã cho trước Create proc DS_Lop @MaLop varchar(10) As Select SV.MaSV, SV.HoVaTen, SV.NgaySinh From SinhVien SV where SV.Lop = @MaLop Go − Xây dựng SP tính toán giá trị cho đơn hàng có mã cho trước với quan hệ DonHang như sau: DonHang(Ma, SoLuong, DonGia, ThueSuat, ChietKhau, ThanhTien) Create proc TongTien @MaDH varchar(10) As Declare @ThanhTien float Declare @TienThue float Declare @TienChietKhau float Declare @DonGia float,@SoLuong int Set @SoLuong = (select SoLuong from DonHang where Ma = @MaDH)
  16. Bài giảng tóm tắt Hệ quản trị cơ sở dữ liệu 24 Set @DonGia = (select DonGia from DonHang where Ma = @MaDH) Set @TienThue = (select ThueSuat from DonHang where Ma = @MaDH) Set @TienChietKhau = (select ChietKhau from DonHang where Ma = @MaDH) Set @ThanhTien = @DonGia*@SoLuong Set @TienThue = @ThanhTien*@TienThue/100 Set @ThanhTien = @ThanhTien + @TienThue Set @TienChietKhau = @ThanhTien*@TienChietKhau/100 Set @ThanhTien = @ThanhTien - @TienChietKhau Update DonHang set ThanhTien = @ThanhTien where Ma = @MaDH Go − Viết thủ tục thêm một đăng ký của sinh viên vào một học phần (tổng quát ví dụ trong phần If else) Create procedure usp_ThemDangKy @MaSV char(5), @MaHP char(5), @SiSo int = 0 output As select @SiSo = SiSo from HocPhan where MaHP= @MaHP if @SiSo < 50 Begin insert into DANG_KY(MaSV, MaHP) values(@MaSV, @MaHP) set @SiSo = @SiSo+1 return 1 End return 0 Go - Xây dựng SP tính điểm trung bình và xếp loại cho sinh viên thuộc lớp cho trước. Giả sử có các quan hệ như sau: SinhVien (MaSV, HoTen, DTB, XepLoai, Lop) MonHoc (MaMH, TenMH) KetQua (MaMH, MaSV, LanThi, Diem) trong đó: