Hoc SQL voi bai giang

146 13 0
Hoc SQL voi bai giang

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Một câu lệnh nối thực hiện lấy các dòng dữ liệu trong các bảng tham gia truy vấn, so sánh giá trị của các dòng này trên một hoặc nhiều cột được chỉ định trong điều kiện nối và kết hợp [r]

(1)

TRƯỜNG ĐẠI HỌC KHOA HỌC HUẾ KHOA CÔNG NGHỆ THÔNG TIN

G

GIIÁÁOO TTRRÌÌNNHH SSQQLL

(Lưu hành nội bộ)

Biên soạn: Trần Nguyên Phong

(2)

M

MCC LLCC

MỤC LỤC

LỜI NÓI ĐẦU

CHƯƠNG 1: TỔNG QUAN VỀ SQL

1.1 SQL ngôn ngữ sở liệu quan hệ

1.2 Vai trò SQL

1.3 Tổng quan sở liệu quan hệ

1.3.1 Mơ hình liệu quan hệ

1.3.2 Bảng (Table)

1.3.3 Khoá bảng 10

1.3.4 Mối quan hệ khố ngồi 11

1.4 Sơ lược SQL 12

1.4.1 Câu lệnh SQL 12

1.4.2 Qui tắc sử dụng tên SQL 14

1.4.3 Kiểu liệu 14

1.4.4 Giá trị NULL 16

1.5 Kết chương 16

CHƯƠNG 2: NGÔN NGỮ THAO TÁC DỮ LIỆU 18

2.1 Truy xuất liệu với câu lệnh SELECT 18

2.1.1 Mệnh đề FROM 19

2.1.2 Danh sách chọn câu lệnh SELECT 20

2.1.3 Chỉ định điều kiện truy vấn liệu 25

2.1.4 Tạo bảng liệu từ kết câu lệnh SELECT 29

2.1.5 Sắp xếp kết truy vấn 29

2.1.6 Phép hợp 31

2.1.7 Phép nối 33

2.1.7.1 Sử dụng phép nối 34

2.1.7.2 Các loại phép nối 36

2.1.7.4 Sử dụng phép nối SQL2 40

2.1.8 Thống kê liệu với GROUP BY 43

2.1.9 Thống kê liệu với COMPUTE 46

2.1.10 Truy vấn (Subquery) 49

2.2 Bổ sung, cập nhật xoá liệu 53

2.2.1 Bổ sung liệu 53

2.2.2 Cập nhật liệu 54

2.2.3 Xoá liệu 56

Bài tập chương 58

(3)

3.1 Tạo bảng liệu 69

3.1.1 Ràng buộc CHECK 72

3.1.2 Ràng buộc PRIMARY KEY 74

3.1.3 Ràng buộc UNIQUE 76

3.1.4 Ràng buộc FOREIGN KEY 76

3.2 Sửa đổi định nghĩa bảng 79

3.3 Xoá bảng 81

3.4 Khung nhìn 82

3.4.1 Tạo khung nhìn 84

3.4.2 Cập nhật, bổ sung xoá liệu thơng qua khung nhìn 86

3.4.3 Sửa đổi khung nhìn 89

3.4.4 Xố khung nhìn 90

Bài tập chương 90

CHƯƠNG 4: BẢO MẬT TRONG SQL 96

4.1 Các khái niệm 96

4.2 Cấp phát quyền 97

4.2.1 Cấp phát quyền cho người dùng đối tượng sở liệu 97

4.2.2 Cấp phát quyền thực thi câu lệnh 99

4.3 Thu hồi quyền 100

4.3.1 Thu hồi quyền đối tượng sở liệu: 100

4.3.2 Thu hồi quyền thực thi câu lênh: 103

CHƯƠNG 5: THỦ TỤC LƯU TRỮ, HÀM VÀ TRIGGER 104

5.1 Thủ tục lưu trữ (stored procedure) 104

5.1.1 Các khái niệm 104

5.1.2 Tạo thủ tục lưu trữ 105

5.1.3 Lời gọi thủ tục lưu trữ 107

5.1.4 Sử dụng biến thủ tục 107

5.1.5 Giá trị trả tham số thủ tục lưu trữ 108

5.1.6 Tham số với giá trị mặc định 109

5.1.7 Sửa đổi thủ tục 110

5.2 Hàm người dùng định nghĩa 111

5.2.1 Định nghĩa sử dụng hàm 111

5.2.2 Hàm với giá trị trả “dữ liệu kiểu bảng” 112

5.3 Trigger 116

5.3.1 Định nghĩa trigger 117

5.3.2 Sử dụng mệnh đề IF UPDATE trigger 119

5.3.3 ROLLBACK TRANSACTION trigger 121

5.3.4 Sử dụng trigger trường hợp câu lệnh INSERT, UPDATE DELETE có tác động đến nhiều dòng liệu 122

5.3.4.1 Sử dụng truy vấn 122

5.3.4.2 Sử dụng biến trỏ 125

Bài tập chương 127

CHƯƠNG 6: GIAO TÁC SQL 132

6.1 Giao tác tính chất giao tác 132

(4)

6.3 Giao tác lồng 136

PHỤ LỤC 138

A Cơ sở liệu mẫu sử dụng giáo trình 138

B Một số hàm thường sử dụng 141

B.1 Các hàm liệu kiểu chuỗi 141

B.2 Các hàm liệu kiểu ngày 143

B.3 Hàm chuyển đổi kiểu 144

(5)

L

LIINNĨĨIIĐĐUU

Ngơn ngữ hỏi có cấu trúc (SQL), có tiền thân SEQUEL, ngôn ngữ IBM phát triển sử dụng hệ sở liệu thử nghiệm có tên System/R vào năm 1974, thức ANSI/ISO cơng nhận chuẩn ngơn ngữ sử dụng sở liệu quan hệ vào năm 1986 Cho đến nay, SQL sử dụng phổ biển hệ quản trị sở liệu thương mại có vai trị quan trọng hệ thống

Được động viên đồng nghiệp Khoa Công nghệ Thơng tin (Trưịng Đại học Khoa học - Đại học Huế), mạnh dạn viết giới thiệu Giáo

trình SQL đến bạn đọc Trong giáo trình này, chúng tơi khơng có tham vọng đề cập đến

mọi khía cạnh SQL mà mong muốn tài liệu tham khảo tương đối đầy đủ câu lệnh thường sử dụng SQL Giáo trình chia thành sáu chương với nội dung sau:

• Chương giới thiệu tổng quan SQL số khái liên quan đến sở liệu quan hệ

• Chương dành để bàn luận đến câu lệnh thao tác liệu bao gồm SELECT, INSERT, UPDATE DELETE, tập trung nhiều vào câu lệnh SELECT

• Chương trình bày số câu lệnh sử dụng định nghĩa đối tượng sở liệu

• Một số vấn đề liên quan đến bảo mật liệu SQL đề cập đến chương

• Nội dung chương liên quan đến việc sử dụng thủ tục lưu trữ, hàm trigger sở liệu

• Trong chương cuối cùng, chương 6, giới thiệu đến bạn đọc số vấn đề liên quan đến xử lý giao tác SQL

Ngoài sáu chương trên, phần phụ lục cuối giáo trình đề cập đến sở liệu mẫu sử dụng hầu hết ví dụ số hàm thường sử dụng hệ quản trị SQL Server 2000 để bạn đọc tiện việc tra cứu

(6)

liệu SQL Server 2000 hãng Microsoft để sử dụng cho ví dụ minh hoạ lời giải tập

Chúng hi vọng giáo trình thực có ích bạn đọc Chúng mong nhận cổ vũ ý kiến đóng góp thẳng thắn bạn

Cuối cùng, xin gởi lời cảm ơn đến thầy cô, đồng nghiệp bạn sinh viên động viên giúp đỡ chúng tơi hồn thành giáo trình

(7)

C

Chhưươơnngg11:: T

TNNGGQQUUAANN VV SSQQLL

Ngôn ngữ hỏi có cấu trúc (SQL) hệ quản trị sở liệu quan hệ tảng kỹ thuật quan trọng công nghiệp máy tính Cho đến nay, nói SQL xem ngôn ngữ chuẩn sở liệu Các hệ quản trị sở liệu quan hệ thương mại có Oracle, SQL Server, Informix, DB2, chọn SQL làm ngôn ngữ cho sản phẩm

Vậy thực SQL gì? Tại lại quan trọng hệ quản trị sở liệu? SQL làm nào? Nó sử dụng hệ quản trị sở liệu quan hệ? Nội dung chương cung cấp cho nhìn tổng quan SQL số vấn đề liên quan

1.1 SQL ngôn ngữ sở liệu quan hệ

SQL, viết tắt Structured Query Language (ngôn ngữ hỏi có cấu trúc), cơng cụ sử dụng để tổ chức, quản lý truy xuất liệu đuợc lưu trữ sở liệu SQL hệ thống ngôn ngữ bao gồm tập câu lệnh sử dụng để tương tác với sở liệu quan hệ

Tên gọi ngơn ngữ hỏi có cấu trúc phần làm liên tưởng đến công cụ (ngôn ngữ) dùng để truy xuất liệu sở liệu Thực mà nói, khả SQL vượt xa so với công cụ truy xuất liệu, mục đích ban đầu SQL xây dựng nên truy xuất liệu chức quan trọng SQL sử dụng để điều khiển tất chức mà hệ quản trị sở liệu cung cấp cho người dùng bao gồm:

• Định nghĩa liệu: SQL cung cấp khả định nghĩa sở liệu, cấu trúc lưu trữ tổ chức liệu mối quan hệ thành phần liệu

• Truy xuất thao tác liệu: Với SQL, người dùng dễ dàng thực thao tác truy xuất, bổ sung, cập nhật loại bỏ liệu sở liệu

(8)

• Đảm bảo tồn vẹn liệu: SQL định nghĩa ràng buộc toàn vẹn sở liệu nhờ đảm bảo tính hợp lệ xác liệu trước thao tác cập nhật lỗi hệ thống

Như vậy, nói SQL ngơn ngữ hồn thiện sử dụng hệ thống sở liệu thành phần thiếu hệ quản trị sở liệu Mặc dù SQL ngơn ngữ lập trình C, C++, Java, song câu lệnh mà SQL cung cấp nhúng vào ngơn ngữ lập trình nhằm xây dựng ứng dụng tương tác với sở liệu

Khác với ngôn ngữ lập trình quen thuộc C, C++, Java, SQL ngơn ngữ có tính khai báo Với SQL, người dùng cần mô tả yêu cầu cần phải thực sở liệu mà không cần phải cách thức thực yêu cầu Chính vậy, SQL ngơn ngữ dễ tiếp cận dễ sử dụng

1.2 Vai trò SQL

Bản thân SQL hệ quản trị sở liệu, khơng thể tồn độc lập SQL thực phần hệ quản trị sở liệu, xuất hệ quản trị sở liệu với vai trị ngơn ngữ cơng cụ giao tiếp người sử dụng hệ quản trị sở liệu

Trong hầu hết hệ quản trị sở liệu quan hệ, SQL có vai trị sau:

• SQL ngơn ngữ hỏi có tính tương tác: Người sử dụng dễ dàng thơng qua trình tiện ích để gởi yêu cầu dạng câu lệnh SQL đến sở liệu nhận kết trả từ sở liệu

• SQL ngơn ngữ lập trình sở liệu: Các lập trình viên nhúng câu lệnh SQL vào ngơn ngữ lập trình để xây dựng nên chương trình ứng dụng giao tiếp với sở liệu

• SQL ngôn ngữ quản trị sở liệu: Thông qua SQL, người quản trị sở liệu quản lý sở liệu, định nghĩa cấu trúc lưu trữ liệu, điều khiển truy cập sở liệu,

• SQL ngôn ngữ cho hệ thống khách/chủ (client/server): Trong hệ thống sở liệu khách/chủ, SQL sử dụng công cụ để giao tiếp trình ứng dụng phía máy khách với máy chủ sở liệu • SQL ngơn ngữ truy cập liệu Internet: Cho đến nay, hầu hết

máy chủ Web máy chủ Internet sử dụng SQL với vai trò ngôn ngữ để tương tác với liệu sở liệu

(9)

• SQL ngôn ngữ sử dụng cho cổng giao tiếp sở liệu: Trong hệ thống mạng máy tính với nhiều hệ quản trị sở liệu khác nhau, SQL thường sử dụng chuẩn ngôn ngữ để giao tiếp hệ quản trị sở liệu

1.3 Tổng quan sở liệu quan hệ

1.3.1 Mơ hình liệu quan hệ

Mơ hình liệu quan hệ Codd đề xuất năm 1970 đến trở thành mơ hình sử dụng phổ biến hệ quản trị sở liệu thương mại Nói cách đơn giản, sở liệu quan hệ sở liệu tất liệu tổ chức bảng có mối quan hệ với Mỗi bảng bao gồm dòng cột: dòng gọi ghi (bộ) cột trường (thuộc tính)

Hình 1.1 minh hoạ cho ta thấy bảng sở liệu

ên, sở liệu quan hệ, bảng đối tượng sử dụng Hình 1.1: Các bảng sở liệu

1.3.2 Bảng (Table)

Như nói tr

(10)

một dòng bảng biểu diễn cho thực thể (trong hình 1.1, dịng bảng SINHVIEN tương ứng với sinh viên); cột biểu diễn cho tính chất thực thể (chẳng hạn cột NGAYSINH bảng SINHVIEN biểu diễn cho ngày sinh sinh viên lưu trữ bảng)

Như vậy, liên quan đến bảng bao gồm yếu tố sau:

g sở • rúc bảng: Tập cột bảng Mỗi cột bảng

bảng: Tập dịng (bản ghi) có bảng 1.3.3 K o

ữ liệu thiết kế tốt, bảng phải có một

ác

ể có nhiều tập cột khác có tính chất khố (tức giá ị

gọi khoá phụ khoá dự tuyển (candidate key/unique key) • Tên bảng: sử dụng để xác định bản

liệu

Cấu t

xác định tên cột phải có kiểu liệu (chẳng hạn cột NGAYSINH bảng SINHVIEN hình 1.1 có kiểu DATETIME) Kiểu liệu cột qui định giá trị liệu chấp nhận cột

Dữ liệu h bảng

Trong sở d

tập cột mà giá trị liệu xác định dịng tập dòng bảng Tập nhiều cột có tính chất gọi khố bảng Việc chọn khố bảng có vai trị quan trọng việc thiết kế cài đặt c sở liệu quan hệ Các dòng liệu bảng phải có giá trị khác khố Bảng MONHOC hình có khố cột MAMONHOC

Hình 1.2: Bảng MONHOC với khố MAMONHOC

Một bảng có th

(11)

1.3.4 Mối quan hệ khố ngồi

Các bảng sở liệu khơng tồn độc lập mà có mối quan hệ mật n hệ thể thông qua ràng buộc giá

A dòng (tức lớp) bảng LOP phải ược x

gi ảng LOP

và KH

u diễn mối quan hệ bảng liệu Một hay tập cột thiết với mặt liệu Mối qua

trị liệu xuất bảng phải có xuất trước bảng khác Mối

quan hệ bảng sở liệu nhằm đàm bảo tính đắn hợp lệ liệu sở liệu

Trong hình 1.3, hai bảng LOP KHOA có mối quan hệ với Mối quan hệ đòi hỏi giá trị cột MAKHO

đ ác định từ cột MAKHOA bảng KHOA

B¶ng LOP

Hình 1.3: Mối quan hệ hai bảng LOP KHOA sở liệu

Mối quan hệ bảng sở liệu thể mối quan h ữa thực thể giới thực Trong hình 1.3, mối quan hệ hai b

OA không cho phép lớp tồn mà lại thuộc vào khoa khơng có thật

Khái niệm khố ngồi (Foreign Key) sở liệu quan hệ sử dụng để biể

(12)

1.4 Sơ lược SQL

ồm khoảng 40 câu lệnh Bảng 1.1 liệt kê danh sách câu ng số câu lệnh SQL Trong hệ quản trị

ữ liệu

Truy xuất liệu

E ữ liệu bảng

Định ngh u

Tạo bảng ng

n ìn EX

MA sở liệu URE

1.4.1 Câu lệnh SQL

SQL chuẩn bao g lệnh thường sử dụ

cơ sở liệu khác nhau, câu lệnh có dạng mục đích sử dụng song hệ quản trị sở liệu có số thay đổi Điều đơi dẫn đến cú pháp chi tiết câu lệnh khác hệ quản trị cơ sở liệu khác

Câu lệnh Chức Thao tác d

SELECT

INSERT Bổ sung liệu UPDATE Cập nhật liệu DELETE Xoá liệu TRUNCAT Xoá toàn d

ĩa liệ

CREATE TABLE

DROP TABLE Xoa bảng ALTER TABLE Sửa đổi bả CREATE VIEW Tạo khung nhì ALTER VIEW Sửa đổi khung nh DROP VIEW Xố khung nhìn CREATE IND Tạo mục DROP INDEX Xoá mục CREATE SCHE Tạo lược đồ c

DROP SCHEMA Xoá lược đồ sở liệu CREATE PROCED Tạo thủ tục lưu trữ

(13)

CREATE FUNCTION Tạo hàm (do người sử dụng định nghĩa)

r er

Điề

Cấp phát quyền cho người sử dụng

Qu ác

Uỷ thác (kết thúc thành công) giao tác K

ACTION giao tác

Lập

RE Khai báo biến định nghĩa trỏ

y vấn

con trỏ)

E nh SQL

Bảng 1.1: M ng SQL

Các câu lện t từ khoá cho biết hức n

,hodem,ten ALTER FUNCTION Sửa đổi hàm DROP FUNCTION Xoá hàm CREATE TRIGGER Tạo trigge ALTER TRIGGER Sửa đổi trigg DROP TRIGGER Xoá trigger

u khiển truy cập

GRANT

REVOKE Thu hồi quyền từ người sử dụng

ản lý giao t

COMMIT

ROLLBAC Quay lui giao tác SAVE TRANS Đánh dấu điểm

trình

DECLA

OPEN Mở trỏ để truy xuất kết tru

FETCH Đọc dòng kết truy vấn (sử dụng CLOSE Đóng trỏ

EXECUT Thực thi câu lệ

ột số câu lệnh thông dụng tro

h SQL bắt đầu từ lệnh, mộ

c ăng câu lệnh (chẳng hạn SELECT, DELETE, COMMIT) Sau từ lệnh mệnh đề câu lệnh Mỗi mệnh đề câu lệnh bắt đầu từ khoá (chẳng hạn FROM, WHERE, )

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

SELECT masv FROM sinhvien

(14)

dùng để truy xuất liệu bảng SINHVIEN bắt đầu từ lệnh SELECT, câu lệnh bao gồm hai mệnh đề: mệnh đề FROM định tên bảng cần truy xuất liệu mệnh đề WHERE định điều kiện truy vấn liệu

1.4.2 Qui tắc sử dụng tên SQL

Các đối tượng sở liệu dựa SQL xác định thông qua tên đối tượng Tên đối tượng sở liệu Tên sử dụng nhiều truy vấn SQL xem tảng sở liệu quan hệ tên bảng tên cột

Trong sở liệu lớn với nhiều người sử dụng, ta định tên bảng câu lệnh SQL, hệ quản trị sở liệu hiểu tên bảng ta sở hữu (tức bảng ta tạo ra) Thông thường, hệ quản trị sở liệu cho phép người dùng khác tạo bảng trùng tên với mà không gây xung đột tên Nếu câu lệnh SQL ta cần đến bảng người dùng khác sở hữu (hiển nhiên phải phép) tên bảng phải viết sau tên người sở hữu phân cách với tên người sở hữu dấu chấm:

tên_người_sở_hữu.tên_bảng

Một số đối tượng sở liệu khác (như khung nhìn, thủ tục, hàm), việc sử dụng tên tương tự bảng

Ta sử dụng tên cột cách bình thường câu lệnh SQL cảch cần định tên cột bảng Tuy nhiên, câu lệnh có liên quan đến hai cột trở lên có tên bảng khác bắt buộc phải định thêm tên bảng trước tên cột; tên bảng tên cột phân cách dấu chấm

Ví dụ: Ví dụ minh hoạ cho ta thấy việc sử dụng tên bảng tên cột câu

lệnh SQL

SELECT masv,hodem,ten,sinhvien.malop,tenlop FROM dbo.sinhvien,dbo.lop

WHERE sinhvien.malop = lop.malop

1.4.3 Kiểu liệu

Chuẩn ANSI/ISO SQL cung cấp kiểu liệu khác để sử dụng sở liệu dựa SQL ngôn ngữ SQL Dựa sở kiểu liệu chuẩn ANSI/ISO SQL cung cấp, hệ quản trị sở liệu thương mại sử dụng dạng liệu khác sản phẩm Bảng 1.2 liệt kê số kiểu liệu thông dụng sử dụng SQL

Tên kiểu Mô tả

(15)

NCHAR (n) Kiếu chuỗi với độ dài cố định hỗ trợ UNICODE VARCHAR (n) Kiểu chuỗi với độ dài xác

NVARCHAR (n) Kiểu chuỗi với độ dài xác hỗ trợ UNICODE INTEGER Số nguyên có giá trị từ -231 đến 231 -

INT Như kiểu Integer

TINYTINT Số nguyên có giá trị từ đến 255 SMALLINT Số nguyên có giá trị từ -215 đến 215 – BIGINT Số nguyên có giá trị từ -263 đến 263-1 NUMERIC (p,s) Kiểu số với độ xác cố định DECIMAL (p,s) Tương tự kiểu Numeric

FLOAT Số thực có giá trị từ -1.79E+308 đến 1.79E+308 REAL Số thực có giá trị từ -3.40E + 38 đến 3.40E + 38 MONEY Kiểu tiền tệ

BIT Kiểu bit (có giá trị 1)

DATETIME Kiểu ngày (chính xác đến phần trăm giây) SMALLDATETIME Kiểu ngày (chính xác đến phút)

TIMESTAMP

BINARY Dữ liệu nhị phân với độ dài cố định (tối đa 8000 bytes) VARBINARY Dữ liệu nhị phân với độ dài xác (tối đa 8000 bytes) IMAGE Dữ liệu nhị phân với độ dài xác (tối đa 2,147,483,647

bytes)

TEXT Dữ liệu kiếu chuỗi với độ dài lớn (tối đa 2,147,483,647 ký tự)

NTEXT Dữ liệu kiếu chuỗi với độ dài lớn hỗ trợ UNICODE (tối đa 1,073,741,823 ký tự)

Bảng 1.2: Một số kiểu liệu thông dụng SQL

Ví dụ 1.2: Câu lệnh định nghĩa bảng với kiểu liệu qui định cho

cột bảng

(16)

(

MANV NVARCHAR(10) NOT NULL, HOTEN NVARCHAR(30) NOT NULL, GIOITINH BIT,

NGAYSINH SMALLDATETIME, NOISINH NCHAR(50), HSLUONG DECIMAL(4,2), MADV INT

)

1.4.4 Giá trị NULL

Một sở liệu phản ánh hệ thống giới thực, giá trị liệu tồn sở liệu khơng xác định Một giá trị không xác định xuất sở liệu số nguyên nhân sau:

• Giá trị có tồn khơng biết

• Khơng xác định giá trị có tồn hay khơng

• Tại thời điểm giá trị chưa có có • Giá trị bị lỗi tính tốn (tràn số, chia cho không, )

Những giá trị không xác định biểu diễn sở liệu quan hệ giá trị NULL Đây giá trị đặc biệt không nên nhầm lẫn với chuỗi rỗng (đối với liệu kiểu chuỗi) hay giá trị không (đối với giá trị kiểu số) Giá trị NULL đóng vai trị quan trọng sở liệu hầu hết hệ quản trị sở liệu quan hệ hỗ trợ việc sử dụng giá trị

1.5 Kết chương

Như vậy, SQL (viết tắt Structured Query Language) hệ thống ngôn ngữ sử dụng cho hệ quản trị sở liệu quan hệ Thơng qua SQL thực thao tác sở liệu định nghĩa liệu, thao tác liệu, điều khiển truy cập, quản lý toàn vẹn liệu SQL thành phần quan trọng thiếu hệ quản trị sở liệu quan hệ

(17)

Các bảng sở liệu có mối quan hệ với Các mối quan hệ biểu diễn thơng qua khố khố ngồi bảng Khố bảng tập nhiều cột có giá trị bảng giá trị xác định dòng liệu bảng Một khố ngồi tập nhiều cột có giá trị xác định từ khố bảng khác

(18)

C

Chhưươơnngg22

N

NGGÔÔNN NNGG TTHHAAOO TTÁÁCC DD LLIIUU

Đối với đa số người sử dụng, SQL xem công cụ hữu hiệu để thực yêu cầu truy vấn thao tác liệu Trong chương này, ta bàn luận đến nhóm câu lệnh SQL sử dụng cho mục đích Nhóm câu lệnh gọi chung ngôn ngữ thao tác liệu (DML: Data Manipulation Language) bao gồm câu lệnh sau:

• SELECT: Sử dụng để truy xuất liệu từ môt nhiều bảng • INSERT: Bổ sung liệu

• UPDATE: Cập nhật liệu • DELETE: Xố liệu

Trong số câu lệnh này, nói SELECT câu lệnh tương đối phức tạp sử dụng nhiều sở liệu Với câu lệnh này, ta không thực yêu cầu truy xuất liệu đơn mà cịn thực yêu cầu thống kê liệu phức tạp Cũng vậy, phần đầu chương tập trung tương đối nhiều đến câu lệnh SELECT Các câu lệnh INSERT, UPDATE DELETE bàn luận đến cuối chương

2.1 Truy xuất liệu với câu lệnh SELECT

Câu lệnh SELECT sử dụng để truy xuất liệu từ dòng cột hay nhiều bảng, khung nhìn Câu lệnh dùng để thực phép chọn (tức truy xuất tập dòng hay nhiều bảng), phép chiếu (tức truy xuất tập cột hay nhiều bảng) phép nối (tức liên kết dòng hai hay nhiều bảng để truy xuất liệu) Ngồi ra, câu lệnh cịn cung cấp khả thực thao tác truy vấn thống kê liệu phức tạp khác

Cú pháp chung 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]

(19)

[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 ý câu lệnh thành phần câu lệnh SELECT sử dụng phải tuân theo thứ tự cú pháp Nếu không, câu lệnh xem không hợp lệ

Câu lệnh SELECT sử dụng để tác động lên bảng liệu kết câu lệnh hiển thị dạng bảng, tức tập hợp dòng cột (ngoại trừ trường hợp sử dụng câu lệnh SELECT với mệnh đề COMPUTE)

Ví dụ 2.1: Kết câu lệnh sau cho biết mã lớp, tên lớp hệ đào tạo

lớp có

SELECT malop,tenlop,hedaotao FROM lop

2.1.1 Mệnh đề FROM

Mệnh đề FROM câu lệnh SELECT sử dung nhằm định bảng khung nhìn cần truy xuất liệu Sau FROM danh sách tên bảng khung nhìn tham gia vào truy vấn, tên bảng khung nhìn phân cách dấu phẩy

Ví dụ 2.2: Câu lệnh hiển thị danh sách khoa trường

(20)

Ta sử dụng bí danh cho bảng hay khung nhìn câu lệnh SELECT Bí danh gán mệnh đề FROM cách định bí danh sau tên bảng

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

SELECT * FROM khoa a

2.1.2 Danh sách chọn câu lệnh SELECT

Danh sách chọn câu lệnh SELECT sử dụng để định trường, biểu thức cần hiển thị cột kết truy vấn Các trường, biểu thức định sau từ khoá SELECT phân cách dấu phẩy Sử dụng danh sách chọn câu lệnh SELECT bao gồm trường hợp sau:

a Chọn tất cột bảng

Khi cần hiển thị tất trường bảng, sử dụng ký tự * danh sách chọn thay phải liệt kê danh sách tất cột Trong trường hợp này, cột hiển thị kết truy vấn tuân theo thứ tự mà chúng tạo bảng định nghĩa

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

(21)

b Tên cột danh sách chọn

Trong trường hợp cần định cụ thể cột cần hiển thị kết truy vấn, ta định danh sách tên cột danh sách chọn Thứ tự cột kết truy vấn tuân theo thứ tự trường danh sách chọn

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

SELECT malop,tenlop,namnhaphoc,khoa FROM lop

cho biết mã lớp, tên lớp, năm nhập học khoá lớp có kết sau:

Lưu ý: Nếu truy vấn thực nhiều bảng/khung nhìn

bảng/khung nhìn có trường trùng tên tên trường xuất danh sách chọn phải viết dạng:

tên_bảng.tên_trường

Ví dụ 2.6:

SELECT malop, tenlop, lop.makhoa, tenkhoa FROM lop, khoa

(22)

c Thay đổi tiêu đề cột

Trong kết truy vấn, tiêu đề cột mặc định tên trường tương ứng bảng Tuy nhiên, để tiêu đề trở nên thân thiện hơn, ta đổi tên tiêu đề cột Để đặt tiêu đề cho cột đó, ta sử dụng cách viết: tiêu_đề_cột = tên_trường

hoặc tên_trường AS tiêu_đề_cột tên_trường tiêu_đề_cột

Ví dụ 2.7: Câu lệnh đây:

SELECT 'Mã lớp'= malop,tenlop 'Tên lớp',khoa AS 'Khoá' FROM lop

cho biết mã lớp, tên lớp khoá học lớp trường Kết câu lệnh sau:

d Sử dụng cấu trúc CASE danh sách chọn

Cấu trúc CASE sử dụng danh sách chọn nhằm thay đổi kết truy vấn tuỳ thuộc vào trường hợp khác Cấu trúc có cú pháp sau:

CASE biểu_thức

WHEN biểu_thức_kiểm_tra THEN kết_quả [ ]

[ELSE kết_quả_của_else] END

hoặc:

CASE

WHEN điều_kiện THEN kết_quả [ ]

(23)

Ví dụ 2.8: Để hiển thị mã, họ tên giới tính (nam nữ) sinh viên, ta sử

dụng câu lệnh

SELECT masv,hodem,ten, CASE gioitinh

WHEN THEN 'Nam' ELSE 'Nữ'

END AS gioitinh FROM sinhvien

hoặc:

SELECT masv,hodem,ten, CASE

WHEN gioitinh=1 THEN 'Nam' ELSE 'Nữ'

END AS gioitinh FROM sinhvien

Kết hai câu lệnh có dạng sau

e Hằng biểu thức danh sách chọn

Ngoài danh sách trường, danh sách chọn câu lệnh SELECT cịn sử dụng biểu thức Mỗi biểu thức danh sách chọn trở thành cột kết truy vấn

Ví dụ 2.9: câu lệnh cho biết tên số tiết môn học

(24)

Nếu danh sách chọn có xuất giá trị giá trị xuât cột kết truy vấn tất dịng

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

SELECT tenmonhoc,'Số tiết: ',sodvht*15 AS sotiet FROM monhoc

cho kết sau:

f Loại bỏ dòng liệu trùng kết truy vấn

Trong kết truy vấn xuất dòng liệu trùng Để loại bỏ bớt dòng này, ta định thêm từ khóa DISTINCT sau từ khố SELECT

Ví dụ 2.11: Hai câu lệnh

SELECT khoa FROM lop và:

(25)

g Giới hạn số lượng dòng kết truy vấn

Kết truy vấn hiển thị thường tất dòng liệu truy vấn Trong trường hợp cần hạn chế số lượng dòng xuất kết truy vấn, ta định thêm mệnh đề TOP trước danh sách chọn câu lệnh SELECT

Ví dụ 2.12: Câu lệnh hiển thị họ tên ngày sinh sinh viên

trong danh sách

SELECT TOP hodem,ten,ngaysinh FROM sinhvien

Ngoài cách định cụ số lượng dòng cần hiển thị kết truy vấn, ta định số lượng dịng cần hiển thị theo tỷ lệ phần trăm cách sử dụng thêm từ khố PERCENT ví dụ

Ví dụ 2.13: Câu lệnh hiển thị họ tên ngày sinh 10% số lượng sinh viên

hiện có bảng SINHVIEN

SELECT TOP 10 PERCENT hodem,ten,ngaysinh FROM sinhvien

2.1.3 Chỉ định điều kiện truy vấn liệu

Mệnh đề WHERE câu lệnh SELECT sử dụng nhằm xác định điều kiện việc truy xuất liệu Sau mệnh đề WHERE biểu thức logic dòng liệu thoả mãn điều kiện định hiển thị kết truy vấn

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

lớn

(26)

Kết câu lệnh sau:

Trong mệnh đề WHERE thường sử dụng:

• Các tốn tử kết hợp điều kiện (AND, OR) • Các tốn tử so sánh

• Kiểm tra giới hạn liệu (BETWEEN/ NOT BETWEEN) • Danh sách

• Kiểm tra khn dạng liệu • Các giá trị NULL

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

Toán tử ý nghĩa

= Bằng > Lớn < Nhỏ

>= Lớn <= Nhỏ <> Khác

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

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

SELECT masv,hodem,ten,ngaysinh FROM sinhvien

WHERE (ten='Anh')

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

(27)

b Kiểm tra giới hạn liệu

Để kiểm tra xem giá trị liệu nằm (ngoài) khoảng đó, ta sử dụng tốn tử BETWEEN (NOT BETWEEN) 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ụ 2.16: Câu lệnh cho biết họ tên tuổi sinh viên có tên Bình

và có tuổi nằm 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 NOT IN)

Từ khoá IN sử dụng ta cần định điều kiện tìm kiếm liệu cho câu lệnh SELECT danh sách giá trị Sau IN (hoặc NOT IN) danh sách giá trị câu lệnh SELECT khác

Ví dụ 2.17: Để biết danh sách mơn học có số đơn vị học trình 2, 5, thay

vì sử dụng câu lệnh

SELECT * FROM monhoc

WHERE sodvht=2 OR sodvht=4 OR sodvht=5 ta sử dụng câu lệnh

SELECT * FROM monhoc WHERE sodvht IN (2,4,5)

d Toán tử LIKE ký tự đại diện

(28)

Ký tự đại diện ý nghĩa

% Chuỗi ký tự gồm không nhiều ký tự _ Ký tự đơn

[] Ký tự đơn giới hạn định (ví dụ [a-f]) hay tập (ví dụ [abcdef])

[^] Ký tự đơn không nằm giới hạn định ( ví dụ [^a-f] hay tập (ví dụ [^abcdef])

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

SELECT hodem,ten FROM sinhvien WHERE hodem LIKE 'Lê%'

cho biết họ tên sinh viên có họ Lê có kết sau

Câu lệnh:

SELECT hodem,ten FROM sinhvien

WHERE hodem LIKE 'Lê%' AND ten LIKE '[AB]%' Có kết là:

e Giá trị NULL

(29)

• Nếu khơng có liệu nhập cho cột khơng có mặc định cho cột hay kiểu liệu cột

• Người sử dụng trực tiếp đưa giá trị NULL vào cho cột

• Một cột có kiểu liệu kiểu số chứa giá trị NULL giá trị định gây tràn số

Trong mệnh đề WHERE, để kiểm tra giá trị 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

2.1.4 Tạo bảng liệu từ kết câu lệnh SELECT

Câu lệnh SELECT INTO có tác dụng tạo bảng có cấu trúc liệu xác định từ kết truy vấn Bảng tạo có số cột số cột định danh sách chọn số dòng số dòng kết truy vấn

Ví dụ 2.19: Câu lệnh truy vấn liệu từ bảng SINHVIEN tạo bảng

TUOISV bao gồm trường HODEM, TEN TUOI

SELECT hodem,ten,YEAR(GETDATE())-YEAR(ngaysinh) AS tuoi INTO tuoisv

FROM sinhvien

Lưu ý: Nếu danh sách chọn có biểu thức biểu thức phải

đặt tiêu đề

2.1.5 Sắp xếp kết truy vấn

Mặc định, dòng liệu kết câu truy vấn tuân theo thứ tự chúng bảng liệu xếp theo mục (nếu bảng có mục) Trong trường hợp muốn liệu xếp theo chiều tăng giảm giá trị nhiều trường, ta sử dụng thêm mệnh đề ORDER BY câu lệnh SELECT; Sau ORDER BY danh sách cột cần xếp (tối đa 16 cột) Dữ liệu xếp theo chiều tăng (ASC) giảm (DESC), mặc định xếp theo chiều tăng

Ví dụ 2.20: Câu lệnh hiển thị danh sách môn học xếp theo chiều

(30)

Nếu sau ORDER BY có nhiều cột việc xếp liệu ư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 là:

Thay định tên cột sau ORDER BY, ta định số thứ tự cột cấn xếp Câu lệnh ví dụ viết lại sau:

SELECT hodem,ten,gioitinh,

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

(31)

2.1.6 Phép hợp

Phép hợp sử dụng trường hợp ta cần gộp kết hai hay nhiều truy vấn thành tập kết SQL cung cấp toán tử UNION để thực phép hợp Cú pháp 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ụ 2.22: Giả sử ta có hai bảng Table1 Table2 sau:

câu lệnh

SELECT A,B FROM Table1 UNION

(32)

Mặc định, truy vấn thành phần phép hợp xuất dịng liệu giống kết truy vấn giữ lại dòng Nếu muốn giữ lại dòng này, ta phải sử dụng thêm từ khoá ALL truy vấn thành phần

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

SELECT A,B FROM Table1 UNION ALL

SELECT D,E FROM table2 Cho kết sau

Khi sử dụng toán tử UNION để thực phép hợp, ta cần ý nguyên tắc sau: • Danh sách cột truy vấn thành phần phải có số lượng

• Các cột tương ứng tất bảng, tập cột sử dụng thân truy vấn thành phần phải kiểu liệu

• Các cột tương ứng thân truy vấn thành phần câu lệnh UNION phải xuất theo thứ tự Nguyên nhân phép hợp so sánh cột cột theo thứ tự cho truy vấn

• Khi kiểu liệu khác kết hợp với câu lệnh UNION, chúng chuyển sang kiểu liệu cao (nếu được) • Tiêu đề cột kết phép hợp tiêu đề cột định

(33)

• Truy vấn thành phần có INTO để tạo bảng từ kết phép hợp

• Mệnh đề ORDER BY COMPUTE dùng để xếp kết truy vấn tính tốn giá trị thống kê sử dụng cuối câu lệnh UNION Chúng không sử dụng truy vấn thành phần

• Mệnh đề GROUP BY HAVING sử dụng thân truy vấn thành phần Chúng không phép sử dụng để tác động lên kết chung phép hợp

• Phép tốn UNION sử dụng bên câu lệnh INSERT • Phép tốn UNION khơng sử dụng câu lệnh CREATE VIEW

2.1.7 Phép nối

Khi cần thực yêu cầu truy vấn liệu từ hai hay nhiều bảng, ta phải sử dụng đến phép nối Một câu lệnh nối kết hợp dòng liệu bảng khác lại theo nhiều điều kiện hiển thị chúng kết truy vấn

Xét hai bảng sau đây: Bảng KHOA

Bảng LOP

(34)

• Chọn dịng bảng KHOA có tên khoa Khoa Cơng nghệ Thơng tin, từ xác định mã khoa (MAKHOA) DHT02

• Tìm kiếm bảng LOP dịng có giá trị trường MAKHOA

DHT02 (tức MAKHOA tương ứng bảng KHOA) đưa

dòng vào kết truy vấn

Như vậy, để thực yêu cầu truy vấn liệu trên, ta phải thực phép nối hai bảng KHOA LOP với điều kiện nối MAKHOA KHOA với MAKHOA LOP Câu lệnh viết sau:

SELECT malop,tenlop FROM khoa,lop

WHERE khoa.makhoa = lop.makhoa AND

tenkhoa='Khoa Công nghệ Thông tin'

2.1.7.1 Sử dụng phép nối

Phép nối sở để thực yêu cầu truy vấn liệu liên quan đến nhiều bảng Một câu lệnh nối thực lấy dòng liệu bảng tham gia truy vấn, so sánh giá trị dòng nhiều cột định điều kiện nối kết hợp dòng thoả mãn điều kiện thành dòng kết truy vấn

Để thực phép nối, cần phải xác định yếu tố sau: • Những cột cần hiển thị kết truy vấn

• Những bảng có tham gia vào truy vấn

(35)

Trong yếu tố kể trên, việc xác định xác điều kiện để thực phép nối bảng đóng vai trị quan trọng Trong đa số trường hợp, điều kiện phép nối xác định nhờ vào mối quan hệ bảng cần phải truy xuất liệu Thơng thường, điều kiện khố khố ngồi hai bảng có mối quan hệ với Như vậy, để đưa câu lệnh nối thực xác yêu cầu truy vấn liệu đòi hỏi phải hiểu mối quan hệ ý nghĩa chúng bảng liệu

Danh sách chọn phép nối

Một câu lệnh nối bắt đầu với từ khóa SELECT Các cột định tên sau từ khoá SELECT cột hiển thị kết truy vấn Việc sử dụng tên cột danh sách chọn là:

• Tên số cột bảng có tham gia vào truy vấn Nếu tên cột bảng trùng tên tên cột phải viết dạng

tên_bảng.tên_cột

• Dấu (*) sử dụng danh sách chọn cần hiển thị tất cột bảng tham gia truy vấn

• Trong trường hợp cần hiển thị tất cột bảng đó, ta sử dụng cách viết:

tên_bảng.*

Mệnh đề FROM phép nối

Sau mệnh đề FROM câu lệnh nối danh sách tên bảng (hay khung nhìn) tham gia vào truy vấn Nếu ta sử dụng dấu * danh sách chọn thứ tự bảng liệt kê sau FROM ảnh hưởng đến thứ tự cột hiển thị kết truy vấn

Mệnh đề WHERE phép nối

Khi hai hay nhiều bảng nối với nhau, ta phải định điều kiện để thực phép nối sau mệnh đề WHERE Điều kiện nối biểu diễn dạng biểu thức logic so sánh giá trị liệu cột bảng tham gia truy vấn Các toán tử so sánh sử dụng để xác định điều kiện nối

Phép toán Ý nghĩa

= Bằng > Lớn

(36)

<= Nhỏ <> Khác

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

Ví dụ 2.24: Câu lệnh hiển thị danh sách sinh viên với thông tin: mã

sinh viên, họ tên, mã lớp, tên lớp tên khoa

SELECT masv,hodem,ten,sinhvien.malop,tenlop,tenkhoa FROM sinhvien,lop,khoa

WHERE sinhvien.malop = lop.malop AND lop.makhoa=khoa.makhoa

Trong câu lệnh trên, bảng tham gia vào truy vấn bao gồm SINHVIEN, LOP KHOA Điều kiện để thực phép nối bảng bao gồm hai điều kiện:

sinhvien.malop = lop.malop lop.malop = khoa.malop

Điều kiện nối bảng câu lệnh điều kiện khố ngồi khố bảng có mối quan hệ với Hay nói cách khác, điều kiện phép nối xác định dựa vào mối quan hệ bảng sở liệu

2.1.7.2 Các loại phép nối

Phép nối phép nối tự nhiên

Một phép nối (equi-join) phép nối giá trị cột sử dụng để nối so sánh với dựa tiêu chuẩn tất cột bảng tham gia nối đưa kết

Ví dụ 2.25: Câu lệnh thực phép nối hai bảng LOP KHOA

SELECT * FROM lop,khoa

WHERE lop.makhoa=khoa.makhoa

Trong kết câu lệnh trên, cột makhoa (mã khoa) xuất hai lần kết phép nối (cột makhoa bảng khoa cột makhoa bảng lop) không cần thiết Ta loại bỏ bớt cột trùng tên kết truy vấn cách định danh sách cột cần hiển thị danh sách chọn câu lệnh

(37)

Ví dụ 2.26: Để thực phép nối tự nhiên, câu lệnh ví dụ 2.25 viết lại

sau

SELECT malop,tenlop,khoa,hedaotao,namnhaphoc, siso,lop.makhoa,tenkhoa,dienthoai FROM lop,khoa

WHERE lop.makhoa=khoa.makhoa viết dạng ngắn gọn hơn:

SELECT lop.*,tenkhoa,dienthoai FROM lop,khoa

WHERE lop.makhoa=khoa.makhoa

Phép nối với điều kiện bổ sung

Trong câu lệnh nối, điều kiện phép nối định mệnh đề WHERE cịn định điều kiện tìm kiếm liệu khác (điều kiện chọn) Thông thường, điều kiện kết hợp với điều kiện nối thơng qua tốn tử AND

Ví dụ 2.27: Câu lệnh hiển thị họ tên ngày sinh sinh viên Khoa Công nghệ Thông tin

SELECT hodem,ten,ngaysinh FROM sinhvien,lop,khoa

WHERE tenkhoa='Khoa Công nghệ Thông tin' AND sinhvien.malop = lop.malop AND

lop.makhoa = khoa.makhoa

Phép tự nối bí danh

Phép tự nối phép nối mà điều kiện nối định liên quan đến cột bảng Trong trường hợp này, có xuất tên bảng nhiều lần mệnh đề FROM bảng cần phải đặt bí danh

Ví dụ 2.28: Để biết họ tên ngày sinh sinh viên có ngày sinh với

sinh viên Trần Thị Kim Anh, ta phải thực phép tự nối bảng

sinhvien Trong câu lệnh nối, bảng sinhvien xuất mệnh đề FROM với bí

danh a b Bảng sinhvien với bí danh a sử dụng để chọn sinh viên có họ tên

Trần Thị Kim Anh bảng sinhvien với bí danh b sử dụng để xác định sinh viên

trùng ngày sinh với sinh viên Trần Thị Kim Anh Câu lệnh viết sau: SELECT b.hodem,b.ten,b.ngaysinh

FROM sinhvien a, sinhvien b

(38)

Phép nối không dựa tiêu chuẩn

Trong phép nối này, điều kiện để thực phép nối bảng liệu điều kiện so sành cột Loại phép nối thực tế thường sử dụng

Phép nối ngồi (outer-join)

Trong phép nối đề cập trên, dịng có giá trị cột định thoả mãn điều kiện kết nối hiển thị kết truy vấn, gọi phép nối (inner join) Theo nghĩa đó, phép nối loại bỏ thơng tin chứa dịng khơng thoả mãn điều kiện nối Tuy nhiên, ta cần giữ lại thơng tin cách cho phép dịng khơng thoả mãn điều kiện nối có mặt kết phép nối Để làm điều này, ta sử dụng phép nối

SQL cung cấp loại phép nối sau đây:

• Phép nối ngồi trái (ký hiệu: *=): Phép nối hiển thị kết truy vấn tất dòng liệu bảng nằm bên trái điều kiện nối cho dù dịng khơng thoả mãn điều kiện phép nối

• Phép nối phải (ký hiệu: =*): Phép nối hiển thị kết truy vấn tất dòng liệu bảng nằm bên phải điều kiện nối cho dù dịng khơng thoả điều kiện phép nối

Ví dụ 2.29: Giả sử ta có hai bảng DONVI NHANVIEN sau:

Bảng DONVI Bảng NHANVIEN

Câu lệnh:

SELECT *

FROM nhanvien,donvi

(39)

Nếu thực phép nối trái bảng NHANVIEN bảng DONVI: SELECT *

FROM nhanvien,donvi

WHERE nhanvien.madv*=donvi.madv kết câu lệnh là:

Và kết phép nối phải: select *

from nhanvien,donvi

where nhanvien.madv=*donvi.madv sau:

Phép nối giá trị NULL

Nếu cột bảng tham gia vào điều kiện phép nối có giá trị NULL giá trị NULL xem khơng

Ví dụ 2.30: Giả sử ta có hai bảng TABLE1 TABLE2 sau: TABLE1 TABLE2

A B C D

1 b1 NULL d1

NULL b2 d2

(40)

Câu lệnh:

SELECT *

FROM table1, table2 WHERE A *= C

Có kết là:

A B C D

1 b1 NULL NULL

NULL b2 NULL NULL

4 b3 d2 2.1.7.4 Sử dụng phép nối SQL2

Ở phần trước đề cập đến phương pháp sử dụng phép nối phép nối truy vấn SQL Như trình bày, điều kiện phép nối câu lệnh định mệnh đề WHERE thông qua biểu thức so sánh bảng tham gia truy vấn

Chuẩn SQL2 (SQL-92) đưa cách khác để biểu diễn cho phép nối, cách biểu diễn này, điều kiện phép nối không định mệnh đề WHERE mà định mệnh đề FROM câu lệnh Cách sử dụng phép nối cho phép ta biểu diễn phép nối điều kiện nối rõ ràng, đặc biệt trường hợp phép nối thực ba bảng trở lên

Phép nối

Điều kiện để thực phép nối định mệnh đề FROM theo cú pháp sau:

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

Ví dụ 2.31: Để hiển thị họ tên ngày sinh sinh viên lớp Tin K24, thay sử

dụng câu lệnh:

SELECT hodem,ten,ngaysinh FROM sinhvien,lop

WHERE tenlop='Tin K24' AND sinhvien.malop=lop.malop ta sử dụng câu lệnh sau:

(41)

Phép nối

SQL2 cung cấp phép nối sau đây: • Phép nối ngồi trái (LEFT OUTER JOIN) • Phép nối ngồi phải (RIGHT OUTER JOIN) • Phép nối đầy đủ (FULL OUTER JOIN)

Cũng tương tự phép nối trong, điều kiện phép nối định 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ụ 2.32: Giả sử ta có hai bảng liệu sau:

Bảng DONVI Bảng NHANVIEN

Phép nối trái hai bảng NHANVIEN DONVI biểu diễn câu lệnh:

SELECT *

FROM nhanvien LEFT OUTER JOIN donvi ON nhanvien.madv=donvi.madv có kết là:

Câu lệnh:

SELECT *

(42)

thực phép nối phải hai bảng NHANVIEN DONVI, có kết là:

Nếu phép nối trái (tương ứng phải) hiển thị kết truy vấn dịng liệu khơng thoả điều kiện nối bảng bên trái (tương ứng phải) phép nối phép nối ngồi đầy đủ hiển thị kết truy vấn dòng liệu không thoả điều kiện nối hai bảng tham gia vào phép nối

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

SELECT *

FROM nhanvien FULL OUTER JOIN donvi ON nhanvien.madv=donvi.madv cho kết là:

Thực phép nối nhiều bảng

Một đặc điểm bật SQL2 cho phép biểu diễn phép nối nhiều bảng liệu cách rõ ràng Thứ tự thực phép nối bảng xác định theo nghĩa kết phép nối sử dụng phép nối khác

Ví dụ 2.34: Câu lệnh hiển thị họ tên ngày sinh sinh viên thuộc Khoa Công nghệ Thông tin

SELECT hodem,ten,ngaysinh

FROM (sinhvien INNER JOIN lop

(43)

Trong câu lệnh trên, thứ tự thực phép nối bảng định rõ ràng: phép nối hai bảng sinhvien lop thực trước kết phép nối này lại tiếp tục nối với bảng khoa

2.1.8 Thống kê liệu với GROUP BY

Ngoài khả thực yêu cầu truy vấn liệu thông thường (chiếu, chọn, nối,…) đề cập phần trước, câu lệnh SELECT cho phép thực thao tác truy vấn tính tốn thống kê liệu như: cho biết tổng số

tiết dạy giáo viên, điểm trung bình mơn học sinh viên,…

Mệnh đề GROUP BY sử dụng câu lệnh SELECT nhằm phân hoạch dịng liệu bảng thành nhóm liệu, nhóm liệu thực tính tốn giá trị thống kê tính tổng, tính giá trị trung bình,

Các hàm gộp sử dụng để tính giá trị thống kê cho tồn bảng nhóm liệu Chúng sử dụng cột danh sách chọn câu lệnh SELECT xuất mệnh đề HAVING, không phép xuất mệnh đề WHERE

SQL cung cấp hàm gộp đây:

Hàm gộp Chức

SUM([ALL | DISTINCT] biểu_thức) Tính tổng giá trị

AVG([ALL | DISTINCT] biểu_thức) Tính trung bình giá trị COUNT([ALL | DISTINCT] biểu_thức) Đếm số giá trị biểu thức COUNT(*) Đếm số dòng chọn MAX(biểu_thức) Tính giá trị lớn

MIN(biểu_thức) Tính giá trị nhỏ Trong đó:

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

• Hàm SUM, AVG, COUNT, MIN MAX bỏ qua giá trị NULL tính tốn

• Hàm COUNT(*) khơng bỏ qua giá trị NULL

(44)

Thống kê toàn liệu

Khi cần tính tốn giá trị thống kê toàn liệu, ta sử dụng hàm gộp danh sách chọn câu lệnh SELECT Trong trường hợp này, danh sách chọn không sử dụng tên cột hay biểu thức ngồi hàm gộp

Ví dụ 2.35: Để thống kê trung bình điểm lần tất môn học, ta sử dụng câu

lệnh sau:

SELECT AVG(diemlan1) FROM diemthi

còn câu lệnh cho biết tuổi lớn nhất, tuổi nhỏ độ tuổi trung bình tất cả sinh viên sinh Huế:

SELECT MAX(YEAR(GETDATE())-YEAR(ngaysinh)), MIN(YEAR(GETDATE())-YEAR(ngaysinh)), AVG(YEAR(GETDATE())-YEAR(ngaysinh)) FROM sinhvien

WHERE noisinh=’Huế’

Thống kê liệu nhóm

Trong trường hợp cần thực tính tốn giá trị thống kê nhóm liệu, ta sử dụng mệnh đề GROUP BY để phân hoạch liệu vào nhóm Các hàm gộp sử dụng thực thao tác tính tốn nhóm cho biết giá trị thống kê theo nhóm liệu

Ví dụ 2.36: Câu lệnh cho biết sĩ số (số lượng sinh viên) lớp

SELECT lop.malop,tenlop,COUNT(masv) AS siso FROM lop,sinhvien

WHERE lop.malop=sinhvien.malop GROUP BY lop.malop,tenlop

và có kết

(45)

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

cho biết trung bình điểm thi lần mơn học sinh viên

Lưu ý: Trong trường hợp danh sách chọn câu lệnh SELECT có hàm gộp

những biểu thức hàm gộp biểu thức phải có mặt đầy đủ mệnh đề GROUP BY, không câu lệnh khơng hợp lệ

Ví dụ 2.37: Dưới câu lệnh sai

SELECT lop.malop,tenlop,COUNT(masv) FROM lop,sinhvien

WHERE lop.malop=sinhvien.malop GROUP BY lop.malop

do thiếu trường TENLOP sau mệnh đề GROUP BY

Chỉ định điều kiện hàm gộp

Mệnh đề HAVING sử dụng nhằm định điều kiện giá trị thống kê sản sinh từ hàm gộp tương tự cách thức mệnh đề WHERE thiết lập điều kiện cho câu lệnh SELECT Mệnh đề HAVING thường không thực có nghĩa khơng sử dụng kết hợp với mệnh đề GROUP BY Một điểm khác biệt HAVING WHERE điều kiện WHERE khơng có hàm gộp HAVING lại cho phép sử dụng hàm gộp điều kiện

Ví dụ 2.38: Để biết trung bình điểm thi lần sinh viên có điểm trung bình lớn

hơn 5, ta sử dụng câu lệ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

(46)

2.1.9 Thống kê liệu với COMPUTE

Khi thực thao tác thống kê với GROUP BY, kết thống kê (được sản sinh hàm gộp) xuất cột kết truy vấn Thông qua dạng truy vấn này, ta biết giá trị thống kê nhóm liệu chi tiết liệu nhóm

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

SELECT khoa.makhoa,tenkhoa,COUNT(malop) AS solop FROM khoa,lop

WHERE khoa.makhoa=lop.makhoa GROUP BY khoa.makhoa,tenkhoa

cho ta biết số lượng lớp khoa với kết sau:

nhưng cụ thể khoa bao gồm lớp khơng thể biết kết truy vấn

Mệnh đề COMPUTE sử dụng kết hợp với hàm gộp (dòng) ORDER BY câu lệnh SELECT cho kết thống kê (của hàm gộp) nhóm liệu Điểm khác biệt COMPUTE GROUP BY kết thống kê xuất dạng dòng kết truy vấn cho chi tiết liệu nhóm Như vậy, câu lệnh SELECT với COMPUTE cho chi tiết liệu giá trị thống kê nhóm

Mệnh đề COMPUTE …BY có cú pháp sau:

COMPUTE hàm_gộp(tên_cột) [,…, hàm_gộp (tên_cột)] BY danh_sách_cột

Trong đó:

• Các hàm gộp sử dụng bao gồm SUM, AVG, MIN, MAX COUNT • danh_sách_cột: danh sách cột sử dụng để phân nhóm liệu

Ví dụ 2.40: Câu lệnh cho biết danh sách lớp khoa tổng số

các lớp khoa:

SELECT khoa.makhoa,tenkhoa,malop,tenlop FROM khoa,lop WHERE khoa.makhoa=lop.makhoa

ORDER BY khoa.makhoa

(47)

kết câu lệnh sau:

MAKHOA TENKHOA MALOP TENLOP DHT01 Khoa Toán - Tin học C24101 Toán K24 DHT01 Khoa Toán - Tin học C25101 Toán K25 DHT01 Khoa Toán - Tin học C26101 Toán K26

CNT

3

MAKHOA TENKHOA MALOP TENLOP DHT02 Khoa Công nghệ thông tin C26102 Tin K26 DHT02 Khoa Công nghệ thông tin C25102 Tin K25 DHT02 Khoa Công nghệ thông tin C24102 Tin K24

CNT

3

MAKHOA TENKHOA MALOP TENLOP

DHT03 Khoa Vật lý C24103 Lý K24 DHT03 Khoa Vật lý C25103 Lý K25

CNT

2

MAKHOA TENKHOA MALOP TENLOP

DHT05 Khoa Sinh học C25301 Sinh K25 DHT05 Khoa Sinh học C24301 Sinh K24

CNT

2

Khi sử dụng mệnh đề COMPUTE BY cần tuân theo qui tắc đây: • Từ khóa DISTINCT khơng cho phép sử dụng với hàm gộp dịng • Hàm COUNT(*) khơng sử dụng COMPUTE

• Sau COMPUTE sử dụng nhiều hàm gộp, hàm phải phân cách dấu phẩy

• Các cột sử dụng hàm gộp xuất mệnh đề COMPUTE phải có mặt danh sách chọn

• Khơng sử dụng SELECT INTO câu lệnh SELECT có sử dụng COMPUTE

(48)

Chẳng hạn mệnh đề ORDER BY có dạng: ORDER BY a, b, c

Thì mệnh đề COMPUTE BY với hàm gộp F cột X theo cách hợp lệ:

COMPUTE F(X) BY a, b, c COMPUTE F(X) BY a, b COMPUTE F(X) BY a

Và cách sử dụng sai: COMPUTE F(X) BY b, c COMPUTE F(X) BY a, c COMPUTE F(X) BY c

• Phải sử dụng tên cột biểu thức mệnh đề ORDER BY, việc xếp không thực dựa tiêu đề cột

Trong trường hợp sử dụng COMPUTE mà khơng có BY khơng cần sử dụng ORDER BY, phạm vi tính tốn hàm gộp tồn liệu

Ví dụ 2.41: Câu lệnh hiển thị danh sách lớp tổng số lớp có:

SELECT malop,tenlop,hedaotao FROM lop

ORDER BY makhoa

COMPUTE COUNT(malop) kết câu lệnh sau:

MALOP TENLOP HEDAOTAO C24101 Toán K24 Chính quy C25101 Tốn K25 Chính quy C26101 Tốn K26 Chính quy C26102 Tin K26 Chính quy C25102 Tin K25 Chính quy C24102 Tin K24 Chính quy C24103 Lý K24 Chính quy C25103 Lý K25 Chính quy C25301 Sinh K25 Chính quy C24301 Sinh K24 Chính quy CNT

10

(49)

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

SELECT khoa.makhoa,tenkhoa,malop,tenlop FROM khoa,lop WHERE khoa.makhoa=lop.makhoa

ORDER BY khoa.makhoa

COMPUTE COUNT(malop) BY khoa.makhoa COMPUTE COUNT(malop)

Cho biết danh sách lớp khoa, tổng số lớp theo khoa tổng số lớp có với kết sau:

MAKHOA TENKHOA MALOP TENLOP DHT01 Khoa Toán - Tin học C24101 Toán K24 DHT01 Khoa Toán - Tin học C25101 Toán K25 DHT01 Khoa Toán - Tin học C26101 Toán K26

CNT

3

MAKHOA TENKHOA MALOP TENLOP DHT02 Khoa Công nghệ thông tin C26102 Tin K26 DHT02 Khoa Công nghệ thông tin C25102 Tin K25 DHT02 Khoa Công nghệ thông tin C24102 Tin K24

CNT

3

MAKHOA TENKHOA MALOP TENLOP

DHT03 Khoa Vật lý C24103 Lý K24 DHT03 Khoa Vật lý C25103 Lý K25

CNT

2

MAKHOA TENKHOA MALOP TENLOP

DHT05 Khoa Sinh học C25301 Sinh K25 DHT05 Khoa Sinh học C24301 Sinh K24

CNT

2

CNT

10

2.1.10 Truy vấn (Subquery)

(50)

truy vấn sử dụng để biểu diễn cho truy vấn điều kiện truy vấn liệu cần phải sử dụng đến kết truy vấn khác

Cú pháp truy vấn sau:

(SELECT [ALL | DISTINCT] danh_sách_chọn FROM danh_sách_bảng

[WHERE điều_kiện] [GROUP BY danh_sách_cột] [HAVING điều_kiện])

Khi sử dụng truy vấn cần lưu ý số quy tắc sau:

• Một truy vấn phải viết cặp dấu ngoặc Trong hầu hết trường hợp, truy vấn thường phải có kết cột (tức có cột danh sách chọn)

• Mệnh đề COMPUTE ORDER BY khơng phép sử dụng truy vấn

• Các tên cột xuất truy vấn cột bảng truy vấn ngồi

• Một truy vấn thường sử dụng làm điều kiện mệnh đề WHERE HAVING truy vấn khác

• Nếu truy vấn trả giá trị, sử dụng thành phần bên biểu thức (chẳng hạn xuất phép so sánh bằng)

Phép so sánh với kết truy vấn

Kết truy vấn sử dụng đề thực phép so sánh số học với biểu thức truy vấn cha Trong trường hợp này, truy vấn sử dụng dạng:

WHERE biểu_thức phép_tốn_số_học [ANY|ALL] (truy_vấn_con)

Trong phép tốn số học sử dụng bao gồm: =, <>, >, <, >=, <=; Và truy vấn phải có kết bao gồm cột

Ví dụ 2.43: Câu lệnh cho biết danh sách mơn học có số đơn vị học trình

lớn số đơn vị học trình mơn học có mã TI-001 SELECT *

FROM monhoc

(51)

WHERE mamonhoc='TI-001')

Nếu truy vấn trả nhiều giá trị, việc sử dụng phép so sánh không hợp lệ Trong trường hợp này, sau phép toán so sánh phải sử dụng thêm lượng từ ALL ANY Lượng từ ALL sử dụng cần so sánh giá trị biểu thức với tất giá trị trả kết truy vấn con; ngược lai, phép so sánh với lượng từ ANY có kết cần giá trị kết truy vấn thoả mãn điều kiện

Ví dụ 2.44: Câu lệnh cho biết họ tên sinh viên lớp Tin K25 sinh

trước tất sinh viên lớp Toán K25 SELECT hodem,ten

FROM sinhvien JOIN lop ON sinhvien.malop=lop.malop WHERE tenlop='Tin K25' AND

ngaysinh<ALL(SELECT ngaysinh

FROM sinhvien JOIN lop

ON sinhvien.malop=lop.malop WHERE lop.tenlop='Toán K25') câu lệnh:

SELECT hodem,ten

FROM sinhvien JOIN lop on sinhvien.malop=lop.malop WHERE tenlop='Tin K25' AND

year(ngaysinh)= ANY(SELECT year(ngaysinh) FROM sinhvien JOIN lop ON sinhvien.malop=lop.malop WHERE lop.tenlop='Toán K25') cho biết họ tên sinh viên lớp Tin K25 có năm sinh trùng với năm sinh bất kỳ sinh viên lớp Tốn K25

Sử dụng truy vấn với toán tử IN

Khi cần thực phép kiểm tra giá trị biểu thức có xuất (khơng xuất hiện) tập giá trị truy vấn hay khơng, ta sử dụng tốn tử IN (NOT IN) sau:

WHERE biểu_thức [NOT] IN (truy_vấn_con)

Ví dụ 2.45: Để hiển thị họ tên sinh viên lớp Tin K25 có năm sinh với

năm sinh sinh viên lớp Tốn K25, thay sử dụng câu lệnh ví dụ trên, ta sử dụng câu lệnh sau:

(52)

FROM sinhvien JOIN lop on sinhvien.malop=lop.malop WHERE tenlop='Tin K25' AND

year(ngaysinh)IN(SELECT year(ngaysinh) FROM sinhvien JOIN lop ON sinhvien.malop=lop.malop WHERE lop.tenlop='Toán K25')

Sử dụng lượng từ EXISTS với truy vấn

Lượng từ EXISTS sử dụng kết hợp với truy vấn dạng: WHERE [NOT] EXISTS (truy_vấn_con)

để kiểm tra xem truy vấn có trả dịng kết hay khơng Lượng từ EXISTS (tương ứng NOT EXISTS) trả giá trị True (tương ứng False) kết truy vấn có dịng (tương ứng khơng có dòng nào) Điều khác biệt việc sử dụng EXISTS với hai cách nêu danh sách chọn truy vấn có nhiều hai cột

Ví dụ 2.46: Câu lệnh cho biết họ tên sinh viên chưa có điểm

thi môn học SELECT hodem,ten FROM sinhvien

WHERE NOT EXISTS(SELECT masv FROM diemthi

WHERE diemthi.masv=sinhvien.masv)

Sử dụng truy vấn với mệnh đề HAVING

Một truy vấn sử dụng mệnh đề HAVING truy vấn khác Trong trường hơp này, kết truy vấn sử dụng để tạo nên điều kiện hàm gộp

Ví dụ 2.47: Câu lệnh cho biết mã, tên trung bình điểm lần mơn

học có trung bình lớn trung bình điểm lần tất môn học SELECT diemthi.mamonhoc,tenmonhoc,AVG(diemlan1) FROM diemthi,monhoc

WHERE diemthi.mamonhoc=monhoc.mamonhoc GROUP BY diemthi.mamonhoc,tenmonhoc HAVING AVG(diemlan1)>

(53)

2.2 Bổ sung, cập nhật xoá liệu

Các câu lệnh thao tác liệu SQL sử dụng để truy vấn liệu mà để thay đổi cập nhật liệu sở liệu So với câu lệnh SELECT, việc sử dụng câu lệnh để bổ sung, cập nhật hay xoá liệu đơn giản nhiều Trong phần lại chương đề cập đến câu lệnh:

• Lệnh INSERT • Lệnh UPDATE • Lệnh DELETE

2.2.1 Bổ sung liệu

Dữ liệu bảng thể dạng dòng (bản ghi) Để bổ sung thêm dòng liệu vào bảng, ta sử dụng câu lệnh INSERT Hầu hết hệ quản trị CSDL dựa SQL cung cấp cách để thực thao tác bổ sung liệu cho bảng:

• Bổ sung dịng liệu với câu lệnh INSERT Đây sử dụng thường gặp giao tác SQL

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

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

Để bổ sung dòng liệu vào bảng, ta sử dụng câu lệnh INSERT với cú pháp 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 sau tên bảng không cần thiết phải định giá trị trường ghi định đầy đủ danh sách trị Trong trường hợp này, thứ tự giá trị danh sách trị phải với số lượng trường bảng cần bổ sung liệu phải tuân theo thứ tự trường bảng định nghĩa

Ví dụ 2.48: Câu lệnh bổ sung thêm dòng liệu vào bảng KHOA

INSERT INTO khoa

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

(54)

phép chấp nhận giá trị NULL) Nếu cột khơng có giá trị mặc định khơng chấp nhận giá trị NULL mà không đuợc nhập liệu, câu lệnh bị lỗi

Ví dụ 2.49: Câu lệnh bổ sung ghi 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 cịn viết sau:

INSERT INTO sinhvien

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

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

Một cách sử dụng khác câu lệnh INSERT sử dụng để bổ sung nhiều dòng liệu vào bảng, dòng liệu lấy từ bảng khác thông qua câu lệnh SELECT Ở cách này, giá trị liệu bổ sung vào bảng không định tường minh mà thay vào câu lệnh SELECT truy vấn liệu từ bảng khác

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

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

Ví dụ 2.50: Giả sử ta có bảng LUUSINHVIEN bao gồm trường HODEM, TEN,

NGAYSINH Câu lệnh bổ sung vào bảng LUUSINHVIEN dịng liệu có từ câu truy vấn SELECT:

INSERT INTO luusinhvien SELECT hodem,ten,ngaysinh FROM sinhvien

WHERE noisinh like ‘%Huế%’

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

• Kết câu lệnh SELECT phải có số cột với số cột định bảng đích phải tương thích kiểu liệu

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

2.2.2 Cập nhật liệu

Câu lệnh UPDATE SQL sử dụng để cập nhật liệu bảng Câu lệnh có cú pháp sau:

(55)

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 tên bảng cần cập nhật liệu Một câu lệnh UPDATE cập nhật liệu cho nhiều cột cách định danh sách tên cột biểu thức tương ứng sau từ khoá SET Mệnh đề WHERE câu lệnh UPDATE thường sử dụng để định dòng liệu chịu tác động câu lệnh (nếu không định, phạm vi tác động câu lệnh hiểu tồn dịng bảng)

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

đơn vị học trình nhỏ UPDATE monhoc

SET sodvht = WHERE sodvht =

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

Cấu trúc CASE sử dụng biểu thức cần phải đưa định khác giá trị biểu thức

Ví dụ 2.52: Giả sử ta có bảng NHATKYPHONG sau

Sau thực câu lệnh:

UPDATE nhatkyphong

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

ELSE 50

(56)

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

Mệnh đề FROM câu lệnh UPDATE sử dụng cần định điều kiện liên quan đến bảng khác với bảng cần cập nhật liệu Trong truờng hợp này, mệnh đề WHERE thường có điều kiện nối bảng

Ví dụ 2.53: Giả sử ta có hai bảng MATHANG NHATKYBANHANG sau:

Câu lệnh cập nhật giá trị trường THANHTIEN bảng NHATKYBANHANG theo công thức THANHTIEN = SOLUONG × GIA

UPDATE nhatkybanhang SET thanhtien = soluong*gia FROM mathang

WHERE nhatkybanhang.mahang = mathang.mahang

Câu lệnh UPDATE với truy vấn

Tương tự câu lệnh SELECT, truy vấn sử dụng mệnh đề WHERE câu lệnh UPDATE nhằm định điều kiện dòng liệu cần cập nhật liệu

Ví dụ 2.54: Câu lệnh viết sau:

UPDATE nhatkybanhang

SET thanhtien = soluong*gia FROM mathang

WHERE mathang.mahang =(SELECT mathang.mahang FROM mathang

WHERE mathang.mahang=nhatkybanhang.mahang)

2.2.3 Xoá liệu

Để xoá liệu bảng, ta sử dụng câu lệnh DELETE Cú pháp câu lệnh sau:

(57)

Trong câu lệnh này, tên bảng cần xoá liệu định sau DELETE FROM Mệnh đề WHERE câu lệnh sử dụng để định điều kiện dịng liệu cần xố Nếu câu lệnh DELETE khơng có mệnh đề WHERE tồn dịng liệu bảng bị xố

Ví dụ 2.55: Câu lệnh xố khỏi bảng SINHVIEN sinh viên sinh Huế

DELETE FROM sinhvien

WHERE noisinh LIKE ‘%Huế%’

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

Nếu điều kiện câu lệnh DELETE liên quan đến bảng bảng cần xóa liệu, ta phải sử dụng thêm mệnh đề FROM sau danh sách tên bảng Trong trường hợp này, mệnh đề WHERE ta định thêm điều kiện nối bảng

Ví dụ 2.56: Câu lệnh xố khỏi bảng SINHVIEN 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 câu lệnh DELETE

Một câu lệnh SELECT lồng vào mệnh đề WHERE câu lệnh DELETE để làm điều kiện cho câu lệnh tương tự câu lệnh UPDATE

Ví dụ 2.57: Câu lệnh xoá khỏi bảng LOP lớp khơng có sinh viên

học

DELETE FROM lop

WHERE malop NOT IN (SELECT DISTINCT malop FROM sinhvien)

Xố tồn liệu bảng

Câu lệnh DELETE khơng định điều kiện dịng liệu cần xoá mệnh đề WHERE xoá tồn liệu bảng Thay sử dụng câu lệnh DELETE trường hợp này, ta sử dụng câu lệnh TRUNCATE có cú pháp sau:

TRUNCATE TABLE tên_bảng

Ví dụ 2.58: Câu lệnh sau xố tồn liệu bảng diemthi:

DELETE FROM diemthi có tác dụng tương tự với câu lệnh

(58)

Bài tập chương

Cơ sở liệu sử dụng để quản lý công tác giao hàng công ty kinh doanh Các bảng sở liệu biểu diễn sơ đồ đây:

rong đó:

ảng NHACUNGCAP lưu trữ liệu đối tác cung cấp hàng cho • THANG lưu trữ liệu mặt hàng có cơng ty

hân viên làm việc • ACHHANG sử dụng để lưu giữ thơng tin khách hàng

của công ty T

• B

cơng ty Bảng MA

• Bảng LOAIHANG phân loại mặt hàng có • Bảng NHANVIEN có liệu thơng tin n

(59)

• Khách hàng đặt hàng cho công ty thông qua đơn đặt hàng Thông tin chung đơn đặt hàng lưu trữ bảng DONDATHANG (Mỗi

ITIETDATHANG Bảng có quan hệ

Sử dụng c liệu sau đây: Cho biết danh sách đối tác cung cấp hàng cho công ty

g ty cơng ty

ì?

n có

2 ệt Tiến cung cấp mặt hàng nào?

địa công ty

đâu?

cơ + phụ cấp)

iêu (số tiền phải trả tính theo cơng thức 13

2 15 hàng công ty đặt hàng

ông ty

2 17 Những mặt hàng chưa khách hàng đặt mua?

một đơn đặt hàng phải nhân viên cơng ty lập bảng có quan hệ với bảng NHANVIEN)

Thông tin chi tiết đơn đặt hàng (đặt mua mặt hàng gì, số lượng, giá cả, ) lưu trữ bảng CH

với hai bảng DONDATHANG MATHANG âu lệnh SELECT để viết yêu cầu truy vấn

2 Mã hàng, tên hàng số lượng mặt hàng có Họ tên địa năm bắt đầu làm việc nhân viên

2 Địa điện thoại nhà cung cấp có tên giao dịch VINAMILK g Cho biết mã tên mặt hàng có giá lớn 100000 số lượng hiệ

ít 50

2 Cho biết mặt hàng công ty cung cấp Công ty Vi

2 Loại hàng thực phẩm công ty cung cấp gì?

2 Những khách hàng (tên giao dịch) đặt mua mặt hàng Sữa hộp XYZ công ty?

2 10 Đơn đặt hàng số đặt nhân viên lập, thời gian địa điểm giao hàng

2 11 Hãy cho biết số tiền lương mà công ty phải trả cho nhân viên (lương = lương

2 12 Trong đơn đặt hàng số đặt mua mặt hàng số tiền mà khách hàng phải trả cho mặt hàng bao nh

SOLUONG×GIABAN – SOLUONG×GIABAN×MUCGIAMGIA/100)

Hãy cho biết có khách hàng lại đối tác cung cấp hàng công ty (tức có tên giao dịch)

2 14 Trong cơng ty có nhân viên có ngày sinh? Những đơn đặt hàng yêu cầu giao

đơn cơng ty nào?

(60)

2 18 Những nhân viên công ty chưa lập hoá đơn đặt hàng nào?

2 19 Những nhân viên công ty có lương cao nhất?

2 21 năm 2003, mặt hàng đặt mua lần

n để đặt mua hàng hân viên 24 số tiền hàng mà cửa hàng thu tháng năm 2003 25 c từ mặt hàng năm 26 i mặt hàng mà cơng ty có (tổng số 27 iên công ty bán số lượng hàng nhiều số lượng hàng 28 àng đặt mua nhất?

ố tiền mà đơn 31 loại hàng bao gồm mặt hàng nào, tổng số lượng

quả hiển thị dạng bảng, hai cột cột đầu mã hàng ượng hàng bán tháng

Sử dụn

2 33 g NGAYCHUYENHANG ghi có NGAYCHUYENHANG chưa xác định (NULL) bảng DONDATHANG 20 Tổng số tiền mà khách hàng phải trả cho đơn đặt hàng bao nhiêu?

Trong

2 22 Hãy cho biết khách hàng phải bỏ tiề công ty?

2 23 Mỗi nhân viên công ty lập đơn đặt hàng (nếu n chưa lập hố đơn cho kết 0)

Cho biết tổng

(thời gian tính theo ngày đặt hàng)

Hãy cho biết tổng số tiền lời mà công ty thu đượ 2003

Hãy cho biết tổng số lượng hàng mỗ lượng hàng có bán)

Nhân v

bán nhân viên bao nhiêu? Đơn đặt hàng có số lượng h

2 29 Số tiền nhiều mà khách hàng bỏ để đặt hàng đơn đặt hàng bao nhiêu?

2 30 Mỗi đơn đặt hàng đặt mua mặt hàng tổng s đặt hàng phải trả bao nhiêu?

Hãy cho biết

hàng loại tổng số lượng tất mặt hàng có công ty bao nhiêu?

2 32 Thống kê xem năm 2003, mặt hàng tháng năm bán với số lượng

Yêu cầu: Kết

tên hàng, cột lại tương ứng với tháng từ đến 12 năm Như dòng kết cho biết số l

cả năm mặt hàng

g câu lệnh UPDATE để thực yêu cầu sau: Cập nhật lại giá trị trườn

(61)

2 34 Tăng số lượng hàng mặt hàng công ty VINAMILK cung cấp lên gấp đôi

Cập nhật giá trị trường NOIGIAOHANG tro

2 35 ng bảng DONDATHANG trị trường NOIGIAOHANG NULL)

hải giống

2 38 àng nhiều

2 39 ng nhân viên năm 2003 không lập 40 bảng DONDATHANG có thêm trường SOTIEN cho biết số tiền

2 41 năm

sở liệu

2 44 hỏi bảng KHACHHANG khách hàng khơng có đơn đặt ng

ruy vấn sử dụng cú pháp QL2

macongty,tencongty,tengiaodich

LECT mahang,tenhang,soluong

r(ngaylamviec) AS namlamviec

địa khách hàng đơn đặt hàng chưa xác định nơi giao hàng (giá

2 36 Cập nhật lại liệu bảng KHACHHANG cho tên công ty tên giao dịch khách hàng trùng với tên công ty tên giao dịch nhà cung cấp địa chỉ, điện thoại, fax e-mail p

2 37 Tăng lương lên gấp rưỡi cho nhân viên bán số lượng hàng nhiều 100 năm 2003

Tăng phụ cấp lên 50% lương cho nhân viên bán h

Giảm 25% lương nhữ đơn đặt hàng

Giả sử

mà khách hàng phải trả đơn đặt hàng Hãy tính giá trị cho trường Thực yêu cầu câu lệnh DELETE

Xoá khỏi bảng NHANVIEN nhân viên làm việc công ty 40 42 Xoá đơn đặt hàng trước năm 2000 khỏi

2 43 Xoá khỏi bảng LOAIHANG loại hàng khơng có mặt hàng Xố k

hàng cho cơng ty

2 45 Xố khỏi bảng MATHANG mặt hàng có số lượng khô đặt mua đơn đặt hàng

# Lời giải:

Các phép nối sử dụng t S

2.1 SELECT

FROM nhacungcap 2.2 SE

(62)

2.4 SELECT diachi,dienthoai ch='VINAMILK' ng<50 cap.macongty,tencongty,tengiaodich y=nhacungcap.macongty iến' encongty,diachi athang.maloaihang) macongty athang.mahang) sohoadon) g=khachhang.makhachhang

10 C ,ho,ten,

dondathang

g.manhanvien

N phucap IS NULL THEN

luong

OM anv n FROM nhacungcap WHERE tengiaodi

2.5 SELECT mahang,tenhang FROM mathang

WHERE giahang>100000 AND soluo 2.6 SELECT mahang,tenhang,

nhacung

FROM mathang INNER JOIN nhacungcap ON mathang.macongt

2.7 SELECT mahang,tenhang

FROM mathang INNER JOIN nhacungcap

ON mathang.macongty=nhacungcap.macongty WHERE tencongty='Việt T

2.8 SELECT DISTINCT nhacungcap.macongty,t FROM (loaihang INNER JOIN mathang ON loaihang.maloaihang=m

INNER JOIN nhacungcap

ON mathang.macongty=nhacungcap WHERE tenloaihang='Thực phẩm'

2 SELECT DISTINCT tengiaodich

FROM ((mathang INNER JOIN chitietdathang ON mathang.mahang=chitietd

INNER JOIN dondathang

ON chitietdathang.sohoadon=dondathang INNER JOIN khachhang

ON dondathang.makhachhan WHERE tenhang='Sữa hộp'

2 SELE T dondathang.manhanvien ngaygiaohang,noigiaohang FROM nhanvien INNER JOIN

ON nhanvien.manhanvien=dondathan WHERE sohoadon=1

2.1 SELECT manhanvien,ho,ten, luongcoban + CASE

WHE

ELSE phucap END AS

FR nh ie

(63)

a.soluong*giaban*(1-mucgiamgia/100) AS sotien hang AS a INNER JOIN mathang AS b

hacungcap

.tengiaodich

4 LEC ngaysinh

5

OM

g.diachi

6 LEC chi,dienthoai

7 ng,tenhang

(SELECT mahang FROM chitietdathang mahang=mathang.mahang)

8 en,ho,ten

ERE OT IST ang

nhanvien=nhanvien.manhanvien) en,ho,ten,luongcoban

.makhachhang, y,tengiaodich, ondathang.makhachhang) ng.sohoadon thang.sohoadon FROM chitietdat ON a.mahang=b.mahang

2.1 SELECT makhachhang,khachhang.tencongty, khachhang.tengiaodich

FROM khachhang INNER JOIN n

ON khachhang.tengiaodich=nhacungcap 2.1 SE T a.ho,a.ten,b.ho,b.ten,b

FROM nhanvien a INNER JOIN nhanvien b ON a.ngaysinh=b.ngaysinh AND

a.manhanvien<>b.manhanvien 2.1 SELECT sohoadon,tencongty,tengiaodich, ngaydathang,noigiaohang

FR dondathang INNER JOIN khachhang ON dondathang.noigiaohang=khachhan 2.1 SE T tencongty,tengiaodich,dia

FROM khachhang UNION ALL

SELECT tencongty,tengiaodich,diachi,dienthoai FROM nhacungcap

2.1 SELECT maha FROM mathang WHERE NOT EXISTS

WHERE

2.1 SELECT manhanvi FROM nhanvien

WH N EX S (SELECT manhanvien FROM dondath WHERE ma

2.1 SELECT manhanvi FROM nhanvien

WHERE luongcoban=(SELECT MAX(luongcoban) FROM nhanvien) 2.20 SELECT dondathang.sohoadon,dondathang

tencongt

SUM(soluong*giaban-soluong*giaban*mucgiamgia/100) FROM (khachhang INNER JOIN dondathang

ON khachhang.makhachhang=d INNER JOIN chitietdathang

ON dondathang.sohoadon=chitietdatha

(64)

2.21 SELECT mathang.mahang,tenhang

g.sohoadon

UP g

2 encongty,tengiaodich, giaban*mucgiamgia/100)

ang) ang.sohoadon LEC ,COUNT(sohoadon)

4 ) hang athang.sohoadon 25 ng*giaban*mucgiamgia/100)- ER JOIN chitietdathang AS b

c

26 C ng,

ng.soluong) IS NULL THEN athang.soluong)

tongsoluong

FROM (mathang INNER JOIN chitietdathang

ON mathang.mahang=chitietdathang.mahang) iNNER JOIN dondathang

ON chitietdathang.sohoadon=dondathan WHERE YEAR(ngaydathang)=2003

GRO BY mathang.mahang,tenhan

HAVING COUNT(chitietdathang.mahang)=1 2.2 SELECT khachhang.makhachhang,t

SUM(soluong*giaban-soluong*

FROM (khachhang INNER JOIN dondathang

ON khachhang.makhachhang = dondathang.makhachh INNER JOIN chitietdathang

ON dondathang.sohoadon=chitietdath

GROUP BY khachhang.makhachhang,tencongty,tengiaodich 2.2 SE T nhanvien.manhanvien,ho,ten

FROM nhanvien LEFT OUTER JOIN dondathang

ON nhanvien.manhanvien=dondathang.manhanvien GROUP BY nhanvien.manhanvien,ho,ten

2.2 SELECT MONTH(ngaydathang) AS thang,

SUM(soluong*giaban-soluong*giaban*mucgiamgia/100 FROM dondathang INNER JOIN chitietdat

ON dondathang.sohoadon=chitietd WHERE year(ngaydathang)=2003

GROUP BY month(ngaydathang) SELECT c.mahang,tenhang,

SUM(b.soluong*giaban-b.soluo SUM(b.soluong*giahang)

FROM (dondathang AS a INN

ON a.sohoadon=b.sohoadon) INNER JOIN mathang AS

ON b.mahang=c.mahang WHERE YEAR(ngaydathang)=2003 GROUP BY c.mahang,tenhang SELE T mathang.mahang,tenha

mathang.soluong + CASE

WHEN SUM(chitietdatha ELSE SUM(chitietd

(65)

FROM mathang LEFT OUTER JOIN chitietdathang ON mathang.mahang=chitietdathang.mahang GROUP BY mathang.mahang,tenhang,mathang.soluong

7 )

n) hang.sohoadon N m(soluong) dathang.manhanvien) sohoadon 28 ohoadon on=chitietdathang.sohoadon

OM thang

hang.sohoadon=chitietdathang.sohoadon

AS a INNER JOIN chitietdathang AS b

n ihang,tenloaihang,

aihang 2.2 SELECT nhanvien.manhanvien,ho,ten,sum(soluong

FROM (nhanvien INNER JOIN dondathang

ON nhanvien.manhanvien=dondathang.manhanvie INNER JOIN chitietdathang

ON dondathang.sohoadon=chitietdat GROUP BY nhanvien.manhanvien,ho,ten HAVI G sum(soluong)>=ALL(SELECT su

FROM (nhanvien INNER JOIN dondathang ON nhanvien.manhanvien=don

INNER JOIN chitietdathang ON

dondathang.sohoadon=chitietdathang GROUP BY nhanvien.manhanvien,ho,ten) SELECT dondathang.sohoadon,SUM(soluong) FROM dondathang INNER JOIN chitietdathang

ON dondathang.sohoadon=chitietdathang.s GROUP BY dondathang.sohoadon

HAVING sum(soluong)<=ALL(SELECT sum(soluong)

FROM dondathang INNER JOIN chitietdathang ON dondathang.sohoad

GROUP BY dondathang.sohoadon) 2.2 SELECT TOP

SUM(soluong*giaban-soluong*giaban*mucgiamgia/100) FR dondathang INNER JOIN chitietda

ON dondat ORDER BY DESC

2.3 SELECT a.sohoadon,b.mahang,tenhang,

b.soluong*giaban-b.soluong*giaban*mucgiamgia/100 FROM (dondathang

ON a.sohoadon = b.sohoadon)

INNER JOIN mathang AS c ON b.mahang = c.mahang ORDER BY a.sohoadon

COMPUTE SUM(b.soluong*giaban-

b.soluong*giaban*mucgiamgia/100) BY a.sohoado 2.3 SELECT loaihang.maloa

mahang,tenhang,soluong FROM loaihang INNER JOIN mathang

(66)

ORDER BY loaihang.maloaihang

COMPUTE SUM(soluong) BY loaihang.maloaihang

b.soluong AS Thang1,

dathang) WHEN THEN b.soluong UM( WHEN THEN b.soluong UM( WHEN THEN b.soluong UM( WHEN THEN b.soluong UM( WHEN THEN b.soluong UM( WHEN THEN b.soluong UM( WHEN THEN b.soluong UM( WHEN THEN b.soluong UM( WHEN 10 THEN b.soluong UM( WHEN 11 THEN b.soluong UM( HEN 12 THEN b.soluong

N b.mahang=c.mahang

3

thang WHERE ngaychuyenhang IS NULL COMPUTE SUM(soluong)

2.3 SELECT b.mahang,tenhang,

SUM(CASE MONTH(ngaydathang) WHEN THEN ELSE END)

SUM(CASE MONTH(ngay

ELSE END) AS Thang2, S CASE MONTH(ngaydathang) ELSE END) AS Thang3,

S CASE MONTH(ngaydathang) ELSE END) AS Thang4,

S CASE MONTH(ngaydathang) ELSE END) AS Thang5,

S CASE MONTH(ngaydathang) ELSE END) AS Thang6,

S CASE MONTH(ngaydathang) ELSE END) AS Thang7,

S CASE MONTH(ngaydathang) ELSE END) AS Thang8,

S CASE MONTH(ngaydathang) ELSE END) AS Thang9,

S CASE MONTH(ngaydathang) ELSE END) AS Thang10, S CASE MONTH(ngaydathang) ELSE END) AS Thang11, S CASE MONTH(ngaydathang) W ELSE END) AS Thang12,

SUM(b.soluong) AS CaNam

FROM (dondathang AS a INNER JOIN chitietdathang AS b ON a.sohoadon=b.sohoadon)

INNER JOIN mathang AS c O WHERE YEAR(ngaydathang)=1996 GROUP BY b.mahang,tenhang 2.3 UPDATE dondathang

SET ngaychuyenhang = ngayda

2.34 UPDATE mathang

(67)

FROM nhacungcap

WHERE nhacungcap.macongty=mathang.macongty AND LK' akhachhang=khachhang.makhachang AND L nhacungcap.dienthoai, x = nhacungcap.fax,

RE tencongty AND

tengiaodich hanvien chitietdathang ohoadon=chitietdathang.sohoadon vien.manhanvien hanvien

R JOIN chitietdathang

oadon=chitietdathang.sohoadon

R JOIN chitietdathang

itietdathang.sohoadon 39

tencongty='VINAMI 2.3 UPDATE dondathang

SET noigiaohang=diachi FROM khachhang

WHERE dondathang.m

noigiaohang IS NUL 2.3 UPDATE khachhang

SET khachhang.diachi = nhacungcap.diachi, khachhang.dienthoai =

khachhang.fa

khachhang.email = nhacungcap.email FROM nhacungcap

WHE khachhang.tencongty = nhacungcap khachhang.tengiaodich = nhacungcap 2.3 UPDATE nhanvien

SET luongcoban=luongcoban*1.5 WHERE manhanvien =

(SELECT man

FROM dondathang INNER JOIN ON dondathang.s

WHERE manhanvien=nhan GROUP BY manhanvien HAVING SUM(soluong)>100) 2.38 UPDATE nhanvien

SET phucap=luongcoban/2 WHERE manhanvien IN (SELECT man

FROM dondathang INNE ON dondathang.soh

GROUP BY manhanvien

HAVING SUM(soluong)>=ALL (SELECT SUM(soluong)

FROM dondathang INNE

ON dondathang.sohoadon=ch GROUP BY manhanvien)) UPDATE nhanvien

SET luongcoban=luongcoban*0.85

(68)

FROM dondathang

en=nhanvien.manhanvien)

T s ien

hang

on=dondathang.sohoadon

1

amviec,GETDATE())>40 42 DELETE FROM dondathang

1/2000'

T mahang

RE maloaihang=loaihang.maloaihang)

ERE OT IST FROM dondathang

)

hang

ang.mahang)

 WHERE manhanvi

2.4 UPDATE dondathang SE ot =

(SELECT SUM(soluong*giaban+soluong*giaban*mucgiamgia) FROM chitietdat

WHERE sohoad

GROUP BY sohoadon) 2.4 DELETE FROM nhanvien WHERE DATEDIFF(YY,ngayl

WHERE ngaydathang<'1/ 2.4 DELETE FROM loaihang WHERE NOT EXISTS (SELEC

FROM mathang

WHE

2.4 DELETE FROM khachhang

WH N EX S (SELECT sohoadon

WHERE makhachhang=khachhang.makhachhang 2.45 DELETE FROM mathang

WHERE soluong=0 AND

NOT EXISTS (SELECT sohoadon FROM chitietdat

WHERE mahang=math

(69)

C

Chhưươơnngg33

N

NGGÔÔNN NNGG ĐĐNNHH NNGGHHĨĨAA DD LLIIUU

Các câu lệnh SQL đề cập đến chương sử dụng nhằm thực thao tác bổ sung, cập nhật, loại bỏ xem liệu Nhóm câu lệnh gọi ngôn ngữ thao tác liệu (DML) Trong chuơng này, tìm hiểu nhóm câu lệnh sử dụng để định nghĩa quản lý đối tượng CSDL bảng, khung nhìn, mục, gọi ngôn ngữ định nghĩa liệu (DLL)

Về bản, ngôn ngữ định nghĩa liệu bao gồm lệnh: • CREATE: định nghĩa tạo đối tượng CSDL • ALTER: thay đổi định nghĩa đối tượng CSDL • DROP: Xố đối tượng CSDL có

3.1 Tạo bảng liệu

Như nói đến chương 1, bảng liệu cấu trúc có vai trị quan trọng sở liệu quan hệ Toàn liệu sở liệu tổ chức bảng, bảng bảng hệ thống tạo tạo lập sở liệu, bảng người sử dụng định nghĩa

Hình 3.1 Bảng sở liệu quan hệ

(70)

dữ liệu sử dụng để biểu diễn thông tin, lưu giữ liệu đối tượng giới thực và/hoặc mối quan hệ đối tượng Bảng hình 3.1 bao gồm 10 ghi trường MAKHOA, TENKHOA, DIENTHOAI TRUONGKHOA

Câu lệnh CREATE TABLE sử dụng để định nghĩa bảng liệu sở liệu Khi định nghĩa bảng liệu mới, ta cần phải xác định yêu cầu sau đây:

• Bảng tạo sử dụng với mục đích có vai trị sở liệu

• Cấu trúc bảng bao gồm trường (cột) nào, trường có ý nghĩa việc biểu diễn liệu, kiểu liệu trường trường có cho phép nhận giá trị NULL hay khơng

• Những trường tham gia vào khóa bảng Bảng có quan hệ với bảng khác hay khơng có quan hệ

• Trên trường bảng có tồn ràng buộc khuôn dạng, điều kiện hợp lệ liệu hay khơng; có sử dụng đâu Câu lệnh CREATE TABLE có cú pháp sau

CREATE TABLE tên_bảng (

tên_cột thuộc_tính_cột các_ràng_buộc [,

,tên_cột_n thuộc_tính_cột_n các_ràng_buộc_cột_n] [,các_ràng_buộc_trên_bảng]

) Trong đó:

tên_bảng Tên bảng cần tạo Tên phải tuân theo qui tắc định danh không vượt 128 ký tự

tên_cột Là tên cột (trường) cần định nghĩa, tên cột phải tuân theo qui tắc định danh không trùng bảng Mỗi bảng phải có cột Nếu bảng có nhiều cột định nghĩa cột (tên cột, thuộc tính ràng buộc) phải phân cách dấu phẩy

thuộc_tính_cột Mỗi cột bảng ngồi tên cột cịn có thuộc tính bao gồm:

• Kiểu liệu cột Đây thuộc tính bắt buộc phải có cột

(71)

cho cột cách tường minh Mỗi cột có nhiều giá trị mặc định

• Cột có tính chất IDENTITY hay khơng? tức giá trị cột có tự động tăng có ghi bổ sung hay khơng Tính chất sử dụng trường kiểu số

• Cột có chấp nhận giá trị NULL hay khơng

Ví dụ 3.1: Khai báo định nghĩa cột STT có kiểu

liệu int cột có tính chất IDENTITY: stt INT IDENTITY

hay định nghĩa cột NGAY có kiểu datetime khơng cho phép chấp nhận giá trị NULL:

DATETIME NOT NULL

và định nghĩa cột SOLUONG kiểu int có giá trị mặc định

0:

soluong INT DEFAULT (0)

các_ràng_buộc Các ràng buộc sử dụng cột bảng nhằm mục đích sau:

• Quy định khuôn dạng hay giá trị liệu cho phép cột (chẳng hạn qui định tuổi học sinh phải lớn nhỏ 20, số điện thoại phải chuỗi bao gồm chữ số, ) Những ràng buộc kiểu gọi ràng buộc CHECK

• Đảm bảo tính tồn vẹn liệu bảng toàn vẹn tham chiếu bảng sở liệu Những loại ràng buộc nhằm đảm bảo tính đùng liệu như: số chứng minh nhân dân người phải nhất, sinh viên học lớp lớp phải tồn tại, Liên quan đến loại ràng buộc bao gồm ràng buộc PRIMARY KEY (khố chính), UNIQUE (khóa dự tuyển) FOREIGN KEY (khố ngồi)

(72)

Ví dụ 3.2: Câu lệnh định nghĩa bảng NHANVIEN với trường MANV

(mã nhân viên), HOTEN (họ tên), NGAYSINH (ngày sinh nhân viên), DIENTHOAI (điện thoại) HSLUONG (hệ số lương)

CREATE TABLE nhanvien (

manv NVARCHAR(10) NOT NULL, hoten NVARCHAR(50) NOT NULL, ngaysinh DATETIME NULL, dienthoai NVARCHAR(10) NULL,

hsluong DECIMAL(3,2) DEFAULT (1.92) )

Trong câu lệnh trên, trường MANV HOTEN bảng NHANVIEN không NULL (tức bắt buộc phải có liệu), trường NGAYSINH DIENTHOAI nhận giá trị NULL ta không nhập liệu cho chúng trường HSLUONG nhận giá trị mặc định 1.92 không nhập liệu

Nếu ta thực câu lệnh sau thực câu lệnh để bổ sung liệu cho bảng NHANVIEN

INSERT INTO nhanvien

VALUES('NV01','Le Van A','2/4/75','886963',2.14) INSERT INTO nhanvien(manv,hoten)

VALUES('NV02','Mai Thi B')

INSERT INTO nhanvien(manv,hoten,dienthoai) VALUES('NV03','Tran Thi C','849290') Ta có liệu bảng NHANVIEN sau:

3.1.1 Ràng buộc CHECK

Ràng buộc CHECK sử dụng nhằm định điều kiện hợp lệ liệu Mỗi có thay đổi liệu bảng (INSERT, UPDATE), ràng buộc sử dụng nhằm kiểm tra xem liệu có hợp lệ hay khơng

Ràng buộc CHECK khai báo theo cú pháp sau: [CONSTRAINT tên_ràng_buộc]

(73)

Trong đó, điều_kiện biểu thức logic tác động lên cột nhằm qui định giá trị khuôn dạng liệu cho phép Trên bảng cột có nhiều ràng buộc CHECK

Ví dụ 3.3: Câu lệnh tạo bảng DIEMTOTNGHIEP qui định giá trị

của cột DIEMVAN DIEMTOAN phải lớn nhỏ 10

CREATE TABLE diemtotnghiep (

hoten NVARCHAR(30) NOT NULL, ngaysinh DATETIME,

diemvan DECIMAL(4,2)

CONSTRAINT chk_diemvan

CHECK(diemvan>=0 AND diemvan<=10), diemtoan DECIMAL(4,2)

CONSTRAINT chk_diemtoan

CHECK(diemtoan>=0 AND diemtoan<=10), )

Như vậy, với định nghĩa bảng DIEMTOTNGHIEP, câu lệnh hợp lệ:

INSERT INTO diemtotnghiep(hoten,diemvan,diemtoan) VALUES('Le Thanh Hoang',9.5,2.5)

INSERT INTO diemtotnghiep(hoten,diemvan) VALUES('Hoang Thi Mai',2.5)

còn câu lệnh không hợp lệ:

INSERT INTO diemtotnghiep(hoten,diemvan,diemtoan) VALUES('Tran Van Hanh',6,10.5)

do cột DIEMTOAN nhận giá trị 10.5 không thoả mãn điều kiện ràng buộc

Trong ví dụ trên, ràng bc định phần khai báo cột Thay định ràng buộc cột, ta định ràng buộc mức bảng cách khai báo ràng buộc sau khai báo xong cột bảng

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

CREATE TABLE lop (

(74)

CONSTRAINT chk_lop_hedaotao

CHECK (hedaotao IN ('chính quy','tại chức')), namnhaphoc INT NULL

CONSTRAINT chk_lop_namnhaphoc

CHECK (namnhaphoc<=YEAR(GETDATE())), makhoa NVARCHAR(5)

)

có thể viết lại sau: CREATE TABLE lop (

malop NVARCHAR(10) NOT NULL , tenlop NVARCHAR(30) NOT NULL , khoa SMALLINT NULL , hedaotao NVARCHAR(25) NULL, namnhaphoc INT NULL , makhoa NVARCHAR(5),

CONSTRAINT chk_lop

CHECK (namnhaphoc<=YEAR(GETDATE()) AND

hedaotao IN ('chính quy','tại chức')) )

3.1.2 Ràng buộc PRIMARY KEY

Ràng buộc PRIMARY KEY sử dụng để định nghĩa khố bảng Khố bảng một tập nhiều cột mà giá trị chúng bảng Hay nói cách khác, giá trị khố giúp cho ta xác định dòng (bản ghi) bảng liệu Mỗi bảng có khố thân khố khơng chấp nhận giá trị NULL Ràng buộc PRIMARY KEY sở cho việc đảm bảo tính tồn vẹn thực thể tồn vẹn tham chiếu

Để khai báo ràng buộc PRIMARY KEY, ta sử dụng cú pháp sau: [CONSTRAINT tên_ràng_buộc]

PRIMARY KEY [(danh_sách_cột)]

(75)

Ví dụ 3.5: Câu lệnh định nghĩa bảng SINHVIEN với khố MASV

CREATE TABLE sinhvien (

masv NVARCHAR(10)

CONSTRAINT pk_sinhvien_masv PRIMARY KEY, hodem NVARCHAR(25) NOT NULL ,

ten NVARCHAR(10) NOT NULL , ngaysinh DATETIME,

gioitinh BIT,

noisinh NVARCHAR(255), malop NVARCHAR(10) )

Với bảng vừa tạo câu lệnh trên, ta thực câu lệnh:

INSERT INTO sinhvien(masv,hodem,ten,gioitinh,malop) VALUES('0261010001','Lê Hoàng Phương','Anh',0,'C26101') ghi bổ sung vào bảng Nhưng ta thực tiếp câu lệnh:

INSERT INTO sinhvien(masv,hodem,ten,gioitinh,malop) VALUES('0261010001','Lê Huy','Đan',1,'C26101')

thì câu lệnh bị lỗi trùng giá trị khoá với ghi có

Ví dụ 3.6: Câu lệnh tạo bảng DIEMTHI với khố tập bao gồm hai

cột MAMONHOC MASV CREATE TABLE diemthi (

mamonhoc NVARCHAR(10) NOT NULL , masv NVARCHAR(10) NOT NULL , diemlan1 NUMERIC(4, 2),

diemlan2 NUMERIC(4, 2),

CONSTRAINT pk_diemthi PRIMARY KEY(mamonhoc,masv) )

Lưu ý:

(76)

3.1.3 Ràng buộc UNIQUE

Trên bảng có nhiều khóa có nhiều cột tập cột có tính chất khố chính, tức giá trị chúng bảng Tập nhiều cột có giá trị khơng chọn làm khố gọi khoá phụ (khoá dự tuyển) bảng Như vậy, bảng có nhiều khố có nhiều khố phụ

Ràng buộc UNIQUE sử dụng câu lệnh CREATE TABLE để định nghĩa khoá phụ cho bảng khai báo theo cú pháp sau đây:

[CONSTRAINT tên_ràng_buộc]

UNIQUE [(danh_sách_cột)]

Ví dụ 3.7: Giả sử ta cần định nghĩa bảng LOP với khố cột MALOP

đồng thời lại không cho phép lớp khác trùng tên lớp với nhau, ta sử dụng câu lệnh sau:

CREATE TABLE lop (

malop NVARCHAR(10) NOT NULL, tenlop NVARCHAR(30) NOT NULL, khoa SMALLINT NULL, hedaotao NVARCHAR(25) NULL, namnhaphoc INT NULL, makhoa NVARCHAR(5),

CONSTRAINT pk_lop PRIMARY KEY (malop),

CONSTRAINT unique_lop_tenlop UNIQUE(tenlop) )

3.1.4 Ràng buộc FOREIGN KEY

Các bảng sở liệu có mối quan hệ với Những mối quan hệ biểu diễn cho quan hệ đối tượng giới thực Về mặt liệu, mối quan hệ đảm bảo thơng qua việc địi hỏi có mặt giá trị liệu bảng phải phụ thuộc vào tồn giá trị liệu bảng khác

(77)

Hình cho ta thấy mối quan hệ bảng DIEMTHI, SINHVIEN MONHOC Trong bảng DIEMTHI, MASV khố ngồi tham chiếu đến cột MASV bảng SINHVIEN MAMONHOC khoá tham chiếu đến cột MAMONHOC bảng MONHOC

Hình 3.2 Mối quan hệ bảng

Với mối quan hệ tạo hình trên, hệ quản trị sở liệu kiểm tra tính hợp lệ ghi bảng DIEMTHI bổ sung hay cập nhật Một ghi bảng DIEMTHI hợp lệ (đảm bảo ràng buộc FOREIGN KEY) giá trị cột MASV phải tồn ghi bảng SINHVIEN giá trị cột MAMONHOC phải tồn ghi bảng MONHOC

Ràng buộc FOREIGN KEY định nghĩa theo cú pháp đây: [CONSTRAINT tên_ràng_buộc]

FOREIGN KEY [(danh_sách_cột)]

(78)

• Tên cột danh sách cột bảng định nghĩa tham gia vào khố ngồi

• Tên bảng tham chiếu khố ngồi danh sách cột tham chiếu đến bảng tham chiếu

• Cách thức xử lý ghi bảng định nghĩa trường hợp ghi tham chiếu bảng tham chiếu bị xoá (ON DELETE) hay cập nhật (ON UPDATE) SQL chuẩn đưa cách xử lý:

ƒ CASCADE: Tự động xoá (cập nhật) ghi tham chiếu bị xoá (cập nhật)

ƒ NO ACTION: (Mặc định) Nếu ghi bảng tham chiếu tham chiếu ghi bảng định nghĩa bàn ghi khơng phép xố cập nhật (đối với cột tham chiếu)

ƒ SET NULL: Cập nhật lại khố ngồi ghi thành giá trị NULL (nếu cột cho phép nhận giá trị NULL)

ƒ SET DEFAULT: Cập nhật lại khố ngồi ghi nhận giá trị mặc định (nếu cột có qui định giá trị mặc định)

Ví dụ 3.8: Câu lệnh định nghĩa bảng DIEMTHI với hai khố ngồi cột

MASV cột MAMONHOC (giả sử hai bảng SINHVIEN MONHOC định nghĩa)

CREATE TABLE diemthi (

mamonhoc NVARCHAR(10) NOT NULL , masv NVARCHAR(10) NOT NULL , diemlan1 NUMERIC(4, 2),

diemlan2 NUMERIC(4, 2),

CONSTRAINT pk_diemthi PRIMARY KEY(mamonhoc,masv), CONSTRAINT fk_diemthi_mamonhoc

FOREIGN KEY(mamonhoc)

REFERENCES monhoc(mamonhoc) ON DELETE CASCADE

ON UPDATE CASCADE, CONSTRAINT fk_diemthi_masv FOREIGN KEY(masv)

REFERENCES sinhvien(masv) ON DELETE CASCADE

(79)

)

Lưu ý:

• Cột tham chiếu bảng tham chiếu phải khố (hoặc khố phụ)

• Cột tham chiếu phải có kiểu liệu độ dài với cột tương ứng khóa ngồi

• Bảng tham chiếu phải định nghĩa trước Do đó, bảng có mối quan hệ vịng, ta khơng thể định nghĩa ràng buộc FOREIGN KEY câu lệnh CREATE TABLE mà phải định nghĩa thông qua lệnh ALTER TABLE

3.2 Sửa đổi định nghĩa bảng

Một bảng sau định nghĩa câu lệnh CREATE TABLE sửa đổi thơng qua câu lệnh ALTER TABLE Câu lệnh cho phép thực thao tác sau:

• Bổ sung cột vào bảng • Xố cột khỏi bảng

• Thay đổi định nghĩa cột bảng • Xố bỏ bổ sung ràng buộc cho bảng Cú pháp câu lệnh ALTER TABLE sau: ALTER TABLE tên_bảng

ADD định_nghĩa_cột |

ALTER COLUMN tên_cột kiểu_dữ_liêu [NULL | NOT NULL] | DROP COLUMN tên_cột |

ADD CONSTRAINT tên_ràng_buộc định_nghĩa_ràng_buộc | DROP CONSTRAINT tên_ràng_buộc

Ví dụ 3.9: Các ví dụ minh hoạ cho ta cách sử dụng câu lệnh ALTER TABLE

trong trường hợp

Giả sử ta có hai bảng DONVI NHANVIEN với định nghĩa sau: CREATE TABLE donvi

(

(80)

)

CREATE TABLE nhanvien (

manv NVARCHAR(10) NOT NULL, hoten NVARCHAR(30) NOT NULL, ngaysinh DATETIME,

diachi CHAR(30) NOT NULL )

Bổ sung vào bảng NHANVIEN cột DIENTHOAI với ràng buộc CHECK nhằm qui định điện thoại nhân viên chuỗi chữ số:

ALTER TABLE nhanvien ADD

dienthoai NVARCHAR(6)

CONSTRAINT chk_nhanvien_dienthoai

CHECK (dienthoai LIKE '[0-9][0-9][0-9][0-9][0-9][0-9]') Bổ sung thêm cột MADV vào bảng NHANVIEN:

ALTER TABLE nhanvien ADD

madv INT NULL

Định nghĩa lại kiểu liệu cột DIACHI bảng NHANVIEN cho phép cột chấp nhận giá trị NULL:

ALTER TABLE nhanvien

ALTER COLUMN diachi NVARCHAR(100) NULL Xoá cột ngày sinh khỏi bảng NHANVIEN:

ALTER TABLE nhanvien DROP COLUMN ngaysinh

Định nghĩa khố (ràng buộc PRIMARY KEY) cho bảng NHANVIEN cột MANV:

ALTER TABLE nhanvien ADD

CONSTRAINT pk_nhanvien PRIMARY KEY(manv)

Định nghĩa khố ngồi cho bảng NHANVIEN cột MADV tham chiếu đến cột MADV bảng DONVI:

ALTER TABLE nhanvien ADD

CONSTRAINT fk_nhanvien_madv

(81)

ON DELETE CASCADE ON UPDATE CASCADE

Xoá bỏ ràng buộc kiểm tra số điện thoại nhân viên ALTER TABLE nhanvien

DROP CONSTRAINT CHK_NHANVIEN_DIENTHOAI

Lưu ý:

• Nếu bổ sung thêm cột vào bảng bảng có ghi cột cần bổ sung phải cho phép chấp nhận giá trị NULL phải có giá trị mặc định

• Muốn xố cột ràng buộc ràng buộc tham chiếu khố ngồi, ta phải xố ràng buộc khố ngồi trước cho cột khơng cịn ràng buộc khơng cịn tham chiếu khố ngồi

• Nếu bổ sung thêm ràng buộc cho bảng có liệu ràng buộc cần bổ sung khơng thoả mãn ghi có bảng câu lệnh ALTER TABLE khơng thực

3.3 Xoá bảng

Khi bảng khơng cịn cần thiết , ta xố khỏi sở liệu câu lệnh DROP TABLE Câu lệnh đồng thời xoá tất ràng buộc, mục, trigger liên quan đến bảng

Câu lệnh có cú pháp sau: DROP TABLE tên_bảng

Trong hệ quản trị sở liệu, xoá bảng lệnh DROP TABLE, ta khôi phục lại bảng liệu Do đó, cần phải cẩn thận sử dụng câu lệnh

Câu lệnh DROP TABLE thực bảng cần xoá tham chiếu ràng buộc FOREIGN KEY Trong trường hợp này, ràng buộc FOREIGN KEY tham chiếu bảng tham chiếu đến bảng cần xoá phải xoá trước

(82)

Ví dụ 3.10: Giả sử cột MADV bảng DONVI tham chiếu khoá

ngồi fk_nhanvien_madv bảng NHANVIEN Để xố bảng DONVI khỏi sở liệu, ta thực hai câu lệnh sau:

Xoá bỏ ràng buộc fk_nhanvien_madv khỏi bảng NHANVIEN: ALTER TABLE nhanvien

DROP CONSTRAINT fk_nhanvien_madv Xoá bảng DONVI:

DROP TABLE donvi 3.4 Khung nhìn

Các bảng sở liệu đóng vai trị đối tượng tổ chức lưu trữ liệu Như vậy, ta quan sát liệu sở liệu cách thực truy vấn bảng liệu Ngồi ra, SQL cịn cho phép quan sát liệu thông qua việc định nghĩa khung nhìn

Một khung nhìn (view) xem bảng “ảo” sở liệu có nội dung định nghĩa thơng qua truy vấn (câu lệnh SELECT) Như vậy, khung nhìn trơng giống bảng với tên khung nhìn tập bao gồm dịng cột Điểm khác biệt khung nhìn bảng khung nhìn khơng xem cấu trúc lưu trữ liệu tồn sở liệu Thực chất liệu quan sát khung nhìn lấy từ bảng thơng qua câu lệnh truy vấn liệu

Hình 3.3 minh hoạ cho ta thấy khung nhìn có tên DSSV định nghĩa thông qua câu lệnh SELECT truy vấn liệu hai bảng SINHVIEN LOP:

SELECT masv,hodem,ten,

DATEDIFF(YY,ngaysinh,GETDATE()) AS tuoi,tenlop FROM sinhvien,lop

WHERE sinhvien.malop=lop.malop

Khi khung nhìn DSSV định nghĩa, ta sử dụng câu lệnh SELECT để truy vấn liệu từ khung nhìn bảng Khi câu truy vấn xuất khung nhìn, hệ quản trị sở liệu dựa vào đinh nghĩa khung nhìn để chuyển yêu cầu truy vấn liệu liên quan đến khung nhìn thành yêu cầu tương tự bảng sở việc truy vấn liệu thực yêu cầu tương đương bảng

Việc sử dụng khung nhìn sở liệu đem lại lợi ích sau đây:

(83)

• Đơn giản hố thao tác truy vấn liệu: Một khung nhìn đóng vai trị đối tượng tập hợp liệu từ nhiều bảng khác vào “bảng” Nhờ vào đó, người sử dụng thực yêu cầu truy vấn liệu cách đơn giản từ khung nhìn thay phải đưa câu truy vấn phức tạp

• Tập trung đơn giản hồ liệu: Thơng qua khung nhìn ta cung cấp cho người sử dụng cấu trúc đơn giản, dễ hiểu liệu sở liệu đồng thời giúp cho người sử dụng tập trung phần liệu cần thiết

• Độc lập liệu: Một khung nhìn cho phép người sử dụng có nhìn liệu độc lập với cấu trúc bảng sở liệu cho dù bảng sở có bị thay đổi phần cấu trúc

Hình 3.3 Khung nhìn DSSV với liệu lấy từ bảng SINHVIEN LOP

Tuy nhiên, việc sử dụng khung nhìn ũng tồn số nhược điểm sau:

n khung nhìn thành truy vấn bảng sở nên khung

view DSSV

Table LOP Table SINHVIEN

-c

(84)

nhìn định nghĩa truy vấn phức tạp dẫn đến chi phí mặt thời gian thực truy vấn liên quan đến khung nhìn lớn

Mặc dù thơng qua khung nhìn thực thao tác bổ sung cập nhật liệu cho bảng sở hạn chế khu

ng nhìn đơn

.4.1 Tạo khung nhìn

được sử dụng để tạo khung nhìn có cú pháp

lệnh tạo khung nhìn có tên DSSV từ câu lệnh SELECT truy LOP

odem,ten,

DATEDIFF(YY,ngaysinh,GETDATE()) AS tuoi,tenlop

và c h

giản Đối với khung nhìn phức tạp thường khơng thực được; hay nói cách khác liệu khung nhìn đọc

3

Câu lệnh CREATE VIEW sau:

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

câu_lệnh_SELECT

Ví dụ 3.11: Câu

vấn liệu từ hai bảng SINHVIEN v CREATE VIEW dssv

AS

SELECT masv,h

FROM sinhvien,lop

WHERE sinhvien.malop=lop.malop thự iện câu lệnh:

(85)

Nếu câu lệnh CREATE VIEW, ta khơng định danh sách tên cột

í dụ i,lop)

SELECT masv,hodem,ten,

GETDATE()),tenlop =lop.malop

và câu h:

T * FROM dssv

hư sau:

Khi tạo khung nhìn với câu lệnh CREATE VIEW, ta cần phải lưu ý số ung nhìn tên cột khung nhìn, giống bảng, phải tuân • buộc tạo mục cho khung nhìn

c sử dụng để • khung nhìn trường hợp sau đây:

cho khung nhìn, tên cột khung nhìn tiêu đề cột kết câu lệnh SELECT Trong trường hợp tên cột khung nhìn đươc định, chúng phải có số lượng với số lượng cột kết câu truy vấn

Ví dụ 3.12: Câu lệnh tạo khung nhìn từ câu truy vấn tương tự v

nhưng có đặt tên cho cột khung nhìn: CREATE VIEW dssv(ma,ho,ten,tuo AS

DATEDIFF(YY,ngaysinh, FROM sinhvien,lop

WHERE sinhvien.malop lện

SELEC

trong trường hợp có kết n

nguyên tắc sau: • Tên kh

theo qui tắc định danh Khơng thể qui định ràng

• Câu lệnh SELECT với mệnh đề COMPUTE BY không đượ định nghĩa khung nhìn

(86)

ƒ Trong kết câu lệnh SELECT có cột sinh biểu thức (tức là tên cột bảng sở) cột khơng đặt tiêu đề

ƒ Tồn hai cột kết câu lệnh SELECT có tiêu đề cột

Ví dụ 3.13: Câu lệnh câu lệnh sai cột thứ không xác định tên cột

CREATE VIEW tuoisinhvien AS

SELECT masv,hodem,ten,DATEDIFF(YY,ngaysinh,GETDATE()) FROM sinhvien

3.4.2 Cập nhật, bổ sung xoá liệu thơng qua khung nhìn

Đối với số khung nhìn, ta tiến hành thực thao tác cập nhập, bổ sung xoá liệu Thực chất, thao tác chuyển thành thao tác tương tự bảng sở có tác động đến bảng sở

Về mặt lý thuyết, để thực thao tác bổ sung, cập nhật xoá, khung nhìn trước tiên phải thoả mãn điều kiện sau đây:

• Trong câu lệnh SELECT định nghĩa khung nhìn khơng sử dụng từ khố DISTINCT, TOP, GROUP BY UNION

• Các thành phần xuất danh sách chọn câu lệnh SELECT phải cột bảng sở Trong danh sách chọn khơng chứa biểu thức tính tốn, hàm gộp

Ngoài điều kiện trên, thao tác thay đổi đến liệu thông qua khung nhìn cịn phải đảm bảo thoả mãn ràng buộc bảng sở, tức đảm bảo tính tồn vẹn liệu Ví dụ minh hoạ cho ta thấy việc thực thao tác bổ sung, cập nhật xố liệu thơng qua khung nhìn

Ví dụ 3.14: Xét định nghĩa hai bảng DONVI NHANVIEN sau:

CREATE TABLE donvi (

madv INT PRIMARY KEY, tendv NVARCHAR(30) NOT NULL, dienthoai NVARCHAR(10) NULL, )

(87)

manv NVARCHAR(10) PRIMARY KEY, hoten NVARCHAR(30) NOT NULL, ngaysinh DATETIME NULL, diachi NVARCHAR(50) NULL, madv INT FOREIGN KEY

REFERENCES donvi(madv) ON DELETE CASCADE

ON UPDATE CASCADE )

Giả sử hai bảng có liệu sau:

Bảng DONVI

Bảng NHANVIEN

Câu lệnh định nghĩa khung nhìn NV1 cung cấp thơng tin mã nhân viên, họ tên mã đơn vị nhân viên làm việc:

CREATE VIEW nv1 AS

SELECT manv,hoten,madv FROM nhanvien Nếu ta thực câu lệnh

INSERT INTO nv1 VALUES('NV04','Le Thi D',1)

Một ghi bổ sung vào bảng NHANVIEN liệu bảng là:

(88)

Thông qua khung nhìn này, ta thực thao tác cập nhật xoá liệu Chẳng hạn, ta thực câu lệnh:

DELETE FROM nv1 WHERE manv='NV04'

Thì ghi tương ứng với nhân viên có mã NV04 bị xố khỏi bảng NHANVIEN Nếu danh sách chọn câu lệnh SELECT có xuất biểu thức tính tốn đơn giản, thao tác bổ sung liệu thơng qua khung nhìn thực Tuy nhiên, trường hợp thao tác cập nhật xoá liệu vấn có khả thực (hiển nhiên cập nhật liệu cột có từ biểu thức tính tốn)

Ví dụ 3.15: Xét khung nhìn NV2 định nghĩa sau:

CREATE VIEW nv2 AS

SELECT manv,hoten,YEAR(ngaysinh) AS namsinh,madv FROM nhanvien

Đối với khung nhìn NV2, ta thực thao tác bổ sung liệu cập nhật xố liệu bảng thơng qua khung nhìn Câu lệnh thực khung nhìn NV2

INSERT INTO nv2(manv,hoten,madv) VALUES('NV05','Le Van E',1)

Nhưng câu lệnh:

UPDATE nv2 SET hoten='Le Thi X' WHERE manv='NV04' câu lệnh

DELETE FROM nv2 WHERE manv='NV04'

lại thực có tác động liệu bảng NHANVIEN

Trong trường hợp khung nhìn tạo từ phép nối (trong ngoài) nhiều bảng, ta thực thao tác bổ sung cập nhật liệu thao tác có tác động đến bảng sở (câu lệnh DELETE thực trường hợp này)

Ví dụ 3.16: Với khung nhìn định nghĩa sau:

CREATE VIEW nv3 AS

SELECT manv,hoten,ngaysinh,

(89)

FROM nhanvien FULL OUTER JOIN donvi ON nhanvien.madv=donvi.madv Câu lệnh:

INSERT INTO nv3(manv,hoten,noilamviec) VALUES('NV05','Le Van E',1)

sẽ bổ sung thêm vào bảng NHANVIEN ghi Hoặc câu lệnh: INSERT INTO nv3(madv,tendv) VALUES(3,'P Ke toan')

bổ sung thêm vào bảng DONVI ghi hai câu lệnh có tác động đến bảng sở

Câu lệnh khơng thể thực có tác động lúc đến hai bảng sở

INSERT INTO nv3(manv,hoten,noilamviec,madv,tendv) VALUES('NV05','Le Van E',1,3,'P Ke toan')

3.4.3 Sửa đổi khung nhìn

Câu lệnh ALTER VIEW sử dụng để định nghĩa lại khung nhìn có khơng làm thay đổi quyền cấp phát cho người sử dụng trước Câu lệnh sử dụng tương tự câu lệnh CREATE VIEW có cú pháp sau:

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

Câu_lệnh_SELECT

Ví dụ 3.17: Ta định nghĩa khung nhìn 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à định nghĩa lại khung nhìn câu lệnh: ALTER VIEW view_lop

AS

SELECT malop,tenlop,hedaotao

(90)

3.4.4 Xố khung nhìn

Khi khung nhìn khơng cịn sử dụng, ta xố khỏi sở liệu thơng qua câu lệnh:

DROP VIEW tên_khung_nhìn

Nếu khung nhìn bị xố, tồn quyền cấp phát cho người sử dụng khung nhìn đồng thời bị xố Do đó, ta tạo lại khung nhìn phải tiến hành cấp phát lại quyền cho người sử dụng

Ví dụ 3.18: Câu lệnh xố khung nhìn VIEW_LOP khỏi sở liệu

DROP VIEW view_lop

Bài tập chương

(91)

3.2 Bổ sung ràng buộc thiết lập giá trị mặc định cho cột SOLUONG cho cột MUCGIAMGIA bảng CHITIETDATHANG

3.3 Bổ sung cho bảng DONDATHANG ràng buộc kiểm tra ngày giao hàng ngày chuyển hàng phải sau với ngày đặt hàng

3.4 Bổ sung ràng buộc cho bảng NHANVIEN để đảm bảo nhân viên làm việc công ty đủ 18 tuổi không 60 tuổi

3.5 Với bảng tạo được, câu lệnh: DROP TABLE nhacungcap thực không? Tại sao? 3.6 Cho khung nhìn định nghĩa sau:

CREATE VIEW view_donhang AS

SELECT dondathang.sohoadon,makhachhang,manhanvien, ngaydathang,ngaygiaohang,ngaychuyenhang, noigiaohang,mahang,

giaban,soluong,mucgiamgia

FROM dondathang INNER JOIN chitietdathang

ON dondathang.sohoadon = chitietdathang.sohoadon

a Có thể thơng qua khung nhìn để bổ sung liệu cho bảng DONDATHANG khơng?

b Có thể thơng qua khung nhìn để bổ sung liệu cho bảng CHITIETDATHANG khơng?

3.7 Với khung nhìn định nghĩa sau: CREATE VIEW view_donhang

AS

SELECT dondathang.sohoadon,makhachhang,manhanvien, ngaydathang,ngaygiaohang,ngaychuyenhang, noigiaohang,mahang,

giaban*soluong as thanhtien, mucgiamgia

FROM dondathang INNER JOIN chitietdathang

ON dondathang.sohoadon = chitietdathang.sohoadon

a Có thể thơng qua khung nhìn để xố hay cập nhật liệu bảng DONDATHANG không?

(92)

Lời giải

3.1 Tạo bảng liệu:

CREATE TABLE nhacungcap (

macongty NVARCHAR(10) NOT NULL

CONSTRAINT pk_nhacungcap PRIMARY KEY(macongty), tencongty NVARCHAR(40) NOT NULL, tengiaodich NVARCHAR(30) NULL, diachi NVARCHAR(60) NULL, dienthoai NVARCHAR(20) NULL, fax NVARCHAR(20) NULL, email NVARCHAR(50) NULL )

CREATE TABLE loaihang (

maloaihang INT NOT NULL CONSTRAINT pk_loaihang

PRIMARY KEY(maloaihang), tenloaihang NVARCHAR(15) NOT NULL )

CREATE TABLE mathang (

mahang NVARCHAR(10) NOT NULL CONSTRAINT pk_mathang

PRIMARY KEY(mahang), tenhang NVARCHAR(50) NOT NULL, macongty NVARCHAR(10) NULL , maloaihang INT NULL , soluong INT NULL,

donvitinh NVARCHAR(20) NULL , giahang MONEY NULL )

CREATE TABLE nhanvien (

(93)

CONSTRAINT pk_nhanvien PRIMARY KEY(manhanvien), ho NVARCHAR(20) NOT NULL , ten NVARCHAR(10) NOT NULL , ngaysinh DATETIME NULL , ngaylamviec DATETIME NULL , diachi NVARCHAR(50) NULL , dienthoai NVARCHAR(15) NULL , luongcoban MONEY NULL , phucap MONEY NULL )

CREATE TABLE khachhang (

makhachhang NVARCHAR(10) NOT NULL CONSTRAINT pk_khachhang

PRIMARY KEY(makhachhang), tencongty NVARCHAR(50) NOT NULL , tengiaodich NVARCHAR(30) NOT NULL , diachi NVARCHAR(50) NULL , email NVARCHAR(30) NULL , dienthoai NVARCHAR(15) NULL , fax NVARCHAR(15) NULL )

CREATE TABLE dondathang (

sohoadon INT NOT NULL

CONSTRAINT pk_dondathang PRIMARY KEY(sohoadon), makhachhang NVARCHAR(10) NULL ,

manhanvien NVARCHAR(10) NULL , ngaydathang SMALLDATETIME NULL , ngaygiaohang SMALLDATETIME NULL , ngaychuyenhang SMALLDATETIME NULL , noigiaohang NVARCHAR(50) NULL )

(94)

sohoadon INT NOT NULL , mahang NVARCHAR(10) NOT NULL , giaban MONEY NOT NULL , soluong SMALLINT NOT NULL , mucgiamgia REAL NOT NULL, CONSTRAINT pk_chitietdathang

PRIMARY KEY(sohoadon,mahang) )

Thiết lập mối quan hệ bảng ALTER TABLE mathang ADD

CONSTRAINT fk_mathang_loaihang FOREIGN KEY (maloaihang)

REFERENCES loaihang(maloaihang) ON DELETE CASCADE ON UPDATE CASCADE , CONSTRAINT fk_mathang_nhacungcap

FOREIGN KEY (macongty)

REFERENCES nhacungcap(macongty)

ON DELETE CASCADE ON UPDATE CASCADE ALTER TABLE dondathang

ADD

CONSTRAINT fk_dondathang_khachhang FOREIGN KEY (makhachhang)

REFERENCES khachhang(makhachhang) ON DELETE CASCADE ON UPDATE CASCADE , CONSTRAINT fk_dondathang_nhanvien FOREIGN KEY (manhanvien)

REFERENCES nhanvien(manhanvien)

ON DELETE CASCADE ON UPDATE CASCADE ALTER TABLE chitietdathang

ADD

CONSTRAINT fk_chitiet_dondathang FOREIGN KEY (sohoadon)

REFERENCES dondathang(sohoadon)

(95)

FOREIGN KEY (mahang)

REFERENCES mathang(mahang)

ON DELETE CASCADE ON UPDATE CASCADE 3.2 ALTER TABLE chitietdathang

ADD

CONSTRAINT df_chitietdathang_soluong DEFAULT(1) FOR soluong,

CONSTRAINT df_chitietdathang_mucgiamgia DEFAULT(0) FOR Mucgiamgia

3.3 ALTER TABLE dondathang ADD

CONSTRAINT chk_dondathang_ngay CHECK (ngaygiaohang>=ngaydathang AND ngaychuyenhang>=ngaydathang) 3.4 ALTER TABLE nhanvien

ADD

CONSTRAINT chk_nhanvien_ngaylamviec

CHECK (datediff(yy,ngaysinh,ngaylamviec) BETWEEN 18 AND 60)

3.5 Câu lệnh khơng thực bảng cần xố tham chiếu bảng MATHANG

3.6 a Khơng b Khơng 3.7 a.Có thể cập nhật khơng thể xố b Có thể

(96)

C

Chhưươơnngg44

B

BOOMMTT TTRROONNGG SSQQLL

4.1 Các khái niệm

Bảo mật yếu tố đóng vai trị quan trọng sống sở liệu Hầu hết hệ quản trị sở liệu thương mại cung cấp khả bảo mật sở liệu với chức như:

• Cấp phát quyền truy cập sở liệu cho người dùng nhóm người dùng, phát ngăn chặn thao tác trái phép người sử dụng sở liệu

• Cấp phát quyền sử dụng câu lệnh, đối tượng sở liệu người dùng

• Thu hồi (huỷ bỏ) quyền người dùng

Bảo mật liệu SQL thực dựa ba khái niệm sau đây: • Người dùng sở liệu (Database user): Là đối tượng sử dụng sở

liệu, thực thi thao tác sở liệu tạo bảng, truy xuất liệu, Mỗi người dùng sở liệu xác định thông qua tên người dùng (User ID) Một tập nhiều người dùng tổ chức nhóm gọi nhóm người dùng (User Group) Chính sách bảo mật sở liệu áp dụng cho người dùng cho nhóm người dùng

• Các đối tượng sở liệu (Database objects): Tập hợp đối tượng, cấu trúc lưu trữ sử dụng sở liệu bảng, khung nhìn, thủ tục, hàm gọi đối tượng sở liệu Đây đối tượng cần bảo vệ sách bảo mật sở liệu

(97)

• Lệnh GRANT: Sử dụng để cấp phát quyền cho người sử dụng đối tượng sở liệu quyền sử dụng câu lệnh SQL sở liệu

• Lệnh REVOKE: Được sử dụng để thu hồi quyền người sử dụng

4.2 Cấp phát quyền

Câu lệnh GRANT sử dụng để cấp phát quyền cho người dùng hay nhóm người dùng đối tượng sở liệu Câu lệnh thường sử dụng trường hợp sau:

• Người sở hữu đối tượng sở liệu muốn cho phép người dùng khác quyền sử dụng đối tượng mà sở hữu

• Người sở hữu sở liệu cấp phát quyền thực thi câu lệnh (như CREATE TABLE, CREATE VIEW, ) cho người dùng khác

4.2.1 Cấp phát quyền cho người dùng đối tượng sở liệu

Chỉ có người sở hữu sở liệu người sở hữu đối tượng sở liệu cấp phát quyền cho người dùng đối tượng sở liệu Câu lệnh GRANT trường hợp có cú pháp sau:

GRANT ALL [PRIVILEGES]| các_quyền_cấp_phát

[(danh_sách_cột)] ON tên_bảng | tên_khung_nhìn |ON tên_bảng | tên_khung_nhìn [(danh_sách_cột)] |ON tên_thủ_tục

|ON tên_hàm

TO danh_sách_người_dùng | nhóm_người_dùng [WITH GRANT OPTION ]

Trong đó:

ALL [PRIVILEGES] Cấp phát tất quyền cho người dùng đối tượng sở liệu định Các quyền cấp phát cho người dùng bao gồm:

• Đối với bảng, khung nhìn, hàm trả liệu kiểu bảng: SELECT, INSERT, DELETE, UPDATE REFERENCES

• Đối với cột bảng, khung nhìn: SELECT UPDATE

(98)

EXECUTE

Trong quyền đề cập đến trên, quyền REFERENCES sử dụng nhằm cho phép tạo khóa ngồi tham chiếu đến bảng cấp phát

các_quyền_cấp_phát Danh sách quyền cần cấp phát cho người dùng

trên đối tượng sở liệu định Các quyền phân cách dấu phẩy

tên_bảng|tên_khung_nhìn Tên bảng khung nhìn cần cấp phát quyền danh_sách_cột Danh sách cột bảng khung nhìn cần cấp

phát quyền

tên_thủ_tục Tên thủ tục cấp phát cho người dùng

tên_hàm Tên hàm (do người dùng định nghĩa) cấp phát

quyền

danh_sách_người_dùng Danh sách tên người dùng nhận quyền cấp phát

Tên người dùng phân cách dấu phẩy

WITH GRANT OPTION Cho phép người dùng chuyển tiếp quyền cho người dùng khác

Các ví dụ minh hoạ cho ta cách sử dụng câu lệnh GRANT để cấp phát quyền cho người dùng đối tượng sở liệu

Ví dụ 4.1: Cấp phát cho người dùng có tên thuchanh quyền thực thi câu lệnh

SELECT, INSERT UPDATE bảng LOP GRANT SELECT,INSERT,UPDATE ON lop

TO thuchanh

Cho phép người dùng thuchanh quyền xem họ tên ngày sinh sinh viên (cột HODEM,TEN NGAYSINH bảng SINHVIEN)

GRANT SELECT

(hodem,ten,ngaysinh) ON sinhvien TO thuchanh

hoặc:

GRANT SELECT

(99)

Với quyền cấp phát trên, người dùng thuchanh thực câu lệnh sau bảng SINHVIEN

SELECT hoden,ten,ngaysinh FROM sinhvien

Nhưng câu lệnh lại thực SELECT * FROM sinhvien

Trong trường hợp cần cấp phát tất quyền thực đối tượng sở liệu cho người dùng, thay liệt kê câu lệnh, ta cần sử dụng từ khoá ALL PRIVILEGES (từ khóa PRIVILEGES khơng cần định) Câu lệnh đây cấp phát cho người dùng thuchanh quyền SELECT, INSERT, UPDATE, DELETE VÀ REFERENCES bảng DIEMTHI

GRANT ALL ON DIEMTHI TO thuchanh

Khi ta cấp phát quyền cho người dùng đối tượng sở liệu, người dùng thực thi câu lệnh cho phép đối tượng cấp phát Tuy nhiên, người dùng khơng có quyền cấp phát quyền mà phép cho người sử dụng khác.Trong số trường hợp, ta cấp phát quyền cho người dùng đó, ta cho phép người chuyển tiếp quyền cho người dùng khác cách định tuỳ chọn WITH GRANT OPTION câu lệnh GRANT

Ví dụ 4.2: Cho phép người dùng thuchanh quyền xem liệu bảng SINHVIEN

đồng thời chuyển tiếp quyền cho người dùng khác GRANT SELECT

ON sinhvien TO thuchanh

WITH GRANT OPTION

4.2.2 Cấp phát quyền thực thi câu lệnh

Ngoài chức cấp phát quyền cho người sử dụng đối tượng sở liệu, câu lệnh GRANT sử dụng để cấp phát cho người sử dụng số quyền hệ quản trị sở liệu sở liệu Những quyền cấp phát trường hợp bao gồm:

• Tạo sở liệu: CREATE DATEBASE • Tạo bảng: CREATE RULE

(100)

• Tạo thủ tục lưu trữ: CREATE PROCEDURE • Tạo hàm: CREATE FUNCTION

• Sao lưu sở liệu: BACKUP DATABASE

Câu lệnh GRANT sử dụng trường hợp có cú pháp sau: GRANT ALL | danh_sách_câu_lênh

TO danh_sách_người_dùng

Ví dụ 4.3: Để cấp phát quyền tạo bảng khung nhìn cho người dùng có tên thuchanh, ta sử dụng câu lệnh sau:

GRANT CREATE TABLE,CREATE VIEW TO thuchanh

Với câu lệnh GRANT, ta cho phép người sử dụng tạo đối tượng sở liệu sở liệu Đối tượng sở liệu người dùng tạo người sở hữu người có quyền cho người dùng khác sử dụng đối tượng xóa bỏ (DROP) đối tượng tạo

Khác với trường hợp sử dụng câu lệnh GRANT để cấp phát quyền đối tượng sở liệu, câu lệnh GRANT trường hợp sử dụng tuỳ chọn WITH GRANT OPTION, tức người dùng chuyển tiếp quyền thực thi câu lệnh cấp phát

4.3 Thu hồi quyền

Câu lệnh REVOKE sử dụng để thu hồi quyền cấp phát cho người dùng Tương ứng với câu lệnh GRANT, câu lệnh REVOKE sử dụng hai trường hợp:

• Thu hồi quyền cấp phát cho người dùng đối tượng sở liệu • Thu hồi quyền thực thi câu lệnh sở liệu cấp phát cho người

dùng

4.3.1 Thu hồi quyền đối tượng sở liệu:

Cú pháp câu lệnh REVOKE sử dụng để thu hồi quyền cấp phát đối tượng sở liệu có cú pháp sau:

REVOKE [GRANT OPTION FOR]

(101)

|ON tên_thủ_tục |ON tên_hàm

FROM danh_sách_người_dùng [CASCADE]

Câu lệnh REVOKE sử dụng để thu hồi số quyền cấp phát cho người dùng thu hồi tất quyền (ALL PRIVILEGES)

Ví dụ 4.4: Thu hồi quyền thực thi lệnh INSERT bảng LOP người dùng thuchanh

REVOKE INSERT ON lop

FROM thuchanh

Giả sử người dùng thuchanh cấp phát quyền xem liệu cột HODEM, TEN NGAYSINH bảng SINHVIEN, câu lệnh thu hồi quyền cấp phát cột NGAYSINH (chỉ cho phép xem liệu cột HODEM TEN)

REVOKE SELECT

ON sinhvien(ngaysinh) FROM thuchanh

Khi ta sử dụng câu lệnh REVOKE để thu hồi quyền đối tượng sở liêu từ người dùng náo đó, quyền mà ta cấp phát trước thu hồi, quyền mà người dùng cho phép người dùng khác cịn có hiệu lực Nói cách khác, hai người dùng khác cấp phát quyền đối tượng sở liệu cho người dùng khác, sau người thu thu hồi lại quyền cấp phát quyền mà người dùng thứ hai cấp phát có hiệu lực

Ví dụ 4.5: Giả sử sở liệu ta có người dùng A, B C A B có

quyền sử dụng cấp phát quyền bảng R A thực lệnh sau để cấp phát quyền xem liệu bảng R cho C:

GRANT SELECT ON R TO C

và B cấp phát quyền xem bổ sung liệu bảng R cho C câu lệnh: GRANT SELECT, INSERT

ON R TO C

(102)

REVOKE SELECT, INSERT ON R FROM C

Người dùng C khơng cịn quyền bổ sung liệu bảng R xem liệu bảng (quyền A cấp cho C hiệu lực)

Nếu ta cấp phát quyền cho người dùng câu lệnh GRANT với tuỳ chọn WITH GRANT OPTION thu hồi quyền câu lệnh REVOKE phải định tuỳ chọn CASCADE Trong trường hợp này, quyền chuyển tiếp cho người dùng khác đồng thời thu hồi

Ví dụ 4.6: Ta cấp phát cho người dùng A bảng R với câu lệnh GRANT sau:

GRANT SELECT ON R TO A

WITH GRANT OPTION

sau người dùng A lại cấp phát cho người dùng B quyền xem liệu R với câu lệnh:

GRANT SELECT ON R TO B

Nếu muốn thu hồi quyền cấp phát cho người dùng A, ta sử dụng câu lệnh REVOKE sau:

REVOKE SELECT ON NHANVIEN FROM A CASCADE

Câu lệnh đồng thời thu hồi quyền mà A cấp cho B A B xem liệu bảng R

Trong trường hợp cần thu hồi quyền chuyển tiếp khả chuyển tiếp quyền người cấp phát quyền với tuỳ chọn WITH GRANT OPTION, câu lệnh REVOKE ta định mệnh đề GRANT OPTION FOR

Ví dụ 4.7: Trong ví dụ trên, ta thay câu lệnh:

REVOKE SELECT ON NHANVIEN FROM A CASCADE câu lệnh:

REVOKE GRANT OPTION FOR SELECT ON NHANVIEN

(103)

Thì B khơng cịn quyền xem liệu bảng R đồng thời A chuyển tiếp quyền mà ta cấp phát cho người dùng khác (tuy nhiên A quyền xem liệu bảng R)

4.3.2 Thu hồi quyền thực thi câu lênh:

Việc thu hồi quyền thực thi câu lệnh sở liệu (CREATE DATABASE, CREATE TABLE, CREATE VIEW, ) thực đơn giản với câu lệnh REVOKE có cú pháp:

REVOKE ALL | các_câu_lệnh_cần_thu_hồi FROM danh_sách_người_dùng

Ví dụ 4.8: Để khơng cho phép người dùng thuchanh thực lệnh CREATE TABLE

trên sở liệu, ta sử dụng câu lệnh: REVOKE CREATE TABLE FROM thuchanh

(104)

C

Chhưươơnngg55

T

THH TTCC LLƯƯUU TTRR,,HHÀÀMM VVÀÀ TTRRIIGGGGEERR

5.1 Thủ tục lưu trữ (stored procedure)

5.1.1 Các khái niệm

Như đề cập chương trước, SQL thiết kế cài đặt ngôn ngữ để thực thao tác sở liệu tạo lập cấu trúc sở liệu, bổ sung, cập nhật, xoá truy vấn liệu sở liệu Các câu lệnh SQL người sử dụng viết yêu cầu hệ quản trị sở liệu thực theo chế độ tương tác

Các câu lệnh SQL nhúng vào ngơn ngữ lập trình, thơng qua chuỗi thao tác sở liệu xác định thực thi nhờ vào câu lệnh, cấu trúc điều khiển thân ngôn ngữ lập trình sử dụng

Với thủ tục lưu trữ, phần khả ngơn ngữ lập trình đưa vào ngơn ngữ SQL Một thủ tục đối tượng sở liệu bao gồm tập nhiều câu lệnh SQL nhóm lại với thành nhóm với khả sau:

• Các cấu trúc điều khiển (IF, WHILE, FOR) sử dụng thủ tục

• Bên thủ tục lưu trữ sử dụng biến ngôn ngữ lập trình nhằm lưu giữ giá trị tính tốn được, giá trị truy xuất từ sở liệu

• Một tập câu lệnh SQL kết hợp lại với thành khối lệnh bên thủ tục Một thủ tục nhận tham số truyền vào trả giá trị thông qua tham số (như ngơn ngữ lập trình) Khi thủ tục lưu trữ định nghĩa, gọi thông qua tên thủ tục, nhận tham số truyền vào, thực thi câu lệnh SQL bên thủ tục trả giá trị sau thực xong Sử dụng thủ tục lưu trữ sở liệu giúp tăng hiệu sở liệu, mang lại lợi ích sau:

(105)

• Thủ tục lưu trữ phân tích, tối ưu tạo nên việc thực thi chúng nhanh nhiều so với việc phải thực tập rời rạc câu lệnh SQL tương đương theo cách thông thường

• Thủ tục lưu trữ cho phép thực yêu cầu câu lệnh đơn giản thay phải sử dụng nhiều dịng lệnh SQL Điều làm giảm thiểu lưu thơng mạng

• Thay cấp phát quyền trực tiếp cho người sử dụng câu lệnh SQL đối tượng sở liệu, ta cấp phát quyền cho người sử dụng thơng qua thủ tục lưu trữ, nhờ tăng khả bảo mật hệ thống

5.1.2 Tạo thủ tục lưu trữ

Thủ tục lưu trữ tạo câu lệnh CREATE PROCEDURE với cú pháp 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 thủ tục cần tạo Tên phải tuân theo qui tắc định danh không vượt 128 ký tự

danh_sách_tham_số Các tham số thủ tục khai báo sau tên thủ tục thủ tục có nhiều tham số khai báo phân cách dấu phẩy Khai báo tham số tối thiểu phải bao gồm hai phần:

• tên tham số bắt đầu dấu @ • kiểu liệu tham số

Ví dụ:

@mamonhoc nvarchar(10)

(106)

ENCRYPTION Thủ tục mã hoá tuỳ chọn WITH ENCRYPTION định Nếu thủ tục mã hố, ta khơng thể xem nội dung thủ tục

các_câu_lệnh_của_thủ_tục Tập hợp câu lệnh sử dụng nội dung thủ tục Các câu lệnh đặt cặp từ khố BEGIN END khơng

Ví dụ 5.1: Giả sử ta cần thực chuỗi thao tác sau sở liệu

1 Bổ sung thêm môn học sở liệu có mã TI-005 số đơn vị học trình vào bảng MONHOC

2 Lên danh sách nhập điểm thi môn sở liệu cho sinh viên học lớp có mã C24102 (tức bổ sung thêm vào bảng DIEMTHI ghi với cột MAMONHOC nhận giá trị TI-005, cột MASV nhận giá trị lần lượt mã sinh viên học lớp có mã C24105 cột điểm NULL)

Nếu thực yêu cầu thông qua câu lệnh SQL thông thường, ta phải thực thi hai câu lệnh sau:

INSERT INTO MONHOC

VALUES('TI-005','Cơ sở liệu',5) INSERT INTO DIEMTHI(MAMONHOC,MASV) SELECT ‘TI-005’,MASV

FROM SINHVIEN

WHERE MALOP='C24102'

Thay phải sử dụng hai câu lệnh trên, ta định nghĩa môt thủ tục lưu trữ với các tham số vào @mamonhoc, @tenmonhoc, @sodvht @malop sau:

CREATE PROC sp_LenDanhSachDiem(

@mamonhoc NVARCHAR(10), @tenmonhoc NVARCHAR(50), @sodvht SMALLINT, @malop NVARCHAR(10)) AS

BEGIN

INSERT INTO monhoc

(107)

SELECT @mamonhoc,masv FROM sinhvien

WHERE malop=@malop END

Khi thủ tục tạo ra, ta thực hai yêu cầu đặt cách đơn giản thơng qua lịi gọi thủ tục:

sp_LenDanhSachDiem 'TI-005','Cơ sở liệu',5,'C24102'

5.1.3 Lời gọi thủ tục lưu trữ

Như thấy ví dụ trên, thủ tục lưu trữ tạo ra, ta yêu cầu hệ quản trị sở liệu thực thi thủ tục 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 đối số thứ tự chúng phải phù hợp với số lượng thứ tự tham số định nghĩa thủ tục

Trong trường hợp lời gọi thủ tục thực bên thủ tục khác, bên trigger hay kết hợp với câu lệnh SQL khác, ta sử dụng cú pháp sau: EXECUTE tên_thủ_tục [danh_sách_các_đối_số]

Thứ tự đối số truyền cho thủ tục khơng cần phải tn theo thứ tự tham số định nghĩa thủ tục tất đối số viết dạng:

@tên_tham_số = giá_trị

Ví dụ 5.2: Lời gọi thủ tục ví dụ viết sau:

sp_LenDanhSachDiem @malop='C24102',

@tenmonhoc='Cơ sở liệu', @mamonhoc='TI-005', @sodvht=5

5.1.4 Sử dụng biến thủ tục

Ngoài tham số truyền cho thủ tục, bên thủ tục cịn sử dụng biến nhằm lưu giữ giá trị tính tốn truy xuất từ sở liệu Các biến thủ tục khai báo từ khoá DECLARE theo cú pháp sau:

DECLARE @tên_biến kiểu_dữ_liệu

(108)

Ví dụ 5.3: Trong định nghĩa thủ tục sử dung biến chứa giá trị truy

xuất từ sở 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 năm' ELSE

PRINT 'Hai lớp nhập học khác năm'

5.1.5 Giá trị trả tham số thủ tục lưu trữ

Trong ví dụ trước, đối số truyền cho thủ tục có lời gọi đến thủ tục biến, thay đổi giá trị biền thủ tục khơng giữ lại kết thúc q trình thực thủ tục

Ví dụ 5.4: Xét câu lệnh sau

CREATE PROCEDURE sp_Conghaiso(@a INT,@b INT, @c INT) AS

SELECT @c=@a+@b

(109)

SELECT @tong=0

EXECUTE sp_Conghaiso 100,200,@tong SELECT @tong

Câu lệnh “SELECT @tong” cuối loạt câu lệnh cho kết là: Trong trường hợp cần phải giữ lại giá trị đối số sau kết thúc thủ tục, ta phải khai báo tham số thủ tục theo cú pháp sau:

@tên_tham_số kiểu_dữ_liệu OUTPUT hoặc:

@tên_tham_số kiểu_dữ_liệu OUT

và lời gọi thủ tục, sau đối số truyền cho thủ tục, ta phải định thêm từ khố OUTPUT (hoặc OUT)

Ví dụ 5.5: Ta định nghĩa lại thủ tục ví dụ 5.4 sau:

CREATE PROCEDURE sp_Conghaiso(

@a INT,

@b INT,

@c INT OUTPUT)

AS

SELECT @c=@a+@b

và thực lời gọi thủ tục tập câu lệnh sau: DECLARE @tong INT

SELECT @tong=0

EXECUTE sp_Conghaiso 100,200,@tong OUTPUT SELECT @tong

thì câu lệnh “SELECT @tong” cho kết là: 300

5.1.6 Tham số với giá trị mặc định

Các tham số khai báo thủ tục nhận giá trị mặc định Giá trị mặc định gán cho tham số trường hợp không truyền đối số cho tham số có lời gọi đến thủ tục

Tham số với giá trị mặc định khai báo theo cú pháp sau: @tên_tham_số kiểu_dữ_liệu = giá_trị_mặc_định

Ví dụ 5.6: Trong câu lệnh đây:

(110)

@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 định nghĩa với tham số @tenlop có giá trị mặc định

NULL tham số @noisinh có giá trị mặc định Huế Với thủ tục định nghĩa

như trên, ta thực lời gọi với mục đích khác sau: • Cho biết họ tên sinh viên sinh Huế:

sp_testdefault

• Cho biết họ tên sinh viên lớp Tin K24 sinh Huế: sp_testdefault @tenlop='Tin K24'

• Cho biết họ tên sinh viên sinh Nghệ An: sp_testDefault @noisinh=N'Nghệ An'

• Cho biết họ tên sinh viên lớp Tin K26 sinh Đà Nẵng:

sp_testdefault @tenlop='Tin K26',@noisinh='Đà Nẵng'

5.1.7 Sửa đổi thủ tục

Khi thủ tục tạo ra, ta tiến hành định nghĩa lại thủ tục câu lệnh ALTER PROCEDURE có cú pháp sau:

ALTER PROCEDURE tên_thủ_tục [(danh_sách_tham_số)] [WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION] AS

(111)

Câu lệnh sử dụng tương tự câu lệnh CREATE PROCEDURE Việc sửa đổi lại thủ tục có khơng làm thay đổi đến quyền cấp phát thủ tục không tác động đến thủ tục khác hay trigger phụ thuộc vào thủ tục

5.1.8 Xoá thủ tục

Để xố thủ tục có, ta sử dụng câu lệnh DROP PROCEDURE với cú pháp sau:

DROP PROCEDURE tên_thủ_tục

Khi xoá thủ tục, tất quyền cấp cho người sử dụng thủ tục đồng thời bị xố bỏ Do đó, tạo lại thủ tục, ta phải tiến hành cấp phát lại quyền thủ tục

5.2 Hàm người dùng định nghĩa

Hàm đối tượng sở liệu tương tự thủ tục Điểm khác biệt hàm thủ tục hàm trả giá trị thơng qua tên hàm cịn thủ tục khơng Điều cho phép ta sử dụng hàm thành phần biêu thức (chẳng hạn danh sách chọn câu lệnh SELECT)

Ngoài hàm hệ quản trị sở liệu cung cấp sẵn, người sử dụng định nghĩa thêm hàm nhằm phục vụ cho mục đích riêng

5.2.1 Định nghĩa sử dụng hàm

Hàm định nghĩa thông qua câu lệnh CREATE FUNCTION với cú pháp 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 định nghĩa hàm tính ngày tuần (thứ tuần)

một giá trị kiểu ngày

CREATE FUNCTION thu(@ngay DATETIME) RETURNS NVARCHAR(10)

AS

(112)

DECLARE @st NVARCHAR(10)

SELECT @st=CASE DATEPART(DW,@ngay) WHEN THEN 'Chu nhật' WHEN THEN 'Thứ hai' WHEN THEN 'Thứ ba' WHEN THEN 'Thứ tư' WHEN THEN 'Thứ năm' WHEN THEN 'Thứ sáu' ELSE 'Thứ bảy'

END

RETURN (@st) /* Trị trả hàm */ END

Một hàm định nghĩa sử dụng hàm hệ quản trị sở liệu cung cấp (thông thường trước tên hàm ta phải định thêm tên người sở hữu hàm)

Ví dụ 5.8: Câu lệnh SELECT sử dụng hàm định nghĩa ví dụ trước:

SELECT masv,hodem,ten,dbo.thu(ngaysinh),ngaysinh FROM sinhvien

WHERE malop=’C24102’ có kết là:

5.2.2 Hàm với giá trị trả “dữ liệu kiểu bảng”

(113)

Ví dụ 5.9: Xét khung nhìn định nghĩa sau:

CREATE VIEW sinhvien_k25 AS

SELECT masv,hodem,ten,ngaysinh FROM sinhvien INNER JOIN lop ON sinhvien.malop=lop.malop WHERE khoa=25

với khung nhìn trên, thơng qua câu lệnh: SELECT * FROM sinhvien_K25

ta biết danh sách sinh viên khoá 25 cách dễ dàng rõ ràng khơng thể thơng qua khung nhìn để biết danh sách sinh viên khoá khác do khơng thể sử dụng điều kiện có dạng KHOA = @thamso mệnh đề WHERE câu lệnh SELECT

Nhược điểm khung nhìn khắc phục cách sử dụng hàm với giá trị trả dạng bảng gọi hàm nội tuyến (inline function) Việc sử dụng hàm loại cung cấp khả khung nhìn cho phép sử dụng tham số nhờ tính linh hoạt cao

Một hàm nội tuyến định nghĩa câu lệnh CREATE TABLE với cú pháp sau:

CREATE FUNCTION tên_hàm ([danh_sách_tham_số]) RETURNS TABLE

AS

RETURN (câu_lệnh_select)

Cú pháp hàm nội tuyến phải tuân theo qui tắc sau:

• Kiểu trả hàm phải định mệnh đề RETURNS TABLE • Trong phần thân hàm có câu lệnh RETURN xác định

giá trị trả hàm thông qua câu lệnh SELECT Ngồi ra, khơng sử dụng câu lệnh khác phần thân hàm

Ví dụ 5.10: Ta định nghĩa hàm func_XemSV sau:

CREATE FUNCTION func_XemSV(@khoa SMALLINT) RETURNS TABLE

(114)

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

WHERE khoa=@khoa)

hàm nhận tham số đầu vào khóa sinh viên cần xem giá trị trả hàm tập dịng liệu cho biết thơng tin sinh viên khố Các hàm trả giá trị dạng bảng sử dụng bảng hay khung nhìn câu lệnh SQL

Với hàm định nghĩa trên, để biết danh sách sinh viên khoá 25, ta sử dụng câu lệnh sau:

SELECT * FROM dbo.func_XemSV(25)

còn câu lệnh cho ta biết danh sách sinh viên khoá 26 SELECT * FROM dbo.func_XemSV(26)

Đối với hàm nội tuyến, phần thân hàm cho phép xuất câu lệnh RETURN Trong trường hợp cần phải sử dụng đến nhiều câu lệnh phần thân hàm, ta sử dụng cú pháp sau để định nghĩa hàm:

CREATE FUNCTION tên_hàm([danh_sách_tham_số]) RETURNS @biến_bảng TABLE định_nghĩa_bảng AS

BEGIN

các_câu_lệnh_trong_thân_hàm

RETURN END

Khi định nghĩa hàm dạng cần lưu ý số điểm sau:

• Cấu trúc bảng trả hàm xác định dựa vào định nghĩa bảng mệnh đề RETURNS Biến @biến_bảng mệnh đề RETURNS có phạm vi sử dụng hàm sử dụng tên bảng

• Câu lệnh RETURN thân hàm không định giá trị trả Giá trị trả về hàm dịng liệu bảng có tên @biếnbảng định nghĩa mệnh đề RETURNS

(115)

Ví dụ 5.11: Ta định nghĩa hàm func_TongSV sau:

CREATE FUNCTION Func_Tongsv(@khoa SMALLINT) RETURNS @bangthongke TABLE

(

makhoa NVARCHAR(5), tenkhoa NVARCHAR(50), tongsosv INT

) AS

BEGIN

IF @khoa=0

INSERT INTO @bangthongke

SELECT khoa.makhoa,tenkhoa,COUNT(masv) FROM (khoa INNER JOIN lop

ON khoa.makhoa=lop.makhoa) INNER JOIN sinhvien

on lop.malop=sinhvien.malop GROUP BY khoa.makhoa,tenkhoa

ELSE

INSERT INTO @bangthongke

SELECT khoa.makhoa,tenkhoa,COUNT(masv) FROM (khoa INNER JOIN lop

ON khoa.makhoa=lop.makhoa) INNER JOIN sinhvien

ON lop.malop=sinhvien.malop WHERE khoa=@khoa

GROUP BY khoa.makhoa,tenkhoa RETURN /*Trả kết cho hàm*/ END

Với hàm định nghĩa trên, câu lệnh:

SELECT * FROM dbo.func_TongSV(25)

(116)

Còn câu lệnh:

SELECT * FROM dbo.func_TongSV(0)

Cho ta biết tổng số sinh viên có (tất khoá) khoa:

5.3 Trigger

Trong chương 4, ta biết ràng buộc sử dụng để đảm bảo tính tồn vẹn liệu sở liệu Một đối tượng khác thường sử dụng sở liệu với mục đích trigger Cũng tương tự thủ tục lưu trữ, trigger đối tượng chứa tập câu lệnh SQL tập câu lệnh thực thi trigger gọi Điểm khác biệt thủ tục lưu trữ trigger là: thủ tục lưu trữ thực thi người sử dụng có lời gọi đến chúng trigger lại “gọi” tự động xảy giao tác làm thay đổi liệu bảng

Mỗi trigger tạo gắn liền với bảng sở liệu Khi liệu bảng bị thay đổi (tức bảng chịu tác động câu lệnh INSERT, UPDATE hay DELETE) trigger tự đơng kích hoạt

Sử dụng trigger cách hợp lý sở liệu có tác động lớn việc tăng hiệu sở liệu Các trigger thực hữu dụng với khả sau:

• Một trigger nhận biết, ngăn chặn huỷ bỏ thao tác làm thay đổi trái phép liệu sở liệu

(117)

• Thơng qua trigger, ta tạo kiểm tra mối quan hệ phức tạp bảng sở liệu mà thân ràng buộc thực

5.3.1 Định nghĩa trigger

Một trigger đối tượng gắn liền với bảng tự động kích hoạt xảy giao tác làm thay đổi liệu bảng Định nghĩa trigger bao gồm yếu tố sau:

• Trigger áp dụng bảng nào?

• Trigger kích hoạt câu lệnh thực thi bảng: INSERT, UPDATE, DELETE?

• Trigger làm kích hoạt?

Câu lệnh CREATE TRIGGER sử dụng để đinh nghĩa trigger có cú pháp 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ụ 5.12: Ta định nghĩa bảng sau:

Bảng MATHANG lưu trữ liệu 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 có*/

)

Bảng NHATKYBANHANG lưu trữ thông tin lần bán hàng CREATE TABLE nhatkybanhang

(

(118)

nguoimua NVARCHAR(30), /*tên người mua hàng*/ mahang NVARCHAR(5) /*mã mặt hàng bán*/ FOREIGN KEY REFERENCES mathang(mahang), soluong INT, /*giá bán hàng*/

giaban MONEY /*số lượng hàng bán*/ )

Câu lệnh định nghĩa trigger trg_nhatkybanhang_insert Trigger có chức tự động giảm số lượng hàng có mặt hàng bán (tức câu lệnh INSERT thực thi 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, liệu bảng MATHANG là:

thì sau ta thực câu lênh:

INSERT INTO nhatkybanhang

(ngay,nguoimua,mahang,soluong,giaban) VALUES('5/5/2004','Tran Ngoc Thanh','H1',10,5200) liệu bảng MATHANG sau:

Trong câu lệnh CREATE TRIGGER ví dụ trên, sau mệnh đề ON tên bảng mà trigger cần tạo tác động đến Mệnh đề định câu lệnh kích hoạt trigger (FOR INSERT) Ngồi INSERT, ta cịn định UPDATE DELETE cho mệnh đề này, kết hợp chúng lại với Phần thân

(119)

Chuẩn SQL định nghĩa hai bảng logic INSERTED DELETED để sử dụng trigger Cấu trúc hai bảng tương tự cấu trúc bảng mà trigger tác động Dữ liệu hai bảng tuỳ thuộc vào câu lệnh tác động lên bảng làm kích hoạt trigger; cụ thể trường hợp sau:

• Khi câu lệnh DELETE thực thi bảng, dòng liệu bị xoá chép vào bảng DELETED Bảng INSERTED trường hợp khơng có liệu

• Dữ liệu bảng INSERTED dòng liệu bổ sung vào bảng gây nên kích hoạt trigger câu lệnh INSERT Bảng DELETED trường hợp khơng có liệu

• Khi câu lệnh UPDATE thực thi bảng, dòng liệu cũ chịu tác động câu lệnh chép vào bảng DELETED, bảng INSERTED dòng sau cập nhật

5.3.2 Sử dụng mệnh đề IF UPDATE trigger

Thay định trigger kích hoạt bảng, ta định trigger kích hoạt thực thao tác cụ thể việc thay đổi liệu liên quan đến số cột định cột Trong trường hợp này, ta sử dụng mệnh đề IF UPDATE trigger IF UPDATE không sử dụng câu lệnh DELETE

Ví dụ 5.13: Xét lại ví dụ với hai bảng MATHANG NHATKYBANHANG, trigger

dưới kích hoạt ta tiến hành cập nhật cột SOLUONG cho ghi bảng NHATKYBANHANG (lưu ý cập nhật 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

(120)

sẽ kích hoạt trigger ứng với mệnh đề IF UPDATE (soluong) câu lệnh UPDATE trigger 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

Mệnh đề IF UPDATE xuất nhiều lần phần thân trigger Khi đó, mệnh đề IF UPDATE phần câu lệnh mệnh đề thực thi trigger kích hoạt

Ví dụ 5.14: Giả sử ta định nghĩa bảng R 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

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 kích hoạt trigger cho kết là:

A updated câu lệnh:

UPDATE R SET C=100 WHERE C=2 kích hoạt trigger cho kết là: C updated

còn câu lệnh:

(121)

5.3.3 ROLLBACK TRANSACTION trigger

Một trigger có khả nhận biết thay đổi mặt liệu bảng liệu, từ phát huỷ bỏ thao tác không đảm bảo tính tồn vẹn liệu Trong trigger, để huỷ bỏ tác dụng 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 bảng MATHANG, ta tạo trigger sau:

CREATE TRIGGER trg_mathang_delete ON mathang

FOR DELETE AS

ROLLBACK TRANSACTION

Thì câu lệnh DELETE khơng thể có tác dụng bảng MATHANG Hay nói cách khác, ta khơng thể xố liệu bảng

Ví dụ 5.16: Trigger kích hoạt câu lệnh INSERT sử dụng để bổ

sung ghi cho bảng NHATKYBANHANG Trong trigger kiểm tra điều kiện hợp lệ liệu số lượng hàng bán phải nhỏ số lượng hàng có Nếu điều kiện khơng thoả mãn huỷ bỏ thao tác bổ sung liệu

CREATE TRIGGER trg_nhatkybanhang_insert ON NHATKYBANHANG

FOR INSERT AS

DECLARE @sl_co int /* Số lượng hàng có */ DECLARE @sl_ban int /* Số lượng hàng bán */ DECLARE @mahang nvarchar(5) /* Mã hàng 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 có nhỏ số lượng bán

huỷ bỏ thao tác bổ sung liệu */

(122)

IF @sl_co<@sl_ban

ROLLBACK TRANSACTION /* Nếu liệu hợp lệ

giảm số lượng hàng có */

ELSE

UPDATE mathang

SET soluong=soluong-@sl_ban WHERE mahang=@mahang

5.3.4 Sử dụng trigger trường hợp câu lệnh INSERT, UPDATE DELETE có tác động đến nhiều dịng liệu

Trong ví dụ trước, trigger thực hoạt động mục đích câu lệnh kích hoạt trigger có tác dụng dịng liêu Ta nhận thấy câu lệnh UPDATE DELETE thường có tác dụng nhiều dòng, câu lệnh INSERT rơi vào trường hợp khơng gặp; ta sử dụng câu lệnh có dạng INSERT INTO SELECT Vậy làm để trigger hoạt động trường hợp câu lệnh có tác động lên nhiều dịng liệu?

Có hai giải pháp sử dụng vấn đề này: • Sử dụng truy vấn

• Sử dụng biến trỏ

5.3.4.1 Sử dụng truy vấn

Ta hình dung vấn đề cách khắc phục qua ví dụ đây:

Ví dụ 5.17: Ta xét lại trường hợp hai bảng MATHANG NHATKYBANHANG

(123)

Trigger cập nhật lại số lượng hàng bảng MATHANG câu lệnh UPDATE sử dụng để cập nhật cột SOLUONG 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 định nghĩa trên, thực câu lệnh: UPDATE nhatkybanhang

SET soluong = soluong + 10 WHERE stt =

thì liệu hai bảng MATHANG NHATKYBANHANG là:

Bảng MATHANG Bảng NHATKYBANHANG

Tức số lượng mặt hàng có mã H1 giảm 10 Nhưng thực tiếp câu lệnh:

UPDATE nhatkybanhang SET soluong=soluong + WHERE mahang='H2'

(124)

Bảng MATHANG Bảng NHATKYBANHANG

Ta nhận thấy số lượng mặt hàng có mã H2 cịn lại 40 (giảm 5) đúng phải 35 (tức phải giảm 10) Như vậy, trigger không hoạt động trường hợp

Để khắc phục lỗi gặp phải trên, ta định nghĩa lại trigger sau: CREATE TRIGGER trg_nhatkybanhang_update_soluong ON nhatkybanhang

FOR UPDATE AS

IF UPDATE(soluong) UPDATE mathang

SET mathang.soluong = mathang.soluong -

(SELECT SUM(inserted.soluong-deleted.soluong) FROM inserted INNER JOIN deleted

ON inserted.stt=deleted.stt WHERE inserted.mahang = mathang.mahang) WHERE mathang.mahang IN (SELECT mahang

FROM inserted) hoặc:

CREATE TRIGGER trg_nhatkybanhang_update_soluong ON nhatkybanhang

FOR UPDATE AS

IF UPDATE(soluong)

/* Nếu số lượng dòng cập nhật */ IF @@ROWCOUNT =

BEGIN

UPDATE mathang

SET mathang.soluong = mathang.soluong – (inserted.soluong-deleted.soluong) FROM (deleted INNER JOIN inserted ON

(125)

END ELSE BEGIN

UPDATE mathang

SET mathang.soluong = mathang.soluong -

(SELECT SUM(inserted.soluong-deleted.soluong) FROM inserted INNER JOIN deleted

ON inserted.stt=deleted.stt WHERE inserted.mahang = mathang.mahang) WHERE mathang.mahang IN (SELECT mahang

FROM inserted) END

5.3.4.2 Sử dụng biến trỏ

Một cách khác để khắc phục lỗi xảy ví dụ 5.17 sử dụng trỏ để duyệt qua dòng liệu kiểm tra dòng Tuy nhiên, sử dụng biến trỏ trigger giải pháp nên chọn trường hợp thực cần thiết

Một biến trỏ sử dụng để duyệt qua dòng liệu kết truy vấn khai báo theo cú pháp sau:

DECLARE tên_con_trỏ CURSOR FOR câu_lệnh_SELECT

Trong câu lệnh SELECT phải có kết dạng bảng Tức câu lệnh không sử dụng mệnh đề COMPUTE INTO

Để mở biến trỏ ta sử dụng câu lệnh: OPEN tên_con_trỏ

Để sử dụng biến trỏ duyệt qua dòng liệu truy vấn, ta sử dụng câu lệnh FETCH Giá trị biến trạng thái @@FETCH_STATUS khơng chưa duyệt hết dịng kết truy vấn

Câu lệnh FETCH có cú pháp sau:

FETCH [[NEXT|PRIOR|FIST|LAST] FROM] tên_con_trỏ [INTO danh_sách_biến ]

Trong biến danh sách biến sử dụng để chứa giá trị trường ứng với dòng liệu mà trỏ trỏ đến Số lượng biến phải với số lượng cột kết truy vấn câu lệnh DECLARE CURSOR

Ví dụ 5.18: Tập câu lệnh ví dụ minh hoạ cách sử dụng biến trỏ

(126)

DECLARE contro CURSOR

FOR SELECT mahang,tenhang,soluong FROM mathang OPEN contro

DECLARE @mahang NVARCHAR(10) DECLARE @tenhang NVARCHAR(10) DECLARE @soluong INT

/*Bắt đầu duyệt qua dòng kết truy vấn*/ FETCH NEXT FROM contro

INTO @mahang,@tenhang,@soluong WHILE @@FETCH_STATUS=0

BEGIN

PRINT 'Ma hang:'+@mahang PRINT 'Ten hang:'+@tenhang

PRINT 'So luong:'+STR(@soluong) FETCH NEXT FROM contro

INTO @mahang,@tenhang,@soluong END

/*Đóng trỏ giải phóng vùng nhớ*/ CLOSE contro

DEALLOCATE contro

Ví dụ 5.19: Trigger cách giải khác trường hợp đề cập

ở ví dụ 5.17

CREATE TRIGGER trg_nhatkybanhang_update_soluong ON nhatkybanhang

FOR UPDATE AS

IF UPDATE(soluong) BEGIN

DECLARE @mahang NVARCHAR(10) DECLARE @soluong INT

DECLARE contro CURSOR FOR SELECT inserted.mahang,

inserted.soluong-deleted.soluong AS soluong FROM inserted INNER JOIN deleted

(127)

FETCH NEXT FROM contro INTO @mahang,@soluong WHILE @@FETCH_STATUS=0

BEGIN

UPDATE mathang SET soluong=soluong-@soluong WHERE mahang=@mahang

FETCH NEXT FROM contro INTO @mahang,@soluong END

CLOSE contro DEALLOCATE contro END

END

Bài tập chương

Dựa sở liệu tập chương 2, thực yêu cầu sau:

5.1 Tạo thủ tục lưu trữ để thông qua thủ tục bổ sung thêm ghi cho bảng MATHANG (thủ tục phải thực kiểm tra tính hợp lệ liệu cần bổ sung: khơng trùng khố đảm bảo tồn vẹn tham chiếu)

5.2 Tạo thủ tục lưu trữ có chức thống kê tổng số lượng hàng bán mặt hàng có mã (mã mặt hàng cần thống kê tham số thủ tục)

5.3 Viết hàm trả bảng cho biết tổng số lượng hàng bán mặt hàng Sử dụng hàm để thống kê xem tổng số lượng hàng (hiện có bán) mặt hàng

5.4 Viết trigger cho bảng CHITIETDATHANG theo yêu cầu sau:

• Khi ghi bổ sung vào bảng giảm số lượng hàng có số lượng hàng có lớn số lượng hàng bán Ngược lại huỷ bỏ thao tác bổ sung

• Khi cập nhật lại số lượng hàng bán, kiểm tra số lượng hàng cập nhật lại có phù hợp hay khơng (số lượng hàng bán không vượt số lượng hàng có khơng nhỏ 1) Nếu liệu hợp lệ giảm (hoặc tăng) số lượng hàng có cơng ty, ngược lại huỷ bỏ thao tác cập nhật

(128)

5.6 Để quản lý tin Website, người ta sử dụng hai bảng sau: Bảng LOAIBANTIN (loại tin)

CREATE TABLE loaibantin (

maphanloai INT NOT NULL PRIMARY KEY,

tenphanloai NVARCHAR(100) NOT NULL , bantinmoinhat INT DEFAULT(0) )

Bảng BANTIN (bản tin) CREATE TABLE bantin (

maso INT NOT NULL PRIMARY KEY,

ngayduatin DATETIME NULL , tieude NVARCHAR(200) NULL , noidung NTEXT NULL ,

maphanloai INT NULL FOREIGN KEY

REFERENCES loaibantin(maphanloai) )

Trong bảng LOAIBANTIN, giá trị cột BANTINMOINHAT cho biết mã số bản tin thuộc loại tương ứng (được bổ sung sau cùng)

Hãy viết trigger cho bảng BANTIN cho:

• Khi tin bổ sung, cập nhật lại cột BANTINMOINHAT dòng tương ứng với loại tin vừa bổ sung

• Khi tin bị xoá, cập nhật lại giá trị cột BANTINMOINHAT bảng LOAIBANTIN dòng ứng với loại tin vừa xóa mã số tin trước (dựa vào ngày đưa tin) Nếu khơng cịn tin loại giá trị cột

• Khi cập nhật lại mã số tin tin cập nhật lại giá trị cột BANTINMOINHAT mã số

# Lời giải:

5.1 CREATE PROCEDURE sp_insert_mathang(

(129)

@tenhang NVARCHAR(50),

@macongty NVARCHAR(10) = NULL, @maloaihang INT = NULL,

@soluong INT = 0,

@donvitinh NVARCHAR(20) = NULL, @giahang money = 0)

AS

IF NOT EXISTS(SELECT mahang FROM mathang WHERE mahang=@mahang)

IF (@macongty IS NULL OR EXISTS(SELECT macongty FROM nhacungcap

WHERE macongty=@macongty)) AND

(@maloaihang IS NULL OR

EXISTS(SELECT maloaihang FROM loaihang WHERE maloaihang=@maloaihang))

INSERT INTO mathang

VALUES(@mahang,@tenhang,

@macongty,@maloaihang,

@soluong,@donvitinh,@giahang) 5.2 CREATE PROCEDURE sp_thongkebanhang(@mahang NVARCHAR(10)) AS

SELECT mathang.mahang,tenhang,

SUM(chitietdathang.soluong) AS tongsoluong FROM mathang LEFT OUTER JOIN chitietdathang

ON mathang.mahang=chitietdathang.mahang WHERE mathang.mahang=@mahang

GROUP BY mathang.mahang,tenhang 5.3 Định nghĩa hàm:

CREATE FUNCTION func_banhang() RETURNS TABLE

AS

RETURN (SELECT mathang.mahang,tenhang, CASE

WHEN sum(chitietdathang.soluong) IS NULL THEN ELSE sum(chitietdathang.soluong)

END AS tongsl

(130)

GROUP BY mathang.mahang,tenhang)

Sử dụng hàm định nghĩa:

SELECT a.mahang,a.tenhang,soluong+tongsl

FROM mathang AS a INNER JOIN dbo.func_banhang() AS b ON a.mahang=b.mahang

5.4 CREATE TRIGGER trg_chitietdathang_insert ON chitietdathang

FOR INSERT AS

BEGIN

DECLARE @mahang NVARCHAR(100) DECLARE @soluongban INT

DECLARE @soluongcon INT

SELECT @mahang=mahang,@soluongban=soluong FROM inserted

SELECT @soluongcon=soluong FROM mathang WHERE mahang=@mahang

IF @soluongcon>=@soluongban

UPDATE mathang SET soluong=soluong-@soluongban WHERE mahang=@mahang

ELSE

ROLLBACK TRANSACTION END

CREATE TRIGGER trg_chitietdathang_update_soluong ON chitietdathang

FOR UPDATE AS

IF UPDATE(soluong) BEGIN

IF EXISTS(SELECT sohoadon FROM inserted WHERE soluong<0) ROLLBACK TRANSACTION

ELSE BEGIN

UPDATE mathang

SET soluong=soluong-

(SELECT SUM(inserted.soluong-deleted.soluong) FROM inserted INNER JOIN deleted

(131)

inserted.mahang=deleted.mahang WHERE inserted.mahang=mathang.mahang GROUP BY inserted.mahang)

WHERE mahang IN (SELECT DISTINCT mahang FROM inserted)

IF EXISTS(SELECT mahang FROM mathang WHERE soluong<0)

ROLLBACK TRANSACTION END

END

5.5 CREATE TRIGGER trg_chitietdathang_giaban ON chitietdathang

FOR INSERT,UPDATE AS

IF UPDATE(giaban)

IF EXISTS(SELECT inserted.mahang

FROM mathang INNER JOIN inserted

ON mathang.mahang=inserted.mahang WHERE mathang.giahang>inserted.giaban) ROLLBACK TRANSACTION

(132)

C

Chhưươơnngg66

G

GIIAAOO TTÁÁCC SSQQLL

6.1 Giao tác tính chất giao tác

Một giao tác (transaction) chuỗi nhiều câu lệnh SQL kết hợp lại với thành khối công việc Các câu lệnh SQL xuất giao tác thường có mối quan hệ tương đối mật thiết với thực thao tác độc lập Việc kết hợp câu lệnh lại với giao tác nhằm đảm bảo tính tồn vẹn liệu khả phục hồi liệu Trong giao tác, câu lệnh độc lập với tất câu lệnh giao tác đòi hỏi phải thực thi trọn vẹn không câu lệnh thực thi

Các cơ sở liệu sử dụng nhật ký giao tác (transaction log) để ghi lại thay đổi mà giao tác tạo sở liệu thơng qua phục hồi liệu trường hợp gặp lỗi hay hệ thống có cố

Một giao tác địi hỏi phải có bồn tính chất sau đây:

• Tính ngun tử (Atomicity): Mọi thay đổi mặt liệu phải thực trọn vẹn giao tác thực thành công thay đổi liệu xảy giao tác không thực trọn vẹn Nói cách khác, tác dụng câu lệnh giao tác phải câu lệnh đơn

• Tính qn (Consistency): Tính quan đòi hỏi sau giao tác kết thúc, cho dù thành công hay bị lỗi, tất liệu phải trạng thái quán (tức tồn vẹn liệu phải ln bảo tồn)

• Tính độc lập (Isolation): Tính độc lập giao tác có nghĩa tác dụng giao tác phải giống thực hệ thống Nói cách khác, giao tác thực thi đồng thời với giao tác khác hệ thống không chịu ảnh hưởng giao tác

(133)

SELECT INSERT UPDATE DELETE UPDATE SELECT INSERT UPDATE DELETE SELECT INSERT UPDATE Lỗi chơng trình!

Lỗi phần cứng!

R O L L B A C K R O L L B A C K

Trạng thái CSDL trớc giao tác tiến hành

Trạng thái CSDL sau giao tác tiến hành

Giao tác

Hỡnh 6.1: Giao tỏc SQL

6.2 Mơ hình giao tác SQL

Giao tác SQL định nghĩa dựa câu lệnh xử lý giao tác sau đây: • BEGIN TRANSACTION: Bắt đầu giao tác

• SAVE TRANSACTION: Đánh dấu vị trí giao tác (gọi điểm đánh dấu)

• ROLLBACK TRANSACTION: Quay lui trở lại đầu giao tác điểm đánh dấu trước giao tác

• COMMIT TRANSACTION: Đánh dấu điểm kết thúc giao tác Khi câu lệnh thực thi có nghĩa giao tác thực thành cơng

• ROLLBACK [WORK]: Quay lui trở lại đầu giao tác • COMMIT [WORK]: Đánh dấu kết thúc giao tác

Một giao tác SQL bắt đấu câu lệnh BEGIN TRANSACTION Câu lệnh đánh dấu điểm bắt đầu giao tác có cú pháp sau:

(134)

• Câu lệnh COMMIT TRANSACTION (hoặc COMMIT WORK) thực thi Câu lệnh báo hiệu kết thúc thành công giao tác Sau câu lệnh này, giao tác bắt đầu

• Khi câu lệnh ROLLBACK TRANSACTION (hoặc ROLLBACK WORK) thực thi để huỷ bỏ giao tác đưa sở liệu trạng thái trước giao tác bắt đầu Một giao tác bắt đầu sau câu lệnh ROLLBACK thực thi

• Một giao tác kết thúc trình thực gặp lỗi (chẩng hạn hệ thống gặp lỗi, kết nối mạng bị “đứt”, ) Trong trường hợp này, hệ thống tự động phục hồi lại trạng thái sở liệu trước giao tác bắt đầu (tương tự câu lệnh ROLLBACK thực thi để huỷ bỏ giao tác) Tuy nhiên, trường hợp khơng có giao tác bắt đầu

Ví dụ 6.1: Giao tác kết thúc lệnh ROLLBACK TRANSACTION

thay đổi vể mặt liệu mà giao tác thực (UPDATE) khơng có tác dụng BEGIN TRANSACTION giaotac1

UPDATE monhoc SET sodvht=4 WHERE sodvht=3

UPDATE diemthi SET diemlan2=0 WHERE diemlan2 IS NULL ROLLBACK TRANSACTION giaotac1

còn giao tác kết thúc lệnh COMMIT thực thành công việc cập nhật liệu bảng MONHOC DIEMTHI

BEGIN TRANSACTION giaotac2

UPDATE monhoc SET sodvht=4 WHERE sodvht=3

UPDATE diemthi SET diemlan2=0 WHERE diemlan2 IS NULL COMMIT TRANSACTION giaotac2

Câu lệnh:

SAVE TRANSACTION tên_điểm_dánh_dấu

được sử dụng để đánh dấu vị trí giao tác Khi câu lệnh thực thi, trạng thái sở liệu thời điểm ghi lại nhật ký giao tác Trong q trình thực thi giao tác quay trở lại điểm đánh dấu cách sử dụng câu lệnh:

ROLLBACK TRANSACTION tên_điểm_đánh_dấu

(135)

BEGIN TRANSACTION trans_example

INSERT Tr¹ng thái CSDL

trớc giao tác tiến hành

Trạng thái CSDL sau giao tác tiến hành

UPDATE

SAVE TRANSACTION a

UPDATE

SAVE TRANSACTION b

INSERT

UPDATE

ROLLBACK TRANSACTION b

UPDATE

SELECT

COMMIT TRANSACTION

Trạng thái CSDL điểm đánh dấu a

Trạng thái CSDL im ỏnh du b Giao tỏc:

Bắt đầu lƯnh BEGIN

TRANSACTION vµ kÕt thóc bëi lƯnh COMMIT TRANSACTION

Hình 6.2: Hoạt động giao tác

Sau câu lệnh ROLLBACK TRANSACTION sử dụng để quay lui lại điểm đánh dấu giao tác, giao tác tiếp tục với câu lệnh sau Nhưng câu lệnh sử dụng để quay lui lại đầu giao tác (tức huỷ bỏ giao tác), giao tác kết thúc câu lệnh COMMIT TRANSACTION trường hợp gặp lỗi

Ví dụ 6.2: Câu lệnh COMMIT TRANSACTION giao tác kết thúc

thành công giao tác

BEGIN TRANSACTION giaotac3

(136)

SAVE TRANSACTION a

UPDATE monhoc SET sodvht=4 WHERE sodvht=3 ROLLBACK TRANSACTION a

UPDATE monhoc SET sodvht=2 WHERE sodvht=3 COMMIT TRANSACTION giaotac3

và ví dụ đây, câu lệnh COMMIT TRANSACTION gặp lỗi: BEGIN TRANSACTION giaotac4

UPDATE diemthi SET diemlan2=0 WHERE diemlan2 IS NULL SAVE TRANSACTION a

UPDATE monhoc SET sodvht=4 WHERE sodvht=3 ROLLBACK TRANSACTION giaotac4

UPDATE monhoc SET sodvht=2 WHERE sodvht=3 COMMIT TRANSACTION giaotac4

6.3 Giao tác lồng

Các giao tác SQL lồng vào theo cấp Điều thường gặp giao tác thủ tục lưu trữ gọi từ tiến trình giao tác khác

Ví dụ minh hoạ cho ta trường hợp giao tác lồng

Ví dụ 6.3: Ta định nghĩa bảng T sau:

CREATE TABLE T (

A INT PRIMARY KEY, B INT

)

và thủ tục sp_TransEx:

CREATE PROC sp_TranEx(@a INT,@b INT) AS

BEGIN

BEGIN TRANSACTION T1

IF NOT EXISTS (SELECT * FROM T WHERE A=@A ) INSERT INTO T VALUES(@A,@B)

IF NOT EXISTS (SELECT * FROM T WHERE A=@A+1) INSERT INTO T VALUES(@A+1,@B+1)

COMMIT TRANSACTION T1 END

(137)

EXECUTE sp_tranex 10,20 ROLLBACK TRANSACTION T3

Trong giao tác trên, câu lệnh ROLLBACK TRANSACTION T3 huỷ bỏ giao tác tác dụng lời gọi thủ tục giao tác không cịn tác dụng, tức khơng có dịng dữ liệu bổ sung vào bảng T (cho dù giao tác T1 thủ tục sp_tranex thực thành công với lệnh COMMIT TRANSACTION T1)

Ta xét tiếp trường hợp giao tác khác có lời gọi đến thủ tục

sp_tranex sau:

BEGIN TRANSACTION

EXECUTE sp_tranex 20,40 SAVE TRANSACTION a

EXECUTE sp_tranex 30,60 ROLLBACK TRANSACTION a EXECUTE sp_tranex 40,80 COMMIT TRANSACTION

sau giao tác thực xong, liệu bảng T là: A B

20 40 21 41 40 80 41 81

Như vậy, tác dụng lời gọi thủ tục sp_tranex 30,60 giao tác bị huỷ bỏ

bởi câu lệnh ROLLBACK TRANSACTION giao tác

Như thấy ví dụ trên, giao tác SQL lồng vào nhau, giao tác giao tác có vai trị định Nếu giao tác ngồi uỷ thác (commit) giao tác lồng bên đồng thời uỷ thác; Và giao tác thực lệnh ROLLBACK giao tác lồng bên chịu tác động câu lệnh (cho dù giao tác lồng bên thực lệnh COMMIT TRANSACTION)

(138)

P

PHH LLCC

A Cơ sở liệu mẫu sử dụng giáo trình

Trong tồn nội dung giáo trình, hầu hết ví dụ dựa sở liệu mẫu mô tả Cơ sở liệu cài đặt hệ quản trị sở liệu SQL Server 2000 sử dụng để quản lý sinh viên điểm thi sinh viên trường đại học Để tiện cho việc tra cứu kiểm chứng ví dụ, phần đầu phụ lục giới thiệu sơ qua sở liệu

Cơ sở liệu bao gồm bảng sau đây:

• Bảng KHOA lưu trữ liệu khoa có trường • Bảng LOP bao gồm liệu lớp trường

• Bảng SINHVIEN sử dụng để lưu trữ liệu sinh viên trường

• Bảng MONHOC bao gồm môn học (học phần) giảng dạy trường

• Bảng DIEMTHI với liệu cho biết điểm thi kết thúc môn học sinh viên

(139)

Các bảng sở liệu, mối quan hệ chúng số ràng buộc cài đặt sau:

CREATE TABLE khoa (

makhoa NVARCHAR(5) NOT NULL

CONSTRAINT pk_khoa PRIMARY KEY, tenkhoa NVARCHAR(50) NOT NULL ,

dienthoai NVARCHAR(15) NULL )

CREATE TABLE lop (

malop NVARCHAR(10) NOT NULL

CONSTRAINT pk_lop PRIMARY KEY, tenlop NVARCHAR(30) NULL ,

khoa SMALLINT NULL , hedaotao NVARCHAR(25) NULL , namnhaphoc INT NULL , siso INT NULL , makhoa NVARCHAR(5) NULL

)

CREATE TABLE sinhvien (

masv NVARCHAR(10) NOT NULL

CONSTRAINT pk_sinhvien PRIMARY KEY, hodem NVARCHAR(25) NOT NULL ,

ten NVARCHAR(10) NOT NULL , ngaysinh SMALLDATETIME NULL , gioitinh BIT NULL , noisinh NVARCHAR(100) NULL , malop NVARCHAR(10) NULL )

CREATE TABLE monhoc (

mamonhoc NVARCHAR(10) NOT NULL

(140)

sodvht SMALLINT NOT NULL )

CREATE TABLE diemthi (

mamonhoc NVARCHAR(10) NOT NULL , masv NVARCHAR(10) NOT NULL , diemlan1 NUMERIC(5, 2) NULL , diemlan2 NUMERIC(5, 2) NULL,

CONSTRAINT pk_diemthi PRIMARY KEY(mamonhoc,masv) )

ALTER TABLE lop ADD

CONSTRAINT fk_lop_khoa FOREIGN KEY(makhoa) REFERENCES khoa(makhoa) ON DELETE CASCADE

ON UPDATE CASCADE ALTER TABLE sinhvien ADD

CONSTRAINT fk_sinhvien_lop FOREIGN KEY (malop)

REFERENCES lop(malop) ON DELETE CASCADE ON UPDATE CASCADE ALTER TABLE diemthi ADD

CONSTRAINT fk_diemthi_monhoc FOREIGN KEY (mamonhoc)

REFERENCES monhoc(mamonhoc) ON DELETE CASCADE

ON UPDATE CASCADE,

CONSTRAINT fk_diemthi_sinhvien FOREIGN KEY (masv)

(141)

ON UPDATE CASCADE ALTER TABLE monhoc

ADD

CONSTRAINT chk_monhoc_sodht CHECK(sodvht>0 and sodvht<=5) ALTER TABLE diemthi

ADD

CONSTRAINT chk_diemthi_diemlan1 CHECK (diemlan1>=0 and diemlan1<=10), CONSTRAINT chk_diemthi_diemlan2

CHECK (diemlan2>=0 and diemlan2<=10)

B Một số hàm thường sử dụng

Mặc dù SQL chuẩn không cung cấp cụ thể hệ quản trị sở liệu cung cấp cho người sử dụng hàm cài sẵn (hay gọi hàm hệ thống) Trong phần này, cung cấp số hàm thường sử dụng SQL Server để tiện cho việc tra cứu sử dụng thực hành

B.1 Các hàm liệu kiểu chuỗi Hàm ASCII

ASCII(string)

Hàm trả mã ASCII ký tự bên trái chuỗi đối số

Hàm CHAR

CHAR(ascii_code)

Hàm trả ký tự có mã ASCII tương ứng với đối số

Hàm CHARINDEX

CHARINDEX(string1,string2[,start])

Hàm trả vị trí tính từ vị trí start chuỗi string1 xuất chuỗi string2

Hàm LEFT

LEFT(string,number)

Hàm trích number ký tự từ chuỗi string tính từ phía bên trái

Hàm LEN

(142)

Hàm trả độ dài chuỗi string

Hàm LOWER

LOWER(string)

Hàm có chức chuyển chuỗi string thành chữ thường, kết trả cho hàm

Hàm LTRIM

LTRIM(string)

Cắt bỏ khoảng trắng thừa bên trái chuỗi string

Hàm NCHAR

NCHAR(code_number)

Hàm trả ký tự UNICODE có mã định

Hàm REPLACE

REPLACE(string1,string2,string3)

Hàm trả chuỗi có cách thay chuỗi string2 chuỗi

string1 chuỗi string3 Hàm REVERSE

REVERSE(string)

Hàm trả chuỗi đảo ngược chuỗi string

Hàm RIGHT

RIGHT(string, number)

Hàm trích number ký tự từ chuỗi string tính từ phía bên phải

Hàm RTRIM

RTRIM(string)

Cắt bỏ khoảng trắng thừa bên phải chuỗi string

Hàm SPACE

SPACE(number)

Hàm trả chuỗi với number khoảng trắng

Hàm STR

STR(number [,length [,decimal]]) Chuyển giá trị kiểu số number thành chuỗi

Hàm SUBSTRING

SUBSTRING(string, m, n)

Trích từ n ký tự từ chuỗi string ký tự thứ m

(143)

UNICODE(UnicodeString)

Hàm trả mã UNICODE ký tự bên trái chuỗi UnicodeString

Hàm UPPER

UPPER(string) Chuyển chuỗi string thành chữ hoa

B.2 Các hàm liệu kiểu ngày Hàm DATEADD

DATEADD(datepart, number, date)

Hàm trả giá trị kiểu DateTime cách cộng thêm khoảng giá trị là number vào ngày date định Trong đó, datepart tham số định thành phần cộng giá trị date bao gồm:

Datepart Viết tắt

year yy, yyyy quarter qq, q

month mm, m dayofyear dy, y day dd, d week wk, ww hour hh minute mi, n second ss, s millisecond ms

Hàm DATEDIFF

DATEDIFF(datepart, startdate, enddate)

Hàm trả khoảng thời gian hai giá trị kiểu định tuỳ thuộc vào tham số datepart

Hàm DATEPART

DATEPART(datepart, date)

Hàm trả số nguyên trích từ thành phần (được định tham số partdate) giá trị kiểu ngày định

Hàm GETDATE

GETDATE() Hàm trả ngày

(144)

DAY(date), MONTH(date), YEAR(date)

Hàm trả giá trị ngày (tháng năm) giá trị kiểu ngày định

B.3 Hàm chuyển đổi kiểu Hàm CAST

CAST (biểu_thức AS kiểu_dữ_liệu) Chuyển đổi giá trị biểu thức sang kiểu định

Hàm CONVERT

CONVERT(kiểu_dữ_liệu, biểu_thức [,kiểu_chuyển_đổi]) Hàm có chức chuyển đổi giá trị biểu thức sang kiểu liệu định Tham số kiểu_chuyển_đổi giá trị số thường sử dụng chuyển đổi giá trị kiểu ngày sang kiểu chuỗi nhằm qui định khuôn dạng liệu hiển thị qui định sau:

Năm chữ số Năm chữ số Khuôn dạng liệu

100 mon dd yyyy hh:mi AM (PM) 101 mm/dd/yy

2 102 yy.mm.dd 103 dd/mm/yy 104 dd.mm.yy 105 dd-mm-yy 106 dd mon yy 107 Mon dd, yy 108 hh:mm:ss

109 mon dd yyyy hh:mi:ss:mmmAM (PM) 10 110 mm-dd-yy

11 111 yy/mm/dd 12 112 yymmdd

(145)

20 120 yyyy-mm-dd hh:mi:ss(24h) 21 121 yyyy-mm-dd hh:mi:ss.mmm(24h)

126 yyyy-mm-dd Thh:mm:ss:mmm(no spaces) 130 dd mon yyyy hh:mi:ss:mmmAM

131 dd/mm/yy hh:mi:ss:mmmAM

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

SELECT hodem,ten,

CONVERT(NVARCHAR(20),ngaysinh,101) AS ngaysinh FROM sinhvien

cho kết là:

(146)

T

TÀÀIILLIIUU TTHHAAMM KKHHOO

1 James R, Groff, Paul N.Weinberg, SQL: The Complete Reference, McGraw-Hill/Osborne, 2002

2 Diana Lorentz, SQL Reference, Oracle Corporation, 2001

3 Marcilina S Garcia, Jamie Reding, Edward Whalen, Steve Adrien DeLuca, SQL Server 2000 Administrator’s Companion, Microsoft Press, 2000

Ngày đăng: 13/04/2021, 02:38

Tài liệu cùng người dùng

Tài liệu liên quan