82
BỘ GIAO THÔNG VẬN TẢI TRƯỜNG ĐẠI HỌC HÀNG HẢI KHOA CÔNG NGHỆ THÔNG TIN BỘ MÔN HỆ THỐNG THÔNG TIN BÀI GIẢNG HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU TÊN HỌC PHẦN : HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU MÃ HỌC PHẦN : 17402 TRÌNH ĐỘ ĐÀO TẠO : ĐẠI HỌC CHÍNH QUY DÙNG CHO SV NGÀNH : CÔNG NGHỆ THÔNG TIN HẢI PHÒNG - 2009

Bai giang he qtdl

Embed Size (px)

Citation preview

Page 1: Bai giang he qtdl

BỘ GIAO THÔNG VẬN TẢI TRƯỜNG ĐẠI HỌC HÀNG HẢI

KHOA CÔNG NGHỆ THÔNG TINBỘ MÔN HỆ THỐNG THÔNG TIN

BÀI GIẢNG

HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU

TÊN HỌC PHẦN : HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆUMÃ HỌC PHẦN : 17402TRÌNH ĐỘ ĐÀO TẠO : ĐẠI HỌC CHÍNH QUYDÙNG CHO SV NGÀNH : CÔNG NGHỆ THÔNG TIN

HẢI PHÒNG - 2009

Page 2: Bai giang he qtdl

MỤC LỤC

Chương 1. Giới thiệu 51.1. Hệ quản trị cơ sở dữ liệu Microsoft SQL Server 51.2. Các thành phần cơ bản trong Microsoft SQL Server 181.3. Ngôn ngữ truy vấn dữ liệu có cấu trúc (SQL) 24Chương 2. Tạo và quản lý cơ sở dữ liệu 262.1. Các tệp tin cơ sở dữ liệu (Database files) 262.2. Tạo cơ sở dữ liệu (Database) 262.3. Quản lý cơ sở dữ liệu 302.4. Xóa cơ sở dữ liệu 32Chương 3. Tạo và quản lý các bảng 353.1. Tạo bảng (Tables) 353.2. Định nghĩa các cột (Columns) 363.3. Định nghĩa các ràng buộc (Constrains) 373.4. Sửa bảng (ALTER TABLE) 383.5. Xóa bảng (DROP TABLE) 393.6. Thêm bản ghi mới (INSERT) 393.7. Cập nhật bản ghi (UPDATE) 413.8. Xóa bản ghi (DELETE) 42Chương 4. Truy vấn dữ liệu 444.1. Truy vấn cơ bản 444.2. Truy vấn từ nhiều bảng 51 4.2.1. Inner Joins 51 4.2.2. Outer Joins 514.3. Truy vấn lồng nhau (Subqueries) 51Chương 5. Tạo và quản lý các chỉ mục 545.1. Các kiểu chỉ mục (Indexes) 545.2. Tạo các chỉ mục 545.3. Quản lý các chỉ mục 585.4. Xóa các chỉ mục 58Chương 6. Tạo và quản lý khung nhìn 606.1. Định nghĩa 606.2. Tạo các khung nhìn (Views) 606.3. Quản lý các khung nhìn 616.4. Xóa các khung nhìn 61Chương 7. Tạo và quản lý các thủ tục thường trú 627.1. Tạo các thủ tục thường trú (Stored procedures) 627.2. Thực thi các thủ tục thường trú 647.3. Xem và sửa các thủ tục thường trú 647.4. Tham số vào và ra (Parameters) 657.5. Các thủ tục thường trú của hệ thống 65Chương 8. Tạo và quản lý hàm người dùng định nghĩa 688.1. Các kiểu hàm người dùng định nghĩa (User-defined functions) 688.2. Tạo hàm người dùng định nghĩa 688.3. Quản lý hàm người dùng định nghĩa 69Chương 9. Tạo và quản lý các Trigger 709.1. Tạo các Trigger thao tác dữ liệu (DML Triggers) 709.2. Tạo các Trigger định nghĩa dữ liệu (DDL Triggers) 709.3. Sử dụng các Trigger lồng nhau (Nested Triggers) 719.4. Sử dụng các Trigger đệ quy (Recursive Triggers) 74Một số đề thi mẫu 76

2

Page 3: Bai giang he qtdl

Tên học phần: Hệ quản trị Cơ sở dữ liệu Loại học phần: 4Bộ môn phụ trách giảng dạy: Hệ thống Thông tin Khoa phụ trách: CNTT.Mã học phần: 17402 Tổng số TC: 4

Tổng số tiết Lý thuyết Thực hành/ Xemina Tự học Bài tập lớn Đồ án môn học90 45 30 0 x 0

Học phần học trước: Không yêu cầu.Học phần tiên quyết: Không yêu cầu.Học phần song song: Không yêu cầu.Mục tiêu của học phần:

Cung cấp cho sinh viên những kiến thức cơ bản về hệ quản trị cơ sở dữ liệu; Các chức năng và công cụ cần thiết để quản trị cơ sở dữ liệu cho người phát triển hệ thống. Nội dung chủ yếu:

Giới thiệu về hệ quản trị cơ sở dữ liệu; Tạo và quản lý cơ sở dữ liệu; Tạo và quản lý các bảng; Truy vấn dữ liệu; Tạo và quản lý các chỉ mục; Tạo và quản lý các khung nhìn; Tạo và quản lý các thủ tục thường trú; Tạo và quản lý các hàm người dùng định nghĩa; Tạo và quản lý các Trigger.Nội dung chi tiết:

TÊN CHƯƠNG MỤCPHÂN PHỐI SỐ TIẾT

TS LT BT TH KTChương 1. Giới thiệu 5 3 21.1. Hệ quản trị cơ sở dữ liệu Microsoft SQL Server (2005)1.2. Các thành phần cơ bản trong Microsoft SQL Server (2005)1.3. Ngôn ngữ truy vấn dữ liệu có cấu trúc (SQL)Chương 2. Tạo và quản lý cơ sở dữ liệu 10 6 42.1. Các tệp tin cơ sở dữ liệu (Database files)2.2. Tạo cơ sở dữ liệu (Database)2.3. Quản lý cơ sở dữ liệu2.4. Xóa cơ sở dữ liệuChương 3. Tạo và quản lý các bảng 15 9 63.1. Tạo bảng (Tables)3.2. Định nghĩa các cột (Columns)3.3. Định nghĩa các ràng buộc (Constrains)3.4. Sửa bảng (ALTER TABLE)3.5. Xóa bảng (DROP TABLE)3.6. Thêm bản ghi mới (INSERT)3.7. Cập nhật bản ghi (UPDATE)3.8. Xóa bản ghi (DELETE)Chương 4. Truy vấn dữ liệu 20 12 84.1. Truy vấn cơ bản 4.1.1. Mệnh đề SELECT 4.1.2. Mệnh đề FROM 4.1.3. Mệnh đề WHERE 4.1.4. Mệnh đề GROUP BY và HAVING 4.1.5. Mệnh đề ORDER BY 4.1.6. Kết hợp kết quả từ nhiều truy vấn khác nhau4.2. Truy vấn từ nhiều bảng 4.2.1. Inner Joins 4.2.2. Outer Joins4.3. Truy vấn lồng nhau (Subqueries)Chương 5. Tạo và quản lý các chỉ mục 5 3 2

3

Page 4: Bai giang he qtdl

TÊN CHƯƠNG MỤCPHÂN PHỐI SỐ TIẾT

TS LT BT TH KT5.1. Các kiểu chỉ mục (Indexes)5.2. Tạo các chỉ mục5.3. Quản lý các chỉ mục5.4. Xóa các chỉ mụcChương 6. Tạo và quản lý khung nhìn 5 3 26.1. Định nghĩa6.2. Tạo các khung nhìn (Views)6.3. Quản lý các khung nhìn6.4. Xóa các khung nhìnChương 7. Tạo và quản lý các thủ tục thường trú 5 3 27.1. Tạo các thủ tục thường trú (Stored procedures)7.2. Thực thi các thủ tục thường trú7.3. Xem và sửa các thủ tục thường trú7.4. Tham số vào và ra (Parameters)7.5. Các thủ tục thường trú của hệ thốngChương 8. Tạo và quản lý hàm người dùng định nghĩa 5 3 28.1. Các kiểu hàm người dùng định nghĩa (User-defined functions)8.2. Tạo hàm người dùng định nghĩa8.3. Quản lý hàm người dùng định nghĩaChương 9. Tạo và quản lý các Trigger 5 3 29.1. Tạo các Trigger thao tác dữ liệu (DML Triggers)9.2. Tạo các Trigger định nghĩa dữ liệu (DDL Triggers)9.3. Sử dụng các Trigger lồng nhau (Nested Triggers)9.4. Sử dụng các Trigger đệ quy (Recursive Triggers)Nhiệm vụ của sinh viên:

Tham dự các buổi học lý thuyết và thực hành, làm các bài tập được giao, làm các bài thi giữa học phần và bài thi kết thúc học phần theo đúng quy định.Tài liệu học tập:

1. Dương Quang Thiện, SQL Server 2000: Lập trình T - SQL, NXB Văn hóa Sài Gòn, 2007.2. Ray Rankins, Paul Bertucci, Chris Gallelli, Alex T.Silverstein, Microsoft SQL Server 2005

Unleashed, Sams Publishing, 2007. 3. Brian Knightet al, Professional SQL Server 2005 Administration, Wrox Press, 2007.4. Paul Turley & Dan Wood, Beginning Transact-SQL with SQL Server 2000 and 2005, Wrox

Press, 2006.Hình thức và tiêu chuẩn đánh giá sinh viên:

− Hình thức thi: thi viết hoặc vấn đáp.− Tiêu chuẩn đánh giá sinh viên: căn cứ vào sự tham gia học tập của sinh viên trong các buổi

học lý thuyết và thực hành, kết quả làm các bài tập được giao, kết quả của các bài thi giữa học phần và bài thi kết thúc học phần.

Thang điểm: Thang điểm chữ A, B, C, D, F.Điểm đánh giá học phần: Z = 0,4X + 0,6Y.

Bài giảng này là tài liệu chính thức và thống nhất của Bộ môn Hệ thống Thông tin, Khoa Công nghệ Thông tin và được dùng để giảng dạy cho sinh viên.

Ngày phê duyệt: / /

Trưởng Bộ môn

4

Page 5: Bai giang he qtdl

Chương 1. Giới thiệu

1.1. Hệ quản trị cơ sở dữ liệu Microsoft SQL Server 1.1.1.Khái niệm về CSDL và CSDL quan hệA. Khái niệm về cơ sở dữ liệu (Database)

Cơ sở dữ liệu là một tập hợp có tổ chức các dữ liệu có liên quan luận lý với nhau. Nói cách khác

đó là một hệ thống các thông tin có cấu trúc được lưu trữ trên các thiết bị lưu trữ thông tin thứ cấp,

ví dụ như: đĩa từ, băng từ, bộ nhớ flash,… nhằm mục đích thỏa mãn yêu cầu tổ chức dữ liệu để

giúp cho việc khai thác dữ liệu được nhanh chóng và chính xác. Cơ sở dữ liệu phải được thiết kế

sao cho có thể cho phép nhiều người dùng và nhiều ứng dụng khác nhau cùng khai thác.

Hình 1: Sơ đồ tổng quát về một hệ cơ sở dữ liệu

B. Khái niệm về cơ sở dữ liệu quan hệ

Cơ sở dữ liệu quan hệ là cơ sở dữ liệu được tổ chức dựa trên mô hình của đại số quan hệ

(Relational Model). Trong đó, dữ liệu được tổ chức thành các bảng dữ liệu (tables). Mỗi bảng dữ

liệu gồm có các cột (column) hay còn gọi là các trường (field) và các dòng (row) hay còn gọi là các

bản ghi (record). Ví dụ:

Mã Sinh viên Tên Sinh viên Lớp

HHA01 Lê Hoàng Long KTB48ĐH1

HHA02 Trần Bình Minh KTB48ĐH1

5

Page 6: Bai giang he qtdl

Về phương diện toán học, một bảng dữ liệu gồm có n cột: A1, A2, A3…, An có thể coi là một tập

con R của tích Đề các dom(A1) x dom(A2)…x dom(An):

R ⊆ dom(A1) x dom(A2)…x dom(An)

Người ta gọi đó là quan hệ R xác định trên tập thuộc tính {A1, A2,…, An}. Trong đó dom(Ai) là ký

hiệu miền giá trị (domain) của cột Ai.

Giữa các cột trong bảng có những mối quan hệ ràng buộc phụ thuộc lẫn nhau gọi là các phụ

thuộc hàm. Ví dụ: Trong bảng sinh viên có phụ thuộc hàm:

Mã Sinh Viên → Tên Sinh Viên, Lớp

Trong một bảng dữ liệu, có thể có một cột (hoặc một số tối thiểu các cột) mà giá trị trên mỗi

dòng của nó là duy nhất. Ta gọi đó là khóa (Key). Khi biết giá trị của trường khóa ta có thể suy ra

các trường còn lại. Ví dụ: Trong bảng Sinh Viên thì Mã Sinh Viên là khóa. Khi biết Mã Sinh Viên ta

có thể tra cứu ra các thuộc tính như Tên Sinh Viên và Lớp.

Giữa hai bảng trong cơ sở dữ liệu cũng tồn tại các mối quan hệ ràng buộc lẫn nhau (bắt nguồn

từ mô hình ER):

Quan hệ 1 – 1: Một bản ghi thuộc bảng này tương ứng với một và chỉ một bản ghi ở bảng kia và

ngược lại. Trong trường hợp này người ta thường nhập 2 bảng vào làm một.

Quan hệ 1 – n: Một bản ghi thuộc bảng này tương ứng với n bản ghi ở bảng kia (n ≥ 0) nhưng

ngược lại một bản ghi ở bảng kia chỉ tương ứng với không quá 1 bản ghi ở bảng này. Bảng ở phía

ứng với ứng số nhiều n gọi là bảng con (child) còn bảng ở phía ứng với ứng số 1 gọi là bảng cha

(parents). Bảng cha phải có một trường khóa gọi là khóa chính (PK - Primary Key) còn bảng con

phải có một trường tham chiếu đến khóa chính của bảng cha gọi là khóa ngoại (FK - Foreign Key).

Hình 2: Quan hệ 1- 1

6

Page 7: Bai giang he qtdl

Hình 3: Quan hệ 1 - n

Quan hệ n – n: Quan hệ n – n không được biểu diễn tường minh trong CSDL. Người ta thường

tách quan hệ n – n về thành các quan hệ 1 – n dựa trên mô hình thực thể liên kết (ER).

1.1.2. Khái niệm về hệ quản trị Cơ sở dữ liệuA. Hệ quản trị CSDL là gì?

Hệ quản trị cơ sở dữ liệu là một tập hợp chương trình giúp cho người sử dụng tạo ra, duy trì và

khai thác một cơ sở dữ liệu. Đó là một hệ thống phần mềm phổ dụng, cung cấp môi trường và

công cụ giúp cho việc định nghĩa, xây dựng và thao tác cơ sở dữ liệu cho các ứng dụng khác nhau

một cách dễ dàng.

Định nghĩa một cơ sở dữ liệu là đặc tả các kiểu dữ liệu, các cấu trúc, các ràng buộc cho các dữ

liệu sẽ được lưu trữ.

Xây dựng cơ sở dữ liệu là lưu trữ dữ liệu lên các phương tiện lưu trữ được hệ quản trị cơ sở dữ

liệu kiểm soát.

Thao tác trên một cơ sở dữ liêu là quá trình truy vấn cơ sở dữ liệu để lấy ra các dữ liệu cụ thể,

cập nhật cơ sở dữ liệu, tạo ra các báo cáo từ dữ liệu.

7

Page 8: Bai giang he qtdl

Hình 4: Mô hình Hệ quản trị cơ sở dữ liệu

Mỗi hệ quản trị cơ sở dữ liệu có một ngôn ngữ định nghĩa dữ liệu riêng (DDL - Data

Definition Languague). Đây là ngôn ngữ dùng để định nghĩa, khai báo cấu trúc của của cơ sở dữ

liêu. Những người thiết kế và quản trị cơ sở dữ liệu thực hiện các công việc khai báo cấu trúc cơ sở

dữ liệu. Các chương trình khai báo cấu trúc CSDL được viết bằng ngôn ngữ DDL mà hệ quản trị

CSDL cho phép.

Các chương trình ứng dụng được viết bằng các ngôn ngữ lập trình C++/C#/Java/Delphi… kết

hợp với các ngôn ngữ thao tác dữ liệu (DML - Data Manipulation Language) thông qua các thư

viện hoặc đối tượng kết nối CSDL được ngôn ngữ lập trình hỗ trợ: ODBC, RDO, ADO,…

Các hệ quản trị cơ sở dữ liệu quan hệ ngày nay phổ biến sử dụng các ngôn ngữ DDL và DML

dựa trên ngôn ngữ SQL.

Đối với hệ quản trị cơ sở dữ liệu SQL Server thì ngôn ngữ dùng để tương tác với cơ sở dữ liệu

là T – SQL. Đây là một phiên bản của ngôn ngữ SQL. Ngôn ngữ T – SQL trên SQL Server bao gồm

nhiều câu lệnh khác nhau, có thể chia thành 2 nhóm:

o Nhóm ngôn ngữ định nghĩa dữ liệu DDL : với các lệnh cho phép tạo, thay đổi cấu trúc và

xóa các đối tượng CSDL: database, table, view,…

o Nhóm ngôn ngữ thao tác dữ liệu DML : với các lệnh như

SELECT/INSERT/UPDATE/DELETE cho phép lấy về dữ liệu cụ thể, thay đổi giá trị của dữ

liệu.

8

Page 9: Bai giang he qtdl

Hình 5: Tương tác với hệ quản trị Cơ sở dữ liệu

B. Hoạt động của hệ quản trị cơ sở dữ liệu

Hình 6: Hoạt động của hệ quản trị cơ sở dữ liệu

Các yêu cầu của chương trình ứng dụng được chuyển tới hệ quản trị CSDL (theo con đường số 1).

Tại đây hệ quản trị CSDL sẽ tham khảo các từ điển dữ liệu (Meta DataBase) để tìm kiếm các ánh

xạ cấu trúc ngoài với cấu trúc quan niệm và cấu trúc vật lý (các ngõ a, b và c). Tại đây hệ quản trị

9

Page 10: Bai giang he qtdl

CSDL có thể sẽ tham khảo tới vùng đệm của nó để xác định xem câu trả lời đã có sẵn ở đó chưa,

nếu có thì trả lại cho chương trình ứng dụng thông qua con đường số 8b; ngược lại sẽ yêu cầu hệ

điều hành truy xuất thông tin theo con đường số 2. Tới đây hệ điều hành sẽ gửi yêu cầu truy xuất

thông tin trong CSDL thông qua hệ thống xuất nhập của HĐH (các con đường số 3 và 5). Nếu việc

truy xuất không thành công nó sẽ trả lại yêu cầu về cho hệ quản trị CSDL (có thể thông qua các mã

lỗi) qua con đường số 6; nếu thành công thì dữ liệu sẽ được chuyển vào vùng đệm của hệ quản trị

CSDL. Qua xử lý, hệ quản trị CSDL sẽ chuyển dữ liệu vào vùng đệm của chương trình ứng dụng đề

nó xử lý (qua con đường 8a) và cho ra kết quả trả lời của chương trình ứng dụng qua con đường số

10.

1.1.3. Giới thiệu về SQL Server và mô hình Client/Server1.1.3.1. Khái niệm về mô hình Client/Server

Hình 7: Mô hình Client/ServerMô hình client/server hay còn gọi là mô hình khách/chủ là một mô hình nổi tiếng trong mạng máy

tính, được áp dụng rất rộng rãi. Ý tưởng của mô hình này là máy trạm (hay còn gọi là máy khách)

gửi yêu cầu (request) cho máy chủ (đóng vai trò người cung ứng dịch vụ), máy chủ sẽ xử lý và trả

kết quả về cho máy khách.

Client/Server là mô hình mang tính tổng quát. Trên thực tế thì một server có thể được nối tới nhiều

server khác nhằm làm việc hiệu quả và nhanh hơn. Khi nhận được 1 yêu cầu từ client, server này có

thể gửi tiếp yêu cầu vừa nhận được cho server khác ví dụ như database server vì bản thân nó không

thể xử lý yêu cầu này được. Máy server có thể thi hành các nhiệm vụ đơn giản hoặc phức tạp. Ví

dụ như một máy chủ trả lời thời gian hiện tại trong ngày, khi một máy client yêu cầu lấy

thông tin về thời gian nó sẽ phải gửi một yêu cầu theo một tiêu chuẩn do server định

10

Page 11: Bai giang he qtdl

ra, nếu yêu cầu được chấp nhận thì máy server sẽ trả về thông tin mà client yêu cầu. Có rất nhiều

các dịch vụ server trên mạng nhưng nó đều hoạt động theo nguyên lý là nhận các yêu cầu từ client

sau đó xử lý và trả kết quả cho client yêu cầu. Thông thường chương trình server và client được thi

hành trên hai máy khác nhau. Cho dù lúc nào server cũng ở trạng thái sẵn sàng chờ nhận yêu cầu từ

client nhưng trên thực tế một tiến trình liên tác qua lại (interaction) giữa client và server lại bắt đầu

ở phía client, khi mà client gửi tín hiệu yêu cầu tới server. Các chương trình server thường đều thi

hành ở mức ứng dụng (tầng ứng dụng của mạng). Sự thuận lợi của phương pháp này là nó có thể

làm việc trên bất cứ một mạng máy tính nào có hỗ trợ giao thức truyền thông chuẩn cụ thể ở đây là

giao thức TCP/IP. Với các giao thức chuẩn này cũng giúp cho các nhà sản xuất có thể tích hợp

nhiều sản phẩm khác nhau của họ lên mạng mà không gặp phải khó khăn gì. Với các chuẩn này thì

các chương trình server cho một dịch vụ nào đấy có thể thi hành trên một hệ thống chia sẻ thời gian

(timesharing system) với nhiều chương trình và dịch vụ khác hoặc nó có thể chạy trên chính một

máy tính các nhân bình thường. Có thể có nhiều chương trình server cùng làm một dịch vụ, chúng

có thể nằm trên nhiều máy tính hoặc một máy tính. Với mô hình trên chúng ta nhận thấy rằng mô

hình client/server chỉ mang đặc điểm của phần mềm không liên quan gì đến phần cứng mặc dù trên

thực tế yêu cầu cho một máy server là cao hơn nhiều so với máy client. Lý do là bởi vì máy server

phải quản lý rất nhiều các yêu cầu từ các clients khác nhau trên mạng. Ưu và nhược điểm chính Có

thể nói rằng với mô hình client/server thì mọi thứ dường như đều nằm trên bàn của người sử dụng,

nó có thể truy cập dữ liệu từ xa (bao gồm các công việc như gửi và nhận file, tìm kiếm thông tin, ...)

với nhiều dịch vụ đa dạng mà mô hình cũ không thể làm được. Mô hình client/server cung cấp một

nền tảng lý tưởng cho phép tích hợp các kỹ thuật hiện đại như mô hình thiết kế hướng đối tượng, hệ

chuyên gia, hệ thông tin địa lý (GIS) ... Một trong những vấn đề nảy sinh trong mô hình này đó là

tính an toàn và bảo mật thông tin trên mạng. Do phải trao đổi dữ liệu giữa 2 máy ở 2 khu vực khác

nhau cho nên dễ dàng xảy ra hiện tượng thông tin truyền trên mạng bị lộ.

1.1.3.2. SQL Server và mô hình Client/Server

11

Page 12: Bai giang he qtdl

Hình 8a: SQL Server và mô hình Client/Server

Hình 8b: Dùng các công cụ của SQL Server để truy xuất từ máy khách

SQL Server là một hệ quản trị cơ sở dữ liệu quan hệ hoạt động trên môi trường mạng theo mô hình

khách/chủ. Phía máy chủ chạy các dịch vụ cần thiết mà quan trọng nhất là dịch vụ cơ sở dữ liệu

SQL Server Service. Máy chủ lắng nghe các yêu cầu kết nối đến từ các máy khách và đáp ứng các

yêu cầu này. Các ứng dụng phía máy khách kết nối vào các dịch vụ cơ sở dữ liệu có thể là những

phần mềm quản lý được viết bởi các ngôn ngữ lập trình có sử dụng các thư viện đối tượng truy xuất

CSDL như ADO, ADO.Net, RDO, ODBC, JDBC,... hoặc có thể là chính các công cụ của SQL

Server như: Service Manager, Enterprise Manager hay Query Analyzer.

Trong môi trường SQL Server, các yêu cầu từ phía máy khách sẽ nằm dưới dạng các lệnh T-SQL.

SQL Server sẽ xử lý các lệnh này rồi trả về một resultset cho ứng dụng client với những thông tin

được yêu cầu hoặc chỉ xác nhận là công việc được hoàn thành mỹ mãn. Nhiều ứng dụng client hoặc

người sử dụng có thể song hành đưa ra cùng lúc những yêu cầu và SQL Server có thể xử lý chúng

song song. Một ứng dụng client có thể cung cấp một "cấp độ thoải mái" khác nhau cho người sử

dụng. Các công cụ đơn giản nhất (nhưng không dễ dùng) cho phép người sử dụng đưa vào một yêu

cầu dưới dạng lệnh T-SQL rồi nhận được những resultset dưới dạng văn bản hoặc table. Còn các

công cụ tinh vi hơn sẽ cho ra những biểu mẫu, báo cáo, biểu đồ,... cũng như các đối tượng màn hình

thân thiện hơn.

Cũng như đã trình bày ở trên, để thiết lập kết nối vật lý với một server CSDL và chuyển những yêu

cầu cũng như nhận về kết quả (resultset), các ứng dụng phía client có thể sử dụng nhiều đối tượng

hoặc các thư viện truy xuất cơ sở dữ liệu khác nhau.(data access objects hoặc data access API).

Những đối tượng truy xuất cơ sở dữ liệu thông dụng hiện nay bao gồm:

o ADO (ActiveX Database Object)

o RDO (Remote Database Object)

o DB - Library

o ODBC (Open Database Connectivity)

12

Page 13: Bai giang he qtdl

o OLE DB (Object Linking and Embbeding Database)

o DAO (Data Access Object)

Các nhà phát triển ứng dụng dùng các đối tượng kể trên hoặc các hàm API để truy cập các đối

tượng cơ sở dữ liệu và dữ liệu được lưu trữ trong các đối tượng này để triển khai những ứng dụng

trong các ngôn ngữ lập trình chẳng hạn VB, C/C++, Java, VB.Net, C#,...

1.1.3.4. Mô hình Client/Server cục bộ

Nếu trình ứng dụng truy xuất CSDL và hệ quản trị CSDL SQL Server được cài đặt trên cùng một

máy tính vật lý thì ta có mô hình Client/Server cục bộ. Lúc này, vai trò của SQL Server không

khác với các hệ quản trị CSDL truyền thống như Foxpro hay MS Access. SQL Server che dấu sự

khác biệt giữa kết nối cục bộ và kết nối qua mạng. Người dùng không nhận thấy sự khác biệt ngoài

việc tốc độ truyền thông trên mạng chậm hơn tốc độ truyền thông cục bộ.

Hình 9: Mô hình Client/Server cục bộ1. 1.3 . 5 . SQL Server và mô hình cơ sở dữ liệu phân tán

Cơ sở dữ liệu phân tán là tập hợp các dữ liệu thuộc về cùng một hệ thống, có liên quan logic với

nhau và được trải ra trên hệ thống mạng. Hệ quản trị cơ sở dữ liệu phân tán là tập các phần mềm

quản trị một cơ sở dữ liệu phân tán, làm cho việc phân tán trở nên trong suốt với người dùng. Khái

niệm trong suốt ở đây được hiểu là chủ đích che dấu sự phân tán đối với người sử dụng, làm cho

người sử dụng sử dụng cơ sở dữ liệu phân tán như là cơ sở dữ liệu tập trung.

SQL Server là hệ quản trị cơ sở dữ liệu hỗ trợ cơ sở dữ liệu phân tán. Nó cho phép tạo ra các view

từ các bảng dữ liệu trên các Server khác nhau được kết nối (linked server), thực thi các truy vấn hay

chuyển tác phân tán trải dài trên nhiều Server,...

13

Page 14: Bai giang he qtdl

Hình 10: Mô hình cơ sở dữ liệu phân tán1. 1 . 3 . 6. Kiến trúc đa tầng

Hình 11: Mô hình phân lớp hệ thống

SQL Server là hệ quản trị cơ sở dữ liệu hoạt động trên môi trường mạng theo mô hình client/server,

cho nên khi nên khi phát triển các ứng dụng cơ sở dữ liệu người ta có thể sử dụng các kiến trúc

phân lớp (phân chia hệ thống thành các components hay layer), các lớp có thể được thực thi một

phần ở server, một phần ở client (kiến trúc nhị tầng) và có thể trên một số trạm trung gian nữa nếu

cần thiết (kiến trúc tam tầng).

A. Kiến trúc nhị tầng Fat Client

Đây là kiểu kiến trúc client/server phổ biến. Phía client của một hệ thống như thế sẽ bao gồm các

lớp:

14

Page 15: Bai giang he qtdl

o User interface: lớp giao diện người sử dụng.

o Presentation service: lớp dịch vụ trình bày.

o Business services: lớp thi công các quy tắc nghiệp vụ của hệ thống.

o Data services: lớp truy cập và xử lý dữ liệu.

Hình 12: Kiến trúc nhị tầng Fat Client

Trong khi đó, Data Storage (lớp lưu trữ và quản lý dữ liệu), thường là hệ thống cơ sở dữ liệu

(database system), sẽ được đặt tại server. Vì Business services và Data services được thực thi hoàn

toàn ở phía client, còn phía server chỉ thực thi các chức năng lưu trữ và quản trị dữ liệu nên sức

nặng của hệ thống dồn về phía client. Người ta gọi kiến trúc phân tâng như vậy là Fat Client (Client

"béo": chức năng xử lý dồn về phía client) (xem hình 12).

B. Kiến trúc nhị tầng Fat Server

Ngoài kiểu thực thi hệ thống như trên, người ta có thể cho thực thi toàn bộ Data Services và một

phần Business services ở phía server, ví dụ dưới dạng các thủ tục thường trú (stored procedure).

Loại kiến trúc như thế thường được gọi là Fat Server. Kiến trúc này giúp san sẻ một phần sức nặng

xử lý từ client lên server để giảm tải cho client, tận dụng hiệu năng xử lý phía server.

15

Page 16: Bai giang he qtdl

Hình 13: Kiến trúc nhị tầng Fat ServerC. Kiến trúc tam tầng

Để cải tiến xa hơn hệ thống, ta có thể sử dụng kiến trúc tam tầng, theo đấy các lớp Data services,

Business services và Presentation services sẽ nằm trên những tầng khác nhau một cách chặt chẽ.

Người ta bổ sung thêm một tầng trung gian (middleware component), Business services sẽ được

thực thi trên tầng trung gian này. Biện pháp này giúp giảm tải cho cả server và client, tăng hiệu

năng xử lý của hệ thống. Trong mô hình thực tế, tầng trung gian có thể bao gồm một số các máy

tính chuyên dụng để chạy các dịch vụ Business Services (xem hình 14)

Hình 14: Kiến trúc tam tầng

16

Page 17: Bai giang he qtdl

1.2. Các thành phần cơ bản trong Microsoft SQL Server1.2.1. Cài đặt và cấu hình SQL ServerBước 1:

Khi cửa sổ cài đặt xuất hiện ta thấy có các mục để lựa chọn:

• Install Database Server tức là cài đặt các thành phần cơ bản và quan trọng nhất của hệ quản

trị CSDL SQL Server bao gồm các dịch vụ chạy trên server, các công cụ quản lý như

Services Manager, Enterprise Manager, Query Analyzer,...

• Install Analysis Services là cài đặt các dịch vụ phân tích phục vụ cho khai phá dữ liệu (data

mining).

• Install English Query là cài đặt công cụ cho phép thực thi các truy vấn bằng cách sử dụng

ngôn ngữ tự nhiên (tiếng Anh) thay vì sử dụng ngôn ngữ SQL.

Ta chọn Install Database Server để cài đặt các thành phần của hệ quản trị. Các lựa chọn cài đặt

Install Analysis Services và Install English Query trước mắt chưa cần quan tâm đến, khi nào cần

dùng đến chúng ta sẽ cài đặt bổ sung.

Bước 2:

Cửa sổ Computer Name xuất hiện. Tại đây cho phép ta điền vào tên máy tính mà ta muốn cài đặt

SQL Server. Nếu ta chọn cài đặt trên Local Computer thì tên máy tính hiện hành sẽ tự động được

điền vào. Nếu ta chọn Remote Computer tức là cài đặt SQL Server lên máy tính khác (có kết nối

mạng với máy tính hiện hành) thì ta phải chỉ rõ tên máy đó.

Trong trường hợp của ta, chọn Local Computer và nhấn Next để cài lên máy tính hiện hành.

17

Page 18: Bai giang he qtdl

Bước 3:

Cửa sổ Installation Selection xuất hiện cho phép ta lựa chọn chế độ cài đặt:

• Create a new instance of SQL Server, or install Client Tools: Chọn mục này nếu ta muốn

cài mới hoàn toàn một phiên bản (hay còn gọi là "thể hiện" - instance) của SQL Server hoặc

muốn cài đặt các công cụ phía Client cho phép truy xuất, quản lý Server.

• Upgrade, remove or add components to an existing instance of SQL Server: Chọn mục

này nếu ta muốn nâng cấp, thêm bớt một số components của một phiên bản SQL Server đã

được cài đặt trước đó trên máy tính.

• Advanced options: Một số tùy chọn cài đặt nâng cao, với các tùy chọn cài đặt ở mức hết

sức chi tiết dành cho những người dùng có kinh nghiệm.

Trong trường hợp của ta, chọn mục đầu tiên: Create a new instance of SQL Server, or install

Client Tools và nhấn Next để sang bước tiếp theo.

18

Page 19: Bai giang he qtdl

Bước 4:

Cửa sổ User Information xuất hiện yêu cầu ta nhập các thông tin cơ bản về người dùng và công ty

sử dụng sản phầm SQL Server.

Bước 5:

Hộp thoại Software License Agreement xuất hiện, yêu cầu ta chấp nhận các điều khoản về License.

Nhấn Next để tiếp tục.

19

Page 20: Bai giang he qtdl

Bước 6:

Hộp thoại Installation Definition xuất hiện cho phép ta chỉ định các thành phần cài đặt với các tùy

chọn:

• Client Tools Only: Chỉ cài đặt các công cụ truy xuất và quản trị phía Client chứ không cài

đặt các thành phần dịch vụ của Database Server lên máy tính hiện hành. Tùy chọn này dùng

khi ta đã đặt Server dữ liệu trên một máy khác và giờ ta muốn ngồi ở máy hiện hành để truy

xuất, điều khiển, cấu hình Server dữ liệu từ xa.

• Server and Client Tools: Cài đặt tất cả các thành phần bao gồm Database Server, các công

cụ phía Server và Client lên máy tính hiện hành.

• Conectivity Only: Chỉ cài đặt các thư viện kết nối để hỗ trợ các ứng dụng trên máy Client

có thể kết nối với SQL Server.

Trong trường hợp của ta, chọn mục Server and Client Tools và nhấn Next để tiếp tục.

20

Page 21: Bai giang he qtdl

Bước 7:

Cửa sổ Setup Type xuất hiện cho ta lựa chọn một số thông số cài đặt. Có mấy tùy chọn sau:

• Typical: Cài đặt với các tùy chọn thông dụng nhất.

• Minimum: Cài đặt với các tùy chọn tối thiểu (yêu cầu cấu hình thấp nhất).

• Custom: Cho phép người dùng tự mình lựa chọn và loại bỏ những thành phần có thể được

cài đặt.

Trong trường hợp của ta, chọn mục Typical. Ở phần Destination Folder gồm hai mục:

• Program Files: Cho phép chỉ định nơi cài đặt SQL Server

• Data Files: Chỉ định nơi lưu trữ mặc định các tệp tin cơ sở dữ liệu của SQL Server.

Sau khi đã thiết lập xong các thông số, nhấn Next để tiếp tục.

Bước 8:

21

Page 22: Bai giang he qtdl

Hộp thoại Services Account xuất hiện yêu cầu ta thiết lập một số thông số ban đầu liên quan tới

tài khoản người dùng dùng để đăng nhập vào SQL Server. Có hai tùy chọn cơ bản:

• Use the same account for each service. Auto start SQL Server Service: Dùng chung một

account cho tất cả các dịch vụ của SQL Server. Dịch vụ SQL Server Service sẽ tự động

được khởi động nếu cần thiết.

• Customize the setting for each service: Thay vì dùng chung, mỗi dịch vụ sẽ có tùy chọn

riêng. Lựa chọn này có tính bảo mật cao nhưng khá phiền phức.

Trong trường hợp của ta, chọn mục Use the same account for each service. Auto start SQL

Server Service.

Ở phần Service Setting có hai tùy chọn:

• Use the Local System account: Sử dụng tài khoản hệ thống trên máy tính hiện hành làm tài

khoản đăng nhập vào SQL Server.

• User a Domain User Account: Sử dụng tài khoản Domain User để đăng nhập vào SQL

Server nếu máy tính hiện hành đang làm việc trong môi trường Domain của Windows

Server 2000/2003.

Trong trường hợp của ta, chọn mục Use the Local System account. Nhấn Next để tiếp tục

Bước 9:

Hộp thoại Authentication Mode xuất hiện cho phép chúng ta thiết lập chế độ xác thực người

dùng của SQL Server. Có hai lựa chọn:

• Windows Authentication Mode: Xác thực dựa trên account của Windows. Chỉ những

người dùng có account đăng nhập của hệ điều hành Windows (những account Windows này

phải được đăng ký trước với SQL Server) thì mới có thể đăng nhập vào hệ thống SQL

Server.

22

Page 23: Bai giang he qtdl

• Mixed Mode: Chế độ xác thực hỗn hợp. Chế độ này cho phép cả những người dùng có

account của Windows và những người dùng có account riêng của SQL Server đều có thể

đăng nhập hệ thống. Trong trường hợp này, tài khoản sa - tài khoản quản trị hệ thống mặc

định của SQL Server trở nên có hiệu lực, SQL Server gợi ý người dùng nên nhập password

cho account này để đảm bảo tính bảo mật cho hệ thống.

Trong trường hợp của ta, chọn chế độ Mixed Mode, account của sa để trống sau đó nhấn Next để

tiếp tục cài đăt.

Các bước tiếp theo không có gì đặc biệt. Cứ nhấn Next để tiếp tục quá trình cài đặt. Việc cài đặt

diễn ra nhanh hay chậm tùy thuộc vào từng máy tính. Quá trình cài đặt xong xuôi, nhấn Finish để

kết thúc.

1.3. Ngôn ngữ truy vấn dữ liệu có cấu trúc (SQL)

SQL, viết tắt của Structured Query Language (ngôn ngữ hỏi có cấu trúc), là công cụ sử dụng để tổ

chức, quản lý và truy xuất dữ liệu đuợc lưu trữ trong các cơ sở dữ liệu. SQL là một hệ thống ngôn

ngữ bao gồm tập các câu lệnh sử dụng để tương tác với cơ sở dữ liệu quan hệ.

Tên gọi ngôn ngữ hỏi có cấu trúc phần nào làm chúng ta liên tưởng đến một công cụ (ngôn ngữ)

dùng để truy xuất dữ liệu trong các cơ sở dữ liệu. Thực sự mà nói, khả năng của SQL vượt xa so với

một công cụ truy xuất dữ liệu, mặc dù đây là mục đích ban đầu khi SQL được xây dựng nên và truy

xuất dữ liệu vẫn còn là một trong những chức năng quan trọng của nó. SQL được sử dụng để điều

khiển tất cả các chức năng mà một hệ quản trị cơ sở dữ liệu cung cấp cho người dùng bao gồm:

1 • Định nghĩa dữ liệu: SQL cung cấp khả năng định nghĩa các cơ sở dữ liệu, các cấu trúc

lưu trữ và tổ chức dữ liệu cũng như mối quan hệ giữa các thành phần dữ liệu.

2 • Truy xuất và thao tác dữ liệu: Với SQL, người dùng có thể dễ dàng thực hiện các

thao tác truy xuất, bổ sung, cập nhật và loại bỏ dữ liệu trong các cơ sở dữ liệu.

23

Page 24: Bai giang he qtdl

3 • Điều khiển truy cập: SQL có thể được sử dụng để cấp phát và kiểm soát các thao

tác của người sử dụng trên dữ liệu, đảm bảo sự an toàn cho cơ sở dữ liệu 1 Đảm bảo toàn vẹn dữ liệu: SQL định nghĩa các ràng buộc toàn vẹn trong cơ sở dữ liệu

nhờ đó đảm bảo tính hợp lệ và chính xác của dữ liệu trước các thao tác cập nhật cũng

như các lỗi của hệ thống.

Như vậy, có thể nói rằng SQL là một ngôn ngữ hoàn thiện được sử dụng trong các hệ thống cơ

sở dữ liệu và là một thành phần không thể thiếu trong các hệ quản trị cơ sở dữ liệu. Mặc dù SQL

không phải là một ngôn ngữ lập trình như C, C++, Java,... song các câu lệnh mà SQL cung cấp có

thể được nhúng vào trong các ngôn ngữ lập trình nhằm xây dựng các ứng dụng tương tác với cơ sở

dữ liệu.

Khác với các ngôn ngữ lập trình quen thuộc như C, C++, Java,... SQL là ngôn ngữ có tính khai

báo. Với SQL, người dùng chỉ cần mô tả các yêu cầu cần phải thực hiện trên cơ sở dữ liệu mà

không cần phải chỉ ra cách thức thực hiện các yêu cầu như thế nào. Chính vì vậy, SQL là ngôn ngữ

dễ tiếp cận và dễ sử dụng. Trong hầu hết các hệ quản trị cơ sở dữ liệu quan hệ, SQL có những vai trò như sau:

1 • SQL là ngôn ngữ hỏi có tính tương tác: Người sử dụng có thể dễ dàng thông qua các

trình tiện ích để gởi các yêu cầu dưới dạng các câu lệnh SQL đến cơ sở dữ liệu và nhận

kết quả trả về từ cơ sở dữ liệu

2 • SQL là ngôn ngữ lập trình cơ sở dữ liệu: Các lập trình viên có thể nhúng các câu lệnh

SQL vào trong các ngôn ngữ lập trình để xây dựng nên các chương trình ứng dụng giao

tiếp với cơ sở dữ liệu

3 • SQL là ngôn ngữ quản trị cơ sở dữ liệu: Thông qua SQL, người quản trị cơ sở dữ

liệu có thể quản lý được cơ sở dữ liệu, định nghĩa các cấu trúc lưu trữ dữ liệu, điều khiển

truy cập cơ sở dữ liệu,...

4 • SQL là ngôn ngữ cho các hệ thống khách/chủ (client/server): Trong các hệ thống cơ

sở dữ liệu khách/chủ, SQL được sử dụng như là công cụ để giao tiếp giữa các trình ứng

dụng phía máy khách với máy chủ cơ sở dữ liệu.

5 • SQL là ngôn ngữ truy cập dữ liệu trên Internet: Cho đến nay, hầu hết các máy chủ

Web cũng như các máy chủ trên Internet sử dụng SQL với vai trò là ngôn ngữ để tương

tác với dữ liệu trong các cơ sở dữ liệu.

6 • SQL là ngôn ngữ cơ sở dữ liệu phân tán: Đối với các hệ quản trị cơ sở dữ liệu phân

tán, mỗi một hệ thống sử dụng SQL để giao tiếp với các hệ thống khác trên mạng, gởi và

nhận các yêu cầu truy xuất dữ liệu với nhau.

Bài tậpCâu 1: Trình bày khái niệm về cơ sở dữ liệu quan hệ. Cơ sở dữ liệu quan hệ có những điểm khác

biệt gì so với hệ thống xử lý file truyền thống?

24

Page 25: Bai giang he qtdl

Câu 2: Trình bày khái niệm về hệ quản trị cơ sở dữ liệu quan hệ.

Câu 3: Trình bày về mô hình Client/Server và kiến trúc phân tầng.

Câu 4: Nêu các thành phần cơ bản của hệ quản trị CSDL SQL Server.

Câu 3: Trình bày những đặc điểm cơ bản của ngôn ngữ vấn tin SQL.

25

Page 26: Bai giang he qtdl

Chương 2. Tạo và quản lý cơ sở dữ liệu

2.1. Các tệp tin cơ sở dữ liệu (Database files)Trong SQL Server, một user database có thể bao gồm hai hay nhiều tập tin (mặc định là 2). Các

tập tin trong một database có thể chia làm 3 loại:

• Primary Data File: Mỗi database phải có ít nhất một tập tin Primary data file với phần mở

rộng là .MDF. Tập tin này ngoài nhiệm vụ cất trữ dữ liệu thuần túy còn nhiệm vụ lưu trữ

thông tin liên quan đến cấu trúc và đặc điểm của chính database đó (lưu trong các system

tables). Ta tuyệt đối không nên can thiệp vào các system tables này vì việc này có thể phá

hỏng database.

• Secondary Data File: Mỗi database có thể không có hoặc có nhiều Secondary Data File.

Các tập tin này chỉ thuần túy lưu trữ dữ liệu và có phần mở rộng là .NDF.

• Log File: Mỗi database phải có ít nhất một transaction log file (có phần mở rộng là .LDF).

Log file làm nhiệm vụ lưu trữ thông tin liên quan các giao dịch (transaction) thực hiện trên

database đó. Thông tin này một phần phục vụ cho thao tác Roll Back khi có lỗi giao dịch

xảy ra.

Mỗi tập tin trong CSDL (.MDF,.NDF,.LDF) đêu có 5 thuộc tính:

• NAME: Tên logic của tập tin.

• FILENAME: Đường dẫn đầy đủ (tên vật lý).

• SIZE: Kích thước ban đầu của tập tin (KB, MB, GB, TB).

• MAXSIZE: Kích thước tối đa cho phép của tập tin (KB, MB, GB,TB).

• FILEGROWTH : Tốc độ gia tăng kích thước của tập tin (KB, MB, GB, TB,%).

Các tập tin CSDL được tổ chức thành các nhóm gọi là file group theo nguyên tắc:

• Một CSDL có thể có một hay nhiều file group. Trong đó bắt buộc phải có một file group

chính gọi là PRIMARY.

• Mỗi file group có thể chứa một hay nhiều tập tin dữ liệu (.MDF, .NDF). Trong đó phải có ít

nhát 1 tập tin Primary Data File (.MDF) nằm trong group chính PRIMARY.

• Các tập tin Log không thuộc về một file group nào cả.

2.2. Tạo cơ sở dữ liệu (Database)2.2.1. Sử dụng lệnh CREATE DATABASE

CREATE DATABASE <tên CSDL>

26

Page 27: Bai giang he qtdl

[ ON

PRIMARY

<Khai báo tập tin .MDF>,

[<Khai báo tập tin .NDF>,]

. . . ]

[ FILEGROUP <tên file group>

<Khai báo tập tin .NDF>,

[<Khai báo tập tin .NDF>,]

. . . ]

. . .

[LOG ON

<Khai báo tập tin .LDF>,

[<Khai báo tập tin .LDF>,]

. . . ]

[COLLATE <tên collation>]

[FOR ATTACH]

Cú pháp đơn giản hay được sử dụng hơn cả là:

CREATE DATABASE <tên CSDL>

ON

PRIMARY

<Khai báo tập tin .MDF>

LOG ON

<Khai báo tập tin .LDF>

Hoặc thậm chí đơn giản hơn nữa

CREATE DATABASE <tên CSDL>

Trong đó phần khai báo tập tin được bao bởi cặp ngoặc đơn “(…)” và gồm các thành phần:

( [NAME = <tên logic của tập tin>,]

FILENAME = <tên vật lý (đường dẫn)>,

[SIZE = <kích thước ban đầu>,]

[MAXSIZE = <kích thước lớn nhất có thể> | UNLIMITED],

[FILEGROWTH = <Tỷ lệ gia tăng kích thước>])

Chú ý:

Khi không chỉ rõ kích thước ban đầu (SIZE) của tập tin thì:

• Đối với tập tin .MDF, SQL Server sẽ lấy kích thước của tập tin .MDF trong Model

Database.

• Đối với các tập tin .NDF, .LDF, SQL Server tự khởi tạo giá trị mặc định là 1MB.

27

Page 28: Bai giang he qtdl

• Đơn vị mặc định của SIZE và MAXSIZE là MB.

2.1.2. Sử dụng Enterprise Manager để tạo CSDL

28

Page 29: Bai giang he qtdl

29

Page 30: Bai giang he qtdl

30

Page 31: Bai giang he qtdl

2.3. Quản lý cơ sở dữ liệu2.3.1. Sử dụng lệnh ALTER DATABSEALTER DATABASE <tên CSDL>

[ ADD FILE <Khai báo tập tin .MDF,.NDF> [, . . .] [ TO FILEGROUP <Tên File Group>] ]

[ADD LOG FILE <Khai báo tập tin .LDF> [, . . .]]

[ADD FILEGROUP <Tên File Group>]

[REMOVE FILE <Tên logic của tập tin>]

[REMOVE FILEGROUP <Tên File Group>]

[MODIFY NAME = <Tên mới cho Database>]

[MODIFY FILE <Khai báo tập tin>]

[MODIFY FILEGROUP <Tên File Group> <Thuộc tính File Group>|NAME = <Tên mới>]

[COLLATE <Tên collation>]

Trong đó phần khai báo tập tin được bao bởi cặp ngoặc đơn “(…)” và gồm các thành phần:

( NAME = <tên logic của tập tin>,

[NEWNAME = <tên logic mới cho tập tin>,]

[FILENAME = <tên vật lý (đường dẫn)>],

[SIZE = <kích thước ban đầu>,]

[MAXSIZE = <kích thước lớn nhất có thể> | UNLIMITED],

[FILEGROWTH = <Tỷ lệ gia tăng kích thước>])

Chú ý: Riêng NEWNAME chỉ dùng khi MODIFY FILE

<Thuộc tính File Group> bao gồm:

• READONLY: Khi một file group bị đánh dấu READONLY thì mọi thao tác cập nhật dữ

liệu trên các tập tin thuộc file group này đều không thể thực hiện được. Không được phép áp

dụng thuộc tính này cho Primary Group.

• READWRITE: Ngược lại với READONLY

• DEFAULT: Đánh dấu file group như là file group mặc định của database hiện thời.

31

Page 32: Bai giang he qtdl

2.3.2. Sửa đổi cơ sở dữ liệu bằng Enterprise Manager32

Page 33: Bai giang he qtdl

2.4. Xóa cơ sở dữ liệu2.4.1. Sử dụng lệnh DROP DATABASE trên Query Analyzer

DROP DATABASE <tên CSDL>

2.4.2. Xóa CSDL sử dụng Enterprise Manager

2.5. Các system database đặc biệt Ngay sau khi SQL Server mới được cài đặt xong, có 6 database tự động được cung cấp. Người ta

gọi những database này là các system database để phân biệt với các database do người dùng tự tạo

ra sau này (user database). Các system database bao gồm:

• Model database

• Master database

• Msdb database

33

Page 34: Bai giang he qtdl

• Tempdb database

• Pubs database

• Northwind database

A. Master database

Bao gồm tất cả các system table lưu trữ dữ liệu theo dõi việc cài đặt Server về mặt tổng thể cũng

như theo dõi tất cả các user database được tạo ra về sau. Cụ thể hơn, Master database có chứa

những system catalog lưu trữ thông tin liên quan đến:

• Khoảng trống đĩa (space disk).

• Cấp phát tập tin.

• Cài đặt để cấu hình toàn hệ thống.

• Tài khoản đăng nhập.

• Sự hiện hữu của các database khác.

• Sự hiện hữu của các SQL Server khác (trong các giao dịch phân tán).

Mỗi khi tạo một database mới, thay đổi cấu hình, tài khoản đăng nhập,… tất cả thông tin đều

được cập nhật vào Master database.

B.Model database

Đóng vai trò như một khuôn mẫu (template). Mỗi lần người dùng tạo mới một user database thì

SQL Server sẽ dùng Model database làm “khuôn mẫu” cho việc tạo mới user database. Mỗi user

database lúc mới tạo sẽ kế thừa các thuộc tính và có cấu trúc giống như Model database. Nếu ta

muốn mỗi user database lúc mới tạo ra đã có sẵn một số đặc điểm nào đấy, ta có thể thiết lập các

đặc điểm đó trên Model database. Các user database được tạo ra sau này sẽ tự động được kế thừa

các đặc điểm đó.

C. Tempdb database

Là một database để lưu trữ dữ liệu tạm thời (tempotary). Nó được dùng để lưu trữ:

• Những dữ liệu tam thời (bảng tạm) do người dùng tạo ra

• Những kết quả trung gian phục vụ cho quá trình xử lý của nội bộ SQL Server: xử lý các câu

truy vấn (Query), sắp xếp (Sorting),…

Mặc định mỗi khi SQL Server được khởi động thì Tempdb database được tái tạo lại, mới hoàn toàn,

mọi dữ liệu (bảng tạm) do người dùng lưu trữ lên Tempdb database trước đó sẽ biến mất

D. Msdb Database

Là một database phục vụ cho hoạt động SQL Server Agent service. Nó lưu trữ thông tin liên

quan đến việc hoạch định tác vụ (Task Shedule) cho các hoạt động như: backup dữ liệu, tạo thứ bản

(replication),…

E. Pubs database và Northwind database

34

Page 35: Bai giang he qtdl

Đây là hai CSDL được dùng làm thí dụ mẫu trong SQL Server book và các tài liệu hướng dẫn

về SQL Server.

Chú ý

• Tuyệt đối không được tự ý xóa hay can thiệp trực tiếp vào các cơ sở dữ liệu Master và

Msdb. Việc này có thể làm ảnh hưởng nghiêm trọng đến hoạt động của Server.

• Không nên tự ý sửa đổi CSDL dữ liệu Model nếu không có lý do chính đáng.

• Các CSDL Northwind và Pubs có thể xóa được nhưng không nên làm thế vì chúng là những

ví dụ hay về CSDL rất nên tham khảo.

Bài tập:Câu 1: Trình bày về tổ chức tập tin trong cơ sở dữ liệu SQL Server. Phân loại tập tin trong SQL

Server. Cách khai báo đặc tả tập tin trong SQL Server (5 thuộc tính).

Câu 2: Nêu chức năng các cơ sở dữ liệu hệ thống trong SQL Server.

Câu 3: Trình bày cú pháp đầy đủ của lệnh CREATE DATABASE và giải thích ý nghĩa các tham số.

35

Page 36: Bai giang he qtdl

Chương 3. Tạo và quản lý các bảng

3.1. Tạo bảng (Tables)3.1.1. Sử dụng lệnh CREATE TABLE

CREATE TABLE <Tên bảng dữ liệu>

(

<Cột 1> <Kiểu dữ liệu> [<Thuộc tính nếu có>],

<Cột 2> <Kiểu dữ liệu> [<Thuộc tính nếu có>],

. . .

<Cột n> <Kiểu dữ liệu> [<Thuộc tính nếu có>],

[Các ràng buộc nếu có]

)

[ON <Tên file group> | DEFAULT]

3.1.2. Sử dụng Enterprise Manager• Vào mục Tables trong CSDL muốn tạo

• Chọn New Table

36

Page 37: Bai giang he qtdl

3.2. Định nghĩa các cột (Columns)A. Thuộc tính NULL và NOT NULL

Thuộc tính NULL

o Khi một cột được xác lập thuộc tính là NULL giá trị tại cột đó được phép để trống (mang

giá trị null)

o Thuộc tính NULL là thuộc tính mặc định. Khi một cột không có khai báo gì thêm thì mặc

định thuộc tính của cột đó NULL.

37

Page 38: Bai giang he qtdl

Thuộc tính NOT NULL

Khi một cột được xác lập thuộc tính là NOT NULL thì giá trị tại cột đó không được phép để trống.

Khai báo: <Tên cột> <Kiểu dữ liệu> NULL | NOT NULL

B. Thuộc tính IDENTITY

o Thuộc tính này cho phép ta chỉ định một cột kiểu số nguyên như là một cột định danh

(Identity Comlumn) của table (gần giống như cột STT trong các bảng dữ liệu trên giấy).

o Ta không phải nhập dữ liệu cho cột này mà các giá trị trên cột được tự đông phát sinh bắt

đầu từ một giá trị khởi tạo và tăng dần theo một công sai nào đó được chỉ định, đồng thời

đảm bảo tính duy nhất một cách tuyệt đối (không có hai giá trị nào trùng nhau).

o Mục đích: có thể dùng cho việc tạo khóa tự động

Khai báo: <Tên cột> <Kiểu dữ liệu> … Identity(seed, increment)

Với: seed: giá trị khởi tạo, increment: mức tăng

Ví dụ: Khai báo cột STT tăng tự động từ 1

STT bigint Identity(1,1) NOT NULL

C. Thuộc tính ROWGUICOL

o Thuộc tính này cho phép ta chỉ định một cột kiểu UniqueIdentifier như là cột mã định danh

quốc tế duy nhất gọi là GUID (Gloabal Unique Identifier)

o Tương tự như Identity, ROWGUICOL có thể dùng để tạo khóa tự động bằng cách sử dụng

hàm hệ thống NEWID() như là giá trị mặc định cho cột.

Khai báo:

<Tên cột> UniqueIdentifier ROWGUICOL NOT NULL DEFAULT NEWID()

3.3. Định nghĩa các ràng buộc (Constrains)A. Ràng buộc khóa chính PRIMARY KEY

Khi muốn chỉ định một cột làm khóa chính, ta sử dụng ràng buộc PRIMARY KEY trên cột đó theo

cú pháp:

Constraint <Tên ràng buộc> Primary Key(<Tên cột>)

B. Ràng buộc khóa ngoại FOREIGN KEY

Khi muốn chỉ định một cột làm khóa ngoại tham chiếu đến bảng cha, ta sử dụng ràng buộc

FOREIGN KEY theo cú pháp:

Constraint <Tên ràng buộc> Foreign Key(<Tên cột>)

References <Tên bảng cha>(<Khóa chính>)

C. Ràng buộc kiểm tra CHECK

Khi muốn dữ liệu nhập vào phải thỏa mãn một biểu thức điều kiện nào đó ta có thể sử dụng ràng

buộc kiểm tra CHECK với cú pháp

Constraint <Tên ràng buộc> CHECK(<Biểu thức điều kiện>)

38

Page 39: Bai giang he qtdl

D. Ràng buộc mặc định DEFAULT

Khi muốn khởi tạo giá trị mặc định cho một cột nào đó của bảng, ta khai báo ràng buộc DEFAULT

ngay bên cạnh khai báo cột

<Tên cột> <Kiểu dữ liệu> … DEFAULT <Giá trị mặc định>

3.4. Sửa bảng3.4.1. Dùng lệnh ALTER TABLEALTER TABLE <Tên bảng>

[ADD <Tên cột> <Kiểu dữ liệu> [<Thuộc tính nếu có>],…]

[ADD <Định nghĩa ràng buộc>,…]

[ALTER COLUMN <Tên cột>

[<Tên kiểu dữ liệu mới>] [NULL | NOT NULL]

[ADD | DROP ROWGUIDCOL]

[DROP COLUMN <Tên cột>,…]

[DROP CONSTRAINT <Tên ràng buộc> ,…]

[NOCHECK | CHECK CONSTRAINT <Tên ràng buộc>]

Chú ý:

NOCHECK dùng để tạm thời vô hiệu hóa một ràng buộc chứ không xóa bỏ nó khỏi CSDL.

3.4.2. Sửa đổi bảng dữ liệu sử dụng Enterprise Manager• Click chuột phải lên bảng muốn sửa đổi.

• Chọn Design Table

39

Page 40: Bai giang he qtdl

3.5. Xóa bảng (DROP TABLE)3.5.1. Sử dụng lệnh DROP TABLE

DROP TABLE <Tên bảng dữ liệu>

3.5.2. Sử dụng Enterprise Manager

3.6. Thêm bản ghi mới (INSERT)Dữ liệu trong các bảng được thể hiện dưới dạng các dòng (bản ghi). Để bổ sung thêm các dòng dữ

liệu vào một bảng, ta sử dụng câu lệnh INSERT. Hầu hết các hệ quản trị CSDL dựa trên SQL cung

cấp các cách dưới đây để thực hiện thao tác bổ sung dữ liệu cho bảng:

40

Page 41: Bai giang he qtdl

1 • Bổ sung từng dòng dữ liệu với mỗi câu lệnh INSERT. Đây là các sử dụng thường

gặp nhất trong giao tác SQL.

2 • Bổ sung nhiều dòng dữ liệu bằng cách truy xuất dữ liệu từ các bảng dữ liệu khác.

Bổ sung từng dòng dữ liệu với lệnh INSERT

Để bổ sung một dòng dữ liệu mới vào bảng, ta sử dụng câu lệnh INSERT với cú pháp như sau:

INSERT INTO tên_bảng[(danh_sách_cột)]

VALUES(danh_sách_trị)

Trong câu lệnh INSERT, danh sách cột ngay sau tên bảng không cần thiết phải chỉ định nếu giá trị

các trường của bản ghi mới được chỉ định đầy đủ trong danh sách trị. Trong trường hợp này, thứ tự

các giá trị trong danh sách trị phải bằng với số lượng các trường của bảng cần bổ sung dữ liệu cũng

như phải tuân theo đúng thứ tự của các trường như khi bảng được định nghĩa.

Ví dụ: Câu lệnh dưới đây bổ sung thêm một dòng dữ liệu vào bảng KHOA

INSERT INTO khoa

VALUES(‘DHT10’,’Khoa Luật’,’054821135’)

Trong trường hợp chỉ nhập giá trị cho một số cột trong bảng, ta phải chỉ định danh sách các

cột cần nhập dữ liệu ngay sau tên bảng. Khi đó, các cột không được nhập dữ liệu sẽ nhận giá trị mặc

định (nếu có) hoặc nhận giá trị NULL (nếu cột cho phép chấp nhận giá trị NULL). Nếu một cột

không có giá trị mặc định và không chấp nhận giá trị NULL mà không đuợc nhập dữ liệu, câu lệnh

sẽ bị lỗi.

Ví dụ: Câu lệnh dưới đây bổ sung một bản ghi mới cho bảng SINHVIEN

INSERT INTO sinhvien(masv,hodem,ten,gioitinh,malop)

VALUES(‘0241020008’,‘Nguyễn Công’,’Chính’,1,’C24102’)

câu lệnh trên còn có thể được viết như sau:

INSERT INTO sinhvien

VALUES(‘0241020008’,‘Nguyễn Công’,’Chính’,

NULL,1,NULL,’C24102’)

Bổ sung nhiều dòng dữ liệu từ bảng khác

Một cách sử dụng khác của câu lệnh INSERT được sử dụng để bổ sung nhiều dòng dữ liệu

vào một bảng, các dòng dữ liệu này được lấy từ một bảng khác thông qua câu lệnh SELECT. Ở

cách này, các giá trị dữ liệu được bổ sung vào bảng không được chỉ định tường minh mà thay vào

đó là một câu lệnh SELECT truy vấn dữ liệu từ bảng khác.

Cú pháp câu lệnh INSERT có dạng như sau:

INSERT INTO tên_bảng[(danh_sách_cột)] câu_lệnh_SELECT

Ví dụ: Giả sử ta có bảng LUUSINHVIEN bao gồm các trường HODEM, TEN, NGAYSINH. Câu

lệnh dưới đây bổ sung vào bảng LUUSINHVIEN các dòng dữ liệu có được từ câu truy vấn

SELECT:

41

Page 42: Bai giang he qtdl

INSERT INTO luusinhvien

SELECT hodem,ten,ngaysinh

FROM sinhvien

WHERE noisinh like ‘%Huế%’

Khi bổ sung dữ liệu theo cách này cần lưu ý một số điểm sau:

• Kết quả của câu lệnh SELECT phải có số cột bằng với số cột được chỉ định trong

bảng đích và phải tương thích về kiểu dữ liệu.

• Trong câu lệnh SELECT được sử dụng mệnh đề COMPUTE ... BY

3.7. Cập nhật bản ghi (UPDATE)

Câu lệnh UPDATE trong SQL được sử dụng để cập nhật dữ liệu trong các bảng. Câu lệnh này có cú

pháp như sau:

UPDATE tên_bảng

SET tên_cột = biểu_thức

[, ..., tên_cột_k = biểu_thức_k]

[FROM danh_sách_bảng]

[WHERE điều_kiện]

Sau UPDATE là tên của bảng cần cập nhật dữ liệu. Một câu lệnh UPDATE có thể cập nhật dữ liệu

cho nhiều cột bằng cách chỉ định các danh sách tên cột và biểu thức tương ứng sau từ khoá SET.

Mệnh đề WHERE trong câu lệnh UPDATE thường được sử dụng để chỉ định các dòng dữ liệu chịu

tác động của câu lệnh (nếu không chỉ định, phạm vi tác động của câu lệnh được hiểu là toàn bộ các

dòng trong bảng)

Ví dụ 2.51: Câu lệnh dưới đây cập nhật lại số đơn vị học trình của các môn học có số đơn vị học

trình nhỏ hơn 2

UPDATE monhoc

SET sodvht = 3

WHERE sodvht = 2

Sử dụng cấu trúc CASE trong câu lệnh UPDATE

Cấu trúc CASE có thể được sử dụng trong biểu thức khi cần phải đưa ra các quyết định khác nhau

về giá trị của biểu thức

Ví dụ Giả sử ta có bảng NHATKYPHONG sau đây

Sau khi thực hiện câu lệnh:

42

Page 43: Bai giang he qtdl

UPDATE nhatkyphong

SET tienphong=songay*CASE WHEN loaiphong='A' THEN 100

WHEN loaiphong='B' THEN 70

ELSE 50

END

Dữ liệu trong bảng sẽ là:

Điều kiện cập nhật dữ liệu liên quan đến nhiều bảng

Mệnh đề FROM trong câu lệnh UPDATE được sử dụng khi cần chỉ định các điều kiện liên quan

đến các bảng khác với bảng cần cập nhật dữ liệu. Trong truờng hợp này, trong mệnh đề WHERE

thường có điều kiện nối giữa các bảng.

Ví dụ: Giả sử ta có hai bảng MATHANG và NHATKYBANHANG như sau:

Câu lệnh dưới đây sẽ cập nhật giá trị trường THANHTIEN của bảng NHATKYBANHANG theo

công thức THANHTIEN = SOLUONG × GIA

UPDATE nhatkybanhang

SET thanhtien = soluong*gia

FROM mathang

WHERE nhatkybanhang.mahang = mathang.mahang

3.8. Xóa bản ghi (DELETE)Để xoá dữ liệu trong một bảng, ta sử dụng câu lệnh DELETE. Cú pháp của câu lệnh này như sau:

DELETE FROM tên_bảng

[FROM danh_sách_bảng]

[WHERE điều_kiện]

Trong câu lệnh này, tên của bảng cần xoá dữ liệu được chỉ định sau DELETE FROM. Mệnh đề

WHERE trong câu lệnh được sử dụng để chỉ định điều kiện đối với các dòng dữ liệu cần xoá. Nếu

câu lệnh DELETE không có mệnh đề WHERE thì toàn bộ các dòng dữ liệu trong bảng đều bị xoá.

Ví dụ 2.55: Câu lệnh dưới đây xoá khỏi bảng SINHVIEN những sinh viên sinh tại Huế

DELETE FROM sinhvien

43

Page 44: Bai giang he qtdl

WHERE noisinh LIKE ‘%Huế%’

Xoá dữ liệu khi điều kiện liên quan đến nhiều bảng

Nếu điều kiện trong câu lệnh DELETE liên quan đến các bảng không phải là bảng cần xóa

dữ liệu, ta phải sử dụng thêm mệnh đề FROM và sau đó là danh sách tên các bảng đó. Trong trường

hợp này, trong mệnh đề WHERE ta chỉ định thêm điều kiện nối giữa các bảng

Ví dụ: Câu lệnh dưới đây xoá ra khỏi bảng SINHVIEN những sinh viên lớp Tin K24

DELETE FROM sinhvien

FROM lop

WHERE lop.malop=sinhvien.malop AND tenlop='Tin K24'

Sử dụng truy vấn con trong câu lệnh DELETE

Một câu lệnh SELECT có thể được lồng vào trong mệnh đề WHERE trong câu lệnh DELETE để

làm điều kiện cho câu lệnh tương tự như câu lệnh UPDATE.

Ví dụ: Câu lệnh dưới đây xoá khỏi bảng LOP những lớp không có sinh viên nào học

DELETE FROM lop

WHERE malop NOT IN (SELECT DISTINCT malop

FROM sinhvien)

Xoá toàn bộ dữ liệu trong bảng

Câu lệnh DELETE không chỉ định điều kiện đối với các dòng dữ liệu cần xoá trong mệnh đề

WHERE sẽ xoá toàn bộ dữ liệu trong bảng. Thay vì sử dụng câu lệnh DELETE trong trường hợp

này, ta có thể sử dụng câu lệnh TRUNCATE có cú pháp như sau:

TRUNCATE TABLE tên_bảng

Bài tậpCâu 1: Phân biệt user table và system table trong cơ sở dữ liệu SQL Server. Các system table

thường lưu trữ những thông tin gì?

Câu 2: Liệt kê và phân loại các kiểu dữ liệu mà SQL Server 2000 hỗ trợ.

Câu 3: Trình bày cú pháp đầy đủ của lệnh CREATE TABLE và giải thích chức năng của từng tham

số.

Câu 4: Tạo cơ sở dữ liệu với các bảng dữ liệu sau đây:

KhachHang(MaKH, TenKH, DiaChi)

NhaCungCap(MaNCC, TenNCC, DiaChi)

MatHang(MaMH,TenMH,DonViTinh, DonGia, MaNCC)

HoaDon(MaHD, MaKH, NgayGiaoDich)

ChiTietHoaDon(MaHD, MaMH, SoLuong)

(Sinh viên tự xác định kiểu dữ liệu và mối liên kết giữa các bảng)

44

Page 45: Bai giang he qtdl

Chương 4. Truy vấn dữ liệu

4.1. Truy vấn cơ bản4.1.1. Mệnh đề SELECT

Câu lệnh SELECT được sử dụng để truy xuất dữ liệu từ các dòng và các cột của một hay nhiều

bảng, khung nhìn. Câu lệnh này có thể dùng để thực hiện phép chọn (tức là truy xuất một tập con

các dòng trong một hay nhiều bảng), phép chiếu (tức là truy xuất một tập con các cột trong một hay

nhiều bảng) và phép nối (tức là liên kết các dòng trong hai hay nhiều bảng để truy xuất dữ liệu).

Ngoài ra, câu lệnh này còn cung cấp khả năng thực hiện các thao tác truy vấn và thống kê dữ liệu

phức tạp khác. Cú pháp chung của câu lệnh SELECT có dạng:

SELECT [ALL | DISTINCT][TOP n] danh_sách_chọn

[INTO tên_bảng_mới]

FROM danh_sách_bảng/khung_nhìn

[WHERE điều_kiện]

[GROUP BY danh_sách_cột]

[HAVING điều_kiện] [ORDER BY cột_sắp_xếp]

[COMPUTE danh_sách_hàm_gộp [BY danh_sách_cột]]

Điều cần lưu ý đầu tiên đối với câu lệnh này là các thành phần trong câu lệnh SELECT nếu

được sử dụng phải tuân theo đúng thứ tự như trong cú pháp. Nếu không, câu lệnh sẽ được xem là

không hợp lệ. Câu lệnh SELECT được sử dụng để tác động lên các bảng dữ liệu và kết quả của câu

lệnh cũng được hiển thị dưới dạng bảng, tức là một tập hợp các dòng và các cột (ngoại trừ trường

hợp sử dụng câu lệnh SELECT với mệnh đề COMPUTE).

4.1.2. Mệnh đề FROMMệnh đề FROM trong câu lệnh SELECT được sử dung nhằm chỉ định các bảng và khung nhìn cần

truy xuất dữ liệu. Sau FROM là danh sách tên của các bảng và khung nhìn tham gia vào truy vấn,

tên của các bảng và khung nhìn được phân cách nhau bởi dấu phẩy.

Ví dụ: Câu lệnh dưới đây hiển thị danh sách các khoa trong trường

SELECT * FROM khoa

kết quả câu lệnh như sau:

45

Page 46: Bai giang he qtdl

Ta có thể sử dụng các bí danh cho các bảng hay khung nhìn trong câu lệnh SELECT. Bí

danh được gán trong mệnh đề FROM bằng cách chỉ định bí danh ngay sau tên bảng.

Ví dụ 2.3: câu lệnh sau gán bí danh là a cho bảng khoa

SELECT * FROM khoa a

4.1.3. Mệnh đề WHEREMệnh đề WHERE trong câu lệnh SELECT được sử dụng nhằm xác định các điều kiện đối với việc

truy xuất dữ liệu. Sau mệnh đề WHERE là một biểu thức logic và chỉ những dòng dữ liệu nào thoả

mãn điều kiện được chỉ định mới được hiển thị trong kết quả truy vấn.

Ví dụ: Câu lệnh dưới đây hiển thị danh sách các môn học có số đơn vị học trình lớn hơn 3

SELECT * FROM monhoc WHERE sodvht>3 Trong mệnh đề WHERE thường sử dụng:

1 • Các toán tử kết hợp điều kiện (AND, OR)

2 • Các toán tử so sánh

3 • Kiểm tra giới hạn của dữ liệu (BETWEEN/ NOT BETWEEN)

4 • Danh sách

5 • Kiểm tra khuôn dạng dữ liệu.

6 • Các giá trị NULL

a. Các toán tử so sánh

Toán tử ý nghĩa = Bằng > Lớn hơn < Nhỏ hơn >= Lớn hơn hoặc bằng <= Nhỏ hơn hoặc bằng <> Khác

!> Không lớn hơn !< Không nhỏ hơn

Ví dụ: Câu lệnh:

46

Page 47: Bai giang he qtdl

SELECT masv,hodem,ten,ngaysinh

FROM sinhvien

WHERE (ten='Anh')

AND (YEAR(GETDATE())-YEAR(ngaysinh)<=20)

cho biết mã, họ tên và ngày sinh của các sinh viên có tên là Anh và có tuổi nhỏ hơn hoặc bằng 20.

b. Kiểm tra giới hạn của dữ liệu

Để kiểm tra xem giá trị dữ liệu nằm trong (ngoài) một khoảng nào đó, ta sử dụng toán tử

BETWEEN (NOT BETWEEN) như sau:

Cách sử dụng Ý nghĩa giá_trị BETWEEN a AND b a ≤ giá_trị ≤ b giá_trị NOT BETWEEN a AND b (giá_trị < a) AND

(giá_trị>b) Ví dụ: Câu lệnh dưới đây cho biết họ tên và tuổi của các sinh viên có tên là Bình và có tuổi nằm

trong khoảng từ 20 đến 22

SELECT hodem,ten,year(getdate())-year(ngaysinh) AS tuoi

FROM sinhvien

WHERE ten='Bình' AND

YEAR(GETDATE())-YEAR(ngaysinh) BETWEEN 20 AND 22

c. Danh sách (IN và NOT IN)

Từ khoá IN được sử dụng khi ta cần chỉ định điều kiện tìm kiếm dữ liệu cho câu lệnh

SELECT là một danh sách các giá trị. Sau IN (hoặc NOT IN) có thể là một danh sách các giá trị

hoặc là một câu lệnh SELECT khác.

Ví dụ: Để biết danh sách các môn học có số đơn vị học trình là 2, 4 hoặc 5, thay vì sử dụng câu

lệnh

SELECT * FROM monhoc

WHERE sodvht=2 OR sodvht=4 OR sodvht=5

ta có thể sử dụng câu lệnh

SELECT * FROM monhoc

WHERE sodvht IN (2,4,5)

d. Toán tử LIKE và các ký tự đại diện

47

Page 48: Bai giang he qtdl

Từ khoá LIKE (NOT LIKE) sử dụng trong câu lệnh SELECT nhằm mô tả khuôn dạng của dữ

liệu cần tìm kiếm. Chúng thường được kết hợp với các ký tự đại diện sau đây:

Ký tự đại diện

ý nghĩa

% Chuỗi ký tự bất kỳ gồm không hoặc nhiều ký tự

_ Ký tự đơn bất kỳ

[] Ký tự đơn bất kỳ trong giới hạn được chỉ định (ví dụ [a-f]) hay một tập (ví dụ [abcdef])

[^] Ký tự đơn bất kỳ không nằm trong giới hạn được chỉ định ( ví dụ [^a-f] hay một tập (ví dụ [^abcdef]).

Ví dụ : Câu lệnh dưới đây SELECT hodem,ten FROM sinhvien WHERE hodem LIKE 'Lê%' cho biết họ tên của các sinh viên có họ là Lê và có kết quả như sau

Câu lệnh: SELECT hodem,ten FROM sinhvien WHERE hodem LIKE 'Lê%' AND ten LIKE '[AB]%' Có kết quả là:

e. Giá trị NULL Dữ liệu trong một cột cho phép NULL sẽ nhận giá trị NULL trong các trường hợp sau:

1 Nếu không có dữ liệu được nhập cho cột và không có mặc định cho cột hay kiểu dữ liệu trên cột đó.

48

Page 49: Bai giang he qtdl

2 • Người sử dụng trực tiếp đưa giá trị NULL vào cho cột đó. 3 • Một cột có kiểu dữ liệu là kiểu số sẽ chứa giá trị NULL nếu giá trị được chỉ định

gây tràn số. Trong mệnh đề WHERE, để kiểm tra giá trị của một cột có giá trị NULL hay không, ta sử dụng cách viết: WHERE tên_cột IS NULL hoặc: WHERE tên_cột IS NOT NULL

4.1.4. Mệnh đề GROUP BY và HAVINGNgoài khả năng thực hiện các yêu cầu truy vấn dữ liệu thông thường (chiếu, chọn, nối,…)

như đã đề cập như ở các phần trước, câu lệnh SELECT còn cho phép thực hiện các thao tác truy vấn

và tính toán thống kê trên dữ liệu như: cho biết tổng số tiết dạy của mỗi giáo viên, điểm trung bình

các môn học của mỗi sinh viên,…

Mệnh đề GROUP BY sử dụng trong câu lệnh SELECT nhằm phân hoạch các dòng dữ liệu trong

bảng thành các nhóm dữ liệu, và trên mỗi nhóm dữ liệu thực hiện tính toán các giá trị thống kê như

tính tổng, tính giá trị trung bình,...

Các hàm gộp được sử dụng để tính giá trị thống kê cho toàn bảng hoặc trên mỗi nhóm dữ liệu.

Chúng có thể được sử dụng như là các cột trong danh sách chọn của câu lệnh SELECT hoặc xuất

hiện trong mệnh đề HAVING, nhưng không được phép xuất hiện trong mệnh đề WHERE

SQL cung cấp các hàm gộp dưới đây:

Hàm gộp Chức năng SUM([ALL | DISTINCT] biểu_thức) Tính tổng các giá trị. AVG([ALL | DISTINCT] biểu_thức) Tính trung bình của các giá trị COUNT([ALL | DISTINCT]

biểu_thức)

Đếm số các giá trị trong biểu thức.

COUNT(*) Đếm số các dòng được chọn. MAX(biểu_thức) Tính giá trị lớn nhất MIN(biểu_thức) Tính giá trị nhỏ nhất

Trong đó:

1 • Hàm SUM và AVG chỉ làm việc với các biểu thức số.

2 • Hàm SUM, AVG, COUNT, MIN và MAX bỏ qua các giá trị NULL khi tính toán.

3 • Hàm COUNT(*) không bỏ qua các giá trị NULL.

Mặc định, các hàm gộp thực hiện tính toán thống kê trên toàn bộ dữ liệu. Trong trường hợp

cần loại bỏ bớt các giá trị trùng nhau (chỉ giữ lại một giá trị), ta chỉ định thêm từ khoá DISTINCT ở

trước biểu thức là đối số của hàm.

Mệnh đề HAVING được sử dụng nhằm chỉ định điều kiện đối với các giá trị thống kê được sản sinh

từ các hàm gộp tương tự như cách thức mệnh đề WHERE thiết lập các điều kiện cho câu lệnh

49

Page 50: Bai giang he qtdl

SELECT. Mệnh đề HAVING thường không thực sự có nghĩa nếu như không sử dụng kết hợp

với mệnh đề GROUP BY. Một điểm khác biệt giữa HAVING và WHERE là trong điều kiện của

WHERE không được có các hàm gộp trong khi HAVING lại cho phép sử dụng các hàm gộp trong

điều kiện của mình.

Ví dụ: Để biết trung bình điểm thi lần 1 của các sinh viên có điểm trung bình lớn hơn hoặc bằng 5,

ta sử dụng câu lệnh như sau:

SELECT sinhvien.masv,hodem,ten,

SUM(diemlan1*sodvht)/sum(sodvht)

FROM sinhvien,diemthi,monhoc

WHERE sinhvien.masv=diemthi.masv AND

diemthi.mamonhoc=monhoc.mamonhoc

GROUP BY sinhvien.masv,hodem,ten

HAVING sum(diemlan1*sodvht)/sum(sodvht)>=5

4.1.5. Mệnh đề ORDER BYMặc định, các dòng dữ liệu trong kết quả của câu truy vấn tuân theo thứ tự của chúng trong

bảng dữ liệu hoặc được sắp xếp theo chỉ mục (nếu trên bảng có chỉ mục). Trong trường hợp muốn

dữ liệu được sắp xếp theo chiều tăng hoặc giảm của giá trị của một hoặc nhiều trường, ta sử dụng

thêm mệnh đề ORDER BY trong câu lệnh SELECT; Sau ORDER BY là danh sách các cột cần sắp

xếp (tối đa là 16 cột). Dữ liệu được sắp xếp có thể theo chiều tăng (ASC) hoặc giảm (DESC), mặc

định là sắp xếp theo chiều tăng.

Ví dụ: Câu lệnh dưới đây hiển thị danh sách các môn học và sắp xếp theo chiều giảm dần của số

đơn vị học trình

SELECT * FROM monhoc

ORDER BY sodvht DESC

Nếu sau ORDER BY có nhiều cột thì việc sắp xếp dữ liệu sẽ được ưu tiên theo thứ tự từ trái qua

phải.

Ví dụ 2.21: Câu lệnh

SELECT hodem,ten,gioitinh,

YEAR(GETDATE())-YEAR(ngaysinh) AS tuoi

FROM sinhvien

WHERE ten='Bình'

ORDER BY gioitinh,tuoi

có kết quả là:

Thay vì chỉ định tên cột sau ORDER BY, ta có thể chỉ định số thứ tự của cột cấn được sắp xếp. Câu

lệnh ở ví dụ trên có thể được viết lại như sau:

50

Page 51: Bai giang he qtdl

SELECT hodem,ten,gioitinh,

YEAR(GETDATE())-YEAR(ngaysinh) AS tuoi

FROM sinhvien

WHERE ten='Bình'

ORDER BY 3, 4

4.1.6. Kết hợp kết quả từ nhiều truy vấn khác nhauPhép hợp được sử dụng trong trường hợp ta cần gộp kết quả của hai hay nhiều truy vấn thành một

tập kết quả duy nhất. SQL cung cấp toán tử UNION để thực hiện phép hợp. Cú pháp như sau

Câu_lệnh_1

UNION [ALL] Câu_lệnh_2

[UNION [ALL] Câu_lệnh_3]

...

[UNION [ALL] Câu_lệnh_n]

[ORDER BY cột_sắp_xếp]

[COMPUTE danh_sách_hàm_gộp [BY danh_sách_cột]]

Trong đó

Câu_lệnh_1 có dạng

SELECT danh_sách_cột

[INTO tên_bảng_mới]

[FROM danh_sách_bảng|khung_nhìn]

[WHERE điều_kiện]

[GROUP BY danh_sách_cột]

[HAVING điều_kiện]

và Câu_lệnh_i (i = 2,..,n) có dạng

SELECT danh_sách_cột

[FROM danh_sách_bảng|khung_nhìn]

[WHERE điều_kiện]

[GROUP BY danh_sách_cột]

[HAVING điều_kiện]

Ví dụ: Giả sử ta có hai bảng Table1 và Table2 lần lượt như sau:

câu lệnh

SELECT A,B FROM Table1

UNION

SELECT D,E FROM table2

Cho kết quả như sau:

51

Page 52: Bai giang he qtdl

Mặc định, nếu trong các truy vấn thành phần của phép hợp xuất hiện những dòng dữ liệu giống

nhau thì trong kết quả truy vấn chỉ giữ lại một dòng. Nếu muốn giữ lại các dòng này, ta phải sử

dụng thêm từ khoá ALL trong truy vấn thành phần.

Ví dụ: Câu lệnh

SELECT A,B FROM Table1

UNION ALL

SELECT D,E FROM table2

Cho kết quả như sau

Khi sử dụng toán tử UNION để thực hiện phép hợp, ta cần chú ý các nguyên tắc sau:

1 • Danh sách cột trong các truy vấn thành phần phải có cùng số lượng.

2 • Các cột tương ứng trong tất cả các bảng, hoặc tập con bất kỳ các cột được sử dụng

trong bản thân mỗi truy vấn thành phần phải cùng kiểu dữ liệu.

3 • Các cột tương ứng trong bản thân từng truy vấn thành phần của một câu lệnh UNION

phải xuất hiện theo thứ tự như nhau. Nguyên nhân là do phép hợp so sánh các cột từng

cột một theo thứ tự được cho trong mỗi truy vấn.

4 • Khi các kiểu dữ liệu khác nhau được kết hợp với nhau trong câu lệnh UNION, chúng sẽ

được chuyển sang kiểu dữ liệu cao hơn (nếu có thể được).

5 • Tiêu đề cột trong kết quả của phép hợp sẽ là tiêu đề cột được chỉ định trong truy vấn

đầu tiên.

1 Truy vấn thành phần đầu tiên có thể có INTO để tạo mới một bảng từ kết quả của chính

phép hợp.

2 • Mệnh đề ORDER BY và COMPUTE dùng để sắp xếp kết quả truy vấn hoặc tính toán

các giá trị thống kê chỉ được sử dụng ở cuối câu lệnh UNION. Chúng không được sử

dụng ở trong bất kỳ truy vấn thành phần nào.

3 • Mệnh đề GROUP BY và HAVING chỉ có thể được sử dụng trong bản thân từng truy

vấn thành phần. Chúng không được phép sử dụng để tác động lên kết quả chung của

phép hợp.

4 • Phép toán UNION có thể được sử dụng bên trong câu lệnh INSERT.

5 • Phép toán UNION không được sử dụng trong câu lệnh CREATE VIEW.

4.2. Truy vấn từ nhiều bảng4.2.1. Inner JoinsĐiều kiện để thực hiện phép nối trong được chỉ định trong mệnh đề FROM theo cú pháp như sau:

tên_bảng_1 [INNER] JOIN tên_bảng_2 ON điều_kiện_nối

52

Page 53: Bai giang he qtdl

Ví dụ 2.31: Để hiển thị họ tên và ngày sinh của các sinh viên lớp Tin K24, thay vì sử dụng câu

lệnh:

SELECT hodem,ten,ngaysinh

FROM sinhvien,lop

WHERE tenlop='Tin K24' AND

sinhvien.malop=lop.malop

ta có thể sử dụng câu lệnh như sau:

SELECT hodem,ten,ngaysinh

FROM sinhvien INNER JOIN lop

ON sinhvien.malop=lop.malop

WHERE tenlop='Tin K24'

4.2.2. Outer JoinsSQL2 cung cấp các phép nối ngoài sau đây:

1 • Phép nối ngoài trái (LEFT OUTER JOIN)

2 • Phép nối ngoài phải (RIGHT OUTER JOIN)

3 • Phép nối ngoài đầy đủ (FULL OUTER JOIN)

Cũng tương tự như phép nối trong, điều kiện của phép nối ngoài cũng được chỉ định ngay trong

mệnh đề FROM theo cú pháp:

tên_bảng_1 LEFT|RIGHT|FULL [OUTER] JOIN tên_bảng_2

ON điều_kiện_nối

Ví dụ: Giả sử ta có hai bảng dữ liệu như sau:

Bảng DONVI Bảng NHANVIEN Phép nối ngoài trái giữa hai bảng NHANVIEN và DONVI được biểu diễn bởi câu lệnh:

SELECT *

FROM nhanvien LEFT OUTER JOIN donvi

ON nhanvien.madv=donvi.madv

có kết quả là:

Câu lệnh:

SELECT *

FROM nhanvien RIGHT OUTER JOIN donvi

ON nhanvien.madv=donvi.madv

thực hiện phép nối ngoài phải giữa hai bảng NHANVIEN và DONVI, và có kết quả là:

Nếu phép nối ngoài trái (tương ứng phải) hiển thị trong kết quả truy vấn cả những dòng dữ liệu

không thoả điều kiện nối của bảng bên trái (tương ứng phải) trong phép nối thì phép nối ngoài đầy

đủ hiển thị trong kết quả truy vấn cả những dòng dữ liệu không thoả điều kiện nối của cả hai bảng

tham gia vào phép nối.

53

Page 54: Bai giang he qtdl

Ví dụ: Với hai bảng NHANVIEN và DONVI như ở trên, câu lệnh

SELECT *

FROM nhanvien FULL OUTER JOIN donvi

ON nhanvien.madv=donvi.madv

cho kết quả là:

Một đặc điểm nổi bật của SQL2 là cho phép biểu diễn phép nối trên nhiều bảng dữ liệu một cách rõ

ràng. Thứ tự thực hiện phép nối giữa các bảng được xác định theo nghĩa kết quả của phép nối này

được sử dụng trong một phép nối khác.

Ví dụ: Câu lệnh dưới đây hiển thị họ tên và ngày sinh của các sinh viên thuộc Khoa Công nghệ

Thông tin

SELECT hodem,ten,ngaysinh FROM (sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop)

INNER JOIN khoa ON lop.makhoa=khoa.makhoa

WHERE tenkhoa=N'Khoa công nghệ thông tin'

Trong câu lệnh trên, thứ tự thực hiện phép nối giữa các bảng được chỉ định rõ ràng: phép nối giữa

hai bảng sinhvien và lop được thực hiện trước và kết quả của phép nối này lại tiếp tục được nối với

bảng khoa.

Bài tậpCâu 1: Trình bày cú pháp chung của câu lệnh truy vấn SELECT. Chỉ ra sự tương đương giữa câu

lệnh SELECT và biểu thức đại số quan hệ.

Câu 2: Phân biệt các phép kết nối bảng dữ liệu: các dạng Join (Inner Join, Outer Join, Cross Join).

Câu 3: Trình bày về phép toán Union. Điều kiện để thực hiện được phép toán này là gì?

Câu 4: Trình bày chức năng các hàm thống kê: COUNT, SUM, MAX, MIN, AVG đi kèm với

GROUP BY.

54

Page 55: Bai giang he qtdl

Chương 5. Tạo và quản lý các chỉ mục

5.1. Các kiểu chỉ mục (Indexes)CLUSTERED

Sắp xếp lại dữ liệu về mặt vật lý.

Chỉ có duy nhất một clustered trong một bảng

Yêu cầu ít nhất 120% kích thước của bảng cóthể sử dụng trong vùng tạm.

Khoảng trống vùng tạm tồn tại trong CSDL tạo chỉ mục mà chúng ta tạo chỉ mục.

NON - CLUSTERED

Thứtự các dòng trong bảng không sắp xếp về mặt vật lý giống Clustered

Đây là kiểu điển hình để tạo chỉmục cho cột liên kết các cột khác. Các giá trị có thể được

thay đổi thường xuyên

SQL server sử dụng mặc định khi tạo chỉ mục là non – clustered

Chúng ta cóthểtạo 249 non–clustered cho mỗi bảng

5.2. Tạo các chỉ mụcCó thể sử dụng lệnh CREATE INDEX:

CREATE [UNIQUE] INDEX tengọi khoá INDEX ON tên bảng

( Namefield1 [ASC/DESC],Namefield2 [ASC/DESC],....) WITH PRIMARY

[ DISALLOW NULL ]/ [ IGNORE NULL ]

Hoặc sử dụng Wizard:

55

Page 56: Bai giang he qtdl

56

Page 57: Bai giang he qtdl

57

Page 58: Bai giang he qtdl

58

Page 59: Bai giang he qtdl

5.3. Quản lý và gỡ bỏ các chỉ mụcDROP INDEX

{ <drop_relational_or_xml_or_spatial_index> [ ,...n ]

| <drop_backward_compatible_index> [ ,...n ]

}

<drop_relational_or_xml_or_spatial_index> ::=

index_name ON <object>

[ WITH ( <drop_clustered_index_option> [ ,...n ] ) ]

<drop_backward_compatible_index> ::=

[ owner_name. ] table_or_view_name.index_name

<object> ::=

{

[ database_name. [ schema_name ] . | schema_name. ]

table_or_view_name

}

<drop_clustered_index_option> ::=

{

MAXDOP = max_degree_of_parallelism

59

Page 60: Bai giang he qtdl

| ONLINE = { ON | OFF }

| MOVE TO { partition_scheme_name ( column_name )

| filegroup_name

| "default"

}

[ FILESTREAM_ON { partition_scheme_name

| filestream_filegroup_name

| "default" } ]

}

Bài tậpCâu 1: Trình bày khái niệm và vai trò của chỉ mục trong cơ sở dữ liệu.

Câu 2: Khái niệm về B-Tree và tổ chức chỉ mục trong SQL Server 2000.

Câu 3: Trình bày cú pháp đầy đủ của lệnh tạo chỉ mục và giải thích ý nghĩa từng tham số.

60

Page 61: Bai giang he qtdl

Chương 6. Tạo và quản lý khung nhìn

6.1. Định nghĩaKhung nhìn là một lược đồ dữ liệu được lấy ra từ một lược đồ dữ liệu khác đã có.

6.2. Tạo các khung nhìn (Views)Câu lệnh CREATE VIEW như sau:

CREATE VIEW tên_khung_nhìn[(danh_sách_tên_cột)] AS

câu_lệnh_SELECT

Ví dụ: Câu lệnh dưới đây tạo khung nhìn có tên DSSV từ câu lệnh SELECT truy vấn từ hai bảng

SINHVIEN và LOP

CREATE VIEW dssv AS

SELECT masv,hodem

FROM sinhvien,lop

WHERE sinhvien.malop=lop.malop

thựiện câu lệnh:

SELECT * FROM dssv

ta có được kết quả như sau:

6.3. Quản lý các khung nhìnCâu lệnh ALTER VIEW được sử dụng để định nghĩa lại khung nhìn hiện có nhưng không làm

thay đổi các quyền đã được cấp phát cho người sử dụng trước đó. Câu lệnh này sử dụng tương tự

như câu lệnh CREATE VIEW và có cú pháp như sau:

ALTER VIEW tên_khung_nhìn [(danh_sách_tên_cột)]

AS

61

Page 62: Bai giang he qtdl

Câu_lệnh_SELECT

Ví dụ: Ta định nghĩa khung nhìn như sau:

CREATE VIEW viewlop

AS

SELECT malop,tenlop,tenkhoa

FROM lop INNER JOIN khoa ON lop.makhoa=khoa.makhoa

WHERE tenkhoa='Khoa Vật lý’

và có thể định nghĩa lại khung nhìn trên bằng câu lệnh:

ALTER VIEW view_lop

AS

SELECT malop,tenlop,hedaotao

FROM lop INNER JOIN khoa ON lop.makhoa=khoa.makhoa

WHERE tenkhoa='Khoa Công nghệ thông tin'

6.4. Xóa các khung nhìnKhi một khung nhìn không còn sử dụng, ta có thể xoá nó ra khỏi cơ sở dữ liệu thông qua câu

lệnh:

DROP VIEW tên_khung_nhìn

Nếu một khung nhìn bị xoá, toàn bộ những quyền đã cấp phát cho người sử dụng trên khung

nhìn cũng đồng thời bị xoá. Do đó, nếu ta tạo lại khung nhìn thì phải tiến hành cấp phát lại quyền

cho người sử dụng.

Ví dụ: Câu lệnh dưới đây xoá khung nhìn VIEW_LOP ra khỏi cơ sở dữ liệu

DROP VIEW view_lop

Bài tậpCâu 1:Trình bày khái niệm về view (bảng ảo). View giúp tăng tính bảo mật cho cơ sở dữ liệu như thế nào?Câu 2: Trình bày các lệnh tạo, sửa đổi và xóa view.Câu 3: Cập nhật dữ liệu thông qua view như thế nào?Câu 4: Nếu ý nghĩa của tùy chọn WITH ENCRYPTION trong cú pháp lệnh tạo view.

62

Page 63: Bai giang he qtdl

Chương 7. Tạo và quản lý các thủ tục thường trú

7.1. Tạo các thủ tục thường trú (Stored procedures)Thủ tục lưu trữ được tạo bởi câu lệnh CREATE PROCEDURE với cú pháp như sau:

CREATE PROCEDURE tên_thủ_tục [(danh_sách_tham_số)]

[WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION]

AS

Các_câu_lệnh_của_thủ_tục

Trong đó:

tên_thủ_tục Tên của thủ tục cần tạo. Tên phải tuân theo qui tắc định danh và không được

vượt quá 128 ký tự. danh_sách_tham_số Các tham số của thủ tục được khai báo ngay sau tên thủ tục và nếu thủ tục có

nhiều tham số thì các khai báo phân cách nhau bởi dấu phẩy. Khai báo của

mỗi một tham số tối thiểu phải bao gồm hai phần:

1 • tên tham số được bắt đầu bởi dấu @.

2 • kiểu dữ liệu của tham số

Ví dụ:

@mamonhoc nvarchar(10)

RECOMPILE Thông thường, thủ tục sẽ được phân tích, tối ưu và dịch sẵn ở lần gọi đầu

tiên. Nếu tuỳ chọn WITH RECOMPILE được chỉ định, thủ tục sẽ được dịch

lại mỗi khi được gọi.

ENCRYPTION Thủ tục sẽ được mã hoá nếu tuỳ chọn WITH ENCRYPTION được chỉ

định. Nếu thủ tục đã được mã hoá, ta không thể xem được nội dung

của thủ tục.

các_câu_lệnh_của_thủ_tục Tập hợp các câu lệnh sử dụng trong nội dung thủ tục. Các câu lệnh

này có thể đặt trong cặp từ khoá BEGIN...END hoặc có thể không.

Ví dụ 5.1: 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 1. Bổ sung thêm môn học cơ sở dữ liệu có mã TI-005 và số đơn vị học trình là 5 vào

bảng MONHOC

2 2. Lên danh sách nhập điểm thi môn cơ sở dữ liệu cho các sinh viên học lớp có mã

C24102 (tức là bổ sung thêm vào bảng DIEMTHI các bản ghi với cột

63

Page 64: Bai giang he qtdl

MAMONHOC nhận giá trị TI-005, cột MASV nhận giá trị lần lượt là mã các

sinh viên học lớp có mã C24105 và các cột điểm là NULL).

Nếu thực hiện yêu cầu trên thông qua các câu lệnh SQL như thông thường, ta phải thực thi hai câu

lệnh như sau:

INSERT INTO MONHOC

VALUES('TI-005','Cơ sở dữ liệu',5)

INSERT INTO DIEMTHI(MAMONHOC,MASV)

SELECT ‘TI-005’,MASV

FROM SINHVIEN

WHERE MALOP='C24102'

Thay vì phải sử dụng hai câu lệnh như trên, ta có thể định nghĩa môt thủ tục lưu trữ với các tham số

vào là @mamonhoc, @tenmonhoc, @sodvht và @malop như sau:

CREATE PROC sp_LenDanhSachDiem(

@mamonhoc NVARCHAR(10),

@tenmonhoc NVARCHAR(50),

@sodvht SMALLINT,

@malop NVARCHAR(10))

AS

BEGIN

INSERT INTO monhoc

VALUES(@mamonhoc,@tenmonhoc,@sodvht)

INSERT INTO diemthi(mamonhoc,masv) SELECT ‘TI-005’,MASV

FROM SINHVIEN

WHERE MALOP='C24102'

Thay vì phải sử dụng hai câu lệnh như trên, ta có thể định nghĩa môt thủ tục lưu trữ với các tham số

vào là @mamonhoc, @tenmonhoc, @sodvht và @malop như sau:

CREATE PROC sp_LenDanhSachDiem(

@mamonhoc NVARCHAR(10),

@tenmonhoc NVARCHAR(50),

@sodvht SMALLINT,

@malop NVARCHAR(10))

AS

BEGIN

INSERT INTO monhoc

64

Page 65: Bai giang he qtdl

VALUES(@mamonhoc,@tenmonhoc,@sodvht)

INSERT INTO diemthi(mamonhoc,masv)

SELECT @mamonhoc,masv

FROM sinhvien

WHERE malop=@malop

END

Khi thủ tục trên đã được tạo ra, ta có thể thực hiện được hai yêu cầu đặt ra ở trên một cách đơn giản

thông qua lòi gọi thủ tục:

sp_LenDanhSachDiem 'TI-005','Cơ sở dữ liệu',5,'C24102'

7.2. Thực thi các thủ tục thường trúNhư đã thấy ở ví dụ ở trên, khi một thủ tục lưu trữ đã được tạo ra, ta có thể yêu cầu hệ quản trị cơ

sở dữ liệu thực thi thủ tục bằng lời gọi thủ tục có dạng:

tên_thủ_tục [danh_sách_các_đối_số]

Số lượng các đối số cũng như thứ tự của chúng phải phù hợp với số lượng và thứ tự của các tham số

khi định nghĩa thủ tục.

Trong trường hợp lời gọi thủ tục được thực hiện bên trong một thủ tục khác, bên trong một trigger

hay kết hợp với các câu lệnh SQL khác, ta sử dụng cú pháp như sau:

EXECUTE tên_thủ_tục [danh_sách_các_đối_số]

Thứ tự của các đối số được truyền cho thủ tục có thể không cần phải tuân theo thứ tự của các tham

số như khi định nghĩa thủ tục nếu tất cả các đối số được viết dưới dạng:

@tên_tham_số = giá_trị

Ví dụ 5.2: Lời gọi thủ tục ở ví dụ trên có thể viết như sau:

sp_LenDanhSachDiem @malop='C24102',

@tenmonhoc='Cơ sở dữ liệu',

@mamonhoc='TI-005',

@sodvht=5

7.3. Xem và sửa các thủ tục thường trúKhi một thủ tục đã được tạo ra, ta có thể tiến hành định nghĩa lại thủ tục đó bằng câu lệnh

ALTER PROCEDURE có cú pháp như sau:

ALTER PROCEDURE tên_thủ_tục [(danh_sách_tham_số)]

[WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION]

AS

Các_câu_lệnh_Của_thủ_tục

65

Page 66: Bai giang he qtdl

Câu lệnh này sử dụng tương tự như câu lệnh CREATE PROCEDURE. Việc sửa đổi lại một

thủ tục đã có không làm thay đổi đến các quyền đã cấp phát trên thủ tục cũng như không tác động

đến các thủ tục khác hay trigger phụ thuộc vào thủ tục này.

7.4. Tham số vào và ra (Parameters)Ngoài những tham số được truyền cho thủ tục, bên trong thủ tục còn có thể sử dụng các biến nhằm

lưu giữ các giá trị tính toán được hoặc truy xuất được từ cơ sở dữ liệu. Các biến trong thủ tục được

khai báo bằng từ khoá DECLARE theo cú pháp như sau:

DECLARE @tên_biến kiểu_dữ_liệu

Tên biến phải bắt đầu bởi ký tự @ và tuân theo qui tắc về định danh. Ví dụ dưới đây minh hoạ việc

sử dụng biến trong thủ tục

Ví dụ 5.3: Trong định nghĩa của thủ tục dưới đây sử dung các biến chứa các giá trị truy xuất được

từ cơ sở dữ liệu.

CREATE PROCEDURE sp_Vidu(

@malop1 NVARCHAR(10),

@malop2 NVARCHAR(10))

AS

DECLARE @tenlop1 NVARCHAR(30)

DECLARE @namnhaphoc1 INT

DECLARE @tenlop2 NVARCHAR(30)

DECLARE @namnhaphoc2 INT

SELECT @tenlop1=tenlop,

@namnhaphoc1=namnhaphoc

FROM lop WHERE malop=@malop1

SELECT @tenlop2=tenlop,

@namnhaphoc2=namnhaphoc

FROM lop WHERE malop=@malop2

PRINT @tenlop1+' nhap hoc nam '+str(@namnhaphoc1)

print @tenlop2+' nhap hoc nam '+str(@namnhaphoc2)

IF @namnhaphoc1=@namnhaphoc2

PRINT 'Hai lớp nhập học cùng năm'

ELSE

PRINT 'Hai lớp nhập học khác năm'

Trong các ví dụ trước, nếu đối số truyền cho thủ tục khi có lời gọi đến thủ tục là biến, những thay

đổi giá trị của biền trong thủ tục sẽ không được giữ lại khi kết thúc quá trình thực hiện thủ tục.

Ví dụ 5.4: Xét câu lệnh sau đây

66

Page 67: Bai giang he qtdl

CREATE PROCEDURE sp_Conghaiso(@a INT,@b INT, @c INT)

AS

SELECT @c=@a+@b

Nếu sau khi đã tạo thủ tục với câu lệnh trên, ta thực thi một tập các câu lệnh như sau:

DECLARE @tong INT

SELECT @tong=0

EXECUTE sp_Conghaiso 100,200,@tong

SELECT @tong

Câu lệnh “SELECT @tong” cuối cùng trong loạt các câu lệnh trên sẽ cho kết quả là: 0

Trong trường hợp cần phải giữ lại giá trị của đối số sau khi kết thúc thủ tục, ta phải khai báo tham

số của thủ tục theo cú pháp như sau:

@tên_tham_số kiểu_dữ_liệu OUTPUT

hoặc:

@tên_tham_số kiểu_dữ_liệu OUT

và trong lời gọi thủ tục, sau đối số được truyền cho thủ tục, ta cũng phải chỉ định thêm từ khoá

OUTPUT (hoặc OUT)

Ví dụ 5.5: Ta định nghĩa lại thủ tục ở ví dụ 5.4 như sau:

CREATE PROCEDURE sp_Conghaiso(

@a INT,

@b INT,

@c INT OUTPUT)

AS

SELECT @c=@a+@b

và thực hiện lời gọi thủ tục trong một tập các câu lệnh như sau:

DECLARE @tong INT

SELECT @tong=0

EXECUTE sp_Conghaiso 100,200,@tong OUTPUT

SELECT @tong

thì câu lệnh “SELECT @tong” sẽ cho kết quả là: 300

Tham số với giá trị mặc định

Các tham số được khai báo trong thủ tục có thể nhận các giá trị mặc định. Giá trị mặc định sẽ được

gán cho tham số trong trường hợp không truyền đối số cho tham số khi có lời gọi đến thủ tục.

Tham số với giá trị mặc định được khai báo theo cú pháp như sau:

@tên_tham_số kiểu_dữ_liệu = giá_trị_mặc_định

Ví dụ 5.6: Trong câu lệnh dưới đây:

CREATE PROC sp_TestDefault(

67

Page 68: Bai giang he qtdl

@tenlop NVARCHAR(30)=NULL,

@noisinh NVARCHAR(100)='Huế')

AS

BEGIN

IF @tenlop IS NULL

SELECT hodem,ten

FROM sinhvien INNER JOIN lop

ON sinhvien.malop=lop.malop

WHERE noisinh=@noisinh

ELSE

SELECT hodem,ten

FROM sinhvien INNER JOIN lop

ON sinhvien.malop=lop.malop

WHERE noisinh=@noisinh AND

tenlop=@tenlop

END

thủ tục sp_TestDefault được định nghĩa với tham số @tenlop có giá trị mặc định là NULL và tham

số @noisinh có giá trị mặc định là Huế. Với thủ tục được định nghĩa như trên, ta có thể thực hiện

các lời gọi với các mục đích khác nhau như sau:

1 • Cho biết họ tên của các sinh viên sinh tại Huế:

sp_testdefault

1 • Cho biết họ tên của các sinh viên lớp Tin K24 sinh tại Huế:

sp_testdefault @tenlop='Tin K24'

1 • Cho biết họ tên của các sinh viên sinh tại Nghệ An:

sp_testDefault @noisinh=N'Nghệ An'

1 • Cho biết họ tên của các sinh viên lớp Tin K26 sinh tại Đà Nẵng:

sp_testdefault @tenlop='Tin K26',@noisinh='Đà Nẵng'

Bài tập cuối chươngCâu 1: Trình bày khái niệm về thủ tục thường trú.

Câu 2: Cú pháp đầy đủ của lệnh tạo, sửa đổi và xóa thủ tục thường trú. Giải thích ý nghĩa các tham

số.

Câu 3: Ý nghĩa của tùy chọn WITH ENCRYPTION trong cú pháp lệnh tạo thủ tục.

Câu 4: Thực thi thủ tục như thế nào? Thủ tục trong SQL Server có thể được gọi từ các ngôn ngữ

lập trình ngoài không?

68

Page 69: Bai giang he qtdl

Chương 8. Tạo và quản lý hàm người dùng

định nghĩa

8.1. Các kiểu hàm người dùng định nghĩa (User-defined functions)

Hàm là đối tượng cơ sở dữ liệu tương tự như thủ tục. Điểm khác biệt giữa hàm và thủ tục là

hàm trả về một giá trị thông qua tên hàm còn thủ tục thì không. Điều này cho phép ta sử dụng hàm

như là một thành phần của một biêu thức (chẳng hạn trong danh sách chọn của câu lệnh SELECT).

Ngoài những hàm do hệ quản trị cơ sở dữ liệu cung cấp sẵn, người sử dụng có thể định nghĩa

thêm các hàm nhằm phục vụ cho mục đích riêng của mình.

8.2. Tạo hàm người dùng định nghĩaHàm được định nghĩa thông qua câu lệnh CREATE FUNCTION với cú pháp như sau:

CREATE FUNCTION tên_hàm ([danh_sách_tham_số])

RETURNS (kiểu_trả_về_của_hàm)

AS

BEGIN

các_câu_lệnh_của_hàm

END

Ví dụ 5.7: Câu lệnh dưới đây định nghĩa hàm tính ngày trong tuần (thứ trong tuần) của một giá trị

kiểu ngày

CREATE FUNCTION thu(@ngay DATETIME)

RETURNS NVARCHAR(10)

AS

BEGIN

DECLARE @st NVARCHAR(10) SELECT @st=CASE DATEPART(DW,@ngay) WHEN 1 THEN 'Chu nhật' WHEN 2 THEN 'Thứ hai' WHEN 3 THEN 'Thứ ba' WHEN 4 THEN 'Thứ tư' WHEN 5 THEN 'Thứ năm' WHEN 6 THEN 'Thứ sáu' ELSE 'Thứ bảy' END

69

Page 70: Bai giang he qtdl

RETURN (@st) /* Trị trả về của hàm */ END

Một hàm khi đã được định nghĩa có thể được sử dụng như các hàm do hệ quản trị cơ sở dữ liệu

cung cấp (thông thường trước tên hàm ta phải chỉ định thêm tên của người sở hữu hàm)

Ví dụ 5.8: Câu lệnh SELECT dưới đây sử dụng hàm đã được định nghĩa ở ví dụ trước:

SELECT masv,hodem,ten,dbo.thu(ngaysinh),ngaysinh

FROM sinhvien WHERE malop=’C24102’

có kết quả là:

8.3. Quản lý hàm người dùng định nghĩaThay đổi cấu trúc hàm, dùng lệnh ALTER FUNCTION

ALTER FUNCTION tên_hàm ([danh_sách_tham_số])

RETURNS (kiểu_trả_về_của_hàm)

AS

BEGIN

các_câu_lệnh_của_hàm

END

Bài tậpCâu 1: Trình bày khái niệm về hàm người dùng.

Câu 2: Cú pháp đầy đủ của lệnh tạo, sửa đổi và xóa hàm người dùng. Giải thích ý nghĩa các tham

số.

Câu 3: Ý nghĩa của tùy chọn WITH ENCRYPTION trong cú pháp lệnh tạo hàm người dùng.

Câu 4: Gọi hàm người dùng như thế nào? Hàm người dùng trong SQL Server có thể được gọi từ

các ngôn ngữ lập trình ngoài không?

70

Page 71: Bai giang he qtdl

Chương 9. Tạo và quản lý các Trigger

9.1. Tạo các Trigger thao tác dữ liệu (DML Triggers)Một trigger là một đối tượng gắn liền với một bảng và được tự động kích hoạt khi xảy ra những

giao tác làm thay đổi dữ liệu trong bảng. Định nghĩa một trigger bao gồm các yếu tố sau:

1 • Trigger sẽ được áp dụng đối với bảng nào?

2 • Trigger được kích hoạt khi câu lệnh nào được thực thi trên bảng: INSERT, UPDATE,

DELETE?

3 • Trigger sẽ làm gì khi được kích hoạt?

Câu lệnh CREATE TRIGGER được sử dụng để đinh nghĩa trigger và có cú pháp như sau:

CREATE TRIGGER tên_trigger

ON tên_bảng

FOR {[INSERT][,][UPDATE][,][DELETE]}

AS

[IF UPDATE(tên_cột)

[AND UPDATE(tên_cột)|OR UPDATE(tên_cột)]

...]

các_câu_lệnh_của_trigger

Ví dụ: Ta định nghĩa các bảng như sau:

Bảng MATHANG lưu trữ dữ liệu về các mặt hàng:

CREATE TABLE mathang

(

mahang NVARCHAR(5) PRIMARY KEY, /*mã hàng*/

tenhang NVARCHAR(50) NOT NULL, /*tên hàng*/

soluong INT, /*số lượng hàng hiện có*/

)

Bảng NHATKYBANHANG lưu trữ thông tin về các lần bán hàng

CREATE TABLE nhatkybanhang

(

stt INT IDENTITY PRIMARY KEY,

ngay DATETIME, /*ngày bán hàng*/

nguoimua NVARCHAR(30), /*tên người mua hàng*/

mahang NVARCHAR(5) /*mã mặt hàng được bán*/

FOREIGN KEY REFERENCES mathang(mahang),

71

Page 72: Bai giang he qtdl

soluong INT, /*giá bán hàng*/

giaban MONEY /*số lượng hàng được bán*/

)

Câu lệnh dưới đây định nghĩa trigger trg_nhatkybanhang_insert. Trigger này có chức năng tự động

giảm số lượng hàng hiện có khi một mặt hàng nào đó được bán (tức là khi câu lệnh INSERT được

thực thi trên bảng NHATKYBANHANG).

CREATE TRIGGER trg_nhatkybanhang_insert

ON nhatkybanhang

FOR INSERT

AS

UPDATE mathang

SET mathang.soluong=mathang.soluong-inserted.soluong

FROM mathang INNER JOIN inserted

ON mathang.mahang=inserted.mahang

Với trigger vừa tạo ở trên, nếu dữ liệu trong bảng MATHANG là:

thì sau khi ta thực hiện câu lênh:

INSERT INTO nhatkybanhang

(ngay,nguoimua,mahang,soluong,giaban)

VALUES('5/5/2004','Tran Ngoc Thanh','H1',10,5200)

dữ liệu trong bảng MATHANG sẽ như sau:

Trong câu lệnh CREATE TRIGGER ở ví dụ trên, sau mệnh đề ON là tên của bảng mà

trigger cần tạo sẽ tác động đến. Mệnh đề tiếp theo chỉ định câu lệnh sẽ kích hoạt trigger (FOR

INSERT). Ngoài INSERT, ta còn có thể chỉ định UPDATE hoặc DELETE cho mệnh đề này, hoặc

có thể kết hợp chúng lại với nhau. Phần thân của trigger nằm sau từ khoá AS bao gồm các câu lệnh

mà trigger sẽ thực thi khi được kích hoạt.

9.2. Tạo các Trigger định nghĩa dữ liệu (DDL Triggers)Thay vì chỉ định một trigger được kích hoạt trên một bảng, ta có thể chỉ định trigger được kích hoạt

và thực hiện những thao tác cụ thể khi việc thay đổi dữ liệu chỉ liên quan đến một số cột nhất định

nào đó của cột. Trong trường hợp này, ta sử dụng mệnh đề IF UPDATE trong trigger. IF UPDATE

không sử dụng được đối với câu lệnh DELETE.

72

Page 73: Bai giang he qtdl

Ví dụ: Xét lại ví dụ với hai bảng MATHANG và NHATKYBANHANG, trigger dưới đây được

kích hoạt khi ta tiến hành cập nhật cột SOLUONG cho một bản ghi của bảng

NHATKYBANHANG (lưu ý là chỉ cập nhật đúng một bản ghi)

CREATE TRIGGER trg_nhatkybanhang_update_soluong

ON nhatkybanhang

FOR UPDATE

AS

IF UPDATE(soluong)

UPDATE mathang

SET mathang.soluong = mathang.soluong –

(inserted.soluong-deleted.soluong)

FROM (deleted INNER JOIN inserted ON

deleted.stt = inserted.stt) INNER JOIN mathang

ON mathang.mahang = deleted.mahang

Với trigger ở ví dụ trên, câu lệnh:

UPDATE nhatkybanhang

SET soluong=soluong+20

WHERE stt=1 sẽ kích hoạt trigger ứng với mệnh đề IF UPDATE (soluong) và câu lệnh UPDATE trong trigger sẽ

được thực thi. Tuy nhiên câu lệnh:

UPDATE nhatkybanhang

SET nguoimua='Mai Hữu Toàn'

WHERE stt=3

lại không kích hoạt trigger này.

Mệnh đề IF UPDATE có thể xuất hiện nhiều lần trong phần thân của trigger. Khi đó, mệnh đề IF

UPDATE nào đúng thì phần câu lệnh của mệnh đề đó sẽ được thực thi khi trigger được kích hoạt.

Ví dụ 5.14: Giả sử ta định nghĩa bảng R như sau:

CREATE TABLE R

(

A INT,

B INT,

C INT

)

và trigger trg_R_update cho bảng R:

CREATE TRIGGER trg_R_test

ON R

73

Page 74: Bai giang he qtdl

FOR UPDATE

AS

IF UPDATE(A)

Print 'A updated'

IF UPDATE(C)

Print 'C updated'

Câu lệnh:

UPDATE R SET A=100 WHERE A=1

sẽ kích hoạt trigger và cho kết quả là:

A updated

và câu lệnh:

UPDATE R SET C=100 WHERE C=2

cũng kích hoạt trigger và cho kết quả là:

C updated

còn câu lệnh:

UPDATE R SET B=100 WHERE B=3

hiển nhiên sẽ không kích hoạt trigger

9.3. Sử dụng các Trigger lồng nhau (Nested Triggers)Một trigger có khả năng nhận biết được sự thay đổi về mặt dữ liệu trên bảng dữ liệu, từ đó có thể

phát hiện và huỷ bỏ những thao tác không đảm bảo tính toàn vẹn dữ liệu. Trong một trigger, để huỷ

bỏ tác dụng của câu lệnh làm kích hoạt trigger, ta sử dụng câu lệnh(1):

ROLLBACK TRANSACTION

Ví dụ 5.15: Nếu trên bảng MATHANG, ta tạo một trigger như sau:

CREATE TRIGGER trg_mathang_delete

ON mathang

FOR DELETE

AS

ROLLBACK TRANSACTION

Thì câu lệnh DELETE sẽ không thể có tác dụng đối với bảng MATHANG. Hay nói cách khác, ta

không thể xoá được dữ liệu trong bảng.

Ví dụ 5.16: Trigger dưới đây được kích hoạt khi câu lệnh INSERT được sử dụng để bổ sung một

bản ghi mới cho bảng NHATKYBANHANG. Trong trigger này kiểm tra điều kiện hợp lệ của dữ

liệu là số lượng hàng bán ra phải nhỏ hơn hoặc bằng số lượng hàng hiện có. Nếu điều kiện này

không thoả mãn thì huỷ bỏ thao tác bổ sung dữ liệu.

CREATE TRIGGER trg_nhatkybanhang_insert

74

Page 75: Bai giang he qtdl

ON NHATKYBANHANG

FOR INSERT

AS

DECLARE @sl_co int /* Số lượng hàng hiện có */

DECLARE @sl_ban int /* Số lượng hàng được bán */

DECLARE @mahang nvarchar(5) /* Mã hàng được bán */

SELECT @mahang=mahang,@sl_ban=soluong

FROM inserted

SELECT @sl_co = soluong

FROM mathang where mahang=@mahang

/*Nếu số lượng hàng hiện có nhỏ hơn số lượng bán

thì huỷ bỏ thao tác bổ sung dữ liệu */

IF @sl_co<@sl_ban

ROLLBACK TRANSACTION

/* Nếu dữ liệu hợp lệ

thì giảm số lượng hàng hiện có */

ELSE

UPDATE mathang

SET soluong=soluong-@sl_ban

WHERE mahang=@mahang

9.4. Sử dụng các Trigger đệ quy (Recursive Triggers)Trong các ví dụ trước, các trigger chỉ thực sự hoạt động đúng mục đích khi các câu lệnh kích

hoạt trigger chỉ có tác dụng đối với đúng một dòng dữ liêu. Ta có thể nhận thấy là câu lệnh

UPDATE và DELETE thường có tác dụng trên nhiều dòng, câu lệnh INSERT mặc dù ít rơi vào

trường hợp này nhưng không phải là không gặp; đó là khi ta sử dụng câu lệnh có dạng INSERT

INTO ... SELECT ... Vậy làm thế nào để trigger hoạt động đúng trong trường hợp những câu lệnh

có tác động lên nhiều dòng dữ liệu?

Có hai giải pháp có thể sử dụng đối với vấn đề này:

1 • Sử dụng truy vấn con.

2 • Sử dụng biến con trỏ.

Ta hình dung vấn đề này và cách khắc phục qua ví dụ dưới đây:

Ví dụ: Ta xét lại trường hợp của hai bảng MATHANG và NHATKYBANHANG như sơ đồ dưới

đây:

75

Page 76: Bai giang he qtdl

Trigger dưới đây cập nhật lại số lượng hàng của bảng MATHANG khi câu lệnh UPDATE

được sử dụng để cập nhật cột SOLUONG của bảng NHATKYBANHANG.

CREATE TRIGGER trg_nhatkybanhang_update_soluong

ON nhatkybanhang

FOR UPDATE

AS

IF UPDATE(soluong)

UPDATE mathang

SET mathang.soluong = mathang.soluong –

(inserted.soluong-deleted.soluong)

FROM (deleted INNER JOIN inserted ON

deleted.stt = inserted.stt) INNER JOIN mathang

ON mathang.mahang = deleted.mahang

Với trigger được định nghĩa như trên, nếu thực hiện câu lệnh:

UPDATE nhatkybanhang

SET soluong = soluong + 10

WHERE stt = 1

thì dữ liệu trong hai bảng MATHANG và NHATKYBANHANG sẽ là:

Bài tậpCâu 1: Trình bày khái niệm về Trigger? So sánh sự khác biệt giữa Trigger và ràng buộc (constraint)

Câu 2: Trình bày cú pháp đầy đủ của các lệnh tạo, sửa, xóa Trigger và giải thích ý nghĩa của các

tham số.

Câu 3: Thế nào là Trigger đệ quy? Hãy đưa ra một ví dụ cài đặt Trigger đệ quy.

76

Page 77: Bai giang he qtdl

MỘT SỐ ĐỀ THI MẪU

77

Page 78: Bai giang he qtdl

Trường Đại Học Hàng Hải Việt NamKhoa Công nghệ Thông tin

BỘ MÔN HỆ THỐNG THÔNG TIN-----***-----

THI KẾT THÚC HỌC PHẦN

Tên học phần : HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆUNăm học : 2009 - 2010

Đề thi số: Ký duyệt đề:

1Thời gian: 60 phút

Câu 1: (3 điểm)

Viết các lệnh T-SQL để tạo cơ sở dữ liệu QLYBAIXE gồm các bảng dữ liệu sau đây:

ChuXe(MaCX, TenCX, DiaChi)

LoaiXe(MaLoai, TenLoai)

Xe(SoXe, MaCX, MaLoai)

NhatKyBai(SoXe, NgayVao, NgayRa)

Trong đó bảng NhatKyBai lưu giữ thông tin thời gian lưu bãi của xe. Một xe có thể vào bãi nhiều

lần. Xe nào chưa ra khỏi bãi thì có có trường NgayRa = NULL.

Câu 3: (4 điểm)

Viết các câu lệnh truy vấn trên cơ sở dữ liệu QLYBAIXE để thực hiện các nhiệm vụ sau:

1. Thống kê xem mỗi chủ xe sở hữu bao nhiêu loại xe khác nhau:

MaCX TenCX SoLoaiXe

2. Thống kê các xe hiện đang nằm trên bãi và số ngày lưu bãi tính từ lần vào gần nhất cho

đến thời điểm hiện tại

SoXe SoNgayLuu

3. Thống kê các xe ra khỏi bãi vào tháng 10/2009 và tổng số ngày lưu bãi của các xe này qua

các lần ra vào bãi (tính từ lần vào đầu tiên cho tới lần ra cuối cùng)

SoXe TongSoNgay

4. Thống kê số lần vào bãi của mỗi loại xe

Câu 4: (3 điểm)

Viết một thủ tục thường trú có tên sp_ThemXe làm nhiệm vụ thêm một bản ghi mới vào bảng Xe

trong cơ sở dữ liệu QLYBAIXE. Biết xe mới thêm vào phải thỏa mãn các điều kiện:

o Không có SoXe trùng với một xe nào đó đã có trên bảng.

o Xe này phải thuộc sở hữu của một chủ xe có MaCX nằm trong bảng ChuXe

o Xe này phải thuộc về một loại xe có MaLoai nằm trong bảng LoaiXe

MaLoai TenLoai SoLan

78

Page 79: Bai giang he qtdl

Trường Đại Học Hàng Hải Việt NamKhoa Công nghệ Thông tin

BỘ MÔN HỆ THỐNG THÔNG TIN-----***-----

THI KẾT THÚC HỌC PHẦN

Tên học phần : HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆUNăm học : 2009 - 2010

Đề thi số: Ký duyệt đề:

2Thời gian: 75 phút

Câu 1: (3 điểm)

Hãy viết lệnh T-SQL tạo cơ sở dữ liệu có tên HDANDETAI gồm các bảng dữ liệu sau đây:

GiangVien(MaGV, TenGV)

DeTai(MaDT, TenDT)

SinhVien(MaSV, TenSV, Lop, MaDT, MaGVHD, MaGVPB)

Trong đó mỗi sinh viên chỉ được nhận một đề tài. Các sinh viên có thể nhận đề tài giống nhau. Mỗi

sinh viên có một giáo viên hướng dẫn và một giáo viên phản biện.

Câu 2: (4 điểm)

Viết các câu lệnh truy vấn trên cơ sở dữ liệu HDANDETAI thực hiện những công việc sau:

o Hãy thống kê xem mỗi giáo viên đã hướng dẫn và phản biện bao nhiêu sinh viên:

MaGV TenGV SoSVHuongDan SoSVPhanBien

o Hãy thống kê xem mỗi giáo viên đã hướng dẫn và phản biện bao nhiêu đề tài khác nhau:

MaGV TenGV SoDeTaiHD SoDeTaiPB

o Hãy thống kê xem mỗi lớp nhận bao nhiêu đề tài khác nhau:

Lop SoDeTai

o Hãy thống kê xem mỗi giáo viên hướng dẫn sinh viên đến từ bao nhiêu lớp khác nhau:

MaGV TenGV SoLopHuongDan

Câu 3: (3 điểm)

Hãy xây dựng một hàm người dùng UDF để tính tổng các giai thừa:

F(n) = 1! + 2! + 3! + ... + n!

79

Page 80: Bai giang he qtdl

Trường Đại Học Hàng Hải Việt NamKhoa Công nghệ Thông tin

BỘ MÔN HỆ THỐNG THÔNG TIN-----***-----

THI KẾT THÚC HỌC PHẦN

Tên học phần : HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆUNăm học : 2009 - 2010

Đề thi số: Ký duyệt đề:

3Thời gian: 60 phút

Câu 1: (3 điểm)

Viết các lệnh T-SQL để cơ sở dữ liệu QLYNHANSU bao gồm các bảng dữ liệu sau:

PhongBan(MaPB, TenPB)

ChuyenMon(MaCM, TenCM)

NhanVien(MaNV, TenNV, MaPB, MaCM, LaTruongPhong)

Chú ý:

Mỗi phòng ban có một và chỉ một nhân viên giữ vị trí trưởng phòng. Nhân viên nào giữ vị trí

trưởng phòng thì trường LaTruongPhong = 1, còn bình thường mặc định LaTruongPhong = 0.

Câu 3: (3 điểm)

Hãy viết các câu lệnh truy vấn làm nhiệm vụ:

1. Thống kê ra mã nhân viên và tên của các vị trưởng phòng của những phòng ban có ít nhân

viên nhất

MaNV TenNV TenPB

2. Thống kê xem ứng với mỗi một phòng ban thì nhân viên phòng ban đó có bao nhiêu

chuyên môn khác nhau:

MaPB TenPB SoLuongCMBiet

3. Thống kê xem ứng với mỗi loại chuyên môn thì có bao nhiêu phòng ban có nhân viên biết

chuyên môn đó:

MaCM TenCM SoLuongPB

Câu 4: (4 điểm)

1. Tạo một view làm nhiệm vụ thống kê số lượng nhân viên của mỗi phòng ban:

MaPB TenPB SoLuongNV

2. Tạo một Trigger làm nhiệm vụ kiểm soát quá trình Insert và Update trên bảng NhanVien

nhằm đảm bảo sao cho ứng với mỗi phòng ban chỉ có một nhân viên được thiết lập là trưởng

phòng (có trường LaTruongPhong = 1).

80

Page 81: Bai giang he qtdl

Trường Đại Học Hàng Hải Việt NamKhoa Công nghệ Thông tin

BỘ MÔN HỆ THỐNG THÔNG TIN-----***-----

THI KẾT THÚC HỌC PHẦN

Tên học phần : HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆUNăm học : 2009 - 2010

Đề thi số: Ký duyệt đề:

4Thời gian: 60 phút

Câu 1: (3 điểm)

Viết các lệnh T-SQL tạo cơ sở dữ liệu QLYBANHANG gồm các bảng dữ liệu sau đây:

LoaiHang(MaLoai, TenLoai)

NhaCungCap(MaNCC, TenNCC, DiaChi, DienThoai)

HangNhap(MaHN, MaLoai, MaNCC, SoLuong, DonGia)

Câu 3: (3 điểm)

1. Thống kê xem mỗi nhà cung cấp đã cung cấp bao nhiêu loại hàng khác nhau:

MaNCC TenNCC SoLoaiHang

2. Thống kê xem mỗi loại hàng được cung cấp bởi bao nhiêu nhà cung cấp khác nhau:

MaNCC TenNCC SoLoaiHang

3. Thống kê số tiền phải thanh toán cho mỗi nhà cung cấp, biết số tiền phải thanh toán ứng

với mỗi MaHN là SoLuong * DonGia:

MaNCC TenNCC SoTien

Câu 4: (4 điểm)

1. Viết lệnh T-SQL định nghĩa một thủ tục thường trú có tên sp_AddHangNhap làm nhiệm vụ

thêm một bản ghi mới vào bảng hàng nhập. Dữ liệu nhập vào phải thỏa mãn tất cả các điều

kiện sau đây:

Có @MaHN không trùng với một MaHN nào đã có trong bảng

Có @MaLoai phải nằm trong số các MaLoai có mặt trong bảng LoaiHang

Có @MaNCC nằm trong số các MaNCC có mặt trong bảng NhaCungCap

Nếu thêm thành công, thủ tục trả về giá trị 1. Nếu dữ liệu không hợp lệ, thủ tục trả về giá trị 0.

2. Giả sử người ta không tạo ràng buộc khóa chính trên cột MaHN, hãy tạo một Trigger làm

nhiệm vụ kiểm soát việc Insert, Update trên bảng HangNhap để đảm bảo tính không trùng lặp

của dữ liệu nhập vào cột MaHN và dữ liệu điền vào cột SoLuong luôn phải thỏa mãn điều kiện

10 < SoLuong < 30.

81

Page 82: Bai giang he qtdl

Trường Đại Học Hàng Hải Việt NamKhoa Công nghệ Thông tin

BỘ MÔN HỆ THỐNG THÔNG TIN-----***-----

THI KẾT THÚC HỌC PHẦN

Tên học phần : HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆUNăm học : 2009 - 2010

Đề thi số: Ký duyệt đề:

5Thời gian: 60 phút

Câu 1: (3 điểm)

Viết các lệnh T-SQL tạo cơ sở dữ liệu CHOTHUEXE gồm các bảng dữ liệu sau đây:

LoaiXe(MaLoai, TenLoai, DonGiaTheoNgay)

KhachHang(MaKhach, TenKhach, DiaChi, DienThoai)

Xe(SoXe, MaLoai, TinhTrang)

NhatKyThue(SoXe, MaKhach, TuNgay, DenNgay)

Câu 3: (4 điểm)

Viết các câu lệnh truy vấn làm nhiệm vụ sau đây:

1. Thống kê xem mỗi khách hàng đã từng thuê bao nhiêu loại xe khác nhau:

MaKhach TenKhach SoLoaiXeDaThue

2. Thống kê xem mỗi khách hàng đã từng thuê bao nhiêu chiếc xe khác nhau:

MaKhach TenKhach SoLuongXeDaThue

3. Thống kê xem mỗi loại xe đã được bao nhiêu khách hàng khác nhau thuê:

MaLoai TenLoai SoKhachHang

4. Thống kê xem mỗi xe đã được bao nhiêu khách hàng khác nhau thuê:

SoXe SoKhachHang

Câu 4: (3 điểm)

1. Hãy viết lệnh T-SQL định nghĩa ra một view thống kê số tiền mà khách phải trả cho mỗi lần

thuê xe:

SoXe MaKhach TuNgay DenNgay SoNgayThue DonGiaTheoNgay ThanhTien

Biết SoNgayThue = DenNgay - TuNgay, ThanhTien = SoNgayThue * DonGiaTheoNgay

2. Hãy viết lệnh T-SQL để định nghĩa một Trigger kiểm soát việc Insert, Update trên bảng

NhatKyThue sao cho luôn đảm bảo trên các trường TuNgay và DenNgay thì ngày bắt đầu luôn

phải có giá trị nhỏ ngày kết thúc (TuNgay < DenNgay).

82