Professional Documents
Culture Documents
SQL
SQL
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
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 ·
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
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.
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
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
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
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 ■
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.
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 ■
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
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.
(251)892-7367
Số fax: Di động: (251)892-
8193
(251)887-2391 (máy
nhắn tin)
1
2 Chương 1: Databasics ■
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ý
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 ■
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:
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
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 ■
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.
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
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:
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.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ể .
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.
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
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
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
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
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
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ý
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.
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
Mục
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.
madewith (cont'd)
Mô tả loại cộ t
mealid CHAR (5) Tê n nhậ n dạ ng 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ả 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ửa hàng
Lệnh
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.
Lộ
Sinh nhậ t
Thờ i hạ n hợ p
đồ ng
Lương
Giố ng
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".
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.
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
Nhân viên
Bộ phận
dự án—Dự á n do cô ng ty quả n lý .
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
dự á n
28 Chương 1: Databasics ■
công trình
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.
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 <>]
Đơ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 ■
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)]
[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
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 ■
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';
[6 Hà ng(s)]
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.
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ó .
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
Mô tả ký tự đại diện
_ khớ p vớ i bấ t kỳ ký tự đơn lẻ nà o
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:
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.
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ụ : '##').
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)]
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;
Đố 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';
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
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)]
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 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;
[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.
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');
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 ■
[3 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
Đ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.
Không
sự thật sai
sai sự
không thậ t
xác định khô ng
biế t
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;
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:
Đ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' đá 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.
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);
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.
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;
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
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.
CHỌN *
TỪ T
TRONG ĐÓ C1 THÍCH '%ar_' HOẶC KHÔ NG C2 TỪ 3 ĐẾN 7 VÀ C3 < 5;
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
47
48 Chương 3: Reshaping Kế t quả ■
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
[6 Hà ng(s)]
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
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;
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ả ■
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';
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.
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;
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ự .
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ả ■
Tên
C. Ngô
Ông Milker
S. Sherbert ·
G. Nho
S. Sốt
G. Bản lề
[6 Hà ng(s)]
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;
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)]
Tên vị trí
Salad gà 9
Salad trá i câ y 7
Salad vườ n 8
[7 Hà ng(s)]
[6 Hà ng(s)]
58 Chương 3: Reshaping Kế t quả ■
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.
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ả ■
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;
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ả ■
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;
[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.
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.
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
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]
Tên giá
Nước 0.00
Salad vườ n 0.99
Nước xô-đa 0.99
Salad gà 2.85
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)]
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;
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;
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.
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.
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
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.
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ả ■
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
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
■
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>)
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ả ■
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
[7 Hà ng(s)]
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;
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
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.
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
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).
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
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.
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.
75
76 Chương 4: Tổ ng hợ p Kế t quả ■
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ố .
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.
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.
[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.
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.
Số lượng
6
[1 Hà ng(s)]
INVCT
10
[1 Hà ng(s)]
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ụ .
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
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.
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 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;
Tên Avg
Nho 0.01000000000000000000
Dưa hấu 0.02000000000000000000
Crouton 0.01000000000000000000
[3 hà ng(s)]
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.
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.
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.
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ý .