Sunteți pe pagina 1din 30

150 Partea l Utilizarea general a sistemului MySQL [... ] corespunde oricrui caracter plasat ntre paranteze drepte. Pute!

i speci"ica un meniu de caractere prin precizarea e#tremit!ilor domeniului$ separate printr%o liniu! &' Pentru a nega sensul clasei &ast"el nc(t s corespund tuturor caracterelor care nu se a"l ) list*$ speci"ica!i ' ca prim caracter al clasei+ ,a-c, ./0/1P ,[a%z], 2 1 ,a-c, ./0/1P ,[3a%z], 2o ' corespunde oricrui numr de elemente la "el cu cel anterior semnului. 4e e#emplu$+ corespunde oricrui numr de caractere #+ ,a-cde", ./0/1P ,a.'", o 1 ,a-c, ./0/1P ,[0%5]'a-c6 21 ,a-c, ./0/1P , [0%5][0%5]', 7' 8 98rice numr, nseamn :i zero apari!ii$ moti; pentru care a doua e#presie este ac ;rat. 6mod :i mod< ancoreaz o coresponden! cu un model ast"el nc(t modelul mod punde numai atunci c(nd sur;ine la nceputul sau la s"(r:itul unui :ir$ iar ,mod< cor punde numai dac mod corespunde ntregului :ir+ ,a-c, ./0/1P ,-, 7' 1 ,a-c, ./0/1P ,6-, ' 8 ,a-c, ./0/1P ,-<, o8 ,a-c, ./0/1P ,3a-c<, o 1 ,a-cd, ./0/1P ,3a-c<, =' 8 Modelul ./0/1P poate "i luat din coloana unui ta-el$ de:i aceast opera!ie ;a "i mai le dec(t un model de tip constant$ n cazul n care coloana con!ine numeroase ;a di"erite. Modelul tre-uie e#aminat :i con;enit n "orm intern de "iecare dat ;aloarea din coloan se modi"ic. Sta-ilirea coresponden!elor cu e#presiile regulate din MySQL dispune si de alte > tere model speciale. ?ezi 3ne#a @ pentru mai multe in"orma!ii. Preceden!a operatorilor @(nd MySQL e;alueaz c e#presie$ e#amineaz operatorii pentru a determina ordinel care tre-uie s grupeze termenii e#presiei. Unii operatori au o preceden! mai ridicat$A sunt mai 9puternici, dec(t al!i1.$ n sensul c sunt e;alua!i naintea altora. 4e e#em)) nmul!irea si mpr!irea au o preceden! mai ridicat dec(t adunarea :i scade Urmtoarele dou e#presii sunt ecBi;alente$ deoarece ' :i C sunt e;aluate nainte de D <L E 1DF'E%GC5 =' H.F 1 D H % .I t' H.F Preceden!a operatorilor este prezentat n lista urmtoare$ n ordine descresctoare2 8peratorii men!iona!i pe aceea:i linie au aceea:i preceden!. 8peratorii cu un ni;d preceden! mai ridicat sunt e;alua!i naintea operatorilor cu un ni;el de preceden! i redus. JKL3.M L8N O % &minus unar* @apitolul F Lucrul cu date n MySQL :i SQL 151 CP Q 77RR7R> iR 7> >R > KL KS LKS/ ./0/1P .LKS/ J/NT//L 3L4 QQ 8. KK Pute!i "olosi paranteze pentru a ignora preceden!a operatorilor :i pentru a modi"ica ordinea n care sunt e;alua!i termenii unei e#presii+ 1DF'E%GC5 ' H.F &1 D F* ' &E % G* C 5 ' %0.H ?alorile LULL n e#presii Ui!i atent c(nd "olosi!i ;aloarea LULL n e#presii$ deoarece rezultatul s%ar putea s nu "ie ntotdeauna cel scontat$ ndrumrile urmtoare ; ;or a)uta s e;ita!i surprizele. 4ac speci"ica!i LULL ca operand pentru orice operator aritmetic sau la ni;el de -it$ rezultatul este LULL+ 1 D LULL 7' LULL 1 V LULL 8 LULL 4ac "olosi!i LULL cu un operator logic$ ;aloarea LULL este considerat "als+ 1 3L4 LULL 8 8 1 8. LULL 8 1 8 3L4 LULL =' 8 0 8. LULL 2 8

LULL ca operand pentru orice operator de compara!ie produce un rezultat LULL$ cu e#cep!ia operatorilor 7R>$ KS LULL :i KS L8N LULL$ care sunt special concepu!i pentru manipularea ;alorilor LULL+ 1 R LULL 8 LULL LULL R LULL =' LULL 1 7R> LULL 8 8 LULL 7R> LULL =' 1 1 KS LULL 7' 0 LULL KS LULL =' 1 Kn general$ "unc!iile returneaz LULL dac primesc argumente LULL$ cu e#cep!ia acelor "unc!ii concepute pentru a manipula argumente LULL. 4e e#emplu$ KULULL&* poate manipula argumente LULL :i returneaz 9ade;rat, sau 9"als, n consecin!. SN.@MP&* presupune argumente non%LULLA dac descoper c i%a!i trans"erat un argument LULL$ returneaz LULL$ nu 9ade;rat, sau 9"als,. Kn cadrul opera!iilor de sortare$ ;alorile LULL se grupeaz la un loc. LULL este plasat$ dup sortare$ naintea tuturor ;alorilor non%LULL &inclusi; :irul ;id* n cazul unei sortri ascendente$ respecti; dup toate aceste ;alori la o sortare descendent. ,?@Q"?. m'm%,%>% === %6?6,'A. QWX5 15F Partea l Utilizarea general a sistemului MySQL @on;ersia de tip MySQL e#ecut automat con;ersii masi;e de tip$ n con"ormitate cu genul de opera!ii pe care o e"ectua!i$ ori de c(te ori o ;aloare de un tip este "olosit ntr%un conte#t cari necesit o ;aloare de un alt tip. @on;ersia de tip se poate produce din oricare din urmV toarele moti;e+ = @on;ersia operanzilor la un tip adec;at pentru e;aluarea unui operator = @on;ersia argumentului unei "unc!ii la un tip scontat de "unc!ie = @on;ersia unei ;alori pentru repartizarea ntr%o coloan de ta-el care este de un alt t ) /#presia urmtoare necesit con;ersia de tip. /#presia const din operatorul de adur :i doi operanzi$ 1 :i ,F,+ 1 D ,F, 8peranzii sunt de tipuri di"erite &numr si :ir*$ deci MySQL l con;erte:te pe unul pent a%i aduce la un numitor comun. 4ar care este operandul care tre-uie modi"icatX n+ caz$ D este un operator numeric$ deci MySQL dore:te ca operanzii s "ie numere :i coi ;erte:te :irul , F, n numrul F. 3poi$ e;alueaz e#presia pentru a produce rezultatul E.2 Kat un alt e#emplu. Uunc!ia @8L@3N &* concateneaz :irurile pentru a produce dre" rezultat un :ir mai lung. Pentru aceasta$ "unc!ia :i interpreteaz argumentele su- "or de :iruri$ indi"erent de tipul acestora. 4ac i trans"era!i o mul!ime de numere$ @8L@3N&V le ;a con;erti n :iruri$ dup care ;a returna rezultatul concatenrii acestora+ @8L@3N&1$F$E* 7' ,1FE, 4ac apelul la "unc!ia @8L@3N "ace parte dintr%o e#presie mai mare$ ;or mai a;ea loc alte con;ersii de tip. S lum urmtoarea e#presie :i rezultatul ei+ ./P/3N@16.@8L@3NY2.SZCK8* 2> 6111111111111, @8L@3N &1$F$E* produce :irul, 1FE,. /#presia , 1FE, C10 este con;ertit n 1FE C10$ deoa mpr!irea este un operator aritmetic. .ezultatul aceste e#presii ;a "i 1F.E ntr%un cone cu ;irgul mo-il$ dar "unc!ia ./P/3N &* presupune un numr ntreg de repetri$ deci; e#ecut o mpr!ire ntreag pentru a se o-!ine rezultatul 1F. 3poi$ "unc ./P/3N&6 16 $1F* are ca rezultat un :ir "ormat din 1F caractere 6 16. Un principiu general care tre-uie re!inut este acela c MySQL ncearc s con;ertea ;alorile n tipul cerut de o e#presie$ n loc de a genera o eroare$ n "unc!ie de cont MySQL ;a con;erti ;alorile "iecreia din cele trei categorii generale &numere$ :iruri i date si ore* n ;alori ale oricreia din celelalte categorii. Notu:i$ ;alorile nu pot "i n! deauna con;ertite dintr%un tip n altul. 4ac o ;aloare care tre-uie con;ertit ntr%un t dat nu este o ;aloare admis pentru tipul respecti;$ con;ersia e:ueaz. @on;ersia2 numere a unor o-iecte precum , a-c, care nu prezint un aspect numeric are ca re ;aloarea 0. @on;ersia n tipuri dat :i or a unor o-iecte care au aspectul unor date sau ore rezultat ;aloarea 9zero, pentru tipul respecti;. 4e e#emplu$ con;ersia :irului ,a-c, n!) dat are ca rezultat data de tip zero ,0000%00%00,. Pe de alt parte$ orice ;aloare poatX tratat su- "orma unui :ir$ deci n general con;ersia unei ;alori ntr%un :ir nu constitute pro-lem. @apitolul F Lucrul cu date n MySQL :i SQL 15E 4e asemenea$ MySQL e#ecut :i con;ersii minore de tip. 4ac "olosi!i o ;aloare cu ;irgul mo-il ntr%un conte#t ntreg$ ;aloarea este con;ertit &cu rotun)ire*. @on;ersia n cealalt direc!ie este de asemenea posi-ilA un ntreg poate "i "olosit "r pro-leme ca numr n ;irgul mo-il.

@onstantele Be#azecimale sunt tratate ca :iruri$ cu e#cep!ia situa!iilor c(nd conte#tul indic cu claritate un numr$ n conte#tele :ir$ "iecare perecBe de ci"re Be#azecimale este con;ertit ntr%un caracter :i rezultatul este "olosit ca :ir. Urmtoarele e#emple ilustreaz acest principiu+ 0#H1 o ,a, 0#H1 D0 o 5[ @8L@3N&81H1* 8 ,a, @8L@3N&81H1 D0* 8 ,5[, 3cela:i principiu de interpretare se aplic si n cazul compara!iilor+ o constant Be#azecimal este tratat ca :ir$ cu e#cep!ia cazurilor c(nd este comparat cu un numr+ 10 R 8#8a 01 10 R 0#05 00 ,\n, R 8#8a 01 ,\n, R 8#8a D 0 o8 &,\n, R 8#8a* D0 o1 Unii operatori "or!eaz con;ersia operanzilor n tipul a:teptat de operator$ indi"erent de tipul operanzilor. 8peratorii aritmetici sunt un e#emplu n acest sensA ei a:teapt numere$ iar operanzii sunt con;erti!i n consecin!+ E D G 0[ ,E, DG 0[ ,E, D ,G, 8[ Lu este su"icient ca un :ir s con!in pur :i simplu un numr pe unde;a. MySQL nu caut n tot :irul$ n speran!a c ;a gsi un numrA caut numai la nceput. 4ac un :ir nu are nici o parte numeric la nceput$ rezultatul con;ersiei este 0. ,15[E%F%G, D0 8 15[E ,1F+1G+01, D0 o 1F ,FE%;alea, D0 o FE ,%FE%;alea, D0 o %FE ,car-on%1G, D0 oo .e!ine!i c regula de con;ersie :ir%numr din MySQL s%a modi"icat ncep(nd de la ;ersiunea E.FE. 3nterior acelei ;ersiuni$ :irurile cu aspect numeric au "ost con;ertite n ;alori ntregi$ cu rotun)ire. 4e la ;ersiunea E.FE$ acestea ;or "i con;ertite n ;alori cu ;irgul mo-il+ ,%GFI.5, D0 8 %GF5 &MySQL 7 E.FE* ,%GFI.5, D0 8 %GFI.5 &MySQL E.FE* 8peratorii logici :i cu -i!i sunt cBiar mai stric!i dec(t operatorii aritmetici. 3ce:tia impun ca operanzii s nu "ie numai numerici$ ci ntregi$ iar con;ersia de tip se e#ecut m consecin!. 3ceasta nseamn c un numr cu ;irgul mo-il cum este 0$E nu este considerat ade;rat$ cBiar dac este di"erit de zeroA aceasta deoarece$ atunci c(nd este an 15G Partea l Utilizarea general a sistemului MySQL con;ertit la un ntreg$ rezultatul este 0. n e#presiile urmtoare$ operanzii nu sunt conV siderali ade;ra!i dec(t atunci c(nd au o ;aloare cel pu!in egal cu 1. 0.E 8. .0G 88 1 .E 8. . 0G 8 1 0.E 3L4 .0G 00 l 1.E 3L4 .0G 8 8 1.E 3L4 1.0G 01 3cest tip de con;ersie se produce :i n cazul "unc!iei KU&*$ care presupune ca prim; argument s "ie un ntreg. Pentru a testa n mod adec;at ;alorile cu ;irgul mo-il$ c] mai -ine este s "olosi!i o compara!ie e#plicit. Kn caz contrar$ ;alorile mai mici dec(t ;or "i considerate "alse+ KU&1.E$,non%zero,$,zero,* o ,non%zero, KU&0.E$,non%zero,$,zero,* o ,zero, KU&0.E>0$,non%zero,$,zero,* o ,non%zero, 8peratorii de sta-ilire a coresponden!elor cu un model se a:teapt s opereze cu 3ceasta nseamn c pute!i "olosi operatorii MySQL de sta-ilire a coresponden!elor i un model "olosind numere ca operanzi$ deoarece ace:tia ;or con;erti numerele n :iruriV n ncercarea de a gsi o coresponden!O 1FEG5 LKS/ ,1P, 8 1 1FEG5 ./0/1P ,1.'5, 8 1 8peratorii de compara!ie a mrimii &7$ 7R$ R :i a:a mai departe* sunt sensi-ili la contes cu alte cu;inte$ sunt e;alua!i n con"ormitate cu tipul operanzilor lor. /#presia urmi toare compar operanzii prin mi)loace numerice$ deoarece am-ii operanzi sunt numere F 7 11 01

3ceast e#presie implic o compara!ie ntre :iruri &le#icogra"ic*$ deoarece am-ii ope ranzi sunt :iruri+ ,F, 7 ,11, 00 n urmtoarele compara!ii$ tipurile sunt com-inate$ deci MySQL le compar su- "or de numere. @a rezultat$ am-ele e#presii sunt ade;rate+ ,F, 7 11 01 F 7 ,11, 01 n compara!ii$ MySQL con;erte:te operanzii con"orm necesit!ilor$ n con"ormitate urmtoarele reguli+ = n a"ara celor care implic operatorul 7R>$ compara!iile care implic LULL au ca rezi tat LULL. &8peratorul 7R> este similar cu R$ cu e#cep!ia "aptului c a"irma!ia LULL LULL este ade;rat.* = 4ac am-ii operanzi sunt :iruri$ atunci ;or "i compara!i le#icogra"ic ca :i+ @ompara!iile ntre :iruri sunt e"ectuate "olosind setul de caractere a"lat n ;igoare ser;er. = 4ac am-ii operanzi sunt ntregi$ ;or "i compara!i numeric ca ntregi. = @onstantele Be#azecimale care nu sunt comparate cu un numr sunt comparate^ :iruri -inare. $$$ @apitolul F Lucrul cu date n MySQL :i SQL 155 = 4ac oricare dintre operanzi este o ;aloare NKM/SN3MP sau 43N/NKM/ si cellalt este o constant$ operanzii sunt compara!i ca ;alori NKM/SN3MP. 3cest lucru se "ace cu scopul de a determina compara!iile s "unc!ioneze mai -ine pentru aplica!iile 84J@. = n caz contrar$ operanzii sunt compara!i numeric ca ;alori cu ;irgul mo-il. .e!ine!i c aici este inclus :i cazul compara!iei unui :ir cu un numr. _irul este con;ertit la un numr$ ceea ce are ca rezultat ;aloarea 8 dac :irul nu arat ca un numr. 4e e#emplu$ ,1G.E, este con;ertit la 1G.E$ dar ,LG.E, este con;ertit la zero. .eguli de interpretare a datei :i a orei MySQL con;erte:te li-er :irurile :i numerele n ;alori de tip dat :i or$ con"orm cerin!elor conte#tului unei e#presii$ :i ;ice;ersa. ?alorile de tip dat :i or sunt con;ertite n numere ntr%un conte#t numericA numerele sunt con;ertite n date sau ore ntr%un conte#t de tip dat sau or. 3ceast con;ersie la o ;aloare de tip dat sau or se produce atunci c(nd repartiza!i o ;aloare ntr%o coloan de tip dat sau or$ respecti; c(nd o "unc!ie necesit o ;aloare de tip dat sau or. n compara!ii$ regula general este ca ;alorile de tip dat :i or s "ie comparate ca :iruri. 4ac ta-elul ta-elul)neu con!ine o coloan 43N/ denumit data`col$ urmtoarele instruc!iuni sunt ecBi;alente+ KLS/.N KLN8 ta-elul)neu S/N data`col R ,155[%0G%1E, KLS/.N KLN8 ta-elul)neu S/N data`col R ,155[0G1E, KLS/.N KLN8 ta-elul)neu S/N data`col R 155[0G1E n e#emplele urmtoare$ argumentul "unc!iei N8`43MS&* este interpretat ca "iind una :i aceea:i ;aloare pentru toate cele trei e#presii+ N8 Z*3MS&,155[%0G%10,* N8`43MS&,155[0G10,* N8 Z*3MS&155[0G10* Nestarea :i "or!area con;ersiei de tip Pentru a e#amina modul de e"ectuare a con;ersiei de tip ntr%o e#presie$ "olosi!i programul mysal pentru a emite o interogare S/L/@N care e;alueaz e#presia+ mysal> S/L/@N 0#G1$ 0#G1 D 0A 0#G1 ) 0#G1 D 8 [F5GI5 [F5GI5 [F5GI5 H5 3:a cum ; pute!i imagina$ am "cut o mul!ime de lucruri ca acesta n timpul scrierii capitolului de "a!O Nestarea e;alurii e#presiilor este important mai ales pentru instruc!iunile precum 4/L/N/ sau UP43N/ care modi"ic nregistrri$ deoarece dori!i s "i!i sigur c modi"ica!i numai r(ndurile scontate. 8 modalitate de a ;eri"ica o e#presie este de a rula o instruc!iune S/L/@N preliminar cu aceea:i clauz TY/./ pe care urmeaz s o "olosi!i pentru instruc!iunea 4/L/N/ sau UP43N/$ pentru a ;eri"ica n ce msur clauza selecteaz r(n% durile adec;ate. S presupunem c ta-elul ta-elul)neu are o coloan @Y3. denumit cBar`col$ care con!ine urmtoarele ;alori+ 15H Partea l Utilizarea general a sistemului MySQL ,a-c, ,de", ,00, ,gBi, ,)bl, ,00, ,mno, 4ac se dau aceste ;alori$ care este e"ectul urmtoarei interogriX 4/L/N/ U.8M ta-elul)neu TY/./ cBar`col R 00 /"ectul scontat este pro-a-il :tergerea celor dou r(nduri care con!in ;aloarea ,&1*6 /"ectul real este :tergerea tuturor r(ndurilorA o surpriz neplcut. 3ceasta se nt(mpl)

ca o consecin! a regulilor de compara!ie "olosite n MySQL. cBar`col este o coloan] tip :ir$ dar 00 nu este inclus ntre gBilimele$ deci este tratat ca numr. @on"orm regulilo de compara!ie din MySQL$ o compara!ie ntre un :ir :i un numr este considerat ca V compara!ie ntre dou numere. La e#ecutarea interogrii 4/L/N/$ "iecare ;aloare coloana cBar`col este con;ertit ntr%un numr si comparat cu 0+ ,00, se con;ene la 8$ dar tot la 8 se ;or con;erti si celelalte :iruri care nu au aspect numeric. @a at clauza TY/./ este ade;rat pentru "iecare r(nd$ iar instruc!iunea 4/L/N/ :terge ta-eBi /;ident$ aceasta este o situa!ie unde ar "i "ost prudent s se testeze clauza TY/./ eu instruc!iune S/L/@N naintea e#ecu!iei instruc!iunii 4/L/N/$ deoarece aceasta ;%ar "i ar2) tat c e#presia selecteaz prea multe r(nduri+ mysal> S/L/@N cBar`col U.8M ta-elul`Jeu TY/./ cBar`col R 00A cBar col ,a-c, ,de", ^00, ,gBi, ,)bl, ,00, ,mno, @(nd nu sunte!i sigur cu pri;ire la modul n care ;a "i "olosit o ;aloare$ pute!i dori e#ploata!i mecanismul MySQL de e;aluare a e#presiilor$ pentru a "or!a con;ersia la ;aloare de un anumit tip+ = 3duga!i D0 sau D0.0 la un termen pentru a "or!a con;ersia la o ;aloare numeric+ 0#H5 7> ,e, 0#H5 D 0 2101 A i+ 0#H5 D 0.0 7' 101.0 6* = Uolosi!i @8L@3N &* pentru a trans"orma o ;aloare ntr%un :ir+ 1G =' 1G @8L@3N&1G* =' ,1G, = Utiliza!i 3S@KK &* pentru a o-!ine ;aloarea 3S@KK a unui caracter+ ,3, t!$ ,3, 3S@KK&,3,* 8 H5 @apitolul F Lucrul cu date n MySQL :i SQL 15[ = Uolosi!i 43N/`344&* pentru a "or!a tratarea unui :ir sau a unui numr ca dat+ 15550101 7' 15550101 43N/`344& 15550101$ KLN/.?3L 8 43M* =' ,1555%01%01, ,15550101, 7' 15550101 43N/`344&,15550101,$ KLN/.?3L 8 43M* ]' ,1555%01%01, @on;ersia ;alorilor din a"ara domeniului sau a ;alorilor nepermise Principiul de -az este+ semeni ;(nt$ culegi "urtun. 4ac nu ; ;eri"ica!i datele n preala-il nainte de a le stoca$ s%ar putea s nu ; plac rezultatele o-!inute. 3cestea "iind zise$ iat c(te;a principii generale care descriu modalit!ile "olosite de MySQL pentru manipularea ;alorilor situate n a"ara domeniului sau necorespunztoare din alte moti;e+ = Pentru coloane numerice sau de tip NKM/$ ;alorile care se a"l n a"ara domeniului admis sunt 9tiate, p(n la ;aloarea celei mai apropiate e#tremit!i a domeniului$ iar ;aloarea rezultant este stocat. = Pentru coloane de tip :ir altele dec(t /LUM sau S/N$ :irurile prea lungi sunt truncBiate$ pentru a se ncadra n lungimea ma#im a coloanei. .epartizrile ntr%o coloan /LUM sau S/N depind de ;alorile care sunt men!ionate ca permise la declararea coloanei. 4ac repartiza!i ntr%o coloan /LUM o ;aloare care nu este men!ionat ca mem-ru al enumerrii$ n locul acesteia este repartizat mem-rul 9eroare, &adic :irul ;id care corespunde mem-rului cu ;aloare zero*. 4ac repartiza!i coloanei S/N o ;aloare care con!ine su-%:iruri care nu sunt men!ionate ca mem-ri ai setului$ :irurile respecti;e sunt eliminate :i coloana prime:te o ;aloare care const din mem-rii rma:i. = Pentru coloanele de tip dat sau or$ ;alorile incorecte sunt con;ertite n ;alorile 9zero, adec;ate pentru tipul respecti; &;ezi ta-elul F.11*. Pentru coloanele de tip dat :i or altele dec(t NKM/$ ;alorile care se gsesc n a"ara domeniului a"erent tipului de coloan pot "i con;enite la ;aloarea 9zero,$ la LULL sau la o alt ;aloare. &@u alte cu;inte$ rezultatele sunt imposi-il de anticipat.* 3ceste con;ersii sunt raportate ca a;ertismente pentru instruc!iunile 3LN/. N3JL/$ L834 43N3$ UP43N/$ precum :i pentru instruc!iunile KLS/.N cu mai multe r(nduri$ n clientul mysal$ aceste in"orma!ii sunt a"i:ate n linia de stare care este raportat pentru o interogare. Kntr%un lim-a) de programare$ ; pute!i procura aceste in"orma!ii prin alte mi)loace. 4ac "olosi!i inter"a!a 3PK din MySQL pentru @$ pute!i apela "unc!ia mysal`in" o&*. @u a)utorul inter"e!ei 3PK pentru modulul 4JK din Perl$ pute!i "olosi atri-utul mysal`in" o &* al cone#iunii dumnea;oastr cu -aza de date. Kn"orma!iile "urnizate reprezint numrul de a;ertismente. Pentru a ;edea care au "ost r(ndurile modi"icate$ pute!i emite o interogare S/L/@N ... KLN8 8UNUKL/ :i compara!i rezultatul cu

r(ndurile originale. @3PKN8LUL E Sinta#a :i utilizarea SQL n MySQL Pentru a putea ntre!ine comunica!ii cu ser;erul MySQL este necesar s 9;or-i!i, "luer lim-a)ul MySQL. 4e e#emplu$ c(nd "olosi!i un program cum este clientul mysal$ acest "unc!ioneaz cu precdere ca un mi)loc care ; permite s trimite!i instruc!iuni SQc ctre ser;er n ;ederea e#ecutrii acestora. 4e asemenea$ tre-uie s cunoa:te!i lim-a); SQL dac dori!i s scrie!i programe care "olosesc inter"a!a MySQL "urnizat de lim-a) )ul dumnea;oastr de programare$ deoarece ;e!i continua s comunica!i cu ser;er transmi!(ndu%i instruc!iuni SQL. @apitolul l$ 9Kntroducere n MySQL :i SQL,$ a prezentat o introducere n stil 9manual, pentru numeroase dintre caracteristicile sistemului MySQL. 3cest capitol se -azeaz materialul respecti; pentru a intra n detalii pri;ind numeroase domenii ale sistemului SQK implementate de ctre MySQL. Se discut despre modul de re"erire la elementele -azelor i date$ inclusi; regulile de denumire :i restric!iile care se aplic pri;ind sensi-ilitatea la di"erentO ntre ma)uscule :i minuscule. 4e asemenea$ sunt descrise multe dintre instruc!iunile SQL i importante$ precum cele pentru crearea :i distrugerea -azelor de date$ a ta-elelor si a inde rilor$ instruc!iunile pentru regsirea datelor "olosind unirile :i instruc!iunile care in"orma!ii despre -azele de date si ta-elele dumnea;oastr. /#punerea scoate n e;iden!i unele dintre e#tensiile aduse de MySQL lim-a)ului SQL standard. @e e#ist :i ce lipse:te n MySQLX Knstruc!iunile SQL din MySQL pot "i grupate n mai multe categorii largi$ a:a cum $ poate ;edea n "igura E.1. n acest capitol$ ;om discuta despre instruc!iunile din prime patru categorii prezentate n aceast "igur. Unele dintre utilitarele MySQL "urnizea ceea ce este$ n esen!$ o inter"a! de tip linie de comand cu anumite instruc!iuni SQK 4e e#emplu$ mysalsBoW este o inter"a! cu instruc!iunea SY8T @8LUMLS. 3colo unde 7 posi-il$ aceste ecBi;alen!e sunt descrise si n capitolul de "a!. 4intre instruc!iunile care nu au "ost prezentate aici$ numeroase ;or "i discutate n capitole. 4e e#emplu$ instruc!iunile 0.3LN si ./?8S/ pentru con"igurarea pri;ilegiilor 7 utilizator sunt prezentate n capitolul 11$ 93dministrarea general a sistemul' MySQL,. Sinta#a de in;ocare a tuturor instruc!iunilor este prezentat n 3ne#a 9.e"erin! de sinta# SQL,. 4e asemenea$ tre-uie s consulta!i manualul de re"erin! MySQL pentru in"orma!ii suplimentare$ mai ales pentru modi"icrile e"ectuate n ;e unile mai recente ale lim-a)ului MySQL. @apitolul E Sinta#a :i utilizarea SQL n MySQL 155 Krearea$ :tergerea :i selectarea -azelor de date @./3N/ 43N3J3S/ 4.8P 43N3J3S/ US/ Krearea$ modi"icarea :i :tergerea ta-elelor :i a inde#urilor 3LN/. N3JL/ @./3N/ KL4/1 @./3N/ N3JL/ 4.8P KL4/1 4.8P N3JL/ 8-!inerea de in"orma!ii despre -aze de date$ ta-ele :i interogri 4/S@.KJ/ /1PL3KL SY8T Selectarea in"orma!iilor din ta-ele S/L/@N @odi"icarea in"orma!iilor din ta-ele 4/L/N/ KLS/.N L834 43N3 8PNKMKd/ N3JL/ ./PL3@/ UP43N/ Knstruc!iuni administrati;e ULUSY 0.3LN SKLL ./?8S/ 3lte instruc!iuni @./3N/ UUL@NK8L 4.8P UUL@NK8L L8@S N3JL/S S/N ULL8@S N3JL/S

Uigura E.1 Knstruc!iuni SQL acceptate de MySQL. Sec!iunea "inal a capitolului descrie ceea ce nu con!ine MySQL$ n spe! caracteristicile care i lipsesc. 3cestea sunt "unc!ionalit!i care se gsesc n alte sisteme de -aze de date$ dar nu n MySQL. Printre aceste caracteristici se numr su-selectri$ tranzac!ii$ integritate re" eren!ial$ declan:atoare$ proceduri stocate :i ;ederi. 3ceste omisiuni nseamn cum;a c MySQL nu este un sistem 9autentic, de -aze de dateX Unii cred asta$ dar ca 1H0 Partea l Utilizarea general a sistemului MySQL ii rspuns m%a: limita s o-ser; c lipsa acestor caracteristici n MySQL n%a mpiedicai "olosirea sistemului de ctre numero:i utilizatori. 3ceasta pro-a-il deoarece$ pent multe aplica!ii$ lipsa acestor caracteristici nu conteaz$ n alte situa!ii$ e#ist metode pertl tru compensarea unei "acilit!i care lipse:te. Lipsa :tergerilor n cascad$ de e#emplu nseamn c tre-uie s emite!i o interogare suplimentar n aplica!iile dumnea;oast atunci c(nd :terge!i nregistrri dintr%un ta-el. Lipsa suportului pentru tranzac!ii poa s nu conteze prea mult pentru dumnea;oastr$ dac ;i se p(re su"icient capacitatea sisZ ternului MySQL de a grupa instruc!iuni pentru o e#ecu!ie ne ntrerupt$ delimit(ndu%1 prin instruc!iuni L8@S N3JL/S si ULL8@S N3JL/S.

&3de;rata pro-lem n acest caz nu este$ de "apt$ lipsa tranzac!iilorA este lipsa une re;eniri automate pentru anularea tuturor instruc!iunilor$ dac ;reuna din ele esueaz 4ac a;e!i aplica!ii cu necesit!i precum aceea de e"ectuare a unor tranzac!ii "inancia comple#e$ care implic numeroase instruc!iuni cu inter-locare care tre-uie e#ecutate grup sau deloc$ atunci ; pute!i orienta spre un sistem de -aze de date cu "acilit!i di nregistrare$ respecti; anulare a nregistrrii$ precum Postgres.* Unele caracteristid lipsesc pur si simplu deoarece nu au "ost nc implementate. 4e e#emplu$ su-selec!iili nu sunt prezente n MySQL n timpul scrierii acestei cr!i$ dar sunt plani"icate a incluse n ;ersiunea E.FG$ care este posi-il s "i aprut de)a n momentul n care duni") nea;oastr citi!i r(ndurile de "a!. .eguli de denumire n MySQL 3proape "iecare instruc!iune SQL se re"er$ ntr%un "el sau altul$ la o -az de date sau i elementele sale constituti;e. 3ceast sec!iune descrie regulile sintactice pentru re"erir la -azele de date$ la ta-ele$ la coloane$ inde#uri :i aliasuri. Lumele !in cont de consic rente pri;ind sensi-ilitatea la di"eren!a ntre ma)uscule si minuscule$ care sunt de asem2 nea descrise. .e"erirea la elementele din -azele de date @(nd "olosi!i nume pentru a ; re"eri la elemente ale -azelor de date$ sunte!i limitat i numrul de caractere pe care le pute!i "olosi si la lungimea pe care o pot a;ea nume Uorma numelor depinde :i de conte#tul n care le "olosi!i+ .$$ = @aractere permise n nume. Lumele pot "i constituite din orice caractere al"arW merice din setul de caractere "olosit de ser;er$ plus caracterele ` :i <. Lumele ncepe cu orice caracter care este permis ntr%un nume$ inclusi; o ci"r. Notu:i$ nume nu poate "i compus numai din ci"re$ deoarece ast"el s%ar con"unda$ practic$ cu uA numr. Posi-ilitatea "urnizat de MySQL de a ncepe un nume cu un numr neo-i:nuit. 4ac "olosi!i un asemenea nume$ "i!i "oarte atent la numele care con!in i e sau un /$ deoarece aceste caractere pot duce la e#presii am-igui. FEe D 1G nsea coloana FEe plus 1G$ dar ce ne "acem cu FEeD1GX nseamn acela:i lucru sau esteiV numr scris "olosind nota!ia :tiin!i"icX = Lungimea numelui. Lumele -azelor de date$ ale ta-elelor$ coloanelor si inde#ur pot a;ea ma#imum HG de caractere lungime. Lumele aliasurilor pot a;ea ma#imu F5H de caractere lungime. @apitolul E Sinta#a :i utilizarea SQL n MySQL 1H1 = @ali"icatori de nume. Pentru a ; re"eri la o -az de date$ pur :i simplu speci"ica!i numele acesteia+ US/ nume`-aza`de`date SY8T N3JL/S U.8M nume`-aza`de`date Pentru a "ace re"erire la un ta-el$ a;e!i dou op!iuni. Un nume de ta-el complet determinat const din numele -azei de date si numele ta-elului+ SY8T N3JL/S U.8M nume``-aza``de`date.nums`ta-el S/L/@N ' U.8M nume`-aza`de`date.nume`ta-el Un nume de ta-el singur "ace re"erire la un ta-el din -aza de date curent &presta-ilit*. 4ac samp`d- este -aza de date presta-ilit$ urmtoarele instruc!iuni sunt ecBi;alente+ S/L/@N ' U.8M mem-ru S/L/@N ' U.8M samp`d-.mem-ru Pentru a "ace re"erire la o coloan$ e#ist trei op!iuni+ nume complet determinat$ nume par!ial determinat :i nume nedeterminat. Un nume complet determinat &scris su- "orma nume`-aza`de`date.nume`ta-el. nume`coloana* este complet precizat. Un nume par!ial determinat &scris su- "orma nume`ta-el. nume`coloana* se re"er la o coloan din ta-elul desemnat. Un nume nedeterminat &scris su- "orma simpl nume`coloana* se re"er la ta-elul indicat de conte#tul ncon)urtor. Urmtoarele dou interogri "ac re"erire la acelea:i nume de coloan$ dar conte#tul "urnizat de clauzele U.8M indic ta-elele din care se ;or selecta coloanele+ S/L/@N nume$ prenume U.8M pre:edinte S/L/@N nume$ prenume U.8M mem-ri 4e regul$ precizarea unor nume complet determinate nu este necesar$ de:i este ntotdeauna permis dac dori!i acest lucru. 4ac selecta!i o -az de date cu o instruc!iune US/$ -aza de date respecti; de;ine -az de date presta-ilit :i este implicit n "iecare re"erin! nedeterminat la un ta-el. 4ac "olosi!i o instruc!iune S/L/@N care "ace re"erire la un singur ta-el$ ta-elul respecti; este implicit pentru "iecare re"erire la coloan din instruc!iune. /ste necesar s preciza!i numele numai atunci c(nd un.ta-el sau o -az de date nu pot "i determinate din conte#t. Kat c(te;a situa!ii n care poate aprea ecBi;ocul+ = Knterogri care "ac re"erire la ta-ele din mai multe -aze de date. 8rice ta-el care nu se gse:te n -aza de date presta-ilit tre-uie desemnat "olosind "orma nume`-a%za`de`date.nume`ta-el$ pentru a permite sistemului MySQL s identi"ice -aza de date n care tre-uie s caute pentru a gsi ta-elul. = Knterogri care selecteaz o coloan din mai multe ta-ele$ unde mai multe ta-ele con!in o coloan cu numele respecti;. Sensi-ilitatea instruc!iunilor SQL la di"eren!a ntre ma)uscule :i minuscule Sensi-ilitatea instruc!iunilor SQL la di"eren!a ntre ma)uscule :i minuscule ;ariaz pentru di"eritele componente ale unei instruc!iuniA de asemenea$ mai poate depinde de entitatea la care "ace!i re"erire si la sistemul de operare

pe care ruleaz ser;erul+ a %_. 1HF Partea l Utilizarea general a sistemului MySQL = @u;inte cBeie :i nume de "unc!ii SQL. @u;intele cBeie :i numele de "unc!ii nu sur sensi-ile la di"eren!a ntre ma)uscule :i minuscule. /le pot "i scrise "olosindu%se oric7 mrime de liter. Urmtoarele instruc!iuni sunt ecBi;alente+ S/L/@N L8T&* select noW&* s/l/cN n8W&* = Lumele -azelor de date :i ale ta-elelor. Jazele de date si ta-elele din MySQL cores%) pund cataloagelor :i "i:ierelor din sistemul de "i:iere de -az al gazdei ser;erului$ consecin!$ sensi-ilitatea numelor -azelor de date :i a numelor ta-elelor la di"erent2 ntre ma)uscule :i minuscule depinde de modul de tratare a numelor "i:ierelor de cat sistemul de operare al gazdei respecti;e. Un ser;er care ruleaz su- ULK1 tratea numele -azelor de date si ale ta-elelor ca sensi-ile la di"eren!a ntre ma)uscule minuscule$ deoarece numele de "i:iere ULK1 prezint aceast sensi-ilitate. Lumele 7 "i:iere TindoWs nu sunt sensi-ile la di"eren!a ntre ma)uscule :i minuscule$ deci ser;er care ruleaz su- TindoWs nu trateaz numele -azelor de date :i ale ta-elelor7 "iind sensi-ile la di"eren!a ntre ma)uscule :i minuscule. Nre-uie s "i!i la curent cu aceast caracteristic dac crea!i o -az de date pe un ser;7"V ULK1 si pe care ntr%o zi s%ar putea s o muta!i pe un ser;er TindoWs+ dac crea!i dou ta-ele denumite a-c si 3J@$ acestea ;or "i imposi-il de di"eren!iat pe un calc TindoWs. 8 modalitate de a e;ita trans"ormarea acestui aspect ntr%o pro-lem este de) selecta o anumit dimensiune a literelor &minuscule$ de e#emplu* :i s crea!i ntotdeaur nume de -aze de date :i de ta-ele "olosind acea dimensiune de liter. 3poi$ mrime2 literei numelor nu ;a mai "i o pro-lem daca muta!i -aza de date pe un alt ser;er. = Lume de coloane :i de inde#uri. Lumele coloanelor :i ale inde#urilor n MySQL i sunt sensi-ile la di"eren!a ntre ma)uscule :i minuscule. Urmtoarele interogri si ecBi;alente+ S/L/@N nume U.8M ele; S/L/@N LUM/ U.8M ele; S/L/@N LuMe U.8M ele; = Lumele aliasurilor. 3liasurile sunt sensi-ile la di"eren!a ntre ma)uscule :i minusc Pute!i speci"ica un alias "olosind orice dimensiune de liter &ma)uscule$ minuscule i com-inate*$ dar tre-uie ca toate re"eririle la alias din interogare s "oloseasc ace mrime de liter. Kndi"erent dac un nume de -az de date$ ta-el sau alias este sau nu sensi-il la di"ere ntre ma)uscule si minuscule$ tre-uie s "ace!i re"erire la un nume dat al oricreia din)V aceste categorii "olosind aceea:i dimensiune a literei pe parcursul ntregii intere 3cest lucru nu este ;ala-il pentru cu;intele cBeie SQL$ pentru numele de "unc!ii$:l numele coloanelor :i al inde#urilor$ la care se poate "ace re"erire cu dimensiuni de lite ;aria-ile pe parcursul unei interogri. Latural$ interogarea ;a "i mai lizi-il dac "olc o aceea:i mrime de liter n loc de stilul 9scrisoare anonim, &SeLe@t LuMe Ur8m @apitolul E Sinta#a :i utilizarea SQL n MySQL 1HE @rearea$ :tergerea :i selectarea -azelor de date MySQL "urnizeaz trei instruc!iuni la ni;elul -azelo" de date+ @./3N/ 43N3J3S/ pentru crearea -azelor de date$ 4.8P 43N3J3S/ pentru eliminarea lor$ respecti; US/ pentru selectarea unei -aze de date presta-ilite. Knstruc!iunea @./3N/ 43N3J3S/ @rearea unei -aze de date este o opera!ie simplA pur :i simplu denumi!i -aza de date ntr%o instruc!iune @./3N/ 43N3J3S/+ @./3N/ 43N3J3S/ nume`-aza`de`date .estric!iile sunt acelea c numele tre-uie s "ie permis$ -aza de date tre-uie s nu e#iste de)a$ iar dumnea;oastr tre-uie s a;e!i su"iciente pri;ilegii pentru a o crea. Knstruc!iunea 4.8P 43N3J3S/ _tergerea unei -aze de date este la "el de simpl ca :i crearea acesteia$ presupun(nd c a;e!i su"iciente pri;ilegii+ 4.8P 43N3J3S/ nume`-aza`de`date Notu:i$ instruc!iunea 4.8P 43N3J3S/ nu este ce;a ce tre-uie "olosit cu un sentiment de genul 94up mine$ potopulO,. Knstruc!iunea elimin -aza de date :i toate ta-elele din interiorul acesteia. 4up ce a!i :ters o -az de date$ s%a terminat cu ea. @u alte cu;inte$ nu ncerca!i aceast instruc!iune numai pentru a ;edea cum "unc!ioneaz. 4ac administratorul dumnea;oastr a e"ectuat sistematic copii de siguran! ale -azei de date$ ; ;e!i putea recupera -aza de date. 4ar ; pot garanta c nici un administrator nu ;a mani"esta n!elegere c(nd i ;e!i spune+ 93$ pi m )ucam cu 4.8P 43N3J3S/ ca s ;d ce se%nt(mpl$ :i$ ... mi pute!i restaura si mie -aza de dateX, .e!ine!i c o -az de date este reprezentat printr%un catalog a"lat su- catalogul de date. 4ac a!i inserat n acel catalog "i:iere care nu reprezint ta-ele$ acele "i:iere nu ;or "i :terse de instruc!iunea 4.8P 43N3J3S/$ n acel caz$ nici catalogul -azei de date nu este eliminat. Knstruc!iunea US/ Knstruc!iunea US/ selecteaz o -az de date pentru a o trans"orma n -az de date curent &presta-ilit* pentru o cone#iune dat cu ser;erul+ US/ nume`-aza`de`date

Nre-uie s a;e!i unele pri;ilegii de acces la -aza de dateA alt"el$ nu o pute!i selecta. 4e rapt$ nu este necesar s selecta!i o -az de date pentru a "olosi ta-elele acesteia$ deoarece pute!i "ace re"erire la ta-elele sale "olosind "orma nume`-aza`de`date.nume`ta-el. Notu:i$ este mult mai con;ena-il s "ace!i re"erire la ta-ele "r a "i necesar s speci"ica!i un cali"icator pentru -aza de date. Selectarea unei -aze de date presta-ilite nu nseamn c aceasta tre-uie s "ie -aza de date presta-ilit pe durata cone#iunii. Pute!i emite orice numr de instruc!iuni US/ pentru a comuta de la o -az de date la alta oric(nd dori!i$ cu condi!ia s a;e!i pri;ilegii de %5 1 : i>% % t9 ^= ' ==^>'>= ; "$6@,> 1HG Partea l Utilizarea general a sistemului MySQL acces pentru a le "olosi. 4e asemenea$ selectarea unei -aze de date nu ; o-lig s "olos$ ta-ele numai din acea -az de date. Pute!i continua s "ace!i re"erire la ta-ele din -aze de date prin speci"icarea$ alturi de numele ta-elului$ a numelui -azei de date. @(nd o cone#iune cu ser;erul se ncBeie$ orice no!iune a ser;erului cu pri;ire la ider tatea -azei de date presta-ilite dispare. 3st"el$ dac ; conecta!i din nou la ser;er$ ace nu%si aminte:te -aza de date pe care a!i selectat%o anterior. 4e "apt$ a:a ce;a nici nu A a;ea sens$ dat "iind c MySQL este multi%"ir :i poate manipula mai multe cone#iunii la un utilizator dat$ care se poate conecta si deconecta n orice ordine$ n acest mediu$.) este clar care ar putea "i semni"ica!ia no!iunii de 9-az de date selectat anterior,. @rearea$ :tergerea$ inde#area :i modi"icarea ta-elelor MySQL ; permite s crea!i ta-ele$ s le :terge!i si s le modi"ica!i structura "olosind inst !iunile @./3N/ N3JL/$ 4.8P N3JL/ :i 3LN/. N3JL/. Pentru "iecare din aceste instruc!iuni 7 e#tensii speci"ice sistemului MySQL care le mresc utilitatea. Knstruc!iunile @./3N/ Kt> 4.8P KL4/1 ; permit s aduga!i sau s elimina!i inde#uri din ta-elele e#istente. Knstruc!iunea @./3N/ N3JL/ Na-elele sunt create cu a)utorul instruc!iunii @./3N/ N3JL/. Sinta#a complet a acea instruc!iuni este destul de stranie$ datorit numrului "oarte mare de clauze op!ional dar n practic instruc!iunea respecti; este$ de o-icei$ relati; simplu de utilizat$ e#emplu$ toate instruc!iunile @./3N/ N3JL/ pe care le%am "olosit n capitolul l prezentate ntr%o "orm rezona-il de simpl. @a o ironie$ o -un parte din aceast comple#itate suplimentar este determinat' clauzele pe care MySQL le analizeaz si apoi le aruncO ? pute!i con;inge de dim2Z siunea acestei comple#it!i consult(nd 3ne#a 4. /#amina!i in"orma!iile a"ere instruc!iunii @./3N/ N3JL/ :i o-ser;a!i cum o -un parte din sinta#a instruc!iunii dedicat clauzelor ./U/./L@/S$ @8LSN.3KLN :i @Y/@S. 3ceste clauze se re"er la e#terne$ integritate re"eren!ial :i restric!ii pri;ind ;alorile de intrare. MySQL i accept aceste caracteristici$ dar analizeaz sinta#a pentru a "ace de"ini!iile ta-elelor i u:or de utilizat dec(t cele pe care le%a!i creat n alte sisteme de -aze de date. "olosi mai u:or acel program cu mai pu!ine editri.* 4ac ; scrie!i propriile dese de ta-el pornind de la zero$ pute!i uita complet de necesitatea de a manipula ac clauze. /u unul nu ;oi mai su"la un cu;(nt despre ele n aceast sec!iune. Knstruc!iunea @./3N/ N3JL/ precizeaz cel pu!in numele ta-elului si o list a coloanei din cadrul acestuia. 4e e#emplu @./3N/ N3JL/ ta-elul meu nume @Y3.&F0*$ ;(rsta KLN L8N LULL$ greutate KLN$ se# /LUM&6U6$6M6* @apitolul E Sinta#a :i utilizarea SQL n MySQL 1H5 n a"ar de coloanele care alctuiesc un ta-el$ pute!i speci"ica modul de inde#are a ta-elului atunci c(nd l crea!i. 8 alt op!iune este de a lsa ta-elul neinde#at atunci c(nd l crea!i :i s aduga!i inde#uri ulterior. 3ceasta este o strategie indicat dac inten!iona!i s popula!i ta-elul .eu "oarte multe date nainte de a ncepe s%l utiliza!i pentru interogri. 3ctualizarea inde#urilor la inser!ia "iecrui r(nd este mult mai lent dec(t ncrcarea datelor ntr%un ta-el neinde#at :i crearea inde#urilor dup inser!ia tuturor datelor. 3m discutat de)a despre sinta#a elementar a instruc!iunii @./3N/ N3JL/ n capitolul l$ iar n capitolul F$ 9Lucrul cu date n MySQL,$ am discutat modul de descriere a tipurilor de coloane. Presupun c a!i citit aceste capitole$ deci nu ;om repeta aici cele discutate anterior$ n scBim-$ n continuare$ ;om discuta despre unele e#tensii importante ale instruc!iunii @./3N/ N3JL/$ care au "ost introduse n MySQL E.FE :i care ; o"er o mare "le#i-ilitate n ceea ce pri;e:te modul de construc!ie a ta-elelor+ = Speci"icatori ai tipului de stocare a ta-elului = @rearea unui ta-el numai dac acesta nu e#ist de)a = Na-ele temporare$ care sunt :terse automat la ncBeierea sesiunii client = Posi-ilitatea de creare a unui ta-el prin simpla selectare a datelor pe care dori!i s le con!in Speci"icatori ai tipului de stocare a ta-elului 3nterior ;ersiunii MySQL E.FE$ toate ta-elele create de utilizator "oloseau metoda de stocare KS3M. n MySQL

E.FE$ pute!i crea n mod e#plicit ta-ele n oricare din cele trei tipuri$ prin speci"icarea op!iunii NMP/ R tip dup acea parte a instruc!iunii @./3N/ N3JL/ care con!ine lista coloanelor. Nip poate a;ea ;alorile MMKS3M$ KS3M sau Y/3P. 4e e#emplu+ @./3N/ N3JL/ ta-elul)neu &i KLN$ c @Y3.&F0** NMP/ R Y/3P Pute!i con;erti ta-ele dintr%un tip n altul "olosind instruc!iunea 3LN/. N3JL/+ 3LN/. N3JL/ ta-elul)neu NMP/ R KS3M 3LN/. N3JL/ ta-elul)neu NMP/ R MMKS3M 3LN/. N3JL/ ta-elul)neu NMP/ R Y/3P Notu:i$ nu se recomand con;ersia unui ta-el la tipul Y/3P dac dori!i ca ta-elul s e#iste si dup ncBiderea ser;erului. Na-elele Y/3P sunt stocate n memorie si dispar c(nd ser;erul ncBide cone#iunea. @aracteristicile generale ale acestor trei tipuri de ta-ele sunt urmtoarele+ = Na-ele MylS3M. Uormatul de stocare MylS3M este tipul de ta-el presta-ilit n MySQL$ ncep(nd de la ;ersiunea E.FE+ = Ui:ierele pot "i mai mari dec(t n cazul metodei de stocare KS3M$ dac sistemul de operare nsu:i permite "i:iere mai mari. = 4atele sunt stocate ntr%un "ormat independent de ma:in$ cu -itul cel mai pu!in semni"icati; scris primul. 3ceasta nseamn c pute!i copia ta-ele de la un calculator la .altul$ cBiar dac acestea au arBitecturi di"erite. = ?alorile unui inde# numeric ocup mai pu!in spa!iu de stocare$ deoarece sunt stocate cu -itul cel mai semni"icati; scris primul. ?alorile unui inde# tind s ;arieze mai rapid n domeniul -i!ilor mai pu!in semni"icati;i$ deci -i!ii mai semni"icati;i sunt mai e#pu:i la comprimare. 1HH Partea l Utilizarea general a sistemului MySQL = Manipularea atri-utului 3UN8`KL@./M/LN este mai -un dec(t n caz ta-elelor KS3M. 4etaliile despre acest atri-ut sunt discutate n capitolul F$ i sec!iunea 9Lucrul cu sec;en!e,. = Lumeroase restric!ii pri;ind inde#area au "ost eliminate. 4e e#emplu$ put inde#a coloane care con!in ;alori LULL$ dup cum pute!i inde#a si coloane i tip JL8J :i N/1N. = Pentru o ;eri"icare mai -un a integrit!ii ta-elului$ "iecare ta-el are un in"e c(tor care este acti;at &setat* c(nd ta-elul este ;eri"icat de ctre myisamcli Pute!i "olosi op!iunea myisamcBb %"ast pentru a nu e"ectua ;eri"ic ta-elelor care nu au "ost modi"icate de la ultima ;eri"icare$ ceea ce m ;iteza acestei opera!ii administrati;e. 4e asemenea$ ta-elele dispun de indicator care arat dac un ta-el a "ost ncBis n mod adec;at. 4ac ser;ei se ncBide ntr%o manier anormal sau calculatorul su"er o cdere$ ind torul se poate "olosi pentru a detecta ta-elele care tre-uie ;eri"icate momentul pornirii ser;erului. = Na-ele KS3M. Uormatul de stocare KS3M este "ormatul mai ;ecBi$ "olosit nainte Y ;ersiunea MySQL E.FE$ dar continu s e#iste :i n prezent$ n general$ ta-ele MylS3M sunt pre"erate ta-elelor KS3M$ deoarece prezint mai pu!ine restrict Pro-a-il c suportul pentru ta-elele KS3M ;a disprea$ deoarece acest "ormat de care este nlocuit de "ormatul de ta-el MylS3M. = Na-ele Y/3P. Uormatul de stocare Y/3P creeaz ta-ele stocate n memorie$ "olosesc r(nduri de lungime "i#$ ceea ce le "ace "oarte rapide. 4e asemenea$ nsea c sunt temporare$ n sensul c dispar la terminarea cone#iunii de ctre ser;er. Not spre deose-ire de ta-elele temporare create cu @./3N/ N/MP8.3.M N3JL/$ ta-ele Y/3P sunt ;izi-ile si altor clien!i. Na-elelor Y/3P li se aplic restric!ii care nu ;ala-ile pentru ta-elele KS3M sau MylS3M+ = Knde#urile sunt "olosite numai pentru compara!ii care utilizeaz operatorii si 7R>. = 8 coloan inde#at nu poate con!ine ;alori LULL. = Lu se pot utiliza coloanele JL8J :i N/1N. = Lu se pot utiliza coloanele 3UN8`KL@./M/LN. @rearea condi!ionata a ta-elelor Pentru a crea un ta-el numai dac acesta nu e#ist de)a$ "olosi!i instruc!iunea N3JL/ KU L8N /1KSNS. Pute!i "olosi aceast instruc!iune ntr%o aplica!ie care nu "ace+ un "el de presupuneri cu pri;ire la "aptul dac ta-elele de care are ne;oie au "ost sauV con"igurate n preala-il :i pur :i simplu ncearc s creeze ta-elele ca un lucru de la+ n!eles. Modi"icatorul KU L8N /1KSNS este util mai ales pentru scripturi rulate ca + de grup cu mysal. n acest conte#t$ o instruc!iune @./3N/ N3JL/ o-i:nuit "unc!ioneaz "oarte -ine. La prima rulare a sarcinii$ ta-elele sunt create$ dar a doua 7 se ;a produce o eroare$ deoarece ta-elele e#ist de)a. 4ac "olosi!i KU L8N /1KSNS$ nu 7 nici o pro-lem. La prima rulare$ ta-elele ;or "i create$ ca n situa!ia anterioar. 3 . oar si la rulrile ulterioare$ ncercrile de creare a ta-elului e:ueaz$ dar nu este gene nici o eroare. 3st"el$ prelucrarea sarcinii poate continua ca si cum ncercarea ar "i re @apitolul E Sinta#a :i utilizarea SQL n MySQL 1 H[ Na-ele temporare Pute!i "olosi @./3N/ N/MP8.3.M N3JL/ pentru a crea ta-ele temporare$ care dispar automat la ncBeierea sesiunii. 3ceasta este o "acilitate con;ena-il$ deoarece nu tre-uie s mai emite!i o instruc!iune 4.8P N3JL/ e#plicit pentru a scpa de ta-el$ iar ta-elul nu mai continu s e#iste dac sesiunea se ncBeie n mod anormal. 4e e#emplu$ dac a;e!i o interogare ncapsulat ntr%un "i:ier$ pe care o rula!i cu m;sal :i decide!i s nu mai

a:tepta!i ncBeierea acesteia$ pute!i licBida scriptul n per"ect siguran! cBiar n timpul e#ecu!iei$ iar ser;erul ;a elimina toate ta-elele temporare. n ;ersiunile mai ;ecBi ale sistemului MySQL$ nu e#ist ta-ele temporare autentice$ cu e#cep!ia situa!iei c(nd dumnea;oastr le considera!i ca atare. Pentru aplica!ii care necesit un atare ta-el$ tre-uie s ; aminti!i s%l :terge!i personal. 4ac uita!i s%l :terge!i$ sau dac la client se produce o eroare care l o-lig s%si ncBeie prematur e#ecu!ia$ ta-elul temporar persist "r rost$ p(n c(nd cine;a l o-ser; si%l elimin. Un ta-el temporar este ;izi-il numai clientului care creeaz ta-elul. Lumele poate "i acela:i cu al unui ta-el permanent e#istent. 3ceasta nu reprezint o eroare si nici nu constituie un atac la adresa ta-elului permanent. S presupunem c a!i creat un ta-el temporar n -aza de date samp`d-$ denumit mem-ru. Na-elul mem-ru original de;ine ascuns &inaccesi-il*$ iar re"erin!ele la ta-elul mem-ru trimit la ta-elul temporar. 4ac emite!i o instruc!iune 4.8P N3JL/ mem-ru$ ta-elul temporar este eliminat :i ta-elul mem-ru original 9reapare,. 4ac pur :i simplu ; deconecta!i de la ser;er "r a elimina ta-elul temporar$ ser;erul ;a :terge automat ta-elul temporar. La urmtoarea conectare$ ta-elul mem-ru original este din nou ;izi-il. Mecanismul de ascundere a numelui este ;ala-il la un singur ni;el. @u alte cu;inte$ nu pute!i crea dou ta-ele temporare cu acela:i nume. @rearea ta-elelor pe -aza rezultatelor instruc!iunii S/L/@N Unul dintre conceptele cBeie ale -azelor de date rela!ionale este c toate in"orma!iile sunt reprezentate su- "orma unui ta-el compus din r(nduri :i coloane$ iar rezultatul "iecrei instruc!iuni S/L/@N este de asemenea un ta-el compus din r(nduri :i coloane$ n multe situa!ii$ 9ta-elul, care rezult dintr%o instruc!iune S/L/@N este pur :i simplu o imagine a unor r(nduri :i coloane care se deruleaz de sus n )os pe ecranul dumnea;oastr n timp ce ; continua!i lucrul. 3nterior ;ersiunii MySQL E.FE$ dac dorea!i s sal;a!i rezultatele unei instruc!iuni S/L/@N ntr%un ta-el ce urma a "i "olosit n interogri ;iitoare$ erau necesare unele opera!iuni speciale+ 1. .ula!i o interogare 4/S@.KJ/ sau SY8T @8LUMLS pentru a determina tipurile coloanelor din ta-elele de unde dori!i s captura!i in"orma!ia. F. @rea!i un ta-el$ speci"ic(nd n mod e#plicit numele si tipurile coloanelor n care tocmai a!i cutat. E. 4up crearea ta-elului$ emite!i o interogare KLS/.N . . . S/L/@N$ pentru a regsi rezultatele :i pentru a le insera n ta-el. Kn MySQL E.FE$ situa!ia s%a scBim-at. Knstruc!iunea @./3N/ N3JL/ . . . S/L/@N elimin toate acele ncurcturi dizgra!ioase :i permite crearea instantanee a unui nou ta-el "olosind rezultatul unei interogri S/L/@N ar-itrare. Pute!i "ace aceast opera!ie ntr%o 1HI Partea l Utilizarea general a sistemului MySQL singur etap$ "r a "i o-ligat s cunoa:te!i sau s speci"ica!i tipurile de date coloanelor pe care le regsi!i. 3st"el$ este e#cep!ional de simplu s crea!i un ta-el comZ plet populat cu datele care ; intereseaz :i gata de a "i utilizat n interogri ulterioare. Z Pute!i copia un ta-el prin selectarea integral a con!inutului su &"r clauza TY/./*+ pute!i crea o copie ;id prin adugarea unei clauze TY/./ care e:ueaz ntotdeauna+ @./3N/ N3JL/ nume`t-l`nou S/L/@N ' U.8M nume`t-l @./3N/ N3JL/ nume`t-l`nou S/L/@N ' U.8M nume`t-l TY/./ 1 R 8 @rearea unei copii ;ide este util dac dori!i s ncrca!i un "i:ier de date n "i:ierul orig nai "olosind L834 43N3$ dar nu sunte!i sigur dac a;e!i op!iunile pentru speci"icare corect a "ormatului datelor. Lu dori!i s ; trezi!i cu nregistrri deteriorate n ta-eli original dac nu preciza!i corect op!iunile din prima ncercareO Utilizarea unei copii ;ie a ta-elului original ; permite s e#ersa!i op!iunile L834 43N3 pentru speci"icarea delim)l tatorilor de coloan :i de linie$ p(n c(nd datele dumnea;oastr de intrare sunt inter) pretate corect. 4up ce a!i realizat acest lucru$ pute!i ncrca datele n ta-elul original.$ Pute!i com-ina instruc!iunea @./3N/ N/MP8.3.M N3JL/ cu S/L/@N pentru a crea un ta- temporar ca o copie a lui nsu:i+ @./3N/ N/MP8.3.M N3JL/ ta-elul)neu S/L/@N ' U.8M ta-elul)neu 3ceast instruc!iune ; permite s modi"ica!i con!inutul ta-elului ta-elul)neu "rA a"ecta originalul. 3cest "apt este util c(nd dori!i s ncerca!i unele interogri care adttiO modi"icri%con!inutului ta-elului$ "r a modi"ica ta-elul original. Pentru a "olosi :eri" turi scrise anterior care "olosesc numele ta-elului original$ nu tre-uie s le edita!i pent a "ace re"erire la un alt ta-elA pur si simplu aduga!i instruc!iunea @./3N/ N/MP8.C N3JL/ la nceputul scriptului. Scriptul ;a crea o copie temporar :i ;a lucra cu aceastaO iar ser;erul ;a :terge copia atunci c(nd scriptul :i ncBeie e#ecu!ia. Pentru a crea un ta-el su- "orma unei copii ;ide a lui nsu:i$ "olosi!i o clauz TY/./ 8 i con)unc!ie cu @./3N/ N/MP8.3.M ... S/L/@N+ @./3N/ N/MP8.3.M N3JL/ ta-el S/L/@N U.8M ta-el TY/./ 1 R 8 Notu:i$ e#ist numeroase capcane de care tre-uie s ; "eri!i c(nd crea!i ta-ele instanti neu. @(nd crea!i un ta-el prin selectarea unor date n acesta$ numele coloanelor si preluate de la coloanele pe care le selecta!i. 4ac o coloan este calculat ca rezulta!i unei e#presii$ 9numele, coloanei este te#tul e#presiei. 8 e#presie nu este permisa" nume de coloan. Pute!i constata acest lucru dac rula!i urmtoarea interogare n mys mysal> @./3N/ N3JL/ ta-elul)neu S/L/@N 1A /..8. 11HH at line 1+ Kncorrect column name 6? &/roare 11HH la linia 1+ Lume de coloan incorect 6 l6*

Pentru a remedia eroarea$ "urniza!i un alias al coloanei$ pentru a atri-ui coloanei 6 nume permis+ mysal> @./3N/ N3JL/ ta-elul)neu S/L/@N 1 3S coloana)neaA Query 8S$ 1 roW a""ected &0.01 sec* 8 pro-lem asemntoare apare dac selecta!i coloane cu acela:i nume din ta-e di"erite. S presupunem c ta-elele t1 :i tF au am-ele o coloan c :i dumnea;c dori!i s crea!i un ta-el din toate com-ina!iile de r(nduri din cele dou ta-ele$ "urniza aliasuri pentru a speci"ica nume unice de coloan n noul ta-el+ @apitolul E Sinta#a :i utilizarea SQL n MySQL 1H5 @./3N/ N3JL/ tE S/L/@N tl.@ 3S c1$ tF.c 3S @F U.8M t1$ tFA @rearea unui ta-el prin selectarea unor date n acesta nu copiaz n mod automat nici un inde# din ta-elul original. Knstruc!iunea 4.8P N3JL/ _tergerea unui ta-el este cu mult mai simpl dec(t crearea sa$ deoarece nu tre-uie s speci"ica!i nimic despre con!inutul ta-eluluiA pur :i simplu tre-uie s denumi!i ta-elul+ 4.8P N3JL/ nume`ta-el MySQL e#tinde instruc!iunea 4.8P N3JL/ n c(te;a moduri utile. Mai nt(i$ pute!i :terge mai multe ta-ele speci"ic(ndu%le pe toate n aceea:i instruc!iune+ 4.8P N3JL/ nume`ta-eO1$ nume`ta-eOF$ ... n al doilea r(nd$ dac nu sunte!i sigur cu pri;ire la e#isten!a sau nu a unui ta-el$ dar dori!i s%1 :terge!i dac e#ist$ pute!i aduga la instruc!iune op!iunea KU /1KSNS. 3ceasta determin sistemul MySQL s nu "ac reclama!ii si s nu emit erori dac ta-elul sau ta-elele speci"icate n instruc!iune nu e#ist+ 4.8P N3JL/ KU /1KSNS nume`ta-el KU /1KSNS este util n scripturi pe care le "olosi!i cu clientul mysal$ deoarece mysal$ n mod presta-ilit$ :i ncBeie e#ecu!ia la producerea unei erori$ iar ncercarea de a elimina un ta-el care nu e#ista constituie o eroare. 4e e#emplu$ pute!i a;ea un script de con"igurare care creeaz ta-ele pe care le "olosi!i ca -az pentru prelucrri ulterioare n alte scripturi$ n aceast situa!ie$ dori!i s ; asigura!i c scriptul de con"igurare porne:te 9pe curat,. 4ac "olosi!i o instruc!iune 4.8P N3JL/ normal la nceputul scriptului$ acesta ;a e:ua prima dat$ deoarece ta-elele nu au "ost niciodat create. @rearea si :tergerea inde#urilor Knde#urile reprezint metoda principal de accelerare a accesului la con!inutul ta-elelor dumnea;oastr$ mai ales pentru interogri care implic uniri ale mai multor ta-ele. 3cesta este un su-iect su"icient de important pentru ca n capitolul G$ 98ptimizarea interogrilor,$ s se discute despre moti;ele utilizrii inde#urilor$ modul de "unc!ionare a acestora si despre modalitatea de utilizare optim a inde#urilor n ;ederea optimizrii interogrilor$ n aceast sec!iune$ ;om discuta despre caracteristicile inde#urilor :i despre sinta#a pe care o "olosi!i pentru crearea :i :tergerea lor. @aracteristicile inde#urilor MySQL asigur o "le#i-ilitate remarca-il n ceea ce pri;e:te modul de construire a inde#urilor. Pute!i inde#a coloane indi;iduale sau com-ina!ii de coloane. 4e asemenea$ pute!i a;ea mai multe inde#uri ntr%un ta-el$ dac dori!i s pute!i cuta rapid o ;aloare m di"erite coloane ale ta-elului. 4ac o coloan este de un tip :ir di"erit de /LUM sau S/N$ pute!i opta pentru inde#area numai a primelor n caractere &numrate de la st(nga la dreapta* din coloan$ n cazul n care coloana este predominant unic su- aspectul primelor n caractere$ de regul nu ;e!i sacri"ica per"orman!ele$ -a cBiar le pute!i m-unt!i+ inde#area pre"i#ului unei coloane$ :i nu a ntregii coloane$ poate reduce at(t dimensiunea mde#ului$ c(t :i timpul de acces. 1[0 ParteaO Utilizarea general a sistemului MySQL /#ist si unele restric!ii pri;ind crearea unui inde#$ de:i acestea tind s se 9dilueze, msur ce sistemul MySQL continu s se dez;olte. Na-elul urmtor prezint unele 7 rente dintre ta-elele KS3M si MylS3M din punct de ;edere al posi-ilit!ilor de nde' @aracteristica inde#ului ?alori LULL @oloane JL8J :i N/1N Knde#uri per ta-el @oloane per inde# 4imensiune ma#im a r(ndului inde# Na-ele MylS3M Permise Pot "i inde#ate EF 1H 500 octe!i Na-ele KS3M Knterzise Lu pot "i inde#ate

1H 1H F5H octe!i 4in ta-el se poate o-ser;a c$ n ta-elele KS3M$ o coloan inde#at tre-uie declarat l LULL$ iar coloanele JL8J :i N/1N nu pot "i inde#ate. Nipul de ta-el MylS3M eliminA restric!ii legate de crearea inde#ului :i le atenueaz pe altele. 8 consecin! a ace di"eren!e ntre cele dou tipuri de ta-ele n ceea ce pri;e:te caracteristicile inde#ului > aceea c$ n "unc!ie de ;ersiunea dumnea;oastr de MySQL$ s%ar putea s nu "i!i capa de a inde#a anumite coloane. 4e e#emplu$ pute!i "olosi numai ta-ele KS3M dac ;er nea dumnea;oastr de MySQL este anterioar ;ersiunii E.FE$ ceea ce nseamn c pute!i inde#a anumite coloane dac dori!i ca acestea s poat con!ine ;alori LULL. 4ac dispune!i de ;ersiunea MySQL E.FE sau ulterioar$ pute!i a;ea ta-ele mai ;e care au "ost create de la -un nceput ca ta-ele KS3M. Le pute!i con;erti cu u:urin! "ormatul de stocare MylS3M "olosind instruc!iunea 3LN/. N3JL/$ care ; permit() -ene"icia!i de unele dintre caracteristicile de inde#are mai recente+ 3LN/. N3JL/ nume`ta-el NMP/ R MMKS3M @rearea inde#urilor Pute!i crea inde#uri pentru un ta-el nou atunci c(nd "olosi!i @./3N/ N3JL/ sau putO aduga inde#uri la ta-elele e#istente utiliz(nd @./3N/ KL4/1 sau 3LN/. N3JL/. Knstr !iunea @./3N/ KL4/1 a "ost introdus n MySQL E.FF$ dar pute!i "olosi 3LN/. N3JL/ 7 ;ersiunea dumnea;oastr de MySQL este anterioar ;ersiunii respecti;e$ & n pre MySQL mapeaz intern instruc!iunea @./3N/ KL4/1 peste 3LN/. N3JL/.* Pute!i speci"ica dac inde#ul poate con!ine sau nu ;alori duplicate. 4ac inde#tiM poate con!ine asemenea ;alori$ atunci tre-uie creat ca inde# de tip P.KM3.M S/M ULKQU/. Pentru un inde# unic pe o singur coloan$ aceast caracterizare asigur imp -ilitatea e#isten!ei ;alorilor duplicate n coloana respecti;. Pentru un inde# unic pe2 multe coloane$ este ast"el garantat imposi-ilitatea duplicrii unei com-ina!ii de ;ale Un inde# P.KM3.M S/M este "oarte asemntor cu un inde# ULKQU/. 4e "apt$ inde#ul J M3.M S/M nu este altce;a dec(t un inde# ULKQU/ cu numele P.KM3.M. 3ceasta nsear un ta-el poate con!ine un singur inde# P.KM3.M S/M$ deoarece nu pute!i a;ea inde#uri cu acela:i nume. Pute!i plasa mai multe inde#uri ULKQU/ ntr%un ta-el$ des se prea o-i:nuie:te. $ Pentru a aduga un inde# la un ta-el e#istent$ pute!i "olosi 3LN/. N3JL/ sau @.K KL4/1. Knstruc!iunea 3LNt . N3JL/ cea este mai ;ersatil dintre cele dou$ deoare pute!i "olosi pentru a crea un inde# o-i:nuit$ un inde# ULKQU/ sau un inde# P.KM3.M @apitolul E Sinta#a :i utilizarea SQL n MySQL 1[1 3LN/. N3JL/ nume`t-l 344 KL4/1 nume`inde# &lista`col* 3LN/. N3JL/ nume`t-l 344 ULKQU/ nume`inde# &lista`col* 3LN/. N3JL/ nume`t-l 344 P.KM3.M S/M &lista`@8l* nume`t-l este numele ta-elului la care se ;a aduga inde#ul$ iar lista`coZ precizeaz coloana sau coloanele care tre-uie inde#ate. 4ac inde#ul este alctuit din cel pu!in dou coloane$ numele acestora ;or "i separate prin ;irgul. Lumele inde#ului nume`inde# este op!ional$ deci l pute!i omite$ iar MySQL ;a selecta un nume n "unc!ie de numele primei coloane inde#ate. Knstruc!iunea 3LN/. N3JL/ ; permite s speci"ica!i mai multe modi"icri ale ta-elului ntr%o singur instruc!iune$ deci pute!i crea mai multe inde#uri n acela:i timp. Knstruc!iunea @./3N/ KL4/1 poate aduga ntr%un ta-el un inde# o-i:nuit sau ULKQU/+ @./3N/ ULKQU/ KL4/1 nume`inde# 8L nume`t-l &lista`col* @./3N/ KL4/1 nume`inde# 8L nume`t-l &lista`col* 8p!iunile nume`t-l$ nume`inde# :i lista`col au aceea:i semni"ica!ie ca n cazul instruc!iunii 3LN/. N3JL/. Notu:i$ numele inde#ului nu este op!ional. Lu pute!i crea un inde# P.KM3.M S/M cu instruc!iunea @./3N/ KL4/1. Pentru a crea un inde# ntr%un ta-el nou atunci c(nd emite!i o instruc!iune @./3N/ N3JL/$ "olosi!i o sinta# similar instruc!iunii 3LN/. N3JL/$ dar speci"ica!i clauzele de creare a inde#ului n acea parte a instruc!iunii unde declara!i coloanele ta-elului+ @./3N/ N3J/L nume ta-el KL4/1 nume`inde# &lista`coloane*$ ULKQU/ nume`inde# &lista`coloane*$ P.KM3.M S/M &lista`coloane*$ n ceea ce pri;e:te 3LN/. N3JL/$ numele inde#ului este op!ional pentru KL4/1 :i ULKQU/$ iar MySQL ;a alege un nume$ dac dumnea;oastr nu o "ace!i. @a un caz special$ pute!i crea un inde# P.KM3.M S/M cu o singur coloan prin adugarea op!iunii P.KM3.M S/M la s"(r:itul declara!iei coloanei+ @./3N/ N3JL/ ta-elul)neu i KLN L8N LULL P.KM3.M S/M * Knstruc!iunea de mai sus este ecBi;alent cu urmtoarea+ @./3N/ N3JL/ ta-elul meu i KLN L8N LULL$ P.KM3.M S/M &i* 1[F Partea l Utilizarea general a sistemului MySQL Uiecare din e#emplele anterioare de creare a unui ta-el au speci"icat L8N LULL pentru coloanele inde#ate. 4ac a;e!i ta-ele KS3M$ aceasta este o cerin! o-ligatorie$ deoarec@i nu pute!i inde#a coloane care pot con!ine

;alori LULL. 4ac a;e!i ta-ele MylS3M$ coloanele inde#ate pot con!ine si ;aloarea LULL$ cu condi!ia ca inde#ul s nu "ie de tip P.KM3.M S/M. 4ac inde#a!i un pre"i# al unei coloane :ir &primele n caractere$ de la st(nga la dreapta$6& ale ;alorilor coloanei*$ sinta#a pentru denumirea coloanei ntr%un speci"icatoi1 lista)2oloane este nume`coloana&n*$ nu doar un simplu nume`coloana. 4e e#empluA prima din urmtoarele instruc!iuni creeaz un ta-el cu dou coloane @Y3. si un ind care "olose:te am-ele coloane. @ea de%a doua instruc!iune este similar$ dar inde#eazS) un pre"i# pentru "iecare coloan+ 1+ @./3N/ N3JL/ ta-elul)neu nume @Y3.&E0*$ adresa @Y3.&H0*$ KL4/1 &nume$adresa* @./3N/ N3JL/ ta-elul meu nume @Y3.&E0*$ adresa @Y3.&H0*$ KL4/1 &nume&10*$adresa&F0** n unele circumstan!e$ ;i se poate prea necesar inde#area unui pre"i# de coloan. 4] e#emplu$ lungimea r(ndurilor inde# are o limit superioar$ deci pute!i "i o-ligat s "olosi!i pre"i#e dac lungimea coloanelor inde#ate ar "i dep:it limita respecti;2 Pre"i#ele sunt de asemenea necesare pentru coloanele JL8J sau N/1N din inde#uril ta-elelor MylS3M. Knde#area unui pre"i# de coloan impune modi"icri pe care le pute!i e"ectua n coloA la o dat ulterioarA nu pute!i reduce lungimea coloanei p(n la o dimensiune mai m dec(t lungimea pre"i#ului "r a :terge inde#ul si a% 1 re%crea ulterior "olosind un pr7 mai scurt. _tergerea inde#urilor Pute!i :terge inde#uri "olosind 4.8P KL4/1 sau 3LN/. N3JL/. Similar instruc!iunii @./3! KL4/1$ instruc!iunea 4.8P KL4/1 este manipulat intern ca o instruc!iune 3LN/. N3JL/ i a "ost introdus n MySQL ;ersiunea E.FF. Sinta#a instruc!iunii de :tergere a inde# este urmtoarea+ 4.8P KL4/1 nume`inde# 8L nume`ta-el 3LN/. N3JL/ nume`ta-el 4.8P KL4/1 nume`inde# 3LN/. N3JL/ nume`ta-el 4.8P P.KM3.M S/M Primele dou instruc!iuni sunt ecBi;alente. @ea de%a treia este "olosit numai pen! :tergerea unui inde# de tip P.KM3.M S/MA n acest caz$ nu este necesar nici un nume i @apitolul E Sinta#a :i utilizarea SQL n MySQL 1[E inde#$ deoarece un ta-el poate con!ine o singur asemenea cBeie. 4ac nici un inde# nu a "ost creat n mod e#plicit ca P.KM3.M S/M$ dar ta-elul are dou sau mai multe inde#uri de tip ULKQU/$ MySQL l :terge pe primul dintre acestea. Knde#urile pot "i a"ectate dac :terge!i coloane dintr%un ta-el. 4ac :terge!i o coloan care "ace parte dintr%un inde#$ coloana ;a "i eliminat si din inde#. 4ac sunt :terse toate coloanele care alctuiesc un inde#$ atunci ntregul inde# ;a "i :ters. Knstruc!iunea 3LN/. N3JL/ 3LN/. N3JL/ este o instruc!iune ;ersatil n MySQL si se poate "olosi n multe scopuri. 4e)a am ;zut c(te;a dintre posi-ilit!ile sale &pentru crearea si :tergerea inde#urilor :i pentru con;ersia ta-elelor dintr%un "ormat de stocare n altul*$ n aceast sec!iune$ ;om discuta despre alte c(te;a 9aptitudini, ale acestei instruc!iuni. Sinta#a complet a instruc!iunii 3LN/. N3JL/ este descris n 3ne#a 4. 3LN/. N3JL/ este util atunci c(nd sesiza!i c structura unui ta-el nu mai re"lect "inalitatea acestuia. Pute!i "olosi ta-elul pentru a nregistra in"orma!ii suplimentare$ sau poate c ta-elul con!ine in"orma!ii care au de;enit super"lue. Poate c dimensiunea coloanelor e#istente este prea mic sau poate c le%a!i declarat mai mari dec(t este necesar :i dori!i s le mic:ora!i pentru a economisi spa!iu si pentru a m-unt!i per"orman!ele interogrilor. Sau poate c pur :i simplu a!i tastat incorect numele ta-elului atunci c(nd a!i emis instruc!iunea @./3N/ N3JL/. Kat c(te;a e#emple+ = /"ectua!i un cBestionar -azat pe Te- :i stoca!i rezultatele "iecrui cBestionar completat su- "orma unei nregistrri ntr%un ta-el. 3poi$ decide!i s modi"ica!i cBestionarul pentru a aduga unele ntre-ri suplimentare. Pentru a "ace loc noilor ntre-ri$ tre-uie s mai aduga!i coloane n ta-el. = 4erula!i un proiect de cercetare. .epartiza!i numere de caz nregistrrilor de cercetare "olosind o coloan 3UN8`KL@./M/LN. Lu ;%a!i a:teptat ca "inan!area proiectului s dureze su"icient pentru a permite generarea a mai mult de apro#imati; 50000 de nregistrri$ deci declara!i coloana de tip ULSK0L/4 SM3LLKLN$ care poate con!ine ma#imum H55EH ;alori unice. Notu:i$ "inan!area proiectului a "ost reluat :i se pare c ;e!i mai putea genera nc 50000 de nregistrri. Nre-uie ca tipul coloanei s "ie mai mare$ pentru a permite inser!ia mai multor numere de caz. = Modi"icrile dimensionale pot a;ea loc :i n sens in;ers. Poate c a!i creat o coloan @Y3. &F55*$ dar acum ; da!i seama c nici o ;aloare din acest ta-el nu are o lungime mai mare de 100 caractere. Pute!i reduce dimensiunea coloanei pentru a economisi spa!iu. Sinta#a instruc!iunii 3LN/. N3JL/ se prezint ast"el+ 3LN/. N3JL/ nume`ta-el ac!iune$ ...

Uiecare parametru ac!iune speci"ic o modi"icare pe care dori!i s o e"ectua!i n ta-el. MySQL e#tinde instruc!iunea 3LN/. N3JL/$ permi!(ndu%; s speci"ica!i mai multe ac!iuni$ separate prin ;irgul. 3cest lucru este util pentru reducerea ;olumului de te#t introdus de la tastatur$ dar un moti; mai important al introducerii acestei e#tensii l constituie imposi-ilitatea de a trans"orma ta-elele cu r(nduri de lungime ;aria-il n ta-ele cu r(nduri de lungime "i# "r a "i o-ligat s trans"orma!i n acela:i timp toate coloanele ?3.@Y3. n coloane @Y3.. 1[G Partea l Utilizarea general a sistemului MySQL /#emplele urmtoare prezint c(te;a dintre caracteristicile instruc!iunii 3LN/. N3JL/+ = .edenumirea unui ta-el. 8 opera!ie simplA pur :i simplu speci"ica!i numele ;ecBi sil numele nou+ 3LN/. N3JL/ nume`ta-el ./L3M/ 3S nume`nou`ta-el n MySQL E.FE$ care dispune de ta-ele temporare$ redenumirea unui ta-el temporar2 cu un nume care de)a e#ist n -aza de date determin ascunderea ta-elului original pel durata e#isten!ei ta-elului temporar. 3ceast opera!ie este similar cu procedeul ascundere a unui ta-el prin crearea unui ta-el temporar cu acela:i nume. = Modi"icarea tipului unei coloane. Pentru a modi"ica tipul unei coloane$ pute!i "olos)) una din clauzele @Y3L0/ sau M84KUM. S presupunem c n ta-elul ta-elul)neu e#ist ci coloan de tip SM3LLKLN ULSK0L/4 :i c dori!i s o trans"orma!i n M/4KUMKLt ULSK0L/4. Pute!i "ace aceasta "olosind oricare din urmtoarele dou comenzi+ 3LN/. N3JL/ ta-elul)neu M84KUM i M/4KUMKLN ULSK0L/4 3LN/. N3JL/ ta-elul)neu @Y3L0/ i i M/4KUMKLN ULSK0L/4 4e ce numele coloanei este men!ionat de dou ori n comanda care "olose:te @Y3L0/X 4eoarece @Y3L0/ are posi-ilitatea &pe care M84KUM nu o are*$ n a"ar de modi"icare2 tipului coloanei$ de a redenumi coloana. 4ac a!i "i ;rut s redenumi!i coloana din i n ) simultan cu scBim-area tipului$ a!i "i procedat ast"el+ 3LN/. N3JL/ ta-elul)neu @Y3L0/ i ) M/4KUMKLN ULSK0L/4 3spectul important este c mai nt(i denumi!i coloana pe care dori!i s%o modi"ica!i i apoi speci"ica!i o declara!ie complet a coloanei$ care include numele coloanei Lumele coloanei tre-uie inclus n declara!ie$ cBiar dac este acela:i ca ;ecBiul nume. Un moti; important pentru modi"icarea tipurilor de coloan const n m-unt!ireO e"icien!ei interogrilor pentru uniri care compar coloane din dou ta-ele. 8 comV para!ie are loc mai rapid atunci c(nd coloanele comparate sunt de acela:i tip. S pre7 supunem c rula!i o interogare ca aceasta+ S/L/@N ... U.8M t1$ tF TY/./ tl.nume R tF.nutne 4ac t1 .nume este @Y3.&10* si tF.nume este @Y3.&15*$ interogarea nu ;a rula la "el rapid ca n cazul n care am-ele coloane ar "i "ost de tipul @Y3. &15*. Pute!i atri-ui cele dou coloane acela:i tip prin modi"icarea tipului coloanei t1 .nume$ "olosind orica din urmtoarele dou comenzi+ 3LN/. N3JL/ t1 M84KUM nume @Y3.&15* 3LN/. N3JL/ t1 @Y3L0/ nume nume @Y3.&15* Pentru ;ersiuni de MySQL anterioare ;ersiunii E.FE$ este esen!ial ca tipurile coloanele* dintr%o unire s "ie identice$ n caz contrar inde#urile neput(nd "i "olosite pentru @8YV para!ie. Pentru ;ersiunea E.FE :i ;ersiunile ulterioare$ inde#urile se pot "olosi penti" tipuri di"erite$ dar interogarea ;a "i din nou mai rapid dac tipurile sunt identice. eV = @on;ersia unui ta-el cu r(nduri de lungime ;aria-il n ta-el cu r(nduri de lung "i#. S presupunem c a;e!i un ta-el cBart-l care con!ine coloane ?3.@Y3. pe care dot s le con;erti!i n coloane @Y3.$ pentru a ;edea care sunt m-unt!irile de per"or pe care le o-!ine!i$ & n general$ ta-elele cu r(nduri de lungime "i# pot "i prelucrate i rapid dec(t ta-elele cu r(nduri de lungime ;aria-il.* Na-elul a "ost creat ast"el+ @./3N/ N3JL/ cBart-l &nume ?3.@Y3.&G0*$ adresa ?3.@Y3.&J8** @apitolul E Sinta#a :i utilizarea SQL n MySQL 1[5 n acest caz$ pro-lema este c tre-uie s modi"ica!i simultan toate coloanele$ n aceea:i instruc!iune 3LN/. N3JL/. Lu pute!i modi"ica "iecare coloan n parte$ deoarece n acest caz ncercarea nu ar a;ea nici un e"ect. 4ac rula!i interogarea 4/S@.KJ/ cBart-l$ ;e!i descoperi c tipul coloanelor este n continuare de"inir ca ?3.@Y3.O Moti;ul este acela c$ dac modi"ica!i o singur coloan la un moment dat$ MySQL o-ser; c ta-elul con!ine coloane cu lungime ;aria-il si ]con;erte:te coloana modi"icat napoi la tipul ?3.@Y3.$ pentru a economisi spa!iu. Pentru a rezol;a pro-lema$ modi"ica!i simultan toate coloanele ?3.@Y3.+ 3LN/. N3JL/ cBart-l M84KUM nume @Y3.&G0*$ M84KUM adresa @Y3.&J8* n acest moment$ instruc!iunea 4/S@.KJ/ ;a demonstra c ta-elul con!ine coloane @Y3.. 3cest tip de opera!ii reprezint un moti; pentru care este important ca instruc!iunea 3LN/. N3JL/ s accepte mai multe ac!iuni n cadrul unei singure instruc!iuni. /#ist o capcan pe care tre-uie s o cunoa:te!i atunci c(nd dori!i s con;erti!i un ta-el ca acesta+ prezen!a n ta-el a coloanelor JL8J :i N/1N ;a aniBila orice ncercare de a con;erti un ta-el la un "ormat cu r(nduri de lungime "i#. Prezen!a "ie :i a unei singure coloane cu lungime ;aria-il ntr%un ta-el determin e#isten!a n ta-el a r(ndurilor cu lungime ;aria-il$ iar aceste tipuri de coloane &JL8J si N/1N % L.N.* nu au nici un ecBi;alent cu r(nduri de lungime "i#.

= @on;ersia unui ta-el cu r(nduri de lungime "i# n ta-el cu r(nduri de lungime ;aria-il. Jun$ deci cBart-l este mai rapid dac include numai r(nduri cu lungime "i#$ dar ocup mai mult spa!iu dec(t este necesar$ deci decide!i s%1 recon;erti!i napoi la "orma sa original$ pentru a economisi spa!iu. @on;ersia unui ta-el n aceast direc!ie este cu mult mai simpl. Nre-uie s trans"orma!i o singur coloan @Y3. n ?3.@Y3. si MySQL ;a con;erti n mod automat celelalte coloane @Y3.. Pentru a con;erti ta-elul cBart-l$ "olosi!i oricare dintre urmtoarele instruc!iuni+ 3LN/. N3JL/ cBart-l M84KUM nume ?3.@Y3.&G0* 3LN/. N3JL/ cBart-l M84KUM adresa ?3.@Y3. &I0* = @on;ersia unui tip de ta-el. 4ac a!i trecut de la o ;ersiune MySQL anterioar ;ersiunii E.FE la aceast ;ersiune sau la una ulterioar$ pute!i a;ea ta-ele mai ;ecBi$ care au "ost create ca ta-ele KS3M. 4ac dori!i s le crea!i n "ormat MylS3M$ proceda!i ast"el+ 3LN/. N3JL/ nume`ta-el NMP/ R MMKS3M 4e ce a!i proceda ast"elX Un moti;$ a:a cum s%a artat n sec!iunea 9@rearea :i :tergerea inde#urilor,$ este acela c "ormatul de stocare MylS3M dispune de unele caracteristici de inde#are ine#istente n "ormatul KS3M$ cum ar "i capacitatea de a inde#a ;alori LULL _i tipurile de coloane JL8J :i N/1N. Un alt moti; este acela c ta-elele MylS3M sunt mdependente de ma:in$ deci le pute!i deplasa :i n alte calculatoare prin copierea direct a "i:ierelor ta-el$ cBiar dac sistemele de calcul au arBitecturi BardWare di"erite. 4espre aceste aspecte ;om discuta mai detaliat n sec!iunea 9.ealizarea copiilor de siguran! a -azelor de date :i copierea acestora, din capitolul 11. 1[H Partea l Utilizarea general a sistemului MySQL 8-!inerea in"orma!iilor despre -aze de date :i ta-ele MySQL "urnizeaz numeroase instruc!iuni pentru o-!inerea de in"orma!ii prr; -azele de date :i ta-elele pe care le con!in acestea. Knstruc!iunile respecti;e sunt ut pentru urmrirea con!inutului -azelor dumnea;oastr de date :i pentru a ; rea structura ta-elelor. 4e asemenea$ le pute!i "olosi ca a)utor n utilizarea instructi; 3LN/. N3JL/A este mai u:or a determina modul de speci"icare a unei modi"icri nt coloan atunci c(nd pute!i a"la cum este de"init coloana la un moment dat. Knstruc!iunea SY8T poate "i "olosit pentru a se o-!ine in"orma!ii pri;ind numere aspecte ale -azelor de date :i ale ta-elelor dumnea;oastr+ 3"i:eaz -azele de date din ser;er 3"i:eaz ta-elele din -aza de date curent 3"i:eaz ta-elele din -aza de date speci"icat 3"i:eaz in"orma!iile despre coloanele ta-elul speci"icat 3"i:eaz in"orma!iile despre inde#urile ta-elul speci"icat 3"i:eaz in"orma!ii descripti;e despre ta- din -aza de date presta-ilit 3"i:eaz in"orma!ii descripti;e despre ta-e din -aza de date speci"icat Knstruc!iunile 4/S@.KJ/ nume`ta-el :i /1PL3KL nume`ta-el sunt sinonime cu instruct+ nea SY8T @8LUMLS U.8M nume`ta-el. @omanda mysalsBoW "urnizeaz o parte din in"orma!iile o"erite de instruc!iunea SY8T$7 ce ; permite s o-!ine!i din interpreter in"orma!iile pri;ind -azele de date :i ta-elele+ ) 3$ ) P mysalsBoW 3"i:eaz -azele de date din ser;er P mysalsBoW nume`d3"i:eaz ta-elele din -aza de date speci"ica!i P mysalsBoW nume`d- nume`ta-el 3"i:eaz in"orma!iile despre coloanele din+V& -elul speci"icat P mysalsBoW %%beys nume`d- nume`ta-el 3"i:eaz in"orma!iile despre inde#urile din -elul speci"icat P mysalsBoW %%status nume`d3"i:eaz in"orma!ii descripti;e despre ta-l din -aza de date speci"icat Utilitarul mysaldump ; permite s ;izualiza!i structura ta-elelor dumnea;oast "orma unei instruc!iuni @./3N/ N3JL/. &Spre deose-ire de instruc!iunea SY8T @8LK eu sunt de prere c rezultatele comenzii mysaldump sunt mai u:or de citit :i a"i:e inde#urile n ta-el.* 4ar$ dac "olosi!i mysaldump$ nu uita!i s in;oca!i aceast cor cu op!iunea % %no%data$ ca s nu ; mpotmoli!i n datele ta-elului dumnea;oastrO P mysaldump %%no%data nume`d- nume`ta-el 3t(t pentru mysalsBoW c(t :i pentru mysaldump$ pute!i speci"ica op!iunile uzuale$ cur "i % %Bost$ pentru a ; conecta la un ser;er instalat pe o alt gazd. SY8T 43N3J3S/S SY8T N3JL/S SY8T N3JL/S U.8M nume`dSY8T @8LUMLS U.8M nume`ta-el SY8T KL4/1 U.8M nume`ta-el SY8T N3JL/ SN3NUS

SY8T N3JL/ SN3NUS U.8M nume d@apitolul E Sinta#a :i utilizarea SQL n MySQL 1[[ .egsirea nregistrrilor S/L/@N lista`seZectie U.8M lista`ta-ele TY/./ restrictie`primara 0.8UP JM grupare`coloane 8.4/. JM sortare`coloane Y3?KL0 restrictie`seciCndara LKMKN numr Lu are nici un sens s plasa!i nregistrri ntr%o -az de date dac nu le regsi!i la un moment ulterior :i nu le utiliza!i ntr%un "el sau altul. 3cesta este :i rostul instruc!iunii S/L/@N+ s ; a)ute s a)unge!i la datele dumnea;oastr. S/L/@N este pro-a-il instruc!iunea cea mai "olosit a lim-a)ului SQL$ dar poate "i :i cea mai di"icilA restric!iile pe care le "olosi!i pentru a alege r(ndurile pot "i ar-itrar de comple#e si pot necesita$ n multe ta-ele$ compara!ii ntre coloane. Sinta#a de -az a instruc!iunii S/L/@N se prezint ast"el+ @oloanele care tre-uie selectate Na-elele din care sunt selectate r(ndurile @ondi!iile pe care tre-uie s le satis"ac r(ndurile Modul de grupare a rezultatelor Modul de sortare a rezultatelor @ondi!ii secundare pe care tre-uie s le satis"ac r(ndurile Limitare aplicat rezultatelor Noate elementele din aceast sinta# sunt op!ionale$ cu e#cep!ia cu;(ntului S/L/@N :i a parametrului lista`selectie$ care speci"ic datele pe care dori!i s le regsi!i. Unele sisteme de -aze de date impun si utilizarea clauzei U.8M. MySQL nu impune aceast clauz$ ceea ce ; permite s e;alua!i e#presii "r a "ace re"erire la ;reun ta-el+ S/L/@N SQ.N&P8T&E$F*DP8T&G$F** Kn capitolul l am acordat o aten!ie deose-it instruc!iunii S/L/@N$ concentr(ndu%ne cu precdere asupra listei cu selec!ia coloanelor si asupra clauzelorTY/./$ 0.8UP JM$ 8.4/. JM$ Y3?KL0 :i LKMKN$ n acest capitol$ ne ;om concentra asupra aspectului instruc!iunii S/L/@N care este$ poate$ cel mai derutant+ unirea. ?om discuta despre tipurile de uniri pe care le accept MySQL$ despre sensul :i modul de speci"icare a acestora. 3st"el ;e!i putea ntre-uin!a lim-a)ul MySQL ntr%un mod mai e"icient$ deoarece$ n multe situa!ii$ ade;rata pro-lem a determinrii modului de a scrie o interogare l constituie sesizarea modalit!ii adec;ate de unire a ta-elelor. 4e asemenea$ poate dori!i s e#amina!i sec!iunea 9Jre;iar de solu!ii,$ care apare mai t(rziu n acest capitol. 3colo ;e!i gsi solu!ii la numeroase pro-leme SQL$ din care marea ma)oritate implic$ ntr%un "el sau altul$ instruc!iunea S/L/@N. 0 pro-lem a instruc!iunii S/L/@N este aceea c$ atunci c(nd ; nt(lni!i prima dat cu un nou tip de pro-lem$ nu este ntotdeauna u:or s determina!i modul de a scrie o instruc!iune S/L/@N pentru a o rezol;a. Notu:i$ dup ce ;%a!i dat seama cum tre-uie scris interogarea$ pute!i "olosi e#perien!a acumulat atunci c(nd ;e!i nt(lni pro-leme similare n ;iitor. S/L/@N este$ pro-a-il$ instruc!iunea n cazul creia e#perien!a acumulat este cea mai important pentru capacitatea dumnea;oastr de a o "olosi e"icient$ pur _1 simplu datorit imensei ;ariet!i de moduri n care pute!i utiliza instruc!iunea. 1 e msur ce do-(ndi!i e#perien!$ o ;e!i putea aplica mai u:or la noile pro-leme :i ; ;e!i trezi g(ndindu%; ast"el+ 93$ da$ asta%i una din cBestiile alea cu L/UN Z8KL,$ respec%tl; 93Ba$ pi asta este o unire pe trei ci limitat de perecBile comune de coloane cBeie,. 1[I ParteaO Utilizarea general a sistemului MySQL &4e "apt$ mi%e cam )en s spun asta. ?i se poate prea ncura)ator s a"la!i c e#perie ; poate "i de "olos. Pe de alt parte$ e pu!in cam nspim(nttor s a)unge!i s g(nc "olosind un ast"el de ;oca-ularO* n urmtoarele c(te;a sec!iuni$ care demonstreaz modul de utilizare a "ormelor operatori de unire accepta!i de MySQL$ ma)oritatea e#emplelor "olosesc urmtoare dou ta-ele. Na-elele sunt mici$ ceea ce le "ace su"icient de simple pentru a permit sesizarea imediat a e"ectului "iecrui tip de unire+ ta-elul t1+ ta-elul tF+ it c1 1F @F 1 a F c F E E c G a Unirea normal @ea mai simpl unire este unirea normal$ n care este denumit un singur ta-el$ n ac caz$ r(ndurile sunt selectate din ta-elul speci"icat+ S/L/@N ' U.8M t1 11 @1 1 a F E c Unii autori nu consider aceast "orm a instruc!iunii S/L/@N ca "iind o unire :i "olosa acest termen numai pentru instruc!iunile S/L/@N care regsesc nregistrri din douA mai multe ta-ele. /u cred c este o pro-lem de perspecti;.

Unirea complet 4ac sunt speci"icate mai multe ta-ele$ cu numele separate prin ;irgul$ se e#ecu!i unire complet. 4e e#emplu$ dac uni!i dou ta-ele$ "iecare r(nd din primul ta-el > com-inat cu "iecare r(nd din al doilea ta-el+ S/L/@N t1.'$tF.' U.8M t1$ tF i.1 @1 1F @F ' a F @ F F @ E c F @ 1 a E F E E c E 1 a G a F G a E c G a @apitolul E Sinta#a :i utilizarea SQL n MySQL 1[5 8 unire complet se mai nume:te :i unire ncruci:at$ deoarece "iecare r(nd al "iecrui ta-el este ncruci:at cu "iecare r(nd din toate celelalte ta-ele pentru a produce toate com-ina!iile posi-ile. 3ceast opera!ie mai este cunoscut si su- numele de produs cartezian. Unirea n acest mod a ta-elelor are poten!ialul de a genera un numr "oarte mare de r(nduri$ deoarece numrul de r(nduri posi-il este produsul numerelor de r(nduri din "iecare ta-el. 8 unire complet ntre trei ta-ele care con!in 100$F00 si E00 de r(nduri poate returna 100 # F00 # E00 R H milioane de r(nduri$ ceea ce nseamn un numr "oane mare$ cBiar dac ta-elele n sine sunt mici. n situa!ii precum aceasta$ n mod normal se ;a "olosi o clauz TY/./ pentru a reduce setul de rezultate la o dimensiune mai rezona-ilO 4ac aduga!i n clauza TY/./ o condi!ie care s determine coro-orarea ta-elelor n "unc!ie de ;alorile anumitor coloane$ unirea de;ine ceea ce se nume:te o ecBi%unire$ deoarece selecta!i numai r(ndurile cu ;alori egale din coloanele speci"icate+ S/L/@N t1.'$ tF.' U.8M t1$ tF TY/./ t1.i1 R tF.iF 11 @1 1F 0F FE -c FE @ -

Nipurile de unire Z8KL$ @.8SS Z8KL :i KLL/. Z8KL sunt ecBi;alente cu operatorul de unire $. 8 unire SN.3K0YN`Z8KL este similar unei uniri complete$ dar ta-elele sunt unite n ordinea precizat n clauza U.8M$ n mod normal$ utilitarul de optimizare din MySQL :i ia li-ertatea de a rearan)a ordinea ta-elelor dintr%o unire complet pentru o regsire mai rapid a r(ndurilor. 8cazional$ utilitarul de optimizare nu ;a e"ectua o alegere optim$ alegere pe care o pute!i impune "olosind cu;(ntul cBeie SN.3K0YN`Z8KL. SN.3K0YN`Z8KL poate "i speci"icat n dou puncte ale instruc!iunii S/L/@N$ l pute!i insera ntre cu;(ntul cBeie S/L/@N :i lista de selec!ie$ pentru a a;ea un e"ect glo-al asupra tuturor unirilor complete din instruc!iune$ respecti; l pute!i speci"ica n clauza U.8M. Urmtoarele dou instruc!iuni sunt ecBi;alente+ S/L/@N SN.3K0YN`Z8KL ... U.8M ta-ell$ ta-eOF$ ta-eOE ... S/L/@N ... U.8M ta-ell SN.3K0YN Z8KL ta-eOF SN.3K0YN Z8KL% ta-elS ... /#plicitatea re"erin!elor la coloane .e"erin!ele la coloanele ta-elelor dintr%o instruc!iune S/L/@N tre-uie s trimit "r ecBi;oc la un singur ta-el denumit n clauza U.8M. 4ac este speci"icat un singur ta-el$ nu e#ist nici un ecBi;oc$ deoarece toate coloanele tre-uie s apar!in ta-elului respecti;. 4ac sunt denumite mai multe ta-ele$ toate numele de coloan care apar ntr%un singur ta-el sunt$ de asemenea$ "r ecBi;oc. Notu:i$ dac numele coloanei apare n mai multe ta-ele$ re"eririle la coloan tre-uie s con!in :i numele ta-elului$ "olosind sinta#a nume`ta-el.nume`coloana$ pentru a preciza ta-elul la care ; re"eri!i. 4ac un ta-el denumit ta-elul`meut con!ine coloanele a :i -$ iar un ta-el denumit ta-elul`meuF con!ine coloanele - :i c$ re"erin!ele la coloanele a si c sunt "r ecBi;oc$ dar re"erin!ele la coloana - tre-uie completate su- una din "ormele ta-elul)neul. - sau ta-elul`meuF. -+ S/L/@N a$ ta-elul)neul.-$ ta-elul`meuF.-$ c U.8M ta-elul)neul$ ta-elul`meuF... n unele situa!ii$ un element de e#plicitare de tip nume de ta-el nu este su"icient pentru clari"icarea unei re"erin!e de coloan. 4e e#emplu$ dac "olosi!i un ta-el de mai multe ori ntr%o interogare$ nu este su"i% 1I0 Partea l Utilizarea general a sistemului MySQL cient e#plicitatea unui nume de coloan cu numele ta-elului$ n acest caz$ pentru comunicarea inten ilor dumnea;oastr sunt utile aliasurile de ta-el. Pute!i atri-ui un alias oricrei instan!e a ta-elului :B "ace!i re"eriri la coloane din instan!a respecti; a ta-elului su- "orma nume`alias.nume`coloan< Urmtoarea interogare une:te un ta-el cu el nsu:i$ dar atri-uie un alias unei instan!e a ta-elului$ pen a permite speci"icarea "r ecBi;oc a re"erin!elor la coloan+ S/L/@N ta-elul)neu.coll$ m.colF

U.8M ta-elul)neu$ ta-elul)neu 3S m TY/./ ta-elul meu.coll > m.coll Unirea la st(nga 8 ecBi%unire a"i:eaz numai r(ndurile unde n am-ele ta-ele e#ist o coresponden! i anumite criterii de cutare. 8 unire la st(nga a"i:eaz de asemenea coresponden!ele$ da prezint :i r(ndurile din ta-elul din st(nga care nu au o coresponden! n ta-elul dreapta. Noate coloanele selectate din ta-elul din dreapta pentru aceste r(nduri :uii a"i:ate ca LULL. Mecanismul de "unc!ionare este acela c sunt selectate toate r(ndurile i ta-elul din st(nga. 4ac e#ist un r(nd ecBi;alent n ta-elul din dreapta$ r(ndul respe ti; este selectat. 4ac nu e#ist nici o ecBi;alen!$ se selecteaz totu:i un r(nd$ dar ace este un r(nd 9"als,$ n care toate coloanele au primit ;aloarea LULL. @u alte cu;inte2] unire la st(nga "or!eaz setul de rezultate s con!in un r(nd pentru "iecare r(nd al ta-el*O lui din st(nga$ indi"erent dac pentru r(ndul respecti; e#ist sau nu un ecBi;alent% ta-elul din dreapta. Sta-ilirea coresponden!ei se e"ectueaz con"orm coloanelor denur ntr%o clauz 8L sau USKL0&*. Pute!i "olosi op!iunea 8L indi"erent dac numele coloane pe care le uni!i sunt identice+ S/L/@N t1.'$ tF.' U.8M t1 L/UN Z8KL tF 8L t1.i1 R tF.iF 11 @1 1F l cF O a LULL6A LULL F F i c E "\ E i @lauza USKL0&* este similar clauzei 8L$ dar numele coloanei sau ale coloanelor ur tre-uie s "ie acelea:i n "iecare ta-el. Knterogarea urmtoare une:te coloaa ta-elul)neut .- cu coloana ta-elul`meuF.-+ S/L/@N ta-elul)neul.'$ ta-elulmeuF.' U.8M ta-elul)neul L/UN Z8KL ta-elul`meuF USKL0 &-* L/UN Z8KL este util mai ales atunci c(nd dori!i s gsi!i numai acele r(nduri ale tat lui din st(nga care nu apar n ta-elul din dreapta. Pentru aceasta$ aduga!i clauza6 care caut r(ndurile ta-elului din dreapta ce au ;alori LULL+ S/L/@N t1.'$ tF.' U.8M t1 L/UN Z8KL tF 8L t1.i1 R tF.iF TY/./ tF.iF KS LULL 11 @1 \ @F 1F + 1 a i LUL LUL L L @apitolul E Sinta#a :i utilizarea SQL n MySQL 1I1 n mod normal$ nu ;e!i selecta coloanele cu ;aloarea LULL$ deoarece nu prezint interes. @eea ce ; intereseaz sunt coloanele "r ecBi;alent ale ta-elului din st(nga+ S/L/@N t1.' U.8M t1 L/UN Z8KL tF 8L t1.i1 R tF.iF TY/./ tF.iF KS LULL 11 +. @1 Un aspect de care tre-uie s ; "eri!i n ceea ce pri;e:te L/UN Z8KL este acela c$ n cazul n care coloanele pe care realiza!i unirea sunt declarate ca "iind L8N LULL$ rezultatul poate con!ine r(nduri nedorite. L/UN Z8KL are c(te;a sinonime si ;ariante. L/UN 8UN/. Z8KL este sinonim cu L/UN Z8KL. 4e asemenea$ e#ist o nota!ie 84J@ pentru L/UN Z8KL care este acceptat de ctre MySQL &e#presia o ) are sensul de unire e#terioar % outer )oin*+ f o) nume`tatiel L/UN 8UN/. Z8KL nume`ta-el 8L e#pr`unire. e L3NU.3L L/UN Z8KL este similar cu L/UN Z8KLA e#ecut o unire la st(nga$ sta-ilind coresponden!e pentru toate coloanele cu acela:i nume ale ta-elelor din st(nga$ respecti; din dreapta. Unele sisteme de -aze de date au o instruc!iune .K0YN Z8KL ecBi;alentA MySQL nu dispune nc de aceast instruc!iune. Scrierea comentariilor MySQL ; permite s intercala!i comentarii n liniile dumnea;oastr de program SQL. 3cest lucru poate "i util pentru documentarea interogrilor pe care le stoca!i n "i:iere. Pute!i scrie comentarii n dou moduri. 8rice te#t delimitat de un caracter g la st(nga si s"(r:itul liniei la dreapta este considerat comentariu. Sunt permise :i comentariile "olosite n @. @u alte cu;inte$ orice te#t inclus ntre sim-olurile de nceput$ respecti; s"(r:it l' :i 6? este considerat comentariu. @omentariile n @ se pot e#tinde pe mai multe linii+ g acesta este un comentariu pe o singura linie C' si acesta este un comentariu pe o singura linie 'C C' acesta$ totu:i$ este un comentariu pe mai multe linii 'C ncep(nd de la MySQL ;ersiunea E.FE$ pute!i 9ascunde, cu;intele cBeie speci"ice lim-a)ului MySQL n comentarii de tip @$ preced(nd comentariul prin caracterele C' l n ioc de C'. MySQL e#amineaz acest tip

special de comentariu :i "olose:te cu;intele cBeie$ dar alte ser;ere de -aze de date le ;or ignora$ deoarece "ac parte din comentariu. 3cest lucru ; a)ut s scrie!i programe care -ene"iciaz de "unc!iile speci"ice sistemului MySQL atunci c(nd sunt e#ecutate n MySQL$ dar care pot "i "olosite si de ctre alte ser;ere de -aze de date$ "r modi"icri. Urmtoarele dou instruc!iuni sunt ecBi;alente pentru ser;ere de -aze de date altele dec(t MySQL$ dar MySQL ;a e"ectua o opera!ie KLS/.N 4/L3M/4 pentru a doua instruc!iune+ 1IF Partea l Utilizarea general a sistemului MySQL KLS/.N KLN8 a-sente &ele;`id$data* ?3LU/S&1E$,1555%05%FI,* KLS/.N C'O 4/L3M/4 'C KLN8 a-sente &ele;`id$data* ?3LU/S&1E$,1555%05%FI, ncep(nd de la ;ersiunea MySQL E.FE.E$ n a"ar de stilurile de comentariu descris anterior$ pute!i ini!ia un comentariu cu dou liniu!e :i un spa!iu &% %*A orice te#t pla ntre aceste liniu!e :i s"(r:itul liniei este tratat ca un comentariu. 3lte sisteme de -aze i date "olosesc cele dou liniu!e pentru a ncepe un comentariuA MySQL permite ace lucru$ dar impune utilizarea spa!iului pentru eliminarea oricrei con"uzii. Knstruc!iuni cu e#presii precum 5% %[ ar putea "i interpretate ca incluz(nd un come tariu. /ste pu!in pro-a-il s scrie!i o e#presie precum 5% % [$ deci aceasta este o euris tic util. Notu:i$ nu este dec(t o euristic$ deci pro-a-il este -ine s "olosi!i unul dir celelalte stiluri de comentarii$ "olosind liniu!ele du-le numai n programe pe care le pot ta!i din alte sisteme de -aze de date. Jre;iar de solu!ii 3ceast sec!iune seamn oarecum cu un 9corn al a-unden!ei,A indic modul de scrie a interogrilor pentru rezol;area di"eritelor categorii de pro-leme$ n ma)oritatea caz!! rilor$ acestea sunt solu!ii la pro-leme care mi%au par;enit din lista de corespondent &Mul!umiri persoanelor din list care au contri-uit cu multe din aceste rspunsuri.* .escrierea su-selectiilor su- "orm de uniri ncep(nd cu ;ersiunea E.FG$ MySQL ;a dispune de su-selec!ii. Lipsa acestei caracteri tici este una dintre cele mai criticate omisiuni din MySQL$ dar un lucru de care m par s nu%si dea seama este acela c interogrile scrise "olosind su-selec!ii pot "i "rec;i re"ormulate "olosind uniri. 4e "apt$ cBiar si c(nd MySQL ;a "i dotat cu su-selec!ii$ cBiar indicat s e#amina!i interogrile pe care sunte!i nclinat s le scrie!i "olosindu' deseori este mai e"icient s "olosi!i o unire n locul su-selec!iei. .escrierea su-selectiilor care selecteaz ;alori corespunztoare unui criteriu de cutare Kat un e#emplu de interogare care con!ine o su-selec!ieA interogarea selecteaz pu+ ta)ele din ta-elul puncte o-!inute la toate testele &adic ignor puncta)ele o-!inute cBestionare*+ S/L/@N ' U.8M puncte TY/./ e;eniment`id KL &S/L/@N e;eniment`id U.8M e;eniment TY/./ tip R ,N,* 3ceea:i interogare se poate scrie "r o su-selec!ie$ prin con;ersia ei ntr%o simpl S/L/@N puncte.' U.8M puncte$ e;eniment TY/./ puncte.e;eniment`id R e;eniment.e;eniment`id 3L4 e;eniment.tip /#emplul urmtor selecteaz puncta)ele o-!inute de ele;ii de se# "eminin+ S/L/@N ' U.8M puncte TY/./ ele;`id KL &S/L/@N ele;`id U.8M ele; TY/./ se# R ,U,* 9$s!cr A O'?> % @apitolul E Sinta#a :i utilizarea SQL n MySQL 1IE 3ceast interogare se poate con;erti ntr%o unire dup cum se ;a ;edea mai )os+ S/L/@N puncte.' U.8M puncte$ ele; TY/./ puncte.ele;`id R ele;.ele;`id 3L4 ele;.se# R ,U, Se o-ser; e#isten!a unui model. Knterogrile cu su-selec!ie respect urmtoarea "orm+ S/L/@N ' U.8M ta-ell TY/./ coloanat KL fS/L/@N coloanaF U.8M ta-eOFa TY/./ coloanaF- R ;aloare* 3semenea interogri pot "i con;ertite ntr%o unire "olosind aceast "orm+ S/L/@N ta-ell.' U.8M ta-ell$ ta-elF TY/./ ta-el1.coloana 1 R ta-elF.coloanaFa 3L4 ta"ceOF.coloanaF- R ;aloare .escrierea su-selec!iilor care selecteaz ;alori care nu corespund unui criteriu de cutare 8 alt categorie comun de interogri cu su-selec!ie caut ;alorile dintr%un ta-el care nu se regsesc n alt ta-el. 3:a cum am ;zut mai sus$ tipul de pro-lem 9;alori care nu e#ist, poate "i solu!ionat cu a)utorul unei instruc!iuni L/UN Z8KL. Kat o interogare cu su-selec!ie care testeaz a-sen!a ;alorilor dintr%un ta-el & i gse:te pe ele;ii cu prezen! 100P*A S/L/@N ' U.8M ele; TY/./ ele;`id L8N KL &S/L/@N ele;`id U.8M a-sente* 3ceast interogare se poate rescrie "olosind o instruc!iune L/UN Z8KL dup cum urmeaz+ S/L/@N ele;.' U.8M ele; L/UN Z8KL a-sente 8L ele;.ele;`id R a-sente.ele;`id

TY/./ a-sente.ele;`id KS LULL n termeni generali$ "orma interogrii cu su-selec!ie este urmtoarea+ S/L/@N ' U.8M ta-el1 TY/./ coloanaN L8N /1KSNS &S/L/@N coloanaF U.8M ta-eOF* 8 interogare cu aceast "orm se poate rescrie ast"el+ S/L/@N ta-ell.' TY/./ ta-el1 L/UN Z8KL ta-eOF 8L ta-el [.coloana1 R ta-eOF.coloanaF TY/./ ta-elF.coloanaF KS LULL Se presupune c declara!ia coloanei ta-eOF.coloanaF con!ine atri-utul L8N LULL. 4epistarea ;alorilor ine#istente ntr%un ta-el 4e)a am ;zut n sec!iunea 9.egsirea nregistrrilor, c$ atunci c(nd dori!i s :tiri care sunt ;alorile dintr%un ta-el ine#istente ntr%un alt ta-el$ "olosi!i o instruc!iune L/UN Z8KL pentru cele dou ta-ele si cuta!i r(ndurile n care este selectat ;aloarea LULL din al doilea ta-el. 3tunci a "ost prezentat o situa!ie simpl$ care "olosea urmtoarele dou ta-ele+ ta-elul t1+ ta-elul tF+ 11 @1 1F cF 1 a F c F E E c G a 1IG Partea l Utilizarea general a sistemului MySQL Knstruc!iunea L/UN Z8KL pentru gsirea tuturor ;alorilor din coloana t1.11 care nu = a"l n coloana 1F.1F are "orma urmtoare+ S/L/@N t1.' U.8M tt L/UN Z8KL tF 8L t1.i1 R tF.iF TY/./ tF.iF KS LULL 6. 11 ) @1 3cum$ s ne g(ndim la o ;ersiune mai di"icil a ntre-rii 9@are sunt ;alorile c lipsescX,$ n proiectul de e;iden! a rezultatelor :colare$ men!ionat pentru prima datai capitolul l$ a;em un ta-el ele; care con!ine ele;ii$ un ta-el e;eniment care prezi e;enimentele de tip e#aminare care s%au produs$ respecti; un ta-el puncte care enumi puncta)ele o-!inute de "iecare ele; la "iecare e;eniment de tip e#aminare. Notu:i$ daca ele; a "ost -olna; la data sus!inerii unui cBestionar sau a unui test$ ta-elul puncte nu con!ine nici un puncta) al ele;ului pentru e;enimentul respecti;$ deci este necesar reii rea cBestionarului sau a testului. @um putem gsi aceste nregistrri lips$ pentru a$ putea asigura c ele;ii respecti;i sus!in repetarea e#aminriiX Pro-lema const n determinarea ele;ilor care nu au nici un puncta) la o e#aminare$ p7 tru "iecare e#aminare n parte. @u alte cu;inte$ dorim s a"lm care sunt com-ina!i ele;%e;eniment care nu se regsesc n ta-elul puncte. 3ceast "ormulare de tip 9care ;alorile ine#istente, este o sugestie a "aptului c se dore:te o instruc!iune L/UN Z8O Unirea nu ;a "i la "el de simpl ca n e#emplul anterior$ totu:i$ deoarece nu cutm nur ;alori ine#istente ntr%o singur coloan$ ci o com-ina!ie ntre dou coloane. @om-ina!iile pe care le cutm sunt toate com-ina!iile ele;%e;eniment$ care se prod: din ncruci:area ta-elului ele; cu ta-elul e;eniment+ U.8M ele;$ e;eniment 3poi$ lum rezultatul unirii respecti;e :i e#ecutm o instruc!iune L/UN Z8KL cu ta-e) puncte pentru a gsi perecBile cutate+ U.8M ele;$ e;eniment L/UN Z8KL puncte 8L ele;.ele;`id R puncte.ele;`id 3L4 e;eniment.e;eniment`id R puncte.e;eniment`id , .e!ine!i c clauza 8L permite unirea r(ndurilor din ta-elul puncte n con"ormitate ;alorile ecBi;alente din di"erite ta-ele. 3ceasta este cBeia pentru rezol;area pro-leii Knstruc!iunea L/UN Z8KL "or!eaz generarea unui r(nd pentru "iecare r(nd o-!inut unirea ncruci:at a ta-elelor ele; si e;eniment$ cBiar dac nu e#ist nici o nregisti corespunztoare n ta-elul puncte. .(ndurile din setul de rezultate pentru aceste gistrri lips din ta-elul puncte pot "i identi"icate prin "aptul c toate coloanele. ta-elul puncte ;or a;ea ;aloarea LULL. Putem selecta aceste nregistrri n clauza T)l) Se poate utiliza orice coloan din ta-elul puncte$ dar$ deoarece cutm puncta)ele liVV pro-a-il c din punct de ;edere conceptual este cel mai clar dac testm coloana pune] TY/./ puncte.puncte KS LULL Putem pune rezultatele n ordine "olosind o clauz 8.4/. JM. @ele mai logice dou )amente sunt n "unc!ie de ele; :i de e;eniment$ l ;oi alege pe primul+ 8.4/. JM ele;`ele;.id$ e;eniment.e;eniment`id @apitolul E Sinta#a :i utilizarea SQL n MySQL 1I5 3cum$ tot ce a;em de "cut este s speci"icm coloanele pe care dorim s le ;edem ca date de ie:ire :i am terminat. Kat interogarea "inal+ S/L/@N ele;.nume$ ele;.ele;`id$ e;eniment.data$ e;eniment.e;eniment`id$ e;eniment.tip U.8M

ele;$ e;eniment L/UN Z8KL puncte 8L ele;.ele;`id R puncte.ele;`id 3L4 e;eniment.e;eniment`id R puncte.e;eniment`id TY/./ puncte.puncte KS LULL 8.4/. JM ele;`ele;.id$ e;eniment.e;eniment`id La rularea interogrii se produc urmtoarele rezultate+ nume ele;`id data e;eniment`id tip Megan 1 1555%05%1H G @ ZosepB F 1555%05%0E 1 @ Satie G 1555%05%FE 5 @ 4e;ri 1E 1555%05%0E 1 n 4e;ri 1E 1555%10%01 H N Till 1[ 1555%05%1H G @ 3;e r y F0 1555%05%0H F @ 0regory FE 1555%10%01 H N SaraB FG 1555%05%FE 5 @ @arter F[ 1555%05%1H G C=^ @arter F[ 1555%05%FE 5 @ 0a-rielle F5 1555%05%1H G c 0race E0 1555%05%FE 5 c 3ici este un element su-til. 4atele de ie:ire a"i:eaz identi"icatorii de ele; :i de e;eniment. @oloana ele;`id apare at(t n ta-elul ele;$ c(t :i n ta-elul puncte$ deci la nceput s%ar putea s crede!i c lista de selec!ie putea con!ine "ie ele;.ele;`id$ "ie puncte.ele;`id. Lu este ade;rat$ deoarece "undamentul capacit!ii de a gsi nregis% trrile care ne intereseaz este acela c toate c(mpurile din ta-elul puncte sunt returnate ca "iind LULL. Prin selectarea coloanei puncte.ele;`id s%ar "i o-!inut ca date de ie:ire numai o coloan de ;alori LULL. Un ra!ionament similar se aplic :i n cazul coloanei e;eniment`id$ care apare at(t n ta-elul e;eniment$ c(t si n ta-elul puncte. /"ectuarea unei opera!ii ULK8L 4ac dori!i s crea!i un set de rezultate prin selectarea nregistrrilor din mai multe ta-ele care au aceea:i structur$ pute!i "ace acest lucru n unele sisteme de -aze de date lolosind o anumit categorie de instruc!iuni ULK8L. MySQL nu dispune de o asemenea instruc!iune &cel pu!in p(n la MySQL ;ersiunea E.FG*$ dar pute!i ocoli acest nea)uns n c(te;a moduri$ n continuare sunt date dou posi-ile solu!ii+ 1IH Partea l Utilizarea general a sistemului MySQL = /"ectua!i mai multe interogri S/L/@N$ c(te una pentru "iecare ta-el. 3ceast solu!iV este posi-il dac nu ; intereseaz ordinea r(ndurilor pe care le selecta!i. = Selecta!i r(ndurile din "iecare ta-el ntr%un ta-el temporar de stocare. 3poi selectat con!inutul acelui ta-el. 3cest lucru ; permite s sorta!i r(ndurile a:a cum dori!i. MySQL E.FE :i ;ersiunile ulterioare$ pute!i rezol;a cu u:urin! aceast pro-lem ] mi!(nd ser;erului s creeze automat ta-elul de stocare. 4e asemenea$ pute!i atri-t] acestui ta-el un caracter temporar$ ast"el nc(t s "ie :ters automat la terminarea sesiunii dumnea;oastr de lucru cu ser;erul. n programul urmtor$ ;om :terge ta-elul n mod e#plicit$ pentru a permite ser;erii lui s eli-ereze resursele asociate acestuia. 3ceasta este o idee -un dac sesiunea clie ;a continua s e"ectueze si alte interogri. 4e asemenea$ ;om "olosi un ta-el Y/3P &st cat n memorie* pentru a o-!ine per"orman!e sporite. @./3N/ N/MP8.3.M N3JL/ t-l Stoc NMP/RY/3P ... U.8M ta-el " TY/./... KLS/.N KLN8 t-l`stoc S/L/@N KLS/.N KLN8 t-l St8@ S/L/@N U.8M ta-eOF TY/./ U.8M ta-elE TY/./ S/L/@N ' U.8M t-l`stoc 8.4/. JM ... 4.8P N3JL/ t-l`stoc Pentru ;ersiunile de MySQL anterioare ;ersiunii E.FE$ ideea este similar$ cu e#cepi "aptului c tre-uie s declara!i n mod e#plicit coloanele din ta-elul t-l`stoc$ i instruc!iunea 4.8P N3JL/ de la s"(r:it este o-ligatorie$ pentru a mpiedica e#istent ta-elului dup s"(r:itul perioadei de ;ia! a sesiunii client+ @./3N/ N3JL/ t-l`stoc &coloanaX ...$ coloana F ...$ ...* S/L/@N ... U.8M ta-el* TY/./ ... KLS/.N KLN8 t-l`stoc S/L/@N ... U.8M ta-el r TY/./ ... KLS/.N KLN8 t-l`stoc S/L/@N ... U.8M ta-elF TY/./ ... KLS/.N KLN8 t-l`St8@ S/L/@N ... U.8M ta-eOE TY/./ ... S/L/@N ' U.8M t-l`St8@ 8.4/. JM ... 4.8P N3JL/ t-l`stoc 3dugarea unei coloane cu numere dintr%o sec;en! 4ac "olosi!i instruc!iunea 3LN/. N3JL/ pentru a aduga o coloan 3UN8`KL@./M/> coloana este

completat automat cu numere dintr%o sec;en!. Urmtorul set i instruc!iuni dintr%o sesiune mysal prezint principiul de "unc!ionare al acestei oper prin crearea unui ta-el$ inser!ia unor date n ta-el :i apoi adugarea unei coloa 3UN8`KL@./M/LN+ mysal> @./3N/ N3JL/ t&@ @Y3.&10**A 6 mysal> KLS/.N KLN8 t ?3LU/S&,a,*$&,-,*$ &,@,*A + mysal> S/L/@N ' U.8M "$ 6 @apitolul E Sinta#a :i utilizarea SQL n MySQL 1I[ mysal> 3LN/. N3JL/ t 344 i KLN 3UN8`KL@./M/LN L8N LULL P.KM3.M S/M mysal> S/L/@N ' U.8M tA

Sec;en!ierea1 sau resec;en!ierea unei coloane e#istente 4ac a;e!i o coloan numeric$ o pute!i sec;en!ia &sau resec;en!ia dac a "ost sec;en!ial anterior$ dar a!i :ters r(nduri :i dori!i s renumerota!i ;alorile pentru ca acestea s "ie contigui* ast"el+ 3LN/. N3JL/ t M84KUM i KLN LULL UP43N/ t S/N i R LULL 3LN/. N3JL/ t M84KUM i KLN ULSK0L/4 3UN8`KL@./M/LN L8N LULL P.KM3.M S/M 4ar o modalitate mai simpl de a e"ectua aceast opera!ie este de a :terge pur :i simplu coloana si de a o aduga din nou$ su- "orma unei coloane 3UN8`KL@./M/LN. Knstruc!iunea 3LN/. N3JL/ permite speci"icarea mai multor ac!iuni$ deci toate aceste opera!ii se pot e#ecuta ntr%o singur instruc!iune+ 3LN/. N3JL/ t 4.8P i$ 344 i KLN ULSK0L/4 3UN8`KL@./M/LN L8N LULL P.KM3.M S/M Sortarea ntr%o ordine neo-i:nuit S presupunem c a;e!i un ta-el care con!ine personalul unei institu!ii sporti;e$ cum ar "i o ecBip de "ot-al+ dori!i s sorta!i datele de ie:ire dup "unc!ia mem-rilor personalului$ ast"el nc(t acestea s apar ntr%o anumit ordine$ cum ar "i urmtoarea+ antrenor$ antrenor secund$ portari$ "unda:i$ mi)loca:i$ atacan!iF. 4e"ini!i coloana cu tipul /LUM :i men!iona!i elementele enumerrii n ordinea n care dori!i s le ;ede!i. .ezultatele opera!iilor de sortare din coloana respecti; ;or aprea n ordinea pe care o speci"ica!i. @on"igurarea unui ta-el contor Kn sec!iunea 9Lucrul cu sec;en!e, din capitolul F$ am prezentat modul de generare a unei sec;en!e "olosind "unc!ia L3SN`KLS/.N`K4&e#pr*. /#emplul de acolo ilustra modul de con"igurare a unui contor "olosind un ta-el cu un singur r(nd. /#emplul este "oarte -un pentru un singur contor$ dar$ dac a;e!i ne;oie de mai multe contoare$ metoda respecti; duce la o multiplicare inutil a ta-elelor. S presupunem c a;e!i un sit Te- :i dori!i 3dic trans"ormarea unei sec;en!e de numere "r nici o ordine ntr%o sec;en! ordonatA prin ..resec;en!iere, se ;a n!elege re;enirea la ordinea din sec;en!$ ordine alterat de o opera!ie sau alta. % L.N. 3m recurs la 9adaptarea, traducerii "olosind posturile dintr%o ecBip de "ot-al european$ posturi mult mai "amiliare cititorului rom(n dec(t cele din cadrul unei ecBipe de "ot-al american$ "olosite de autorul edi!iei originale. % L.N. 1II Partea l Utilizarea general a sistemului MySQL s insera!i n mai multe pagini contoare de genul 9aceast pagin a "ost descBis de nu ori,. Pro-a-il c nu dori!i s con"igura!i un ta-el contor separat pentru "iecare pagii care are un contor. 8 modalitate de a e;ita crearea de ta-ele contor multiple este de a crea un singur tat cu dou coloane. 8 coloan con!ine o ;aloare contorA cealalt con!ine numele contor lui. Putem "olosi n continuare "unc!ia L3SN`KLS/.N`K4&*$ dar ;om determina r(ndii cruia i se aplic aceast "unc!ie "olosind numele contorului. Na-elul se prezint ast"ei+ @./3N/ N3JL/ contor numr KLN ULSK0L/4$ nume ?3.@Y3.&F55* L8N LULL P.KM3.M S/M * Lumele este un :ir$ ast"el nc(t putem apela un contor n orice mod dorim$ moti; pe tru care l ;om trans"orma n coloan P.KM3.M S/M pentru a pre;eni duplicarea numele 3cest lucru presupune c aplica!iile care "olosesc ta-elul con;in asupra numelor pe cai le ;or "olosi. Pentru contoarele noastre din paginile Te-$ putem asigura unicit!i numelor contoarelor prin simpla utilizare ca nume de contor al unei pagini a nume cii de acces la pagina respecti; din cadrul ar-orelui documentului. 4e e#emplu$ coi "igurarea unui contor nou pentru pagina de -az a sitului se realizeaz ast"el+ KLS/.N KLN8 contor &nume* ?3LU/S&,inde#.Btml,* 3ceast instruc!iune ini!ializeaz contorul denumit ,inde#.Btml, cu ;aloarea ze Pentru a genera urmtoarea ;aloare din sec;en!$ incrementa!i contorul n r(ndul ad] ;at al ta-elului$ dup care regsi!i%1 "olosind "unc!ia L3SN`KLS/.N`K4&*+

UP43N/ contor S/N numr R L3SN`KLS/.N`K4&numar%i%1* TY/./ nume R ,inde#.Btml, S/L/@N L3SN`KLS/.N`K4&* 8 metod alternati; ar "i incrementarea contorului "r a "olosi "unc!ia L3SN`KLS/.N`K4" ast"el+ UP43N/ contor S/N numr R numarD1 TY/./ nume R ,inde#.Btml, S/L/@N numr U.8M contor TY/./ nume R ,inde#.Btml, Notu:i$ metoda nu "unc!ioneaz corect dac un alt client incrementeaz contorul du" emite!i instruc!iunea UP43N/ :i nainte de a emite instruc!iunea S/L/@N. Pute!i rezol;aA pro-lem delimit(nd cele dou instruc!iuni cu instruc!iunile L8@S N3JL/S :i ULL8@S N3 pentru a -loca al!i clien!i n timp ce "olosi!i contorul. 4ar metoda L3SN`KLS/.N`K4 &* aceea:i opera!ie mult mai simplu. 4eoarece ;aloarea sa este speci"ic clientului$ ntotdeauna ;aloarea pe care a!i inserat%o$ nu pe cea a altui client$ :i nu tre-uie s compli programul cu -locri pentru a nu permite accesul altor clien!i. ?eri"icarea e#isten!ei ta-elului Uneori este util s putem determina$ din interiorul unei aplica!ii$ dac un ta-el dat i sau nu. Pentru aceasta$ pute!i "olosi oricare din urmtoarele instruc!iuni+ @apitolul E Sinta#a :i utilizarea SQL n MySQL 1I5 S/L/@N @8ULN&'* U.8M nume`ta-el S/L/@N ' U.8M nume`ta-el TY/./ 1R0 Uiecare din aceste instruc!iuni reu:e:te dac ta-elul e#ist$ respecti; e:ueaz dac ta-elul nu e#ist. /le reprezint interogri per"ormante pentru aceast categorie de test si se e#ecut "oarte rapid$ deci nu a;e!i ne;oie de prea mult timp pentru a le rula. 3ceast strategie este cea mai indicat pentru programele de aplica!ie pe care le scrie!i$ deoarece pute!i testa succesul sau e:ecul interogrii :i pute!i ntreprinde ac!iuni n consecin!. Metoda nu este deose-it de util ntr%un script de grup pe care l rula!i din mysal$ deoarece la apari!ia unei erori nu pute!i "ace nimic altce;a dec(t s termina!i programul &sau s ignora!i eroarea$ dar atunci rularea interogrii nu mai are nici un sens*. @aracteristici pe care MySQL nu le accept 3ceast sec!iune descrie caracteristici a"late n alte sisteme de -aze de date :i pe care MySQL nu le accept. Sec!iunea de "a! prezint caracteristicile care lipsesc si indic modalit!i de a ocoli aceste omisiuni$ acolo unde este posi-il$ n general$ caracteristicile lipsesc din MySQL deoarece au consecin!e negati;e asupra per"orman!elor. Lumeroase articole din aceast list se a"l pe lista de priorit!i a dez;oltatorilor$ n ;ederea implementrii n msura timpului disponi-il si cu presupunerea c pot "i implementate "r sacri"icarea scopului lor ini!ial$ acela de a o-!ine un ni;el optim de per"orman!. = Sa-selec!ie. 8 su-selec!ie este o instruc!iune S/L/@N im-ricat ntr%o alt instruc!iune S/L/@N$ cum este cazul n urmtoarea interogare+ S/L/@N ' U.8M puncte TY/./ e;eniment`id KL &S/L/@N e;eniment`id U.8M e;eniment TY/./ tip R ,N,* Su-selec!iile sunt programate s apar n MySQL ;ersiunea E.FG$ moment n care nu ;or mai constitui o omisiune. P(n atunci$ multe interogri care sunt scrise "olosind su-selec!ii pot "i redactate alternati; su- "orm de uniri. ?ezi sec!iunea 9.escrierea su-selec!iilor su- "orm de uniri,. = Nranzac!ii :i nregistrare%re;enire. 8 tranzac!ie este un set de instruc!iuni SQL care sunt e#ecutate unitar$ " ar ntrerupere din partea altor clien!i. @aracteristica de nregistrare%re;enire ; permite s declara!i c instruc!iunile tre-uie e#ecutate unitar sau deloc. @u alte cu;inte$ dac ;reo instruc!iune din cadrul tranzac!iei e:ueaz$ toate instruc!iunile e#ecutate p(n n acel moment sunt anulate. MySQL e#ecut automat -locarea pentru instruc!iunile SQL indi;iduale$ pentru a pre;eni interac!iunile dintre clien!i. &4e e#emplu$ doi clien!i nu pot scrie simultan n acela:i ta-el.* n plus$ pute!i "olosi L8@S N3JL/S :i ULL8@S N3JL/S pentru a grupa instruc!iunile ntr%un tot unitar$ ceea ce ; permite s e"ectua!i opera!ii pentru care controlul con%K curentei pentru o singur instruc!iune nu este su"icient. Pro-lema MySQL legate de l tranzac!ii este aceea c sistemul nu ;a grupa n mod automat instruc!iunile$ iar dum% = nea;oastr nu pute!i e"ectua anularea &re;enirea* instruc!iunilor dac ;reuna e:ueaz. Y Pentru a ;edea n ce mod pot "i utile tranzac!iile$ s presupunem c acti;a!i n dome% = niul ;(nzrilor de con"ec!ii :i c actualiza!i ni;elurile de in;entar ori de c(te ori ;re%Y unul din agen!ii dumnea;oastr de ;(nzri realizeaz o ;(nzare. /#emplul urmtor 150 Partea l Utilizarea general a sistemului MySQL ilustreaz tipul de pro-leme care pot sur;eni atunci c(nd mai mul!i agen!i de ;(nz actualizeaz simultan -aza de date &presupun(nd c in;entarul ini!ial de cm:i era i G[ de -uc!i*+ t1 3gentul l ;inde trei cm:i tF 3gentul l regse:te numrul total de cm:i &G[*+ S/L/@N cantitate U.8M in;entar TY/./ art R ,cma:a, tE 3gentul F ;inde trei cm:i tG 3gentul F regse:te numrul total de cm:i &G[*+

S/L/@N cantitate U.8M in;entar TY/./ art R ,cma:a, t5 3gentul l calculeaz noul ni;el al in;entarului cu e#presia G[%ERGG sil sta-ile:te numrul de cm:i la GG+ UP43N/ in;entar S/N cantitate R GG TY/./ art R ,cma:a, te 3gentul F calculeaz noul ni;el al in;entarului cu e#presia G[%FRG5 + sta-ile:te numrul de cm:i la G5+ UP43N/ in;entar S/N cantitate R G5 TY/./ art R ,cma:a, La s"(r:itul acestei sec;en!e de e;enimente$ a!i ;(ndut cinci cm:i &asta%i -ine*$ darV in;entar scrie G5 de -uc!i$ n loc de GF &asta nu%i -ine*. Pro-lema este c$ n cazul 1 care cuta!i ;aloarea in;entarului ntr%o instruc!iune :i actualiza!i ;aloarea ntr%o $ instruc!iune$ a;e!i o tranzac!ie cu instruc!iuni multiple. 3c!iunea ntreprins n a 7 instruc!iune depinde de ;aloarea regsit n prima. 4ar$ dac se produc tranzac!ii M parate n inter;ale de timp care se suprapun$ instruc!iunile din "iecare tranzac!ie i ntre!es :i inter"era una cu alta. ntr%o -az de date tranzac!ional$ instruc!iui "iecrui agent de ;(nzri pot "i e#ecutate ca o tranzac!ie$ iar instruc!iunile 3gentuT nu ;or e#ecuta dec(t dup "inalizarea e#ecu!iei instruc!iunilor 3gentului 1. n M* pute!i o-!ine acela:i e"ect n dou moduri+ = Solu!ie ocolitoare 1+ /#ecuta!i un grup de instruc!iuni ca pe un tot ur Pute!i grupa instruc!iuni la un loc :i le pute!i e#ecuta ca pe o unitate indi;iziiO delimit(ndu%le cu a)utorul instruc!iunilor L8@S N3JL/S si ULL8@S N3JL/S+ -b toate ta-elele pe care tre-uie s le "olosi!i$ emite!i interogrile si anula!i -loca 3ceast opera!ie interzice oricui altcui;a s "oloseasc ta-elele n timp ce ac sunt -locate. Uolosind -locarea ta-elelor$ situa!ia in;entarului se prezintA t1 3gentul l ;inde trei cm:i tF 3gentul l o-!ine o -locare :i regse:te numrul curent de cm:i l L8@S N3JL/S in;entar T.KN/ S/L/@N cantitate U.8M in;entar TY/./ art R ,cma:a, tE 3gentul F ;inde dou cm:i tG 3gentul F ncearc s o-!in o -locareA aceast ncercare ;a e:ua$ deoarece 3gentul l de!ine de)a o -locare+ L8@S N3JL/S in;entar T.KN/ @apitolul E Sinta#a :i utilizarea SQL n MySQL 151 t5 3gentul l calculeaz noua ;aloare a in;entarului cu "ormula G[%ERGG$ sta-ile:te numrul de cm:i la GG :i anuleaz -locarea+ UP43N/ in;entar S/N cantitate R GG TY/./ art R ,cma:a, ULL8@S N3JL/S tH 3cum$ cererea pentru o -locare$ "ormulat de 3gentul F$ reu:e:te. 3gentul F regse:te numrul total de cm:i &GG*+ S/L/@N cantitate U.8M in;entar TY/./ art R ,cma:a, t[ 3gentul F calculeaz noua ;aloare a in;entarului cu "ormula GG%FRGF$ sta-ile:te numrul de cm:i la GF :i eli-ereaz -locarea+ UP43N/ in;entar S/N cantitate R GF TY/./ art R ,cma:a, ULL8@S N3JL/S 3cum$ instruc!iunile din cele dou tranzac!ii nu se amestec una cu alta :i ni;elul in;entarului este sta-ilit corect. ?om "olosi aici o -locare T.KN/$ deoarece este necesar s modi"icm ta-elul in;entar. 4ac ; rezuma!i la citirea ta-elelor$ pute!i "olosi n scBim- o -locare ./34. 3ceasta permite altor clien!i s citeasc ta-elele n timp ce dumnea;oastr le "olosi!i$ dar i mpiedic s scrie n acestea. n e#emplul prezentat anterior$ 3gentul F pro-a-il c nu ;a sesiza nici o scdere a ;itezei$ deoarece tranzac!iile sunt scurte :i se ;or e#ecuta rapid. Notu:i$ ca regul general$ este de dorit s e;ita!i -locarea ta-elelor pentru un inter;al lung de timp. 4ac "olosi!i mai multe ta-ele$ tre-uie s le -loca!i pe toate nainte de a e#ecuta interogrile grupate. 4ac doar citi!i dintr%un anumit ta-el$ totu:i$ a;e!i ne;oie numai de o -locare a ta-elului de tip citire$ nu de una de tip scriere. S presupunem c a;e!i un set de interogri prin care dori!i s "ace!i unele modi"icri ntr%un ta-el in;entar$ :i de asemenea dori!i s citi!i unele date dintr%un ta-el client$ n acest caz$ a;e!i ne;oie de o -locare la scriere a ta-elului in;entar$ respecti; de o -locare la citire a ta-elului client+ L8@S N3JL/S in;entar T.KN/$ client ./34 ULL8@S N3JL/S 3ceast opera!ie impune ca dumnea;oastr s e#ecuta!i personal -locarea$ respecti; de-locarea ta-elelor. Un sistem de -aze de date cu suport pentru tranzac!ii ;a e"ectua aceste ac!iuni n mod automat. Notu:i$ aspectul pri;ind gruparea instruc!iunilor ca un tot unitar n ;ederea e#ecu!iei este acela:i ca n cazul sistemelor de -aze de date tranzac!ionale. i Solu!ie ocolitoare F+ Uolosi!i actualizri relati;e$ nu a-solute. 3 doua modalitate de a rezol;a pro-lema amestecului instruc!iunilor pro;enite din multiple tranzac!ii este eliminarea dependen!ei ntre instruc!iuni. 4e:i acest lucru nu este ntotdeauna posi-il$ ;om presupune c este posi-il pentru e#emplul nostru cu in;entarul. Pentru metoda de actualizare a in;entarului "olosit n solu!ia ocolitoare l$ tranzac!ia const din cutarea ;alorii

curente a in;entarului$ calculul noii ;alori n "unc!ie de numrul de cm:i ;(ndute :i apoi actualizarea ci"rei de

15F Partea l Utilizarea general a sistemului MySQL in;entar la noua ;aloare. 3ceast opera!ie este posi-il ntr%o singur etap$ priV simpla actualizare a numrului de cm:i relati; la ;aloarea sa curent+ 11 3gentul l ;inde trei cm:i 1F 3gentul l decrementeaz numrul de cm:i cu trei+ UP43N/ in;entar S/N cantitate R cantitate % E TY/./ art R l ,cma:a, 1E 3gentul F ;inde dou cm:i 1G 3gentul F decrementeaz numrul de cm:i cu doi+ UP43N/ in;entar S/N cantitate R cantitate % F TY/./ art R ,cma:a, 4up cum se poate ;edea$ aceast metod nu necesit su- nici o "orm tranzac cu mai multe instruc!iuni si$ ca atare$ nu este necesar -locarea ta-elelor penal simularea caracteristicilor tranzac!ionale. 4ac tipurile de tranzac!ii pe care le%a "olosit p(n acum sunt similare celui prezentat mai sus$ pute!i rezol;a pro-leia "r a "olosi deloc tranzac!ii. /#emplul precedent indic modul de e;itare a 9necesit!ii, tranzac!iilor nt anumit situa!ie. 3ceasta nu nseamn c nu e#ist :i alte situa!ii c(nd cBiar es ne;oie de tranzac!ii. Un e#emplu caracteristic n acest sens implic un transil "inanciar$ c(nd -anii dintr%un cont sunt plasa!i ntr%un alt cont. S presupunem$O Marin i scrie un cec lui 4orin pentru suma de 100 de dolari$ iar 4orin Kncase cecul. @ontul lui Marin tre-uie decrementat cu 100 de dolari$ iar contul lui 4or tre-uie incrementat cu aceea:i sum+ UP43N/ cont S/N -alan!a R -alan!a % 100 TY/./ nume R ,Mri!i UP43N/ cont S/N -alan!a R -alan!a D 100 TY/./ nume R ,4oritO 4ac se produce o cdere a sistemului ntre cele dou instruc!iuni$ tranzac!ia 7 incomplet. Un sistem de -aze de date cu caracteristici autentice de tranzac!iei de nregistrare%re;enire este capa-il s rezol;e aceast pro-lem. &@el pu!in i retic. S%ar putea s "i!i o-ligat s determina!i tranzac!iile care nu au "ost introduO :i s le emite!i din nou$ dar cel pu!in nu mai a;e!i pro-leme cu )umtate tranzac!ii.* n MySQL$ pute!i determina starea tranzac!iei la momentul c prin e#aminarea )urnalului de actualizare$ de:i acest lucru impune o oa e#aminare manual a )urnalului. = @Bei e#terne :i integritate re"eren!ial. 8 cBeie e#tern ; permite s declara!i i cBeie dintr%un ta-el este corelat cu o cBeie dintr%un alt ta-el$ iar integritatea re"e !ial ; permite s impune!i restric!ii n ceea ce pri;e:te ac!iunile care pot "i e"ec n ta-elul care con!ine cBeia e#tern. 4e e#emplu$ ta-elul puncte din -aza noastrSV date demonstrati; samp`d- con!ine o coloan ele;`id$ pe care o "olosim pent corela nregistrrile pri;ind puncta)ele cu ele;ii din ta-elul ele;. @olc puncte. ele;`id ar "i declarat cBeie e#tern$ n sistemele de -aze de date care ace acest concept$ si asupra acesteia s%ar impune restric!ia con"orm creia nu este per introducerea unei nregistrri cu puncta)ul unui ele; care nu e#ist n ta-elul ele;Z plus$ se permite :tergerea n cascad$ n sensul c$ dac un ele; ar "i :ters din tat @apitolul E Sinta#a :i utilizarea SQL n MySQL 15E ele;$ toate nregistrrile cu puncta)ele o-!inute de ele;ul respecti; ;or "i :terse automat din ta-elul puncte. @Beile e#terne contri-uie la pstrarea consec;en!ei datelor dumnea;oastr si asigur o oarecare comoditate. Moti;ele pentru care aceste cBei nu sunt acceptate de MySQL se datoreaz cu precdere unor anumite e"ecte negati;e ale cBeilor e#terne asupra per"orman!elor :i a ntre!inerii -azelor de date. &Manualul de re"erin! MySQL con!ine o list ntreag cu asemenea moti;e.* .e!ine!i c acest punct de ;edere n ceea ce pri;e:te cBeile e#terne este oarecum di"erit de ceea ce ;e!i gsi n literatura de specialitate din domeniul -azelor de date$ unde cBeile e#terne sunt descrise "olosind termeni precum 9esen!ial,. 4ez;oltatorii sistemului MySQL nu su-scriu la acest punct de ;edere. 4ac dumnea;oastr o "ace!i$ cel mai -ine este s a;e!i n ;edere alte sisteme de -aze de date n ;ederea "urnizrii suportului pentru cBeile e#terne. 4e e#emplu$ dac ntre datele dumnea;oastr e#ist rela!ii deose-it de comple#e$ nu dori!i s "i!i responsa-il cu implementarea acestor dependen!e n aplica!iile dumnea;oastr &cBiar dac$ a:a cum se nt(mpl "rec;ent$ este ;or-a de ce;a doar cu pu!in mai mult dec(t adugarea de instruc!iuni 4/L/N/ suplimentare*. MySQL nu accept cBeile e#terne$ n a"ara situa!iei c(nd analizeaz clauzele U8./K0L S/M n instruc!iunile @./3N/ N3JL/. &3st"el$ de;ine mai simpl portarea programelor SQL din alte sisteme de -aze de date n MySQL.* MySQL nu impune cBeile e#terne ca pe o restric!ie :i nici nu "urnizeaz caracteristica de :tergere n cascad. n mod "rec;ent$ restric!iile pentru a cror aplicare sunt "olosite cBeile e#terne nu sunt at(t de di"icil de implementat prin intermediul logicii de aplica!ie. Uneori$ nu este altce;a dec(t o cBestiune de a-ordare a procesului de introducere a datelor. 4e e#emplu$ pentru a introduce nregistrri noi n ta-elul nostru puncte$ este impro-a-il inser!ia unor puncta)e o-!inute de ele;i ine#isten!i. /;ident$ modul de inser!ie a unui set de puncta)e const n a ncepe cu o list de ele;i din ta-elul ele; si apoi$ pentru "iecare ele; n parte$ de a lua puncta)ul :i de a "olosi numrul de identi"icare al ele;ului pentru a genera o nou nregistrare n ta-elul puncte. @u aceast

procedur$ nu e#ist nici o posi-ilitate de a insera o nregistrare pentru un ele; care nu e#ist. Lu ;e!i 9in;enta, o nregistrare cu puncta)e pentru a o insera n ta-elul puncte. Pentru a realiza e"ectul :tergerilor n cascad$ tre-uie s le implementa!i cu propria dumnea;oastr logic de aplica!ie. S presupunem c dori!i s :terge!i ele;ul nr. 1E. 3ceasta mai nseamn c dori!i s :terge!i toate nregistrrile cu puncta)ele o-!inute de ele;ul respecti;$ ntr%un sistem de -aze de date care accept :tergerile n cascad$ a!i :terge nregistrarea din ta-elul ele; :i toate nregistrrile din ta-elul puncte cu urmtoarea instruc!iune+ 4/L/N/ U.8M ele; TY/./ ele;`id R 1E nregistrrile din ta-elul puncte pentru ele;ul nr. 1E ;or "i :terse automat$ n MySQL$ e"ectua!i personal :tergerea secundar$ cu o instruc!iune 4/L/N/ e#plicit+ 4/L/N/ U.8M ele; TY/./ ele;`id R 1E 4/L/N/ U.8M puncte TY/./ ele;`id R 1E ' Proceduri stocate si declan:atori. 8 procedur stocat este un program SQL care este compilat si stocat n ser;er. La acest program se poate "ace re"erire ulterior$ "r a mai 15G Partea l Utilizarea general a sistemului MySQL "i necesar ca programul s "ie trimis de client :i analizat din nou. 4e asemenea$ nt procedur pute!i "ace modi"icri care ;or a"ecta orice aplica!ie client care o "olose 4eclan:atorul permite acti;area unei proceduri stocate la producerea unui anur e;eniment$ cum ar "i :tergerea unei nregistrri dintr%un ta-el. 4e e#emplu$ put recurge la aceast metod dac dori!i s regenera!i un sumar de natur comple# care "cea parte nregistrarea$ pentru a pstra sumarul n stare actualizat. Un limt care s accepte proceduri stocate se a"l pe lista de priorit!i a dez;oltatorilor MySQl = ?ederi. 8 ;edere este o entitate logic$ entitate care se comport ca un ta-el$ dar + este ta-el. ?ederea asigur o modalitate de a e#amina coloanele din ta-ele di"erite cum toate acele coloane ar "ace parte din acela:i ta-el. Uneori$ ;ederile se nume ta-ele ;irtuale. _i ;ederile se a"l pe lista de priorit!i a dez;oltatorilor sistem; MySQL. = Pri;ilegii :i -locare Ka ni;el de nregistrare. MySQL accept di"erite ni;ele de prtt) legii$ de la pri;ilegii glo-ale si p(n la pri;ilegii la ni;el de -az de date$ ta-el :i colc na. Notu:i$ MySQL nu accept pri;ilegii la ni;el de nregistrare. Notu:i$ pute!i "ol] "unc!iile 0/N`L8@S&* si ./L/3S/`L8@S&* n aplica!iile dumnea;oastr pentru a impl menta -locrile cooperati;e la ni;el de nregistrare. Procedura de aplicare a ace metode este descris n ru-rica a"erent "unc!iei 0/N`L8@S&* din 3ne#a @$ 9.e"er de operatori :i "unc!ii,. = Utilizarea caracterului % % ca :i comentariu. 3cest stil de comentariu nu este ace tat$ deoarece reprezint o construc!ie am-igu$ de:i$ ncep(nd cu MySQL E.FE.E$ ) comentariu care ncepe cu dou liniu!e si un spa!iu este acceptat. ?ezi sec!i; 9Scrierea comentariilor, pentru mai multe in"orma!ii. @3PKN8LUL G 8ptimizarea interogrilor Lumea teoriei -azelor de date rela!ionale este o lume dominat de ta-ele :i seturi$ precum :i de opera!ii cu ta-ele :i seturi. 8 -az de date este un set de ta-ele$ iar un ta-el este un set de r(nduri :i coloane. @(nd emite!i o interogare S/L/@N pentru a regsi r(nduri dintr%un ta-el$ o-!ine!i un alt set de r(nduri :i de coloane. 3cestea sunt no!iuni a-stracte$ care nu "ac nici un "el de re"erire la reprezentarea "undamental pe care o "olose:te un sistem de -aze de date pentru a opera cu datele din ta-elele dumnea;oastr. 8 alt a-stractizare este aceea c opera!iile dintr%un ta-el se produc toate simultanA interogrile sunt conceptualizate ca "iind opera!ii cu seturi$ iar n teoria seturilor nu e#ist conceptul de timp. Lumea real$ e;ident$ este total di"erit. Sistemele de gestiune a -azelor de date implementeaz concepte a-stracte$ dar implementarea se produce "olosind componente BardWare reale$ limitate de restric!ii autentice de natur "izic$ n consecin!$ interogrile necesit timp %uneori un timp agasant de lung. Kar nou$ creaturi ner-dtoare$ nu ne place s a:teptm$ deci lsm n pace lumea a-stract a opera!iilor matematice instantanee cu seturi :i cutm modalit!i de a mri ;iteza interogrilor. 4in "ericire$ e#ist numeroase teBnici n acest sens. Knde#m ta-elele pentru a permite ser;erului de -aze de date s caute r(ndurile mai rapid. @oncepem interogrile de a:a manier nc(t s -ene"iciem la ma#imum de aceste inde#uri. Scriem interogri care s in"luen!eze mecanismul de plani"icare al ser;erului ast"el nc(t interogrile care sosesc de la mai mul!i clien!i s coopereze mai -ine. Le g(ndim la ceea ee se nt(mpl cu acele componente BardWare de -az :i la modul n care putem ocoli restric!iile "izice impuse acestora n ;ederea m-unt!irii per"orman!elor. 3cestea sunt categoriile de pro-leme asupra crora se ;a concentra capitolul de "a!$ cu scopul de a ; asista la optimizarea per"orman!ei sistemului dumnea;oastr de -aze de date ast"el nc(t acesta s ; prelucreze interogrile c(t mai rapid posi-il. MySQL este de)a "oarte rapid$ dar cBiar :i cel mai rapid sistem de -aze de date poate rula interogrile mai rapid dac l a)uta!i. Utilizarea inde#rii \ ?om ncepe cu inde#area$ deoarece este cel mai important instrument pe care%1 a;e!i la dispozi!ie pentru accelerarea interogrilor dumnea;oastr. 3;e!i la dispozi!ie :i alte teBnici$ dar$ n general$ elementul care ;a

determina cea mai semni"icati; di"eren! l constituie utilizarea adec;at a inde#urilor$ n lista de coresponden! MySQL$ oamenii cer adesea a)utor pentru a determina o interogare s ruleze mai rapid$ ntr%un numr sur% 15H Partea l Utilizarea general a sistemului MySQL prinztor de mare de cazuri$ ta-elele n cBestiune nu con!in nici un "el de inde#uri$ ia adugarea inde#urilor duce deseori la rezol;area imediat a pro-lemei. 3ceast metc nu "unc!ioneaz ntotdeauna$ deoarece optimizarea nu este ntotdeauna un proces :ir piu. Notu:i$ dac nu "olosi!i inde#uri$ n multe situa!ii ; pierde!i ;remea ncerc(nd m-unt!i!i per"orman!ele prin alte mi)loace. Utiliza!i mai nt(i inde#area$ pentn!l o-!ine cel mai mare salt de per"orman!$ dup care ncerca!i s ;ede!i care dintre cete lalte teBnici ar putea "i util. 3ceast sec!iune descrie no!iunea de inde#$ modul n care acesta m-unt!e:te per"ormant interogrilor$ situa!iile n care inde#urile pot a"ecta n mod negati; per"orman!ele$ precum \ modul de alegere a inde#urilor pentru ta-elele dumnea;oastr$ n sec!iunea urmtoare$ ;c discuta despre utilitarul MySQL de optimizare a interogrilor. Pe l(ng cunoa:terea modi de creare a inde#urilor$ este -ine s n!elege!i ntr%o oarecare msur no!iunile pri;ind utili tarul de optimizare$ deoarece atunci ;e!i putea -ene"icia mai -ine de inde#urile pe care)V crea!i. Unele moduri de scriere a interogrilor aniBileaz utilitatea inde#urilor si$ n gene dori!i s e;ita!i aceste situa!ii. &Lu ntotdeauna$ ns. Uneori ;e!i dori s ignora!i compor utilitarului de optimizare. ?om discuta :i despre unele din aceste situa!ii.* 3;anta)ele inde#rii S ;edem cum "unc!ioneaz un inde# pornind de la un ta-el care nu are inde#uri$ ta-el "r inde#uri este pur :i simplu o colec!ie dezordonat de r(nduri. 4e e#empli "igura G.1 prezint ta-elul reclama pe care 1%am ;zut anterior n capitolul l$ 9Kntrodi) cere n MySQL si SQL,. 3cest ta-el nu con!ine inde#uri$ deci$ n cazul n care caut r(ndurile a"erente unei anumite companii$ tre-uie s e#aminm "iecare r(nd din tat pentru a ;edea dac r(ndul respecti; con!ine ;aloarea dorit. 3ceasta implic o -alei' complet a ta-elului$ ceea ce reprezint o opera!ie lent si n"iortor de ine"icient da ta-elul con!ine numai c(te;a nregistrri care corespund criteriilor de cutare. Uigura G.F prezint acela:i ta-el$ la care s%a adugat un inde# pentru coloana num`ce panie din ta-elul reclama. Knde#ul con!ine o intrare pentru "iecare r(nd din ta-el reclama$ dar intrrile inde#ului sunt sortate n "unc!ie de ;aloarea din coloana num`cHZK panie. 3cum$ n loc s cutm r(nd cu r(nd pentru a gsi articolele care corespund 7 teriilor de cutare$ putem "olosi inde#ul. S presupunem c am cuta toate r(ndul a"erente companiei 1E. ncepem s cutm n inde# :i gsim trei r(nduri a"erente cot$ panici respecti;e. 3poi$ a)ungem la r(ndul a"erent companiei 1G$ ;aloare mai mare de cea pe care o cutm. ?alorile inde#ului sunt sonate$ deci$ atunci c(nd citim o nre" trare care con!ine numrul 1G$ nu ;om mai gsi ecBi;alen!e cu criteriile de cutar putem sista cutarea. 4ac am "i cutat o ;aloare care nu apare dec(t unde;a pe mi)locul ta-elului inde#at$ e#ist algoritmi de pozi!ionare care gsesc prima intrare2 inde# care corespunde criteriilor de cutare "r a e#ecuta o -ai;2re liniar a ta-elt &de e#emplu o cutare -inar*. 3st"el$ ne putem pozi!iona rapid pe prima ;aloare corespunde criteriilor de cutare si putem economisi "oarte mult timp de caut Sistemele de -aze de date "olosesc di;erse teBnici de pozi!ionare pentru inde#area rap a ;alorilor$ dar deocamdat nu ne intereseaz teBnicile respecti;e. /ste important i "unc!ioneaz :i c inde#area este un lucru -un. @apitolul G 8ptimizarea interogrilor 15[ Poate ; ntre-a!i+ de ce nu se sorteaz "i:ierul de date$ dup care se :terge "i:ierul de inde#X Lu s%ar produce aceea:i m-unt!ire a ;itezei de cutareX 3;e!i dreptate$ s%ar produce % dac a!i "i a;ut un singur inde#. 4ar pute!i dori un al doilea inde# :i nu pute!i sorta "i:ierul de date n dou moduri di"erite simultan. &4e e#emplu$ dori!i un inde# dup numele clien!ilor :i un alt inde# dup numerele de identi"icare sau numerele de tele"on ale acestora.* Utilizarea inde#urilor ca entit!i separate de "i:ierul de date rezol; pro-lema :i permite crearea mai multor inde#uri. 4e asemenea$ r(ndurile din inde# sunt$ n general$ mai scurte dec(t r(ndurile de date. @(nd insera!i sau :terge!i ;alori noi$ este mai u:or s muta!i ;alori scurte din inde# pentru a pstra ordinea de sortare dec(t s ; deplasa!i n r(ndurile de date mai lungi. ta-elul reclama num`companie num reclama ta#a descBidere 1G FE 1[ 1E FE FE FE 1E FE 1G 1E GI G5 5F 55 HF HE HG [[ 55 101 10F 0.01 0.0F 0.01 0.0E 0.0F 0.01 0.0F 0.0E 0.0E 0.01 0.01

1[

115

0.0F

Uigura G.1 Na-elul reclama "r inde#.

num`companie num`reclama ta#a`descBidere 1G FE 1[ 1E FE FE FE 1E FE 1G 1E 1[ GI G5 5F 55 HF HE HG [[ 55 101 10F 115 0.01 0.0F 0.01 0.0E 0.0F 0.01 0.0F 0.0E 0.0E 0.01 0.01 0.0F

Uigura G.F Na-elul reclama inde#at. /#emplul corespunde modului de inde#are a ta-elelor n MySQL. .(ndurile de date ale unui ta-el sunt pstrate , ntr%un "i:ier cu date$ iar ;alorile din inde# sunt pstrate ntr%un "i:ier inde#. Pute!i a;ea mai multe inde#uri ntr% un ta-elA n acest caz$ toate inde#urile sunt stocate n acela:i "i:ier inde#. Uiecare inde# din "i:ierul inde# const dintr%un ta-lou sortat cu nregistrri cBeie care sunt "olosite pentru un acces rapid la "i:ierul de date. 15I Partea l Utilizarea general a sistemului MySQL /#punerea anterioar a prezentat a;anta)ele unui inde# n conte#tul interogrilor ntr%u] singur ta-el$ acolo unde utilizarea unui inde# mre:te semni"icati; ;iteza de caut prin eliminarea necesit!ii de -aleiere complet a ta-elului. Notu:i$ inde#urile sunt si i ;aloroase atunci c(nd rula!i interogri care implic uniri pe ta-ele multiple. Kntr interogare cu un singur ta-el$ numrul de ;alori pe care tre-uie s le e#amina!i n "ie coloan este egal cu numrul de nregistrri din ta-el$ ntr%o interogare pe ta-ele multa ple$ numrul com-ina!iilor posi-ile creste ame!itor$ deoarece este egal cu produs numerelor de r(nduri ale ta-elelor. S presupunem c a;e!i trei ta-ele "r inde#$ si anume t1$ tF si tE$ con!in(nd respec coloanele c1$ cF :i cE :i c(te 1000 de r(nduri care con!in numerele cuprinse ntre l :i 1@ &/#emplul este e#agerat$ desigur. Lu%1 "olosim dec(t pentru a trage o concluzieA cu toa" acestea$ pro-lemele pe care le ;om ilustra sunt reale.* 8 interogare pentru regsirea tutur com-ina!iilor ntre acele r(nduri ale ta-elelor care con!in ;alori egale arat ast"el+ S/L/@N @1$ cF$ @E U.8M t1$ tF$ tE TY/./ c1 R cF 3L4 c1 R @E .ezultatul acestei interogri tre-uie s "ie compus din 1000 de r(nduri$ "iecare rar con!in(nd trei ;alori egale. 4ac prelucrm interogarea n a-sen!a inde#urilor$ nu ;or a;ea nici o idee cu pri;ire la ;alorile incluse n "iecare r(nd. n consecin!$ tre-uie ncercm toate com-ina!iile pentru a le gsi pe cele care corespund criteriilor din clau TY/./. Lumrul de com-ina!ii posi-ile este 1000 # 1000 # 1000 &l miliardO*$ adic de i milion de ori mai mare dec(t numrul r(ndurilor care corespund criteriilor de cuta 3sta nseamn un ;olum e#trem de mare de e"ort irosit si pro-a-il c aceast interoga ;a "i "oarte lent$ cBiar si pentru un sistem de -aze de date precum MySQL$ care es "oarte rapid. Kar asta se nt(mpl pentru un ta-el cu numai 1000 de r(nduri. @e ne "ace n situa!iile c(nd a;e!i ta-ele cu milioane de r(nduriX Pute!i ;edea c ast"el se a)ung"l "oarte rapid la per"orman!e e#trem de reduse. 4ac inde#m "iecare ta-el$ putem m considera-il ;iteza de prelucrare a interogrilor$ deoarece inde#area permite prelucrare interogrii n acest mod+ 1. Selecteaz primul r(nd din ta-elul t1 :i cite:te ;aloarea pe care o con!ine r(ndul. F. Uolosind inde#ul din ta-elul tF$ se deplaseaz direct la r(ndul care corespunde ;alor din ta-elul t1. Similar$ "olosind inde#ul din ta-elul tE$ se deplaseaz direct la r(ndii care corespunde ;alorii din ta-elul t1.

E. Nrece la urmtorul r(nd din ta-elul t1 :i repet procedura anterioar p(n c(nd es mineaz toate r(ndurile din ta-elul t1. n acest caz$ se e#ecut totu:i o parcurgere complet a ta-elului 11$ dar putem e#ecut cutri inde#ate n ta-elele tF :i tE pentru a e#trage direct r(ndurile din aceste ta-ele$ " acest mod$ interogarea ruleaz e"ecti; de un milion de ori mai repede. MySQL "olose:te inde#urile a:a cum s%a artat mai sus$ pentru a mri ;iteza de caut a r(ndurilor care satis"ac criteriile unei clauze TY/./$ respecti; a r(ndurilor care core pund r(ndurilor din alte ta-ele$ atunci c(nd se e"ectueaz uniri. 4e asemenea$ MyS@ "olose:te inde#uri :i pentru a m-unt!i per"orman!ele altor tipuri de opera!ii+ @apitolul G 8ptimizarea interogrilor 155 = ?aloarea cea mai mic sau cea mai mare a unei coloane inde#ate se poate gsi rapid$ "r a se e#amina "iecare r(nd atunci c(nd "olosi!i "unc!iile MKL & * sau M31& * . = MySQL poate "olosi "rec;ent inde#uri pentru a e"ectua rapid opera!ii de sortare pentru clauzele 8.4/. JM. = Uneori$ MySQL poate e;ita complet citirea "i:ierului de date. S presupunem c selecta!i ;alori dintr%o coloan numeric inde#at si c nu selecta!i alte coloane din ta-el. n acest caz$ prin citirea unei ;alori din inde#$ a!i o-!inut de)a ;aloarea care ar "i rezultat din citirea "i:ierului de date. Lu are nici un sens s citi!i ;alorile de dou ori$ deci nu este necesar nici mcar consultarea "i:ierului de date. 4eza;anta)ele inde#rii n general$ dac MySQL poate determina modul de utilizare a unui inde# pentru a prelucra o interogare mai rapid$ o ;a "ace. 3ceasta nseamn c$ n ma)oritatea cazurilor$ dac nu ; inde#a!i ta-elele$ ie:i!i n pierdere. 3!i ;zut c am zugr;it o imagine roz a a;anta)elor inde#rii. /#ist :i deza;anta)eX 4a$ e#ist$ n practic$ aceste nea)unsuri tind s "ie contra-alansate de a;anta)e$ dar tre-uie s le cunoa:te!i :i pe acestea. Mai nt(i$ "i:ierul inde# ocup spa!iu pe disc. 4ac a;e!i numeroase inde#uri$ "i:ierul inde# poate a)unge la dimensiunea ma#im mai rapid dec(t "i:ierul de date. n al doilea r(nd$ inde#urile mresc ;iteza opera!iilor de regsire$ dar o reduc pe aceea a opera!iilor de inser!ie si :tergere$ precum :i ;iteza opera!iilor de actualizare a ;alorilor din coloanele inde#ate &adic ma)oritatea opera!iilor care implic scriere*$ deoarece o scriere a"ecteaz nu numai r(ndul de date$ dar :i inde#urile$ n ma)oritatea cazurilor. @u c(t un ta-el are un numr mai mare de inde#uri$ cu at(t ni;elul mediu de degradare a per"orman!elor pentru opera!iile de scriere este mai mare. n sec!iunea 9 ncrcarea e"icient a datelor, ;om a-orda mai detaliat aceast pro-lem de per"orman! :i modalit!ile de rezol;are. 3legerea inde#urilor Sinta#a de creare a inde#urilor a "ost prezentat n sec!iunea 9@rearea si :tergerea inde#urilor, din capitolul E$ 9Sinta#a :i utilizarea SQL n MySQL,. ?oi presupune c a!i citit sec!iunea respecti;. 4ar simpla cunoa:tere a sinta#ei nu ; a)ut s determina!i modul n care tre-uie inde#ate ta-elele dumnea;oastr. 3cesta impune o g(ndire a modului n care ; ;e!i "olosi ta-elele. 3ceast sec!iune o"er unele indica!ii n ceea ce pri;e:te identi"icarea :i selectarea coloanelor adec;ate pentru inde#are+ = Knde#a!i coloanele pe care le cuta!i$ nu coloanele pe care le selecta!i. @u alte cu;inte$ coloanele cele mai potri;ite pentru inde#are sunt coloanele care apar n clauza TY/./$ respecti; coloanele speci"icate n clauzele de unire$ nu coloanele care apar n lista de selec!ie imediat urmtoare cu;(ntului cBeie S/L/@N+ S/L/@N col`a U.8M ta-ell L/UN Z8KL ta-eOF 8L ta-ell.col - R ta-eOF.col c coloana nu este adec;at coloane adec;ate "%c%.1 23;]

S-ar putea să vă placă și