HQT CSDL Chuong2

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 17

H QUN TR C S D LIU

CHNG II SQL

MC CH Gii thiu mt h CSDL chun, SQL, cc thnh phn c bn ca ca n. YU CU Hiu cc thnh phn c bn ca SQL-92 Hiu v vn dng phng php "dch" t cu vn tin trong ngn ng t nhin sang ngn ng SQL v ngc li Hiu v vn dng cch thm (xen), xa d liu SQL l ngn ng CSDL quan h chun, gc ca n c gi l Sequel. SQL l vit tt ca Structured Query Language. C nhiu phin bn ca SQL. Phin bn c trnh by trong gio trnh ny l phin bn chun SQL-92. SQL c cc phn sau: Ngn ng nh ngha d liu (DDL). DDL ca SQL cung cp cc lnh nh ngha cc s quan h, xo cc quan h, to cc ch mc, sa i cc s quan h Ngn ng thao tc d liu tng tc (Interactive DML). IDML bao gm mt ngn ng da trn c i s quan h ln php tnh quan h b. N bao hm cc lnh xen cc b, xo cc b, sa i cc b trong CSDL Ngn ng thao tc d liu nhng (Embedded DML). Dng SQL nhng c thit k cho vic s dng bn trong cc ngn ng lp trnh mc ch chung (genaral-purpose programming languages) nh PL/I, Cobol, Pascal, Fortran, C. inh ngha view. DDL SQL cng bao hm cc lnh nh ngha cc view. Cp quyn (Authorization). DDL SQL bao hm c cc lnh xc nh cc quyn truy xut dn cc quan h v cc view Tnh ton vn (Integrity). DDL SQL cha cc lnh xc nh cc rng buc ton vn m d liu c lu tr trong CSDL phi tho. iu khin giao dch. SQL cha cc lnh xc nh bt u v kt thc giao dch, cng cho php cht tng minh d liu iu khin cnh tranh

CHNG II SQL

trang

18

H QUN TR C S D LIU

Cc v d minh ho cho cc cu lnh SQL c thc hin trn cc s quan h sau: Branch_schema = (Branch_name, Branch_city, Assets): S quan h chi nhnh nh bng gm cc thuc tnh Tn chi nhnh (Branch_name), Thnh ph (Branch_city), ti sn (Assets) Customer_schema = (Customer_name, Customer_street, Customer_city): S quan h Khch hng gm cc thuc tnh Tn khch hng (Customer_name), ph (Customer_street), thnh ph (Customer_city) Loan_schema = (Branch_name, loan_number, amount): S quan h cho vay gm cc thuc tnh Tn chi nhnh, s cho vay (Loan_number), s lng (Amount) Borrower_schema = (Customer_name, loan_number): S quan h ngi mn gm cc thuc tnh Tn khch hng, s cho vay Account_schema = (Branch_name, account_number, balance): S quan h ti khon gm cc thuc tnh Tn chi nhnh, s ti khon (Account_number), s cn i (Balance: d n/c) Depositor_schema = (Customer_name, account_number): S ngi gi gm cc thuc tnh Tn khch hng, s ti khon Cu trc c s ca mt biu thc SQL gm ba mnh : SELECT, FROM v WHERE Mnh SELECT tng ng vi php chiu trong i s quan h, n c s dng lit k cc thuc tnh mong mun trong kt qu ca mt cu vn tin Mnh FROM tng ng vi php tch cc , n n lit k cc quan h c qut qua trong s nh tr biu thc Mnh WHERE tng ng vi v t chn lc, n gm mt v t cha cc thuc tnh ca cc quan h xut hin sau FROM Mt cu vn tin kiu mu c dng: SELECT A1, A2, ..., Ak FROM R1, R2, ..., Rm WHERE P trong Ai l cc thuc tnh (Attribute), Rj l cc quan h (Relation) v P l mt v t (Predicate). Nu thiu WHERE v t P l TRUE. Kt qu ca mt cu vn tin SQL l mt quan h.

MNH SELECT
Ta tm hiu mnh SELECT bng cch xt mt vi v d: "Tm kim tt c cc tn cc chi nhnh trong quan h cho vay (loan)": SELECT Branch_name FROM Loan; Kt qu l mt quan h gm mt thuc tnh Tn chi nhnh (Branch_name) Nu mun quan h kt qu khng cha cc tn chi nhnh trng nhau: SELECT DISTINCT Branch_name FROME Loan; T kho ALL c s dng xc nh tng minh rng cc gi tr trng khng b xo v n l mc nhin ca mnh SELECT. K t * c dng ch tt c cc thuc tnh: SELECT * FROM Loan;

CHNG II SQL

trang

19

H QUN TR C S D LIU

Sau mnh SELECT cho php cc biu thc s hc gm cc php ton +, -, *, / trn cc hng hoc cc thuc tnh: SELECT Branch_name, Loan_number, amount * 100 FROM Loan;

MNH WHERE
Tm tt c cc s cho vay chi nhnh tn Perryridge vi s lng vay ln hn1200$" SELECT Loan_number FROM Loan WHERE Branch_name = Perryridge AND Amount > 1200; SQL s dng cc php ni logic: NOT, AND, OR. Cc ton hng ca cc php ni logic c th l cc biu thc cha cc ton t so snh =, >=, <>, <, <=. Ton t so snh BETWEEN c dng ch cc gi tr nm trong mt khong: SELECT Loan_number FROM Loan WHERE Amount BETWEEN 50000 AND 100000; SELECT Loan_number FROM Loan WHERE Amount >= 50000 AND Amount <= 100000; Ta cng c th s dng ton t NOT BETWEEN.

MNH FROM
"Trong tt c cc khch hng c vay ngn hng tm tn v s cho vay ca h" SELECT DISTINCT Customer_name, Borrower.Loan_number FROM Borrower, Loan WHERE Borrower.Loan_number = Loan.Loan_number; SQL s dng cch vit <tn quan h >.< tn thuc tnh > che du tnh lp l trong trng hp tn thuc tnh trong cc s quan h trng nhau. "Tm cc tn v s cho vay ca tt c cc khch hng c vay chi nhnh Perryridge" SELECT Customer_name, Borrower.Loan_number FROM Borrower, Loan WHERE Borrower.Loan_number = Loan.Loan_number AND Branch_name =Perryridge;

CC PHP I TN
SQL cung cp mt c ch i tn c tn quan h ln tn thuc tnh bng mnh dng: < tn c > AS < tn mi > m n c th xut hin trong c mnh SELECT ln FROM SELECT DISTINCT Customer_name, Borrower.Loan_number FROM Borrower, Loan WHERE Borrower.Loan_number = Loan.Loan_number AND Branch_name =Perryridge; Kt qu ca cu vn tin ny l mt quan h hai thuc tnh: Customer_name, Loan_number i tn thuc tnh ca quan h kt qu: SELECT Customer_name, Borrower.Loan_number AS Loan_Id FROM Borrower, Loan
CHNG II SQL
trang 20

H QUN TR C S D LIU

WHERE Borrower.Loan_number = Loan.Loan_number AND Branch_name =Perryridge;

CC BIN B (Tuple Variables)


Cc bin b c nh ngha trong mnh FROM thng qua s dng mnh AS: SELECT DISTINCT Customer_name, T.Loan_number FROM Borrower AS T, Loan AS S WHERE T.Loan_number = S.Loan_number AND Branch_name =Perryridge; Tm cc tn ca tt c cc chi nhnh c ti sn ln hn t nht mt chi nhnh Brooklyn SELECT DISTINCT T.branch_name FROM Branch AS T, Banch AS S WHERE T.assets > S.assets AND S.Branch_City = Brooklyn SQL92 cho php s dng cc vit (v1, v2, ..., vn) k hiu mt n-b vi cc gi tr v1, v2, ..., vn. Cc ton t so snh c th c s dng trn cc n-b v theo th t t in. V d (a1, b1) <= (a2, b2) l ng nu (a1 < b1) OR ((a1 = b1) AND (a2 < b2)).

CC PHP TON TRN CHUI


Cc php ton thng c dng nht trn cc chui l php i chiu mu s dng ton t LIKE. Ta m t cc mu dng hai k t c bit: k t phn trm (%): k t % tng xng vi chui con bt k k t gch ni (_): k t gch ni tng xng vi k t bt k. - Perry% tng xng vi bt k chui no bt u bi Perry - %idge% tng xng vi bt k chui no cha idge nh chui con - ___ tng xng vi chui bt k c ng ba k t - ___% tng xng vi chui bt k c t nht ba k t "Tm tn ca tt c cc khch hng tn ph ca h cha chui con Main SELECT Customer_name FROM Customer WHERE Customer_street LIKE %Main% Nu trong chui mu c cha cc k t % _ \ , trnh nhm ln k t vi"du hiu thay th", SQL s dng cch vit: k t escape (\) ng ngay trc k t"c bit". V d nu chui mu l ab%cd c vit l ab\%cd, chui mu l ab_cde c vit l ab\_cde, chui mu l ab\cd c vit l ab\\cd SQL cho php i chiu khng tng xng bng cch s dng NOT LIKE SQL cng cho php cc hm trn chui: ni hai chui (|), trch ra mt chui con, tm di chui, bin i mt chui ch thng sang chui ch hoa v ngc li ...

TH T TRNH BY CC B (dng)
Mnh ORDER BY to ra s trnh by cc dng kt qu ca mt cu vn tin theo mt trnh t. lit k theo th t alphabet tt c cc khch hng c vay chi nhnh Perryridge: SELECT DISTINCT Customer_name FROM Borrower, Loan WHERE Borrower.Loan_number = Loan.Loan_number AND Branch_name = Perryridge ORDER BY Customer_name;
CHNG II SQL
trang 21

H QUN TR C S D LIU

Mc nhin, mnh ORDER BY lit k theo th t tng, tuy nhin ta c th lm lit k theo th t gim/tng bng cch ch r bi t kho DESC/ ASC SELECT * FROM Loan ORDER BY Amount DESC, Loan_number ASC;

CC PHP TON TP HP
SQL92 c cc php ton UNION, INTERSECT, EXCEPT chng hot ng ging nh cc php ton hp, giao, hiu trong i s quan h. Cc quan h tham gia vo cc php ton ny phi tng thch (c cng tp cc thuc tnh). - Php ton UNION tm kim tt c cc khch hng c vay, c ti khon hoc c hai ngn hng (SELECT Customer_name FROM Depositor) UNION (SELECT Customer_name FROM Borrower); Php ton hp UNION t ng loi b cc b trng, nu ta mun gi li cc b trng ta phi s dng UNION ALL (SELECT Customer_name FROM Depositor) UNION ALL (SELECT Customer_name FROM Borrower); - Php ton INTERSECT tm kim tt c cc khch hng c vay v c mt ti khon ti ngn hng (SELECT DISTINCT Customer_name FROM Depositor) INTERSECT (SELECT DISTINCT Customer_name FROM Borrower); Php ton INTERESCT t ng loi b cc b trng, gi li cc b trng ta s dng INTERSECT ALL (SELECT Customer_name FROM Depositor) INTERSECT ALL (SELECT Customer_name FROM Borrower); - Php ton EXCEPT Tm kim tt c cc khch hng c ti khon nhng khng c vay ti ngn hng (SELECT Customer_name FROM Depositor) EXCEPT (SELECT Customer_name FROM Borrower); EXCEPT t ng loi b cc b trng, nu mun gi li cc b trng phi dng EXCEPT ALL (SELECT Customer_name FROM Depositor) EXCEPT ALL
CHNG II SQL
trang 22

H QUN TR C S D LIU

(SELECT Customer_name FROM Borrower);

CC HM TNH GP
SQL c cc hm tnh gp (aggregate functions): - Tnh trung bnh (Average): AVG() - Tnh min : MIN() - Tnh max: MAX() - Tnh tng: SUM() - m: COUNT() i s ca cc hm AVG v SUM phi l kiu d liu s "Tm s cn i ti khon trung bnh ti chi nhnh Perryridge SELECT AGV(balace) FROM Account WHERE Branch_name = Perryridge; SQL s dng mnh GROUP BY vo mc ch nhm cc b c cng gi tr trn cc thuc tnh no "Tm s cn i ti khon trung bnh ti mi chi nhnh ngn hng SELECT Branch_name, AVG(balance) FROM Account GROUP BY Branch_name; Tm s cc ngi gi tin i vi mi chi nhnh ngn hng SELECT Branch_name, COUNT(DISTINCT Customer_name) FROM Depositor, Account WHERE Depositor.Account_number = Account.Acount_number GROUP BY Branch_name Gi s ta mun lit k cc chi nhnh ngn hng c s cn i trung bnh ln hn 1200$. iu kin ny khng p dng trn tng b, n p dng trn tng nhm. thc hin c iu ny ta s dng mnh HAVING ca SQL SELECT Branch_name, AVG(balance) FROM Account GROUP BY Branch_name HAVING AGV(Balance) > 1200$; V t trong mnh HAVING c p dng sau khi to nhm, nh vy hm AVG c th c s dng Tm s cn i i vi tt c cc ti khon SELECT AVG(Balance) FROM Account; m s b trong quan h Customer SELECT Count(*) FROM Customer; SQL khng cho php s dng DISTINCT vi COUNT(*), nhng cho php s dng DISTINCT vi MIN v MAX. Nu WHERE v HAVING c trong cng mt cu vn tin, v t sau WHERE c p dng trc. Cc b tho mn v t WHERE c xp vo trong nhm bi GROUP BY, mnh HAVING (nu c) khi c p dng trn mi nhm. Cc nhm khng tho mn mnh HAVING s b xo b. Tm s cn i trung bnh i vi mi khch hng sng Harrison v c t nht ba ti khon SELECT Depositor.Customer_name, AVG(Balance)
CHNG II SQL
trang 23

H QUN TR C S D LIU

FROM Depositor, Account, Customer WHERE Depositor.Account_number = Account.Account_number AND Depositor.Customer_name = Customer.Customer_name AND Customer.city =Harrison GROUP BY Depositor.Customer_name HAVING COUNT(DISTINT Depositor.Account_number) >= 3;

CC GI TR NULL
SQL cho php s dng cc gi tr null ch s vng mt thng tin tm thi v gi tr ca mt thuc tnh. Ta c th s dng t kho c bit null trong v t th mt gi tr null. "Tm tm tt c cc s vay trong quan h Loan vi gi tr Amount l null" SELECT Loan_number FROM Loan WHERE Amount is null V t not null th cc gi tr khng rng S dng gi tr null trong cc biu thc s hc v cc biu thc so snh gy ra mt s phin phc. Kt qu ca mt biu thc s hc l null nu mt gi tr input bt k l null. Kt qu ca mt biu thc so snh cha mt gi tr null c th c xem l false. SQL92 x l kt qu ca mt php so snh nh vy nh l mt gi tr unknown, l mt gi tr khng l true m cng khng l false. SQL92 cng cho php th kt qu ca mt php so snh l unknown hay khng. Tuy nhin, trong hu khp cc trng hp, unknown c x l hon ton ging nh false. S tn ti ca cc gi tr null cng lm phc tp vic s l cc ton t tnh gp. Gi s mt vi b trong quan h Loan c cc gi tr null trn trng Amount. Ta xt cu vn tin sau: SELECT SUM(Amount) FROM LOAN Cc gi tr c ly tng trong cu vn tin bao hm c cc tr null. Thay v tng l null, SQL chun thc hin php tnh tng bng cch b qua cc gi tr input l null. Ni chung, cc hm tnh gp tun theo cc quy tc sau khi x l cc gi tr null: Tt c cc hm tnh gp ngoi tr COUNT(*) b qua cc gi tr input null. Khi cc gi tr nul b b qua, tp cc gi tr input c th l rng. COUNT() ca mt tp rng c nh ngha l 0. Tt c cc hm tnh gp khc tr li gi tr null khi p dng trn tp hp input rng.

CC CU VN TIN CON LNG NHAU (Nested Subqueries)


SQL cung cp mt c ch lng nhau ca cc cu vn tin con. Mt cu vn tin con l mt biu thc SELECT-FROM-WHERE c lng trong mt caau vn tin khc. Cc cu vn tin con thng c s dng th quan h thnh vin tp hp, so snh tp hp v bn s tp hp.

QUAN H THNH VIN TP HP (Set relationship)


SQL a vo cc php tnh quan h cc php ton cho php th cc b c thuc mt quan h no hay khng. Lin t IN th quan h thnh vin ny. Lin t NOT IN th quan h khng l thnh vin. "Tm tt c cc khch hng c c vay ln mt ti khon ti ngn hng" Ta s dng INTERSECTION vit cu vn tin ny. Ta c th vit cu vn tin ny bng cc s dng IN nh sau: SELECT DISTINCT Customer_name
CHNG II SQL
trang 24

H QUN TR C S D LIU

FROM Borrower WHERE Customer_name IN ( SELECT Customer_name FROM Depositor) V d ny th quan h thnh vin trong mt quan h mt thuc tnh. SQL92 cho php th quan h thnh vin trn mt quan h bt k. "Tm tt c cc khch hng c c vay ln mt ti khon chi nhnh Perryridge" Ta c th vit cu truy vn nh sau: SELECT DISTINCT Customer_name FROM Borrower, Loan WHERE Borrower. Loan_number = Loan.Loan_number AND Branch_name = 'Perryridge' AND (Branch_name. Customer_name IN (SELECT Branch_name, Customer_name FROM Depositor, Account WHERE Depositor.Account_number = Account.Account_number ) "Tm tt c cc khch hng c vay ngn hng nhng khng c ti khon ti ngn hng" SELECT DISTINCT Customer_name FROM borrower WHERE Customer_name NOT IN ( SELECT Customer_name FROM Depositor) Cc php ton IN v NOT IN cng c th c s dng trn cc tp hp lit k: SELECT DISTINCT Customer_name FROM borrower WHERE Customer_name NOT IN ('Smith', 'Jone')

SO SNH TP HP (Set Comparision)


"Tm tn ca tt c cc chi nhnh c ti sn ln hn t nht mt chi nhnh ng ti Brooklyn" SELECT DISTINCT Branch_name FROM Branch AS T, Branch AS S WHERE T.assets > S.assets AND S.branch_city = 'Brooklyn' Ta c th vit li cu vn tin ny bng cch s dng mnh "ln hn t nht mt"trong SQL SOME : SELECT Branch_name FROM Branch WHERE Assets > SOME ( SELECT Assets FROM Branch WHERE Branch_city ='Brooklyn') Cu vn tin con ( SELECT Assets FROM Branch WHERE Branch_city ='Brooklyn') sinh ra tp tt c cc Assets ca tt c cc chi nhnh ng ti Brooklyn. So snh > SOME trong mnh WHERE nhn gi tr ng nu gi tr Assets ca b c xt ln hn t nht mt trong cc gi tr ca tp hp ny. SQL cng c cho php cc so snh < SOME, >= SOME, <= SOME, = SOME, <> SOME ALL "Tm tt c cc tn ca cc chi nhnh c ti sn ln hn ti sn ca bt k chi nhnh no ng ti Brooklyn"
CHNG II SQL
trang 25

H QUN TR C S D LIU

SELECT Branch_name FROM Branch WHERE Assets > ALL (

SELECT Assets FROM Branch WHERE Branch_citty = 'Brooklyn')

SQL cng cho php cc php so snh: < ALL, <= ALL, > ALL, >= ALL, = ALL, <> ALL. "Tm chi nhnh c s cn i trung bnh ln nht" SQL khng cho php hp thnh cc hm tnh gp, nh vy MAX(AVG (...)) l khng c php. Do vy, ta phi s dng cu vn tin con nh sau: SELECT Branch_name FROM Account GROUP BY Branch_name HAVING AVG (Balance) >= ALL ( SELECT AVG (balance) FROM Account GROUP BY Branch_name)

TH CC QUAN H RNG
"tm tt c cc khch hng c c vay ln ti khon ngn hng" SELECT Customer_name FROM Borrower WHERE EXISTS ( SELECT * FROM Depositor WHERE Depositor.Customer_name = Borrower.Customer_name) Cu trc EXISTS tr li gi tr true nu quan h kt qu ca cu vn tin con khng rng. SQL cng cho php s dng cu trc NOT EXISTS kim tra tnh khng rng ca mt quan h. "Tm tt c cc khch hng c ti khon ti mi chi nhnh ng ti Brooklyn" SELECT DISTINCT S.Customer_name FROM Depositor AS S WHERE NOT EXISTS ( ( SELECT Branch_name FROM Branch WHERE Branch_city = 'Brooklyn') EXCEPT ( SELECT R.branch_name FROM Depositor AS T, Account AS R WHERE T.Acoount_number = R.Account_number AND S.Customer_name = T.Customer_name) )

TH KHNG C CC B TRNG
SQL a vo cu trc UNIQUE kim tra vic c b trng trong quan h kt qu ca mt cu vn tin con. "Tm tt c khch hng ch c mt ti khon chi nhnh Perryridge" SELECT T.Customer_name FROM Depositor AS T WHERE UNIQUE ( SELECT R.Customer_name FROM Account, Depositor AS R WHERE T.Customer_name = R.Customer_name AND R.Account_number = Account.Acount_number AND Account.Branch_name = 'Perryridge')
CHNG II SQL
trang 26

H QUN TR C S D LIU

Ta c th th s tn ti ca cc b trng trong mt vn tin con bng cch s dng cu trc NOT UNIQUE "Tm tt c cc khch hng c t nht hai ti khon chi nhnh Perryridge" SELECT DISTINCT T.Customer_name FROM Account, Depositor AS T WHERE NOT UNIQUE ( SELECT R.Customer_name FROM Account, Depositor AS R WHERE T.Customer_name=R.Customer_name AND R.Account_number = Account.Account_number AND Account.Branch_name = 'Perryridge') UNIQUE tr li gi r false khi v ch khi quan h c hai b trng nhau. Nu hai b t1, t2 c t nht mt trng null, php so snh t1 = t2 cho kt qu false. Do vy UNIQUE c th tr v gi tr true trong khi quan h c nhiu b trng nhau nhng cha trng gi tr null !

QUAN H DN XUT
SQL92 cho php mt biu thc vn tin con c dng trong mnh FROM. Nu biu thc nh vy c s dng, quan h kt qu phi c cho mt ci tn v cc thuc tnh c th c t tn li (bng mnh AS) V d cu vn tin con: (SELECT Branch_name, AVG(Balance) FROM Account GROUP BY Branch_name) AS result (Branch_name, Avg_balace) Sinh ra quan h gm tn ca tt c cc chi nhnh, v s cn i trung bnh tng ng. Quan h ny c t tn l result vi hai thuc tnh Branch_name v Avg_balance. "Tm s cn i ti sn trung bnh ca cc chi nhnh ti s cn i ti khon trung bnh ln hn 1200$" SELECT Branch_name, avg_balance FROM ( SELECT Branch_name, AVG(Balance) FROM Account GROUP BY Branch_name) AS result (Branch_name, Avg_balace) WHERE avg_balance > 1200

VIEWS
Trong SQL, nh ngha view ta s dng lnh CREATE VIEW. Mt view phi c mt tn. CREATE VIEW < tn view > AS < Biu thc vn tin > "To mt view gm cc tn chi nhnh, tn ca cc khch hng c hoc mt ti khon hoc vay chi nhnh ny" Gi s ta mun t tn cho view ny l All_customer. CREATE VIEW All_customer AS ( SELECT Branch_name, Customer_name FROM Depositor, Account WHERE Depositor.Account_number = Account.Account_number ) UNION ( SELECT Branch_name, Customer_name FROM Borrower, Loan WHERE Borrower.Loan_number = Loan.Loan_number) Tn thuc tnh ca mt view c th xc nh mt cch tng minh nh sau:
CHNG II SQL
trang 27

H QUN TR C S D LIU

CREATE VIEW Branch_total_loan (Branch_name, Total_loan) AS ( SELECT Branch_name, sum(Amount) FROM Loan GROUP BY Branch_name) Mt view l mt quan h, n c th tham gia vo cc cu vn tin vi vai tr ca mt quan h. SELECT Customer_name FROM All_customer WHERE Branch_name = 'Perryridge' Mt cu vn tin phc tp s d hiu hn, d vit hn nu ta cu trc n bng cch phn tch n thnh cc view nh hn v sau t hp li. nh ngha view c gi trong CSDL n tn khi mt lnh DROP VIEW < tn view > c gi. Trong chun SQL 3 hin ang c pht trin bao hm mt ngh h tr nhng view tm khng c lu trong CSDL.

SA I C S D LIU
DELETE INSERT UPDATE

XA (Delete)
Ta ch c th xo nguyn vn mt b trong mt quan h, khng th xo cc gi tr ca cc thuc tnh. Biu thc xo trong SQL l: DELETE FROM r [WHERE P] Trong p l mt v t v r l mt quan h. Lnh DELETE duyt qua tt c cc b t trong quan h r, nu P(t) l true, DELETE xo t khi r. Nu khng c mnh WHERE, tt c cc b trong r b xo. Lnh DELETE ch hot ng trn mt quan h. DELETE FROM Loan = Xo tt c cc b ca quan h Loan DELETE FROM Depositor WHERE Customer_name = 'Smith' DELETE FROM Loan WHERE Amount BETWEEN 1300 AND 1500 DELETE FROM Account WHERE Branch_name IN ( SELECT Branch_name FROM Branch WHERE Branch_city = 'Brooklyn') DELETE FROM Account WHERE Balance < (SELECT AVG(Balance) FROM Account)

XEN (Insert)
xen d liu vo mt quan h, ta xc nh mt b cn xen hoc vit mt cu vn tin kt qu ca n l mt tp cc b cn xen. Cc gi tr thuc tnh ca b cn xen phi thuc vo min gi tr ca thuc tnh v s thnh phn ca b phi bng vi ngi ca quan h. Xen vo quan h Account mt b c s ti khon l A-9732, s cn i l 1200$ v ti khon ny c m chi nhnh Perryridge INSERT INTO Account VALUES (Perryridge, A-9732, 1200);

CHNG II SQL

trang

28

H QUN TR C S D LIU

Trong v d ny th t cc gi tr thuc tnh cn xen trng khp vi th t cc thuc tnh trong s quan h. SQL cho php ch r cc thuc tnh v cc gi tr tng ng cn xen: INSERT INTO Account (Branch_name, Account_number, Balance) VALUES (Perryridge, A-9732, 1200); INSERT INTO Account (Account_number, Balance, Branch_name) VALUES (A-9732, 1200, Perryridge); Cp cho tt c cc khch hng vay chi nhnh Perryridge mt ti khon vi s cn i l 200$ nh mt qu tng s dng s vay nh s ti khon INSERT INTO Account SELECT Branch_name, Loan_number, 200 FROM Loan WHERE Branch_name = Perryridge INSERT INTO Depositor SELECT Customer_name, Loan_number FROM Borrower, Loan WHERE Borrower.Loan_number = Loan.Loan_number AND Branch_name = Perryridge

CP NHT (Update)
Cu lnh UPDATE cho php thay i gi tr thuc tnh ca cc b Thm li hng nm vo s cn i vi t l li sut 5% UPDATE Account SET Balance = Balance*1.05 Gi s cc ti khon c s cn i > 10000$ c hng li sut 6%, cc ti khon c s cn i nh hn hoc bng 10000 c hng li sut 5% UPDATE Account SET Balance = Balance*1.06 WHERE Balance > 10000 UPDATE Account SET Balance = Balance*1.05 WHERE Balance <= 10000 SQL92 a vo cu trc CASE nh sau: CASE WHEN P1 THEN Result1 WHEN P2 THEN Result2 ... WHEN Pn THEN Resultn ELSE Result0 END trong Pi l cc v t, Resulti l cc kt qu tr v ca hot ng CASE tng ng vi v t Pi u tin tha mn. Nu khng v t Pi no tha mn CASE tr v Result0. Vi cu trc CASE nh vy ta c th vit li yu cu trn nh sau: UPDATE Account SET Balance = CASE WHEN Balance > 10000 THEN Balance*1.06 ELSE Balance*1.05 END Tr 5% li cho cc ti khon c s cn i ln hn s cn i trung bnh UPDATE Account
CHNG II SQL
trang 29

H QUN TR C S D LIU

SET Balance = Balance*1.05 WHERE Balance > SELECT AVG(Balance) FROM Account

CC QUAN H NI
SQL92 cung cp nhiu c ch cho ni cc quan h bao hm ni c iu kin v ni t nhin cng nh cc dng ca ni ngoi. Loan INNER JOIN Borrower ON Loan.Loan_number = Borrower.Loan_number Ni quan h Loan v quan h Borrower vi iu kin: Loan.Loan_number = Borrower.Loan_number Quan h kt qu c cc thuc tnh ca quan h Loan v cc thuc tnh ca quan h Borrower (nh vy thuc tnh Loan_number xut hin 2 ln trong quan h kt qu). i tn quan h (kt qu) v cc thuc tnh, ta s dng mnh AS Loan INNER JOIN Borrower ON Loan.Loan_number = Borrower.Loan_number AS LB(Branch, Loan_number, Amount, Cust, Cust_Loan_number) Loan LEFT OUTER JOIN Borrower ON Loan.Loan_number = Borrower.Loan_number Php ni ngoi tri c tnh nh sau: u tin tnh kt qu ca ni trong INNER JOIN. Sau i vi mi b t ca quan h tri (Loan) khng tng xng vi b no trong quan h bn phi (borrower) khi thm vo kt qu b r gm cc gi tr thuc tnh tri l cc gi tr thuc tnh ca t, cc thuc tnh cn li (phi) c t l null. Loan NATURAL INNER JOIN Borrower L ni t nhin ca quan h Loan v quan h Borrower (thuc tnh trng tn l Loan_number).

NGN NG NH NGHA D LIU (DDL)


DDL SQL cho php c t: o S cho mi quan h o Min gi tr kt hp vi mi thuc tnh o cc rng buc ton vn o tp cc ch mc c duy tr cho mi quan h o thng tin v an ton v quyn cho mi quan h o cu trc lu tr vt l ca mi quan h trn a

CC KIU MIN TRONG SQL


SQL-92 h tr nhiu kiu min trong bao hm cc kiu sau: o char(n) / charater: chui k t d di c nh, vi di n c xc nh bi ngi dng o vachar(n) / character varying (n): chui k t di thay i, vi di ti a c xc dnh bi ngi dung l n o int / integer: tp hu hn cc s nguyn o smallint: tp con ca tp cc s nguyn int o numeric(p, d): s thc du chm tnh gm p ch s (k c du) v d trong p ch s l cc ch s phn thp phn o real, double precision: s thc du chm ng v s thc du chm ng chnh xc kp o float(n): s thc du chm ng vi chnh xc c xc nh bi ngi dng t nht l n ch s thp phn
CHNG II SQL
trang 30

H QUN TR C S D LIU

o date: kiu nm thng ngy (YYYY, MM, DD) o time: kiu thi gian (HH, MM, SS) SQL-92 cho php nh ngha min vi c php: CREATE DOMAIN < tn min > < Type > V d: CREATE DOMAIN hoten char(30); Sau khi nh ngha min vi tn hoten ta c th s dng n nh ngha kiu ca cc thuc tnh

NH NGHA S TRONG SQL.


Lnh CREATE TABLE vi c php CREATE TABLE < tn bng > ( < Thuc tnh 1 > < min gi tr thuc tnh 1 > , ... < Thuc tnh n > < min gi tr thuc tnh n> , < rng buc ton vn 1 > , ... < rng buc ton vn k >) Cc rng buc ton vn cho php bao gm: primary key ( Ai1 , A i 2 ,..., A i m ) v check(P) c t primary key ch ra rng cc thuc tnh Ai1 , A i 2 ,..., A i m to nn kho chnh ca quan h. Mnh check xc nh mt v t P m mi b trong quan h phi tho mn. V d: CREATE TABLE customer ( customer_name CHAR(20) not null, customer_street CHAR(30), customer_city CHAR(30), PRIMARY KEY(customer_name)); CREATE TABLE branch ( branch_name CHAR(15) not null, branch_city CHAR(30), assets INTEGER, PRIMARY KEY (branch_name), CHECK (assets >= 0)); CREATE TABLE account ( account_number CHAR(10) not null, branch_name CHAR(15), balance INTEGER, PRIMARY KEY (account_number), CHECK (balance >= 0)); CREATE TABLE depositor ( customer_name CHAR(20) not null, account_number CHAR(10) not null, PRIMARY KEY (customer_name, account_namber)); Gi tr null l gi tr hp l cho mi kiu trong SQL. Cc thuc tnh c khai bo l primary key i hi phi l not null v duy nht. do vy cc khai bo not null trong v d trn l d (trong SQL-92). CREATE TABLE student (
CHNG II SQL
trang 31

H QUN TR C S D LIU

name CHAR(15) not null, student_ID CHAR(10) not null, degree_level CHAR(15) not null, PRIMARY KEY (student_ID), CHECK (degree_level IN (Bachelors, Masters, Doctorats)); Xo mt quan h khi CSDL s dng lnh Drop table vi c php: DROP TABLE < tn bng > Thm thuc tnh vo bng ang tn ti s dng lnh Alter table vi c php: ALTER TABLE < tn bng > ADD < thuc tnh > < min gi tr > Xo b mt thuc tnh khi bng ang tn ti s dng lnh Alter table vi c php: ALTER TABLE < Tn bng > DROP < tn thuc tnh >

SQL NHNG (Embedded SQL)


Mt ngn ng trong cc vn tin SQL c nhng gi l ngn ng ch (host language), cu trc SQL cho php trong ngn ng ch to nn SQL nhng. Chng trnh c vit trong ngn ng ch c th s dng c php SQL nhng truy xut v cp nht d liu c lu tr trong CSDL.

BI TP CHNG II

II.1.

Xt CSDL bo him sau: person(ss#, name, address): S bo him ss# s hu bi ngi tn name a ch address car(license, year, model): Xe hi s dng k license, sn xut nm year, nhn hiu Model accident(date, driver, damage_amount): tai nn xy ra ngy date, do ngi li driver, mc h hi damage_amount owns(ss#, license): ngi mang s bo him ss# s hu chic xe mang s ng k license log(license, date, driver): ghi s chic xe mang s ng k license, b tai nn ngy do ngi li driver cc thuc tnh c gch di l cc primary key. Vit trong SQL cc cu vn tin sau: 1. Tm tng s ngi xe ca h gp tai nn nm 2001 2. Tm s cc tai nn trong xe ca"John"lin quan ti 3. Thm khch hng mi: ss# =A-12345, name ="David, address ="35 Chevre Road, license ="109283, year =2002, model ="FORD LASER"vo CSDL 4. xo cc thng tin lien quan dn xe model "MAZDA"ca"John Smith 5. Thm thng tin tai nn cho chic xe"TOYOTA"ca khch hng mang s bo him s"A-84626
trang 32

CHNG II SQL

H QUN TR C S D LIU

II.2.

Xt CSDL nhn vin: employee (E_name, street, city): Nhn vin c tn E_name, c tr ti ph street, trong thnh ph city works (E_name, C_name, salary): Nhn vin tn E_name lm vic cho cng ty C_name vi mc lng salary copany (C_name, city): Cng ty tn C_name ng ti thnh ph city manages(E_name, M_name): Nhn vin E_name di s qun l ca nhn vin M_name Vit trong SQL cc cu vn tin sau: 1. Tm tn ca tt c cc nhn vin lm vic cho First Bank 2. Tm tn v thnh ph c tr ca cc nhn vin lm vic cho First Bank 3. Tm tn, ph, thnh ph c tr lm vic cho First Bank hng mc lng > 10000$ 4. Tm tt c cc nhn vin trong CSDL sng trong cng thnh ph vi cng ty mang h lm vic cho 5. Tm tt c cc nhn vin sng trong cng thnh ph, cng ph vi ngi qun l ca h 6. Tm trong CSDL cc nhn vin khng lm vic cho First Bank 7. Tm trong CSDL, cc nhn vin hng mc lng cao hn mi nhn vin ca Small Bank 8. Gi s mt cng ty c th ng trong mt va thnh ph. Tm tt c cc cng ty ng trong mi thnh ph trong Small Bank ng. 9. Tm tt c cc nhn vin hng mc lng cao hn mc lng trung bnh ca cng ty h lm vic 10. Tm cng ty c nhiu nhn vin nht 11. Tm cng ty c tng s tin tr lng nh nht 12. Tm tt c cc cng ty c mc lng trung bnh cao hn mc luong trung bnh ca cng ty First Bank 13. Thay i thnh ph c tr ca nhn vin"Jones"thnh NewTown 14. Nng lng cho tt c cc nhn vin ca First Bank ln 10% 15. nng lng cho cc nh qun l ca cng ty First Bank ln 10% 16. Xo tt c cc thng tin lin quan ti cong ty Bad Bank

CHNG II SQL

trang

33

H QUN TR C S D LIU

CHNG II SQL

trang

34

You might also like