Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 130

Sự hoan nghê nh củ a giớ i phê bình cho

SQL: Hướng dẫn Thực hành dành cho Nhà phát triển

Cuốn sách sống đúng với tiêu đề của nó: nó là một hướng dẫn rất thiết thực. Các tác giả
biết rõ SQL của họ và quản lý để viết về ngôn ngữ theo phong cách từng bước tiến triển
trơn tru từ các khía cạnh đơn giản đến khó hơn của ngôn ngữ. Profuse sử dụng các ví dụ ,
mỗi ví dụ có một động lực đi kèm và giải thích về kết quả, cho phép người đọc theo dõi
ngay cả những chủ đề phức tạp mà không cần phải đấu tranh liên tục. Các tác giả thậm
chí đã bao gồm các ví dụ minh họa các lỗi phổ biến mà các lập trình viên mắc phải, giải
thích cách đúng đắn để thực hiện nhiệm vụ. Nó không làm tổn thương rằng ứng dụ ng
mẫu dựa trên một thứ mà mọi dysử dụng hàng ngày: thực phẩm.

Tôi đặc biệt thích cách mà các tác giả giải thích lý do đằng sau hầu hết các cơ sở SQL. Mặc
dù chúng không phải là một phần tích cực trong nỗ lực làm mờ củ a tiêu chuẩ n, nhưng
cái nhìn sâu sắc của chúng về các lý do cơ bản để đưa vào mộ t tính năng vẫn được chú ý.
Họ cũng làm một công việc tuyệt vời trong việc giải thích các bộ quy tắc phức tạp bằ ng
ngô n ngữ dễ hiểu — tô i đã học được những cách mới để hiểu một số quy tắc mà cá nhân
tôi đã viết vào tiêu chuẩn!

Mỗi chương kết thúc với một bản tóm tắt các điểm nguyên tắc và hầu hết chúng bao gồm
lời khuyên thực tế cho các lập trình viên mà tôimuốn sử dụng các tính năng ngôn ngữ SQL
được mô tả trong chương. Việc đưa vào cuối mỗ i chương củ a mộ t tậ p hợp các câu hỏi
và bài tập — tất cả đều liên quan trực tiếp đến tài liệu của chương — làm cho cuốn sách
này trở thành một ứng cử viên tuyệt vời để sử dụng trong lớp học.
– Jim Melton, Oracle Corporation, Biê n tậ p viê n củ a ISO / IEC 9075- * (SQL) và Đồ ng Chủ
tịch, Nhó m là m việc truy vấ n XML W3C

Cuốn sách này cung cấp một bản tóm tắt ngắn gọn nhưng đầy đủvề các khía cạnh cơ bản
của ngôn ngữ SQL. Nó không chỉ là một văn bản SQL khác. Việc các tác giả sử dụng các ví
dụ đơn giản nhưng rõ ràng để minh họa các khái niệm khó trong suốt văn bản làm cho
cuốn sách này trở thành một cuốn sách hoàn hảo để sử dụng trong mộ t hệ thống cơ sở dữ
liệu giớ i thiệu c lass như một phần bổ sung hoặc như một tài liệu tham khảo giới thiệu
cho người mới thực hành.
– Paul Fortier, Đạ i họ c Massachusetts, Dartmouth
SQL: Hướng dẫn
Thực hành dành cho
Nhà phát triển
Loạt hướng dẫn thực hành Morgan Kaufmann
Biê n tậ p viê n loạ t phim, Michael J. Donahoo
SQL: Hướng dẫn Thực hành dành cho Nhà phát triển
Michael J. Donahoo và Gregory D. Speegle

C# 2.0: Hướng dẫn thực hành cho lập trình viên


Michel de Champlain và Brian G. Patrick

Lập trình ứng dụng đa tầ ng với PHP: Hướng dẫn thực hành cho kiến trúc sư và
lập trình viên
Bứ c tườ ng David

Ổ cắm TCP / IP trong C #: Hướng dẫn thực hành cho lập trình viên
David B. Makofske, Michael J. Donahoo và Kenneth L. Calvert

Tiện ích mở rộng mật mã Java : Hướng dẫn thực hành cho lập trình viên
Jason Weiss ·

JSP: Hướng dẫn thực hành cho lập trình viên Java
Ô ng Robert J. Brunner

JSTL: Hướng dẫn thực hành cho lập trình viên JSP
Sue Spielman ·

Java: Hướng dẫn thực hành cho lập trình viên


Zbigniew M. Sikora ·

Khung Struts: Hướng dẫn thực hành cho lập trình viên Java
Sue Spielman ·

Ổ cắm Multicast: Hướng dẫn thực hành cho lập trình viên
David Makofske và Kevin Almeroth

Ổ cắm TCP / IP trong Java: Hướng dẫn thực hành cho lập trình viên
Kenneth L. · Calvert và Michael J. Donahoo

Ổ cắm TCP / IP trong C: Hướng dẫn Thực hành cho Lập trình viên
Ô ng Michael J. Donahoo và Kenneth L. Calvert

JDBC: Hướng dẫn thực hành cho lập trình viên Java
Grê gô riô D. Speegle

Để biết thêm thông tin về những cuốn sá ch nà y và để biết danh sách các đầu sách sắp tới,
vui lòng truy cập trang web của chúng tôi tại http://www.mkp.com/practical
SQL: Hướng dẫn thực
hành
dành cho nhà phát
triển

Ông Michael J. Donahoo

Grêgôriô D. Speegle
AMSTERDAM • BOSTON • HEIDELBERG • LUÂ N
ĐÔ N NEW YORK • OXFORD • PARIS • SAN
DIEGO
SAN FRANCISCO • SINGAPORE • SYDNEY •
TOKYO
Morgan Kaufmann Publishers là mộ t dấ u ấ n củ a Elsevier
Nhà xuất bản Diane Cerra
Giám đốc dịch vụ xuấ t bả n Simon Crump
Giám đốc dự á n Brandy Lilly
Trợ lý biên tậ p Asma Stephan
Thiết kế bìa Yvo Riezebos
Ảnh bìa Getty Images
Thành Phần Cepha Hình Ả nh Pvt. Ltd.
Minh họa kỹ thuậ t Dartmouth Publishing, Inc.
Copyeditor Đồ Họ a Thế Giớ i Inc
Hiệu đính Đồ Họ a Thế Giớ i Inc
Máy in nộ i thấ t The Maple-Vail Book Manufacturing Group
Bao gồm máy in Phoenix Color Corp.

Morgan Kaufmann Publishers là mộ t dấ u ấ n củ a Elsevier.


500 Phố Sansome, Suite 400, San Francisco, CA 94111

Cuố n sá ch nà y đượ c in trê n giấ y khô ng có axit.

© 2005 bở i Elsevier Inc. Đã đă ng ký Bả n quyề n.

Cá c chỉ định đượ c sử dụ ng bở i các đượ c tuyê n


cô ng ty để phâ n biệ t sả n phẩ m củ a họ thườ ng
bố là nhã n hiệu hoặ c nhã n hiệ u đã đă ng ký . Trong tấ t cả các trườ ng hợ p mà Nhà xuấ t bả n
Morgan Kaufmann biế t về khiế u nạ i, tên sả n phẩm sẽ xuấ t hiện ở dạ ng viết hoa ban
đầ u hoặ c tấ t cả cá c chữ cá i viế t hoa. Tuy nhiê n, độ c giả nên liê n hệ vớ i cá c cô ng ty thích hợ p để
biế t thê m thô ng tin đầ y đủ về nhã n hiệ u và đă ng ký .

Khô ng mộ t phầ n nà o củ a ấ n phẩ m nà y có thể đượ csao chép, lưu trữ trong hệ thố ng truy xuấ t hoặ c
truyề n tả i dướ i bấ t kỳ nà o hoặ c bằ ng bấ t kỳ phương tiệ n nà o — điệ n tử , cơ họ c, sao
hình thứ c
ché p, qué t hoặ c cá ch khá c — mà khô ng cầ n trướ c vă n bả n cho phé p củ a nhà xuấ t bả n.

Quyề n có thể đượ c xin phé p trự c tiế p từ Sở Quyề n Khoa họ c & Cô ng nghệ củ a Elsevier ở Oxford,
Vương quố c Anh: điệ n thoạ i: (+44) 1865 843830, fax: (+44) 1865 853333, e-mail:
permissions@elsevier.co.uk. Bạ n cũ ng có thể hoà n thà nh yê u cầ u củ a mình trự c tuyế n qua trang chủ
Elsevier (http://elsevier.com) bằ ng cá ch chọ n "Hỗ trợ khá ch hà ng" và sau đó chọ n "Nhậ n
Permissions".

Dữ liệu biên mục trong xuất bản của Thư viện Quốc hội Hoa Kỳ
Đã nộ p đơn đă ng ký
Mã số -13: 978-0-1222-0531-6
Mã số -10: 0-12-220531-6

Để biế t thô ng tin về tấ t cả cá c ấ n phẩ m củ a Morgan Kaufmann,


truy cậ p trang web củ a chú ng tô i tạ i www.mkp.com hoặ c www.books.elsevier.com

In tạ i Hoa Kỳ 05 06 07 08 095 4 3 2
1
Nội dung

1 Databasics 1
1.1 Bả ng 3
1.2 Loạ i dữ liệu 4
1.2.1 Chuỗ i ký tự 4
1.2.2 Số 5
1.2.3 Tạ m thờ i 6
1.2.4 Nhị phâ n 7
1.2.5 Boolean 8·
1.2.6 Cá c loạ i dữ liệ u khác 8
1.3 NULL 8
1.4 Khó a chính 9
1.5 Mố i quan hệ bả ng 9
1.5.1 Khó a ngoạ i ngữ 10
1.5.2 Cá c loạ i mố i quan hệ 11
1.5.3 Lượ c đồ 14
1.6 Cơ sở dữ liệ u nhà hà ng 15
1.7 Kết thú c 21

2 Truy xuất: SELECTion cơ bản 27


2.1 SELECT 27 đơn giả n
2.2 Chọ n Hà ng 30
2.3 Toá n tử so sá nh tiêu chuẩ n 30
2.4 So sá nh chuỗ i 31
2.5 Kế t hợ p cá c mẫ u chuỗ i vớ i LIKE 33
2.6 Nhậ n nhữ ng gì chú ng tô i chưa có vớ i NOT 34
Vii
viii Nộ i dung ■

2.7 Kế t hợ p cá c điề u kiện vớ i AND và OR 35


2.8 Chọ n mộ t phạ m vi giá trị vớ i GIỮ A 37
2.9 Chọ n mộ t tậ p hợ p cá c giá trị bằ ng cá ch sử dụ ng IN 38
2.10 IS NULL: Khá m phá 38 ẩ n số
2.11 ANDs, ORs, NOTs vớ i NULLs: Three-Value Logic 41
2.12 Lô -gic ba giá trị và toá n tử IN 42
2.13 Là m thế nà o WHERE xá c định nhữ ng gì trong và ngoà i 43
2.14 Kế t thú c 43

3 Định hình lại kết quả 47


3.1 AS: Đặ t tê n bả ng kế t quả cộ t 47
3.2 KHÁ C BIỆ T và TẤ T CẢ : Xử lý cá c bả n sao 48
3.3 Thuộ c tính phái sinh 50
3.3.1 Số 50
3.3.2 Chuỗ i ký tự 52
3.3.3 Tạ m thờ i 57
3.3.4 Nhị phâ n 59
3.4 Tính toá n trong Điề u khoả n 60 củ a WHERE
3.5 ĐẶ T HÀ NG THEO: Kế t quả đặ t hà ng Bả ng Traversal 61
3.6 CAST: Chuyể n đổ i loạ i dữ liệ u 64
3.7 CASE, COALESCE và NULLIF: Biể u thứ c có điề u kiện 66
3.7.1 CASE: Danh sá ch Giá trị 66
3.7.2 CASE: Danh sá ch có điề u kiện 67
3.7.3 NULLIF 69 ·
3.7.4 KẾ T HỢ P 70
3.8 Kế t thú c 70

4 Kết quả tổng hợp 75


4.1 Chứ c nă ng tổ ng hợ p 75
4.1.1 AVG và SUM 75
4.1.2 MIN và MAX 76
4.1.3 ĐẾ M 77
4.2 Loạ i bỏ Hà ng trướ c khi Tính gộ p vớ i WHERE 78
4.3 Xó a dữ liệ u lặ p lạ i vớ i DISTINCT trướ c khi Tổ ng hợ p 79
4.4 Trộ n cá c thuộ c tính, cố t liệ u và nghĩa đen 79
4.5 Tổ ng hợ p nhó m bằ ng GROUP BY 80
4.6 Loạ i bỏ Hà ng trướ c khi Nhó m vớ i WHERE 82
4.7 Sắ p xế p cá c Nhó m vớ i THỨ TỰ THEO 83
4.8 Xó a Nhó m có CÓ 83
4.9 Tổ ng hợ p qua Biể u thứ c 85
4.10 Kế t thú c 87
■ Nộ i dung ix

5 Tham gia 91
5.1 Hai bả ng kết hợ p vớ i WHERE 91
5.2 Bí danh bả ng 94
5.3 Tham gia cầ n nhiề u hơn hai bả ng 95
5.4 Tự tham gia: Tham gia mộ t bả ng vớ i chính nó 97
5.5 Ví dụ tham gia 97
5.6 Tham gia thự c sự hoạ t độ ng như thế nà o? Điề u 99
5.7 Theta Joins: Khá i quá t hó a vị ngữ tham gia 101
5.8 Nhà điề u hà nh JOIN 104
5.8.1 NỐ I TRONG 104
5.8.2 NỐ I NGOÀ I 106
5.8.3 THAM GIA TỰ NHIÊ N 109
5.8.4 THAM GIA CHÉ O 111
5.9 Tham gia chiế n lượ c 111
5.10 Kết thú c 112

6 Đặt truy vấn: UNION, INTERSECT và EXCEPT 117


6.1 CÔ NG ĐOÀ N 117
6.2 GIAO NHAU 120
6.3 NGOẠ I TRỪ 121
6.4 Kết thú c 124

7 Subqueries 127
7.1 Subqueries là gì ? Nă m 127
7.2 Multilevel Subquery Nesting 132
7.3 Subqueries Sử dụ ng NOT IN 134
7.4 Subqueries vớ i kế t quả trố ng 136
7.5 Kế t hợ p JOIN và Subqueries 137
7.6 Toá n tử so sá nh tiêu chuẩ n vớ i danh sá ch sử dụ ng ANY,
SOME hoặ c ALL 138
7.6.1 BẤ T KỲ HOẶ C MỘ T SỐ 139
7.6.2 TẤ T CẢ 142
7.7 Tương quan Subqueries 144
7.8 TỒ N TẠ I 146
7.9 Quan hệ phá i sinh—Cá c quan hệ phụ trong TỪ Khoả n 148
7.10 Subqueries trong điề u khoả n HAVING 150
7.11 Truy vấ n tậ p con 151
7.11.1 Tậ p con sử dụ ng EXISTS và EXCEPT 152
7.11.2 Tậ p con sử dụ ng tậ p hợ p Cardinality 155
7.11.3 So sá nh tậ p hợ p cardinality và tậ p con 156
7.12 Subqueries trong Điề u khoả n SELECT 157
7.13 Kết thú c 159
x Nộ i dung ■

8 Sửa đổi dữ liệu 165


8.1 CHÈ N: Thêm hà ng mớ i 165
8.1.1 CHÈ N Hà ng vớ i GIÁ TRỊ 165
8.1.2 CHÈ N nhiề u hà ng vớ i SELECT 168
8.2 DELETE: Loạ i bỏ Hà ng 169
8.3 CẬ P NHẬ T: Thay đổ i giá trị hà ng 171
8.4 Kiểm tra DELETE củ a bạ n và CẬ P NHẬ T Ở ĐÂ U Điều kiện 174
8.5 Số ng trong nhữ ng rà ng buộ c 174
8.6 Kế t thú c 176

9 Tạo, xóa và thay đổi bảng 179


9.1 Tạ o bả ng đơn giả n 179
9.2 Giá trị DEFAULT 180
9.3 Rà ng buộ c 181
9.3.1 KHÔ NG PHẢ I NULL 181
9.3.2 ĐỘ C ĐÁ O 182
9.3.3 KHÓ A CHÍNH 183
9.3.4 KHÓ A NGOẠ I 184
9.3.5 KIỂ M TRA 185
9.3.6 Hạ n chế đặ t tên 186
9.4 Tạ o bả ng từ bả ng 187
9.5 TẠ O DOMAIN 188
9.6 Hà nh độ ng tham khả o: Hệ thố ng lá i tự độ ng bả o
trì khó a nướ c ngoà i 189
9.7 Chỉ số 190
9.7.1 TẠ O CHỈ SỐ 191
9.7.2 CHỈ SỐ GIẢ M 192
9.7.3 Chỉ mụ c khô ng có trong SQL 2003 192
9.8 BỎ BÀ N 192
9.9 THAY ĐỔ I BẢ NG 193
9.10 Giá trị đượ c tạ o ra 195
9.11 Trình tự 195
9.12 Bả ng tạ m thờ i toà n cầu và địa phương 197
9.13 Tạ o cơ sở dữ liệ u 198
9.14 Kế t thú c 199

10 Lượt xem 205


10.1 Tạ i sao lạ i là Lượ t xem? Nă m 206
10.2 Truy vấ n Dạ ng xem 207
10.3 Cậ p nhậ t chế độ xem 209
10.4 BỎ XEM 211
10.5 Kế t thú c 211
■ Nộ i dung xi

11 Giao dịch 215


11.1 Kế t thú c giao dịch—COMMIT và ROLLBACK 217
11.2 Bắ t đầ u giao dịch — BẮ T ĐẦ U GIAO DỊCH 217
11.3 Tự độ ng cam kết 218
11.4 Điểm SAVEPOINT 218
11.5 Cá c rà ng buộ c ngay lậ p tứ c hoặ c hoã n lạ i 219
11.6 Thử nghiệ m thay đổ i vớ i giao dịch 221
11.7 Đặ c điể m giao dịch 222
11.8 Vấ n đề khó a 223
11.9 Kết thú c 223

12 Đặc quyền cơ sở dữ liệu 227


12.1 TÀ I TRỢ 228
12.2 THU HỒ I 230
12.3 CÔ NG KHAI 230
12.4 Tạ o mộ t tậ p hợ p cá c đặ c quyề n bằ ng ROLEs 231
12.5 Sử dụ ng Đặ c quyề n và Chế độ xem 232
12.6 Kết thú c 233

13 Giới thiệu về con trỏ, SQL nhúng, thủ tục được lưu trữ và kích
hoạt 237
13.1 CON TRỎ 237
13.2 Lậ p trình vớ i SQL 239
13.2.1 Thủ tụ c lưu trữ 239
13.2.2 Thự c thi SQL bằ ng cá c ngô n ngữ lậ p trình khá c 240
13.3 Kích hoạ t 243
13.3.1 TẠ O TRIGGER 243
13.3.2 Quy tắ c kích hoạ t bắ n 245
13.3.3 THẢ KÍCH HOẠ T 245
13.3.4 Sử dụ ng Triggers 245
13.4 Kết thú c 246
Chỉ số 249
Lời tựa

Giá trị củ a cơ sở dữ liệ u quan hệ là khô ng thể chố i cã i. Cho đế n nay, nó là hệ thố ng cơ sở
dữ liệu hiệ n đạ i, đượ c sử dụ ng phổ biế n nhấ t. Ngô n ngữ chính cho cơ sở dữ liệu quan hệ
là SQL, là m cho nó trở thà nh cổ ng và o dữ liệ u củ a doanh nghiệ p nhỏ và doanh nghiệ p
cô ng ty. Nhiều ứ ng dụ ng mà bạ n thấ y trê n Internet, trong thư việ n cụ c bộ củ a bạ n, v.v.,
truy cậ p và thao tá c dữ liệu củ a chú ng bằ ng SQL.

Đối tượng mục tiêu


Chú ng tô i đã viế t cuố n sá ch nà y cho nhữ ng độ c giả có nă ng lự c kỹ thuậ t, nhữ ng ngườ i muố n
có mộ t phầ n giớ i thiệ u ngắ n gọ n, tậ p trung và trầ m ngâ m về cá c tính nă ng chính củ a SQL.
Cá ch tiế p cậ n chung củ a chú ng tô i xoay quanh việ c tạ o ra nguồ n tà i nguyê n mà chúng tôi
mong muố n trong cá c lớ p họ c củ a mình. Chú ng tô i tin rằ ng cuố n sá ch nà y phù hợ p cho
cả sinh viê n và cá c chuyê n gia.
Đâ y khô ng phả i là hướ ng dẫ n sử dụ ng mộ t sả n phẩ m cơ sở dữ liệ u cụ thể . Chú ng tô i
giả định rằ ng bạ n đã cà i đặ t hệ thố ng cơ sở dữ liệ u và đủ đặ c quyề n truy cậ p để thự c hiệ n
cá c thao tá c đượ c mô tả trong cuố n sá ch nà y. Có nhiề u sả n phẩ m cơ sở dữ liệ u có sẵ n nế u
bạ n khô ng có quyề n truy cậ p và o mộ t sả n phẩ m hiệ n có . Nhiề u hệ thố ng như vậ y có sẵ n để
tả i xuố ng từ Internet để dù ng thử hoặ c thậ m chí miễ n phí cho chú ng tô ie. Xem trang Web
sá ch (http://www.mkp.com/ thự c tế / sql) để biế t danh sá ch mộ t phầ n củ a sả n phẩ m.

Tiếp cận
Chương 1 cung cấ p mộ t cá i nhìn tổ ng quan chung về cơ sở dữ liệ u quan hệ cơ bả n và cá c
khá i niệ m SQL. Nó khô ng phả i là mộ t giớ i thiệ u toà n diện về khu vự c cơ sở dữ liệ u; thay
và o đó , nó nhằ m giớ i thiệ u thuậ t ngữ và khá i niệm đượ c sử dụ ng trong cuố n sá ch. Bìa
chương 2 đế n chương 7
Xiii
Lờ i nó i đầ u xiv ■

truy vấ n dữ liệ u. Sau khi đọ c cá c chương nà y, bạ n sẽ có thể trả lờ i mộ t loạ t cá c truy vấ n


trê n cơ sở dữ liệ u hiệ n có . Chương 8 mô tả việ c tạ o và thao tá c dữ liệ u. Chương 9 and 10
đề cậ p đế n việ c tạ o ra cá c cấ u trú c để đạ i diệ n cho dữ liệu đượ c lưu trữ . Cuố i cù ng, cá c
Chương từ 11 đến 13 đề cậ p đế n cá c tính nă ng cơ sở dữ liệ u nâ ng cao như giao dịch, bả o
mậ t và phá t triể n ứ ng dụ ng cơ sở dữ liệ u.
Bạ n có thể muố n bắ t đầ u khá m phá SQL bằ ng cá ch tạ o cơ sở dữ liệu thay vì truy
vấ n cơ sở dữ liệ u hiệ n có . Để thự c hiệ n cá ch tiế p cậ n nà y trong cuố n sá ch củ a chú ng tô i,
hã y bắ t đầ u bằ ng cá ch đọ c cơ sở dữ liệ u quan hệ và giớ i thiệ u SQL trong Chương 1. Tiế p
theo, hã y đọ c Chương 9 về việ c tạ o bả ng cơ sở dữ liệ u, tiế p theo là Chương 8 về thao tá c
dữ liệ u. Đọ c lướ t qua việ c tạ o và tậ p hợ p cá c bả ng từ cá c bả ng hiệ n có vì chú ng giả định
sự hiể u biế t về truy vấ n cơ sở dữ liệ u. Sẽ rấ t dễ dà ng để đọ c cá c phầ n nà y sau. Tạ i thờ i
điể m nà y, bạ n sẽ có thể tạ o cơ sở dữ liệ u và điề n dữ liệu và o đó . Tiế p theo, hã y đọ c
Chương 2 đế n Chương 7 về truy vấ n cơ sở dữ liệ u mớ i củ a bạ n. Cuố i cù ng, hã y đọ c cá c
Chương từ 11 đế n 13 để hiể u mộ t số tính nă ng cơ sở dữ liệ u nâ ng cao.

Lời cảm ơn
Chú ng tô i muố n cả m ơn tấ t cả nhữ ng ngườ i đã giú p biế n cuố n sá ch nà y thà nh hiệ n thự c.
Bấ t chấ p sự ngắ n gọ n củ a cuố n sá ch, nhiều giờ đã đi và o xem xé t đề xuấ t ban đầ u và dự
thả o, và ý kiế n đó ng gó p củ a nhữ ng ngườ i đá nh giá đã định hình đá ng kể kế t quả đầ u
tiê n.
Chú ng tô i cả m ơn nhữ ng ngườ i đã xem xé t đề xuấ t ban đầ u và đưa ra lờ i khuyê n về
nhữ ng gì nê n đưa và o và nhữ ng gì cầ n bỏ qua. Chú ng tô i đặ c biệt cả m ơn nhữ ng ngườ i
đã xem xé t tỉ mỉ cá c bả n nhá p khá c nhau củ a vă n bả n và đưa ra đề xuấ t cả i tiế n. Tấ t nhiên,
bấ t kỳ lỗ i nà o cò n lạ i là trá ch nhiệ m củ a chú ng tô i. Chú ng tô i rấ t quan tâ m đế n việ c loạ i
bỏ cá c lỗ i như vậ y trong cá c bả n in trong tương lai, vì vậ y nếu bạ n tìm thấ y mộ t lỗ i, vui
lò ng gử i email cho mộ t trong hai chú ng tô i. Chú ng tô i sẽ duy trì mộ t danh sách errata trê n
trang web củ a cuố n sá ch.
Chú ng tô i cũ ng biế t ơn nhữ ng ngườ i ở Morgan Kaufmann. Họ thự c hiệ n mộ t cá ch tiế p
cậ n thự c tế để phá t triể n gó p phầ n đá ng kể và o chấ t lượ ng vă n bả n cuố i cù ng. Diane Cerra,
biê n tậ p viê n củ a chú ng tô i, đã là m việ c chă m chỉ để cung cấ p hướ ng dẫ n có giá trị trong suố t
quá trình nà y. Chú ng tô i cũ ng biế t ơn Lisa Royse, biên tậ p viên cả m ứ ng pr củ a chú ng tô i từ
Graphic World Publishing Services, ngườ i đã rấ t sẵ n lò ng là m việ c vớ i chú ng tô i về thiế t kế
và "giao diệ n" củ a vă n bả n; chú ng tô i hy vọ ng bạ n thích kế t quả .

Phản hồi

Chú ng tô i mờ i đề xuấ t củ a bạ n để cả i thiệ n bấ t kỳ khía cạ nh nà o củ a cuố n sá ch nà y. Bạ n có


thể gử i phả n hồ i qua trang web củ a cuố n sá ch (http://www.mkp.com/practical/sql), hoặ c
bạ n có thể gử i email cho chú ng tô i đến cá c địa chỉ bê n dướ i.
Ô ng Michael J.
Donahoo
Jeff_Donahoo@baylor.edu

Grê gô riô D.
Speegle
Greg_Speegle@baylor.edu
SQL: Hướ ng dẫ n Thự c
hà nh dà nh cho Nhà
phá t triể n
c h a p t er 1

Databasics

Cơ sở dữ liệu là mộ t kho lưu trữ đượ c thiế t kế để tổ chứ c và truy cậ p thô ng tin. Đố i vớ i
dữ liệ u đơn giả n, quả n lý rấ t dễ dà ng. Ví dụ , mộ t danh sá ch hà ng tạ p hó a có thể đượ c viế t
trê n giấ y xướ c và thô ng tin liê n lạ c có thể đượ c lưu giữ trong sổ địa chỉ. Cả giấ y nhá p và
sổ địa chỉ đề u là ví dụ về cơ sở dữ liệ u.

Tạp hóa çist Tên ob 👉Feakins ·


Sữa Kinh doanh
địa chỉ 123
👉đọc Dallas Tiểu bang Tx Rít
Thành phố Thông

Sách cà phê SQç St78909


Địa chỉ

Điện thoại nhà riêng: Điện thoại cơ quan:

(251)892-7367
Số fax: Di động: (251)892-
8193
(251)887-2391 (máy
nhắn tin)
1
2 Chương 1: Databasics ■

Danh sá ch cơ bả n có thể hoạ t độ ng cho cá c cơ sở dữ liệ u rấ t đơn giả n. Tuy nhiê n,


nhữ ng hạ n chế củ a phương phá p nà y có thể khiế n ngay cả nhữ ng nhiệ m vụ đơn giả n trở
nê n khó khă n. Hã y xem lạ i ví dụ về sổ địa chỉ củ a chú ng tô i. Mộ t vấ n đề là nó có khô ng gian
cho thô ng tin mà chú ng ta khô ng biết / cầ n (ví dụ : thê m ress tạ i nhà ), trong khi nó khô ng có
khô ng gian cho thô ng tin chú ng ta cầ n biế t (ví dụ : số má y nhắ n tin). Tìm kiếm trình bà y
mộ t vấ n đề khá c. Sổ địa chỉ thườ ng đượ c sắ p xế p theo thứ tự bả ng chữ cá i theo tê n. Điề u
gì sẽ xả y ra nế u chú ng ta muố n tìm kiế m bằ ng cá ch sử dụ ng mộ t số tiê u chí khá c? Tìm
kiếm tấ t cả bạ n bè củ a chú ng tô i số ng trong mộ t thà nh phố cụ thể đò i hỏ i mộ t cuộ c tìm
kiếm toà n diệ n. Nhậ p và bả o trì dữ liệ u cũ ng có thể có vấ n đề . Sổ địa chỉ trê n giấ y là tố t
cho mộ t nhó m nhỏ ngườ i; tuy nhiê n, sẽ rấ t tố n thờ i gian để thêm tấ t cả nhữ ng ngườ i
trong com-pany củ a bạ n. Theo kịp cá c thay đổ i nhanh chó ng trở nê n khô ng thể quả n lý
đượ c. Mộ t vấ n đề khá c là liê n quan đế n sổ địa chỉ trê n giấ y củ a chú ng tô i vớ i cá c cơ sở
dữ liệ u khá c. Nếu chú ng tô i muố n gọ i cho tấ t cả cá c cá nhâ n trong độ i bó ng mề m củ a
mình, chú ng tô i sẽ cầ n kế t hợ p thô ng tin thứ e từ danh sách độ i củ a chú ng tô i vớ i sổ địa chỉ
củ a chú ng tô i. Rõ rà ng, sự phứ c tạ p bổ sung khiế n việ c thể hiệ n hiệ u quả cá c mố i quan hệ
dữ liệu khá c nhau ngà y cà ng khó khă n hơn. Tương tự như vậ y, khi khố i lượ ng dữ liệ u
tă ng lên, sự phứ c tạ p củ a việ c quả n lý và truy vấ n thô ng tin sẽ tă ng lê n.
May mắ n cho chú ng tô i, má y tính đặ c biệ t thà nh thạ o trong việ c quả n lý và nhanh
chó ng truy cậ p và o infor-mation. Phầ n mề m đượ c thiế t kế để lưu trữ , thao tá c và truy xuấ t
dữ liệ u trong cơ sở dữ liệ u đượ c gọ i là Hệ thống quản lý cơ sở dữ liệu (DBMS). Ở đâ y, chú ng
tô i tậ p trung hoà n toà n và o mộ t loạ i DBMS cụ thể (và phổ biến nhấ t), DBMS quan hệ. Có rấ t
nhiề u DBMS quan hệ (xem trang Web sá ch để biế t cá c con trỏ đến mộ t số ví dụ ). May mắ n
thay, cá c DBMS quan hệ nó i mộ t ngô n ngữ chung caldẫ n SQL. Sử dụ ng SQL, chú ng ta có thể
xá c định, thao tá c và truy vấ n dữ liệ u củ a mình. SQL đượ c phá t â m chính xá c là S-Q-L; tuy
nhiê n, nhiề u ngườ i cũ ng phá t â m nó see-kwel.
Vă n bả n nà y dự a trê n tiê u chuẩ n ANSI 2003 SQL. LƯU Ý: Mỗ i DBMS thự c hiệ n mọ i
thứ mộ t cách chính xá c và khô ng có DBMS chính nà o tuâ n theo thô ng số kỹ thuậ t mộ t cá ch
chính xá c. Cá c chi tiế t cụ thể củ a mộ t DBMS cụ thể có thể đượ c tìm thấ y trong tà i liệ u củ a
nó . Có nhiề u lý do khiế n DBMS có thể khá c vớ i tiê u chuẩ n, bao gồ m hiệu suấ t, kế thừ a
hoặ c tiế p thị. May mắ n thay, cú phá p cơ bả n củ a SQL là giố ng nhau cho tấ t cả cá c DBMS.
Xem trang Web sá ch để biết thô ng tin về cú phá p dà nh riê ng cho DBMS.
SQL đượ c chia thà nh ba phầ n chính. Ngôn ngữ thao tác dữ liệu (DML) đượ c sử dụ ng
để lưu trữ và truy xuấ t dữ liệ u từ cơ sở dữ liệ u. Phầ n lớ n cuố n sá ch nà y là về SQL DML
và đó sẽ là phầ n củ a SQL đượ c nhiều ngườ i sử dụ ng nhấ t. Ngôn ngữ mô tả dữ liệu (DDL)
đượ c sử dụ ng để xá c định cấ u trú c củ a dữ liệ u. Chương 9 và 10 bao gồ m nhữ ng điều cơ
bả n trong SQL DDL. Ngôn ngữ kiểm soát dữ liệu (DCL) đượ c sử dụ ng để hạ n chế quyề n truy
cậ p và o dữ liệ u củ a mộ t số ngườ i dù ng nhấ t định. Chú ng tô i giớ i thiệ u DCL trong Chương
12.
Chú ng tô i giả định rằ ng bạ n đã cà i đặ t DBMS và có thể nhậ p SQL com-mands. Tham
khả o tà i liệ u DBMS củ a bạ n để đượ c hướ ng dẫ n về cá ch thự c hiệ n việ c nà y. Nếu bạ n khô ng
có DBMS, hã y câ n nhắ c tả i xuố ng mộ t DBMS từ Internet. Có mộ t số cơ sở dữ liệ u rela-tional
miễn phí và mộ t số DBMS thương mạ i cung cấ p phiê n bả n miễ n phí củ a sả n phẩ m củ a họ để
thử nghiệm. Xem trang Web sá ch để biế t cá c gợ i ý về DBMS.
Cá ch tố t nhấ t để hiể u cá ch thứ c hoạ t độ ng củ a cơ sở dữ liệ u quan hệ là xem xé t mộ t
ứ ng dụ ng spe-cific. Hã y tưở ng tượ ng rằ ng bạ n là chủ sở hữ u tự hà o củ a mộ t nhà hà ng
tê n là Garden Variety Salads. Bạ n cầ n quả n lý thô ng tin về nhiều thự c thể trong thế giớ i
thự c để xá c địnhcơ sở củ a mình. Ví dụ : bạ n cầ n duy trì mộ t danh sá ch cá c mặ t hà ng thự c
phẩ m để khá ch hà ng củ a bạ n sẽ có thứ gì đó để mua. Mỗ i mặ t hà ng thự c phẩ m đượ c
là m từ mộ t hoặ c nhiều
4 Chương 1: Databasics ■ ■
1.1 Bả ng 3

cá c thà nh phầ n khá c nhau, chẳ ng hạ n như rau diế p, cà chua, và như vậ y. Bạ n cũ ng muố n
theo dõ i chi phí củ a mỗ i thà nh phầ n là bao nhiê u để bạ n có thể xá c định số tiề n phả i trả
và lợ i nhuậ n bạ n đang kiế m đượ c. Nếu bạ n khô ng muố n tự trồ ng cá c thà nh phầ n, bạ n sẽ
giữ mộ t danh sá ch cá c nhà cung cấ p.
Hã y xem xé t việc trình bà y thô ng tin nà y trong mộ t cơ sở dữ liệu quan hệ đượ c gọ i là Cơ
sở dữ liệ u nhà hà ng. Thiế t kế củ a chú ng tô i đượ c thiế t kế chỉ vớ i mụ c đích giả ng dạ y SQL,
khô ng phả i thiế t kế cơ sở dữ liệ u. Thiế t kế cơ sở dữ liệ u phù hợ p là mộ t vấ n đề khó khă n,
vượ t ra ngoà i phạ m vi củ a vă n bả n nà y. Hầ u hế t cá c vă n bả n cơ sở dữ liệ u giớ i thiệ u thiết kế
địa chỉ.

1.1 Bảng
Trong mô hình quan hệ, cơ sở dữ liệ u chứ a mộ t tậ p hợ p cá c bả ng. Mộ t bảng đượ c tạ o
thà nh từ các hàng và cột. Mỗ i bả ng có mộ t tê n, là duy nhấ t trong cơ sở dữ liệ u. Mỗ i cộ t
có mộ t tê n và mộ t kiể u dữ liệ u. Chú ng tô i thả o luậ n về cá c loạ i dữ liệ u trong phầ n tiế p
theo. Tê n củ a mộ t cộ t chỉ cầ n là duy nhấ t trong mộ t bả ng để cá c bả ng khá c trong cù ng mộ t
cơ sở dữ liệ u có thể có các cộ t cù ng tê n. Mỗ i hà ng tạ o thà nh mộ t bản ghi trong bả ng. Mộ t
bả ng có thể xế pthà nh cá c hà ng khô ng hoặ c nhiề u hơn. Mộ t hà ng đượ c chia thà nh fi elds,
mộ t hà ng trê n mỗ i cộ t. Bả ng có thể đượ c sử dụ ng để mô hình hó a cá c đố i tượ ng và mố i
quan hệ trong thế giớ i thự c.
Hã y xem mộ t bả ng ví dụ . Trong Cơ sở dữ liệ u nhà hà ng củ a chú ng tô i, chú ng tô i ghi lạ i
thô ng tin về cá c nhà cung cấ p nguyê n liệ u củ a chú ng tô i trong mộ t bả ng có tê n nhà cung cấp.

cột
Tên bảng thuộc tính
Đại lý

vendorid tên công ty tên replname được giới


repfname thiệubởi FK ·
VGRUS Veggies_R_Us Kẹ o Bắ p KHÔNG
MÁY DNDRY Sữ a củ a Don Marla Má y vắ t sữ a VGRUS hàng
FLVcr Kem có hương vị Sherman Sherbert · VGRUS
FRTFR · "Ă n trá i câ y " Bạ n bè Gilbert Nho Flvcr
EDDRS Bă ng củ aEd Sá ng Nướ c xố t FRTFR ·
SPWTR Cấ p nướ c suố i Gus Hung EDDRS

trườn
g
Mỗ i hà ng trong bả ng nhà cung cấ p ghi lạ i thô ng tin về mộ t nhà cung cấ p cụ thể . Ví dụ : hà ng
có vendorid củ a VGRUS là mộ t bả n ghi đạ i diệ n cho nhà cung cấ p có tê n Veggies_R_Us. Cá c
thuộ c tính mà chú ng tô i muố n ghi lạ i cho mỗ i nhà cung cấ p đượ c thể hiệ n bằ ng cá c cộ t five
củ a bả ng vendors: mộ t mã định danh nhà cung cấ p duy nhấ t (vendorid), tên củ a nhà cung cấ p
( tên công ty), mã đầ u tiê n và họ củ a đạ i diện nhà cung cấ p (repfname và replname) và mã
định danh cho nhà cung cấ p ( người giớ i thiệu) ngườ i đã giớ i thiệ u nhà cung cấ p nà y.
Khô ng phả i ai cũ ng sử dụ ng cù ng mộ t thuậ t ngữ . Mộ t bả ng cũ ng có thể đượ c gọ i là mộ t
mối quan hệ.
Về mặ t kỹ thuậ t, mộ t bả ng và mộ t mố i quan hệ khô ng hoà n toà n giố ng nhau. Khô ng giố ng
như mộ t bả ng, mộ t mố i quan hệ
4 Chương 1: Databasics ■

khô ng thể chứ a cá c hà ng trù ng lặ p. Mộ t hà ng đô i khi đượ c gọ i là mộ t bộ. Cuố i cù ng, mộ t cộ t


cũ ng có thể đượ c gọ i là mộ t thuộc tính củ a mố i quan hệ . Mộ t bả ng có thể đượ c biể u thị bằ ng
tê n củ a nó , theo sau là danh sá ch cá c cộ t đượ c phâ n tá ch bằ ng dấ u phẩ y:

vendors(vendorid, companyname, repfname, replname, referredby)

Chú ng tô i tham chiế u đế n cá c cộ t riê ng lẻ củ a bả ng bằ ng cá ch sử dụ ng tên bảng. ký hiệ u


tên cột (ví dụ :
nhà cung cấp. vendorid).

1.2 Kiểu dữ liệu


Mỗ i cộ t đề u có mộ t kiể u dữ liệ u đượ c khai bá o, trong đó chỉ định loạ i thô ng tin nà o (ví
dụ : ký tự , num-bers, thờ i gian, v.v.) củ a thô ng tin có thể đượ c chứ a trong cộ t. DBMS củ a
bạ n có thể khô ng hỗ trợ tấ t cả cá c loạ i nà y và nó cũ ng có thể có mộ t số loạ i bổ sung. Con
sult tà i liệ u DBMS củ a bạ n để biết chi tiế t. Chú ng tô i chia cá c kiểu dữ liệ u SQL thà nh nă m
loạ i: chuỗ i ký tự , số , thờ i gian, nhị phâ n và boolean.

1.2.1 Chuỗi ký tự
Cá c thuộ c tính như tê n và địa chỉ thườ ng đượ c thể hiệ n bằ ng chuỗ i ký tự (ví dụ : "Bob
Smith"). Có nhiề u loạ i cơ sở dữ liệ u cho chuỗ i ký tự . Phổ biế n nhấ t như sau:
CHARACTER[(L)] chỉ định mộ t chuỗ i ký tự có độ dà i x x liê n kế tchính xá c các ký tự L. Nế u độ
dà i khô ng đượ c chỉ định, SQL sử dụ ng độ dà i 1. Nế u chuỗ i chứ a ít hơn ký tự L, cá c ký tự
cò n lạ i chứ a cá c ký tự đệ m (thườ ng là khoả ng trắ ng). CHARACTER có thể đượ c viế t
tắ t là CHAR.
CHARACTER VARYING(L ) chỉ định mộ t chuỗ i ký tự có độ dà i thay đổ i có thể chứ a tố i đa
cá c ký tự L. Chỉ cá c ký tự đượ c chỉ định là stored để khô ng có đệm. THAY ĐỔ I KÝ TỰ
có thể đượ c viế t tắ t là CHAR VARYING hoặ c, thườ ng xuyê n nhấ t là VARCHAR.

Nghĩa đen củ a chuỗ i đượ c đặ t trong cá c dấ u ngoặ c đơn (ví dụ : 'Bob'). Mộ t trích dẫ n duy
nhấ t trong mộ t nghĩa đen đượ c biểu thị bằ ng hai dấ u ngoặ c ké p duy nhấ t (ví dụ : 'Bob's
Car').
Việ c bao gồ m cá c khoả ng trắ ng ở cuố i là sự khá c biệ t chính giữ a CHAR và VARCHAR.
Ví dụ : vendorid đượ c định nghĩa là CHAR (5) và repfname đượ c định nghĩa là VARCHAR (20).
Giả sử chú ng ta thê m mộ t hà ng như sau:

Bob Tiệm bá nh Bob Con VGRUS


Bob's bobson

cho các nhà cung cấp. Bở i vì vendorid là CHAR (5), hai khô ng gian thừ a đượ c lưu trữ . Tuy
nhiê n, repfname là VARCHAR (20), vì vậ y khô ng có khoả ng trắ ng thừ a nà o đượ c thêm và o.
Điề u nà y cũ ng tạ o ra sự khá c biệ t khi chú ng tô i truy xuấ t dữ liệu từ cơ sở dữ liệu. Vendorid
'BOB пп' sẽ khớ p vớ i 'BOB' hoặ c 'BOB пп', nhưng repfname 'Bob' sẽ khô ng khớ p vớ i 'Bob пп'.
■ 1.2 Dữ liệ u Loạ i 5

Bộ ký tự mặ c định cho DBMS củ a bạ n có thể bị giớ i hạ n trong cá c loạ i ký tự mà nó


có thể đạ i diệ n. Ví dụ : nế u DBMS củ a bạ n sử dụ ng mã hó a ký tự ASCII (American Standard
Code for Infor- mation Interchange), nó chỉ có thể đạ i diệ n cho cá c ký tự tiế ng Anh.
Khô ng thể tha thứ , điề u nà y khô ng hoạ t độ ng tố t cho quố c tế hó a. Loạ ichuỗ i acter ký tự
quố c gia có thể đạ i diệ n cho cá c bộ ký tự quố c tế hó a như Unicode. Loạ i chuỗ i ký tự quố c
gia có độ dà i cố định là NATIONAL CHARACTER (viế t tắ t NATIONAL CHAR hoặ c NCHAR). Loạ i
chuỗ i ký tự quố c gia có độ dà i thay đổ i là NATIONAL CHAR ACTER VARYING (viế t tắ t
NATIONAL CHAR VARYING hoặ c NCHAR VARYING). Nghĩa đen chuỗ i cho cá c loạ i ký tự
QUỐ C GIA có tiề n tố là N (ví dụ : N'Bob ').
Hầ u hế t cá c DBMS đặ t giớ i hạ n trê n về kích thướ c củ a chuỗ i ký tự . Để lưu trữ cá c chuỗ i
lớ n, SQL cung cấ p kiể u dữ liệ u CHARACTER LARGE OBJECT (viế t tắ t là CHAR LARGE OBJECT
hoặ c CLOB). SQL cho phé p sử dụ ng mã hó a chuỗ i ký tự quố c gia vớ i NATIO NAL
CHARACTER LARGE OBJECT (viế t tắ t NCHAR LARGE OBJECT hoặ c NCLOB).

1.2.2 Số
SQL bao gồ m mộ t số loạ i khá c nhau để lưu trữ thô ng tin số , chẳ ng hạ n như tuổ i và mứ c
lương. Khi chỉ định mộ t loạ i số , chú ng ta cầ n xem xét ba câ u hỏ i: 1) Dữ liệ u củ a chú ng
tô i có bị giớ i hạ n ở số nguyê n khô ng, 2) Chú ng tô i muố n hỗ trợ phạ m vi giá trị nà o, và 3)
Chú ng ta cầ n bao nhiê u quyề n kiể m soá t đố i vớ i độ chính xá c?
SỐ NGUYÊN, SMALLINT và BIGINT—CỬ A HÀ NG SỐ NGUYÊ N, SMALLINT và BIGINT đã ký số
nguyên. Phạ m vi củ a cá c giá trị có thể là phụ thuộ c DBMS; tuy nhiê n, phạ m vi giá trị cho
SMALLINT nhỏ hơn hoặc bằ ng phạm vi giá trị cho INTEGER, nhỏ hơn hoặ c bằ ng phạ m
vi giá trị cho BIGINT. INTEGER có thể đượ c viế t tắ t là INT.
SỐ[(ĐTCK) [, S])] và THẬP PHÂN[(ĐTCK) [, S])]—SỐ (P, S) Xá c định a Ký fixed- điể m số đâ u P
(độ chính xá c) Xá c định cá c tấ t cả số (đế n cá c Bê n trá i và Bê n phả i củ a số thậ p
phâ n) củ a cá c chữ số trong số và S (thang đo) chỉ định số chữ số thà nh bên phả i củ a vị
trí thậ p phâ n. Ví dụ : NUMERIC(5, 2) chỉ định mộ t phạ m vi loạ i từ 999,99 đế n 999,99.
SỐ THẬ − P PHÂ N (P, S) giố ng như NUMERIC (P, S) ngoạ i trừ việ c tin tứ cđế n Chính xá c
Thá ng 5 quá cá c quy cá ch. Cho cả hai SỐ và THẬ P PHÂ N nế u P hoặ c S khô ng đượ c
chỉ định, Giá trị mặ c định sẽ đượ c sử dụ ng. DECIMAL có thể đượ c viế t tắ t là Thá ng
mườ i hai.
REAL và DOUBLE PRECISION—REAL chỉ định mộ t số dấ u hiệu, độ chính xá c đơn, floating-point.
Phạ m vi là DBMS cụ thể . DOUBLE PRECISION cũ ng giố ng như REAL ngoạ i trừ nó hỗ
trợ phạ m vi giá trị lớ n hơn.
FLOAT[(P)]—FLOAT(P) chỉ định mộ t số dấ u phẩ y độ ng có dấ u vớ i độ chính xá c ít nhấ t là P.
Ở đâ y P chỉ định số lượ ng chữ số nhị phân.
Chữ số trô ng giố ng như bạ n mong đợ i. Đố i vớ i REAL, DOUBLE và FLOAT, nghĩa đen có thể là
đượ c viế t bằ ng ký hiệ u hà m mũ như nEp đạ i diệ n cho n ×10p đâ u n là mộ t dấ u hiệ u, nổ i- điể m
số và p Là a Ký toà n bộ số (ví dụ : 7.4E-3).
6 Chương 1: Databasics ■

Nếu bạ n cố gắ ng sử dụ ng mộ t số có giá trị tuyệ t đố i quá lớ n cho dữ liệ u kiể u Cơ sở


dữ liệ u sẽ tạ o ra mộ t ngoạ i lệ . Ví dụ : mộ t ngoạ i lệ sẽ đượ c nê u ra nếu chú ng ta Cố gắ ng
đế n để 1000 và − o a SỐ (5,2) fiLử a. Nế u mà y dù ng a số vớ i quá nhiề u số ở bê n phả i củ a
dấ u thậ p phâ n, DBMS có thể cắ t bớ t hoặ c là m trò n giá trị. Như vậ y đặ t 0,0001 và o
trườ ng NUMERIC(5,2) dẫ n đế n giá trị là 0,00. Mộ t số có ít hơn Cá c chữ số vượ t quá giớ i
hạ n củ a kiểu dữ liệ u có thể đượ c đặ t và o mộ t cộ t mà khô ng cầ n exception hoặ c thay đổ i.
Cho ví dụ 9.9 fiTs trong a SỐ (5,2) fiLử a.

1.2.3 Thời
SQL cung cấ p mộ t số loạ i dữ liệ u cụ thể để lưu trữ thô ng tin về thờ i gian infor-mation.
Việ c thể hiệ n và sử dụ ng dữ liệ u và thô ng tin thờ i gian có thể phứ c tạ p vớ i nhữ ng câ n
nhắ c về mú i giờ , giờ tiết kiệ m á nh sá ng ban ngà y, v.v. Do đó , dữ liệu thờ i gian có xu
hướ ng cụ thể hơn DBMS so vớ i cá c loạ i khá c. Nếu cú phá p đượ c trình bà y ở đâ y khô ng
hoạ t độ ng trê n cơ sở dữ liệu củ a bạ n, hã y kiể m tra tà i liệ u DBMS củ a bạ n. SQL chia cá c
kiểu thờ i gian củ a nó thà nh hai loạ i: datetime và interval. Chú ng tô i bắ t đầ u bằ ng cá ch
xem xét cá c loạ i ngà y và giờ trong SQL.

Ngày giờ
Cá c loạ i Datetime lưu trữ ngà y, thô ng tin thờ i gian hoặ c cả hai.

Kiểu Cửa hàng Chữ

NGÀY nă m, thá ng, ngà y NGÀ Y 'YYYY-MM-DD'


Thời gian giờ , phú t và giâ y THỜ I GIAN 'HH: MM: SS'
TIMESTAMP nă m, thá ng, ngà y, giờ , DẤ U THỜ I GIAN 'YYYY-MM-DD
phú t và giâ y HH:MM:SS'

Giâ y có thể chứ a cá c giá trị phâ n số (ví dụ : 32,456 giâ y). Độ chính xá c tù y chọ n cho giâ y
phâ n số có thể đượ c đưa ra cho TIME và TIMESTAMP. TIME và TIMESTAMP có thể bao gồ m
thô ng tin mú i giờ . Tham khả o tà i liệ u DBMS củ a bạ n để biế t chi tiế t về VỚ I MÚ I GIỜ .
Sử dụ ng DATE cho cá c cộ t mà bạ n khô ng quan tâ m đế n thờ i gian củ a mộ t sự kiệ n, chỉ
quan tâ m đế n ngà y cụ thể (ví dụ : sinh nhậ t). Sử dụ ng loạ i TIME mà bạ n khô ng quan tâ m đến
ngà y, chỉ quan tâ m đế n thờ i gian cụ thể . Mộ t ví dụ là thờ i gian củ a mộ t lớ p họ c đạ i họ c, có
thể là lú c 8 GIỜ SÁ NG thứ Ba và thứ Nă m trong mộ t họ c kỳ . TIMESTAMP bao gồ m cá c trườ ng
hợ p khá c. Ví dụ về TIMESTAMP có thể là thờ i điể m đặ t hà ng. Trong trườ ng hợ p nà y, chú ng
tô i muố n biế t cả ngà y và giờ .

Khoảng
Ngoà i ngà y và giờ , SQL có thể đạ i diện cho cá c khoả ng thờ i gian. Loạ i dữ liệ u như vậ y có
thể hữ u ích để thể hiệ n cá c khá i niệm như thờ i hạ n bả o hà nh (ví dụ : 90 ngà y). Dữ liệ u
khoả ng thờ i gian
■ 1.2 Dữ liệ u Loạ i 7

Cá c loạ i có hai AVOR FL:


Năm – Tháng — Khoả ng thờ i gian đượ c biể u thị bằ ng nă m và / hoặ c thá ng. Loạ i dữ liệu khoả ng
thờ i gian Nă m-Thá ng có thể là KHOẢ NG THỜ I GIAN NĂ M , KHOẢ NG THỜ I GIAN THÁ NG hoặ c
KHOẢ NG THỜ I GIAN TỪ NĂ M NÀ Y SANG THÁ NG KHÁ C.
Ngày–Giờ—Khoả ng thờ i gian đượ c biể u thị bằ ng ngà y, giờ , phú t và /hoặ c giâ y. Kiể u dữ liệ u
khoả ng thờ i gian mộ t ngà y có dạ ng sau:

INTERVAL <giá trị khoả ng thờ i gian bắt đầu> [ĐẾ N <giá trị khoảng dừng khoảng thời gian>]

trong đó cá c giá trị khoả ng thờ i gian có thể là DAY, HOUR, MINUTE và SECOND. Nếu tù y chọ n
<giá trị khoả ng dừng > đượ c chỉ định, nó phả i là mộ t khoả ng có độ chi tiết nhỏ hơn
<giá trị khoảng thời gian bắt đầ u>. Ví dụ : nế u giá trị khoả ng thờ i gian < bắt đầu> là
HOUR, cá c giá trị hợ p lệ duy nhấ t cho giá trị khoảng thời gian dừng < > là MINUTE và
SECOND.
Tạ o mộ t khoả ng thờ i gian theo nghĩa đen là mộ t quá trình hai bướ c. Đầ u tiê n, xá c
định loạ i khoả ng thờ i gian (ví dụ : NGÀ Y NÀ Y SANG PHÚ T KHÁ C). Thứ hai, đặ t mộ t chuỗ i
nghĩa đen khoả ng thờ i gian giữ a INTERVAL và đặ c tả phạ m vi giá trị khoả ng thờ i gian.
Dướ i đâ y là mộ t số ví dụ về nghĩa đen khoả ng thờ i gian:

Kiểu Ví dụ về Nghĩa đen Mô tả:__________

Năm–Tháng KHOẢ NG THỜ I GIAN '5' NĂ M 5 nă m


KHOẢ NG THỜ I GIAN '2' THÁ NG 2 Thá ng
KHOẢ NG THỜ I GIAN '3-1' NĂ M NÀ Y QUA 3 nă m và 1 thá ng
THÁ NG KHÁ C
Ngày–Giờ KHOẢ NG THỜ I GIAN '5 10:30:22.5' NGÀ Y 5 ngà y, 10 giờ , 30 phú t và
ĐẾ N GIÂ Y
22.5 giâ y
INTERVAL ' -5' NGÀ Y 5 ngà y trướ c
KHOẢ NG THỜ I GIAN '2 18 :00' NGÀ Y ĐẾ N PHÚ T 2 NGÀ Y 18

1.2.4 Nhị phân


Mặ c dù mọ i thứ trê n má y tính cuố i cù ng đượ c lưu trữ dướ i dạ ng dữ liệu nhị phâ n, các kiểu
dữ liệ u nhị phâ n SQL đượ c thiết kế để lưu trữ chuỗ i các chữ số nhị phâ n. Cá c loạ i nhị phâ n
khá c vớ i chuỗ i charac- ter và các loạ i số ở chỗ chú ng bị hạ n chế hơn trong cá c so sá nh cho
phé p, tìm kiế m và cá c chứ c nă ng khá c. Cá c ứ ng dụ ng phổ biế n cho cá c loạ i nhị phâ n bao
gồ m lưu trữ điệ n tử đa phương tiệ n, chẳ ng hạ n như ả nh, â m thanh và phim, và lưu trữ
hình ả nh đượ c quét, như trong hệ thố ng truy xuấ t và hình ả nh tà i liệ u.
BIT[(L)] chỉ định mộ t chuỗ i nhị phâ n có độ dà i fi xed chứ a chính xá c cá c bit L. Nế u chiề u dà i,
L, khô ng đượ c chỉ định, SQL sử dụ ng độ dà i là 1. Hà nh vi cố gắ ng chè n ít hơn L bit là
dà nh riê ng cho hệ thố ng. Mộ t số hệ thố ng sẽ từ chố i nỗ lự c chè n; nhữ ng ngườ i khá c sẽ
đệ m vớ i số khô ng.
BIT VARYING(L ) chỉ định mộ t chuỗ i nhị phâ n có độ dà i thay đổ i có thể chứ a tố i đa L bit.
8 Chương 1: Databasics ■

BINARY LARGE OBJECT[(L)] chỉ định mộ t chuỗ i nhị phâ n lớ n, có độ dà i thay đổ i có thể chứ a tớ i
L byte. Nếu chiề u dà i, L, khô ng đượ c chỉ định, chiề u dà i mặ c định củ a hệ thố ng đượ c
sử dụ ng. ĐỐ I TƯỢ NG LỚ N NHỊ PHÂ N có thể đượ c viế t tắ t là BLOB.
Cá c nghĩa đen BIT và BIT VARYING có thể đượ c viết ở dạ ng nhị phâ n — mộ t chuỗ i
trích dẫ n kèm theo 0s và 1s có tiề n tố B (ví dụ : B'10110 ') — hoặ c dạ ng thậ p lụ c phâ n —
mộ t chuỗ i trích dẫ n duy nhấ t kèm theo tiề n tố chữ số thậ p lụ c phâ n vớ i X (ví dụ : X'3AF ').
Lưu ý rằ ng đặ c tả SQL 2003 giả m cả BIT và BIT THAY ĐỔ I để cá c hệ thố ng hỗ trợ cá c loạ i
nà y có thể loạ i trừ chú ng trong các bả n phá t hà nh trong tương lai.

1.2.5 Boolean
Sự thậ t có đượ c mộ t danh mụ c riê ng trong SQL vớ i kiểu dữ liệ u BOOLEAN. Kiể u dữ liệ u
BOOLEAN có ba giá trị có thể có : true, false và unknown. Giá trị chưa biế t có thể sur- prise
nhữ ng ngườ i quen thuộ c vớ i cá c loạ i boolean trong hầ u hế t cá c ngô n ngữ lậ p trình. Chú ng ta
thả o luậ n về giá trị khô ng xá c định trong Phầ n 2.8. Cá c nghĩa đen củ a BOOLEAN là (bấ t ngờ )
TRUE, FALSE và UNKNOWN. Loạ i BOOLEAN khô ng đượ c hỗ trợ rộ ng rã i, nhưng hy vọ ng
rằ ng nó sẽ có trong tương lai gầ n.

1.2.6 Các loại dữ liệu khác


Hầ u hế t cá c DBMS bao gồ m mộ t loạ t cá c loạ i dữ liệu tù y chỉnh (ví dụ : tiề n, mạ ng, hình
họ c). Sử dụ ng cá c loạ i dữ liệu như vậ y rấ t thuậ n tiệ n nhưng có thể hạ n chế tính di độ ng.
Lưu ý rằ ng khô ng phả i tấ t cả cá c kiểu dữ liệ u chuẩ n SQL đề u đượ c mọ i DBMS hỗ trợ .
Tham khả o tà i liệ u DBMS củ a bạ n để biế t danh sá ch cá c loạ i đượ c hỗ trợ .

1.3 KHÔNG
Điề u gì sẽ xả y ra nếu mộ t thuộ c tính cụ thể cho mộ t hà ng khô ng đượ c biế t đến? Mộ t giá trị có
thể khô ng xá c định vì khô ng có giá trị á p dụ ng, giá trị hiệ n đang bị thiế u hoặ c giá trị bị bỏ qua
có chủ đích . Chú ng ta hã y xem xé t cẩ n thậ n hơn cộ t referredby trong bả ng providers. Đố i vớ i
mỗ i nhà cung cấ p , trườ ng nà y chứ a mã định danh củ a nhà cung cấ p đượ c đề xuấ t. Cá c loạ i
kem có hương vị đã đượ c giớ i thiệu cho bạ n bở i Veggies_R_Us vì vậ y ngườ i giới thiệu fi eld
củ a hà ng trong các nhà cung cấp cho Kem hương vị có chứ a giá trị VGRUS. Referredby nê n
chứ a giá trị gì cho mộ t nhà cung cấ p mà khô ng có khuyế n nghị? Chú ng tô i có thể cố gắ ng
chọ n mộ t giá trị nhậ n dạ ng đặ c biệt để chỉ ra rằ ng mã định danh được giới thiệu khô ng hợ p
lệ (giả sử , XXXXX); Tuy nhiê n, chú ng tô i cầ n đả m bả o rằ ng mã định danh nà y khô ng bao giờ
có thể là mã định danh nhà cung cấ p hợ p lệ . Ngoà i ra, bấ t kỳ ứ ng dụ ng nà o sử dụ ng cơ sở dữ
liệ u nà y sẽ phả i biế t về mã định danh đặ c biệ t nà y và thự c thi ý nghĩa đặ c biệ t củ a nó .
Để trá nh nhữ ng khó khă n nà y, cơ sở dữ liệ u quan hệ cung cấ p mộ t giá trị đặ c biệ t,
đượ c gọ i là NULL, chỉ ra rằ ng v alue củ a fi eldlà khô ng rõ . Trong bả ng nhà cung cấ p, referredby
là NULL cho tấ t cả cá c nhà cung cấ p mà chú ng tô i khô ng có nhà cung cấ p đề xuấ t. Trừ khi bị
cấ m rõ rà ng, NULL là giá trị hợ p lệ cho mộ t cộ t thuộ c bất kỳ kiểu dữ liệ u nà o . Ví dụ : NULL là
mộ t giá trị hợ p lệ cho mộ t cộ t thuộ c loạ i NUMERIC. Điề u nà y có nghĩa là NULL có thể là mộ t
giá trị hợ p lệ trong mộ t cộ t
■ 1.5 Bà n Mố i quan hệ 9

loạ i FLOAT. NULLs là mộ t chủ đề dính và cá ch chú ng đượ c xử lý có thể khô ng phả i lú c
nà o cũ ng rõ rà ng. Chú ng tô i giả i quyế t trạ ng thá i đặ c biệ t củ a NULLs bấ t cứ khi nà o có
thể .

1.4 Khóa chính

Khóa chính củ a bả ng là mộ t cộ t hoặ c tậ p hợ p cá c cộ t có giá trị xá c định duy nhấ t mộ t


hà ng. Sử dụ ng cá c giá trị củ a khó a chính, chú ng ta có thể tham chiế u đế n mộ t hà ng cụ
thể trong bả ng. Trong bả ng nhà cung cấ p, mỗ i nhà cung cấ p có mộ t mã định danh duy
nhấ t, vendorid, mà chú ng tô i sử dụ ng là m khó a chính. Nế u chú ng ta khai bá o mộ t khó a
chính trê n mộ t table, DBMS sẽ thự c thi cá c quy tắ c sau:

Giá trị củ a khó a chính cho mộ t hà ng cụ thể phả i là duy nhấ t.

Khô ng có giá trị cộ t khó a chính nà o có thể là NULL.

Tạ i sao khó a chính lạ i quan trọ ng như vậ y? Giả sử chú ng tô i khô ng có danh tính duy nhấ t
nà y và chú ng tô i muố n thay đổ i tên cô ng ty cho mộ t đạ i diện tê n là Bob Snitch. Nế u có nhiều
đạ i diện vớ i tê n nà y, chú ng tô i khô ng có cá ch nà o để biế t Snitch là đạ i diện nà o. Bằ ng cá ch có
mộ t khó a chính như vendorid, chú ng ta có thể phâ n biệt cá c Snitches củ a mình.
Trong vă n bả n nà y, chú ng tô i chỉ ra (cá c) cộ t củ a khó a chính cho mộ t bả ng có ký hiệ u.
Lưu ý rằ ng DBMS quan hệ có thể cho phé p tạ o bả ng mà khô ng cầ n khó a chính; tuy nhiê n,
thiế t kế cơ sở dữ liệ u tố t yê u cầ u khó a chính trong hầ u như tấ t cả cá c bả ng.

1.5 Mối quan hệ bảng


Mộ t cơ sở dữ liệ u thườ ng chứ a mộ t số bả ng. Mỗ i bả ng trong cơ sở dữ liệ u usually có mộ t
hoặ c nhiều mố i quan hệ vớ i cá c bả ng khá c trong cơ sở dữ liệ u. Ngoà i bả ng nhà cung cấp,
ứ ng dụ ng nhà hà ng củ a bạ n có mộ t bả ng nguyê n liệ u riê ng:

Nguyên liệu

Thành phần Tên đơn vị giá đơn vị nhóm thực Kho nhà cung cấp
phẩm FK

Tiếng CHESE Phó má t xú c 0.03 Sữ a 150 MÁY DNDRY


CHIKN Gà dả i 0.45 Thịt 120 MÁY DNDRY
CRUTN Crouton mả nh 0.01 Bá nh mì 400 EDDRS
NHO Nho mả nh 0.01 Trá i 300 FRTFR ·
LETUS · Rau diế p bá t 0.01 Rau 200 VGRUS
PICKL Dưa lá t 0.04 Rau 800 VGRUS
SCTDR Mặ c quầ n á o bí bá o 0.03 KHÔ NG 120 KHÔNG
tuyế t
mậ t
NÀY Cà chua lá t 0.03 Trá i 15 VGRUS
NƯỚC Nướ c kính 0.06 KHÔ NG KHÔ NG SPWTR
Nước xô-đa Nướ c xô -đa kính 0.69 KHÔ NG 5000 SPWTR
WTRML Dưa hấ u mả nh 0.02 Trá i KHÔ NG FRTFR ·
ORNG Cam lá t 0.05 Trá i 10 FRTFR ·
10 Chương 1: Databasics ■

Mỗ i thà nh phầ n đượ c sử dụ ng trong nhà hà ng củ a bạ n có mộ t hà ng trong bả ng thà nh phầ n


và mỗ i thà nh phầ n có thể đượ c xá c định duy nhấ t bở i thà nh phầ n củ a nó , chìa khó a chính củ a
các thành phần. Mỗ i hà ng trong các thành phần cũ ng chứ a mã định danh củ a nhà cung cấ p
cung cấ p nó . Vendorid trong cá c thà nh phầ n kết nố i mỗ i hà ng vớ i hà ng tương ứ ng trong
bả ng nhà cung cấp. Lưu ý rằ ng việc có cá c cộ t có cù ng tê n trong cá c bả ng khá c nhau khô ng
gâ y nhầ m lẫ n cho SQL (ví dụ : vendorid trong cả nhà cung cấp và thành phần). SQL khô ng yê u
cầ u cá c cộ t liên quan phả i đượ c đặ t tên giố ng nhau, cũ ng như cá c cộ t đượ c đặ t tên giố ng nhau
cũ ng khô ng phả i có liê n quan.

1.5.1 Khóa nước ngoài


Khóa ngoại là mộ t cộ t hoặc tậ p hợ p các cộ t trong bả ng tham chiế u đến mộ t cộ t hoặ c tậ p hợ p cá c
col-umns trong mộ t số bả ng (có thể giố ng nhau). Trong Cơ sở dữ liệ u nhà hà ng, nguyên liệu.
vendorid là mộ t nhà cung cấp tham chiế u khó a nướ c ngoà i. vendorid. Hã y xem xé t cá c trích
đoạ n bả ng trong Hình 1.1. Thà nh phầ n Nho có mộ t vendorid củ a FRTFR, trong đó đề cậ p đế n
mã định danh nhà cung cấ p cho "Ă n trá i câ y" Bạ n bè . Veggies_R_Us cung cấ p hai trong số
cá c thà nh phầ n trong ví dụ fi gure.
Khó a ngoạ i phụ thuộ c và o hà ng mà nó đang tham chiế u trong mộ t bả ng khá c để
đả m bả o tính đầ y đủ . Trong bả ng thành phần, giá trị thuộ c tính vendorid khô ng có ý nghĩa
gì nế u khô ng có hà ng tương quan trong bả ng nhà cung cấp. Ví dụ : vendorid cho Cheese
trong các thành phần là DNDRY, có rấ t ít ý nghĩa trừ khi chú ng ta có thể tìm hiểu thô ng
tin về nhà cung cấ p vớ i số nhậ n dạ ng đó . Bả ng chứ a khó a ngoạ i đượ c gọ i là bả ng con và
bả ng chứ a (cá c) thuộ c tính mà nó tham chiế u đượ c gọ i là bả ng cha. (Cá c) giá trị thuộ c tính
đượ c tham chiếu trong bả ng cha bắ t buộ c phả i là duy nhấ t. Thô ng thườ ng, các thuộ c
tính đượ c tham chiế u nà y là khó a chính củ a bả ng cha, nhưng đâ y khô ng phả i là yêu cầ u
bắ t buộ c. Ràng buộc về tính toàn vẹn củ a khó a nước ngoài (hoặc tham chiếu) yê u cầ u rằ ng
bấ t kỳ giá trị khóa ngoạ i nà o trong bả ng con phả i có mộ t trong cá c đặ c điểm sau:

Có giá trị phù hợ p trong bả ng mẹ HOẶ C

Hã y là NULL

Nguyên liệu
Đại lý
Thành phần Tên nhà cung cấp
FK · vendorid tên công ty được giới
thiệubởi FK
NHO Nho FRTFR ·
LETUS · Rau diế p VGRUS
Flvcr Kem có hương vị VGRUS
FRTFR · "Ă n trá i câ y" Bạ n bè Flvcr
PICKL Dưa VGRUS
VGRUS Veggies_R_Us KHÔNG
SCTDR Mặ c quầ n á o bí KHÔNG

Vi phạ m Foriegn Chìa khoá Rà ng buộ c

EGPLT Cà tím FAKVD

Hình 1.1: Khó a ngoạ i.


■ 1.5 Bà n Mố i quan hệ 11

Hã y xem xé t cá c bả ng trong Hình 1.1. Nế u chú ng ta cố gắ ng thê m mộ t hà ng cho cà tím thà nh


phầ n vớ i mã định danh nhà cung cấ p FAKVD, DBMS sẽ khô ng cho phé p thê m vì giá trị
vendorid FAKVD khô ng tồ n tạ i trong bả ng nhà cung cấ p. Lưu ý rằ ng mộ t số hà ng trong bả ng
con (thành phần) có thể tham chiế u đế n cù ng mộ t hà ng trong bả ng mẹ (nhà cung cấp).
Nế u mộ t khó a nướ c ngoà i đượ c khai bá o, DBMS sẽ thự c thi rà ng buộ c tính toà n vẹ n
củ a khó a nướ c ngoà i bằ ng cá ch khô ng bao giờ có sự tồ n tạ i củ a mộ t hà ng vi phạ m trong
bả ng con. Giố ng như khó a chính, khó a ngoạ i có thể có nhiề u thuộ c tính. Khó a ngoạ i thậ m
chí có thể tham chiế u đến cá c thuộ c tính trong cù ng mộ t bả ng. Ví dụ , các nhà cung cấp.
referredby là mộ t chìa khó a nướ c ngoà i cho các nhà cung cấp. vendorid (xem Hình 1.1). Ở
đâ y DBMS sẽ khô ng cho phé p mộ t hà ng chứ a mộ t giá trị cho referredby chưa tồ n tạ i trong
cộ t vendorid củ a vendors.

1.5.2 Các loại mối quan hệ


Có ba loạ i mố i quan hệ cơ bả n giữ a cá c bả ng: mộ t-nhiề u, nhiề u-nhiề u , và mộ t-mộ t.

Một-nhiều
Trong mố i quan hệ mộ t-nhiề u giữ a cá c bả ng T1 và T2, mỗ i hà ng từ T1 liên quan đến số khô ng
hoặ c nhiều hà ng trong T2 và mỗ i hà ng trong T2 liê n quan đế n nhiề u nhấ t mộ t hà ng trong
T1. Để mô hình hó a mố i quan hệ nà y, T2 sẽ có cá c thuộ c tính tham chiế u khó a nướ c ngoà i
trong T1. Đố i vớ i Cơ sở dữ liệ u Restau- rant, mố i quan hệ giữ a cá c nhà cung cấp và các
thành phần là mộ t-nhiề u. Mỗ i nhà cung cấ p có thể cung cấ p nhiề u thà nh phầ n khá c nhau; tuy
nhiê n, mộ t thà nh phầ n có thể đượ c cung cấ p bở i nhiề u nhấ t mộ t nhà cung cấ p. Hình 1.2 cho
thấ y mố i quan hệ mộ t-nhiề u giữ a cá c nhà cung cấp

Đại lý Nguyên liệu

vendorid thành phầnvendorid FK ·


VGRUS MÁY CHESE DNDRY ·
DNDRY Flvcr CHIKNDNDRY ·
FRTFR ·
EDDRS CRUTN
EDDRS
SPWTR FRTFR · NHO
LETUS ·VGRUS ·
PICKLVGRUS ·
SCTDR NULL
VGRUS NÀY
SPWTR NƯỚC
Nước xô-đaSPWTR
WTRMLFRTFR · ·
ORNG FRTFR ·
Hình 1.2: Mố i quan hệ mộ t-nhiề u giữ a các nhà cung cấp và các thành phần.
12 Chương 1: Databasics ■

và các thành phần. Mỗ i hà ng từ các thành phần chứ a mã định danh củ a nhà cung cấ p cung
cấ p (hoặ c NULL). Mộ t mã định danh nhà cung cấ p cụ thể có thể hiể n thị trong nhiề u hà ng
thành phần. Ví dụ : bạ n nhậ n đượ c phô mai từ nhà cung cấ p vớ i identifier DNDRY. Tra
cứ u DNDRY trong bả ng nhà cung cấ p , chú ng ta thấ y tê n củ a nhà cung cấp phô mai là
Don's Dairy. Để tìm hiểu cá c ingre- dients do Veggies_R_Us cung cấ p, trướ c tiê n hã y tra
cứ u mã định danh nhà cung cấ p củ a nó trong bả ng nhà cung cấ p (tứ c là VGRUS) và sau đó tra cứ u
cá c thà nh phầ n cho mã định danh nhà cung cấp đó trong bả ng thà nh phầ n . Chú ng tô i
là m cho thuộ c tính vendorid trong cá c thà nh phần trở thà nh khó a nướ c ngoà i cho thuộ c tính
vendorid trong các nhà cung cấp để thự c thi mố i quan hệ nà y.
Mộ t nhà cung cấ p có thể tồ n tạ i mà khô ng cầ n cung cấ p bấ t kỳ thà nh phầ n nà o. Mộ t
nhà cung cấ p như vậ y sẽ có mộ t hà ng trong bả ng nhà cung cấp nhưng khô ng có hà ng phù
hợ p trong bả ng thành phần. Trong bả ng nhà cung cấ p, nhà cung cấ p Kem Hương vị khô ng
cung cấ p bấ t kỳ thà nh phầ n nà o. Ngượ c lạ i, mộ t thà nh phầ n có thể tồ n tạ i mà khô ng có
nhà cung cấ p. Trong trườ ng hợ p nà y, thuộ c tính vendorid trong bả ng thành phần sẽ là
NULL. Thà nh phầ n Mặ c quầ n á o bí mậ t củ a bạ n khô ng có nhà cung cấ p vì bạ n tự biế n nó
thà nh củ a mình.
Bả ng nhà cung cấp cũ ng tham gia và o mố i quan hệ mộ t-nhiề u vớ i chính nó. Mộ t nhà
cung cấ p có thể giớ i thiệu nhiều nhà cung cấ p khá c; tuy nhiê n, mộ t nhà cung cấ p có thể đượ c đề
xuấ t bở i nhiề u nhấ t mộ t nhà cung cấ p. Để đạ i diệ n cho mố i quan hệ mộ t-nhiề u nà y, các nhà
cung cấp. referredby là mộ t khó a nướ c ngoà i tham chiế u đế n các nhà cung cấp. vendorid.

Nhiều-to-Nhiều
Trong mố i quan hệ nhiề u-nhiề u giữ a cá c bả ng T1 và T2, mỗ i hà ng từ T1 liên quan đến các hà ng
khô ng hoặ c nhiều hơn trong T2 và mỗ i hà ng trong T2 liê n quan đế n cá c hà ng khô ng hoặ c nhiề u
hơn trong T1. Để kiế m tiề n, bạ n cầ n mộ t số mặ t hà ng thự c phẩ m để bá n cho khá ch hà ng.
Để thể hiệ n điề u nà y, Cơ sở dữ liệ u Nhà hà ng củ a chú ng tô i chứ a mộ t bả ng cá c mụ c. Mỗ i mặ t
hà ng đượ c là m từ nhiều thà nh phầ n, và mỗ i thà nh phầ n có thể đượ c sử dụ ng trong nhiề u mặ t
hà ng. Do đó , chú ng ta có mố i quan hệ nhiều-nhiều giữ a cá c mặ t hà ng và thà nh phầ n. Hã y bắ t
đầ u nhìn và o bả ng mục.

Mục

itemid Tên giá ngàythêm


CHKSD Saladgà 2.85 1998-11-13
FRTSD · Salad trá i câ y 3.45 2000-05-06
GDNSD Salad vườ n 0.99 2001-03-02
MILSD Salad thiên niên KHÔ NG 2002-08-16
kỷ
Nước xô- Nướ c xô -đa 0.99 2003-02-06
đa
NƯỚC Nướ c 0.00 2002-05-19
FRPLT Đĩa trá i câ y 3.99 2000-09-02

Mỗ i mụ c có mộ t mã định danh mụ c, itemid, khó a chính cho bả ng mục. Mỗ i mụ c cũ ng có tê n


■ 1.5 Bà n Mố i quan hệ 13
đầ y đủ , giá thự c đơn và ngà y mụ c đượ c thê m và o menu. Để thể hiệ n
14 Chương 1: Databasics ■

Mố i quan hệ nhiề u-nhiề u, chú ng ta cầ n mộ t số cá ch để kế t hợ p cá c mặ t hà ng vớ i cá c thà nh


phầ n và ngượ c lạ i. Để là m điề u nà y, chú ng tô i tạ o ra mộ t bả ng mớ i, đượ c gọ i là bả ng
madewith, kế t hợ p cá c thà nh phầ n vớ i cá c mụ c.

thực hiện với

itemid FK thành phần FK số lượng


CHKSD Tiếng CHESE 2
CHKSD CHIKN 4
CHKSD LETUS · 1
CHKSD SCTDR 1
FRTSD · NHO 10
FRTSD · WTRML 5
GDNSD LETUS · 4
GDNSD NÀY 8
FRPLT WTRML 10
FRPLT NHO 10
FRPLT Tiếng CHESE 10
FRPLT CRUTN 10
FRPLT NÀY 8
NƯỚC NƯỚC 1
Nước xô-đa Nước xô-đa 1
FRPLT ORNG 10

Đố i vớ i mỗ i thà nh phầ n trong mộ t mụ c, bả ng madewith có mộ t hà ng chứ a mụ c tương


quan và mã định danh thà nh phầ n. Mộ t bả ng như madewith liê n kế t cá c hà ng từ bả ng nà y
sang bả ng khá c đượ c gọ i là bả ng nối. Hình 1.3 cho thấ y mố i quan hệ nhiề u-nhiề u giữ a cá c
thành phần và các mặt hàng. Mó n Salad gà có 4 thà nh phầ n, đượ c thể hiện bằ ng 4 hà ng
trong madewith vớ i mộ t itemid là CHKSD. Thà nh phầ n Cheese đượ c sử dụ ng trong hai mụ c,
đượ c thể hiệ n bằ ng 2 hà ng trong madewith vớ i mộ t thành phần CHESE.
Bạ n có thể thấ y rằ ng mô hình quan hệ khô ng có mố i quan hệ rõ rà ng nhiề u-nhiề u tà u.
Nó thự c hiệ n mố i quan hệ nhiề u-nhiề u bằ ng cá ch sử dụ ng 2 mố i quan hệ mộ t-nhiề u. Để ghi
lạ i lượ ng củ a mỗ i thà nh phầ n cầ n đưa và o mộ t mụ c, chú ng tô i thê m thuộ c tính số lượng. Ví
dụ , mỗ i mó n salad trá i câ y có 10 quả nho và 5 khố i dưa hấ u.
Khó a chính cho madewith bao gồ m hai thuộ c tính: itemid và ingre- dientid. Như bạ n có
thể nghi ngờ , madewith. Thành phần là mộ t thành phần tham chiếu quan trọ ng nướ c ngoà i.
thành phầnid, và madewith. itemid là mộ t khó a nướ c ngoà i referencing mục. itemid. Vớ i cá c
khó a chính và khó a ngoạ i nà y, DBMS sẽ thự c thi cá c rà ng buộ c sau đố i vớ i bả ng madewith:

Mỗ i cặ p itemid, ingredientid trong mộ t madewith phả i là duy nhấ t (khó a chính).

Cả itemid và cộ t ingredientid đều khô ng thể chứ a NULL (khó a chính).

Mọ i giá trị itemid/ingredientid phả i tồ n tạ i trong bả ng item/component (khó a ngoạ i).
■ 1.5 Bà n Mố i quan hệ 15

Mục thực hiện Nguyên liệu


với

itemid itemid Thành phần FK · FK Thành phần


·
CHKSD CHKSD Tiếng CHESE CHIKN Tiếng CHESE
FRTSD · CHKSD LETUS · SCTDR CHIKN CRUTN
GDNSD CHKSD NHO WTRML NHO LETUS ·
MILSD CHKSD LETUS · NÀY PICKL SCTDR
SODA FRTSD · WTRML NHO Tiếng NÀY NƯỚC
NƯỚC FRTSD CHESE CRUTN NÀY Nước xô-đa
FRPLT GDNSD NƯỚC Nước xô-đa WTRML ORNG
GDNSD ORNG
FRPLT
FRPLT
FRPLT
FRPLT
FRPLT
NƯỚC
SODA
FRPLT
FRPLT
Hình 1.3: Mố i quan hệ nhiề u-nhiề u giữ a cá c thành phần và các mặt hàng.

Một đối một


Thô ng thườ ng, mố i quan hệ mộ t-mộ t đượ c thể hiệ n bằ ng cá c thuộ c tính trong mộ t bả ng duy
nhấ t. Đó là , tấ t cả cá c thuộ c tính củ a mộ t bả ng thể hiệ n mố i quan hệ mộ t-mộ t tự nhiê n.
Trong bả ng nhà cung cấ p , mộ t hà ng liê n hệ mộ t mã định danh nhà cung cấ p vớ i mộ t tê n cô ng
ty vớ i mộ t đạ i diện.
Trong mố i quan hệ mộ t-mộ t giữ a cá c bả ng T1 và T2, mỗ i hà ng từ T1 liên quan đế n
nhiều nhấ t mộ t hà ng trong T2 và ngượ c lạ i. Trong thự c tế , mố i quan hệ mộ t-mộ t giữ a
cá c bả ng thườ ng chỉ là mộ t trườ ng hợ p đặ c biệt củ a mố i quan hệ mộ t-nhiề u.

1.5.3 Lược đồ
Ion thu thậ pcủ a cá c bả ng và cá c đố i tượ ng mô tả dữ liệ u khá c trong cơ sở dữ liệu đượ c
gọ i là lược đồ. Chú ng tô i điền cơ sở dữ liệ u bằ ng cá ch thê m dữ liệ u và o cá c bả ng trong
lượ c đồ . Lưu ý rằ ng lượ c đồ không bao gồ m dữ liệu mà chỉ bao gồ m mô tả dữ liệu. Trong
khi chú ng tô i hy vọ ng dữ liệu sẽ thay đổ i thườ ng xuyên (vớ i mỗ i lầ n chè n, cậ p nhậ t và xó a),
lượ c đồ củ a cơ sở dữ liệ u sẽ thay đổ i khô ng thườ ng xuyê n.
■ 1.6 Tiệ m ă n Cơ sở dữ liệ u 15

một phần của Bữa ăn Quảng cáo


bữa ănFK · mealid khẩu hiệu
itemidFK · Mô tả tên
Giảm giá theo số
lượng
mục menu

giá tên itemid


ngàythêm

thực hiện với


Đạ i lý
itemidFK · Nguyên liệu
vendorid tên
thành phầnFK ·
Tên thành cô ng ty
số lượng repfname
phần
đơn vị replname
giá đơn vị đượ c giớ i
thiệ ubở i FK
foodgroup hàng
tồn kho
vendorid FK ·
Hình 1.4: Schema cho cá c Tiệ m ă n Cơ sở dữ liệ u.

1.6 Cơ sở dữ liệu nhà hàng

Chú ng tô i trình bà y lượ c đồ và dữ liệu cho Cơ sở dữ liệ u nhà hà ng mẫ u củ a chú ng tô i.


Hình 1.4 cung cấ p mộ t cá i nhìn tổ ng quan về Cơ sở dữ liệ u nhà hà ng bằ ng cá ch hiể n thị cá c
bả ng và mố i quan hệ . Phầ n nà y sẽ hữ u ích như mộ t tà i liệ u tham khả o để lưu ý vị trí củ a
nó . Để giú p tìm lạ i nó , trang cụ thể nà y cao hơn 2 micron1 và rộ ng hơn tấ t cả cá c trang
khá c, điề u nà y sẽ là m cho nó nổ i bậ t.
nhà cung cấp — Nhà cung cấ p cung cấ p nguyê n liệ u cho nhà hà ng.

Cột Kiểu Mô tả:__________

vendorid KÝ TỰ (5) Mã định danh nhà cung cấ p duy nhấ t


tê n cô ng ty VARCHAR(30) Tê n cô ng ty củ a nhà cung cấ p
tê n repfname VARCHAR(20) Đạ i diệ n nhà cung cấ p tê n đầ u tiê n
replname VARCHAR(20) Họ củ a đạ i diệ n nhà cung cấ p
đượ c giớ i KÝ TỰ (5) Mã định danh củ a nhà cung cấ p đã giớ i thiệ u nhà cung cấ p
thiệ ubở i FK nà y cho bạ n. Ngoạ i
cá c nhà cung cấp tham chiế u chính. vendorid

1
Do cá c biế n thể trong quy trình xuấ t bả n, chiề u rộ ng trang có thể thay đổ i lê n đế n 125 micron.
16 Chương 1: Databasics ■

Đại lý

vendorid tên công ty tên replname được giới


repfname thiệubởi FK
VGRUS Veggies_R_Us Kẹ o Bắ p KHÔNG
MÁY DNDRY Sữ a củ a Don Marla Má y vắ t sữ a VGRUS
Flvcr Kem có hương vị Sherman Sherbert · VGRUS
FRTFR · "Ă n trá i câ y" Bạ n bè Gilbert Nho Flvcr
EDDRS Bă ng củ aEd Sá ng Nướ c xố t FRTFR ·
SPWTR Cấ p nướ c suố i Gus Hung EDDRS

thành phần — Thà nh phầ n đượ c cung cấ p bở i cá c nhà cung cấ p để sử dụ ng trong cá c mặ t hà ng.

Cột Kiểu Mô tả:__________


Thà nh phầ n KÝ TỰ (5) Mã định danh thà nh phầ n duy nhấ t
Tê n VARCHAR(30) Tê n thà nh phầ n
đơn vị KÝ TỰ (10) Kích thướ c phụ c vụ thà nh phầ n
giá đơn vị SỐ (5,2) Chi phí củ a mộ t thà nh phầ n phụ c vụ
nhó m thự c KÝ TỰ (15) Nhó m thự c phẩ m thà nh phầ n
phẩ m
Kho SỐ NGUYÊ N Số lượ ng khẩu phầ n ă n thà nh phầ n có sẵ n
nhà cung cấ p KÝ TỰ (5) Mã định danh củ a nhà cung cấ p cung cấ p thà nh phầ n.
FK Khó a nướ c ngoà i
tham khả o các nhà cung cấp. vendorid

Nguyên liệu

Thành phần Tên đơn vị giá đơn vị nhóm thực Kho nhà cung cấp
phẩm FK

Tiếng CHESE Phó má t xú c 0.03 Sữ a 150 MÁY DNDRY


CHIKN Gà dả i 0.45 Thịt 120 MÁY DNDRY
CRUTN Crouton mả nh 0.01 Bá nh mì 400 EDDRS
NHO Nho mả nh 0.01 Trá i 300 FRTFR ·
LETUS · Rau diế p bá t 0.01 Rau 200 VGRUS
PICKL Dưa lá t 0.04 Rau 800 VGRUS
SCTDR Mặ c quầ n á o bí bá o 0.03 KHÔ NG 120 KHÔNG
tuyế t
mậ t
NÀY Cà chua lá t 0.03 Trá i 15 VGRUS
NƯỚC Nướ c kính 0.06 KHÔ NG KHÔ NG SPWTR
Nước xô-đa Nướ c xô -đa kính 0.69 KHÔ NG 5000 SPWTR
WTRML Dưa hấ u mả nh 0.02 Trá i KHÔ NG FRTFR ·
ORNG Cam lá t 0.05 Trá i 10 FRTFR ·
■ 1.6 Tiệ m ă n Cơ sở dữ liệ u 17

mặt hàng — Cá c mặ t hà ng cơ bả n để bá n cho khá ch hà ng.

Cột Kiểu Mô tả:__________

itemid KÝ TỰ (5) Mã nhậ n dạ ng mặ t hà ng


duy nhấ t
Tê n VARCHAR(30) Tê n mụ c
giá SỐ (5,2) Giá sả n phẩ m
ngà ythê m NGÀ Y Mụ c ngà y đượ c thê m
và o menu

Mục

itemid Tên giá ngàythêm


CHKSD Salad gà 2.85 1998-11-13
FRTSD · Saladtrá i câ y 3.45 2000-05-06
GDNSD Salad vườ n 0.99 2001-03-02
MILSD Salad thiên niên KHÔ N 2002-08-16
G
kỷ
Nước xô- Nướ c xô -đa 0.99 2003-02-06
đa
NƯỚC Nướ c 0.00 2002-05-19
FRPLT Đĩa trá i câ y 3.99 2000-09-02

madewith—Thà nh phầ n thự c phẩ m : Nố i bả ng cho mố i quan hệ nhiề u-nhiề u giữ a


thành phần và mặt hàng.

Mô tả loại cộ t
itemidFK · KÝ TỰ(5)Mã định danh của mặt hàng sử dụng thành phần. Tham chiếu khóa nước ngoài
các mặt hàng. itemid.
Thà nh phầ n FK · CHAR(5) Mã định danh củ a thà nh phầ n đượ c sử dụ ng trong mặ t hà ng. Tham chiế u
khó a nướ c ngoà i
thành phần. thành phầnid.
số lượ ng INTEGER Số lượ ng đơn vị củ a thà nh phầ n đượ c chỉ định để sử dụ ng trong

mụ c.

thực hiện với

itemid FK thành phần FK số lượng


CHKSD Tiếng CHESE 2
CHKSD CHIKN 4
CHKSD LETUS · 1
CHKSD SCTDR 1
FRTSD · NHO 10
FRTSD · WTRML 5
GDNSD LETUS · 4
GDNSD NÀY 8
FRPLT WTRML 10
FRPLT NHO 10
FRPLT Tiếng CHESE 10
18 Chương 1: Databasics ■
FRPLT CRUTN 10

Tiế p tụ c ở trang tiế p theo


■ 1.6 Tiệ m ă n Cơ sở dữ liệ u 19

madewith (cont'd)

itemid FK thành phần FK số lượng


FRPLT NÀY 8
NƯỚC NƯỚC 1
Nước xô-đa Nước xô-đa 1
FRPLT ORNG 10

bữa ăn—Mộ t bữ a ă n là mộ t tậ p hợ p cá c mặ t hà ng. Để lô i kéo khá ch hà ng mua thê m thự c


phẩ m, bạ n kế t hợ p cá c mặ t hà ng lạ i vớ i nhau thà nh mộ t bữ a ă n và bá n vớ i giá chiế t
khấ u. Ví dụ , bữ a ă n Chicken N Suds củ a chú ng tô i kết hợ p salad gà vớ i soda.

Mô tả loại cộ t
mealid CHAR (5) Tê n nhậ n dạ ng bữ a ă n

Unique CHAR ( 10)


Tê n bữ a ă n

Bữa ăn

mealid Tên
CKSDS Gà N Suds
VGNET Eatin thuầ n chay
'

một phần củ a — Cá c mó n ă n: Tham gia bà n cho mố i quan hệ nhiề u-nhiề u giữ a các bữa
ăn và
các mặt hàng.
Cột Kiểu Mô tả:__________
mealid FK · KÝ TỰ (5) Số nhậ n dạ ng củ a bữ a ă n bao gồ m mặ t hà ng. Tham chiế u khó a
nướ c ngoà i
bữa ăn. mealid.
itemid FK · KÝ TỰ (5) Số nhậ n dạ ng củ a mặ t hà ng sẽ đượ c sử dụ ng trong bữ a ă n.
Tham chiế u khó a nướ c ngoà i
các mặt hàng. itemid.
số SỐ NGUYÊ N Số lượ ng cá c mặ t hà ng đượ c chỉ định để sử dụ ng trong bữ a ă n.
lượ ng
sự bớ t SỐ THẬ P Giả m giá phầ n tră mcho mó n khi là mộ t phầ n củ a bữ a ă n nà y. Để
PHÂ N(2,2) điệ n toá n
giá củ a mộ t bữ a ă n, tổ ng giá cá nhâ n đã chiế t khấ u củ a tấ t cả
Mụ c. Ví dụ , chi phí bữ a ă n Chicken N Suds
2, 85 * 98% + 0, 99 * 90% = 3, 68.

một phần của

bữa ăn FK itemid FK số lượng sự bớt


CKSDS CHKSD 1 0.02
CKSDS Nước xô-đa 1 0.10
20 Chương 1: Databasics ■
VGNET GDNSD 1 0.03
VGNET FRTSD · 1 0.01
VGNET NƯỚC 1 0.00
■ 1.6 Tiệ m ă n Cơ sở dữ liệ u 21

ads—Cá c khẩ u hiệ u quả ng cá o có thể có cho nhà hà ng.

Mô tả loại cộ t
slogan CHAR(50) Quả ng cá o
khẩ u hiệ u

Quảng cáo
khẩu hiệu
Chă n thả theo phong cá ch
KHÔ NG
Thâ n thiệ n vớ i bò và trá i tim
thô ng minh
Nơi tố t củ a grazin
Cỏ xanh hơn ở đâ y
Chà o mừ ng bạ n đế n vớ i "phía
bê n kia"

thực đơn — Kế t hợ p cả bữ a ă n và cá c mó n để có trong thự c đơn nhà hà ng. Chú ng tô i triể n khai
các mục menu dướ i dạ ng xem (xem Chương 10).

Cột Kiểu Mô tả:__________


menuitemid KÝ TỰ (5) Số nhậ n dạ ng mặ t
hà ng hoặ c bữ a ă n
Tê n VARCHAR(30) Tê n mụ c menu
giá SỐ (5,2) Giá sả n phẩ m
mục menu

menuitemid Tên giá


CHKSD Salad gà 2.85
CKSDS Gà N Suds 3.68
FRPLT Đĩa trá i câ y 3.99
FRTSD · Salad trá i câ y 3.45
GDNSD Salad vườ n 0.99
MILSD Salad thiên niên KHÔ NG
kỷ
Nước xô-đa Nướ c xô -đa 0.99
VGNET Eatin thuầ n chay ' 4.38
NƯỚC Nướ c 0.00

cửa hàng — Cử a hà ng đượ c nhượ ng quyề n trê n toà n quố c.

Cột Kiểu Mô tả:__________


tầ ng KÝ TỰ (5) Mã nhậ n dạ ng cử a hà ng duy nhấ t
lộ VARCHAR(25) Địa chỉ đườ ng phố củ a cử a hà ng
thà nh VARCHAR(25) Thà nh phố củ a cử a hà ng
phố
tiể u KÝ TỰ (2) Tiể u bang Hoa Kỳ củ a cử a hà ng
bang
.zip KÝ TỰ (10) Mã zip củ a Hoa Kỳ ở định dạ ng XXXXX-XXXX
22 Chương 1: Databasics ■
toá n tử VARCHAR(41) · Tên củ a nhà điề u hà nh cử a hà ng (ví dụ : chủ sở hữ u hoặ c
ngườ i quả n lý )
■ 1.6 Tiệ m ă n Cơ sở dữ liệ u 23

Cửa hàng

tầng địa chỉ thành phố tiểu .zip giám đốc


bang
ĐẦU TIÊN 1111 Đườ ng Waco Tx 76798 Jeff Donahoo ·
chính
#2STR 2222 Đạ i lộ Waco Tx 76798-7356 Greg Speegle ·
2nd.
NDSTR 3333 Đườ ng số Fargo Nd 58106 Jeff Speegle ·
3
CASTR 4444 Đạ i lộ 4 Đồ ng Francsico Như 94101-4150 Greg Donahoo ·
NWSTR KHÔ NG KHÔ NG Tx KHÔ NG Ngườ i đà n ô ng
Ager
orders — Thô ng tin về mỗ i đơn hà ng đượ c đặ t tạ i mỗ i cử a hà ng. Mỗ i đơn hà ng mà khá ch
hà ng đặ t đượ c cung cấ p mộ t số đơn đặ t hà ng duy nhấ t. Mỗ i mụ c trong mộ t đơn đặ t hà ng
đượ c cung cấ p mộ t số dò ng, là duy nhấ t trong đơn đặ t hà ng. Menuitemid khô ng đượ c
khai bá o là khó a ngoạ i để cho phép xó a cá c mụ c menu trong tương lai.

Cột Kiểu Mô tả:__________


số đơn đặ t SỐ NGUYÊ N Mã nhậ n dạ ng đơn hà ng duy nhấ t
hà ng
số dò ng SỐ NGUYÊ N Mã nhậ n dạ ng dò ng đặ t hà ng cho đơn hà ng có nhiề u mặ t
hà ng
duy nhấ t trong mộ t đơn đặ t hà ng
FK ·
tầ ng KÝ TỰ (5) Mã định danh củ a cá c cử a hà ng đâ u cá c trậ t tự Là Đặ t. Ngoạ i
.key Tham khả o cửa hàng.tầng
menuitemid KÝ TỰ (5) Mã định danh củ a mụ c menu đượ c sắ p xế p cho số dò ng nà y
giá SỐ (5,2) Giá củ a mụ c menu đượ c đặ t hà ng
Thờ i gian TIMESTAMP Thờ i gian và ngà y đặ t hà ng

Lệnh

số đơn đặt số dòng tầng FK menuitemid giá Thời gian


hàng
1 1 ĐẦU TIÊN FRTSD · 3.45 2005-01-26 13:46:04.188
1 2 ĐẦU TIÊN NƯỚC 0.00 26 thá ng 1 nă m 2005
13:46:19.188
1 3 ĐẦU TIÊN NƯỚC 0.00 2005-01-26 13:46:34.188
2 1 ĐẦU TIÊN CHKSD 2.85 26 thá ng 1 nă m 2005
13:47:49.188
3 1 ĐẦU TIÊN Nước xô-đa 0.99 2005-01-26 13:49:04.188
3 2 ĐẦU TIÊN FRPLT 3.99 26 thá ng 1 nă m 2005
13:49:19.188
3 3 ĐẦU TIÊN VGNET 4.38 2005-01-26 13:49:34.188
1 1 #2STR CKSDS 3.68 2005-01-26 14: 02:04.188
1 2 #2STR CHKSD 2.85 2005-01-26 14:02:19.188
1 3 #2STR Nước xô-đa 0.99 2005-01-26 14: 02:34.188
1 4 #2STR GDNSD 0.99 2005-01-26 14:02:49.188
2 1 #2STR CHKSD 2.85 2005-01-26 14:04 :04.188
2 2 #2STR Nước xô-đa 0.99 2005-01-26 14: 04:19.188
3 1 #2STR CHKSD 2.85 2005-01-26 14: 05:34.188
3 2 #2STR FRPLT 3.99 2005-01-26 14:05:49.188
24 Chương 1: Databasics ■

3 3 #2STR GDNSD 0.99 2005-01-26 14: 06:04.188


1 1 NDSTR NƯỚC 0.00 2005-01-26 14:14 :04.188
1 2 NDSTR FRPLT 3.99 2005-01-26 14: 14:19.188

1.7 Kế t thú c 21

Đơn đặt hàng (cont'd)

số đơn đặt số dòng tầng FK menuitemid giá Thời gian


hàng
2 1 NDSTR GDNSD 0.99 2005-01-26 14: 15:34.188
3 1 NDSTR VGNET 4.38 2005-01-26 14:16:49.188
3 2 NDSTR FRPLT 3.99 2005-01-26 14: 17:04.188
3 3 NDSTR FRTSD · 3.45 26 thá ng 1 nă m 2005
14:17:19.188
3 4 NDSTR Nước xô-đa 0.99 2005-01-26 14: 17:34.188
1 1 CASTR CHKSD 2.85 2005-01-26 14: 22:04.188
1 2 CASTR GDNSD 0.99 26 thá ng 1 nă m 2005
14:22:19.188
2 1 CASTR Nước xô-đa 0.99 26 thá ng 1 nă m 2005 14:
23:34.188
2 2 CASTR FRTSD · 3.45 2005-01-26 14:23:49.188
2 3 CASTR Nước xô-đa 0.99 2005-01-26 14: 24:04.188
2 4 CASTR VGNET 4.38 2005-01-26 14: 24:19.188
3 1 CASTR VGNET 4.38 2005-01-26 14: 25:34.188
3 2 CASTR FRPLT 3.99 2005-01-26 14:25:49.188
3 3 CASTR FRTSD · 3.45 2005-01-26 14: 26:04.188
3 4 CASTR NƯỚC 0.00 2005-01-26 14:26:19.188
3 5 CASTR CHKSD 2.85 2005-01-26 14: 26:34.188

1.7 Kết thúc


Giố ng như bấ t kỳ ngô n ngữ nà o, cá ch tố t nhấ t để họ c là sử dụ ng nó nhiề u lầ n. Cá ch để thử
SQL là tạ o mộ t lượ c đồ trong DBMS, tả i mộ t số dữ liệ u và loạ i bỏ mộ t số SQL. Chú ng tô i
khuyế n khích thự c hiệ n từ ng câ u lệ nh SQL trong cuố n sá ch nà y, thử nghiệ m vớ i các truy vấ n
mớ i và là m việ c vớ i cá c bà i tậ p ở cuố i mỗ i chương. Thậ t khô ng may, mỗ i DBMS là khá c nhau.
Thậ m chí tệ hơn, cá ch mộ t cá i gì đó đượ c thự c hiệ n trong mộ t DBMS cụ thể thay đổ i vớ i cá c
bả n phá t hà nh mớ i. Do đó , chú ng tô i khô ng bao gồ m cá c chi tiế t cụ thể về DBMS trong cuố n
sá ch nà y; tuy nhiê n, trang web sách bao gồ m cá c tà i liệu về cá c DBMS chính, chẳ ng hạ n như
cá c tậ p lệ nh để tạ o mộ td cư trú trong Cơ sở dữ liệ u nhà hà ng.
22 Chương 1: Databasics ■

Câu hỏi ôn tập


1. Mộ t hà ng trong bả ng có thể đượ c xá c định duy nhấ t bở i .

2. Bao gồ m tậ p hợ p cá c bả ng nhưng khô ng bao gồ m dữ liệ u.


3. Sự khá c biệ t giữ a 'Bob' theo nghĩa đen đượ c lưu trữ dướ i dạ ng CART (5) so vớ i
VARCHAR (5) là gì?
4. Mộ t thuộ c tính thuộ c loạ i INTEGER có thể có giá trị NULL không?
5. Trong Cơ sở dữ liệ u Nhà hà ng, mộ t mụ c có thể có giữ a và
cá c thà nh phầ n.

6. Nế u chú ng tô i đã thêm mộ t hà ng mớ i và o các nhà cung cấ p trong Cơ sở dữ liệ u nhà


hà ng vớ i vendorid = HMFDS, hã y cung cấ p danh sá ch tấ t cả cá c giá trị có thể có cho
referredby.

7. Trong Cơ sở dữ liệ u Nhà hà ng, DBMS có cho phép mộ t hà ng trong bả ng nhà cung
cấp có vendorid là NULL không? Giả i thích.

8. Đưa ra mộ t loạ i và mộ t ví dụ theo nghĩa đen cho dữ liệu sau:

Dữ liệu Kiểu Chữ

Trọ ng lượ ng SỐ (5, 2) 129.3

Lộ

Sinh nhậ t

Thờ i hạ n hợ p
đồ ng
Lương

Giố ng

9. Sự khá c biệ t giữ a cơ sở dữ liệ u và DBMS là gì?


10. Trong Cơ sở dữ liệu nhà hà ng, hã y đặ t tê n củ a tấ t cả cá c thà nh phầ n trong bữ a ă n
Vegan Eatin '.

11. Nế u mộ t nhà cung cấ p có thể đượ c đề xuấ t bở i nhiề u nhà cung cấ p, lượ c đồ nhà hà ng
củ a chú ng tô i sẽ thay đổ i như thế nà o?
12. Chú ng tô i phả i gọ i cho cá c nhà cung cấ p củ a chú ng tô i để đặ t hà ng mớ i; Thậ t
khô ng may, chú ng tô i khô ng biết số điện thoạ i củ a họ . Tấ t nhiê n, mộ t nhà cung
cấ p có thể có mộ t số điệ n thoạ i. Đố i vớ i lượ c đồ nhà hà ng, bạ n sẽ thê m số và loạ i
điệ n thoạ i như thế nà o (ví dụ : vă n phò ng, nhà riê ng, di độ ng, fax, v.v .)? Giả sử
rằ ng mộ t số điệ n thoạ i đượ c gá n cho only mộ t nhà cung cấ p.
13. Đố i vớ i nhà hà ng củ a bạ n, bạ n cầ n tạ o mộ t bả ng cho khá ch hà ng có chứ a iden-
■ Tậ p 23
tifier, tê n, số lượ t truy cậ p và giả m giá phầ n tră m. Cung cấ p tê n cộ t và kiể u dữ liệ u
củ a bả ng nà y. Khó a chính củ a bả ng mớ i nà y là gì?
24 Chương 1: Databasics ■

14. Trong Cơ sở dữ liệ u nhà hà ng, chú ng tô i muố n thêm 2 muỗ ng phô mai và o mó n
Salad gà . Chú ng ta có thể chỉ cầ n tă ng giá trị củ a trườ ng số lượ ng trong bả ng
madewith cho hà ng ghé p Salad gà vớ i phô mai. Chú ng ta cũ ng có thể chỉ cầ n thê m
mộ t hà ng khá c và o madewith chứ a cá c giá trị (CHKSD, CHESE, 2)? Giả i thích.

15. Trong Cơ sở dữ liệ u nhà hà ng, bạ n có mộ t nhà cung cấ p mớ i, "Thự c phẩ m tự là m",
tạ o ra mộ t thà nh phầ n duy nhấ t, "Bá nh mì tự là m". Đưa cá c hà ng mớ i để thê m
và o cá c bả ng khá c nhau để thê m thô ng tin mớ i nà y và bao gồ m hai lá t bá nh mì
trong bữ a ă n "Chicken N Suds".

16. Bấ t kỳ elds số nà o có thể có giá trị â m khô ng?


17. Cung cấ p ví dụ về mộ t thuộ c tính sẽ yê u cầ u mộ t khoả ng thờ i gian.
18. Trong Cơ sở dữ liệ u Nhà hà ng, FRPLT có thể là tê n củ a mộ t mụ c khô ng?
19. Hã y xem xé t bả ng quảng cáo trong lượ c đồ nhà hà ng. Chú ng ta có thể biế n khẩu hiệu
thà nh chìa khó a chính khô ng? Giả i thích.
20. Bả ng có thể khô ng có hà ng khô ng?
21. Đưa ra mộ t kiể u dữ liệ u để biể u diễn mộ t số mà khô ng là m giả m độ chính xá c có
thể nằ m trong khoả ng từ −1397 đế n 24892,99.

Tập
Để thự c hà nh SQL, chú ng tô i giớ i thiệ u mộ t ứ ng dụ ng cơ sở dữ liệ u mớ i. Cơ sở dữ liệ u nhâ n
viê n lưu trữ thô ng tin về mộ t doanh nghiệp, bao gồ m nhâ n viên, phò ng ban và dự á n. Mỗ i
nhâ n viê n là m việ c cho mộ t bộ phậ n và đượ c giao nhiề u dự á n. Mỗ i bộ phậ n có nhiều nhâ n
viê n, có nhiề u dự á n và có thể là mộ t phâ n ban củ a mộ t bộ phậ n (ví dụ : Accounti ng là mộ t phâ n
ban củ a Quả n trị). Mỗ i dự á n đượ c giao cho mộ t bộ phậ n và đượ c là m việc bở i nhiề u nhâ n
viê n. Hình 1.5 cung cấ p lượ c đồ cho Cơ sở dữ liệ u nhâ n viê n.
employees—Nhâ n viê n là m việc cho cô ng ty.

Cột Kiểu Mô tả:__________


ID nhâ n SỐ (9) Số nhậ n dạ ng nhâ n viê n duy nhấ t
viê n
Fi Rstname · VARCHAR(10) Tê n nhâ n viên đầ u tiê n
Họ VARCHAR(20) Họ củ a nhâ n viê n
deptcode FK KÝ TỰ (5) Mã định danh củ a bộ phậ n mà nhâ n viê n là m việ c. Khó a nướ c
ngoà i
bộ phận tham khả o. mã
lương NUMERIC(9,2) Lương nhâ n viê n
■ Tậ p 25

Dự án Bộ phận
Hình chiếu mã
tên mã
phòng vé FK · mô quản lý FK ·
tả startdate Ngày
Phân khu FK
kết thúc ·
Doanh thu

Nhân viên

tên nhân viên


cô ng trình
hình chiế u FK · họ mã phòng vé
nhâ n viê n FK FK ·
· lương
thờ i gian đượ c chỉ
Hình 1.5: Lượ c đồ cho cơ sở dữ liệ u nhâ n viê n.

Nhân viên

ID nhân viên Fi Họ deptcode FK lương


Rstname ·
1 Đế n trang Betheleader ADMIN 70000.00
2 Pi Rsquared ACCNT 40000.00
3 Harry Phầ n cứ ng Hdwre 50000.00
4 Sussie Phầ n mề m CNSLT 60000.00
5 Abe Lờ i khuyê n CNSLT 30000.00
6 Khó Biết KHÔNG 65000.00

phòng ban—Phò ng ban củ a cô ng ty.

Cột Kiểu Mô tả:__________

tê n CHAR(5) Mã định danh bộ phậ n duy nhấ t Tê n


mã VARCHAR(30) bộ phậ n
ngườ i FK · SỐ (9) Mã định danh củ a nhâ n viê n quả n lý bộ phậ n. Ngoạ i
quả n lý
nhâ n viên tham khả o chính. ID nhân viên
Phâ n khu FK · KÝ TỰ (5) Mã củ a bộ phậ n bao gồ m bộ phậ n nà y như mộ t củ a cá c tiể u
ban trự c tiế p củ a nó . Tham chiế u khó a nướ c ngoà i Bộ
phận.mã
26 Chương 1: Databasics ■

Bộ phận

mã Tên quản lý FK subdeptof FK


ADMIN Sự quả n lý 1 KHÔ NG
ACCNT Kế toá n 2 ADMIN
Hdwre Phầ n cứ ng 3 CNSLT
CNSLT Tư vấ n 4 ADMIN

dự án—Dự á n do cô ng ty quả n lý .

Cột Kiểu Mô tả:__________


Hình KÝ TỰ (8) Mã định danh dự á n duy nhấ t
chiế u
mã FK · KÝ TỰ (5) Mã định danh củ a bộ phậ n quả n lý dự á n nà y. Bộ phận tham
phò ng vé
khả o quan trọ ng nướ c ngoà i. mã
Mô VARCHAR(200) Mô tả dự á n
tả :__________
Ngà y bắ t đầ u NGÀ Y Ngà y bắ t đầ u dự á n
ngà y dừ ng NGÀ Y Ngà y dừ ng dự á n . Giá trị NULL chỉ ra rằ ng dự á n là
Liê n tụ c
doanh thu SỐ (12, 2) Tổ ng doanh thu dự á n

Dự án

Hình chiếu deptcode FK Mô tả:__________ Ngày bắt Ngày kết Doanh thu
đầu thúc
EMPHAPPY ADMIN Đạ o đứ c nhâ n 2002-03-14 KHÔ NG 0.00
viên
ADT4MFIA ACCNT Kiể m toá n Mofia 2003-07-03 2003-11-30 100000.00
ROBOSPSE CNSLT Vợ / chồ ng 2002-03-14 KHÔ NG 242000.00
robot
DNLDCLNT CNSLT Tả i xuố ng ứ ng 2005-02-03 KHÔ NG 18150.00
dụ ng khá ch

workson—Nhâ n viê n dự á n: Kế t hợ p bả ng cho mố i quan hệ nhiề u-nhiề u giữ a


nhân viên và các phòng ban.

Cột Kiểu Mô tả:__________


ID nhâ n FK SỐ (9) Mã định danh củ a nhâ n viê n là m việ c trong mộ t dự á n. Tham
viê n · khả o khó a nướ c ngoà i-
encing nhân viên. ID nhân viên
FK ·
Hình CHAR(8) Mã định danh củ a dự á n mà nhâ n viên đang là m việ c. Các dự
chiế u án tham khả o trọ ng điể m nướ c ngoà i. Hình chiếu
■ Tậ p 27
số thậ p phâ n thờ i gian đượ c chỉ định (3,2) Tỷ lệ phầ n tră m thờ i gian nhâ n viê n đượ c chỉ định cho

dự á n
28 Chương 1: Databasics ■

công trình

nhân viên FK hình chiếu FK thời gian


được chỉ định
2 ADT4MFIA 0.50
3 ROBOSPSE 0.75
4 ROBOSPSE 0.75
5 ROBOSPSE 0.50
5 ADT4MFIA 0.60
3 DNLDCLNT 0.25

1. Điề u gì phả i đú ng về các giá trị củ a projectid và deptcode trong mộ t hà ng củ a các dự


án
bà n?

2. Mộ t nhâ n viê n làm việ c khô ng có dự á n nà o có thể có trong cơ sở dữ liệ u nà y


khô ng?
3. Mộ t nhâ n viê n có thể là m việ c trong mộ t dự á n đượ c giao cho mộ t bộ phậ n khá c vớ i
bộ phậ n mà họ là m việ c khô ng?

4. Mô tả cá c mố i quan hệ khá c nhau trong Cơ sở dữ liệ u Nhâ n viê n. Ví dụ , employ-ees
mố i quan hệ mộ t-nhiề u vớ i các phòng ban vì mộ t nhâ n viên làm việc cho mộ t bộ
phậ n và mộ t bộ phậ n có nhiề u nhâ n viê n.
5. Nhữ ng thuộ c tính nà o trong bả ng bộ phận có thể là NULL?

6. Cá i nà o cao hơn, ID nhâ n viê n lớ n nhấ t có thể hoặ c mứ c lương cao nhấ t?
7. Đố i vớ i mỗ i bả ng, hã y đưa ra ví dụ về mộ t hà ng mớ i có thể đượ c thêm và o.

8. Mộ t bộ phậ n có thể là mộ t tiể u ban củ a chính nó ? Giả i thích.


9. Mộ t nhâ n viê n có thể đượ c chỉ định giờ trê n mộ t dự á n khô ng có trong cơ sở dữ liệ u
khô ng? Giả i thích.

10. Ngà y kết thú c củ a mộ t dự á n có thể trướ c ngà y bắ t đầ u củ a dự á n khô ng?

11. Doanh thu củ a mộ t dự á n có thể â m khô ng?


c h a p t er 2

Truy xuất: SELECTion cơ bản

Chúng tôi bắ t đầ u cuộ c thả o luậ n củ a chú ng ta về SQL vớ i thao tá c cơ bả n


nhấ t: truy xuấ t thô ng tin. Thô ng thườ ng, mộ t cơ sở dữ liệu quan tâ m đã tồ n tạ i, hoà n chỉnh
vớ i dữ liệu và chú ng tô i muố n truy vấ n dữ liệ u đó . Như chú ng tô i đã lưu ý , cá ch tố t nhấ t để
họ c SQL là thự c hiệ n nó . Bạ n nê n thử nghiệ m vớ i cơ sở dữ liệ u ví dụ cà ng nhiề u cà ng tố t.
Hã y thử cá c câ u lệ nh
từ cuố n sá ch. Sau đó , tạ o ra mộ t số củ a riê ng bạ n. Cá c tậ p lệ nh để tạ o và điền và o cơ sở dữ
liệ u bà i kiểm tra-ple có sẵ n từ trang Web sá ch. Chương 9 đề cậ p đế n việc tạ o cơ sở dữ liệ u
bằ ng SQL. Nếu muố n, bạ n có thể bỏ qua chương đó và quay lạ i đâ y sau khi cơ sở dữ liệ u củ a
bạ n đượ c tạ o.
Trong SQL, cô ng việ c để truy xuấ t dữ liệ u là câ u lệnh SELECT:
Mục 3.2, tr. 48 ·

Mục 2.1, tr. 27 CHỌN [CÁC | RIÊNG BIỆT TẤT CẢ] < danh
và Mục 5.1, tr. 91 sá ch bầu cử> TỪ <danh sách bảng> Mục 2.1, tr. 27
Mục 4.5, tr. 80 [VỊ TRÍ <điều kiện hàng>] [GROUP Mục 2.2, tr. 30
BY <danh sách nhó m>] [CÓ
<điều kiện nhóm>]
Mục 4.6, tr. 82 [ĐẶT HÀNG THEO DANH Mục 3.5, tr. 61
SÁCH ORT <>]

SELECT có thể trô ng phứ c tạ p, nhưng đừ ng sợ hã i. Bạ n có thể là m nhữ ng điề u tuyệ t vờ i


vớ i cá c truy vấ n đơn giả n nhấ t.

2.1 SELECT đơn giản

Đơn giả n nhấ t, bạ n chỉ cầ n cho CHỌ N hai điề u: 1) cá c thuộ c tính dữ liệ u bạ n muố n và 2)
bả ng nơi nó sẽ lấ y nó . Hã y bắ t đầ u vớ i mộ t truy vấ n đơn giả n. Giả sử bạ n muố n
30 Chương 1: Databasics ■

27
28 Chương 2: Truy: Cơ bả n Lự a chọ n ■

để xá cđịnh tê n củ a tấ t cả cá c mụ c riê ng lẻ trê n menu củ a bạ n. Trong Cơ sở dữ liệ u Nhà


hà ng, thô ng tin nà y đượ c chứ a trong cộ t tên củ a bả ng items.

Truy vấn Tìm thấ y cá c Tê n củ a tấ t cả Mụ c


2.1
CHỌN tên TỪ
các mục;

Tên
Salad gà
Salad trá i câ y
Salad vườ n
Salad thiên niên
kỷ
Nước xô-đa
Nước
Đĩa trá i câ y
[7 Hà ng(s)]

Câ u lệ nh SQL nà y tìm nạ p cá c giá trị từ mộ t cộ t, name, từ tấ t cả cá c hà ng trong bả ng items


và hiể n thị kết quả .
Để truy xuấ t nhiề u cộ t, hã y chỉ định danh sá ch tê n cộ t đượ c phâ n tá ch bằ ng dấ u
phẩ y.

Truy vấn Tìm thấ y cá c Tên khoả n Id và giá củ a tấ t cả Mụ c


2.2
CHỌN tên, itemid, giá TỪ các
mặt hàng;

Tên itemid giá


Salad gà CHKSD 2.85

Salad trá i câ y FRTSD · 3.45

Salad vườ n GDNSD 0.99

Salad thiên niên MILSD KHÔNG


kỷ
Nước xô-đa Nước xô- 0.99
đa
Nước NƯỚC 0.00
Đĩa trá i câ y FRPLT 3.99

[7 Hà ng(s)]

Thứ tự cá c thuộ c tính đượ c chỉ định trong danh sá ch tê n cộ t xá c định thứ tự cá c thuộ c tính
trong kế t quả . Việ c trình bà y giá trị NULL trong mộ t kế t quả là DBMS cụ thể .
Điề u gì sẽ xả y ra nế u chú ng ta muố n tấ t cả cá c cộ t trong mộ t bả ng? Gõ chú ng all vừ a
đau đớ n vừ a dễ bị lỗ i. May mắ n thay, SQL cung cấ p * như mộ t cá ch viế t tắ t cho tấ t cả cá c cộ t.
30 Chương 2: Truy: Cơ bả n Lự a chọ n ■ ■
2.1 SELECTđơn giả n 29

Truy vấn Tìm thấ y tấ t cả Mụ c


2.3
CHỌN *
TỪ các mặt hàng;

itemid Tên giá ngàythêm


CHKSD Saladgà 2.85 1998-11-13
FRTSD · Salad trá i câ y 3.45 2000-05-06
GDNSD Salad vườ n 0.99 2001-03-02
MILSD Salad thiên niên KHÔNG 2002-08-16
kỷ
Nước xô- Nước xô-đa 0.99 2003-02-06
đa
NƯỚC Nước 0.00 2002-05-19
FRPLT Đĩa trá i câ y 3.99 2000-09-02
[7
Hà ng(s)]

SQL có hai loạ i nhậ n xé t. Loạ i đầ u tiê n bắ t đầ u bằ ng hai dấ u trừ ('–') và kết thú c bằ ng
cuố i dò ng. Loạ i thứ hai bắ t đầ u bằ ng /*, kết thú c bằ ng */, và có thể kéo dà i nhiề u dò ng.
/* Đây là một
nhiều dò ng */
bình luận
CHỌ N itemid - - Nhận xét này đi đến cuối dòng TỪ các mục;
Trướ c khi chú ng ta tiế p tụ c, có mộ t số điề u quan trọ ng cầ n lưu ý về cá c câ u lệ nh SQL:
Khoảng trắng không đá ng kể — Để dễ đọ c, chú ng tô i chia cá c câ u lệ nh củ a mình thà nh cá c
dò ng riê ng biệ t, mộ t cho mỗ i phầ n củ a câ u lệnh SQL; tuy nhiên, SQL sẽ rấ t vui nế u
chú ng ta đặ t toà n bộ câ u lệ nh trê n cù ng mộ t dò ng. Chú ng ta cũ ng có thể sử dụ ng
nhiề u khoả ng trắ ng , tab hoặ c cá c ký tự khoả ng trắ ng khá c để phâ n tá ch cá c phầ n tử
trong truy vấ n.
Các câu lệnh SQL không phân biệt chữ hoa chữ thường—Để dễ đọ c, chú ng tô i sử dụ ng chữ hoa
cho cá c từ khó a SQL và sử dụ ng chữ thườ ng cho tê n bả ng và cộ t củ a chú ng tô i; tuy
nhiê n, SQL chủ yế u là khô ng phâ n biệ t chữ hoa chữ thườ ng đố i vớ i từ khó a và tên bả ng
/ cộ t. Ngay cả khi chú ng ta tạ o bả ng củ a mình vớ i tư cá ch là nhà cung cấp, chú ng ta có
thể gọ i nó trong SQL là vEnDOrS. Trong khi cá c câ u lệ nh SQL và tên bả ng/cộ t khô ng
phâ n biệ t chữ hoa chữ thườ ng, dữ liệ u ký tự có thể nhạ y cả m vớ i chữ hoa chữ thườ ng,
chẳ ng hạ n như khi nó đượ c lưu trữ và so sá nh. Chú ng tô i sẽ chỉ ra khi so sá nh ký tự là
phâ n biệ t chữ hoa chữ thườ ng.
Dấu chấm phẩy là tùy chọn—Cá c câ u lệ nh SQL có thể bị chấ m dứ t bở i dấ u chấ m phẩ y.
Điề u nà y rấ t hữ u ích để tá ch nhiề u câ u lệ nh SQL. Hầ u hế t cá c DBMS khô ng yê u cầ u
dấ u chấ m phẩ y cho câ u lệ nh cuố i cù ng (hoặ c, trong trườ ng hợ p chỉ có mộ t câ u lệ nh
duy nhấ t). Chú ng tô i bao gồ m dấ u chấ m phẩ y trong cá c ví dụ củ a chú ng tô i về tính
đầ y đủ .
SELECT tạo một bảng mới—Về mặ t logic, việ c thự c thi mộ t gener câ u lệnh SELECT- sẽ tạ o
ra mộ t bả ng mớ i, đượ c gọ i là bả ng kết quả, vớ i cá c cộ t và hà ng riêng. Mặ c dù DBMS củ a
bạ n có thể khô ng thự c sự tạ o bả ng, nhưng sẽ rấ t hữ u ích nế u bạ n suy nghĩ về cá c truy
vấ n theo cách nà y.
30 Chương 2: Truy: Cơ bả n Lự a chọ n ■

2.2 Chọn Hàng

Sử dụ ng SELECT / FROM cơ bả n, chú ng tô i có thể truy xuấ t dữ liệ u từ bấ t kỳ bả ng nà o và


thậ m chí chỉ định cá c cộ t. Điề u đó thậ t tuyệ t, nhưng nếu chú ng ta muố n giớ i hạ n cá c
hàng trong kế t quả thì sao? SQL sử dụ ng mệ nh đề WHERE để xá c định điều kiệ n mà mộ t
hà ng cụ thể phả i thỏ a mã n để có trong kết quả truy vấ n. SQL cung cấ p nhiề u toá n tử
khá c nhau để xâ y dự ng điều kiệ n. Bả ng 2.1 cung cấ p mộ t cá i nhìn tổ ng quan về cá c toá n
tử nà y. Chú ng tô i thả o luậ n chi tiết về từ ng nhà khai thá c nà y như sau.

Toán tử đánh giá mức sử dụng

= Repfname bằ ng nhau = 'Bob'


>; < Lớ n hơn/nhỏ hơn đơn giá > 10
>=; <= Lớ n hơn/nhỏ hơn hoặ c bằ ng hà ng tồn kho <= 5000
<> Khô ng phải bằng vendorid <> 3
[KHÔ NG]GIỮ A hai giá trị (bao gồ m) vendorid GIỮ A 'A' VÀ ' M'
IS [NOT] NULL Value is NULL referredby IS
NULL [NOT] LIKE Equal strings using wildcards (ví dụ : '%', '_') replname LIKE '
%ith' [NOT] INEqual to any trong tên danh sá ch
IN ('Soda', 'Nướ c')

KHÔ NG phủ nhậ n mộ t điề u kiệ n KHÔ NG phả i itemid IN ('GDNSD',


'CHKSD')

Bảng 2.1: Toá n tử SQL

2.3 Toán tử so sánh tiêu chuẩn


Cho Starters .SQL Cung cấ p cá c chuẩ n sự so sá nh Vậ n hà nh: = (bằ ng), <> (khô ng bằ ng
nhau),
> (lớ n hơn hơn), < (ít hơn hơn), => (lớ n hơn hơn hoặ c bằ ng nhau),= và < (ít hơn
hơn hoặ c bằ ng nhau). Giả thiế t chú ng ta muố n đế n tạ o a giá trị thự c đơn củ a tấ t cả Mụ c
Chi phí 0,99 đô la hoặ c ké m.

Truy vấn Tìm thấ y cá c Tê n củ a Mụ c đó Chi phí 0,99 đô la hoặ c ké m


2.4
CHỌN tên TỪ
các mục
TRONG ĐÓ giá < = 0,99;

Tên
Salad vườ n
Nước xô-đa
Nước
[3 hà ng(s)]
Query 2.4 hoạ t độ ng như thế nà o? Để xâ y dự ng tậ p kết quả , SQL bắ t đầ u bằ ng cá ch tìm
nạ p cá c mục
bả ng đượ c chỉ định trong mệ nh đề FROM. Tiế p theo, SQL đi qua từ ng hà ng, đá nh giá
32 Chương 2: Truy: Cơ bả n Lự a chọ n ■ ■
2.4 So sá nh chuỗ i 31

Ở đâ u điề u kiệ n. SQL loạ i bỏ bấ t kỳ hà ng nà o mà giá < = 0,99 khô ng đá nh giá là đú ng. Cuố i
cù ng, SQL loạ i bỏ bấ t kỳ cộ t nà o khô ng có trong danh sá ch SELECT. Lưu ý rằ ng danh sá ch
cộ t khô ng nhấ t thiế t phả i chứ a (cá c) thuộ c tính đượ c sử dụ ng trong mệ nh đề WHERE.
Trong Truy vấ n 2.4, chú ng tô i sử dụ ng nghĩa đen số , 0.99, để so sá nh giá . Hình thứ c
cụ thể củ a mộ t nghĩa đen phụ thuộ c và o loạ i dữ liệ u cầ n thiế t. Chú ng tô i thả o luậ n về định
dạ ng nghĩa đen cho cá c kiể u chữ dữ liệ u khá c nhau trong Chương 1. Hã y xem xé t mộ t và i ví
dụ . Chuỗ i nghĩa đen trong SQL phả i đượ c đặ t trong dấ u ngoặ c đơn ('). Hã y xác minh rằ ng
thà nh phầ n Cheese củ a chú ng tô i nằ m trong nhó m thự c phẩ m chính xá c.

Truy vấn Tìm thấ y ID và thự c phẩ m nhó m cá c thà nh phầ n có tê n Phó má t
2.5
CHỌN thành phần , nhóm thực phẩm
TỪ các thành phần
WHERE name = 'Pho mát';

Thành phần nhóm thực


phẩm
Tiếng CHESE Sữa
[1 Hà ng(s)]

Ngà y sử dụ ng nghĩa đen đượ c thể hiệ n là 'YYYY-MM-DD'.

Truy vấn Tìm thấ y cá c thứ c ă n Mụ c Thê m sau 1999


2.6
CHỌN *
TỪ các mặt hàng
WHERE dateadded > '1999-12-31';

itemid Tên giá ngàythêm


FRTSD · Salad trá i câ y 3.45 2000-05-06
GDNSD Salad vườ n 0.99 2001-03-02
MILSD Salad thiên niên KHÔNG 2002-08-16
kỷ
Nước xô- Nước xô-đa 0.99 2003-02-06
đa
NƯỚC Nước 0.00 2002-05-19
FRPLT Đĩa trá i câ y 3.99 2000-09-02

[6 Hà ng(s)]

2.4 So sánh chuỗi

SQL so sá nh cá c giá trị để xá c định giá trị nà o lớ n hơn, nhỏ hơn hoặ c bằ ng? Đố i vớ i hầ u hế t
cá c loạ i dữ liệ u, đó chỉ là nhữ ng gì chú ng tô i mong đợ i. Đố i vớ i dữ liệ u ký tự , việ c so sá nh rấ t
phứ c tạ p bở i các vấ n đề như đố i chiế u trình tự , độ nhạ y trườ ng hợ p và phầ n đệm. Thậ t
khô ng may, kế t quả củ a việ c so sá nh chuỗ i thườ ng là DBMS cụ thể . Hầ u hế t cá c DBMS cho
phé p quả n trị viê n cấ u hình từ ng cá i nà y.
32 Chương 2: Truy: Cơ bả n Lự a chọ n ■

Trình tự đối chiếu quy định cá ch hệ thố ng sắ p xế p thứ tự cá c ký tự để cho phé p cá c nhâ n
vậ t com- parisons. '3' rõ rà ng là ít hơn '4', nhưng cò n '5' và 'a' thì sao? ASCII (American
Standard Code for Information Interchange) là mộ t chuỗ i đố i chiế u thườ ng đượ c sử
dụ ng, trong đó '5' xả y ra nhỏ hơn 'a'.
Phân biệt chữ hoa chữ thường xá c định xem so sá nh ký tự có phâ n biệ t giữ a chữ hoa và
chữ thườ ng hay khô ng. Nếu so sá nh là phâ n biệt chữ hoa chữ thườ ng, thì trình tự
đố i chiế u xá c định trườ ng hợ p nà o nhỏ hơn. Phâ n biệ t chữ hoa chữ thườ ng có thể
có tá c độ ng đá ng kể đế n kết quả truy vấ n. Để trá nh nhầ m lẫ n, nhiề u ngườ i dù ng
SQL sẽ chuyể n đổ i tấ t cả cá c chuỗ i thà nh chữ hoa hoặ c chữ thườ ng trướ c khi so
sá nh.
Padding xá c định cá ch cá c chuỗ i có độ dà i khá c nhau đượ c xử lý khi so sá nh. Nế u đệm đượ c
bậ t, thì chuỗ i ngắ n hơn đượ c đệm bằ ng ký tự đệ m (thườ ng là khoả ng trắ ng) để cả hai
chuỗ i có cù ng độ dà i.
Để so sá nh hai chuỗ i, SQL đá nh giá ký tự chuỗ i theo ký tự , bắ t đầ u từ đầ u mỗ i chuỗ i.
Nếu nó tìm thấ y hai aracter ch tương ứ ng (ví dụ : ký tự thứ ba củ a cả hai chuỗ i) khô ng
bằ ng nhau, chuỗ i có ký tự thấ p nhấ t trong chuỗ i đố i chiế u nhỏ hơn chuỗ i cò n lạ i. Nế u
SQL hế t các ký tự tương ứ ng trướ c khi xá c định hai ký tự khô ng khớ p, thì cá c chuỗ i bằ ng
nhau nế u chú ng có cù ng độ dà i; nế u khô ng, chuỗ i ngắ n hơn nhỏ hơn chuỗ i dà i hơn. Ví dụ :
hã y xem xé t Truy vấ n 2.7.

Truy vấn Tìm thấ y tấ t cả Mụ c vớ i a Tê n ké m hơn hoặ c bình đẳ ng đế n 'vườ n'


2.7
CHỌN tên TỪ
các mục
WHERE name <= 'vườn';

Tên
Salad gà
Salad trá i câ y
Đĩa trá i câ y
[3 hà ng(s)]

Kết quả củ a chú ng tô i là từ mộ t cơ sở dữ liệu khô ng phâ n biệ t chữ hoa chữ thườ ng. Đú ng
như dự đoá n, Garden Salad khô ng có trong kết quả vì vườ n ngắ n hơn và so sá nh là
khô ng phâ n biệ t chữ hoa chữ thườ ng.
Hã y nhớ lạ i rằ ng nế u mộ t chuỗ i nghĩa đen chứ a ký tự trích dẫ n ('), chú ng tô i trích dẫ n nó .

Truy vấn Tìm thấ y cá c Tê n củ a cá c đạ i diệ n cho Củ a Don Sữ a


2.8
CHỌN repfname, replname TỪ
nhà cung cấp
WHERE tên công ty = 'Don's Dairy';

tên replname
repfname
Marla Máy vắt sữa
[1 Hà ng(s)]

2.5 Kế t hợ p cá c mẫ u chuỗ i vớ i LIKE 33

2.5 Kết hợp các mẫu chuỗi với LIKE


Điề u gì sẽ xả y ra nế u chú ng ta khô ng thể nhớ tê n củ a mộ t khá ch hà ng cụ thể là Bill, Phill hay
Will? SQL pro- vides dự a trê n ký tự đạ i diệ n, khả nă ng đố i sá nh mẫ u vớ i toá n tử LIKE. Cá c ký
tự đạ i diện SQL bao gồ m :

Mô tả ký tự đại diện

% khớ p vớ i bấ t kỳ chuỗ i con nà o chứ a 0 ký tự trở lê n

_ khớ p vớ i bấ t kỳ ký tự đơn lẻ nà o

Sử dụ ng LIKE như bạ n là m toá n tử =, ngoạ i trừ chuỗ i so sá nh có thể chứ a cá c ký tự đạ i diệ n.

Truy vấn Tìm thấ y cá c danh sá ch củ a Vendor đạ i diệ n fiRST Tê n đó bắ t đầ u vớ i 'S'


2.9
CHỌN repfname
TỪ nhà cung cấp
WHERE repfname LIKE 'S%';

tên
repfname
Sherman
Sáng
[2 Hà ng(s)]

Phâ n biệ t chữ hoa chữ thườ ng và ký tự đệ m đượ c xá c định bở i cấ u hình DBMS. Khô ng có
bấ t kỳ ký tự đạ i diệ n nà o, LIKE hoạ t độ ng giố ng như =.
Hã y thử mộ t và i ví dụ bằ ng cá ch sử dụ ng LIKE. Giả sử bạ n có danh sá ch cá c chuỗ i ký
tự sau: Ball, Beggy, Bill, Billy, ill, Meg, Phill, Philly, Peg, Peggy. Sau đâ y là mộ t số biể u thứ c
LIKE ví dụ cù ng vớ i nhữ ng gì chú ng khớ p:

LIKE Matches chuỗi Trận đấu

%ill kế t thú c bằ ng 'ill'Bill, ill, Phill


Peg% bắ t đầ u vớ i 'Peg'Peg , Peggy
B% y bắ t đầ u bằ ng B và kế t thú c bằ ng y Beggy, Billy
_ill nà o và kế t thú c bằ ng 'ill'Bill
bắ t đầ u vớ i bấ t kỳ ký tự đơn lẻ
B_ll bắ t đầ u bằ ng B và kế t thú c bằ ng 'll' vớ i bấ t kỳ ký tự duy nhấ t nà o ở giữ a Ball, Bill
%_ _ill_ bắ t đầ u bằ ng 2 ký tự trở lê n và kế t thú c bằ ng 'ill' theo sau là bấ t kỳ Philly
ký tự đơn lẻ nà o

Cá c ký tự đạ i diệ n khá c có thể đượ c DBMS cụ thể củ a bạ n hỗ trợ , vì vậ y hã y kiể m tra tà i


liệu củ a bạ n. Trê n thự c tế , mộ t số DBMS cho phé p biể u thứ c chính quy. Tiê u chuẩ n SQL
34 Chương 2: Truy: Cơ bả n Lự a chọ n ■

bao gồ m toá n tử TƯƠNG TỰ TO, hoạ t độ ng tương tự như LIKE ngoạ i trừ nó có cá c biể u thứ c
chính quy. Rấ t ít DBMS triể n khai TƯƠNG TỰ như.
Cò n việ c sử dụ ng LIKE để tìm cá c chuỗ i chứ a ký tự đạ i diện thì sao? Ví dụ : điề u gì sẽ
xả y ra nế u chú ng ta muố n find tấ t cả cá c chuỗ i có chứ a mộ t ký tự gạ ch dướ i? Chú ng ta có
thể thử LIKE '%_%', nhưng điề u nà y tìm thấ y tấ t cả cá c chuỗ i chứ a 1 hoặ c nhiề u ký tự vì SQL
coi '_' là ký tự đạ i diện. Chú ng ta cầ n mộ t số cá ch để biế n mộ t ký tự đạ i diệ n thà nh mộ t nhâ n
vậ t thô ng thườ ng. Để là m điề u nà y, SQL cho phé p chú ng ta chỉ định mộ t ký tự thoá t. Bất kỳ
nhâ n vậ t nà o ngay sau mộ t nhâ n vậ t trố n thoá t đề u đượ c hiể u là mộ t nhâ n vậ t thô ng thườ ng, ngay
cả khi đó thườ ng là ký tự đạ i diệ n hoặ c thậ m chí là nhâ n vậ t trố n thoá t. Chú ng ta định nghĩa
'#' là ký tự thoá t trong Truy vấ n 2.10.

Truy vấn Tìm thấ y tấ t cả Vendor Tê n Chứ a Mộ t '_'


2,10
CHỌN tên công ty TỪ
nhà cung cấp
NƠI tên công ty NHƯ '%#_%' ESCAPE '#';

tên công ty
Veggies_R_Us
[1 Hà ng(s)]

Bở i vì '#' đượ c chỉ định là ký tự trố n thoá t, '_' đượ c hiể u theo nghĩa đen, khô ng phả i là ký tự
đạ i diệ n. Nếu bạ n muố n tìm kiếm nhâ n vậ t trố n thoá t thì sao ? Thoá t khỏ i nó (ví dụ : '##').

2.6 Nhận những gì chúng tôi chưa có với KHÔNG

Để tìm nạ p cá c hà ng đá nh giá là sai, hã y đặ t trướ c điề u kiệ n bằ ng NOT.

Truy vấn Tìm thấ y cá c Tên củ a tấ t cả củ a cá c thứ c ă n Mụ c Khá c __________ hơn Salads
2.11
CHỌN tên TỪ
các mục
NƠI KHÔNG đặt tên như '% Salad';

Tên
Nước xô-đa
Nước
Đĩa trá i câ y
[3 hà ng(s)]

Bạ n có thể sử dụ ng NOT vớ i bấ t kỳ toá n tử so sá nh nà o từ Bả ng 2.1.



2.7 Kế t hợ p cá c điề u kiện vớ i AND và OR 35

2.7 Kết hợp các điều kiện với AND và OR


Đô i khi cá c tiê u chí để bao gồ m hoặ c loạ i trừ mộ t hà ng phứ c tạ p hơn mộ t điề u kiệ n đơn giả n
có thể thể hiệ n. May mắ n thay, chú ng ta có thể kết hợ p hai hoặ c nhiề u điề u kiệ n bằ ng cá ch
sử dụ ng AND và OR. Hai điều kiện đượ c kết hợ p bở i AND đề u phả i đú ng cho toà n bộ điề u
kiệ n để đá nh giá là đú ng.

Truy vấn Tìm thấ y tấ t cả củ a cá c Nguyê n liệ u từ cá c Trá i thứ c ă n nhó m vớ i Mộ t Kho Lớ n hơn 100
2.12
CHỌN thành phần, tên TỪ thành
phần
WHERE foodgroup = 'Trái cây' VÀ hàng tồn kho > 100;

Thành phần Tên


NHO Nho
[1 Hà ng(s)]

Đố i vớ i hai điề u kiệ n đượ c nố i vớ i OR, toà n bộ điề u kiệ n là đú ng nếu mộ t trong hai hoặ c cả hai
đề u đú ng.

Truy vấn Tìm tê n củ a tấ t cả Thà nh phầ n vớ i đơn giá trê n $0,40 hoặ c vớ i mộ t đơn vị củ a thủ y
2,13
tinh
SELECT tên, unitprice, đơn vị TỪ
thành phần
TRONG ĐÓ unitprice > 0,40 HOẶC đơn vị = 'kính';

Tên giá đơn vị đơn vị


Gà 0.45 dải
Nước 0.06 kính
Nước xô- 0.69 kính
đa
[3 hà ng(s)]

Lưu ý rằ ng Soda đú ng vớ i cả hai điề u kiệ n, trong khi Gà và Nướ c chỉ đú ng vớ i mộ t điề u
kiệ n.
Bạ n có thể kết hợ p nhiều AND và ORs vớ i nhau khi cầ n thiết, nhưng hã y cẩ n thậ n.
SQL có thể khô ng diễ n giả i mệ nh đề WHERE như bạ n dự định. Tạ i sao? SQL khô ng đá nh
giá nghiê m ngặ t mộ t biể u thứ c từ trá i sang phả i . Mộ t số nhà khai thá c có mứ c độ ưu
tiê n cao hơn nhữ ng toá n tử khá c. Cá c oper- ators có mứ c độ ưu tiên cao hơn đượ c đá nh giá
trướ c cá c toá n tử có mứ c độ ưu tiê n thấ p hơn, bấ t kể họ đang ở đâ u trong tình trạ ng nà y.
Trong SQL, thứ tự ưu tiê n từ cao nhấ t đế n thấ p nhấ t như sau:

Toá n tử ưu tiên

Toá n tử so sá nh cao nhấ t


KHÔ NG

OR thấ p nhấ t
36 Chương 2: Truy: Cơ bả n Lự a chọ n ■

Việ c đá nh giá mộ t tình trạ ng bắ t đầ u bằ ng cá c so sá nh cá nhâ n. Tiế p theo, cá c điề u kiệ n


có tiề n tố NOT bị phủ nhậ n. Cá c AND sau đó đượ c á p dụ ng từ trá i sang phả i . Cuố i
cù ng, cá c ORs đượ c á p dụ ng từ trá i sang phả i . Xem xé t giả i phá p khô ng chính xá c trong
truy vấ n 2.14.

SAI! Tìm thấ y cá c thứ c ă n Mụ c đó có a Tê n đầ u vớ i hoặ c F hoặ c S đó Chi phí ké m


Truy vấn
hơn 3,50 đô la
2.14
CHỌN tên, giá TỪ các
mặt hàng
TRONG ĐÓ tên NHƯ 'F%' hoặc tên LIKE 'S%' và giá < 3,50;

Tên giá
Salad trá i 3.45
câ y
Nước xô-đa 0.99
Đĩa trá i câ y 3.99

[3 hà ng(s)]

Là m thế nà o mà Tấ m trá i câ y có đượ c kế t quả củ a chú ng tô i? Bở i vì AND có mứ c độ ưu tiên


cao hơn, tê n LIKE 'S%' và giá > 3.50 đượ c đá nh giá là first. Đố i vớ i Tấ m trá i câ y, điề u nà y trả về
false; tuy nhiên, tên LIKE 'F%' trả về true, là m cho điều kiệ n đú ng cho hà ng. Truy vấ n nà y thự c
sự xá c định các mặ t hà ng thự c phẩ m có tê n bắ t đầ u bằ ng F cộ ng vớ i cá c mặ t hà ng thự c phẩ m
có giá dướ i $ 3.50 bắ t đầ u bằ ng S.
Là m thế nà o để chú ng ta viế t truy vấ n chính xá c? Sử dụ ng dấ u ngoặ c đơn.

ĐÚNG! Tìm thấ y cá c thứ c ă n Mụ c đó có a Tê n đầ u vớ i hoặ c F hoặ c S đó Chi phí ké m hơn


Truy vấn
3,50 đô la
2.15
CHỌN tên, giá TỪ các
mặt hàng
WHERE (tên NHƯ 'F%' HOẶC tên LIKE 'S%') và giá < 3,50;

Tên giá
Salad trá i 3.45
câ y
Nước xô-đa 0.99
[2 Hà ng(s)]

Trong Truy vấ n 2.15, điề u kiệ n bê n trong dấ u ngoặ c đơn có mứ c độ ưu tiê n cao nhấ t nê n
nó đượ c exe- cắ t trướ c, giố ng như chú ng ta muố n. Bê n trong ngoặ c đơn, cá c quy tắ c ưu tiên
thô ng thườ ng đượ c á p dụ ng. Tố t nhấ t bạ n nên sử dụ ng dấ u ngoặ c đơn vớ i mệ nh đề WHERE
chứ a nhiề u hơn hailầ n lặ p lạ i để đả m bả o việc giả i thích truy vấ n là chính xá c.
Chú ng ta có thể lồ ng dấ u ngoặ c đơn để có đượ c bấ t kỳ lệ nh thự c hiệ n nà o mong muố n.
Tình trạ ng bên trong dấ u ngoặ c đơn trong cù ng luô n có mứ c độ ưu tiê n cao nhấ t. Mộ t lầ n
biể u thứ c trong ngoặ c đơn

2.8 Chọ n mộ t phạ m vi giá trị vớ i GIỮ A 37

đã đượ c đá nh giá , cá c quy tắ c ưu tiên thô ng thườ ng đượ c á p dụ ng. Điều đó có nghĩa là ((tên
NHƯ 'F%' hoặ c tên LIKE 'S%') và giá < 3,50) sẽ thự c thi giố ng như Truy vấ n 2.15.

2.8 Chọn một phạm vi giá trị với BETWEEN


Toá n tử BETWEEN cho phé p chú ng ta chỉ định mộ t phạ m vi giá trị (bao gồ m) để khớ p như
trong Truy vấ n 2.16.

Truy vấn Tìm cá c mặ t hà ng thự c phẩ m có giá từ $ 2.50 đế n $ 3.50


2.16
CHỌN *
TỪ các mặt hàng
TRONG ĐÓ GIÁ TỪ 2,50 ĐẾN 3,50;

itemid Tên giá ngàythêm


CHKSD Salad gà 2.85 1998-11-13
FRTSD · Salad trá i câ y 3.45 2000-05-06

[2 Hà ng(s)]

Để lấ y cá c giá trị khô ng nằ m trong mộ t phạ m vi đượ c chỉ định, hã y sử dụ ng NOT BETWEEN.

Truy vấn Tìm thấ y cá c thứ c ă n Mụ c Chi phí ké m hơn 2,50 đô la hoặ c nhiề u hơn hơn 3,50 đô la
2.17
CHỌN *
TỪ các mặt hàng
TRƯỜNG HỢP GIÁ KHÔNG NẰM TRONG KHOẢNG TỪ 2,50 ĐẾN 3,50;

itemid Tên giá ngàythêm


GDNSD Salad vườ n 0.99 2001-03-02
Nước xô- Nước xô-đa 0.99 2003-02-06
đa
NƯỚC Nước 0.00 2002-05-19
FRPLT Đĩa trá i câ y 3.99 2000-09-02

[4 hà ng(s)]

Kế t quả bao gồ m bấ t kỳ mặ t hà ng thự c phẩ m nà o có giá dướ i $ 2.50 hoặ c lớ n hơn $ 3.50.
Lưu ý rằ ng WHERE x BETWEEN y AND z tương đương vớ i WHERE x >= y AND x <= z vì vậ y nó
thự c sự chỉ là mộ t cá ch khá c để trả lờ i cù ng mộ t truy vấ n. Thô ng thườ ng, có nhiề u cá ch để trả
lờ i cù ngmộ t truy vấ n trong SQL. Trong hầ u hế t cá c trườ ng hợ p, việ c lự a chọ n cú phá p khô ng
đượ c thay đổ i hiệ u suấ t củ a truy vấ n; tuy nhiên, trong mộ t và i trườ ng hợ p, mộ t biến thể có
thể hiệ u quả hơn nhiề u so vớ i biế n thể khá c. Điề u nà y sẽ phụ thuộ c và o cơ sở dữ liệ u và
DBMS củ a bạ n.
38 Chương 2: Truy: Cơ bả n Lự a chọ n ■

2.9 Chọn một tập hợp giá trị bằng cách sử dụng hàm IN

Toá n tử IN xá c định xem mộ t giá trị có đượ c chứ a trong danh sá ch cá c giá trị hay khô ng.

Truy vấn Tìm thấ y cá c Vendor Đạ i diệ n vớ i cuố i cù ng Tê n củ a Bắ p hoặ c Sherbert ·


2.18
CHỌN vendorid, repfname, replname TỪ nhà
cung cấp
WHERE replname IN ('Ngô', 'Sherbert');

vendorid tên replname


repfname
VGRUS Kẹo Bắp
Flvcr Sherman Sherbert ·
[2 Hà ng(s)]

Danh sá ch cá c giá trị phả i đượ c phâ n cá ch bằ ng dấ u phẩ y và đượ c đặ t trong ngoặ c đơn. Để đá nh
giá WHERE x IN (y1, :: :, yn), SQL đá nh giá x = yi cho mỗ i yi trong danh sá ch. Nếu ít nhấ t mộ t x =
yi đá nh giá là đú ng , điều kiệ n đá nh giá là đú ng.
Như bạ n có thể đã nghi ngờ , bạ n có thể sử dụ ng NOT IN để tìm tấ t cả cá c giá trị
khô ng có trong danh sá ch.

Truy vấn Tìm thấ y cá c thà nh phầ n Id Tê n và đơn vị củ a Mụ c khô ng Bá n trong Miế ng hoặ c Dả i
2.19
CHỌN thành phần, tên, đơn vị TỪ thành
phần
WHERE unit NOT IN ('mảnh', 'dải');

Thành phần Tên đơn vị


Tiếng CHESE Phó mát xúc
LETUS · Rau diếp bát
PICKL Dưa lát
SCTDR Mặc quần áo bí báo
tuyết
mậ t
NÀY Cà chua lát
NƯỚC Nước kính
Nước xô-đa Nước xô-đa kính
ORNG Cam lát
[8 Hà ng(s)]

2.10 IS NULL: Khám phá những điều chưa biết


Là m thế nà o để chú ng tô i tìm thấ y tấ t cả cá c nhà cung cấ p khô ng đượ c giớ i thiệ u bở i bấ t
kỳ nhà cung cấ p nà o khá c ? Chú ng ta cầ n tấ t cả cá c hà ng từ các nhà cung cấp có giá trị
referredby là NULL , nhưng hã y cẩ n thậ n — NULL

2.10 IS NULL: Khá m phá 39 ẩ n số

là mộ t loà i độ ng vậ t kỳ lạ . SQL diễn giả i NULL là khô ng xá c định. Nế u chú ng ta so sá nh mộ t


cá i gì đó khô ng xác định vớ i bất kỳ giá trị nà o, thậm chí khô ng xá c định, kết quả là khô ng xá c định.
Điề u nà y có ý nghĩa nế u bạ n nghĩ về nó . Hã y xem xé t mộ t đạ i diệ n nhà cung cấ p mớ i có tê n
Bob và họ khô ng xá c định . Nế u ai đó hỏ i bạ n rằ ng họ củ a Bob có phả i là Smith hay khô ng,
là m thế nà o bạ n có thể trả lờ i chính xá c nhấ t? Đú ng vậ y — "Tô i khô ng biế t." Cơ sở dữ liệ u
tương đương là khô ng xá c định. Hệ thố ng đá nh giá củ a chú ng tô i hiện có ba giá trị: đú ng, sai
và khô ng xá c định. Khô ng có gì đá ng ngạ c nhiê n khi hệ thố ng đá nh giá conditions vớ i ba kế t
quả có thể đượ c gọ i là logic ba giá trị.
SQL xử lý khô ng xá c định như thế nà o? SQL chỉ bá o cá o cá c hà ng mà điề u kiệ n
WHERE đá nh giá là đú ng. Cá c hà ng đá nh giá là sai hoặ c khô ng xá c định khô ng đượ c bao
gồ m trong câ u trả lờ i. So sá nh cá c truy vấ n 2.20 và 2.21.

Truy vấn SAI! Tìm thấ y tấ t cả Đạ i lý khô ng Gọ i bằ ng cá ch bấ t cứ ai


2.20
CHỌN *
TỪ các nhà cung cấp
WHERE referredby = NULL;

vendorid tên công ty tên replname được giới


repfname thiệubởi
[0 hà ng(s)]

Truy vấ n nà y trả về khô ng có hà ng nà o vì mỗ i đá nh giá củ a referredby = NULL trả về


khô ng xá c định, ngay cả đố i vớ i cá c hà ng mà referredby là NULL. Vậ y là m thế nà o để chú ng
ta kiể m tra NULL? Chú ng tô i sử dụ ng IS NULL.

Truy vấn ĐÚNG! Tìm thấ y tấ t cả Đạ i lý khô ng Gọ i bằ ng cá ch bấ t cứ ai


2,21
CHỌN *
TỪ các nhà cung cấp
WHERE referredby IS NULL;

vendorid tên công ty tên replname được giới


repfname thiệubởi
VGRUS Veggies_R_Us Kẹo Bắp KHÔNG
[1 Hà ng(s)]

Như bạ n có thể mong đợ i, chú ng ta có thể tìmthấ y cá c hà ng có giá trị khô ng phả i NULL bằ ng
cá ch sử dụ ng IS NOT NULL.
Ý nghĩa củ a so sá nh NULL có thể rấ t tinh tế . Quy tắ c cầ n nhớ là so sá nh NULL vớ i
mộ t thuộ c tính (ví dụ : referredby), nghĩa đen (ví dụ : 'A', 3, v.v.) hoặ c thậ m chí vớ i chính
NULL luô n trả về khô ng xá c định. Điề u nà y có nghĩa là NULL = NULL đá nh giá là khô ng xá c
định. Tấ t nhiê n, NULL IS NULL luô n đá nh giá là đú ng. Hã y xem xé t cá c Truy vấ n 2.22 và
2.23.
40 Chương 2: Truy: Cơ bả n Lự a chọ n ■

Truy vấn Tìm thấ y tấ t cả Mụ c vớ i giá Lớ n hơn 0,99 đô la


2,22
CHỌN *
TỪ các mặt hàng
GIÁ ĐÂU > 0,99;

itemid Tên giá ngàythêm


CHKSD Salad gà 2.85 1998-11-13
FRTSD · Salad trá i câ y 3.45 2000-05-06
FRPLT Đĩa trá i câ y 3.99 2000-09-02

[3 hà ng(s)]

Truy vấn Tìm thấ y tấ t cả Mụ c vớ i giá ké m hơn hoặ c bình đẳ ng đế n 0,99 đô la


2,23
CHỌN *
TỪ các mặt hàng
TRONG ĐÓ giá < = 0,99;

itemid Tên giá ngàythêm


GDNSD Salad vườ n 0.99 2001-03-02
Nước xô- Nước xô-đa 0.99 2003-02-06
đa
NƯỚC Nước 0.00 2002-05-19
[3 hà ng(s)]

Salad thiê n niê n kỷ ở đâ u? Giá củ a nó là NULL, vì vậ y so sá nh nó vớ i $ 0.99 luô n trả về khô ng


xá c định, mà SQL loạ i trừ khỏ i cả hai kế t quả . Trên thự c tế , giá NULL cho Millennium Salad
khô ng thấ p hơn , lớ n hơn hoặ c bằ ng $ 0.99. Để liệ t kê hà ng củ a mó n salad nà y (và bấ t kỳ
hà ng nà o khá c có giá NULL), chú ng ta cầ n Truy vấ n 2.24.

Truy vấn Tìm thấ y tấ t cả Mụ c vớ i Khô ng giá


2.24
CHỌN *
TỪ các mặt hàng
TRƯỜNG HỢP GIÁ VÔ HIỆU;

itemid Tên giá ngàythêm


MILSD Salad thiên niên KHÔNG 2002-08-16
kỷ
[1 Hà ng(s)]

Sự khô ng thể so sá nh củ a NULL có ý nghĩa khá c. Ví dụ : cả LIKE '%' và NOT LIKE '%' đều
khô ng khớ p vớ i NULL. NULL khô ng phả i là BETWEEN cũ ng khô ng PHẢ I GIỮ A hai giá trị bấ t kỳ ,
bao gồ m cả NULL.

2.11 ANDs, ORs, NOT vớ i NULLs: Three-Valued Logic 41

2.11 ANDs, ORs, NOT với NULLs: Logic ba giá trị

Điề u gì xả y ra khi chú ng ta AND, OR, hoặ c KHÔ NG phả i là mộ t giá trị khô ng xá c định? SQL
đá nh giá cá c điề u kiện bằ ng logic ba giá trị. Bả ng 2.2 hiển thị cá c bả ng logic cho AND, OR và
NOT.

Và thật sai không


biết
thật thậ t sai khô ng biế t
sai sai sai sai
không biết sai khô ng biế t
khô ng xá c định

Hoặc thật sai không biết


thật Đú ng sự thậ t
thậ t
sai thậ t sai khô ng biế t
không biết Khô ng xá c khô ng biế t
định thự c sự

Không

sự thật sai
sai sự
không thậ t
xác định khô ng
biế t

Bảng 2.2: Bả ng logic ba giá trị.

Hã y thử cá c bả ng logic ba giá trị củ a chú ng ta trê n mộ t ví dụ .

Tìm thấ y cá c thà nh phầ n Id thứ c ă n nhó m và Kho cho thà nh quả hoặ c Nguyê n
Truy vấn
liệ u vớ i Kho khô ng ké m hơn hoặ c bình đẳ ng đế n 200
2.25
CHỌN thành phần, nhóm thực phẩm, hàng tồn kho
TỪ các thành phần
TRONG ĐÓ nhóm thực phẩm = 'Trái cây' HOẶC KHÔNG tồn kho < = 200;

Thành phần nhóm thực Kho


phẩm
CRUTN Bánh mì 400
NHO Trái 300
PICKL Rau 800
NÀY Trái 15
Nước xô-đa KHÔNG 5000
WTRML Trái KHÔNG
ORNG Trái 10
[7 Hà ng(s)]
42 Chương 2: Truy: Cơ bả n Lự a chọ n ■
42 Chương 2: Truy: Cơ bả n Lự a chọ n ■

Kế t quả cho cá c hà ng có giá trị khô ng phả i NULL cho cả nhóm thực phẩm và hàng tồn kho
khô ng có gì đá ng ngạ c nhiê n. Chú ng ta hã y xem xé t hai hà ng khá c trong bả ng thành phần:
nhữ ng hà ng đượ c xá c định bở i WTRML và SCTDR.
Đầ u tiê n, hã y đá nh giá tình trạ ng củ a hà ng WTRML từ các thành phần:

nhóm thực phẩm = 'Trái cây' = = đúng


KHÔNG phải hàng tồn kho < = 200 = KHÔNG xác định HOẶ C = đúng
= không xác định

Điề u kiệ n đầ u tiê n, nhó m thự c phẩ m = 'Trá i câ y', đá nh giá là đú ng. hà ng tồ n kho < = 200 đá nh giá là
khô ng xá c định, và bả n thâ n NOT of unknown là khô ng xá c định. Đố i vớ i hà ng nà y, SQL
đá nh giá true OR unknown, điề u nà y đú ng nên hà ng WTRML đượ c bao gồ m.
Bâ y giờ hã y xem xé t hà ng SCTDR .

nhóm thực phẩm = 'Trái cây' = = khô ng xác


định = kho < = 200
HOẶ C không rõ KHÔNG tồn =
KHÔNG đúng = sai

nhó m thự c phẩ m = 'Trá i câ y' đá nh giá là khô ng xá c định và KHÔ NG kiểm kê < = 200 đá nh giá là sai.
Vì false OR unknown khô ng xá c định, hà ng SCTDR khô ng đượ c bao gồ m trong kết quả củ a
Truy vấ n 2.25.

2.12 Lô-gic ba giá trị và toán tử IN


Hã y xem xé t ý nghĩa củ a logic ba giá trị đố i vớ i toá n tử IN. Như chú ng ta đã nêu, để đá nh giá x
IN (y1, :: :, yn), SQL đá nh giá x = yi cho mỗ i yi trong danh sá ch. Nế u ít nhấ t mộ t x = yi đá nh giá
là đú ng, điều kiện đá nh giá là đú ng. Nế u tấ t cả x = yi đá nh giá thà nh false hoặ c danh sá ch
IN trố ng, điều kiện đá nh giá là false. Nế u cả hai trườ ng hợ p nà y đều khô ng nắ m giữ , thì tình
trạ ng nà y sẽ khô ng xá c định.
Điề u kiệ n x NOT IN (y1, :: :, yn) tương đương vớ i NOT x IN (y1, :: :, yn), dẫ n đế n kế t quả
khô ng trự c quan củ a Truy vấ n 2.26.

Truy vấn SAI! Tìm thấ y tấ t cả củ a cá c Đạ i lý củ a ai Vendor Id Là Khô ng BADID · hoặ c KHÔNG
2.26
CHỌN *
TỪ các nhà cung cấp
NƠI VENDORID KHÔNG Ở TRONG ('BADID', NULL);

vendorid tên công ty tên replname được giới


repfname thiệubởi
[0 hà ng(s)]

Tạ i sao kế t quả trố ng? So sá nh từ ng vendorid vớ i BADID trả về false và vớ i null trả về
khô ng xá c định; do đó , hà m IN trả về khô ng xá c định cho mỗ i hà ng. Á p dụ ng NOT vẫ n trả về
khô ng xá c định. Bở i vì điề u kiệ n đá nh giá là khô ng xá c định cho tấ t cả cá c hà ng, kế t quả

2.14 Kết thú c 43

trố ng rỗ ng. Rõ rà ng, giả i phá p là trá nh NULL vớ i toá n tử IN, nhưng như chú ng ta sẽ thấ y
trong cá c chương sau, IN có thể đượ c sử dụ ng trong các tình huố ng mà chú ng ta khô ng có
nhiề u quyề n kiể m soá t.

2.13 Làm thế nào WHERE xác định những gì trong và ngoài
Điề u gì xá c định hà ng nà o và o hay ra? SQL đá nh giá điề u kiệ n WHERE cho mỗ i hà ng và mộ t
hà ng chỉ đượ c bao gồ m nế u điề u kiện đá nh giá là đú ng cho hà ng cụ thể đó . Hã y xem xé t
Truy vấ n 2.27.

Truy vấn Tìm thấ y tấ t cả Mụ c


2.27
CHỌN *
TỪ các mục
WHERE 1 = 1;

itemid Tên giá ngàythêm


CHKSD Salad gà 2.85 1998-11-13
FRTSD · Salad trá i câ y 3.45 2000-05-06
GDNSD Salad vườ n 0.99 2001-03-02
MILSD Salad thiên niên KHÔNG 2002-08-16
kỷ
Nước xô- Nước xô-đa 0.99 2003-02-06
đa
NƯỚC Nước 0.00 2002-05-19
FRPLT Đĩa trá i câ y 3.99 2000-09-02
[7
Hà ng(s)]

Đố i vớ i mỗ i hà ng, 1 = 1 là true, vì vậ y truy vấ n nà y trả về tấ t cả cá c hà ng trong bả ng items.


Nế u chú ng ta thay đổ i điề u kiệ n WHERE thà nh 1 = 2, kết quả truy vấ n củ a chú ng ta sẽ khô ng
chứ a hà ng nà o vì 1 = 2 luô n là false. Mặ c dù ví dụ cụ thể nà y khô ng đá ng kể , nhưng điề u
quan trọ ng là phả i hiể u SQL nghĩ như thế nà o khi chú ng ta xem xé t các truy vấ n phứ c tạ p
hơn sau nà y.
Như ví dụ nà y cho thấ y, nó là hoà n toà n hợ p phá p trong SQL cho điề u kiệ n trong mệ nh
đề WHERE khô ng liê n quan gì đế n cá c giá trị trong hà ng. SQL yê u cầ u rằ ng bấ t kỳ cộ t nà o
đượ c tham chiế u trong mệnh đề SELECT và WHERE phả i là mộ t thuộ c tính trong bả ng trong
mệ nh đề FROM; nế u khô ng, SQL trả về lỗ i.

2.14 Kết thúc

Trong chương nà y, chú ng ta đã họ c cá ch trích xuấ t dữ liệ u từ mộ t bả ng duy nhấ t. Chú ng tô i


chỉ định cá c thuộ c tính chú ng tô i muố n trong danh sá ch SELECT. Cá c hà ng trong kế t quả
đượ c xá c định bở i điề u kiệ n WHERE. SQL đá nh giá điề u kiệ n WHERE cho mỗ i hà ng, chỉ bao
gồ m nhữ ng hà ng trong kế t quả mà điề u kiệ n đá nh giá là đú ng. SQL cung cấ p mộ t tậ p hợ p
mạ nh mẽ các toá n tử so sá nh để sử dụ ng trong mệnh đề WHERE để xá c định hà ng nà o và o
và ra. Chú ng ta có thể kết hợ p cá c điề u kiệ n riê ng lẻ vớ i nhau bằ ng cá ch sử dụ ng AND và OR, và
chú ng ta có thể phủ nhậ n bằ ng cá ch sử dụ ng NOT. Mộ t số thuộ c tính có thể có giá trị NULL,
mà SQL diễ n giả i là unknown. Để cho phép cá c giá trị khô ng xá c định, SQL đá nh giá mộ t điề u
44 Chương 2: Truy: Cơ bả n Lự a chọ n ■
kiệ n bằ ng cá ch sử dụ ng logic ba giá trị.
44 Chương 2: Truy: Cơ bả n Lự a chọ n ■

Câu hỏi ôn tập

1. Kế t quả củ a mộ t câ u lệ nh SELECT là mộ t kế t quả mớ i .

2. SQL sử dụ ng logic có giá trị. Cá c giá trị có thể có củ a hệ thố ng là


, , và .
3. 5 BETWEEN 3 AND 5 trả về true hay false?
4. KHÔ NG biết VÀ KHÔ NG sai hoặ c khô ng biế t đá nh giá .
5. Khoanh trò n cá c chuỗ i LIKE '_ _s% l' trậ n đấ u: [ bó ng chà y, bó ng đá , bó ng đá, rổ -
bó ng, cricket ]
6. NULL > NULL đá nh giá .
7. NULL > NULL AND true OR false đá nh giá đến .

8. NULL > NULL HOẶC true AND false đá nh giá đế n .


9. Mẫ u khớ p chuỗ i nà o khớ p vớ i tấ t cả cá c chuỗ i bắ t đầ u bằ ng 'B' và kế t thú c bằ ng 'll'
vớ i chính xá c mộ t ký tự ở giữ a (ví dụ : 'Bill', 'Ball')? Cù ng
mộ t câ u hỏ i vớ i mộ t hoặc nhiều ký tự ở giữ a .

10. So sá nh chuỗ i có phâ n biệ t chữ hoa chữ thườ ng đố i vớ i cơ sở dữ liệ u củ a bạ n khô ng?
11. Cá ch dễ nhấ t để chọ n tấ t cả cá c cộ t trong bả ng là sử dụ ng .
12. Mộ t thuộ c tính trong mệnh đề SELECT có phả i xuấ t hiệ n trong mệ nh đề WHERE
khô ng?
13. Thuộ c tính trong mệnh đề WHERE có phả i xuấ t hiệ n trong mệnh đề SELECT
khô ng ?
14. Toá n tử nà o tương đương vớ i NOT >, NOT <= và NOT <>?
15. Trong Cơ sở dữ liệ u Nhà hà ng, truy vấ n sau đâ y trả về bao nhiê u hà ng?
CHỌN *
TỪ các nhà cung cấp;

16. Truy vấ n nà y sẽ thự c thi?


SELECTnameFROMingredients;

17. Truy vấ n nà y sẽ thự c thi?


LỰA
tên
TỪ
Nguyên liệu
;

Tập
Đố i vớ i cá c bà i tậ p nà y, hã y sử dụ ng Cơ sở dữ liệ u nhâ n viê n đượ c trình bà y ở cuố i
Chương 1. Đố i vớ i mỗ i câ u hỏ i, hã y đưa ra câ u lệ nh SQL duy nhấ t để trả lờ i nó . Truy vấ n
củ a bạ n phả i hoạ t độ ng cho bấ t kỳ tậ p hợ p dữ liệu nà o trong Cơ sở dữ liệu nhâ n viê n, khô ng
chỉ tậ p hợ p dữ liệu chú ng tô i cung cấ p.
46 Chương 2: Truy: Cơ bả n Lự a chọ n ■ ■
Thự c hà nh 45

1. Liệt kê đầ u tiê n và họ củ a tấ t cả nhâ n viê n.

2. Liệ t kê tấ t cả các thuộ c tính củ a cá c dự á n có doanh thu lớ n hơn 40,000 đô la.


3. Liệ t kê mã bộ phậ n củ a cá c dự á n có doanh thu từ 100,000 đô la và
$ 150,000.

4. Liệt kê ID dự á n cho cá c dự á n đã bắ t đầ u và o hoặ c trướ c ngà y 1 thá ng 7 nă m 2004.


5. Liệt kê tê n củ a cá c phò ng ban là cấ p cao nhấ t (tứ c là , khô ng phải là mộ t tiể u ban).
6. Liệ t kê ID và mô tả củ a cá c dự á n thuộ c cá c phò ng ban vớ i mã ACCNT, CNSLT hoặ c
HDWRE.

7. Liệt kê tấ t cả thô ng tin về nhâ n viê n có họ có chính xá c 8 ký tự và kế t thú c bằ ng


'phầ n mề m'.
8. Liệ t kê ID và họ củ a tấ t cả nhâ n viê n là m việ c cho bộ phậ n ACTNG và kiếm đượ c ít
hơn 30,000 đô la.

9. Liệt kê cá c dự á n "kỳ diệ u" chưa bắ t đầ u (đượ c biể u thị bằ ng ngà y bắ t đầ u trong
tương lai hoặ c NULL) nhưng đang tạ o ra doanh thu.

10. Liệt kê ID củ a dự á n từ bộ phậ n ACTNG hoặ c đang diễn ra (tứ c là ngà y kết thú c
NULL). Loạ i trừ bấ t kỳ dự á n nà o có doanh thu từ 50,000 đô la trở xuố ng.

11. Xem xé t bả ng T vớ i cá c cộ t C1 VARCHAR(10), C2 INTEGER và C3 INTEGER và truy


vấ n

CHỌN *
TỪ T
TRONG ĐÓ C1 THÍCH '%ar_' HOẶC KHÔ NG C2 TỪ 3 ĐẾN 7 VÀ C3 < 5;

Điề n và o kế t quả cò n thiếu cho cá c hà ng ví dụ .

C1 · C2 · C3 · Giá trị Kết quả là?


Hà ng
Khô ng 4 9 sai Khô ng

Chia sẻ KHÔN 5
G
Xe hơi 2 KHÔN
G
Sarah 8 1

KHÔN thậ t Có
G
c h a p t er 3

Định hình lại kết quả

R emember mà chú ng ta có thể nghĩ về việc thự c thi mộ t câ u lệ nh SELECT như tạ o ra


mộ t bả ng hoà n toà n mớ i, đượ c gọ i là bả ng kế t quả , thườ ng chỉ tồ n tạ i đủ lâ u để xuấ t ra kết
quả truy vấ n. Cá c cộ t củ a bả ng kết quả đượ c xác định bở i danh sá ch cộ t củ a câ u lệ nh SELECT
và biể u thứ c WHERE xá c định bả ng kế t quả mà rnợ . Thườ ng
Chỉ cầ n chọ n mộ t tậ p hợ p con củ a cá c hà ng và cộ t là khô ng đủ để trả lờ i câ u hỏ i củ a
chú ng tô i. Chú ng tô i có thể cầ n thự c hiệ n mộ t số thao tá c trê n dữ liệ u thô để tạ o ra kế t
quả mong muố n. Chú ng ta cũ ng có thể muố n kiể m soá t hình thứ c củ a chính bả ng kế t quả .
Trong chương nà y, chú ng ta khá m phá cá c khả nă ng SQL khá c nhau để thao tá c bả ng kế t
quả .

3.1 AS: Đặt tên cột bảng kết quả

Nế u câ u lệ nh SELECT tạ o bả ng mớ i, tê n củ a cá c cộ t củ a bả ng đó là gì? Theo mặ c định, cá c cộ t


trong bả ng kế t quả có cù ng tê n vớ i cá c thuộ c tính trong bả ng gố c; tuy nhiê n, bạ n có thể thay
đổ i tê n cộ t bả ng kế t quả bằ ng cá ch sử dụ ng cộ t alia s. Chú ng tô i gá n bí danh cộ t trong danh sá ch
cộ t củ a câ u lệ nh SELECT bằ ng cá ch sử dụ ng AS.

47
48 Chương 3: Reshaping Kế t quả ■

Truy vấn Biệ t danh ví dụ


3.1
CHỌN tên công ty AS công ty, repfname AS " First Name" FROM
vendors;

công ty Tên đầ u
tiên
Veggies_R_Us Kẹo
Sữa của Don Marla
Kem có hương vị Sherman
"Ăn trái cây " Bạn bè Gilbert
Băng củaEd Sáng

Cấp nước suố i Gus

[6 Hà ng(s)]

Từ khó a AS là tù y chọ n. Để chỉ định bí danh cộ t có khoả ng trắ ng hoặ c ký tự đặ c biệ t


khá c, hã y đặ t tê n bí danh trong dấ u ngoặ c ké p; nế u khô ng thì cá c dấ u ngoặ c ké p là tù y
chọ n. Tham khả o tà i liệ u DBMS củ a bạ n về cá c hạ n chế cụ thể .

3.2 DISTINCT và ALL: Xử lý các bản sao

Cá c hà ng trù ng lặ p là ổ n trong SQL; tuy nhiê n, bạ n có thể khô ng hà i lò ng vớ i tấ t cả nhữ ng


điề u đó lặ p đi lặ p lạ i nhiề u lầ n. Hã y tạ o mộ t danh sá ch cá c nhó m thự c phẩ m.

Truy vấn Tìm thấ y cá c thứ c ă n Nhó m Phụ c vụ bằ ng cá ch củ a bạ n tiệ m ă n


3.2
CHỌN nhóm thực
phẩm TỪ các thành
phần;

nhóm thực
phẩm
Sữa
Thịt
Bánh mì
Trái
Rau
Rau
KHÔNG
Trái
KHÔNG
KHÔNG
Trái
Trái
[12 hà ng (s)]

3.2 KHÁ C BIỆ T và TẤ T CẢ : Xử lý cá c bả n sao 49

Chú ng ta có thể loạ i bỏ cá c hà ng trù ng lặ p bằ ng cá ch đặ t trướ c danh sá ch cộ t SELECT vớ i từ khó a


DISTINCT, như trong Truy vấ n 3.3 .

Truy vấn Tìm thấ y cá c thứ c ă n Nhó m Phụ c vụ bằ ng cá ch củ a bạ n tiệ m ă n khô ng Sao ché p
3.3
CHỌN NHÓM THỰC PHẨM
RIÊNG BIỆT TỪ các thành phần;

nhóm thực
phẩm
Bánh mì
Trái
Thịt
Sữa
Rau
KHÔNG
[6 Hà ng(s)]

Lưu ý rằ ng NULL đượ c coi là mộ t giá trị riê ng biệ t và NULLs trù ng lặ p sẽ bị loạ i bỏ .
DISTINCT chỉ có thể xuấ t hiệ n mộ t lầ n trong câ u lệ nh SELECT ở đầ u danh sách
thuộ c tính và á p dụ ng cho tất cả các thuộ c tính trong danh sá ch thuộ c tính.

Truy vấn Tìm thấ y cá c riê ng biệ t danh sá ch củ a thứ c ă n Nhó m Cung cấ p bằ ng cá ch mỗ i Vendor
3.4
CHỌN NHÓM THỰC PHẨM RIÊNG BIỆT,
vendorid TỪ các thành phần;

nhóm thực vendorid


phẩm
Bánh mì EDDRS
Trái FRTFR ·
Trái VGRUS
Thịt MÁY DNDRY
Sữa MÁY DNDRY
Rau VGRUS
KHÔNG SPWTR
KHÔNG KHÔNG
[8 Hà ng(s)]

Trong ví dụ nà y, SQL sử dụ ng cá c giá trị cho cả hai thuộ c tính để xá c định xem mỗ i giá trị
hà ng có phả i là duy nhấ t hay khô ng. Nhó m thự c phẩ m trá i câ y xuấ t hiệ n hai lầ n vì hai nhà
cung cấ p khá c nhau cung cấ p nguyê n liệ u từ nhó m thự c phẩ m đó . Mộ t lầ n nữ a, lưu ý
rằ ng NULL đượ c coi là mộ t giá trị riê ng biệ t. Bạ n có thể sử dụ ng ALL thay vì DISTINCT
để chỉ ra rằ ng bạ n khô ng muố n loạ i bỏ cá c bả n sao. Bở i vì giữ cá c bả n sao là mặ c định,
TẤ T CẢ là khô ng cầ n thiế t.
50 Chương 3: Reshaping Kế t quả ■

3.3 Thuộc tính phái sinh

Dữ liệ u có thể hơi thô . SQL cung cấ p khả nă ng tạ o cá c thuộ c tính trong bả ng kế t quả củ a
chú ng tô i có nguồ n gố c bằ ng cá ch sử dụ ng cá c hoạ t độ ng và hà m trê n cá c thuộ c tính và nghĩa
đen hiệ n có . Tên cộ t mặ c định củ a mộ t thuộ c tính phá i sinh là phụ thuộ c và o hệ thố ng; tuy
nhiê n, mộ t tê n có thể đượ c gá n bằ ng bí danh cộ t.

3.3.1 Số
SQL có thể đá nh giá cá c biể u thứ c số họ c đơn giả n có chứ a cá c cộ t số và nghĩa đen. Bả ng 3.1
cho thấ y cá c toá n tử số họ c SQL theo thứ tự ưu tiê n từ cao nhấ t đế n thấ p nhấ t. Unary +/- có
mứ c độ ưu tiê n cao nhấ t. Phé p nhâ n và phép chia có mứ c ưu tiê n cao nhấ t tiếp theo. Phé p cộ ng
và phé p trừ có mứ c ưu tiên thấ p nhấ t. Cá c toá n tử có cù ng mứ c ưu tiê n đượ c thự c thi từ trá i
sang phả i. Chú ng ta có thể kiể m soá t thứ tự củ a evaluativề việ c sử dụ ng dấ u ngoặ c đơn. SQL
đá nh giá mộ t biể u thứ c cho mỗ i hà ng trong bả ng đượ c chỉ định trong mệnh đề FROM thỏ a
mã n điề u kiệ n trong mệ nh đề WHERE. Hã y xem mộ t ví dụ .

Truy vấn Tìm thấ y cá c giá trị củ a củ a bạ n dưa Kho nế u mà y đô i củ a bạ n cổ phiế u củ a Pickles
3.5
CHỌN thành phần, nhà phát minhy * 2 * đơn giá AS "Giá trị hàng tồn kho" TỪ
thành phần
WHERE name = 'Dưa chua';

Thành phần Giá trị hà ng tồ n


kho
PICKL 64.00
[1 Hà ng(s)]

Toán tử Trở lại Ví dụ về mức độ ưu


tiên
+numexp numexp vớ i dấ u hiệ u khô ng thay đổ i + hà ng tồ n kho
cao nhấ t
–numexp numexp vớ i dấ u hiệ u phủ định –3

lnumexp * rnumexp Sả n phẩ m củ a lnumexp và hà ng tồ n kho * unitprice


Middle
rnumexp
lnumexp / rnumexp Phâ n chia lnumexp bở i rnumexp Số lượ ng / 3

lnumexp + rnumexp Tổ ng củ a lnumexp và rnumexp hà ng tồ n kho + 10


Thấ p nhấ t
lnumexp – rnumexp Sự khá c biệ t củ a lnumexp và GIẢ M GIÁ - 0.1
rnumexp

Bảng 3.1: Toá n tử số họ c SQL

Điề u nà y hoạ t độ ng như thế nà o? Đố i vớ i mỗ i hà ng trong bả ng thành phần thỏ a mã n con-


dition WHERE , SQL tính toá n giá trị củ a (cá c) biể u thứ c trong danh sá ch thuộ c tính. Hã y thử
mộ t ví dụ khá c.
■ 3.3 Nguồ n gố c Thuộ c tính 51

Truy vấn Số họ c Chữ ví dụ


3.6
SELECT 5 - 4 + 8 / 4 * 2 AS "Phương trình ví

dụ" TỪ các nhà cung cấp


TRƯỜNG HỢP REFERREDBY KHÔNG NULL;

Phương trình Mẫ u
5
5
5
5
5
[5 Hà ng(s)]

Tạ i sao cù ng mộ t giá trị hiể n thị rấ t nhiề u lầ n trong Truy vấ n 3.6? Có 5 hà ng trong
bả ng nhà cung cấp thỏ a mã n vị ngữ đượ c giớ i thiệubở i IS NOT NULL. SQL đá nh giá biểu thứ c cho
từng hà ng nà y và bá o cá o kế t quả . Lưu ý rằ ng bả n thâ n biể u thứ c đượ c đá nh giá theo
mứ c độ ưu tiê n củ a toá n tử , khô ng chỉ đơn giả n là từ trá i sang phả i.
SQL cũ ng bao gồ m nhiề u hà m toá n họ c tiê u chuẩ n. Bả ng 3.2 chứ a mộ t số hà m phổ
biế n hơn. Tậ p hợ p chính xá c cá c hà m có sẵ n phụ thuộ c và o DBMS. Trên thự c tế , DBMS củ a
bạ n có thể sẽ có cá c chứ c nă ng bổ sung.

Chức năng Trở lại Ví dụ

ABS (N) Giá trị tuyệt đố i củ a N ABS (hà ng tồ n kho -


100)
CEIL[ING](N) Trầ n củ a N TRẦ N (hà ng tồ n kho /
EXP (N) 10)
vàN
EXP(5)
TẦ NG (N) Tầ ng củ a N FLOOR (hà ng tồ n kho /
10)
LN (N) Nhậ t ký tự nhiên củ a N LN(5)
MOD(N, D) Phầ n cò n lạ i củ a N chia cho D MOD(11, 3)
CÔ NG SUẤ T (B, B đế n lũ y thừ a củ a E (BE ) SỨ C MẠ NH(2, 3)
E)
SQRT(N) √ SQRT(4)
N

Bảng 3.2: Hà m số họ c SQL

Cò n null khé t tiế ng thì sao? Mộ t biể u thứ c số họ c đượ c đá nh giá bằ ng hàm NULL cho
bấ t kỳ giá trị nà o trả về NULL. Cá c hà m số họ c cho giá trị tham số NULL trả về NULL, như
trong Truy vấ n 3.7.
52 Chương 3: Reshaping Kế t quả ■

Truy vấn Tìm thấ y cá c Kho giá trị củ a mỗ i thà nh phầ n trong cả hai Đô la và Euro
3.7
CHỌN tên, hàng tồn kho * đơn giá AS Đô la,
CEIL (hàng tồ n kho * đơn giá * 1.2552) AS euro, 1.2552 AS " Tỷ giá hối đoái" TỪ
các thành phần;

Tên Đô la Euro Tỷ giá hố i đoá i


Phó mát 4.50 6 1.2552
Gà 54.00 68 1.2552
Crouton 4.00 6 1.2552
Nho 3.00 4 1.2552
Rau diếp 2.00 3 1.2552
Dưa 32.00 41 1.2552
Mặc quần áo bí 3.60 5 1.2552
mậ t
Cà chua 0.45 1 1.2552
Nước KHÔNG KHÔNG 1.2552
Nước xô-đa 3450.00 4331 1.2552
Dưa hấu KHÔNG KHÔNG 1.2552
Cam 0.50 1 1.2552
[12 hà ng (s)]

Chú ng tô i tính toá n giá trị hà ng tồ n kho củ a mình bằ ng cả đô la Mỹ và euro. Để phò ng


ngừ a rủ i ro cho cá c khoả n đặ t cượ c củ a chú ng tô i trướ c sự biế n độ ng củ a tỷ giá hố i đoá i,
chú ng tô i lấ y mứ c trầ n củ a giá trị tiề n tệ châ u  u. Như bạ n có thể thấ y trong kế t quả truy
vấ n mẫ u, nếu inventory hoặ c unitprice là NULL , sả n phẩ m củ a chú ng là NULL. Trong
trườ ng hợ p sả n phẩ m NULL củ a hàng tồn kho và đơn giá, hà m trầ n cũ ng trả về NULL.
Chú ng tô i đặ t tê n cho cá c cộ t đượ c tính toá n củ a mình bằ ng cá ch sử dụ ng bí danh cộ t.

3.3.2 Chuỗi ký tự
Cơ sở dữ liệ u điể n hình có đầ y đủ cá c chuỗ i ký tự , chẳ ng hạ n như tê n, địa chỉ và thà nh phầ n.
Chuỗ i bạ n thự c sự muố n có thể là sự kế t hợ p củ a chuỗ i dữ liệ u, dấ u phụ , nghĩa đen
chuỗ i, v.v . Có lẽ bạ n muố n tạ o nhã n địa chỉ hoặ c lờ i chà o (ví dụ : " Họ thân yêu nhất"). SQL
cung cấ p mộ t loạ t cá c cơ chế để kế t hợ p và thao tá c cá c chuỗ i ký tự .

Nối chuỗi với ||


|| i Toá n tử (ghé p nố i) để xâ y dự ng mộ t chuỗ i mớ i từ mộ t tổ hợ p củ a xâ u
Chú ng tô i bắ t đầ u vớ
Expressions.
■ 3.3 Nguồ n gố c Thuộ c tính 53

Truy vấn Tạ o a gử i thư nhã n cho mỗ i cử a hà ng


3.8
CHỌN người quản lý, địa chỉ | | ' ' || | thành phố | ' ' || | tiểu bang | ' ' || .zip
|| ' Hoa Kỳ' dưới dạng
thư TỪ các cửa hàng;

giám đốc bưu điện


Greg Speegle · 2222 Đại lộ 2nd. Waco TX 76798-7356 Hoa Kỳ
Greg Donahoo · 4444 4th Blvd San Francsico CA 94101-4150 Hoa Kỳ
Jeff Donahoo · 1111 Main St. Waco TX 76798 Hoa Kỳ
Jeff Speegle · 3333 3rd St. Fargo ND 58106 Hoa Kỳ
Người đàn ông KHÔNG
Ager
[5 Hà ng(s)]

Có mộ t số điề u đá ng chú ý từ Truy vấ n 3.8:

1. Bạ n có thể sử dụ ng nghĩa đen chuỗ i trong danh sá ch SELECT mộ t mình hoặ c


trong concatena- tions.
2. Toá n tử nố i có thể lấ y cả nghĩa đen và cộ t. Trê n thự c tế , nó có bấ t kỳ biể u thứ c
nà o trả về (hoặ c có thể bị ép buộ c) mộ t chuỗ i.
3. Ghé p nố i vớ i NULL luô n là NULL.
4. Nố i chuỗ i khô ng thê m dấ u cá ch. Mọ i khoả ng cá ch phả i đượ c thê m rõ rà ng.
5. Bở i vì cá c chuỗ i CHAR loạ i đượ c đệ m vớ i cá c khoả ng trố ng ở cuố i, nố i vớ i cá c chuỗ i
như vậ y bao gồ m cá c khoả ng trố ng thừ a nà y. Xem khoả ng trắ ng giữ a mã zip và Hoa
Kỳ trong mộ t số hà ng.
6. VARCHARs khô ng đượ c đệ m vớ i khoả ng trắ ng ở cuố i; chú ng chỉ bao gồ m cá c ký tự
đượ c chỉ định rõ rà ng.

SUBSTRING: Lấy chuỗi trong chuỗi


SUBSTRING(<nguồn> FROM <start> [FOR <length>])

SUBSTRING trả về chuỗ i con từ chuỗ i <nguồ n>, starting từ ký tự ở vị trí <bắt đầu> (đá nh
số từ 1) và chứ a tố i đa <độ dài> ký tự . Cá c
<nguồn> có thể là bấ t kỳ biể u thứ c chuỗ i nà o. <start> và <length> có thể là bấ t kỳ số
nguyê n expres-sion nà o. Nế u <length> khô ng đượ c chỉ định, substring trả về tấ t cả cá c
ký tự từ <start> đế n cuố i <source>. Nếu chuỗ i <nguồ n> trố ng hoặ c nế u vị trí <bắt đầu>
nằ m ngoà i phầ n cuố i củ a chuỗ i <nguồn> , SUBSTRING trả về mộ t chuỗ i trố ng (độ dà i
bằ ng 0). Nế u bấ t kỳ para mé t nà o là NULL , substring trả về NULL.
54 Chương 3: Reshaping Kế t quả ■

Truy vấn CHUỖ I CON ví dụ


3.9
CHỌN SUBSTRING(repfname FROM 1 FOR 1) || '. ' || replname AS tên TỪ các nhà
cung cấp;

Tên
C. Ngô
Ông Milker
S. Sherbert ·
G. Nho
S. Sốt
G. Bản lề
[6 Hà ng(s)]

TRIM: Loại bỏ các ký tự đứng đầu và cuối không mong muốn


TRIM([[| ĐẦU | THEO SAU CẢ HAI] [<cắt ký tự>] TỪ] <nguồn>)

Hà m TRIM trả về <nguồn> sau khi loạ i bỏ chuỗ i con dà i nhấ t củ a chuỗ i dẫ n đầ u và /hoặ c
chuỗ i dấ u củ a các ký tự <cắt>. Cá c ký tự <nguồn> và <trim> có thể là bấ t kỳ biể u thứ c
chuỗ i nà o. Nếu LEADING, TRAILING hoặ c BOTH khô ng đượ c chỉ định, mặ c định là CẢ
HAI. Nếu
<cắt các ký tự> khô ng đượ c chỉ định, mặ c định là mộ t khoả ng trắ ng duy nhấ t. Nếu bấ t kỳ
tham số nà o là NULL , hà m TRIM trả về NULL.

Truy vấn HỚ T ví dụ
3.10
CHỌN THÀNH PHẦN RIÊ NG BIỆT, nhóm thực phẩm || '.' AS "with trailing", TRIM
(TRAILING ' ' ' từ nhóm thực phẩm) || '.' AS "không có dấu vết" TỪ các thành phần
TRONG ĐÓ hàng tồn kho > 500;

Thành phần với dấu vết không có dấu vết


PICKL Rau Rau
Nước xô-đa KHÔNG KHÔNG
[2 Hà ng(s)]

UPPER và LOWER: Kiểm soát trường hợp ký tự


LOWER(<nguồn>)
UPPER(<nguồn>)

Hà m LOWER trả về chuỗ i <nguồn> vớ i tấ t cả cá c ký tự chữ cá i đượ c thay đổ i thà nh chữ


thườ ng. Hà m UPPER trả về chuỗ i <nguồn> vớ i tấ t cả cá c ký tự chữ cá i đượ c thay đổ i thà nh
chữ hoa. <nguồn> có thể là bấ t kỳ biể u thứ c chuỗ i nà o. LOWER và UPPER khô ng thay đổ i
cá c ký tự nonalphabetic. Nếu <source> là NULL , UPPER và LOWER trả về NULL.
■ 3.3 Nguồ n gố c Thuộ c tính 55

Truy vấn THƯỢ NG và HẠ ví dụ


3.11
CHỌN UPPER (repfname | | ' ' || replname) AS rep, LOWER (tên cô ng ty) AS công ty TỪ các nhà

cung cấp WHERE referredby = 'VGRUS';

Rep công ty
MÁY VẮT SỮA Sữa của Don
MARLA
SHERMAN SHERBERT Kem có hương vị
·
[2 Hà ng(s)]

VỊ TRÍ: Tìm nơi bắt đầu một chuỗi con


VỊ TRÍ(<chuỗi con> TRONG <nguồn>)

Hà m POSITION trả về mộ t số đạ i diệ n cho vị trí ký tự (đá nh số từ 1) củ a ký tự đầ u tiên


củ a lầ n xuấ t hiệ n đầ u tiê n củ a <chuỗi con> trong <nguồn>. <nguồn> và <chuỗi con> có
thể là bấ t kỳ biể u thứ c chuỗ i nà o. Nế u <chuỗi con> khô ng xuấ t hiện trong <source>, hà m
POSITION trả về 0. Nế u <substring> hoặ c <source> là NULL , hà m POSITION trả về NULL.

Truy vấn VỊ TRÍ ví dụ


3.12
CHỌN tên , VỊ TRÍ ('Salad' TRONG tên) TỪ các
mục;

Tên vị trí
Salad gà 9

Salad trá i câ y 7

Salad vườ n 8

Salad thiên niên 12


kỷ
Nước xô-đa 0
Nước 0
Đĩa trá i câ y 0

[7 Hà ng(s)]

CHAR [ACTER] _LENGTH: Đếm các ký tự trong một chuỗi


CHARACTER_LENGTH(<nguồn>)

CHARACTER_LENGTH trả về số ký tự trong <nguồn>. <nguồn> có thể là bấ t kỳ biể u thứ c


56 Chương 3: Reshaping Kế t quả ■

chuỗ i nà o. Nế u <source> là NULL , CHARACTER_LENGTH trả về NULL. CHARACTER_LENGTH


có thể đượ c viế t tắ t là CHAR_LENGTH.
■ 3.3 Nguồ n gố c Thuộ c tính 57

Truy vấn CHARACTER_LENGTH ví dụ


3.13
SELECT tên, CHAR_LENGTH(tên) AS namelen, CHAR_LENGTH(foodgroup) AS fglen
FROM nguyên liệu;

Tên tênlen Fglen


·
Phó mát 6 15
Gà 7 15
Crouton 7 15
Nho 5 15
Rau diếp 7 15
Dưa 6 15
Mặc quần áo bí 15 KHÔNG
mậ t
Cà chua 6 15
Nước 5 KHÔNG
Nước xô-đa 4 KHÔNG
Dưa hấu 10 15
Cam 6 15
[12 hà ng (s)]

Kết hợp các hàm chuỗi


Cá c tham số cho cá c hà m chuỗ i khá c nhau có thể là bấ t kỳ biể u thứ c nà o trả về kiể u dữ liệ u
chính xá c . Cá c biểu thứ c như vậ y thậ m chí có thể bao gồ m cá c hà m chuỗ i khá c . Truy vấ n
3.14 là mộ t ví dụ com-plex để chỉ ra cá ch kết hợ p cá c hà m chuỗ i. Truy vấ n nà y trả về từ
đầ utiê n ở dạ ng chữ hoa củ a tê n cô ng ty nhiề u từ vớ i bấ t kỳ dấ u nhá y đơn nà o bị loạ i bỏ .
Cá c kết quả là trong tấ t cả cá c chữ hoa.

Truy vấn Kế t hợ p xâ u Chứ c nă ng


3.14
CHỌN vendorid, tên công ty, TRIM

(THEO SAU '''S' TỪ


TRIM (SUBSTRING (UPPER (tên công ty) TỪ 1 CHO
POSITION(' 'IN companyname)))) AS "CoName" TỪ các
nhà cung cấp;

vendorid tên công ty Tên đồng


VGRUS Veggies_R_Us
MÁY DNDRY Sữa của Don Mặc
Flvcr Kem có hương vị HƯƠNG VỊ
FRTFR · "Ăn trái cây " Bạn bè "TRÁI CÂY
EDDRS Băng của Ed Và
SPWTR Cấp nước suố i MÙA XUÂN

[6 Hà ng(s)]
58 Chương 3: Reshaping Kế t quả ■

Hã y thự c hiệ n từ ng bướ c nà y:



POSITION(' ' IN companyname) finds vị trí ký tự củ a sự xuấ t hiệ n đầ u tiê n củ a mộ t
khô ng gian. Hã y gọ i giá trị nà y là P. Đố i vớ i Ed's Dressing, P là 5.

Hà m UPPER(companyname) trả về tê n cô ng ty vớ i tấ t cả cá c ký tự chữ cá i đượ c
chuyể n đổ i thà nh chữ hoa. Hã y gọ i chuỗ i nà y là C. Đố i vớ i Ed's Dressing, C là ED'S
DRESSING.

SUBSTRING sau đó finds chuỗ i con trong C bắ t đầ u từ vị trí ký tự 1 và kết thú c ở vị trí
P, bao gồ m. Hã y gọ i đâ y là chuỗ i con S. Đố i vớ i Ed's Dressing, S là "ED'S ". Lưu ý khoả ng
trố ng ở cuố i.

TRIM bê n trong sau đó loạ i bỏ bấ t kỳ khoả ng trắ ng đầ u và cuố i nà o. Nếu tên cô ng ty
có khoả ng trắ ng, thì S có khoả ng trắ ng because S bao gồ m ký tự ở vị trí C, phả i là
dấ u cá ch. Nế u tê n cô ng ty khô ng có khoả ng trắ ng, thì P là 0 và S là chuỗ i trố ng.
Hã y gọ i chuỗ i con nà y là T. Đố i vớ i Ed's Dressing, T là ED'S. Lưu ý rằ ng khoả ng
trố ng ở cuố i đã bị xó a.

Cuố i cù ng, TRIM bê n ngoà i loạ i bỏ bấ t kỳ sự xuấ t hiệ n theo sau nà o củ a chuỗ i 'S. Lưu ý
rằ ng chú ng tô i phả i trích dẫ n trích dẫ n duy nhấ t ('). Đố i vớ i Ed's Dressing, giá trị nal
fi nà y là ED.

Điề u gì đã xả y ra vớ i Veggies_R_Us? Hã y nhớ lạ i rằ ng hà m POSITION trả về 0 nế u nó


khô ng thể tìm thấ y chuỗ i con. Cho <độ dài> bằ ng 0, SUBSTRING trả về mộ t chuỗ i trố ng.
DBMS củ a bạ n có thể sẽ có cá c chứ c nă ng thao tá c chuỗ i khá c. Tiê u chuẩ n SQL mô
tả mộ t và i chứ c nă ng thao tá c chuỗ i khá c, khô ng đượ c triể n khai rộ ng rã i. Cá c chứ c nă ng
như vậ y bao gồ m OVERLAY (substituting substrings), CONVERT (thay đổ i ký tự enmã hó a)
và TRANSLATE (á nh xạ giữ a cá c bộ ký tự ).

3.3.3 Thời
Thờ i gian khô ng phả i là khá i niệ m đơn giả n. Để đố i phó vớ i sự phứ c tạ p nà y, SQL cung cấ p
mộ t loạ t cá c cô ng nghệ để hoạ t độ ng trê n cá c kiể u dữ liệ u tạ m thờ i. Thậ t khô ng may, cá c loạ i
thờ i gian và số họ c khô ng đượ c hỗ trợ bở i tấ t cả cá c DBMS. Tham khả o tà i liệ u củ a bạ n để
biết cá c giớ i hạ n và cú phá p chính xá c củ a hệ thố ng củ a bạ n.

Tìm ngày hoặc giờ hiện tại


Hã y bắ t đầ u vớ i câ u hỏ i cơ bả n: "Bâ y giờ là mấ y giờ ?" SQL cung cấ p mộ t số chứ c nă ng để
giú p bạ n tìm hiể u.

Mô tả chức năng tạ m thờ i Loại trả về

CURRENT_TIME[(độ chính xác)]Thờ i gian hiệ n tạ i theo thờ i THỜ I GIAN VỚ I MÚ I GIỜ
gian
Dịch chuyể n vù ng
CURRENT_DATE Ngà y hiệ n tạ i
CURRENT_TIMESTAMP[(chính xá c)] Ngà y và giờ hiệ n tạ i vớ i DẤ U THỜ I GIAN VỚ I MÚ I GIỜ
Dịch chuyể n mú i giờ
LOCALTIME[(precision)]Thờ i gian hiệ n tại KHÔ NG CÓ MÚ I GIỜ LOCALTIMESTAMPU[ (PRECISION)
■ 3.3 Nguồ n gố c Thuộ c tính 59
]Dấ u thờ i gian ngà y hiện tạ i
KHÔ NG CÓ MÚ I GIỜ
60 Chương 3: Reshaping Kế t quả ■

Đố i số chính xá c tù y chọ n chỉ định độ chính xá c giâ y phâ n số . LOCALTIME và


LOCALTIMESTAMP khô ng đượ c triển khai rộ ng rã i.

Sử dụng toán tử số học với các loại thời gian


SQL cho phé p sử dụ ng cá c toá n tử số họ c cơ bả n vớ i cá c kiểu dữ liệ u thờ i gian. Ví dụ : bạ n có
thể muố n biế t ngà y 3 ngà y kể từ bâ y giờ . Để có đượ c điề u đó , bạ n có thể thê m ngà y hiệ n
tạ i và o khoả ng thờ i gian 3 ngà y. Tấ t nhiê n, khô ng phả i tấ t cả cá c phé p toá n số họ c đề u có ý
nghĩa vớ i dữ liệ u thờ i gian. Ví dụ : chia mộ t ngà y cho mộ t khoả ng thờ i gian khô ng có ý nghĩa
gì nê n SQL khô ng cho phép . Dướ i đâ y là cá c hoạ t độ ng đượ c phép và cá c loạ i dữ liệ u
resulting:

Mức ưu tiên kiểu kết quả biểu thứ c


Khoả ng thờ i gian * / Số khoả ng
Cao nhấ t
cá ch số * Khoả ng thờ i gian

Ngà y giờ + - Khoả ng thờ i Thấ p nhấ t


gian ngà y giờ + Ngà ythờ i gian
ngà y giờ ngà y giờ - Khoả ng
thờ i gian ngà y giờ + - Khoả ng

thờ i
gian khoả ng thờ i gian
Bả ng khô ng bao gồ m tấ t cả cá c hạ n chế . Cá c hoạ t độ ng phả i có ý nghĩa. Việ c trừ giá trị
DATE khỏ i giá trị TIME khô ng có ý nghĩa gì nê n SQL khô ng cho phé p. Hã y xem mộ t ví
dụ .

Truy vấn Tìm xem mỗ i mó n đã có trong thự c đơn bao lâ u kể từ nử a đê m thá ng Giêng 2, 2005
3.15
SELECT name, dateadded, DATE '2005-01-02' - dateadded AS "Days on Menu" FROM
items;

Tên ngàythêm Ngày trên thực


đơn
Salad gà 1998-11-13 2242

Salad trá i câ y 2000-05-06 1702

Salad vườ n 2001-03-02 1402

Salad thiên niên 2002-08-16 870


kỷ
Nước xô-đa 2003-02-06 696
Nước 2002-05-19 959
Đĩa trá i câ y 2000-09-02 1583
■ 3.3 Nguồ n gố c Thuộ c tính 61
[7 Hà ng(s)]

Theo đặ c tả SQL 2003, việc trừ hai ngà y sẽ dẫ n đế n mộ t khoả ng thờ i gian. Đương
nhiê n, đâ y phả i là khoả ng thờ i gian NGÀ Y - GIỜ , nế u khô ng độ chính xá c sẽ bị mấ t. Vì
khô ng có dữ liệu thờ i gian, DBMS củ a chú ng tô i đã chọ n biể u diễ n kết quả dướ i dạ ng mộ t
số ngà y. DBMS củ a bạ n có thể khá c.
62 Chương 3: Reshaping Kế t quả ■

EXTRACT: Lấy các trường từ dữ liệu tạm thời


Dữ liệu ngà y giờ và khoả ng thờ i gian đượ c tạ o thà nh từ cá c fi elds như nă m, thá ng, v.v.
EXTRACT nhậ n đượ c mộ t eld fi đượ c chỉ định từ dữ liệu thờ i gian.

EXTRACT(<nhãn trường> TỪ <nguồn>)

Hà m EXTRACT trả về mộ t giá trị số đạ i diệ n cho fi eld đượ c xá c định bở i <nhãn trường >
từ <nguồn>. <nguồn> là bấ t kỳ biể u thứ c nà o trả về ngà y giờ hoặ c khoả ng thờ i gian, và
<nhãn trường> phả i là NĂ M, THÁ NG, NGÀ Y, GIỜ , PHÚ T, GIÂ Y , TIMEZONE_HOUR hoặ c
TIMEZONE_MINUTE. Nếu <source> hoặ c <field label> là NULL, thì hà m EXTRACT trả về null.
Truy vấn TRÍCH ví dụ
3.16
CHỌN tên, TRÍCH XUẤT (NĂM từ ngàythêm vào) AS năm,
TRÍCH XUẤT (THÁNG TỪ dateadded + INTERVAL '30' DAY) AS
tháng
TỪ các mặt hàng;

Tên năm tháng


Salad gà 1998 12

Salad trá i câ y 2000 6

Salad vườ n 2001 4

Salad thiên niên 2002 9


kỷ
Nước xô-đa 2003 3
Nước 2002 6
Đĩa trá i câ y 2000 10

[7 Hà ng(s)]

DBMS củ a bạ n có thể sẽ chỉ định cá c hà m thờ i gian khá c. Cá c hà m thờ i gian tiêu chuẩ n
SQL khá c bao gồ m OVERLAPS (kiể m tra nế u hai khoả ng thờ i gian giao nhau) và ABS (trả
về giá trị tuyệt đố i củ a mộ t khoả ng thờ i gian); tuy nhiê n, cá c chứ c nă ng nà y khô ng đượ c
triể n khai rộ ng rã i.

3.3.4 B inary
Cá c kiểu dữ liệ u nhị phâ n đượ c gọ i là chuỗ i nhị phân vì SQL coi chú ng như mộ t chuỗ i 0 và
1. Hầ u hết (nhưng khô ng phả i tấ t cả ) nhữ ng điề u bạ n có thể là m vớ i chuỗ i ký tự , bạ n có
thể là m vớ i mộ t chuỗ i nhị phâ n sử dụ ng cù ng cá c toá n tử và hà m, bao gồ m ghé p nố i,
cắ t tỉa (sử dụ ng giá trị thậ p lụ c phâ n X'00' là m ký tự cắ t mặ c định), sử dụ ng cá c dấ u phụ
và sử dụ ng LIKE. Truy vấ n 3.17 là mộ t ví dụ chuỗ i nhị phâ n đơn giả n.

Truy vấn Nhị phâ n xâ u ví dụ


3.17
CHỌN CHUỖI CON (X'F0' TỪ 3) || B'11' AS bit
TỪ cửa hàng
NƠI STOREID THÍCH '#%';

Bit
11000011
■ 3.3 Nguồ n gố c Thuộ c tính 63
[1 Hà ng(s)]
64 Chương 3: Reshaping Kế t quả ■

Mộ t trong nhữ ng điể m khá c biệ t giữ a chuỗ i ký tự và chuỗ i nhị phâ n là nhị phâ n Dâ y
có thể chỉ là So vớ i Sử dụ ng và <>; So
= sá nh vớ i > và < là khô ng Cho phé p. Chuỗ i nhị phâ n
cũ ng khô ng thể theo DISTINCT hoặ c xuấ t hiệ n trong mệ nh đề ORDER BY (xem Phầ n 3.5)
hoặ c trong nhiề u Khá c __________ Phầ n củ a .SQL đó chú ng ta thả o luậ n Sau đó . Nế u mà y
cầ n đế n dù ng nhị phâ n Dâ y tham khả o củ a bạ n DBMS tư liệ u.

3.4 Tính toán trong mệnh đề WHERE

Tính hữ u ích củ a cá c kho toá n tử và hà m mạ nh mẽ củ a SQL khô ng chỉ dừ ng lạ i ở cá c giá


trị cộ t dẫ n xuấ t. Bạ n có thể sử dụ ng cá c chứ c nă ng nà y trong cá c vị ngữ trong mệ nh đề
WHERE.

Tìm tê n và giá trị hà ng tồ n kho củ a cá c thà nh phầ n vớ i mộ t giá trị hà ng tồ n kho là $


Truy vấn
10 hoặ c nhiề u hơn
3.18

CHỌN tên, hàng tồn kho * unitprice AS "invalue" TỪ thành


phần
WHERE hàng tồn kho * đơn giá > 10;

Tên giá trị


Gà 54.00
Dưa 32.00
Nước xô- 3450.00
đa
[3 hà ng(s)]

SQL xử lý câ u lệ nh nà y như thế nà o? Đầ u tiê n nó đượ c chỉ định bả ng, thành phần. Tiế p theo
nó đá nh giá vị ngữ cho mỗ i hà ng. Cuố i cù ng, nó đá nh giá cá c biể u thứ c trong danh sá ch
SELECT. Mộ t hệ quả tinh tế củ a thứ tự thự c thi nà y là bạ n khô ng thể sử dụ ng bí danh cộ t
trong mệnh đề WHERE. Tạ i sao? Mệ nh đề WHERE đượ c đá nh giá trước danh sá ch SELECT
để bí danh cộ t khô ng tồ n tạ i khi WHERE thự c thi. Việ c thay thế lớ p WHERE trong Truy vấn
3.18 bằ ng giá trị WHERE > 10 có thể trả về lỗ i.
Hã y xem xét Truy vấ n 3.19. Ở đâ y chú ng tô i đang tìm kiế m mộ t nhà cung cấ p cụ
thể , S. Sauce. Bạ n có thể đượ c cung cấ p mộ t chuỗ i như vậ y bở i mộ t số chương trình ứ ng
dụ ng. Vấ n đề là chú ng ta khô ng biế t trườ ng hợ p củ a cá c tê n trong cơ sở dữ liệ u hoặ c độ
nhạ y chữ hoa chữ thườ ng củ a đố i sá nh chuỗ i. Để fix điều nà y, chú ng tô i chỉ cầ n thay đổ i
tấ t cả cá c tê n thà nh chữ hoa và định dạ ng chú ng mộ t cá ch chính xá c (họ và tê n đầ u tiê n
).
■ 3.5 TRẬ T TỰ Bằ ng cá ch: Hoặ cChuô ng Kế t quả Bà n Đi
ngang 61

Truy vấn Tìm thấ y cá c Đạ i lý vớ i cá c Tê n S. Nướ c xố t


3.19
CHỌN repfname | | ' ' || replname AS name, tên công ty TỪ các nhà
cung cấp
TRONG ĐÓ UPPER(SUBSTRING(repfname FROM 1 FOR 1) || '. ' || replname) =

UPPER('S. Nước sốt');

Tên tên công ty


Sốt Sam Băng của Ed
[1 Hà ng(s)]

3.5 ĐẶT HÀNG THEO: Đặt hàng kết quả bảng Traversal
Cá c hà ng trong bả ng trong mô hình quan hệ khô ng có thứ tự . Bở i vì kế t quả củ a mộ t SELECT
tự nó là mộ t bả ng, kế t quả truy vấ n cũ ng khô ng có thứ tự . Khô ng bao giờ dự a và o DBMS để
tạ o ra kết quả theo bấ t kỳ thứ tự cụ thể nà o, ngay cả khi nó có vẻ hoạ t độ ng. Mặ c dù mộ t
bả ng khô ng có thứ tự , SQL sẽ cho phé p chú ng tô i kiể m soá t thứ tự mà chú ng tô i truy cậ p
cá c hà ng củ a bả ng bằ ng cá ch sử dụ ng THỨ TỰ THEO. Để sử dụ ng ORDER BY, chú ng tô i chỉ
định (cá c) khó a sắ p xếp mà SQL nê n sử dụ ng để sắ p xế p đầ u ra result.
SẮP XẾP THEO <đặ c tả sắ p xếp> [{, <đặc tả sắp xếp>}... ]
<sort specification> = <biểu thức phím> [ASC | DESC] [NULLS | ĐẦU NULLS CUỐI CÙNG]

Hã y thử mộ t ví dụ đơn giả n.

Truy vấn Tìm tấ t cả cá c mụ c từ ít nhấ t đế n hầ u hế t đắ t


3,20
CHỌN tên, giá TỪ các
mặt hàng
ĐẶT HÀNG THEO ASC giá ;

Tên giá
Nước 0.00
Salad vườ n 0.99
Nước xô-đa 0.99
Salad gà 2.85

Salad trá i câ y 3.45

Đĩa trá i câ y 3.99

Salad thiên niên KHÔNG


kỷ
[7 Hà ng(s)]

Truy vấ n nà y tìm nạ p tê n và giá củ a từ ng mụ c và sau đó trình bà y kết quả theo thứ tự đượ c
sắ p xế p theo giá . Việc sắ p xế p thứ tự phụ thuộ c và o loạ i dữ liệ u. Đố i vớ i cá c loạ i số , việ c sắ p
xế p thứ tự rấ t đơn giả n. Sắ p xếp thứ tự chuỗ i ký tự tuâ n theo cá c quy tắ c tương tự như chuỗ i
ký tự com- parison (xem Chương 2). Thứ tự mặ c định đang tă ng dầ n. Bạ n kiể m soá t hướ ng
đặ t hà ng bằ ng cá ch sử dụ ng ASC (tă ng dầ n) hoặ c DESC (giả m dầ n).
62 Chương 3: Reshaping Kế t quả ■

Lưu ý vị trí củ a NULL khé t tiế ng theo thứ tự sắ p xế p. Bở i vì NULL khô ng thể so sá nh
vớ i bấ t kỳ giá trị nà o khá c, ngay cả bả n thâ n nó , thứ tự mặ c định củ a cá c giá trị NULL là
dà nh riê ng cho DBMS. Bạ n có thể chỉ định vị trí củ a NULL theo thứ tự sắ p xế p bằ ng cá ch
sử dụ ng NULLS FIRST hoặ c NULLS LAST. Thậ t khô ng may, tính nă ng nà y khô ng đượ c
triể n khai rộ ng rã i.

Truy vấn Tìm thấ y Mụ c Thê m trong 2001 hoặ c Sau đó trong Giả m trậ t tự củ a giá
3,21
CHỌN itemid, giá TỪ các
mặt hàng
TRONG ĐÓ TRÍCH XUẤT (NĂ M kể từ ngày thêm vào)
> = ĐƠN ĐẶT HÀNG NĂM 2001 THEO DESC giá;

itemid giá
MILSD KHÔNG
GDNSD 0.99
Nước xô- 0.99
đa
NƯỚC 0.00
[4 hà ng(s)]

Trong Truy vấ n 3.21, SQL đá nh giá truy vấ n bằ ng cá ch tìm nạ p bả ng mụ c, á p dụ ng vị ngữ


WHERE, trích xuấ t ID mụ c và sắ p xế p theo giá . SQL khô ng yê u cầ u khó a sắ p xếp phả i có
trong danh sá ch chọ n.
ORDER BY có bấ t kỳ biể u thứ c nà o. Ví dụ : chú ng tô i có thể sắ p xế p cá c thà nh phầ n
củ a mình theo giá trị hà ng tồ n kho đượ c tính toá n. Chú ng tô i thậ m chí có thể sử dụ ng bí
danh cộ t trong THỨ TỰ THEO.

Truy vấn Tìm thấ y cá c Tê n và Kho giá trị củ a tấ t cả Nguyê n liệ u Lệ nh bằ ng cá ch giá trị
3,22
SELECT tên, hàng tồn kho * đơn giá AS giá trị TỪ
thành phần
ĐẶT HÀNG THEO GIÁ TRỊ DESC;

Tên giá trị


Nước KHÔNG
Dưa hấu KHÔNG
Nước xô-đa 3450.00
Gà 54.00
Dưa 32.00
Phó mát 4.50
Crouton 4.00
Mặc quần áo bí 3.60
mậ t
Nho 3.00
Rau diếp 2.00
Cam 0.50
Cà chua 0.45
■ 3.5 TRẬ T TỰ Bằ ng cá ch: Hoặ cChuô ng Kế t quả Bà n Đi
[12 hà ng (s)] ngang 63
64 Chương 3: Reshaping Kế t quả ■

Bạ n có thể chỉ định nhiề u phím sắ p xế p. SQL sắ p xế p chủ yế u theo phím đầ u tiê n
trong danh sách THỨ TỰ THEO. Khó a thứ hai chỉ đượ c sử dụ ng để phá vỡ cá c mố i quan
hệ cho cá c hà ng có giá trị khó a đầ u tiê n khớ p vớ i nhau, v.v. Tấ t nhiê n, nếu tấ t cả cá c giá
trị củ a khó a sắ p xế p đầ u tiê n là khá c biệ t, thì việ c chỉ định cá c khó a sắ p xế p bổ sung sẽ
khô ng là m gì cả .

Truy vấn Tìm thấ y cá c trậ t tự số dò ng số và khoả n Id Lệ nh tạ i #2STR, cuố i cù ng trậ t tự fiRST
3.23
SELECT ordernumber, linenumber, menuitemid FROM
đơn đặt hàng
WHERE storeid = '#2STR'
ĐẶT HÀNG THEO ORDERNUMBER DESC, linenumber ASC;

số đơn đặt số dòng menuitemid


hàng
3 1 CHKSD
3 2 FRPLT
3 3 GDNSD
2 1 CHKSD
2 2 Nước xô-đa
1 1 CKSDS
1 2 CHKSD
1 3 Nước xô-đa
1 4 GDNSD
[9 hà ng (s)]

Chú ng tô i thự c sự khô ng cầ n chỉ định ASC sau số dòng vì thứ tự tă ng dầ n là mặ c định.
Nhiề u DBMS cũ ng cho phé p đặ c tả củ a khó a sắ p xế p theo số vị trí củ a thuộ c tính
trong danh sá ch chọ n. Cá c thuộ c tính trong danh sá ch chọ n đượ c đá nh số bắ t đầ u bằ ng
1. Chú ng ta có thể tham khả o cá c số vị trí nà y trong mệ nh đề THỨ TỰ THEO. Xem xé t
Truy vấ n 3.24.

Truy vấn Vị trí TRẬ T TỰ Bằ ng cá ch ví dụ


3.24
CHỌN nhóm thực phẩm, tên, đơn giá * hàng tồn kho AS giá trị TỪ các
thành phần
ĐẶT HÀ NG THEO 1 ASC, 3 DESC;

nhóm thực Tên giá trị


phẩm
Bánh mì Crouton 4.00
Trái Dưa hấu KHÔNG
Trái Nho 3.00
Trái Cam 0.50
Trái Cà chua 0.45
Thịt Gà 54.00
Tiế p tụ c ở trang tiế p theo
■ 3.5 TRẬ T TỰ Bằ ng cá ch: Hoặ cChuô ng Kế t quả Bà n Đi
ngang 65

Truy vấn (tiếp tụ c)


3.24
Sữa Phó mát 4.50
Rau Dưa 32.00
Rau Rau diếp 2.00
KHÔNG Nước KHÔNG
KHÔNG Nước xô-đa 3450.00
KHÔNG Mặc quần áo bí 3.60
mậ t
[12 hà ng (s)]

Kế t quả đượ c sắ p xế p chủ yế u theo nhó m thự c phẩ m theo thứ tự tă ng dầ n và thứ hai
theo giá trị hà ng tồ n kho (tứ c là đơn giá * hàng tồn kho) theo thứ tự giả m dầ n. Bạ n có
thể kết hợ p cá c biể u thứ c phím sắ p xế p và số vị trí. Số cộ t vị trí thuậ n tiệ n cho cá c cô ng cụ
SQL dự a trê n giao diệ n ngườ i dù ng gr aph- ical (GUI) cầ n sắ p xế p trê n cá c cộ t kết quả
tù y ý, nhưng trong cá c trườ ng hợ p khá c, số thuộ c tính vị trí hầ u như luô n là mộ t ý tưở ng
tồ i. Thê m mộ t thuộ c tính và o danh sá ch chọ n có thể thay đổ i vị trí tương đố i củ a cá c
thuộ c tính và devel- oper có thể quê n cậ p nhậ t mệ nh đề THỨ TỰ THEO. Do đó , số
thuộ c tính vị trí đã khô ng cò n đượ c dù ng trong SQL-92 nên khô ng nê n sử dụ ng chú ng.

3.6 CAST: Chuyển đổi loại dữ liệu


Trong SQL, tấ t cả dữ liệ u đề u có mộ t loạ i, cho dù đó là dữ liệu trong bả ng hay dữ liệ u
đượ c trả về bở i mộ t số biể u thứ c. Đô i khi loạ i dữ liệ u cầ n phả i thay đổ i. Xem xé t Truy
vấ n 3.25.

Truy vấn Kiể u né m ví dụ


3.25
CHỌN || tên ' đã được thêm vào ' || ngàythêm || ' và là ' || giá như tin nhắn TỪ các mặt hàng;

thông điệp
Salad gà đã được thêm vào ngày 13 tháng 11 năm 1998 và là
2,85
Salad trá i câ y đã được thêm vào ngày 6 tháng 5 năm 2000 và
là 3,45
Garden Salad đã được thêm vào ngày 2 tháng 3 năm 2001 và là
0,99
KHÔNG
Soda đã được thêm vào ngày 6 tháng 2 năm 2003 và là 0,99
Nước đã được thêm vào ngày 19 tháng 5 năm 2002 và là 0,00
Fruit Plate đã được thêm vào ngày 2 tháng 9 năm 2000 và là 3,99
[7 Hà ng(s)]

Ở đâ y, dateadded và price fields phả i đượ c chuyể n đổ i thà nh chuỗ i ký tự cho quố c gia
concate. Trong nhiề u trườ ng hợ p, DBMS â m thầ m chuyể n đổ i cá c loạ i dữ liệ u. Chuyển đổ i
66 Chương 3: Reshaping Kế t quả ■

như vậ y đượ c gọ i là chuyển đổi loại ngầm. SQL sử dụ ng ngữ cả nh để xá c định loạ i cầ n thiế t.
Trong trang

3.6 CAST: Chuyể n đổ i loạ i dữ liệ u 65

Ví dụ trướ c, StrinG Concatenation ngụ ý rằ ng Dateadded và Price phả i đượ c chuyể n đổ i


thà nh chuỗ i ký tự .
Trong mộ t số trườ ng hợ p, DBMS cầ n trợ giú p trong việ c xá c định loạ i dữ liệu chính
xá c. Để han- dle nà y, SQL cung cấ p toá n tử CAST, cho phé p đặ c tả củ a kiểu dữ liệ u kết quả .

CAST(biểu thức nguồn <> AS <loại kết quả>)

CAST chuyể n đổ i loạ i dữ liệ u đượ c chỉ định bở i biểu thức nguồn <> thà nh <loại kết quả
>. Chuyể n đổ i bằ ng toá n tử CAST đượ c gọ i là chuyển đổi loại rõ ràng. Xin lưu ý rằ ng việ c
chuyể n đổ i loạ i dữ liệu có thể dẫ n đến mấ t dữ liệ u. Điề u nà y xả y ra khi loạ i kế t quả gử i lạ i ít
thô ng tin hơn dữ liệ u nguồ n. Ví dụ : chuyể n đổ i từ điểm phâ n tích fl sang số nguyê n dẫ n
đế n cắ t bớ t hoặ c là m trò n, tù y thuộ c và o DBMS củ a bạ n. Tuy nhiên, nế u việ c chuyể n đổ i sẽ
dẫ n đế n việc mấ t cá c chữ số có nghĩa ở đầ u, thì mộ t ngoạ i lệ sẽ đượ c nê u ra. Tương tự ,
chuyể n đổ i từ TIMESTAMP sang DATE sẽ mấ t thô ng tin thờ i gian. Điề u gì xả y ra khi loạ i
kế t quả có độ chính xá c cao hơn dữ liệ u nguồ n? Đố i vớ i cá c loạ i số , nó đơn giả n. Trong mộ t
số trườ ng hợ p, SQL thự c sự tạ o nê n dữ liệ u. Đố i vớ i exam-ple, khi chuyể n đổ i từ DATE
sang TIMET AMP, thờ i gian đượ c đặ t thà nh 00:00 :00.0. Mộ t số loạ i chuyể n đổ i khô ng đượ c
phé p, ngay cả vớ i toá n tử CAST. Ví dụ : SQL sẽ cung cấ p cho bạ n mộ t lỗ i nếu bạ n cố gắ ng
truyề n mộ t boolean sang mộ t loạ i số . Truy vấ n 3.26 tạ o ra mộ t cá ch gọ n gà ng
menu đượ c định dạ ng và sử dụ ng CAST trong mệ nh đề WHERE.

Truy vấn Định dạ ng thự c đơn


3,26
CHỌN CAST (tên AS CHAR (20)) || '$' || CAST (giá AS NUMERIC (5,2)) AS "Menu"
TỪ các mục menu
TRONG ĐÓ CAST (MENUITEMID LÀ CHAR (1)) TRONG ('S', 'C', 'V');

Thực đơn
Salad gà 2,85 đô la
Gà N Suds 3,68 đô la
Nước xô-đa 0,99 đô la
Eatin thuần chay ' 4,38 đô la
[4 hà ng(s)]

Dà n diễn viê n tên cho CART (20) tạ o thà nh mộ t chuỗ i ký tự có chiề u rộ ng x xed. Chuỗ i ký tự
dà i hơn 20 ký tự bị cắ t bớ t và chuỗ i ký tự ngắ n hơn 20 ký tự đượ c đệ m bằ ng dấ u cá ch. Bạ n
cũ ng có thể sử dụ ng CAST trong mệ nh đề ĐẶ T HÀ NG THEO. Chỉ cầ n đừ ng quê n rằ ng thứ tự
sắ p xếp phụ thuộ c và o loạ i dữ liệ u.
66 Chương 3: Reshaping Kế t quả ■

Truy vấn Số như Ký tự ví dụ


3.27
SELECT tên, giá * 10 AS "giá cao" TỪ các mục
menu
ĐẶT HÀNG THEO DIỄN VIÊN (giá * 10 DƯỚI DẠNG CHAR (7));

Tên giá cao


Nước 0.00
Salad gà 28.50

Salad trá i câ y 34.50


Gà N Suds 36.80
Đĩa trá i câ y 39.90
Eatin thuần chay ' 43.80
Salad vườ n 9.90
Nước xô-đa 9.90
Salad thiên niên KHÔNG
kỷ
[9 hà ng (s)]

3.7 CASE, COALESCE và NULLIF: Biểu thức có điều kiện


SQL cũ ng cung cấ p cá c cấ u trú c điề u kiệ n cơ bả n để xá c định kết quả chính xá c. CASE
cung cấ p mộ t cơ chế chung để chỉ định kết quả có điề u kiệ n. SQL cũ ng cung cấ p cá c câ u
lệ nh COALESCE và NULLIF để xử lý cá c giá trị NULL, nhưng chú ng có cá c câ u lệ nh CASE
tương đương.

3.7.1 CASE: Danh sách Giá trị


Dạ ng đơn giả n nhấ t củ a câ u lệ nh CASE xá c định xem mộ t giá trị có khớ p vớ i bấ t kỳ giá trị
nà o từ danh sá ch hay khô ng và trả về kế t quả tương ứ ng.
CASE < biểu thức đích>
WHEN <biểu thức ứng cử viên> THEN <biểu thức kết quả>
WHEN <biểu thức ứng cử viên> THEN <biểu thức kết quả>
...
WHEN <biểu thức ứng cử viên> THEN <biểu thức kết quả>
[ELSE <biểu thức kết quả>]
Kết thúc

CASE tìm mệ nh đề WHENđầu tiên trong đó <biểu thứ c ứ ng cử viên> = <biểu thứ c
đích> và trả về giá trị củ a biể u thức <kết quả> tương ứ ng. Nếu khô ng tìm thấ y kế t quả
khớ p, giá trị củ a biểu thức <kết quả> cho mệ nh đề ELSE đượ c trả về . Nếu mệ nh đề ELSE
khô ng đượ c chỉ định, mộ t ELSE NULL ngầ m sẽ đượ c thê m và o câ u lệ nh CASE.
Consider trườ ng hợ p bạ n muố n liệt kê các thà nh phầ n và độ ngon tương ứ ng củ a
chú ng theo quyế t định củ a nhó m thự c phẩ m. Nhữ ng chỉ định về lò ng tố t như sau: Rau
■ 3.7 TRƯỜ NG HỢ P LIÊ N HIỆ P và NULLIF: Điề u kiệ n Expressions 67

và Trá i câ y là tố t, Sữ a và Bá nh mì đượ c chấ p nhậ n, Thịt là xấ u và bấ t kỳ giá trị nà o khá c là NULL,


đạ i diệ n cho mộ t giá trị khô ng xá c định.

Truy vấn Trườ ng hợ p giá trị danh sá ch ví dụ


3,28
CHỌN tên,
Nhóm thực phẩm CASE
KHI 'Rau' THÌ 'Tố t' KHI 'Trái cây'

THÌ ' Tốt'


KHI 'Sữa' THÌ 'Chấp nhận được' KHI '

Bánh mì' THÌ 'Chấp nhận được' KHI

'Thịt' THÌ ' Xấu'


END AS chất
lượng TỪ các thành
phần;

Tên chất lượng


Phó mát Chấp nhận
Gà Tồi
Crouton Chấp nhận
Nho Tốt
Rau diếp Tốt
Dưa Tốt
Mặc quần áo bí KHÔNG
mậ t
Cà chua Tốt
Nước KHÔNG
Nước xô-đa KHÔNG
Dưa hấu Tốt
Cam Tốt
[12 hà ng (s)]

3.7.2 CASE: Danh sách có điều kiện


Kế t hợ p cá c giá trị từ danh sá ch là mộ t khở i đầ u tố t, nhưng chú ng ta có thể cầ n cá c capa-
bilities phù hợ p mạ nh mẽ hơn. SQL cung cấ p mộ t phiên bả n tổ ng quá t hơn củ a câ u lệ nh
CASE cho phé p cá c điề u kiện trong mệ nh đề WHEN.
Trường hợp
WHEN <match conditional> THEN <biểu thức kết quả>
WHEN <match conditional> THEN <biểu thức kết quả>
...
WHEN <match conditional> THEN <biểu thức kết quả>
[ELSE <biểu thức kết quả>]
Kết thúc
68 Chương 3: Reshaping Kế t quả ■

Trong hình thứ c có điều kiện nà y, CASE fi nds mệ nh đề first WHEN trong đó <khớp có điều kiện>
đá nh giá là true và trả về giá trị củ a biểu thứ c <result> tương ứ ng. Cá c
■ 3.7 TRƯỜ NG HỢ P LIÊ N HIỆ P và NULLIF: Điề u kiệ n Expressions 69

<khớp có điều kiện> có thể là bấ t kỳ biể u thứ c có điều kiệ n nà o bằ ng cá ch sử dụ ng biể u


thứ c, hàm, liê n kết boolean, v.v. Lưu ý rằ ng CASE danh sá ch giá trị chỉ là mộ t trườ ng
hợ p đặ c biệ t củ a CASE có điều kiện trong đó mỗ i <khớp có điề u kiệ n> có dạ ng <biểu
thức đích> =
<biểu hiện ứ ng cử viên>.
Để cho thấ y sứ c mạ nh củ a tuyê n bố CASE, chú ng ta hã y đặ t hà ng cho cá c thà nh
phầ n. Số tiề n mà chú ng tô i muố n đặ t hà ng dự a trê n hà ng tồ n kho hiệ n tạ i. Nế u khoả ng
khô ng quả ng cá o đó dướ i ngưỡ ng, chú ng tô i muố n đặ t hà ng để nâ ng lê n ngưỡ ng; nếu
khô ng, chú ng tô i muố n đặ t hà ng mộ t tỷ lệ phầ n tră m hà ng tồ n kho củ a chú ng tô i. Số
lượ ng chính xá c dự a trê n loạ i mặ t hà ng thự c phẩ m vì mộ t số sẽ hư hỏ ng nhanh hơn
nhữ ng mặ t hà ng khá c. Mộ t truy vấ n để tạ o thứ tự là Truy vấ n 3.29.

Truy vấn Trườ ng hợ p Điề u kiệ n danh sá ch ví dụ


3,29
CHỌN TÊN,
TẦNG(
Trường hợp
KHI hàng tồn kho < 20 THÌ 20 - hàng tồn kho
KHI nhóm thực phẩm = 'Sữa' THÌ hàng tồn kho * 0,05
WHEN foodgroup IN ('Thịt', ' Bánh mì') THEN hàng tồn kho * 0.10
WHEN foodgroup = 'Vegetable' AND unitprice <= 0.03 THEN inventory * 0.10 WHEN

foodgroup = ' Vegetable' THEN inventory * 0.03

WHEN foodgroup = 'Fruit' THEN inventory * 0.04


WHEN foodgroup IS NULL THEN inventory * 0.07 ELSE 0
KẾT THÚC) AS kích thước,
vendorid TỪ các thành phần
TRONG ĐÓ hàng tồn kho < 1000 VÀ vendorid KHÔNG PHẢI LÀ
ĐƠN ĐẶT HÀNG NULL theo vendorid, kích thước;

Tên kích vendorid


thướ
c
Phó mát 7 MÁY DNDRY
Gà 12 MÁY DNDRY
Crouton 40 EDDRS
Cam 10 FRTFR ·
Nho 12 FRTFR ·
Cà chua 5 VGRUS
Rau diếp 20 VGRUS
Dưa 24 VGRUS
[8 Hà ng(s)]

Có mộ t số điề u cầ n lưu ý về truy vấ n nà y.



Câ u lệ nh CASE ngừ ng thự c thi khi điều kiệ n đầ u tiê n đượ c khớ p. Điề u nà y là m cho
thứ tự củ a <điều kiện trận đấu> rấ t quan trọ ng.
70 Chương 3: Reshaping Kế t quả ■


Cá c hằ ng số đượ c sử dụ ng cho hà ng tồ n kho và tỷ lệ phầ n tră m nê n đượ c lưu trữ
trong cơ sở dữ liệ u. Điề u nà y sẽ cho phé p ngườ i dù ng cậ p nhậ t cơ sở dữ liệ u và tự
độ ng cậ p nhậ t truy vấ n thứ tự nà y.

Cá c mụ c hà ng có khoả ng khô ng quả ng cá o NULL đượ c lọ c ra theo mệnh đề WHERE.
Bao gồ m mộ t mặ t hà ng có khoả ng khô ng quả ng cá o NULL sẽ dẫ n đế n kích thướ c
NULL.

Hà m CASE trả về dữ liệu có thể đượ c sử dụ ng trong biể u thứ c, điề u kiệ n, đố i số
hà m và thậ m chí cả cá c câ u lệ nh sử a đổ i cơ sở dữ liệ u.
Do đó , nế u chú ng ta có
mộ t bả ng thích hợ p, chú ng ta có thể lưu trữ kết quả củ a truy vấ n nà y trự c tiế p
trong cơ sở dữ liệ u.

3.7.3 NULLIF
Hà m NULLIF lấ y hai giá trị và trả về NULL nếu chú ng bằ ng nhau hoặ c giá trị đầ u tiê n nế u hai
giá trị khô ng bằ ng nhau. Bạ n có thể coi nó là "NULL IF bằ ng."
NULLIF(<value1>,<value2>)

NULLIF thự c sự là mộ t trườ ng hợ p đặ c biệ t củ a tuyê n bố CASE. Nó tương đương vớ i tuyê n


bố CASE:
CASE WHEN value1=value2 THÌ NULL ELSE VALUE1 END

Hã y thử mộ t ví dụ . Tổ chứ c Y tế Thế giớ i (WHO) đã tuyê n bố rằ ng Thịt khô ng cò n là thự c


phẩ m group. Truy vấ n 3.30 hiể n thị bả ng thành phần vớ i nhó m thự c phẩ m củ a tấ t cả cá c
loạ i thịt là NULL.

Truy vấn NULLIF ví dụ


3,30
CHỌN thành phần, tên, đơn vị, đơn giá,
NULLIF (nhóm thực phẩm, 'Thịt') AS nhóm thực phẩm, hàng tồn kho,
vendorid TỪ các thành phần;

Thành phần Tên đơn vị giá đơn vị nhóm thực Kho vendorid
phẩm
Tiếng CHESE Phó mát xúc 0.03 Sữa 150 MÁY DNDRY
CHIKN Gà dải 0.45 KHÔNG 120 MÁY DNDRY
CRUTN Crouton mảnh 0.01 Bánh mì 400 EDDRS
NHO Nho mảnh 0.01 Trái 300 FRTFR ·
LETUS · Rau diếp bát 0.01 Rau 200 VGRUS
PICKL Dưa lát 0.04 Rau 800 VGRUS
SCTDR Mặc quần áo bí báo 0.03 KHÔNG 120 KHÔNG
tuyết
mậ t
NÀY Cà chua lát 0.03 Trái 15 VGRUS
NƯỚC Nước kính 0.06 KHÔNG KHÔNG SPWTR
Nước xô-đa Nước xô-đa kính 0.69 KHÔNG 5000 SPWTR
WTRML Dưa hấu mảnh 0.02 Trái KHÔNG FRTFR ·
ORNG Cam lát 0.05 Trái 10 FRTFR ·
■ 3.7 TRƯỜ NG HỢ P LIÊ N HIỆ P và NULLIF: Điề u kiệ n Expressions 71
[12 hà ng (s)]
72 Chương 3: Reshaping Kế t quả ■

3.7.4 LIÊN HIỆP


COALESCE lấ y mộ t danh sá ch cá c giá trị và trả về giá trị khô ng NULL đầ u tiê n.

COALESCE(<value1>, <value2>, :: :, <valueN>)

COALESCE cũ ng là viế t tắ t củ a mộ t tuyê n bố CASE phứ c tạ p. Khi số lượ ng giá trị là 2, nó


hoà n toà n tương đương vớ i nhữ ng điề u sau:

TRƯỜNG HỢP KHI VALUE1 KHÔNG PHẢI LÀ NULL THÌ VALUE1 ELSE value2 END

và khi số lượ ng giá trị lớ n hơn 2, nó tương đương vớ i nhữ ng điề u sau:
TRƯỜNG HỢP KHI VALUE1 KHÔNG NULL THÌ
VALUE1 ELSE COALESCE (value2, . . ., valueN) KẾT
THÚC

Mộ t cá ch sử dụ ng thự c tế cho COALESCE là cung cấ p mộ t sự thay thế cho cá c giá trị


NULL trong kết quả . Ví dụ : nếu chú ng tô i muố n hiể n thị tấ t cả cá c mặ t hà ng củ a mình vớ i
mộ t mứ c giá , chú ng tô i sẽ phả i xử lý nhữ ng mặ t hà ng có giá NULL. Truy vấ n 3.31 thự c
hiệ n việ c nà y.

Truy vấn LIÊ N HIỆ P ví dụ


3,31
CHỌN tên, giá , COALESCE (giá, 0,00) AS "no nulls" FROM items;

Tên giá Không có


null
Salad gà 2.85 2.85

Salad trá i câ y 3.45 3.45

Salad vườ n 0.99 0.99

Salad thiên niên KHÔNG 0.00


kỷ
Nước xô-đa 0.99 0.99
Nước 0.00 0.00
Đĩa trá i câ y 3.99 3.99

[7 Hà ng(s)]

3.8 Kết thúc


Câ u lệ nh SELECT cơ bả n cho phé p kiể m soá t cá c hà ng và cộ t củ a bả ng kế t quả . Trong
mộ t số trườ ng hợ p, điều nà y là khô ng đủ để có đượ c câ u trả lờ i cuố i cù ng củ a chú ng tô i.
SQL cung cấ p mộ t số cơ chế để thao tá c bả ng kế t quả và dữ liệ u củ a nó . Chú ng ta có thể
chọ n bả ng kế t quả cộ t names và loạ i bỏ cá c bả n sao. Bở i vì dữ liệu có thể hơi thô , SQL
cung cấ p cho chú ng ta khả nă ng lấ y dữ liệu bằ ng cá ch sử dụ ng biể u thứ c củ a cá c toá n tử
và hà m cơ bả n. Chú ng tô i thậ m chí có thể kiể m soá t cá c loạ i dữ liệ u cộ t bả ng kết quả
bằ ng chuyể n đổ i loạ i rõ rà ng. Cuố i cù ng, chú ng ta có thể xá c định thứ tự mà cá c hà ng
trong bả ng kết quả củ a chú ng ta đượ c di chuyể n bằ ng cá ch chỉ định (cá c) khó a sắ p xếp
■ 3.7 TRƯỜ NG HỢ P LIÊ N HIỆ P và NULLIF: Điề u kiệ n Expressions 73
thà nh THỨ TỰ THEO. Vớ i tấ t cả cá c khả nă ng nà y, SQL cho phé p chú ng ta kiể m soá t tuyệt
vờ i đố i vớ i dạ ng final củ a bả ng kết quả củ a chú ng ta.
74 Chương 3: Reshaping Kế t quả ■ ■
Xem lạ i câ u hỏ i 71

Câu hỏi ôn tập

1. True /False NULL s luô n xuấ t hiệ n trướ c khi sử dụ ng mệ nh đề ORDER BY.
2. Sự khá c biệ t giữ a đầ u ra củ a hai truy vấ n sau đâ y là gì? Giả i thích.
CHỌN vendorid TỪ các nhà cung cấp;
CHỌN VENDORID RIÊNG BIỆT TỪ nhà cung cấp;

3. Truy vấ n sau đâ y trả về bao nhiê u hà ng?


CHỌ N 'tá o' TỪ cá c nhà cung cấ p;
4. Đầ y đủ dấ u ngoặ c đơn cá c Sau ĐÂ U điề u đế n chỉ cá c trậ t tự củ a Thự c hiệ n: ĐÂ U
Khô ng - x + 2 * y > 3 Và=z + 9 < 12;
x, y và z đề u là cá c số nguyê n.
5. Điề u gì xả y ra khi bạ n CAST mộ t giá trị NULL?
6. Xem xé t cá c má u Tà i trợ bà n đó Sau. Nơi Mộ t × trong cá c Hà ng đó sẽ không
nằ m trong kế t quả củ a mộ t truy vấ n vớ i mệ nh đề chọ n.
Tài trợ

CHỌN CHỌN CHỌN KHÁC


KHÁC BIỆT KHÁC BIỆT BIỆT
Id giống kiểu giống kiểu giới tính, loại

1 M Mộ t

2 F B

3 KHÔNG Mộ t

4 KHÔNG KHÔN
G
5 M KHÔN
G
6 M Mộ t

7. Kế t quả củ a biể u thứ c sau đâ y là gì ? 5 * 8 +


2 / ABS (NULL)
8. Sử a đổ i Truy vấ n 3.14 để tê n cô ng ty mộ t từ cũ ng đượ c trả về .

9. AS là tù y chọ n trong SQL. Trong Cơ sở dữ liệ u nhà hà ng, sự khá c biệ t giữ a mệnh đề
SELECT đặ t tê n repfname là vendorid (khô ng có AS) và mệnh đề SELECT trả về cả
repfname và vendorid là gì?
10. eln x = x. Viế t mộ t truy vấ n để kiể m tra cá c hàm SQL nà y .
11. Trong Cơ sở dữ liệ u nhà hà ng, làm thế nà o bạ n sẽ kết hợ p chuỗ i con và vị trí để trả
về từ đầ u tiê n trong mộ t VARCHAR fi eld? Bạ n có thể giả sử cá c từ đượ c phâ n tá ch
bằ ng dấ u cá ch.

12. Viế t mộ t truy vấ n để trả về ngà y mai.


72 Chương 3: Reshaping Kế t quả ■

13. Giả i thích sự khá c biệt giữ a Truy vấ n 3.32 và Truy vấ n 3.33.

Truy vấn
3,32
CHỌN thành phần, giá TỪ thành
phần
ĐẶT HÀNG THEO ĐÚC (giá * 10 AS
VARCHAR (10))

Truy vấn
3.33
CHỌN thành phần, giá TỪ thành
phần
ĐẶT HÀNG THEO GIÁ * 10

14. Danh sá ch điều kiệ n (xem Phầ n 3.7.2) tương tự như cá c cấ u trú c if-then-elseif
trong cá c ngô n ngữ lậ p trình. Xâ y dự ng mộ t danh sá ch có điề u kiệ n tương đương
vớ i mã giả sau :
if (A<>B) thì {
if (C>0) thì xuất ra A*C; nếu
(C==0) thì xuất ra A*B; if (C<0)
thì xuất ra B*C;
}

15. Kế t quả củ a NULLIF(X,NULL) là gì? NULLIF (NULL, X)? NULLIF (NULL, NULL)?
16. Kế t quả củ a COALESCE(NULLIF(X,X),X) là gì?

Tập

Đố i vớ i cá c bà i tậ p nà y, chú ng tô i sử dụ ng Cơ sở dữ liệu nhâ n viê n đượ c trình bà y ở cuố i


Chương 1. Trả lờ i từ ng câ u hỏ i bằ ng mộ t câ u lệ nh SQL duy nhấ t. Truy vấ n củ a bạ n phả i
hoạ t độ ng cho bấ t kỳ tậ p hợ p dữ liệu nà o trong Cơ sở dữ liệu nhâ n viê n, khô ng chỉ tậ p hợ p
dữ liệ u chú ng tô i cung cấ p.

1. Liệ t kê tấ t cả cá c tê n nhâ n viê n dướ i dạ ng mộ t trườ ng đượ c gọ i là tê n.


2. Liệ t kê tấ t cả cá c mã bộ phậ n đượ c gá n cho mộ t dự á n. Loạ i bỏ tấ t cả cá c bả n sao.

3. Tìm ID dự á n và thờ i lượ ng củ a từ ng dự á n.


4. Tìm ID dự á n và thờ i lượ ng củ a từ ng dự á n. Nế u dự á n chưa hoà n thà nh, hã y
bá o cá o thờ i gian thự c hiệ n củ a nó kể từ bâ y giờ .

5. Đố i vớ i mỗ i dự á n đã hoà n thà nh, hã yxá c định ID dự á n và doanh thu trung bình mỗ i


ngà y.

Thự c hà nh 73

6. Tìm nă m mộ t dự á n bắ t đầ u. Loạ i bỏ cá c bả n sao.


7. Tìm ID củ a nhâ n viên đượ c chỉ định cho mộ t dự á n hơn 20 giờ mỗ i tuầ n. Viế t ba truy
vấ n bằ ng cá ch sử dụ ng tuầ n là m việ c 20, 40 và 60 giờ .

8. Đố i vớ i mỗ i nhâ n viên đượ c giao mộ t nhiệm vụ , hã y xuấ t ID nhâ n viên như sau:

"bá n thờ i gian" nế u thờ i gian đượ c chỉ định là < 0,33

'thờ i gian chia nhỏ ' nế u thờ i gian đượ c gá n là > = 0,33 và < 0,67

"Toà n thờ i gian" nế u thờ i gian đượ c chỉ định là >= 0,67
9. Chú ng ta cầ n tạ o mộ t danh sá ch cá c tê n dự á n viế t tắ t. Mỗ i tê n viế t tắ t con- catenates
ba ký tự đầ u tiê n củ a dự á n description, mộ t dấ u gạ ch nố i, và mã bộ phậ n. Tấ t cả
cá c ký tự phả i viế t hoa (ví dụ : EMP-ADMIN).

10. Đố i vớ i mỗ i dự á n, hã y liệ t kê ID và nă m dự á n bắ t đầ u. Sắ p xế p cá c kết quả theo


thứ tự tă ng dầ n theo nă m.
11. Nếu mỗ i nhâ n viê n đượ c tă ng lương 5%, hã y tìm họ và mứ c lương mớ i củ a nhữ ng
nhâ n viê n sẽ kiế m đượ c hơn 50,000 đô la.

12. Đố i vớ i tấ t cả cá c nhâ n viê n trong bộ phậ n HDWRE, hã y liệt kê ID, tên đầ u tiê n,
họ và lương củ a họ sau khi tă ng 10%. Cộ t lương trong kết quả nê n đượ c đặ t
tê n và o Nă m tớ i.
13. Tạ o mộ t thư mụ c đượ c định dạ ng gọ n gà ng củ a tấ t cả nhâ n viê n, bao gồ m mã bộ
phậ n và tê n củ a họ . Danh sá ch nê n đượ c sắ p xế p đầ u tiê n theo mã bộ phậ n , sau đó
theo họ , sau đó theo tên đầ u tiê n.
c h a p t er 4

Tổng hợp kết quả

D atabase đượ c thiế t kế để chứ a dữ liệ u — rấ t nhiề u dữ liệ u. Thô ng thườ ng, để trả lờ i
mộ t câ u hỏ i, chú ng tô i khô ng muố n dữ liệ u thô ; chú ng tô i chỉ cầ n mộ t số tổ ng hợ p dữ liệ u.
Ví dụ , khi ai đó hỏ i về hiệ u quả sử dụ ng nhiê n liệ u củ a ô tô củ a bạ n, họ khô ng muố n biế t chi
tiế t mứ c tiê u thụ nhiê n liệ u từ ng phú t. Thay và o đó , họ muố n biế t khoả ng cá ch trung bình
mà chiế c xe củ a bạ n
có thể đi trê n mộ t gallon hoặ c lít khí. Để trả lờ i cá c loạ i truy vấ n nà y, SQL tính toá n
tổ ng hợ p dữ liệ u phổ biế n.

4.1 Chức năng tổng hợp

Vớ i mộ t tậ p hợ p dữ liệu, SQL có thể cung cấ p cho chú ng ta mộ t giá trị tổ ng hợ p, duy nhấ t
trê n dữ liệu đó . Ví dụ : chú ng tô i có thể tìm thấ y chi phí trung bình củ a cá c mặ t hà ng hoặ c
tổ ng giá trị củ a từ ng mặ t hà ng trong kho củ a chú ng tô i.
SQL cung cấ p mộ t số hà m tổ ng hợ p cơ bả n. Cá c hà m nà y lấ y expres- sion và trả về giá
trị tổ ng hợ p trên tấ t cả cá c hà ng trong bả ng đã xá c định. Bả ng 4.1 bao gồ m thô ng tin về từ ng
hà m, bao gồ m nhữ ng gì nó tính toá n, cá c kiể u dữ liệ u đượ c chấ p nhậ n và cá ch xử lý null s và
cá c giá trị lặ p lạ i. Có nă m hà m tổ ng hợ p cơ bả n trong SQL: AVG, SUM, MIN, MAX và COUNT.

4.1.1 AVG và SUM


AVG tính giá trị trung bình củ a mộ t biể u thứ c trê n tấ t cả cá c hà ng trong bả ng kế t quả . Tương
tự , hà m SUM tính tổ ng. Tham số biểu thứ c có thể đơn giả n như mộ t tê n cộ t duy nhấ t.
Trong Phầ n 4.9, chú ng ta sẽ thấ y rằ ng có thể có nhiề u biểu thứ c phứ c tạ p hơn. Hà ng fo r

75
76 Chương 4: Tổ ng hợ p Kế t quả ■

Dữ liệu NULLs RIÊNG BIỆT


Chức Trở lại Kiểu Bị phớt Ý nghĩa
năng lờ?
Avg Giá trị biể u thứ c trung Số Có Có
bình
..MAX Giá trị biể u thứ clớ n nhấ t Bấ t kì Có Khô ng
Phú t Giá trị biể u thứ c nhỏ nhấ t Bấ t kì Có Khô ng
Tổ ng Tổ ng cá c giá trị biể u thứ c Số Có Có
ĐẾ M Số lượ ng giá trị khô ng rỗ ng Bấ t kì Có Có
ĐẾ M(*) Số hà ng Bấ t kì Khô ng Bấ t hợ p phá p

Bảng 4.1: Hà m tổ ng hợ p SQL

biể u thứ c đá nh giá null bị bỏ qua. Đương nhiê n, tham số cho AVG và SUM phả i là mộ t loạ i dữ
liệ u số .

Truy vấn Tìm thấ y cá c trung bình và tấ t cả giá cho tấ t cả Mụ c


4.1
CHỌN AVG (giá), SUM (giá) TỪ các
mặt hàng;

Avg tổng
2.0450000000000000 12.27
[1 Hà ng(s)]

Truy vấ n 4.1 tính giá trung bình và tổ ng giá củ a tấ t cả cá c hà ng trong bả ng mục. Cả hai kết
quả đề u bỏ qua cá c hà ng có giá NULL.
Như vớ i bấ t kỳ câ u lệ nh SELECT nà o, kế t quả củ a Truy vấ n 4.1 là mộ t bả ng. Bả ng
nà y chứ a hai cộ t và mộ t hà ng chứ a kế t quả củ a cá c hà m tổ ng hợ p. Tê n củ a mỗ i cộ t là
DBMS cụ thể ; tuy nhiê n, chú ng ta có thể chỉ định tê n bằ ng cá ch sử dụ ng bí danh thuộ c
tính.

Truy vấn Tìm thấ y cá c tấ t cả số củ a thà nh phầ n Đơn vị trong Kho


4.2
CHỌN SUM (hàng tồn kho) AS totalinventory FROM
ingredients;

tổng số hàng tồn kho


7115
[1 Hà ng(s)]

4.1.2 MIN và MAX


MIN và MAX fi nd giá trị nhỏ nhấ t và tố i đa, tương ứ ng, củ a biể u thứ c đã cho trê n tấ t cả cá c
hà ng trong bả ng đã cho . Bở i vì NULL khô ng thể so sá nh đượ c, nó có thể khô ng phả i là

4.1 Chứ c nă ng tổ ng hợ p 77

giá trị tố i thiểu cũ ng khô ng tố i đa; do đó , MIN và MAX bỏ qua cá c giá trị NULL, giố ng như
AVG và SUM.

Truy vấn Tìm thấ y cá c Nhỏ giá củ a tấ t cả Mụ c


4.3
LỰA MIN (giá) Như giá tối thiểu TỪ
Mục;

giá tối thiểu


0.00

[1 Hà ng(s)]

Khô ng giố ng như AVG và SUM, MIN và MAX khô ng giớ i hạ n ở cá c giá trị số . Chú ng tô i
có thể sử dụ ng bấ t kỳ loạ i dữ liệ u nà o cho phé p so sá nh. Truy vấ n 4.4 cung cấ p mộ t ví dụ
sử dụ ng ngà y thá ng.

Truy vấn Tìm thấ y cá c ngà y trê n nà o cá c cuố i cù ng khoả n là Thê m


4.4
LỰA MAX (dateadded) Như lastmenuitem TỪ
Mục;

lastmenuitem
2003-02-06

[1 Hà ng(s)]

4.1.3 ĐẾM
Hàm COUNT trả về số hà ng . Nó có hai fl avors. Hà m COUNT(*) tính số hà ng trong bả ng,
bao gồ m nulls.

Truy vấn Tìm thấ y số lượ ng Khẩ u hiệ u


4.5
LỰA ĐẾM(*) Như Số lượng TỪ
Quảng cáo;

Số lượng
6

[1 Hà ng(s)]

Dạ ng thứ hai củ a COUNT lấ y mộ t biể u thứ c là m tham số củ a nó và chỉ đế m cá c hà ng mà


biểu thứ c khô ng đá nh giá thà nh NULL.
78 Chương 4: Tổ ng hợ p Kế t quả ■

Truy vấn Tìm thấ y cá c số củ a Nguyê n liệ u vớ i Khô ng-KHÔNG Hà ng tồ n kho


4.6
CHỌN COUNT (hàng tồn kho) AS invct
FROM thành phần;

INVCT
10
[1 Hà ng(s)]

4.2 Loại bỏ Hàng trước khi Tính gộp với WHERE

Chú ng ta có thể giớ i hạ n cá c hà ng đượ c sử dụ ng bở i hà m tổ ng hợ p vớ i điề u kiện WHERE.

Truy vấn Tìm thấ y cá c tấ t cả Bá n hà ng tạ i ĐẦ U TIÊ N cử a hà ng


4.7
CHỌN SUM (price) AS sales TỪ
đơn đặt hàng
TRONG ĐÓ storeid = 'ĐẦU TIÊN';

Bán hàng
15.66
[1 Hà ng(s)]

Điề u kiệ n WHERE luô n đượ c á p dụ ng trướ c khi bấ t kỳ hà m tổ ng hợ p nà o đượ c tính toá n.
Lưu ý rằ ng AVG, SUM, MIN và MAX trê n mộ t tậ p hợ p giá trị trố ng trả về NULL. Vì các hà m
nà y bỏ qua các giá trị NULL, nê n việ c tính toá n mộ t trong cá c hà m nà y trê n mộ t tậ p hợ p
giá trị NULL trả về NULL. Hà m COUNT trê n mộ t tậ p hợ p giá trị trố ng trả về 0. Truy vấ n
4.8 hiể n thị mộ t ví dụ .

Truy vấn Uẩ n và KHÔNG ví dụ


4.8
CHỌN AVG (hàng tồn kho) AS ainv, SUM (hà ng tồ n kho) AS sinv, MIN (hà ng tồ n kho) AS
mininv, MAX (hà ng tồ n kho) AS maxinv, COUNT (*) AS cntall, COUNT (hàng tồn kho)
AS cntinv
TỪ thành phần
TRONG ĐÓ thành phần = 'NƯỚC';

ainv Sinv mininv Tối đa CNTAL cntinv



KHÔN KHÔ KHÔNG KHÔNG 1 0
G NG
[1 Hà ng(s)]

Trong Truy vấ n 4.8 AVG, SUM, MIN và MAX trả về NULL vì hà ng tồ n kho cho nướ c là
NULL, đượ c bỏ qua để tính toá n chú ng. Bở i vì COUNT (khoả ng khô ng quả ng cá o) bỏ qua
NULL, nó
80 Chương 4: Tổ ng hợ p Kế

4.4 Trộ■ n cá c thuộ c tính, cố t liệ u và nghĩa đen
t quả 79

tính số hà ng trong mộ t tậ p hợ p trố ng và hà m COUNT(*) trả về số hà ng, ngay cả vớ i


giá trị NULL.

4.3 Xóa dữ liệu lặp lại với DISTINCT trước


khi tổng hợp

Cá c hà m tổ ng hợ p xử lý cá c giá trị lặ p lạ i như thế nà o? Theo mặ c định, mộ t hà m tổ ng


hợ p bao gồ m tấ t cả cá c hà ng, thậ m chí lặ p lạ i, vớ i cá c ngoạ i lệ đượ c lưu ý là NULL.
Chú ng ta có thể thê m vò ng loạ i DISTINCT để loạ i bỏ cá c bả n sao trướ c khi tính toá n hà m
tổ ng hợ p.

Tìm thấ y cá c số củ a Nguyê n liệ u vớ i a Khô ng-KHÔNG thứ c ă n nhó m và cá c số củ a


Truy vấn
riê ng biệ t Khô ng-KHÔNG thứ c ă n Nhó m
4.9

CHỌN COUNT (foodgroup) AS "FGIngreds", COUNT (DISTINCT foodgroup) AS "NoFGs" FROM


ingredients;

FGIngreds NoFGs
9 5
[1 Hà ng(s)]

Hã y nhớ lạ i rằ ng, khi đượ c cung cấ p mộ t biể u thứ c, COUNT bỏ qua cá c giá trị NULL. Sau khi loạ i
bỏ
Giá trị nhóm thực phẩm NULL , chú ng tô i chỉ có 5 nhó m thực phẩm riê ng biệ t.
PHÂ N BIỆ T cầ n ghi nhớ :

1. Việ c sử dụ ng DISTINCT vớ i MIN và MAX là hợ p phá p; tuy nhiê n, nó sẽ khô ng thay đổ i kết quả .
2. COUNT (DISTINCT *) là bấ t hợ p phá p.
3. Chú ng tô i có thể yêu cầ u rõ rà ng việ c bao gồ m cá c lầ n lặ p lạ i bằ ng cá ch sử dụ ng
vò ng loạ i ALL thay vì DISTINCT; tuy nhiê n, điề u nà y khô ng thay đổ i hà nh vi vì
TẤ T CẢ là vò ng loại mặ c định.

4.4 Trộn các thuộc tính, cốt liệu và nghĩa đen

Cá c hà m tổ ng hợ p trả về mộ t giá trị duy nhấ t, vì vậ y chú ng ta thườ ng khô ng thể kế t hợ p cá c


thuộ c tính và hà m aggre- gate trong danh sá ch thuộ c tính củ a mộ t câ u lệ nh SELECT. Truy
vấ n sau tạ o ra lỗ i.
CHỌN itemid, AVG (giá) TỪ các
mặt hàng;

Vì có nhiề u ID mặ t hà ng và chỉ có mộ t mứ c giá trung bình, SQL khô ng biế t cá ch ghé p nố i


chú ng. Trong Phầ n 4.5, chú ng ta sẽ xem cá ch SQL loạ i bỏ mộ t phầ n hạ n chế nà y vớ i GROUP
BY.
Chú ng ta có thể kế t hợ p cá c hà m chữ và tổ ng hợ p như đượ c hiể n thị trong Query 4.10.
80 Chương 4: Tổ ng hợ p Kế t quả ■

Truy vấn Trộ n Literals vớ i Uẩ n


4,10
CHỌN 'Kết quả: ' DƯỚ I DẠ NG " ", ĐẾM (*) LÀ noingredients,
COUNT (hàng tồn kho) AS countedingredients, SUM (DISTINCT
INVENTORY) DƯỚI DẠNG TOTALINGREDIENTS
TỪ các thành phần;

noingredients countedingredients Tổng số


Kết quả: 12 10 6995
[1 Hà ng(s)]

Lưu ý rằ ng mỗ i hà m tổ ng hợ p hoạ t độ ng độ c lậ p. COUNT(*) đếm tấ t cả cá c hà ng,


COUNT(quantity) đế m tấ t cả cá c hà ng có số lượ ng hà ng tồ n kho khô ng phả i NULL và SUM(DISTINCT
inventory) tính tổ ng tấ t cả các hà ng có giá trị khô ng phả i NULL và bỏ qua cá c giá trị lặ p lạ i.

4.5 Tổng hợp nhóm bằng GROUP BY


Hà m tổ ng hợ p trả về mộ t phầ n thô ng tin tó m tắ t duy nhấ t về toà n bộ tậ p hợ p cá c hà ng. Điề u
gì sẽ xả y ra nế u chú ng ta muố n tổ ng hợ p trê n cá c nhó m dữ liệ u khá c nhau? Ví dụ : chú ng tô i
có thể muố n tìm tổ ng doanh số bá n hà ng tạ i tấ t cả cá c cử a hà ng củ a mình. Chú ng tô i có thể
lặ p lạ i Truy vấ n 4.7 cho mọ i ID cử a hà ng, nhưng điề u nà y sẽ khô ng thự c tế đố i vớ i cá c chuỗ i
lớ n. May mắ n thay, SQL cung cấ p mộ t cơ chế đơn giả n để á p dụ ng tổ ng hợ p cho tấ t cả cá c
nhó m trong mộ t truy vấ n. SQL sử dụ ng mệ nh đề GROUP BY để chỉ định (cá c) thuộ c tính xá c
định nhó m. Hã y xem mộ t ví dụ .

Truy vấn Tìm storeid và tổ ng doanh số bá n hà ng từ tấ t cả Cử a hà ng


4,11
CHỌN storeid, SUM (price) TỪ
đơn đặt hàng
NHÓM THEO tầng;

tầng tổng
CASTR 28.32
#2STR 20.18
NDSTR 17.79
ĐẦU TIÊN 15.66
[4 hà ng(s)]

GROUP BY đượ c thự c thi trướ c SELECT. Do đó , bả ng đơn đặt hàng đượ c chia thà nh cá c
nhó m dự a trên cá c giá trị storeid. Đố i vớ i mỗ i nhó m nà y, sau đó chú ng tô i á p dụ ng SELECT,
bao gồ m hà m tổ ng hợ p , trong trườ ng hợ p nà y là SUM. Điề u nà y có nghĩa là lt resu củ a Truy
vấ n 4.11 sẽ bao gồ m mộ t hà ng cho mỗ i ID cử a hà ng và tổ ng doanh số bá n hà ng tạ i cử a hà ng
đó . Điề u nà y giả i quyế t vấ n đề kế t hợ p cá c thuộ c tính và tổ ng hợ p mà chú ng tô i đã có trong
Phầ n 4.4. Nế u chú ng tô i có cá c cử a hà ng có ID NULL, họ sẽ tạ o thà nh mộ t nhó m duy nhấ t
củ a riêng họ .

4.5 Tổ ng hợ p nhó m bằ ng GROUP BY 81

Cá c nhó m có thể đượ c xá c định bở i nhiề u thuộ c tính, như minh họ a trong Truy vấ n 4.12.

Truy vấn Tìm thấ y cá c tấ t cả cho mỗ i trậ t tự


4.12
CHỌN storeid, ordernumber, SUM (price) TỪ đơn
đặt hàng
NHÓM THEO storeid, ordernumber;

tầng số đơn đặt tổng


hàng
ĐẦU TIÊN 2 2.85
ĐẦU TIÊN 3 9.36
ĐẦU TIÊN 1 3.45
NDSTR 2 0.99
NDSTR 3 12.81
NDSTR 1 3.99
#2STR 2 3.84
#2STR 3 7.83
#2STR 1 8.51
CASTR 2 9.81
CASTR 3 14.67
CASTR 1 3.84
[12 hà ng (s)]

Trong ví dụ nà y, mộ t nhó m đượ c hình thà nh cho mỗ i cặ p storeid/ordernumber và tổ ng


hợ p đượ c á p dụ ng giố ng như trướ c đâ y.
Điề u quan trọ ng cầ n lưu ý là khi chú ng tô i sử dụ ng mệ nh đề GROUP BY, chú ng tô i sẽ
hạ n chế cá c thuộ c tính có thể xuấ t hiệ n trong mệ nh đề SELECT. Nế u có mệnh đề GROUP BY,
mệnh đề SELECT chỉ có thể chứ a các thuộ c tính xuấ t hiệ n trong mệ nh đề GROUP BY, hà m tổ ng
hợ p s (trê n bấ t kỳ thuộ c tính nà o ) hoặ c literals.
GROUP BY khô ng yê u cầ u sử dụ ng cá c hà m tổ ng hợ p trong danh sá ch thuộ c tính.
Khô ng có hà m tổ ng hợ p, GROUP BY hoạ t độ ng giố ng như DISTINCT, tạ o thà nh tậ p hợ p cá c
nhó m duy nhấ t trê n cá c thuộ c tính đã cho. Ví dụ : so sá nh Truy vấ n 3.4 vớ i Truy vấ n 4.13.

Truy vấn Tìm thấ y cá c riê ng biệ t danh sá ch củ a thứ c ă n Nhó m Cung cấ p bằ ng cá ch mỗ i Vendor
4.13
CHỌN vendorid, nhóm thực phẩm
TỪ các thành phần
GROUP BY vendorid, foodgroup;

vendorid nhóm thực


phẩm
KHÔNG KHÔNG
FRTFR · Trái
Tiế p tụ c ở trang tiế p theo
82 Chương 4: Tổ ng hợ p Kế t quả ■

Truy vấn (tiếp tụ c)


4.13
SPWTR KHÔNG
VGRUS Rau
VGRUS Trái
MÁY Sữa
DNDRY
MÁY Thịt
DNDRY
EDDRS Bánh mì
[8 Hà ng(s)]

Bâ y giờ hã y xem xé t Truy vấ n 4.14. Trong truy vấ n nà y, chú ng tô i muố n tê n củ a


thà nh phầ n, khô ng phả i ID thà nh phầ n. Tuy nhiê n, có thể cá c thà nh phầ n khá c nhau có
cù ng tê n. (Cơ sở dữ liệu mẫ u củ a chú ng tô i thì khô ng, nhưng nó khô ng đượ c ngă n
chặ n.) Chú ng tô i vẫ n có thể có đượ c cá c nhó m chú ng tô i muố n bằ ng cá ch sử dụ ng CẢ ID
thà nh phầ n và tê n trong mệ nh đề GROUP BY.

Truy vấn NHÓ M Bằ ng cá ch ví dụ


4.14
CHỌN tên, AVG (unitprice) TỪ
thành phần
WHERE unit = 'mảnh'
GROUP BY thành phần, tên;

Tên Avg
Nho 0.01000000000000000000
Dưa hấu 0.02000000000000000000
Crouton 0.01000000000000000000
[3 hà ng(s)]

4.6 Loại bỏ Hàng trước khi Nhóm với VỊ TRÍ

Chú ng tô i có thể muố n loạ i bỏ mộ t số hà ng khỏ i bả ng trướ c khi chú ng tô i tạ o nhó m. Chú ng
ta có thể loạ i bỏ các hà ng khỏ i cá c nhó m bằ ng cá ch sử dụ ng mệ nh đề WHERE như minh họ a
trong Truy vấ n 4.15.

Truy vấn Tìm thấ y cá c số củ a nonbeverages Bá n tạ i mỗ i cử a hà ng


4.15
CHỌN storeid, COUNT(*) TỪ
đơn hàng
NƠI menuitemid KHÔNG CÓ TRONG ('SODA', 'NƯỚC')
NHÓM THEO tầng;

4.8 Xó a nhó m có 83

Truy vấn (tiếp tụ c)


4.15
tầng đếm
CASTR 8
#2STR 7
NDSTR 5
ĐẦU TIÊN 4
[4 hà ng(s)]

Cá c hà ng khô ng thỏ a mã n vị ngữ WHERE bị loạ i bỏ trướ c khi cá c nhó m đượ c hình thà nh. Cá c
giá trị hà m tổ ng hợ p đượ c tính sau khi cá c nhó m đượ c hình thà nh.

4.7 Sắp xếp các Nhóm với ĐẶT HÀNG THEO

Chú ng tô i có thể đặ t hà ng cá c nhó m củ a mình bằ ng cá ch sử dụ ng ĐẶ T HÀ NG THEO. Nó hoạ t


độ ng giố ng như ORDER BY mà khô ng cầ n nhó m ngoạ i trừ việc bâ y giờ chú ng ta cũ ng có
thể sắ p xế p theo tổ ng hợ p nhó m. Tổ ng hợ p chú ng tô i sử dụ ng trong tiê u chí sắ p xế p củ a
chú ng tô i khô ng cầ n phả i là tổ ng hợ p từ danh sá ch SELECT.

Truy vấn Tìm thấ y Cử a hà ng và cử a hà ng Bá n hà ng Sắ p xế p bằ ng cá ch số Mụ c Bá n


4,16
CHỌN storeid, SUM (price) TỪ
đơn đặt hàng
NHÓM THEO THỨ TỰ

STOREID THEO SỐ
LƯỢNG (*);

tầng tổng
NDSTR 17.79
ĐẦU TIÊN 15.66
#2STR 20.18
CASTR 28.32
[4 hà ng(s)]

Cũ ng giố ng như mệnh đề SELECT, bấ t kỳ thuộ c tính nà o trong mệnh đề ORDER BY phả i
đượ c chứ a trong hà m tổ ng hợ p hoặ c xuấ t hiệ n trong mệnh đề GROUP BY. Điề u nà y có nghĩa
là trong Truy vấ n 4.16, chú ng ta chỉ có thể sắ p xế p theo storeid hoặ c mộ t hà m tổ ng hợ p.

4.8 Xóa nhóm có CÓ

Sử dụ ng mệ nh đề HAVING để chỉ định điề u kiệ n cho các nhóm trong kế t quả cuố i cù ng.
Đâ y là dif- ferent từ WHERE, loạ i bỏ cá c hà ng trước khi nhó m. Cá c nhó m mà điề u kiệ n
HAVING khô ng đá nh giá là đú ng sẽ bị loạ i bỏ . Bở i vì chú ng tô i đang là m việ c vớ i cá c nhó m
hà ng, nê n việc cho phé p cá c hà m tổ ng hợ p trong mộ t vị ngữ HAVING là điề u hợ p lý .

You might also like