SQL- Nhng kiến thc cơ bn
GII THIU
Ngôn ng truy vn có cu trúc (SQL) là mt ngôn cơ s d liu (CSDL) chun công nghip được
công c qun tr d liu ca Microsoft (Microsoft jet database engine) s dng. SQL được s dng
để to nhng đối tượng truy vn (QueryDef objects), nhưđối s cho phương thc m tp hp bn
ghi (OpenRecordset method), và là thuc tính ngun bn ghi (RecordSource property) ca điu
khin d liu (data control). Nó cũng có th được dùng vi nhng phương thc thi hành (Execute
method) để trc tiếp to và thao tác ... (jet databases), và to ra các SQL PassThrough truy vn để
thao tác trên các CSDL khách ch t xa (remote client/server databases).
Chương này s bàn ti cu trúc cơ bn ca SQL, và cách thc s dng nó cho vic to, bo trì và sa
đổi CSDL. Chúng ta cũng nói ti s xây dng và công dng ca truy vn SQL để to các đối tượng
tp hp bn ghi (Recordset objects), và để chn, sp xếp, lc và cp nht d liu trong nhng bng
cơ s. Hơn na, chương này s xem xét cách thc ti ưu hoá truy vn SQL v mt tc độ và hiu qu.
Cui cùng, chúng ta bàn ti s khác nhau gia Microsoft Jet SQL và ANSI SQL mt cách c th
SQL LÀ GÌ ?
SQL là mt ngôn ng lp trình v CSDL có ngun gc liên quan mt thiết ti s phát minh ra mô
hình CSDL quan h ca E.F.Codd vào đầu nhng năm 70. Tin thân ca SQL là ngôn ng Sequel, và
vì lý do này SQL vn thường được phát âm là “sequel” hơn là “ess cue ell”, mc du c hai cách phát
âm đều được chp nhn.
SQL ngày nay phát trin rng và tr thành mt ngôn ng chun cho CSDL quan h, và đã được
định nghĩa bi chun ANSI. Hu hết các bn thi hành ca SQL ch là s biến đổi nh t SQL chun,
bao gm c phiên bn được Jet database engine h tr. Nhng s khác nhau này s được nhc ti
cui chương, nhưng hu hết các cu trúc và các chc năng ca ngôn ng là nht quán đối vi các
nhà phát trin các h qun tr CSDL. Nếu bn đã s dng bt c bn thi hành nào ca SQL, bn s
thy không khó khăn my khi chuyn sang Microsoft Jet SQL.
SQL vs. Navigation
Như đã đề cp trong phn đầu tài liu, Mircosoft Jet database engine cung cp hai phương thc tách
bit để hoàn tt hu hết các tác v CSDL:
- Mt mô hình điu hướng da trên c s dch chuyn qua li gia các bn ghi.
- Mt mô hình quan h da trên truy vn hi có cu trúc (SQL).
Mô hình điu hướng bao gm nhng thuc tính và phương thc được mô t trong “To và sa đổi
CSDL” (“Creating and Modifying Databases”) và “Thao tác vi bn ghi và trường” (“Working with
Records and Fields”). Mô hình quan h được nói bàn ti trong chương này.
Nhng lp trình viên không quen thuc vi nhng h qun tr cơ s d liu hướng file như dBASE,
Foxpro, và Paradox có th cm thy d chu khi bt đầu vi các phương thc điu hướng được tho
lun trong chương trước. Tuy nhiên, trong hu hết các trường hp nhng phương thc SQL vi vai
trò tương đương t ra hiu qu hơn, và nói chung chúng nên được dùng cho nhng nơi tính hiu qu
được xem là quan trng hơn c. Hơn na SQL có mt li đim là mt giao tiếp mc chun công
nghip v CSDL, thế nên mt s hiu biết vc lnh SQL cho phep bn truy cp và thao tác vi mt
din rng các sn phm CSDL t các nhà phát trin khác nhau.
CÁC THÀNH PHN CA SQL
Ngôn ng SQL bao gm các lnh, các mnh đề, các toán t, và các hàm tng hp (hàm nhóm -
aggregate functions). Nhng thành phn này được kết hp vào trong các phát biu (statements) dùng
để to, cp nht, và thao tác trên CSDL. Nhng mc sau s mô t nhng thành t đó mt cách ngn
gn, và phn còn li ca chương này s đưa ra cho bn nhng ví d c th v công dng ca chúng.
Chú ý: Nhng mc sau s nhng lnh và t khoá được dùng thường xuyên nht, nhưng không phi
tt c. Để có mt tham kho hoàn chnh v danh sách các t khoá SQL, hãy tìm kiếm “SQL” trong
Books Online.
1.Lnh SQL:
Ging như mô hình điu hướng ca DAO (Data Access Object), SQL cung cp c hai phn, ngôn ng
định nghĩa d liu (DDL - Data Definition Language) và ngôn ng thao tác d liu (DML - Data
Manipulation Language). Tuy có vài phn trùng lp, nhưng nhng câu lnh DDL cho phép bn to
định nghĩa các CSDL, các trường, các ch mc mi, trong khi nhng câu lnh DML để bn xây
dng các truy vn, sp xếp, lc, và trích d liu t trong CSDL.
DDL
Các câu lnh DDL trong SQL là biu thc được xây dng chung quanh nhng mnh đề sau:
CREATE Dùng để to mi các bng, các trường và các ch mc.
DROP Dùng để xoá các bng và ch mc khi CSDL.
ALTER Dùng để sa đổi các bng bng cách thêm trường, thay đổi định nghĩa ca các trường.
DML
Các câu lnh DML là các biu thc được xây dng da trên các mnh đề sau:
SELECT Dùng để truy vn CSDL để ly được nhng bn ghi tho mãn nhng tiêu chun nào đó.
INSERT Dùng để chèn mt nhóm d liu vào CSDL thông qua mt thao tác.
UPDATE Dùng để thay đổi giá tr ca nhng trường, nhng bn ghi c th.
DELETE Dùng để loi b nhng bn ghi ra khi CSDL.
2.Mnh đề SQL:
Mnh đề là nhng điu kin thay đổi được dùng để xác định d liu bn mun chn, mun thao tác.
Bng sau lit kê nhng mnh đề bn có th dùng.
FROM Lit kê danh sách các bng mà ta cn ly các bn ghi t đó.
WHERE Xác định các điu kin mà bn ghi được chn phi đáp ng được.
GROUP BY Dùng để nhóm các bn ghi được chn thành các nhóm riêng bit.
HAVING Dùng để đưa ra điu kin cho mi nhóm.
ORDER BY Dùng để sp xếp các bn ghi được ch theo mt th t nào đó.
3.Nhng toán hng SQL:
Có hai loi toán hng trong SQL: toán hng logic và toán hng so sánh.
Toán hng logic:
Toán hng logic được dùng để ni các biu thc, thường là trong phm vi ca mnh đề WHERE. Ví
d như:
SELECT * FROM MY_TABLE WHERE Condition1 AND Condition2;
Nhng toán t logic bao gm: AND, OR, NOT
Toán hng so sánh:
Toán hng so sánh được dùng để so sánh tương đối giá tr hai biu thc để xác định nhng hot động
nào s được thc hin. Ví d:
SELECT * FROM Publishers WHERE PubID = 5;
Nhng toán t so sánh bao gm:
< bé hơn
<= bé hơn hoc bng
> ln hơn
>= ln hơn hoc bng
= bng
<> khác
4.Hàm tng hp
(aggregate functions)
Hàm tng hp (hàm nhóm) được dùng trong phm vi ca mnh đề SELECT trên mt nhóm bn ghi
để tr li mt giá tr. Ví d, hàm AVG có th tr li giá tr trung bình ca tt c các giá tr trong mt
trường c th. Bng sau lit kê danh sách các hàm tng hp.
AVG Tr li giá tr trung bình trong mt trường. COUNT Tr li s bn ghi được chn.
SUM Hàm tính tng các giá tr trong mt trường c th.
MAX Hàm tr v giá tr cc đại ca trường đó.
MIN Hàm tr v giá tr cc tiu ca trường đó
NHNG THAO TÁC DLL
DDL bao gm mt s lnh bn có th dùng để to bng và ch mc, và sa đổi các bng bng cách
thêm hoc loi b các ct hoc ch mc. Nhng câu lnh định nghĩa d liu có th ch được dùng vi
Jet database; Chúng không được h tr cho bt c CSDL định dng ngoài.
Chú ý: Để dùng câu lnh DDL, hoc bt c truy vn nào không tr li tp bn ghi, hãy đóng ngoc
kép và s dng chúng như đối s ca các phương thc thi hành ca CSDL hay đối tượng truy vn
(QueryDef object) như trong ví d sau:
MyDB.Execute “CREATE TABLE Employees ([First Name] TEXT, [Last_ Name] TEXT)”;
Để dùng bt c mt câu lnh nào tr li các bn ghi (như SELECT), dùng biu thc nhưđối s
ngun ca phương thc m tp bn ghi (OpenRecordset method), như trong ví d sau:
MyDB.OpenRecordset (“SELECT * FROM Titles WHERE Au_ID = 5”, _ dbOpenDynaset);
1.To mt bng:
Để to mt bng trong CSDL, dùng câu lnh CREATE TABLE. Mt câu lnh hoàn chnh nhn các
đối s là tên bng, tên các trường, kiu d liu ca các trường và độ rng ca các trường.
Ví d sau to mt bng có tên là “Employees”, có hai trường kiu TEXT vi độ rng là 25:
CREATE TABLE Employees ([First Name] TEXT(25), [Last Name] TEXT(25));
Thêm và xoá ct:
Bn có th thêm, sa đổi hoc xoá các ct vi câu lnh ALTER TABLE. Ví d, câu lnh sau thêm
mt trường kiu TEXT có độ rng 25 và tên là “Notes” vào bng Employees:
ALTER TABLE Employees ADD COLUMN Notes TEXT(25);
Để loi b mt ct, dùng t khoá DROP. Ví d này loi b ct có tên là “Notes” mi va được thêm
lúc nãy:
ALTER TABLE Employees DROP COLUMN Notes;
Để sa đổi mt trường, trước tiên bn phi xoá nó, và sau đó là thêm trường mi vi tên như cũ. Ví
d sau tăng độ rng ca trường “Notes”:
ALTER TABLE Employees DROP COLUMN Notes;
ALTER TABLE Employees ADD COLUMN Notes TEXT(30);
Chú ý: Dùng ALTER TABLE, bn ch có th thêm hoc xoá mt trường ti mi thi đim.
2.To và xoá ch mc:
Có ba cách khác nhau để to ch mc:
- Lúc bt đầu to bng vi câu lnh CREATE TABLE
- Vi câu lnh CREATE INDEX.
- Vi câu lnh ALTER TABLE
Mc du c ba cách này đều cho kết qu tương t, nhưng vn có nhng khác đim khác nhau. Nếu
bn mun thêm mt khoá ngoi (foreign key) và ép buc toàn vn tham chiếu (enfore referential
integrity), bn phi dùng mt mnh đề ràng buc (CONSTRAINT clause) trong các câu lnh
CREATE TABLE hoc ALTER TABLE.
Đôi khi người ta mun to mt bng ban đầu không có ch mc, và tiếp đó là thiết kế các tham s ch
mc sau khi dùng mu bng. Vi tình hung này, bn nên dùng CREATE TABLE để to mu bng
không có ch mc, và sau đó thêm các ch mc vi câu lnh CREATE INDEX hoc ALTER TABLE.
To mt ch mc vi câu lnh CREATE TABLE.
Khi bn to mt bng, bn có th to mt ch mc cho tng ct riêng r, hoc hai hoc nhiu hơn các
ct, dùng mnh đề SQL CONSTRAINT (t khoá CONSTRAINT bt đầu định nghĩa mt ch s). Ví
d sau đây minh ho cách to ra mt bng vi ba trường có ch mc:
CREATE TABLE Employees ([First Name] TEXT(25), [Last Name] TEXT(25), _ [Date of Birth]
DATETIME, CONSTRAINT EmployeesIndex UNIQUE _ ([First Name], [Last Name], [Date of
Birth]));
Để đánh ch mc vi mt ct, bn đặt mnh đề CONSTRAINT vào mt trong nhng mô t ct. Ví
d, để đánh ch mc trường “Date of Birth”, bn dùng câu lnh CREATE TABLE sau đây:
CREATE TABLE Employees ([First Name] TEXT(25), [Last Name] TEXT(25), _ [Date of Birth]
DATETIME CONSTRAINT EmployeesIndex PRIMARY);
S khác nhau gia đánh ch mc cho nhiu trường và cho mt trường là: cho mt trường đơn, t
khoá CONSTRAINT bt đầu định nghĩa ch mc không b tách bit vi trường cui cùng bi du
phy mà đi sát ngay sau kiu d liu ca trường được đánh ch mc đó.
To ch mc vi câu lnh CREATE INDEX.
Bn cũng có th dùng mnh đề CREATE INDEX để thêm mt ch mc. Ví d sau đây đưa ra cùng
mt kết qu vi ví d trước, ngoi tr vic dùng CREATE TABLE thay thế cho ALTER TABLE.
CREATE UNIQUE INDEX MyIndex ON Employees ([Date of Birth]);
Trong mnh đề tu chn WITH, bn có th ép buc d liu vi ràng buc PRIMARY, có nghĩa đây
là trường ch mc chính; DISALLOW NUL, nghĩa là trường này không b b trng; IGNORE
NULL, có nghĩa bn ghi đó s không được đánh ch mc nếu trường đó để trng.
Ví d sau thêm mnh đề WITH vào ví d trước, để cho không bn ghi nào có th đưc thêm vào
bng mà ct s bo him xã hi b b trng:
CREATE UNIQUE INDEX MyIndex ON Employees (SSN) _ WITH DISALLOW NULL;
Chú ý: Không dùng t khoá PRIMARY khi bn to ra mt ch mc mi trong bng mà bng đó đã
tn ti khoá chính (Primary key); Nếu bn vi phm điu này thì h thng s báo li.
Bn đang dùng CREATE INDEX để to mt đặc t ch mc trên mt bng mà chưa tn ti ch mc
nào. Để to mt ch mc như thế; bn không cn s cho phép hoc truy cp ti mt máy ch xa, và
CSDL xa không nhn biết được hay không h nh hưởng bi ch mc đó. Bn dùng cùng mt cú
pháp cho bng kết ni và bng gc. Điu này đặc hu dng khi to mt ch mc trên mt bng
thường là ch đọc (read only) bi vì nó thiếu mt ch mc.
To mt ch mc vi câu lnh ALTER TABLE
Bn cũng có th thêm mt ch mc cho mt bng đã tn ti bng cách dùng câu lnh ALTER
TABLE, dùng cú pháp ADD CONSTRAINT. Ví d sau thêm mt ch mc cho trường “SSN”:
ALTER TABLE Employees ADD CONSTRAINT MyIndex _ PRIMARY (SSN);
Bn cũng có th thêm ch mc cho nhiu trường và mt bng bng cách dùng câu lnh ALTER
TABLE ging như sau:
ALTER TABLE Employees ADD CONSTRAINT NameIndex _ UNIQUE ([Last Name], [First
Name], SSN);
Mnh đề CONSTRAINT và toàn vn tham chiếu (Referential Integrity).
Mt ràng buc là mt ch mc. Bn dùng mnh đề CONSTRAINT để to hoc xoá các ch mc vi
các câu lnh CREATE TABLE và ALTER TABLE, như đã ch ra phn trước.
Mnh đề CONSTRAINT cũng cho phép bn định nghĩa khoá chính và khoá ngoi, định nghĩa các