Đang tải... (xem toàn văn)
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
MỤỤCC LLỤỤCC
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
LỜỜIINNĨĨ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
TỔỔNNGGQQUUAANN 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ỮỮ LLIIỆỆUU
Đố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ỮỮ LLIIỆỆUU
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
BẢẢOOMMẬẬTT 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ỦỦ TTỤỤCC 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ỤỤ LLỤỤCC
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ÀÀIILLIIỆỆUU TTHHAAMM KKHHẢẢOO
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