You are on page 1of 240
Paul DuBois MySQ) Traducere de Mihai Manastireanu Teora CX ACL oD & { Titlu original: MySQL © Copyright © 2001 Teora Toate drepturile asupra versiuni fn mba roména apartin Edituri Teora Reproducerea integrald sau parialé a textului sau ailustratilor din aceasté carte ‘este posibilé numai cu acordul prealabil soris al Edituri Teora, ‘Authorized translation from the English language esition published by New Riders Publishing, Copyright © 2000. ‘tights reserved, No par of his book may be reproduced or ansmited in any form or oy aay moans sacvore or mechericl musing photocopying recording or Dy any Plarlaion abrage rttoval ystom, witout possi om Nb Publisher Asmaniancngogge edition puolanod by Toure Publishing ' S00. eae @ get, 3,004 SAL Copyright © 2000. Teora Caloa Moglor nr. 211, sector 2, Bucuresti fax: 01/210.38.28 e-mail: teora@teora kappa.ro, ‘Teora —Cartea prin posta CP 78-30, cod 72450 Bucuresti, Romania tol: 01/252.14.31 e-mail: cpp@teora.kappa.ro Coperti: Gheorghe Popescu Tehnoredactare: Catalin Sleam NOT 4897 CAL MY SOL ISBN 973-20-0246-8 Printed in Romania gavor Cuprins Despre autor Despre referenti.. Prefapi.. Introducere -.. Partea I: Capitolul 1 Capitolul 2 Capitolul 3 Capitolul 4 Partea a Ia: Capitolul 5 Capitolul 6 Capitolul 7 Capitolul 8 Partea a ha Capitolul 9 Capitolul 19 Capitolul 11 Capitolul 12 Capitolul 13 Ufilizarea generald a sistemului MySQL ....... Introducere in MySQL $i SQL... 24 Lucrul eu date in MySQL si SQL. 99 Sintaxa gi utilizarea SQL in MySQL 158 Optimizarea inverogitilor.. Utilizarea interfefelor de programare ale sistemului MySQL... 217 Introducere in progeamarea MySQL. 218 Interfata API MySQL pentru C. 237 Interfaya API pentru Perl DBI... 293 Iatesfaya API pentru PHP.. Administrarea sistemului MySQL Incroducere in administrarea sistemului MySQL .. Catalogul de date MySQL... Administrarea generals a sistemului MySQL, Securitate.. Intresinerea si repararea bazelor de date 6 Cuprins Porton a 'V-a: Anexa A Anexa B Anexa C Anexa D Anexa E, Anexa F Anexa G Anexa H Anexa I Anexa J Index ‘Anexe Objinerea si instalarea programelor .. Referingi de tipuri de coloane.. Referingi de operator si funcy Referinga de sintaxi SQL. Referinga de programe MySQL... Referingi APT C.. Referingi API Perl DBI Referinyi API PHP. Instrumente utile produse de terge pirgi. Furnizori de servicii Internet Despre autor fn ultimii 15 ani, Paul DuBois a fost administrator de reea gi de baze de date la Univer- sitatea Madiscn a statului Wisconsin, Este autorul volumelor Sofiware Portability with iimake gi Using sh & tesh (O'Reilly 8 Associates, ISBN 1-56592-226-3 fi 1-56592-132-1) sia redactat materiale pentru manualul de refering MySQL. Despre referenti David Axmark a luerat drept consultant software timp de peste 15 ani, Printre niume- roasele proiecte la care a activat se numari un sistem ultramodern de cercetare a pietei (CommonLISP+CLOS+MySQLs-ISAM), grafic industrialé avansati (in 32k de RAM), precum ji un sistem de scriere a ordinelor de functionare pentru o companie de elec- triciate. A scris numeroase linii de program in limbajele 6502 gi in asambloral 280, BASIC, C, CommonL isp, (Bourne)-Shel si Perl. A inceput si se implice in MySQL la ciziva ani fnante de prima lansare publici a limbajului. David locuieste in Uppsala, Suedi, cu plantele gi calculatoarele lui. Vijay Chaugule lucrea2i ca administrator principal de sisteme pentru o companie din Bay Area care manipulesed o rejea UNIX de mari dimensiuni. Are opt ani de experienst in gestiunea sstemelor gi a rejelelor gia utilizat 0 multime de instrumente comerciale fi sub licengi GNU. Adori si serie scripruri in Perl sis compileze sisi instaleze programe GNU. In present, foloseste MySQL la un proiect pentru induscrafts.com. Chad Cunningham este dezvoltator de sisteme pentru departamencul de matematicd a Universitit de Stat din Ohio, acolo unde se concentreaz’ asupra dezvoltarii unor instrumente de invigare bazate pe Web, care si potenteze procesul tradifional de instra- ire din sala de curs. Bill Gerrard ext vicepresedinte responsabil cu tchnologia al firmei Daze Networks, In. din Huntington Beach, California. Daze Networks executi servili Internet, inclusiv serverele Web virtuale DigitalDaze, care vi oferi un control complet dsupra proprivhui dumneavoastel server MySQL de baze de date, precum si bNscentr).com, care ofer’ fnregistrarea rumelor de domenii, parcare, tansmitere prin Web (Web forwarding) yi reexpedierea mesajelor de e-mail folosind MySQL ca baza de date back-end, jo George John este fndrumitortehnic in cadeul Divizci de dezvolare sofware a grupt~ hui de analiza chimic3 din cadrul companiei Hewlett-Packard. Are experienfiin dezvolarea de programe de sistem i de apliayie pentru instrumente chimice. A hucrat eu programe apropiate instrumentelor sau dispozitivelor dar si cu aplicati pentru baze de date de mari dimensiuni. In prezent,foloseste MySQL. la un proiect pentru induscratts.com Fred Read igiare propriul siv servieiu de consultants, Serval an Systems Limited, de 14 ani, ServaLan Systems este specializatain producria de sisteme UNIX tn domenica tele comunicapile, bazele de date, finange si Internet. In prezent, lucreaza la un sistem de, comutafie pentru celecomenicafi. fn ulti tei ani, aitresinut gi un furnizor de servicii™ Internet (PremierISP) so mic afacere de publicitate in Web (PremierAds), Este insurat cu Helen de now ani, Cei doi au tei copii (dou’ fete si un baiae) si locuiese in Anglia Dr. Egon Schmid lucreaza la Six Offene Systeme GmbH din Leinfelden-Echterdingen, Germania, unde face parte din echipa de dezvoltare care realizeazi solusiisofsticase de baze de date bazate pe Web. De asemenea, este membru al grupului de realizare a docu- ‘mentafiei pentru limbajul PHP. A fost co-autor al primei cirsi de PHP scrisi in limba Jani Tolonen este dezvoltator software al sistemului MySQL, Este un student fn virstl de 23 de ani al Universitit de Tehaologie din Helsinki, unde se dedicX tehnologieical- culatoarelor gi programirii de produse software in multe domenii, Jani s-a aflat sub indrumarea lui Michael “Monty” Widenius, ereatorl sistemului MySQL, si doreste si se dedice in continuare dezvoltiri acestui sistem. Jani si Monty au devenit din reseali* foarte buni prieteni: au fost vecini cu peste 10 ani in urmi, Activitatea lui Jani Jn domeniul MySQL a inceput la pusin timp dup ce Monty a inceput si creeze MySQL in 1995, Michael “Monty” Widenius este un finlandez vorbitor de suede, care a lucrat cu baze de date din 1978. A fost angajat de TeX (al clrei co-patcon a devenit) din 1981 gi a scris §n toraltate componenta UNIREG (predecesorul lui MySQL) si cea mai mare parte a programului server MySQL. A studiat fizica la Universitatea de Tehnologie din Helsinki, dar in materie de programare este in cea mai mare parte un autodidact. A lucrat mai ales in Basic, Assembler, C, LISP, Perl, SQL, C++ (in aceastd ordine), dar ddoreste mereu si examineze limbaje noi, atunci cand dispune de timpul necesar. Este {nsurat gi are doi copii (un baiat gio fati - Max si My), dout broayteyestoase, un caine si doi serpi. In prezent, ii petrece majoritatea timpului rispunzind la mesaje de e-mail. Editura New Riders doregte si mulgumeasci gi lui Thomas Karlsson, Colin McKinnon, Sasha Pachev, Erie Savage, Derick H. Siddoway si Bob Worthy pentru contribuyia adusi Ia aceasta carte, Prefata (Cand mi s-a cferit posibilitaea de a efectua o expertiza tehnic a crs lui Paul, nu m-am asteptat si mi ,infepenesc" la prefapS. Am fost intotdeauna de pirere c% un programator nu trebuie niciodat3 lisa s&scrie o carte, nici micar una pentru programatori, Sear putea si am un oarecare talent pentru construirea unor lini de program uiilizabile dar, din fericire, Paul are un mare talent de a explica lucruri pe care un mare numir de utlizator le-aringelege altfl foarte greu. Aceia dintre noi care am lucrat la MySQL ne-am striduit din grew pentra a face ca acest limb si fie rapid gi ugor de folost, dar MySQL are numeroase caracteristici distincte, iar marea majortate a utlizatorilor vor avea nevoie de informafii care por fi acumulate numai din experienti pentru a putea utiliza MySQL [a maximum de potengal, fn anul care a trecut, Paul a lucrat la manualul MySQL, proces in cursul ciruia ne-a pus multe sute de intrebiri privind modul de fancyionare a limbajului MySQL, intr-un efort de a ingelege totul. fn aceasté carte, cl vi ‘mpartageste fi dumneavoastrd cunostingele acumulate, (De asemenea, suntefi bineveniti si lucragi cu manualul electronic de MySQL, chiar dacd acum aveti la dispozigie © de a ingelege MySQL) Manualul de MySQL a fost intotdeauna privit de noi, cei de la TeX, ea o refering tehnict pentra MySQL. Am avut intotdeauna nevoie de un manuel de utilizare care si poati transmte conceptele tehnice intr-un mod mai yrelaxat". Credem c& volumul de api va umple in mod elegant acest gol! Unul dintre scopurile limbajului MySQL este de afi cat mai ccmpatibil eu putinsd cu versiunile anterioare, Suntem siguri ci in ciuda rit- tmului rapid de dezvoltare al imbajului MySQL, majoritatea conceptelor din aceasti carte isi vor pastra veridicitacea pentru o lung’ perioadi de timp. act mi mai bucur de atengia dumneavoastra, a5 dori si mi folosese de aceastl ocazie pentru a mulsumi soi mele, Carola, pentru timpul pe care m-a lisat { micl petrec eu MySQL in utimii ere ani, Ag vrea si le mulgumese si copiilor mei, Max si My, care au fnjeles ci, chiar dac8 tatil lor hucreazd acasi, mu este intotdeauna disponibil. De aseme- nea, doresc s?-i mulqumesc lui David pentru ci m-a convins si seriu MySQL, precum si lui Allan Larson, care mi-s ofert posibilitatea de a face acest ucry, De asemenea, am avut parte de un mare afutor din partea echipei actuale de MySQL: Jani Tolonen, Sinisa alfenevis, Anes Halonen 9 Ton Semel Ty final, dar main ulin rin, dores 8 le :mulfumese tuturor acelora care au scrs interfere API gi programe client, care au tximis remedii si rapoarte privind unele defecte, care ne-au ajutat si transformim MySQL in programul de succes care este astizi, Michael “Monty” Widenius Helsingfors, 14 noiembrie 1999 Din partea autorului Volumul de faji a beneficiat in mare misuri de comentarile, corecturile si criticile furnizate de referengii tchnici: David Axmark, Vijay Chaugule, Chad Cunningham, Bill Gerrard, Jjo George John, Fred Read, Egon Schmid gi Jani Tolonen. Mulgumir speciale pentru Michael “Monty” Widenius, principalul creator al limbajului MySQL, care nu ‘humai ci arevizuit manuserisul, dara rdieat sute de increbari la care am rispuns pe par~ ccursul redactiii cri. Evident, toate erorile rimase imi apart, De asemenea, af dori sii muljumese lui Tomas Karlsson, Colin McKinnon, Sascha Pachey, Erie Savage, Derick H. Siddoway si Bob Worthy, care au examinat manuscrisul inigial gi au ajutat la transpunerea acesteicdrti in forma sa actuald. Personalal edirurii New Riders este responsabil in primul rind pentru conceperea aces- tei ciri sitn al doilea rand pentra transformarea mizgilelilor mele in opera finité pe care o aveti in fas. Laurie Petrycki a fost editor executiv. Katie Purdum, editor responsabil cu achiziile, ma ajutat si-mi ,intru in forma" sia preluat toate criticle acunci cind nu reugeam si respect termenele. Leah Williams a fost nu numai editor de dezvoltare, dar gi redactor de carte propeiu-zis;ahucrat tirziu de mult ori, mai ales in fazele finale ale proiectului, Cheryl Lenser si Tim Wright au produs indexul. John Rahm a fost editor de proiect. Debra Neel a corectat manuscrisul. Gina Rexrode si Wil Cruz, tehnoredactori, fu aranjat cartea fn forma pe care o vedesi acum. Mulpumirifiectruia dintre ei Cel mai mit, dorese si-mi exprim recunostinja faya de sofia mea, Karen, care s-a impi- cat cu inci o carte, precum si pentru injelegerea si ribdarea ei atunci cind dispiream, tineori cut zilele, in ,zona de scriere™. Sprijinul ei mi-a uyurat munca in multe sitvagi gi sunt bucuros simi exprim recunostinga; ea m-aajutat si sriu fiecare paging a ci Introducere Unsistem de gestiune a bazelor de date relaionale (SGBDR) este un instrument esential in numeroase medi, de la utliarile mai tradiionale in contexte de afaceri, cercetare si invlpimant si pana la aplicapile mai recente, cum ar fi operarea motoarelor de ckwrare din Internet. Toru, in ciuda imporcangei unei baze de date performance pentru gestiu~ nea gi accesul Ia resursele informationale, aceasta s-a dovedit a fi dincolo de resursele financiare a aumeroase insticupii. Din punct de vedere istoric, sistemele de baze de date au constituit © propunere costisitoare, firmele distribuitoare percepnd onorarii sub- stangiale, att pentea program cit si pentru asistenta necesari, iar deoarece motoarele de baze de date prezentau frecvent ceringe hardware substantiale pentru a potea ruls cu performange cit de cit rezonabile, costurileerau si mai mari, In anii din urma, situayia s-a schimbat, ait din punct de vedere al echipamenteloy it i din acela al programelor. Caleulatoarele personale au devenit necostsitoar, dar puternice, pe de alti parte, a apirut o intreagi migcare in direcyia scrierii unorsisteme de operare cu ‘performange ‘dicate pentru aceste caleulatoare, ssteme disponibile la prequl unui compact disc ietn, saa chiar gratuit, prin Internet. Acestea inchud numeroase sisteme derivate din BSD UNIX (FreeBSD, NetBSD, OpenBSD), precum si diferite forme de Linux (RedHat, Caldera, LinuxPPC, pentru a numi doar citeva). Productia de sisteme de operare gratuite care si permit utilizarea ealeulstoarelor per- sonale Ia maximum de capacitate s-a desfigurat in mod concertat cu dezvoltarea unor instrumente disponibile gratuit, cum ar fi gcc, compilatoral GNU de G, fiind in mare smiisurk positill datoritl acestora din urmi. Aceste efortuti dea pune programele la dis- pozigia oricirui doritor au avut ca rezultat ceea ce se mumeste acum migcarea Open Source gi au generat multe programe importante. Cel mai solcitat sit FTP din lume, i snume ftp.cdrom.com, ruleazi FreeBSD. Apache este cel mai folosit server Web din Internet, Alte succese ale inigativei Open Source sunt limbajul de scripting de wz. gen ral Perl si PHP, un limbaj a cirui popularitate este intro crestere rapid, datoriek ‘upuringei cu care permite serierea paginilor Web dinamice. Toate avestea contrasteazi cu solupile ,de firma", care vi obligi si folosisi produse costisitoare, greate de fabricant care nici micar nu furnizeaza codul sursi. 5 Programele ce baze de date au devenit i ele mai accesibile Sistemele de baze de date pre- cum Postgres si mSQL au devenie disponibile gratuit sau la un pref scizut. Mai recent, producitorii comerciali, precum Informix si Oracle au inceput si-gi ofere programele gratuit pentrs sisteme de operare precum Linux. (Totugi, aceste din urm® produse sunt Tivrate, in general, numai in form’ binari, fErk suport, ceea cele limiteaza utilitaea.) Unul din noi venitifa domeniul bazelor de date cu prey scizut sab gratuite este MySQL, un sistem client/server de gestiune a bazelor de date relationale originar din Scandinavia. ‘MySQL include un server SQL, programe client pentru accesul la server, instrumente administrative gi o interfaji de programare pentru scrierea propriilor dumneavoastré programe, . Bazele sistemului MySQL au fost puse in 1979, o dati cu instrumentul pentru baze de * date UNIREG, creat de Michael “Monty” Widenius pentru compania suedeza TeX. In 1994, TeX a inceput si caute un server SQL. pentru a-l utiliza le dezvoltarea aplicayilor 12 Infroducere ‘Web. Compania a testat unele servere comerciale, dar toate s-au dovedit' fi prea lente pentru tabelele de mari dimensiuni ale firmei. De asemenea, compania a examinat mSQL, dar acestuia ii lipseau anumite caracteristici obligatorii pentru, TeX. In con- i put sf programeze un server nou. Interfaga de programate era proiectati in mod explicit pentre a fi similar celei folosite de mSQL, deoarece pentru ‘mSQL erau disponibile numeroase instrumente gratuite, iar prin wilizarea unei inter~ feje similare accleagi instrument puteau fi folosite pentru MySQL, cu un efort de portare minim. {In 1995, David Axmark de la Detron HB a inceput si faci presiuni pentru ca TeX si lanseze MySQL pe Internet. De asemenea, David lucra la documentafie sila a determina MySQL si construiascé folosind utiltarul GNU configure. MySQL 3.11.1 a fost dat lumii intregi in 1996, sub formé de distibusie binari pentru Linux si Solaris. In prezent, MySQL funeyioneazi pe mult mai multe platforme geste disponibil att in form’ binars, cat si sursi. MySQL nu este un proiect Open Source, deoarece este necesari o licengi in anumite Tomasi, MySQL se bucuri de © ampli popularitate in comunitatea Open Source, deoarece termenii de liceng nu sunt foarte restrictivi. (In esengi, MySQL este {in general gratuit, daci nu dori si obgine profie prin vanzarea sistemului sau'a unor servicii care necesiti utilizarea acestuia.) Popularitatea sistemului MySQL nu este limitatl la comunitatea Open Source. Da, ruleazi pe calculatoare personale (intr-adevir, o bun parte din programarea cu MySQL are loc pe sisteme Linux ieftine). Dar MySQL este portabil si nuleaz§ pe sisteme de ope- rare comerciale (precum Solaris, Irix si Windows) si pe echipamente care merg pani la servere de intreprindere. in plus, performantele sale rivalizeazi cu acelea ale oricirui sis- tem de baze de date cu care doriti si il comparayi si poate manipula baze de date de mari dimensiuni, cu milioane de inregistriri, ‘MySQL apare foarte clar in imaginea care se desfigoari dinaintea ochilor nostri: de operare disponibile gratuit, care ruleaz3 pe echipamente puternice, dar necostisitoare, punind la dispozitia unui numar de oameni mai mare ca oricind o putere substantiali de prelucrare a datelor gi alte caracterstci, pe o varietate de sisteme mai larg ca oricind. Aceasti ,coborire a barierelor economice in ceea ce priveste prelucrarea automat a datelor pune solutii puternice pentru baze de date la dispozitia unui num fied precedent de mare de persoane si insticupii. De exemplu, eu folosese MySQL. cu Perl, Apache si PHP pe calculatoral meu G3 PowerBook, care ruleazi LinuxPPC. Aceasta imi permite sf-mi transport oriunde rezultatele actvitigi mele, Prey rota: costul caleulatorului PowerBook. Instituit care in teu se mirgineau si viseze la aexploata in folos propriu puteres unui SGBDR cu performange ridicate au acum aceasti posibilitate, Ia un pry foarte redus, Utilizarea bazelor de date este tot mai frecventi sila nivel individual. Oameni eare au se gindeau niciodatd ci vor folosi baze de date incep si iain considerare to felul de uti- liziti ale acestora, din moment ce procurarea unui sistem de baze de date este facili ~ de exemply, stocarea si accesul la rezultatele unor cercetiri genealogice, urmitirea si intretinetea colectiilor de diferitetipuri (fluturi, mirci postale, cir de joe cu jucitori de baseball etc.) asistenti in demararea unei afacri sau furnizarea de posibilitg! de cdutare pentru situri Web personale, Introducere 13 De ce sa optez pentru MySQL? Dacf sunteti in ciutarea unui sistem gratuit sau necostisitor de gestiune a bazelor de date, putet lege din mai multe optiuni: MySQL, mSQL, Postgres, unul din motoarcle gratuite (dar firi suport) furnizate de produeitorii comerciali gi aga mai departe. Cand comparaji MySQL cu alte sisteme de baze de date, gindiji-vi la ceea ce este cel mai important pertra dumneavoastri. Performansi, suport, caracteristici (conformangé cu SQL, extensi atc.) condi si restrict de licentiere, pret; toate acestea constituie factori cate trebuie ltayi in considerare, Date find aceste consideragi, MySQL are de oferie rnumeroase caracteristieiatractive: © Vitez3. MySQL este rapid, Programatorii pretind c& MySQL este cel mai rapid sistem de bane de date pe care prio gta: Pang verbs accu akmoge eited http: / anm.ysql.com/benchnark.htn2, o paging de comparafie a performangelor din sical Web MySQL. © Usuringd in utlizare, MySQL este un sistem de baze de date cu performange ridicate, dr sla simp a ciruiconfgurare gi administrare sunt mult mai simple deci in cazul sistemeor mai mari Cost, MySQL este gratuit pentru majoritatea utiliziilor interne. Vezi sectiunea MySQL este gratuit? ulterior in aceasta introducere. *Suport pentru limbaje de interogare. MySQL ingelege SQL (Structured Query Language ~ imbaj de interogare structurat), limbajul preferat al tuuror sistemelor moderne de baze de date, De asemenea, puteyi avea aeces'la MySQL folosind aplicaii care aceeptd ODBC (Open Database Connectivity), un protocol de comunicatie cu bazele de date creat de Microsoft. ‘© Caracteristii. La server se pot conecta mai multi liens simultan. Client pot folosi mai multe beze de date simultan. Putefi obyine acces la MySQL in mod interact folosind numeroase interfege care vi permit si introduce interogiri sisi vizualizayi rezultate: clieni in linie de comands, browsere Web sau cliengi X Window System. De asemenea, este disponibili o varietate de interfese de progeamare pantru limbaje pre~ cum C, Perl, Java, PHP si Python. Astfel, aveti optiunea de a foloshprogeame client preambalate sau de a vi scrie propriile programe client pentru aplicatii personalizate. ‘© Concetivitate gi securitate. MySQL poate fi folosit integral in reyele, iar bazele de date sunt accesible de oriunde din Internet, deci vi putefi partaja datele cu oricine, oriunde, Dar MySQL are controlul accesului, astfel inet persoanele care nu au drep- tul si vi citeased datele nu vor avea soeastt posibilitae, * Portabilitate MySQL ruleaz’ pe numeroase varietiti de UNIX, precum si pe alte sis- teme non-UNIX, ca Windows i OS/2. MySQL ruleaza pe echipamente de la calcu- Jatoare de birow Ia servere cu performange ridicate. Distribute liserd. MySQL este usor de obsinut; pentru aceasta folosi-va browserul de Web. Daci mu intelegeri funcyionarea unei componente sau suntefi curios cu privire \, Ja un algoritm, vi puteti procura codul sursi gi il puteti examina, Daci nu va place ‘modul de fun:tionare a unei componente, il putesi modifica. Dar suportul? Bund intrebare; o baz de date mu este de prea mare folos dact nu putefi obgine asistengiin raport cu ea. Natural, mi-ar plicea si ered ei aceast3 carte conyine tot 14 Inlroducere ajutoral de care averi nevoie. Realist vorbind, inst, vetiavea intrebiri la care nu m-am indie niciodaté sau pentra care nu am avut spafiu suficient, Veti descoperi cd mai exist Slalteresurse, dar gi ck MySQL este dotat cu un sistem de asisten performant: © MySQL include wn manual de refering! de mari dimensiuni (450 de pagini i mai reste.) © Sunt disponibile contracte de asistengS tehnici de la dezvoltatorii MySQL, pentru cei care preferi un acord formal. © Existd o listd de corespondensd activi, la care se poate insctie oricine. Aceast listé confine numerosi participangi util, inclusiv deavoltatorii MySQL. Ca resursi pentru asistenfi, mulfio gisesc suficienti pentru necesitgile propri Comunitatea MySQL, programatori gi ne-programator, este extrem de cooperanti Rispunsurile la intrebirile din lista de corespondengi sosesc, de regula, in cdteva minute La semnalarea unor hibe, programatori lanseaz un remediu in citeva zile (uneori ore!) iar remedille sunt disponibile imediat prin Internet. Comparafi aceasta cv experienga deseori frustrantd a navigirii prin eanalele ,bizantine” de suport ale marilor produci- tori (Api fost pe-acolo? $i eu am fost. Stiu ce slternativa si folosese atunci cind am 0 Jntrebare despre un produs. Nu se poate face compara intre a fi pus pe apel in asteptare" la disereia unui producStor si posbilitatea de a publica o intrebare intro lists de corespondengi gia verifica existenta rispunsurilor arunci cénd fmi convine.) ‘MySQL este un eandidat deal pentru evaluare daci vi aflai in procesul de selectare a sis- temelor de baze de dave. PutetiIncerca MySQL {rd nicl un pericol de implicare finan- ciari. Totusi, daci v3 incurcapi, putey folosi lista de corespondenti pentru a fi ajutat. O evaluare costi o parte din timpul dumneavoastri, da acest lucru este valabilindiferent de sistemnul de baze de date pe care il avepi in vedere ~ si este perfect adevirat ck timpul de instalare i configurare pentru MySQL este mai redus decit pentru multe alte sisteme. Folositi deja un alt SGBDR? Daci fn prezent utilizagi un alt sistem de baze de date, trebuie si teeceyi la MySQL? Nu fn mod necesar. Dach suntesi satisficut de sisterul dumneavoastri actual, de ce 8% vi deranjagi cu o atare wranzijie? Dar dack vi simpiilimitat de sistemul folosit, trebuie cate goric si aveti in vedere MySQL. Poate ci performantele sistemului dumneavoastré Eurent reprezintd o problemi, sau poate c& sistemul respectiv este ade firma” si nu vi place si fii ,blocat” de acesta. Poate afi prefera si folositi componente hardware care fu sunt acceptate de sistemul dumneavoastri actual sau poate ci programmul este furnizat Jn format bina, iar dumneavoastei preferai si ave la dispozitie codul surs8. Sau poate eX pur gi simplu e prea costisitor! Toate acestea reprezintS motive pentru a lua in con- Siderare MySQL. Folosii aceast§ carte pentru a vi familiariza cu posibilitiilesistemu- ui MySQL, puneyi citeva intrebisi in ista de corespondenta MySQL si probabil eS vezi sisi rispunsurile necesare pentru a lua 0 decizie, ‘Dac avetiin vedere trecerea de la un alt sistem de baze de date SQL la MySQL, exami- nafi pagina de comparayie din situl Web MySQL, la adresa http: /Juam.nysql.con/ trash:ae-choose. ntay. Apoi, consultati capitolele care trateaza tipurile de date MySQL si dialectal SQL. Puteri ajunge la concluzia ci versiunea de SQL acceptati de sistemvul Sumneavoastra curent de gestiune a bazelor de date relationale este mult prea difert i c& portarea aplicatilor dumneavoastr3 ar implica un efort semanificativ. pans BIBLIOTECA | Autor. si Cate. | Introducer 15 © parte din evaluarea dumneavoastri trebuie ef 0 Fepf@tinee Tncercarea de 2 porta diferite exemple, desigur, deoarece s-ar putea si nu fie atic de greu precum credeyi. S-ar ‘putea si nu fie chiar atit de greu chiar daca sistemul dumneavoastra de baze de date este lunul mai vechi, care nu ingelege SQL. Eu am convertit recent un sistem de gestiune a inregistrisilor de la un SGBDR care nu era bazat pe SQL. Nu exista nici o aseminare fntre limbaje care si poati fi utilizati, iar unele dintre tipurile de date nu aveau echiva- ent in SQL. Acest proces a necesitat conversia metodelor de acces la retea gi zeci de pro~ grame de introducere bazate pe ecran gi de interogiri ,conservate'. A fost necesari 0 Juni gi jumitete de eforturi ,cu norma intreagi“, ceea ce n-a fost chiar atit de riu, Instrumente furnizate cu MySQL Distribuyia MySQL include urmatoarele instrumente: Un server SQL. Acesta este motorul care activeazi’ MySQL si care furnizeazi acce- sul la bazele dumneavoastei de date. ‘© Programe client pentru accesul la server. Un program interactiv vi permite si intro- dlucefi interogiri in mod direct si s& vizualizayi rezultatele, iar numeroasele programe administrative gi ueiitare vi ajutd si vi rulagi sil. Un utilitar va permite si controlati serverul. Altele vi permit si importayi sau si exportati date, si verificagi permisiunile de acces si multe altele. © O bibliotect client pentru scrierea propriilor dumneavoastra programe. Putey serie programe client in C, deoarece biblioteca este scrisi in C,dar biblioteca mai furnizeazi si baza pentru terge asocieri pentru alte limbaje. {In afara programelor furnizate eu MySQL, MySQL insusi este folosit de-citre aume- roase persoane talentate gi capabile, cirora le place sf scrie programe pentru a-si imbu- nitiqi productivitatea gi care dorese si puna la dispozitia publicului aceste programe. Rezuleatul este cf aveti acces la o diversitate de instrumente produse de terye pari, care faciliteazi utilizarea sistemului MySQL sau care extind aria de actiune a acestuia in domenii precum dezvoltarea siturilor Web. p MySQL este gratuit? MySQL nu este un produs Open Source, dar, in general, poate fi folosit gratuit, Trebuie cons manutd refering’ MySQL penta deli prvind ee, da prnspe fe bazi sunt urmitoarcle: Programele clint biblionecad programare a enor sone rast, erate plat formele. © Pentru UNIX gi alte platforme non-Windows, serverul MySQL poate fi folosit gra- tut, cu excepfia situapilor cind dorigi si vindefi serveral sau alte programe sau servicii care impun utilizarea acestuia, In aceasta situatie, trebuie si obrinetilicent pentru server. [dees este ef, daci obyineti un profit din MySQL, este normal ca dezvoltatorit™ sistemului st primease¥ o parte din acesta. (200 de dolari este o nimica roaté pentru un specialist SGBDR care vi ajuti si obsineti un profits existi o multime de programe gratuite pe care vi le putes! procura pentru a folosieficientsistemmul.) 16 Introducere © Versiunes Windows a serverului MySQL impune obginerea unei licen ‘* Versiunile mai vechi de MySQL sunt disponibile in condigile licentei publice GNU (GPL) §i pot fi folosite in orice scopuri, fark nici © platd. MySQL 3.20.32a este disponibil in condigile GPL. Indiferent dacd aveyi sau mu nevoie de o licen pentru server, se poate objine o asistens formalA, contra cost, de la programatorii MySQL, gi vi sfituiese si folosiqi aceastd ‘ocazie, mai ales daci lucratiintr-o firm& a clrei conducere ,mirdie* Ia fiecare program pentru care nu existi un astfel de acord, Sunt disponibile numeroase niveluri de suport sh in afard de obginerea unei asistenge excelente, veri contribui la dezvoltarea in conti- nuare a sistemului MySQL si, implicit, a intregii comunitisi MySQL. not despre licenja Windows Uneorse pune intebarea: Cum acc tebue 68 obi cents pentru sereru MySQL numal finda ulez Windows? Aceasta este © initebare rezonabld, la care exisié un raspuns rezonebil Gandia la aspectel economic ale problemel.Penitu v8 engea in dazvltarea de programe, ave nevoe de un sistem de operae gi de uneleinsumente de dezvotare, cum arf un editor sun compilto. Relay la aceslo corinfe, ex o dierent fundamentaléinre dezvoterea pentru UNIX si deevotarea pent Windows. Sub UNIX, put obtine rat cam to osea ce ave neva: 1 Pentru sisterul de operee, avel nurneroase opfun, cum sunt Linux sau una din vaiantete BSD gra- lite, cum sunt FreeBSD, NetBSD gi OpenBSD. 1" Peniruinsrumentole de dezvotae, toate acest sistome de opeare sunt dcate cu editoereprecum vi 4 emacs, procum gi compliatoae ca goo gi egcs. ' Cand sunt ansate actual ale sistemelor de operare sau ale Insrumentelr de dezvotare, le pute urs smplu descérca din iniemet sau v8 pute procura un compact ise necostistor. Ast cr ese \alabl chir gi pentu revzurle substan Pe de at parte, dezvoltareaprogrametor in Windows est relat costtoare: 1 Sistemul de operare nu este grat 1 insirumentele de dezvollr, precum complaorl, nu sunt ratte ' Cin sun ansate actual al sistemuii do operare sau ale nstrunentslr, vetue 8 lt dn nou, chiar acd acstea nu sutton dectromedi poniru he cau atuzaticremeniae de ics impor ‘Toate acestea inseam cn tip oe costule pentru dezvotaea progmelor in UNIX sun in esent’, ‘ule, pantu Windows acestea pot atinge vlor considerable. Se pres poate ca dezvotatorir MySQL 58 lopacd ef uereze cu MySQL, dar nual de mult int 98 fe ispusl sé platens pena aco preg, Costure de dezvotare sub Windows tebuie recuperate in-un fel sau atl iar taxa penta ican este ‘modu n cre se produce aceasté recuperae, In pus, ezvoator au descopert ci programaree sub Windows necesté mai ml inp dect cea sub LUNIK. Deosrece timoul dezvottorior are o matime fk, acesta este un cost care trebule supotal pe spezele versiunll UNIX (care este, n fond, patforma primar de dezvalare a sistemulll MySQL) Taxa 6& cents Windows furrizeazB un stimulet pentru erentarea Umpuli ia efoturlor spe potl Windows. Deca dort 8 rua Windows, dar nu dr obinet cena pony sever, vet unele opti: 1 Bist versune shareware a ssemull MySQL, pe cae o pute tela pent evaluare. Acces versune ‘i ole 30 de ae pei ulizareaserveruli, dup car pte decide dacs veh pt ena pen el. 1 Dac8 rat serverul Windows in sopuri educonale sau In institu univestare sau de cerceare ‘gwvemameniale, puto core dezvotatarior <8 va seutasc8 de taxa de licen 1 Programele cient sunt grate n ce caz, del dac8 pel gis! pecineva cae rueazd dele un server ‘este oispuss8 vi perm 8B flosj ave acces comple fs caraciorisile ester MySQL, Introducere 7 Ce puteti astepta de la aceasta carte Citind volumu! de fai, putes tnviga si folosysistemul MySQL in mod eficient, astfel in si vd putet face reaba intrsun mod mai produetiv. Vefi putea determina modul de intro- ducerea inforrasilor dumneavoastr3 intro baz& de date gi vei invifa si formula interogi care $i vi ofere rispunsurilaintrebiri pe care dori si le punetirelati la ace date. [Nu trebuie si fgi programator pentru a ingelege sau pentru a folosi SQL. Aceasti carte viva arita cum funcfioneaz§ sistemul. Dar, pentru ainjelege modul de utlizare adecvatd a unei baze de date, nu este suficent si cunosti sintaxa SQL. Lucrarea pune accentil pe caracteristcle unice ale sistemului MySQL si indica modul de utlizare a acestors. Alte inf se concentreaz3 asupra limbajului SQL in general, respectiv asupra dialeccului SQL alunui alt SGEDR. De asemenea, vesi vedea care este modul de integeare al sistemului MySQL cu alte instrumente. Cartea prezinté modul de utilizare a sistemului MySQL cu PHP sau Perl pentru a genea pagini Web dinamice, create din recultaele interogirilor aplicate bazelor de date. Veqi invija si scrieti propriile dumneavoastri programe caré si aiba acces la bazele de date MySQL. Toate acestea imbunatifesc posibilittile SQL de a satis- face cerintele aplicapilor dumneavoastri particulare. Dact vesifiresponsabil cu administrarea unei instaliri MySQL, aceasti carte vi va arita care sunt indatoririle dumnesvoastré si modul de indeplinire a acestora. Vet! invija si configuragi conturi de uilizator, si executati copii de siguranti ale bazclor de date $i si Juayi maisuri pentru a asigura securitateasitului durmneavoadtra, »Harta rutiera® a acestei cirti Lucrarea de far este structuratS in patru parti. Partea I: Utilizarea generali a sistemului MySQL . ‘ Introducere in MySQL si SQL. Discutl despre modul in eare MySQL vi poate fi de folos si consire un manual general care prezinti programul client interactiv MySQL si care trateazi elementele fundamentale ale imbajului SQL. ‘*Lucrul cu date in MySQL. Discuti tipurile de coloane furnizate de SQL pentra descrierea datslor dumneavoastra, proprietiyle si dezavantajele fiecSrui tip, cand si cum si utiliza aceste tipuri, modul de selectare dintre tipurisimiare, evaluarea expre- sillor gi conversia ipurilor, ‘ Sintaxa si utiizarea SQL in MySQL, Fiecare SGBDR important existent in prezent Sngelege SQL, dar fiecare motor de baze de date implementeazi un dialect SQL. usor dliferit. Acest capitol discuté despre SQL, cu accent asupra acelor caracteristci dis- tinctive ale sistemului MySQL. De asemenea, discuti despre caracteristiei prezente in alte sisteme de baze de date, dar inexistente in SQL, precum i solusile existente. lor. Un mod mai eficient de rulare a interogitilor. © Optimizarea interog: 18 Introducere Partea a Il-a: Utilizarea interfefelor de programare ale sistemului MySQL # Introducere in programarea MySQL. Discuti despre unele interfege de programare a aplicagillor disponibile sub MySQL si congine o comparatie generalé a interfegelor API pe care cartea le trateaza in detaliu. # Interfata API MySQL pentru C. Modul de seriere a programelor C folosind inter~ faa API furnizati de biblioteca client inclusi in distribugia MySQL. ‘ Interfata API pentru Perl DBI. Modul de scriere a scripturilor Perl folosind modu- Jul DBI. Trateazi scripturile autonome gi scripturile CGI pentru programarea siturilor Web. © Interfata API pentru PHP. Modul de utilizare a limbajului de scripting PHP pentru a scrie pagini Web dinamice, care objin acces la bazele de date MySQL. Partea a Ill-a: Administrarea sistemului MySQL ‘© Introducere in administrarea sistemului MySQL. Prezinti indatoririle unui admi- nistrator de baze de date si noyiunile pe care trebuie si le cunoagteti pentru a rula un sic peeformant. © Catalogul de date MySQL. O examinare aprofundati a organizarii si conginutului catalogului de date, regiunea in care MySQL stocheaza bazele de date i fisierele de © Administrarea general a sistemului MySQL. Modul in cae vi puteiasigura ci serverul dumneavoastra porneste, respectiv se opreste in mod adecvat atunci cid sistemul dum- nneavoastrl execu aceast operatic. De asemenca, include inscucfiuni pentru configurarea conturilor de utilizator MySQL si discuri despre intreginerea fiserelor jurnal, despre strategile de ereare a copilor de sigurang’, despre ajustarea serverelor si despre strategile de realizare a copilor de sigurang, respectiv de refacere a bazelor de date. ‘# Sccuritate. Ceea ce trebuie si tigi pentru a proteja instalarea sistemnului dumneavoas- tei MySQL impotriva intrusilor, ae2t contra altor utilizatori ai gazdei serverului, ct gi a clienilor care se conecteazi prin refed. # Intretinerca si repararea bazelor de date. Modul de a reduce posibilitatea de aparitie a dezastrelor printi-o tnucfinere preventivi, procum 7i metodele de a efectua refacerea fn urma ciderilor, daci dezastrele survin in ciuda misurilor dumneavoastrl de pre- Partea a IV-a: Anexe © Obfinerea gi instalarea programelor. De unde si vi procurati principale instru- mente descrise in carte si modul de instalae a acestora, © Referingi de tipuri de coloane., Descrierea tipurilor de coloane MySQL © Referinga de operatori si functii. Descrierea operatorilor si a functilor care se pot folosi pentru a serie expresii in instructiunile SQL. © Referinga de sintaxi SQL. Descrierea fiecirei instructiuni SQL pe care MySQL 0 poate inelege. Inroducere 19 ‘© Referinga de programe MySQL. Descrierea fiecirui program furnizat in distributia MySQL. ‘© Referingi API C. Descrierea tipurilor de date sia functiilor din biblioteca client C a istemului MySQL. ‘© Referingi ATI Perl DBI. Desericrea metodelor gi a atributelor furnizate de modulul Perl DBL ‘© Referingi APL PHP, Descrier ale functilor furnizate de PHP pentra suportul MySQL. Instrumente utile produse de terfe parfi. O suceintd trecere in revisté a unora dintre instrumentele disponibile pentru a vi ajuta si utilizayi MySQL, cum sunt utlitarelé de conversie a datelor sau utlitarele administrative. ‘¢ Furnizori deservicii Internet. Ce anume trebuie avutin vedere atunci cind alegeti un ISP care furnizeaz’ acces MySQL. Ce anume trebuie avut in vedere atunci cind functionafi ca furnizor de servicit Internet care asigur’ clienilor servicii MySQL. Cum si citifi aceasta carte Indiferent de portiunea din carte pe care o citi la un moment dat, cel mai bine este si incercati exemplele pe misur’ ce parcurgeticartea. Daci MySQL nu este iastalat in sis- temul dumneavoastri, trebuie sii instalapi sau si ragati pe cineva sil instaleze. Apoi, procurafi-vé figerele necesate pentru configurarea bazei de date demonstrative la care ‘vom face referite pe parcursul cirpii. Anexa A, ,Objinerea 4 instalarea programelor", vi arati de unde vi putesi procura toate acestea si confine instrtiuni pentra instalarea lor. Daci mu aveti ici cele mai clementare notiuni privind MySQL sau SQL, incepeti de la ceapitolul I, ,lntroducere in MySQL si SQL". Acest capitol vi oferi o introducere de tip manual cate vi prezinti fundamentele concepizlor privind MySQL si SQL si vi oferd cele necesare pentru a putea parcurge restul ciii. Apoi,trecet la capitolul 2, .Lucrul cu date in MySQL", respectiv capitolul 3, ,Sintaxa si utilizarea SQL in MySQL", pentru a descoperi modtl de descriere si manipulare adatelor dumaeavoastr, astfel incSt si puteyi exploata caracterstcilesistemului MySQL pentru proprile dumneavoastraplicai Daci averi unele notiuni de SQL, trebuie totus si citisi capitolele2 gi 3. Implementir SQL difera gi vepi dori s& stip care sunt elementele distinctive ale implementirii MySQL in raport cu alts implementiri pe care, poate, le cunoastei Daci avefi experienti cu MySQL, dar avefi nevoie de mai multe informaii privind detallle de efectuare a anumitor operaii, puteti folosicartea ca pe o refering, cZutind subiectele dorite in functie de necesita Daci suntefi interesat in avi serie propriile dumneavosstrl programe pentru accesul la bazele de date MySQL, citi capitolele referitoare la API, incepand de la capitolul 5, aIntroducere ta programarea MySQL". Dack doriti si generafi o interfags bazati pe ‘Web la bazele dumneavoastei de date pentru a faclita accesul la acestea sath invers, pen- ini a furniza un back end de baze de date pentru situl dumneavoastra de Web in scopul dea vi imbunitigi situl cu un conginut dinamic, examinaficapitolele 7, »Interfaya APL pentru Perl DEI“, respectiv 8, ,Interfafa API pentru PHP". 20 Introduces Daci evaluafi MySQL pentru a-l raporta la sistemul dumneavoastri curent de gestiune a bazelor de date relationale, numeroase portiuni ale citi vi vor fide ajutor. Citi capi- tolele referitoare la tipurile de date si la sintaxa SQL din Partea I pentru a compara MySQL cu sistemul SQL cu care sunteyi obignuit, capitolele de programare din Partea a Il-a daci avesi aplicafit personalizate, respectiv capitolele despre administrare din Partea.a Il-a pentrt a estima nivelul de supore administrativ necesar unet instaliri a sis- temului MySQL. Aceste informarii sunt de asemenea utile daci mu folositi in mod curent o bazi de date, dar efeetuati o analiza comparativi a sistemului MySQL i a altor sisteme de baze de date, in scopul de aalege unl din ele, Dac doriti acces la MySQL si clutayi un furnizor de servicé Internet (ISP) care si-1 ofere, vezi Anexa J, ,Furnizori de servicii Internet", pentru sugestii privind alegerea ‘unui furnizor. De asemenea, aceasti anexi consine sfaruri pentru furnizorii de servicii care dorese si asigure MySQL penteu a-s atrage noi clieng sau pentru ai servi mai bine pe client aetuali Versiuni de programe tratate in aceasta carte In momencul scrierii acestor rinduri, versiunea curent stabili de MySQL este seria de vyersiuni 3.22, iar seria 3.23 se afld intr-un proces de dezvoltare activa. Cartea se ocupi de ambele serii, Acolo unde anumite caracteristici mu existé in versiunile anterioare (nclusiv seria 3.21), acest lucru este semnalat. Pentru celelalte pachete principale de programe discutate aici, versiunile recente sunt suficiente pentru exemplele date in carte. Versiunile curente sunt: Pachet Versiune Perl DBI 1413 Driver Perl DBI pentru MySQL 1.22.xx (stabili), 1.23.xx (beta) PHP 3.0.12 (4.0 se ali la orizont) Apache 139 CGLpm 256 “Toate programele discutate in accasti carte sunt disponibile din Internet. Anexa A furizeaz& instrueyiuni pentru incircarea in sistem! dumneavoastra a sistemului MySQL, a suportului pentru modulul Perl DBI, a limbajului PHP, a serverului Apache sia limbajului CGI.pm, Aceasté anexé mai conjine instructiuni pentru procurarea bazei de date demonstrative folosite in exemplele din carte, precum sia programelor exemplu create in capitolele de programare. Conventii folosite in carte ‘Conventiile tipografice folosite sunt urmatoarele: Corpul de literi monospariat indici nume de gazde, nume de fisiere, nume de cataloage, comenzi, optiuni si situri Web. Introducere 24 Acolo unde comenzile sunt indicate atunci cind le introduceti, caracterele aldine indici textul pe care il introducefi. Promptul indici modul de rulare a comenzii: * ‘Comanda este rulati ca utlizator UNIX obignuit * Comanda este rulati ca utilizator UNIX ridicin (root) cae Comanda este rulatd in Windows Corpul de literé cu caractere italice din comenzi indicé locul unde trebuie si introduces o valoare la libera dumneavoastrialegere. fn instructiunile SQL, euvintelecheie si numele functiilor SQL. sunt serise eu caractere majuscule. Numele bazelor de date, ale tabelelor gi ale coloanelor sunt serise cu carac~ tere minuscule, fn desrierile stasis, paranezele drepte ({ 1) indie infrmi coptionale. Resurse suplimentare Aceastt carte incearci si vi spunii practic tot ceea ce trebuie si gtji despre MySQL. Dar ack avetiointrbare al cei rispuns mu se gisese fn carte incotro tebuie sf vi indreptagi? ntre resursele utile sunt incluse siturile de Web pentru programele in raport cu care aveti nevoie de ajutor: Pachet Sit Web principal MySQL http://w. mysql.con/ oc. htm. Perl DBI http: / wm synbo2stone..org/technolegy/pert/08t/ PHP http: / /wm.php.net/ Apache http: fmen.apache.org/ CGLpm http: / /stein/cshl.org/WM/software/COI/ Urilizarea manvalului electronic de referinjis MySQL B Nu uta sé examinaf ocazional manus electronic de refit MySQL pent inforatiprivnd cele mai recente inbunj efertoare la MySQL. Manuaiul a f madiicatcontnw, pe masure april de nol schimbar Aceste situri coagin indicator’ spre dferite forme de informayie, cum ar fi manualele de refering liste eu intrebirifreevente (FAQ) si liste de corespondenti: # Manuale de referings Principala documentatie inclusé chiar in SQL este manualul de referingé. Acesta este disponibil in numeroase formate, inclusiv o versiune electronic’. Manual] PHP este disponibil, de asemenca, in mai multe versiuniy tora, versiunea electronica tinde si fie mai complecé dectt versiunea in format tiptrit, Modulul DBI si driverul situ specific pentru MySQL au 0 documentatie separati Documentul DBI congine concepte de ordin general. Documentul driveruhui MySQL discuta caracteristicispecifice sistemului MySQL « fntrebiri frecvente (FAQ) Existi liste FAQ pentru DBI, PHP si Apacke. 22 Introducere: # Liste de corespondenta Existi mumeroase liste de corespondenga orientate spre programele discutate fn aceast carte, Este o idee bun si vi abonatila cele care se refer la instrumentele pe care doriti ‘ile utilizai. Vi rugim si nu uieay, torus, cl trebuie si invigai si folosigi arhivele (pentru listele care dispun de asemenea arhive). Dac sunteti incepitor in vtilizarea ‘unui instrument, vei avea multe intrebiri care au fost puse (gi la care s-a rispuns) de tun milion de ori, deci nu avefi nici un moriv si intrebati din nou daci putesi gisi rspunsul printr-o efutare rapid prin athive. Instructiunile pentru a vi abona la listele de corespondent’ variaz’, dar puteti gisi informatii la adresele URL preventate aiciz Pachet Instructiuni pentru lista de corespondenga MySQL hetp: //ww.nysal.com/éoe. ted Peel DBL http://w, symbolstone. org/techaelogy/per1/0B1/ PHP vetps/ Jum. php.net support ohn Apache http: nw. apache. org/foundation/maiingiists. htm « Situri Web subordonate ‘In afarasiturilor Web oficiale, unele dintre instrumentele discutate aici dispun de situri subordonate, care furnizeaai informapii suplimentare, cum ar fi cod sursi demonstra~ tiv sau articole centrate pe anumite subiecte. Cautatio regiune “Links” (legitui) din situl oficial pe care il vizitayi PARTEA | Utilizarea generala a sistemului MySQL 1 Introducere in MySQL si SQL 2. Lucrul cu date in MySQL si SQL 3. Sintaxa $i utilizarea SQL in MySQL 4 Optimizarea interogérilor Caritowut I Introducere in MySQL si SQL Acest capitol constituie ointroducere in sistemul de gestiune a bazelor de date relayionale (SGBDR) MySQL gi in limbajul de interogare structurat (SQL) pe care il ingelege sis emul MySQL. Capitolul prezinté termeni si concepte fundamentale pe care trebuie si le injelegeti, descrie baza de date demonstrativi pe care 0 vom folosiin exemplele din carte si contine un manual care VA indick modul de utilzare a sistemului MySQL pentru a crea © bazd de date si pentru a interactiona cu aceasta. Incepeti de aici dack sunteri un neofit in domeniul bazelor de date si, poate, nu sunteyi sigur dacd aveyi nevoie sau daci puteyi folosi 0 bazi de date. De asemenea,trebuie si citi capitolul de faya dac& au stip nimic despre MySQL sau SQL gi aveti nevoie de un hid introductiv pentru faceput. Cisitorii cu experienji in MySQL sau cu sistemele de Baze de date pot omite acest material. Totugi, toaté lumes trebuie si citeasc& secriunea 10 bazi de date demonsteativi", deoarece este cel mai bine si fig familiarizat ow Tria gi conginutul bazei de date pe care o vom folosi in mod repetat pe parcursul cir Cum vi poate ajuta MySQL ‘Aceasti sectiune descrie situapii in care sistemul de baze de date MySQL poate fi util. ‘Astfel, vi veti forma o pirere cu privire la tipurile de operafii pe care le poate efectua MySQL gi la modalititile in care acest sistem va poste ajuta. Daci nu trebuie si vi convingeti de utilitatea unui sistem de baze de date ~ poate fiindca deja avegi o problema ‘in minte si doriti pur gi simplu si aflagi care este modul in care puteti folosi MySQL pen- tru a Vi ajuta si o rezolvagi ~ puteti trece la secfiunea ,O bazi de date demonstrativa". Un sistem de baze de date este, in esenti, o modalitate de a gestiona liste cu inform: Informatiile pot proveni dintr-o varietate de surse. De exemplu, pot reprezenta date de cercetare, inregistriti de afaceri, cereri ale cliensilon statistici sportive, rapoarte de vanziri, informatii despre hobby-urile proprii, inregistrisi de personal, rapoarte privind. defecriuni sau notele unor elevi. Totusi, desi sistemele de baze de date pot lucra cu o gam’ larga de informagii, nu folositi un asemenea sistem doar de dragul de a-| folosi. ‘Dacd o sarcind este de la bun inceput usor de indeplinit, nu aveti nici un motiv de a insera o baz de date numai pentru ao folosi. O list de cumpirituri este un exemplu bun: scrieti articolele pe care trebuie si le cumparati, le stergeti de pe lista atunci cand le ‘cumpirafi si apoi aruncagi lista. Este putin probabil si folositi o baz de date pentru asta. Chiar daci averi un calculator de tip palmtop (care poate fi tinut in palma ~ N.T) proba- bil c& pentru lista de cumpirituri veti folosi functia sa de editare de texte, nu caracteris- ticile sale de baze de date. Capitolul 4 Introducere in MySQL siSQL_ 25 Puterea unui sistem de baze de date intri in actiune atunci cind informagile pe care dorsi si le organizayi gi sX le gestionayi devin voluminoase sau complexe, astfe]incit {nregistrivile dumneavoastri devin prea dificil de manipulat mana. Bazele de date pot fi folosite, desigur, de citre mari corporati, care prelucreaz& milioane de tranzacyi zl- nic. Dar chia: si operatiile a scar mici, care necesiti o singurd persoani pentru a intregine informayii de interes personal, pot necesita o baz de date. Nu este grew si ne sgindim la situa in care utiizarea unei baze de date poate fi benefici, deoarece nu tre- buie si aves eanttiyi imense de informati inainte ca acele informayi si devin’ dificil de gestionat. $¥ ne gindim la urmitoarele sicuaii Intreprinderea dumneavoastri de timplirie are numerosi angajayi, Trebuie 8% pastragi ‘negistrrile cu salarii si statele de placd astfel incit si tipi pe cine afi plitit si cind ai efectuat plata; de asemenea, tebuie si rezumayi aceste inregistriri pentru a putea remite declarasile de venit autoritatilor, in vederea stabiliitimpozitelor. De asemenea, trebuie si pistrafi evidenga sarcinilor pe care compania dumneavoastra a fost angajath si le indeplineasc’ si salariagii pe care i-ayi programat si ucreze la fiecare sarcin§. ‘© Suntesiadministratorul unei rejele de deporite cu piese de schimb pentru autovurisme si trebuie si sti care sunt depozitele care dispun de o anumité piesi in inventas, acfl incit si putesi onora comenzile cliengloz. © Ca vanzitor de juciri, suntet! supus cu precidere unci cereri (dependente de capricii- le cumpiritorilor) de articole pe care le puteti transporta. Doriti si stti care este traiectoria curentl a vanzirilor pentru anumite articole,astfel incdt sf puteyi estima dack si mixigi inventarul (pentru un articol care devine mai popular) sau daca si reducesi (peatru a nu Vi ,inyepeni" cu un stoe foarte mare dintr~un produs care nu se ai vinde b ne). . 1 Stiva de date de cercetare pe care le-ayi adunat in cursul mai multor ani trebuie si fie analizati in vederea publiciri, pentru ca nu curmva dictonul .publici sau dispari* si devind epitaful carierei dumneavoastré. Doriti si reduceti mari canivigi de date brute pentru a genera informagii de suma, precum si si extrageti subseturi selectate de observa tr vederea une analize statistice mai detaliate ‘* Sunteji un crator cunoscut, care cilitoreste prin far pentru a partitipa la numeroase tipuri de aduniri, cum sunt festivtiyile de absolvire, intlnirile de afaceri civice si conventii politice. V-afi adresat publicului de atitea ori, incit este dificil si vi amintif ce anume afi spus in fiecare loc unde afi fost, deci afi dori si pistrai inregis iri ae discursurilor dumneavoasted trecute gi sile folosigi pentru a vi ajuta in plani- ficarea angaamentelor dumneavoastri viitoare. Daca reveniti inuun loc unde afi mai vorbit, nu dorsi si tinesi un discurs similar cu unul pe care I-afi mai ginut in acel loc, iar 0 fnregistrare a fiecirui loc pe unde afi fost vi va ajuta si evita repetirle. De asemenea, dorii si retineti modul in care au fost receptate discursurile dumneavoas- rk. (Monologul dumneavoastri ,De ce-mi plac pisicle" de la Metropolitan Kennel Club a fost oarecum un fiasco, deci nu vrei si facesi din nou acceasi greseali, daci reveniti acolo.) s ‘© Sunteyi un profesor care trebuie si-si pistreze evidenta notelor date gi a prezenpei la cours, De fievare dati cind dari un test sau un chestionar, inregistrati nota obsinuti de 26 —Parteal__Usiizarea general a sistemului MySQL fiecare elev. Este destul de simplu si scrieyi notele intr-un catalog, dar utilizarea ulte- rioarl a notelor este o treaba dificil. Preferai si evita sortarea notelor de la fiecare test pentru a determina distributia notelor; de asemenea, preferati si nu adunafi punc~ tajele fiecdrui elev atunei cand determinayi mediile finale de la sfirpitul perioadei de notare, Niel numitarea absenyelor fiecirui eley nu are nei un haz. ‘ Instituya al crei secretar suntefifoloseste un catalog al membrilor. (Institugia poate avea orice profil: o socitate profesionali, un club, o companie cu depozite,o orchestra sim- fonied sau un club pentru intreyinerea condite zie.) Infiecare an, general acest eata- Jog in forma srs pentru membri, in functie de un document creat cu un procesor de texte pe care il edit’ atunci cind informapile despre membri se modifica. ‘V-ati plitisit si folositicatalogul in acest mod, deoarece limiteaz modurile de wi- lizare a acestuia, Sortarea intrirlor in diferite modusi este dificilé si nu puteti selecta ‘cu usuringS mai anumite pirgi ale fieckrelintriri (cum ar fi o lise aledtuitd numai din nume ji numere de telefon). Nici mu puteri descoperi usor un subset de membri, ‘cum sunt aceia care trebuie si-i plavease fn curind cotizatia; dac& ap putea, aj elimina necesitatea dea eluta lunar in dferiterubriei pentru avi gisi pe acei membri cirora tre- buie sili se trimitéingtiinpiri pentru plata cotizafici. De asemenea, dori efectv si evitayi si editai personal caalogul, dar bugetalsociet cste limita, jar angajarea unei alte persoane este in afara oricei discupii. Aji auzit despre sbicoul irk hati care ar rezulea din intreyinerea electronic& a inregistririlos, dar inc ‘hu ati ysimgie" nici un avantaj al acestuia. fnregistrrile pentru fiecare membru sunt in format electronic dar, ironic, nu se afld into formi care poate fi folosité cu usuringi in orice scop, mai pugin yenerarea de hart prin tipSriea catalogului membrilor! Aceste scenarii variazi de la situa care implici mari canttiqi de informagi si pind la cazuri cu un volum de informagiirelativ redus. Elemental comun este existenfa unor ‘operagii care por fi efecruate manual, dar care pot fi executate mai eficient de eitre un sistem de baze de date. (Cate sunt avanrajele concrete pe care trebuie si le agteptafi din uilizarea unui sistem de baze de date precum MySQL? Aceasta depinde de necesitiile si ceringele dumneavoas- tri specifice, iar acestea sunt extrem de variate, asa cum s-a aritat in exemplele prece- lente. 5t examinkm un tip de situagie care survine frecvent yi care astfl exte destul de reprezentativ pentre utilizarea bazelor de date. Sistemele de gestiune a bazelor de date sunt frecvent wtilizate pentru executarea unor ope raj cum sunt cele pentru care se folosesc fiierele (nu cele electronice -N.T).fntr-adevar, co bazi de date este un fier de mari dimensiuni din anumite puncte de vedere, dar un fisier eu un sister de fare incorporat. Pistrarea prin metode electronice a inregistrilor pre- int’ clteva avantaje importante fal de pistrarce manvali a fnregistrrilor. De exemplu, dlaci jucraji inte-un birou in care sunt pistrate inregistrrile clientilos iaté citeva modali- 184i in care MySQL vi poate ajuta: (© Timp redus de figare a inregistrarii, Nu trebuie X chutai fn sertarelefisierelor pentru a determina unde si puneti 6 noui tnregistrare. ,fnménafi" inregistrareasistermului de figare si ii permitep si plaseze inregistrarea Ia locul potrivit pentru dumneavoastrs, Capitolul 1 Introducere in MySQL siSQL 27 # Timp redus de regisire a inregistrati, Cand ciutayi inregiseriri, nu cSucati personal in fiecare inregistrare pentru a le gisi pe cele care contin informatie dorite. $a pre- supunem c luerayi intrun cabinet stomatologic. Daci doriti si trimitesi ingting&ri tuturor pacientlor care nu s-au prezentat la control de mai mult timp, cere ide fgare si giseasc’ inregistririle adecvate. Desigus, veti proceda altel decit dact ajivorbi cu o altd persoand. Acesteiai-afi spune: .Fit amabil i aflé care sunt pacienti tare nu s-au prezentat la control in ultimele 6 uni" tn fafa unei baze de date, emiteyi o incantayie bizar SELECT nume, prenune, ultina_vizita FAO pacient WHERE ultina_vizite, i Partea optiun$ a liniei de comand yset poste fi vidi, dar cel mai probabil va trebui si emitei o comand ca urmicoarea 4 mysql -h mune gazde -u nuoe_vtslizetor -p Ene posibil si nu fie necesar si specifcati toate aceste opyiuni cind invocaji nysa}s pela la administrtorul MySQL pentru a afl sintaxa exacté a comenaii pe care trebuie si 0 folosig, Probabil ci va trebui si specifica cel pugin un nue gi o parol ‘ agi tn invgarea sistemului MySQL, probabil ci sistem siu de securitate vi se va pirea agasant, deoarece ingreuneazi electuatea operayilor dorite (Frebuie si obsineti permisiunca de a crea si dea objine acces lao baza de date gi trebuie sivi specificay mumele gi parola de fiecare dati cdnd vi conectafila server) Totus), dup ce ves trece dincolo de baza de date demonstrativi gi vei introduce gi folosi proprile domneavoastriinregistrri, perspectiva dumneavoastrl ze va schimba radical. Apo, ve aprecia faprul ck MySQL impiediek ate persoane si vi spioheze (sau, mai eu, chiar sf vi distrugi!) datele. - ati care este semnificayia opyiunilor: Gazdsa secverului la care dorii st vi conectag. Dac serverul ruleaza pe aceasi calcu- lator pe care utlizati mysql, in mod normal aceasti optiune poate fi ompis ¢-u mume_utilizator (formé alternativi: --user*nune_utilizator) « Numele dumaeavoastri de utilizator MySQL. Dacé folosiqi UNIX $! numele dum- neavousti de utlizator MySQL este acelast ca numele dumneavoastra de deschidere a sesiunii de lucru, puteyi omite aceasté opfiune; nysal va folosi numele de deschidere a sesiunii de lucru'ca nume MySQL. Sub Windows, numele de utilizator prestabili este 086, ceea ce nu este foarte util. Fie specifiayi un nume ta linia de comands, fie stabilisi un nume prestabilit in medi dumneavoasts prin configurarea varabilel see. De exemplu, pot folosi urmitoarea comandi set pentru a specifica numele de utilizator paul: ‘set USER=pas © -p (formi alternativi: --password) Aceastd opriure indici programului nysq? si vi solicite parola dumneavoastri MySQL. ‘Novi: vi putes insera parola in linia de comanda tastand-o sub forma -poarola_avs form’ altenativis--parolarparota_dvs). Tocusi, din motive de securitate, cel mai bine este si nu procedayi astfel. Dact specificayi optiunea -p fr3 nici o paroli,indicasi pro~ © parol la deschidere. De exemplu: (eilizator -p ‘gramului mysql si ¥4 soli ‘S mysql -h nume_gezda -u nun Enter password: Cand vedeyi mesajul Enter password: (introduce parola), tastafi parola dumnea- voastri. (Parola nu va fi reflectati pe ecran, in caz cd vi spioneazd careva.) Reyinefi ck parola dumneavoastrd MySQL nu este obligatoriu aceeasi ca parola UNIX sau Windows. Daci omiteyi optiunea -p in totalitate, mysqd presupune ci mu avefi nevoie de ea gi nu o solicit. Nota Opjiunile -h si-v sunt asociate cuvintelor care urmeazi dupi acestea, indiferent dacd intre optiune si cuvantul urmator exist sau nu un spatiu. Acest lueru nw este va~ labil pentru opriunea -p. Dack specificati parola in linia de comand’, nu trebuie si existe nici un spagiu intze -p si parol. De exemplu, si presupunem ci numele men de utlizator MySQL si parola mea sunt respectiv paul gi secret, si ci doresc sf mi conectez la serverul care ruleazX pe acelasi cal- culator la care am deschis sesiunca de lucru. Comanda mysqi pentru aceasti operatie este: % nysql -u paul -p Entor password: +++ ‘Dupi ce am introdus comands, nysqt afigeaz’ textul Enter password: pentru a-mi cere parola, iar eu o taste (sirul ®®*°** arati locul unde am seris secret). | Daci tonul merge bine, nysal afigeaz un mesaj de salut si un prompt mysal> prin care fii arath ck agteaptd s¥ seriu comenzi, Secventa de pornire completi se prezint¥ astfel: 40 Parteal Usizaren general sistomuli MySQL | | | ‘mysql -u paul - Enter passnord: twasee Welcome to the MySQL sonstor. Commands end with ; or \g- Your MySQL connection id is 1905 to server version: 9.22.25-2og Type ‘help’ for help. youl Pentru a mi conecta la un server care ruleaza pe un alt calculator, trebuie si specific numele gazdei folosind opriunea -h. Daci gazda respectivi are numele pit-viper.snake.net, comanda arati astiel: % mysql -h pit-viper-snake.net -u paul -p | in majoritatea exemplelor care urmeaza si care prezint’ o linie de comand mysql, voi mite opriunile -h, -u si -P, din motive de concizie. Se presupune cf veyi introduce | opyfunile necesare | Existl modalitipi de a vi configura contul astel inet si nu fie necesar si tstai parametil deconexiune de fiecare dati cind rulayi mysql. Acesthucra este discutat in secriunes ,Sugesti_| ‘pentru interactiunea cu aysqi". Puteti trece chiar acum la seciunea respectivi, pentru a Vi. | face o idee eu privce la unele din posibiliviie dea simplifica conectarea la server. | t Capitolul 1 Introducere in MySQL siSQL 44 Dupi ce stabilii o conexiune cu serverul, puteti incheia sesiunea oricénd tastind aurT: rnysql> qurr Bye De asemenca, putefi termina sesiunea tastind Control-D, cel putin in UNIX. Emiterea de interogari Dupi ce v-asi conectat la server, sunteti gata de a emiteinterogir. Aceastisecfiune descrie unele aspecte generale pe care trebuie si le cunoastesi despre interacyiunea cu aysq2. Pentru a introduce o interogare in nysqi, pur si simplu tastaji-o. La sfargitul interogiri, tastag un caracter punct si virguld(;) si apasayi pe tasta Eneer, Caracterul punct si visgult indict programului nyeqi c& interogarea este completi. (De asemenea, pute folost \g pentru terminarea interogirilor, daci preferai si scrieyi doui caractere in loc de unul.) Dupi ee ati incrodus o interogare, syeah o timiteservrulu pent a fi exeoutath rverul prelucreazd interogarea si trimite rezultatele inapoi programului mysql, care afigeans raul pentru dumneavonte ae Jeti un exemplu de interogare simpli gi rezultacul acesteia: snyoql> SELECT Now() = Naw() 11909-07"24 11:03:88 1 row in set (0.00 seo) ~ Accasti comandi indie datas ora curent’, (uncta NOm() ow este tii ca atare, dar se poate {olosi fn expresi~ de exempla, pentru a calcula diferenga dintre data curenti i o alti Gath.) De asemenes, nysq) afigeazi numirul rindurilor rezultatului. De regulf, nu voi prezenta acest numir fn exdeul exemplelor. Deoarece mysql agteapti caracterul punct si virguli tnainte de a trimice interogarea serverului, nu trebuie si introduceri toatd interogares pe un singur tind. Puteri extinde © interogare pe mai multe linii, dacé dori: ‘ nysql> SELECT KOW(), ° tsend, “> venston() We ae To 1009-0724 1416018 pauenacainast 3.29.1-e1phe lag Observasi modu! in care promptul se modificd din aysq2 in dupi ce ati introdus prima linie a interogiris acest luctu va arati ci nysa} crede e¥ inci mai introducefiinterogarea. Aceasta este 0 reictie importanta, deoarece, daci uitayi si plasaji caracterul punct si vir- ‘gull sfasitul unelimterogiri, prompeul vi ajutd si sesizafi ck aysq continu sf agtepte ceva. In caz contrar, dumneavoastrd veti astepta, intrebandu-vi de ce 0 avea nevoie MySQL de atita timp pentru a vi executa interogarea, iat aysqd va astepta la eandul li, intrebindu-se dece aveyi nevoie de atata timp pentru a termina de introdus interogarea! 42 Parteal_Utlizarea generalé a sistemului MySQL. In majoritatea cazurilos, nu are importangé dact introducet interogitile folosind majus- cule, minuscule sau litere de diferite micimi, Toate aceste interogiri sunt echivalente: SELECT USER() select user() select User() Exemplele din aceasti carte folosese majuscule pentru cuvintele cheie gi numele de func din SQL, respectiv minuscule pentru nume de baze de date, tabele si coloane. Cand invocafi o funcfieintz-o interogare, nu trebuie si existe spaii intre numele functei sipparanteza care urmea2i dup acesta: nysql> SELECT NOM iow) 4999-07-47 12:44:58 nysai> SELECT NOW ( ERROR 1064: You have an error in your SQL syntax near '()' at Line 1 (Aves o eroare in sintaxa SQL langi "()’ pe linia 1) Cele doui imterogiri par similare, dar a doua eyuenz4, deoarece paranteza mu apare ime- iat dupa numele functici. Dack afi inceput si scriei o interogare cu mai multe li ccurafi tastai \e pentru a 0 anula (cancel): fnysql> SELECT NOW(), > VERSION(), le nysql> Remarcagi ci promptul revine la forma mysql>, indicind ci aysql este gata pentru 0 oui interogare. sKoexe- Putefi stoca interogirile intrun figier si puteti cere programului aysql si citeascd interogirile din fier, in loc si astepte ca dumneavoastei si le introduceti dela tastaturi. Folosisi pentru aceasta faciltgile interpretorului de redirecionare a datelor de intrare, De exemplh, dack am interogiei stocate iner-un fisier denumit fisierul_peu.sal, pot executa confinutul fisierului ast ‘ aysal < fisierul_neu.sql ; Purefi denumi figierul cum doriyi, Eu folosese sufivul sql pentru a arita, ci fsierul confine instructiuni SQL. Execitia programului aysql in acest mod va reapirea in seeyiunea »Adtugarea de fnregis- sisi noi" avunci cnd introducem date in baza de date canp_db. Este mult mai comod si {ncircim ua tabel determinind progeamml nysqh si citeasc8instructiuni INSERT dintr-un fipier decie tastnd manual fiecare instruegiune, {In continuare, acest manual va prezenta multe interogiti pe care le putei incerca pe cont propriu, Acestea sunt indicate prin promptul aysal> care precede interogarea si prin caracterul puner si virguli (de terminare) plasat dupa aceasta, iar asemenea exemple sunt dle regula insoyite de rezukatul interogirii, Trebuie sX puteyi tasta aceste interogiri asa ‘cum sunt prezentate, ar davele de iesie rezultate trebuie si fie entice. Capitolul 1 Introducere in MySQL siSQL 43 Inerogitile prezentate fir8 un prompt sau firk earacterul punet si vizgulé de terminare ‘ instrucriuni: sunt menite pur si simplu a ilustra o idee gi nu trebuie executate. (Le putes incerca, daci doriy, dar, dado facet, nu utaji si inserafiearacterul punt si vir~ sgl la sfaryit) {n capitolele viitoare ale ckyi, de reguld nu voi mai prezenta promptul aysqa> stu carac- terul punct si virguld in instrucyiunile SQL. Motivul este acela puteti emive interogiri fn contexte diferite de programul client nysai (de exemplu in scripturi Perl sau PHP), contexte in cate nu apare nici un prompt simu este necesar nici un caracter punct gi vir- gull. Voi indica situatile in care se intentioneazi in mod specific ca dumneavosstrS si introducetio interogare in nysal. Crearea bazei de date Vom incepe prin a crea baza de date sanp_db si tabelele din interiorul acesteia, prin « popula tabelee sale si prin a efectua unele interogisi simple asupra datelor inclase in aceste tabee. Usiizarea unci baze de date implick mai mule etape: 1. Ceearea(initializarea) bazei de date 2. Crearea tabelelor din cadrul bazei de date 3. Inveraciunea cu tabelele prin inseria, regisirea, modificarea sau stergerea datelor. Regisirea datelor existente este, evident, cea mai frecventd operatie efectuati eu o baz’ de date. Urmitoarele operaii, in ordinea frecventei, sunt'inserfia datelor noi si actua- lizarea sau gtergerea datelor existente. Mai pusin freevente sunt operapile de ereare a tabeleloy iar operajia cel mai putin freoventd este crearea bazelor de date. Noi pornim de la zero, deci trebuie sk Incepem de la crearea bazei de date, operatia cel ‘mai pugin freevent, si vom parcurge pas cu pas operapile de creare a tabelelor i de in~ serjie a datelo: noastreiniyile, inainte de a ajunge si efecruim operatia cea mai comunis regisirea date'or. . Pentru a crea bazi de date nous, conectati-vi la server folosind aysd si apoi inserucfiune OREATE DATAGASE care specifick numele bazei de date: ysql> GREATE DATABASE sanp_db; Va trebui sf creagi baza de date sanp_db inainte de a putea crea oricare dintre tabelele care vor fi indluse in aceasta sau inainte de a efectua orice operafii folosind conginutul acelor tabele. Prin crearea bazei de date, devine aceasta baza de date curenti (prestabilita)? Nu, nu devine, aga cum se poste vedea prin exccutarea urmatoarei interogari sysql> SELECT DATABASE(); ‘DATABASE() = Pentru ca baza de date sanp_do si devini curenti, emitey o instrucyiune USE: rnysql> USE samp_db 44 Parteal Uilizarea generalé a sistemului MySQL Use este una dintre puyinele instructiuni care nu necesiti un earacter punct si virgulk de terminare a instructiunil, dey fl putes! adiuga, daci dori, HELP este o ald instrucriune de acest gen, iar dac& emiteti o instructiune HELP, aceasta vi va prezenta o listi cu toate instructiunile care nu necesiti un caracter punct si virguli. Dupa ce emitefiinstructiunea USE, samp_db devine baza de date prestabiliti: fnysql> SELECT DATABASE(); | DATABASE () [Sanp ab Cealaltd modalitate de a transforma o bari de date tn bazi de date curenti este de ao denumi in linia de comanda arunci cind invocati mysa}: % nysql samp_db ‘Acesta este, de fapt, modul uzual de a denumi baza de date pe care dorigi si o folosig Dac aveti nevoie de parametri de conectare, specificayi-i inainte de numele bazei de date. De exemplu, urmatoarele douk comenzi imi permit si mi conectez. la baza de date ‘samp_db de la gezda locali si de lasistemul pit-viper. snake net: % mysql -u paul -p sanp_db 4% aysql -h pit-viper.snake.net -u paul -p sanp_db Daci mu se precizeazialtfel, cate exemplele care urmeazi vor presupune ci, atunci cind invocagi nysal, specificayi baza de date sanp_db in linia de comandi pentru a 0 transfor- ‘ma in bazd de date curent’, Daci invocati nysal, dar uitati si specificayi baza de dave in linia de comands, emiteyi o instrucyiune USE sanp_ab. Crearea tabelelor {in aceasti sectiune, vom construi tabelele necesare pentru baza de date demonstrativd ‘samp_db. Mai intdi, vom lua in considerare tabelele necesare pentru Liga istorie3. Apoi, ne vorn ocupa de tabelele necesare pentru proiectul de pistrare a evidengei rezultatelot scolare. Aceasta este partes unde unele cirti de baze de date incep s% vorbeasci despre analiza si proiectare, diagrame entitate-relaie, proceduri de normalizare si altele de acest gen. Existi un loc pentru toate acestea, dar prefer si spun numai ci trebuie si ne géndim ppufio la modul fn care va ar3ta baza noastri de date: care sunt tabelele pe cate uebuie vi le conjind, care trebuie s& fie conginutul fieckrui tabel, precum si unele din aspectele implicate in decizia privind modul de reprezentare a datelor. ‘Optiunile care se fac aici privind reprezentarea datelor nu sunt absolute, fn ale situagii puteti opta la fel de bine si reprezentati date similare intr-un mod diferit, in funcrie de cerinjele aplicatillor dumneavoastra si de modurile in care doriti si va tilizagi datle ‘Tabele pentru Liga istoricd Structura tabelelor pentru Liga istorie este relativ simpli ©Un tabel presedinte (presedinte). Acesta congine o inregistrare descriptivi pentru ficcare presedinte al Statelor Unite. Vom avea nevoie de scesta pentru chestionarul clectconie din sival Web al Ligii (analog interaciv al chestionarului tipsrit care apare {in secgiunea pentru copii a buletinului de sic al Lig) Capitolul 1 Introducere in MySQL gi SQL 45 ©Un tabel nenbru (membru). Acesta este folosit pentru a pistes inform: despre fiecare membru al Lig. Tabelul va fi folosit pentru crearea versiunilor tipiri gi electronici a catalogului cu membri, pentru trimiterea de note automate de {ngtiinare pentru plata cotizagilor gi alele. Tabelul presedinte ‘Tabelul presecinte este mai simply, deci si diseurim despre el mai inti. Acest tabel va contine unele informayii biografice elementare despre fiecare pregedinte al Statelor Unite: ‘#Nume. Numele pot fi reprezentate intr-un tabel in mai multe moduri. De exempl, putem avea o singuré coloand care contine intregul nume, respectiv coloane separate pentru nume gi prenume, Este evident mai simplu si folosim o singuri coloans, dar acest lucru vi dezavantajeaz3 in citeva moduri © Dactintroduceti numele cu prenumele scrs primul, nu le putes! sorta in funcyie de numele de familie. ‘© Dac introduceti numele cu numele de familie seris primul, nu le putey afiga cu prenumele scris primul. : ‘© Cautarea in functie de mame este mai dificild. De exemply, pentru a ciuta un anu- mit nume de familie, erebuie si folositi un model sisi cduapi numele care cores- pund acelui model. Aceasti operatie este mai pusin eficient& ji mai lenti decit ‘elutares unui anumit nume de familie. Tabelul nostru sresedinte va folosi coloane separate pentru nume gi prenume, cu scopul de a evita aceste dezavantaje, . Coloana cu prenunele va refine, de asemenea, sal doileaprenume sa inal ai cest lucra nu va intrerupe nic o sortare pe care 0 vom executa, deoarece este putin pro babi si dorim sorearea i funeie deal dofea prenue (sau chiar dups primal prenutye). De asemenea, afgarea numelor trebuie si se produck in mod adecvat, indiferent daci numele este scris in formatul "Bush, George W." sau “George W. Bush”. Al doilea prenuime urme:7l imediat dupa prin a ambele sieuai. . Mai exist o ugcara complicaji, Un presedinte Jimmy Carter) are particula “J.” la sfrgiol rumelaisfu, Unde va fi intodusd aceasta? In funcie de formal inveare sone ate rnumele, numeleacestui presedinte va fi afisat sub forma “James B, Carter Je” sa “Carter, James E, Jn", Particula “Jr.” nu st asociaza nici cu numele, nici eu prenummele, dei vor crea © alti coloani, care va confine sufixul numelui, Acest exemplu ilustreazi modul in care chiar $i o singuri valoare poate cata probleme atunci cind incereai si determinayi modul de reprezentarea datelor dumneavoastri. De asemenea, se arati de ce se recomandi si sti cit mai multe despre tipul valorilor datelor eu care vei luera inainte de ale inseraintr-o bad de date. Deca averi cunostinge incomplete despre aspectul datelor dumneavoastri, s-ar pptea si figiobligat sf modifica structura tabetui dupd ce ai inceput deja si] folosii. ‘Acestfapt mu este in mod necesar un dezastra, dar in general este bine sil evita ‘* Locul nagterii (oras si stat). Ca si numele, si aceastéinformagie poate fi reprezentati folosind wna sat ma multe coloane Este mai simp de folosto singur’ coloans, dar, can cazul numelui, coloanele separate vi permit efectuarea unor operafiigreu de exe- ccutat in alte condigii. De exemple, inregistriile cu presedingii niscuyi in-un anumit stat sunt mai gor de gisit daci oragul si statul sunt enumerate separat. 46 Partea!_Utiizarea generalé a sistemului MySQL © Data nasterié sia decesului, Singura problem specials in acest caz este aceea cf nu putem cere si fie trecurk data morgi, deoarece unii presedingi sunt inci tn viayé ‘MySQL furnizeazi o valoare NULL specialé care inseamna ,firi valoare", pe care 0 putem folosi in coloana cu data mori, pentru a arita ci persoana respectivd triste, Tabelul membru ‘Tabelul menbru pentru lista cu membrii Ligiiistorice este similar cu tabelul presedinte, in sensul cl fiecare fnregistrare confine informasii descriptive elementare pentru o sin- urd persoani. Fiecare inregistrare nenbru confine insi mai multe coloane: ‘¢ Nume. Vom folosi aceeasi reprezentare pe trei coloane ca in cazul tabelului presedinte: nnume de familie, prenume (si al doilea prenume, daci exist), sufix. # Numir de identificare. Aceasta este 0 valoare unict,atribuitdfiectrui membru atunci ‘dnd acesta capatk calitatea respectiva. Liga nu a mai folost niciodatS numere de iden- tifcare, dar acum, cand faregistrrile sunt organizate mai sistematic, este 0 ocazie bund, (Eu anticiper cf veti gsi programul MySQL uti si cd vi vet gindi pila alte moduri de 21 aplica faregistririlor Ligi. Cand acest lucru se va intmpla, inregistririle din tabelul mmenbru vor fi mai usor de asociat cu alte tabele referitoare la membri pe care eventual le vet erea, dact folositi numere in locu! numelor) ‘©Data expiririi, Membrii trebuie si-si pliveasci periodic cotizasia, pentru a evita pierderea calitipii de membru, Pentru unele aplicafii, puteti folosi data pligi ultime’ cotizayi, dar acest lucru nu este convenabil pentru interesele Ligit. Cotizapile pot fi plitite pentru un numar variabil de ani (de regu unul, doi, tei sau cinci ani) iar data lagi ultimei cosizayi au indici momentul cand trebuie pliticd urmftoarea cotizayie, De asemenea, Liga permite calitatea de membru pe viaya. Putem reprezenta accasti informagie printr-o dati din viitorul indepirtat, dar valoarea NULL pare mai adecvati, deoarece ,far% valoare” poate fi asimilat logic cu «nu expiré niciodats". © Adres de e-mail. Pentra membrii care au adresi de e-mail, aceasta le va permite si comunice cu uguringa unit cu alfi. Pe linia indatoririlor dumneavoastra ca secretar al Ligli, aceasta vi va permite of wrimites instiingiri de plata a cotizatiei pe cale electronict simu prin posta clasie¥, ceea ce este mai ugor decit si vi deplasay la post si mai putin ‘ctistor. De asemenes, vefi putes folosi pot electroniek pentra s expedia membrilor conginutul curent al intrrilor lor din catalog gi pentra a le cere si-si actualizeze infor- ‘arile, dack este necesar. 1 Adresi postal’. Aceasta este necesari pentru contactarea membrilor care nu dispun de post electronic’ (sau care nu rispund la mesajele primite). Vom folosi coloane pentru stradf, oras, stat gi cod postal. Coloana pentru strada se poate dubla pentru a include snumirul cutiei postale, pentru acei membri care au 0 adresi precum PO, Box 123 in loc de 123 Elm St. Eu presupun eX tofi membrii Lig locuiesc in Statele Unite. Pentre instiusii ai ciror membri au mai multe nafionalitii, aceastd presupunere este o simplificare excesivi, desigur. Dack dort st utilizayiadrese din mai multe gir, vey! da peste unele aspecte mai ciudate legate de diversele formate de adrese folosite in dferitefiri. De exemplu, codul ‘postal nu este un standard internayional, iar unele firi nu au state, ci provinei. Capitolul 1 Introducere in MySQL siSQL 47 ‘¢ Numi de telefon. Ca pi cimpurile cu adrese, acesta este util pentru contactarea mem brilor. ‘# Cuvinte cheie speciale pentru zone de interes. Se presupue cifiecare membre este interesat de istoria Statelor Unite tn general, dar probabil ci membrii sunt interesati cu precidere de anumite domenii. Aceasti coloana tnregistreaza zonele de interes respective, ye care membrii le pot folosi pentru @ descoperi alsi membri cu interese similare. Crearea tabelelor . ‘Acum, suntem pregitgi pentru crearea tabelelor aferente Ligiiistorice. Pentru aceasta, ‘yor folosi insructiunea CREATE TABLE, care are urmitoarea forma generals CREATE TABLE nune_tabel ( specificatiicoloane ) rune_tabel indici numele pe care doriti sil dari tabelului. spectticatss_cotoa Contine specficagile pentru coloanele din tabel,inclusiv indexurile (dack aveyi vreunul). Indexurile permit ciutiri mai capide; vom discuta despre ele in capitolul 4, .Optimi- zarea interogirilor". Insteuctiunea 2REATE TABLE pentru tabetul presedinte se prezintt astfel: CREATE TABLE presedinte ‘ rnume VARCHAR(15) NOT NULL, prenune VARCHAR(1S) NOT NULL, Sufix VARCHAR(S) NULL, ~ ‘oras VARCHAR(20) NOT NULL, ‘stat /ARCHAR(2) NOT NULL, ata_sastere OATE NOT NULL, data_deces DATE NULL ) ack dori si introducesi personal instructiunea respectiva, invocayi programul sysal, ‘ransformand sanp_db in baz de date curent’: ‘ % mysql samp_db * ‘Apoi, introduce instructiunea CREATE TABLE aga cum s-a aritat mai sus, (Nu itai si adiugayi caracterul puncr gi virgulé la sfargtul instructiunis altfl, nysql nu va sti care ‘ste sfarsitul fastructiunii) Pentru a crea tabelul presedinte folosind un fier eu o descrierescrist anterior din dis- tributia bazei de date demonstrative (vezi ,Objinerea distributiei bazei de date demon- strative"), rulyiaveastS comandi din interpretor: ‘% mysql sinp_db < create_president. sal Indiferent de modul in care invocati nysal, specficatitoti parametrii de conexiune de care avepi nevoie (numele gazdei, numele utlizatorului sau parola) in linia de comands, inte de numele bazei de date. Fiecare specificagie de coloani din instructiunea OREATE TABLE consti din numele coloanei, tipul (genul de valori pe care le va confine coloana) si eventual unele atribute ale coloanei. 48 —Parteal_Utlizarea generalé a sistemului MySQL Cele doui tipuri de coloane flosite in tabelul preseeinte sunt VARCHAR si DATE. VAROHAR(n) arati cl acea coloani confine valori caracter (sir) de hungime varabila, cu o lungime maxi~ ii de n caractere pentru fiecare valoare, Vefi lege valoarea Ii » in funeyie de Lungimea scontati a valorilor. Coloana stat este declaratl ca VAACHAR(2); nu avem nevoie de o va- Toare mai mare, dacd numele statelor sunt introduse folosind abrevieri din dowa caractere. CCelelaltecoloane cu valor gir trebvie si fie mai late, pentru a permite insestia unor valosi rai lungi. CCelilal tip de coloans pe care I-am folosit este DATE, Acest tip indict, deloc surprinzitor, acca coloan’ congine valori de tip dati calendarisic3. Totusi ceea ce vi poate surprinde este cl datele sunt reprezentate incepind cu anul. Formatul standard este *AARA-LL-22" (de exemplu *1999-07-18"). Acesta este standardul SQL ANSI pentru reprezentarea datelor calendaristice. Singurele atribute de coloand pe care le folosim pentru tabelul presedinte sunt NULL (alorile pot lipsi, respectiv noT NULL (valorile trebuie introduse). Majoritatea coloanelor au valoarea NOT NULL, deoarece avem intotdeauna o valoare pentru ele, Cele doud coloane care pot avea valori NULL sunt sufx (majoritatea numelor nu au aga ceva) sigata_deces (unii pregedingi sunt inci in viagi, deci nu existi o dati a decesului). Instructiunea CREATE TABLE pentru tabelul nenbru se prezinti astfl: CREATE TABLE aoxbeu ( rrume VARGHAR(20) HOT NULL, prenume VARCHAR(20) NOT NULL, sufix VAROHAR (5) NULL, data_expirare DATE MULL DEFAULT "0000-00-01 cenadl. YAAGHAR(100) NULL, Strada VARCHAR(SO) NULL, foras VARCHAR(50) NULL, stat VARCHAR(2) NULL, cod_postal VARCHAR(10) NULL, ‘telefon VARGHAR(20) NULL, 20 VARCHAR (255) NULL Ante: ) “Tastati aceasta instructiune fn nysql sau executati urmitoarea comands de interpretor: ‘% mysql sanp_db < create_nenber.sal {In ceea ce priveste tipurile de coloane, tabelul nenbru mu este foarte interesant;fiecare coloani, ci o singuri except, este cresti sub forma unui sir de lungime variabils. Excepfis, data_oxpirare, este de tip osTe. Valoarea prestabiliti a datei de expirare este 0000-00-00", care este o valoare de tip non-NULL, ce indicd faptul ed nua fost introdusa nici o dati corecta. Motivul este c& data_expirare poate avea valoarea NULL pentru a arita cd un membru are aceasti calitate pe o perioadi nelimitati de timp. Tory, deoarece coloana poate avea valoarea NULL, aceasta devine valoarca prestabiliti dacS mu specificayio altd valoare. Daci afi creat un membra nou, dar ai uitat si specifica data ‘expiririi, membrul respectiv va deveni membru pe viayi! Folosind valoarea prestabilitd Capitolul 4 Introducere in MySQL siSQL 49, 0000-00-00" vom evita aceasti problema. De asemenea, avem 0 valoare pe care 0 jputem cituta periodic, pentru a gasi inregistrrile unde data expiriri au a fost niciodaté Introdusi in mod adecvat. Refineyi ci am omis” si inserez.0 coloant pentru numirul de identificare al unui mem- bpra, Aceasta deoarece am nevoie de un pretext ca si folosesc comanda ALTER TABLE mai tirziu, iar omiterea acestei coloane furnizeazi un atare pretext. Si verificim ci MySQL a creat tabelele conform astepticilor. In aysq2, emitegi urmi- toarea inverogare: ysql> DESCRIBE presedints ‘Field Type | Null! Key | Default Extra rune ‘varchar(15) ey : prenuse | yarenar(15) surix wrona(5) | YES ULL oras varchar(20) | stat char (2) data_naszere 0000-00-00 datas ves ULL Ca in cazul versiunii MySQL 3.23, datele de iesire includ incl o coloani, care prezinté informagii_privind privilegile de acces. Nu am prezentat aici coloana respectivi, deoarece randurile devin prea lungi pentru a putea fi afiate cu ugurings. Datele de iegire sunt conform asteptitilor, cu excepyia faptului cl se precizeazi cd tipul coloanei stat ee char (2). Ciudat; au am delarat coloana'e find de tip YAROHAR(2)? Ba da, am declarat-o, dar MySQL a modificat ,pe sest* tipul din VARCHAR in CHAR. Motivul acestei aciuni este legat de eficienta spayiului de stocare pentru coloanele scurte cu date de tip caracter, despre care nu vom discuta in detaiv aici. Dacf doriti detalii, consultati paragrafele dedicate instrucfiunii ALTER TABLE din capitolul 3, ,Sintaxa gi uti- lizatea SQL in MySQL", care contin detalii, Pentru noi, in acest moment, nu exist nici o diferenglintre cele dou tipuri. : act emiveyo interogare DESORISE senbru,atunc mysql vi va prezentayinformaii sim lare pers abel ner, ce. ee Incerngarea DESEAZSE este util atunc! eénd witafi mumele unci coloane din tabel, cind teebuie si sii pul coloanei, cind trebuie si tii care este lifimea coloane! gi altele. De semenea, este url pentru a alla ordinea in care MySQL stocheazii coloanele in randurile tabelului. Ordinea respectiva este importanti atunci cind folosigiinstructiunile anseat Seu LOAD ra cre prespon afara valor din eoloane Tn ondnes pret a coloanelon DescAzBE se poate abrevia sub forma DESC sau, dack preferagi si tastagi mai mult, SHOW COLUNS FRO nane_tabol este sinonim cu DESCRIBE nune_tabel $idact uitayi numncle tabelelor dumneavoastrX? Atunei putefifolosi SHOW TABLES. Pentru bbaza de date sanp_db, care confine cele dows tabele pe care le-am creat pang acum, datele\s Ae iesire ale comenzii se prezint’ astfel: 50 Parteal__Ultiizarea generalé a sistemului MySQL aysql> SHOW TABLES: FYables_in_samp_db senbru Sresedinte Daci nu revsi nick macars& vi ream specifica un nume al bazei de date in DATABASES: nysal> SHOW DATABASES; ji oumele bazei de dats, invocati nysa) fir a ia de comand; apoi emitepi o interogare SHOW ‘Database Urenajerie aysal. Lista cu baze de date variaza de la un server Ia altul, dar trebuie ca in list sf apari cel putin saap_do si nysql; ultima congine tabelele de acordare, care controleaza privilgiile de acces MySQL. Interogiirile DESCRIBE gi SHOW au echivatente in linie de comandi pe care le puteti folosi din interpretor % nysalshow % aysqlshow nune_db ‘AfigeazX toate bazele de date, ca SHOW DATABASES ‘Afigeaza tabelele din baza de date dati, ca SHon TABLES ws mysaishow nune_db nume_tabel Afigeazi coloanele din tabelul dat, ea DESCRIBE ‘rume_tabel Tabele pentru proiectul de evidenfé a rezultatelor gcolare Pentru a vedea care sunt tabelele de care aver nevoie pentru proiectul de evident arezul- tatelor scolare, si examinim modul in care se pot serie punctajele arunei cand folosgi ua catalog pe hirtie. Figura 1.2 prezinti o pagind din catalogul dumneavoastr3. Conginurul principal al acest pagini este o matrice pentru inregistarea punctajelor De asemenea, se Imai afld i alte informagii necesare pentru injelegeres punctajelor, Numele elevilor $3 numerele de identificare sunt prezentate in partea de jos a matrcei. (Pentru simplitate, au fost prezentate numai notele a patru elevi,) De-a lungul pirgii de sus a matrice, sriyi datelechestionarclor gi ale testelor. Figura arati ck afi dat chestionare pe 3, 6,16 s8 23 sep tembrie, respectiv teste pe 9 septembrie, respectiv 1 octombrie. Pentru a pistra evidenya acestor tipuri de informatiifolosind o baz de date, avem nevoie de un tabel puncte. Ce trebuie si contin’ inregistririle din acest tabel? Simpl, Pentru fiecare rind, avem nevoie de numele elevului, data chestionarului sat a testalsi si punctajul objiaue, Figura 1.3 prezint3 aspectal unor note din catalog atunei cand sunt Feprezentate intr-un tabel ca acesta. (Datele sunt scrise in modul tn care le reprezint MySQL, respectiv “AAAA-LL-22",) Capitolul 1 Introducere in MySQL. si SQL 51 Ew Pancie core ct 1D ume | 93 916 9m a6 eva tor Bly | 4] 0] | % | 1 |e Missy | x7 | 10 | 68 | a7 | 4 | 73 n @ . sotory | 18 | 10 aii somy | 148 | 13 | as | 13 | 28 Figura 1.2 Exempla de catalog. “abel puncte ume Data | Pande Bily | taas0e23 | 18 Missy | 19990823 | 14 Jotony | 19990823 | 17 Jenny} 19980823 | 19 Bily | sg96001 | or Misty | rooet001 | 73 Johnny | rovei001 | a2 ony | 1908-001 | 79 Figura 1.3 Aspectul inijial al tabelului puncte. “Totusi, a cotfigurarea tabelului fn acest mod apare o problemi. Se pare ci tabelul omite uncle informagi. De exemplu, daci examinim inregistririle din figura 1.3, nu ne putem da seama dact punctaele au fost obyinute la un chestionar sau la un test. Este important si stim tipurile de punctaje la determinarea notelor finale, daci chestionarele i testele au ponderi diferte. Putem incerca si deducem tipal examinarii din plaja de rezultaze de la anumiti dati (de reguli, la chestionare se obtin mai pugine puncte decit Ia teste), dar ru este convenabil, deoarece ne bazim pe deductie si mu pe date explicit. Se poate face deosebire intre punetaje mentionind tipal acestora in fiecare inregistrare, de exemplu grin adiugarea unei coloane in tabelul puncte care contine lterele T sau ¢ in ficcare rand, pentru a indica ,test” sau ychestionar™, aga cum se poate'vedea in figura L4 Acest procedew are avantajul ci pul punctajulti devine explicit in cadrul datelor. ‘Dezavantajul este ci aceste informayii sunt oarecum redundante. Remarcafi ci, pentri toste inregistirile cu o anumiti dati, coloana cu tipul punctajului are ineotdeavna aceeasi valoare, Punctajele pentru 23 septembrie au toate tipul 6 iar rezultatele pentra 1 ‘octombrie sunt toate de tipul T. Neplicut. Dac’ inregistrim un set de punetaje pentru un chestionar sau pentra un test in acest mod, nu numai ck vom scrie aceeagi dati pen- ‘ru fiecare inregistrare nou’ din set, dar vom serie mereu si mereu acelagi tip de punctaj UL... Cine si serie oace aceste informatii redundante? Sa incercim o reprezentare alternativa. {n loc de a inregistra tipurile de punctaje in ta- belul puncte, le vom deduce din datele calendaristice. Putem pistra o list cu date calen- daristice si o putem folosi peneru a pistra evidenta tipului de examinare" (chestionat, sau test) care a avut loc la fiecare datS, Apoi, putem determina daca un anumit punctaj «fost obsinut la un chestionar sau la un test prin combinarea acestuia cu informafile din lista noastré su evenimente: se stabileste o echivalentsintre data din tabelul puncte cu stator site 52 Parteal_Usiizarea general a sistemului MySQL data din tabelul eveninent pentru a determina tipul de punctaj. Figura 1.5 prezines aceasti. machetd de tabel si demonstreaz modul in care aceasti asociere functioneaz’ pentru o inregistrare din tabelul punete care poarti data de 23 septembrie. Prin corobo- ‘area inregistriii cu inregistrarea echivalentd din tabelul eveniment, vedem ci punctajul fost objinut la un chestionar. “Tabolul_puncte ‘Nume ata | Pande | Tp ‘Bay | tese0ez8 | as | c Missy | 9050023 | @ | ¢ | sohnny | 10950023 | 7 | oc leery’ | 19980023 | w@ | By” | rwootoor | a | Missy | rgostoor | 73 | ot omy | tespsoot | a | oT } semy | roopsoor | 9 | Tt | Figura 1.4 Macheta tabelului puncte, revizui pentru a include tipurile de punctaje “Tabelul_punote “ebolul eveninent Nome Data | Punde Data 7 | ‘ity | 1966-0025 | 15 ‘se5.0008 | —c j Cosy 4 ts050506 | ven 7 19550900 | siemy | 19080823 | 19 yege06-16 |g boy | teee-1001 | 67 en | missy | 966-1001 | 73 se09-1001--| 1 | Johnny | 1956-4001 | 82 denny | teee001 | 70 Figura 1.5 Tabelele puncte si evensont, legate prin dati Este mult mai bine decit si incercati a deduce tipul punctajului ,pe ghicite¥; tn schimb, ‘obsinem tipul direct din datele inregistrate in mod explicit in baza noastra de date, De asemenea, este opfiune de preferat f3 de inregistrareatipurilor de punctae to tabelul | puncte, deoarece trebuie si inregistrim fiecare tip o singurd dati. Tony, dack suntepi ca mine, cénd auzipi pentru prima dati de acest lucru (combinarea inforatiilor din mai multe tabele) va gandigi: .Mda, buna idee, dar e multa muned st faci mereu toate ciutirile alea; nu complicim hucrurile?" Jntr-un fel aveti dreptate, Folosirea a dous liste cu Tnregistriri este mai complicatk decét folosirea unei singure liste. Dar si mai privim o dati la catalog (veri figura 1.2). Nu aveti | deja doui sevuri de inregistriri? Tineyi cone de urmitoatele aspecte: | ‘ Pistrasi evidenga punctajelor folosind celulele din matricea tabelului puncte, unde | Ficcare celui est indexati de numele elevulu i datd (in jos pe lateral si de-alungul | piri superioare a matrice). Acesta reprezint’ un set de inregistri este analog cu | } confiautultabeuluipunetas. ‘© Cum procedayi pentiu a gi tipul de eveniment pe care Hl reprezine fecare dati? Afi seris un T sau ua G mic deasupra fccrei dae! Astll, istry evidents aster nse dati tipol punctajulu,de-s ngul piri de sus matric. Acestareprevinl un al doilea set de inregistriri, este analog cu consinutul tabelului evensnent. | Capitolul 1 introducere in MySQL siSQL 83, Gu alte cuvints, chiar dict au constientizati acest lucra, in realitate utiizati catalogul fntr-un mod absolut similar cu cel propus de mine, de pistrare a informatiilor in dows tabele, Singura diferengi reali este cd acele dou categorii de informagii nu sunt separate {in mod atat de explicit in catalog. Pagina din catalog ilusteazi intr-un fel modul in care noi gindim informatile, precum si dficultatea determinirii modului de a plasa informayiile intr-o bazi de date: noi tin- dem si integrim diferitele categorii de informasii si si le interpretim ca pe un fntreg. Bazele de date procedeazi altfel, motiv pentru cate par uncori artfcile ji nenaturale, ‘Tendinga noastri natural de a unifica informatie ingreumeazi uneori pani gi sesizarea faptului eX aver mai multe tipuri de date, nu doar unul singur. Din aceasta cauzi, incer- ‘area de a ,ginci ca o bazi de date" in ceea ce priveste modul de reprezentare a datelor poate fio mare problem © ceringi impusi tabelului eveninent de macheta preventati in figura 1.5 este aceea ca datele si fie unice, deoarece data este folositi pentru a corela inregistrarile din tabelele puncte si eveninent. Cu alte cuvinte, nu puteri da doua chestionare in aceeai zi, respec- tivun chestiona: gi un test. Dacd o facet, vetiavea douk seturi de tnregistriri in tabelul puncte si dou inregistriri in tabelul eveninent, toate cu acecasi dati, gi nu vefi mai putea stabili o corespondeni tntre tnregistririle din cele dou tabele. Aceasta este o problemi care nu va apiirea niciodati daci inu-o 2i survine o singur¥ exami- sare, dar putem presupune in mod coreet ef acest lueru nu se va intimpla? fn aparenti ispunsul este afirmatiy la urma urmelor, nu suntey atit de sade incat si api un chestionar sin test in aceeag zi. Dar sper cl mi vet ierta dack sunt sceptic. Am auzit deseori oameni care spun despre datele lor: ,Acest caz ciudat nu se va fatimpla niciodati* Apoi, se dovedeste cf acel caz ciudat ciar se produce cu o anumiti ocazie gi de reguld este necesar sivd re;proiecta tabelele pentru a remedia problema pe eare a ceuzat-o acel caz ciudat. Este mai bine s4 anticipati posibilele probleme si modul de a le rezolva, Dec, s& presu- ‘Punem ci uneorisuntet in situapia de ainregistra dova seturi de punctaje pentru aceeasi 2, Cum ne putem descurca? Aga cum se va vedea, nu este o problema chiar atat de di cil. Cu o mict rodifcare in modul de dispunere a datelor aparigia may maltor eve ‘mente la 0 anumiti dati nu va provoca necazuri: 1, Adtugayi o coloand la tabelul eventnent gi folositi-o pentru a+ atribui un num unie ficcirei inregistriri din tabel. Astfl,fiecere eveniment va avea propriul siu numar de identificare, deci coloana va avea numele eveniment_id. (Daci pare ciudat, catalogul din figura 1.2 are deja aceastt proprietate: identficatorul de eveniment este similar numirului coloanei din matricea cu punctaje din catalog. Se poate ca numirul si na fie seris ia mod explicit si denumit ,identficator de eveniment*, dar este chiar un identficator de evenimente.) 2. Cind inserasi punctaje in tabelul puncte, inregisteayi identficatorul de eveniment in locul datei. Rezultatul acester modificiri este prezentat in figura 1.6, Acum, coroborafi tabelele puncte si evenirent folosind identificatorul de eveniment in locul date! si utilizati tubelul eveninent pentru a determina au numaitipul fiecirsi punctaj, dar gi data la care «fost objinut acesta, De asemenea, elementul unic din tabelul evensnent nui mai trebuie 54 Parteal_Uilizerea general a sistemului MySQL si fie data, ci identificatorul de eveniment. Aceasta inseamnii cd puteri avea zece teste chestionare in aceeasi zi; puteti pistra evidena lor corectd in scriptele dumneavoastri, (ndiscutabil, elevii dumneavoastré vor i extrem de inc&ncafi si alle acest lueru,) Din picate, din punet de vedere al operatorului uman, macheta de tabel din figura 1.6 pare mai pusin satisicitoare decit cele anterioare. Tabelul puncte este mai abstract, deoarece confine mai puyine coloane cu o semnificatie evident’. Macheta de tabel prezentati anterior in figura 1.4 era usor de examinat si de injeles, deoarece tabelul punete avea coloane atit pentru date, cat si pentru tipusile de punctaj. Tabelul puncte actual, prezentat in figura 1.6, nu are coloane pentru nici una din aceste informatii, ceca ce pare serios deplasat far de normal, Cine vrea si citeasca un tabel puncte care congine +identificatoare de eveniment" ? Pentru noi, aceast3informagie nu are o semnificatie prea important Tabeul puncte “bbeld eveninent [heme _levensrent ig fovensnent_ia] Dea | To [any fs + | aieaeas | c (inss 2 | teseaea6 | “oben $ 3 | sssoa6a6 | Seen) 5 jo000046| iy 6 900023] -6- 1} Misoy 6 ‘e001 7 shen 6 Jenny 6 Figura 1.6 Tabelele puncte gi eveniment, legate dupa identificatorul de eveniment. Acum af ajuns la o riscruce. Suntetiinteresat de posiblitatea de a putea pistra evidenta electronick a rezultatelor scolar side a nu trebui si efectuag tot felul de ealeule manuale obositoare atunci cind atribuigi notele. Da, dupa ce vi gandigi la modul in care vi reprezenta informatiile despre punctaje int-0 baz de date, suntefi descurajat de aspec- tl abstract gi discontinuu al informasicireprezentate in acel mod. Neen seu deb ofsebares-Na fibine ol na folonse delaco han de de? oate ci MySQL mu este pentru mine." Aga cum puteyi intui, voi rispunde negativ la es vi gindipi cum si faceyi un lueru anume, este bine si aveyi in vedere diferite alternative sisi vA Intrebagi daci n-ar fi mai bine si folositi un sistem de baze de date, cum este SQL, sau alteeva, cum ar fi un program de calcul tabelar: © Catalogul are rindutri si coloane, ca gio foaie de calcul tabelar. De aceea, 0 foaie de eal- cul tabelar si un catalog sunt foarte aseminitoare atit vizual, eit si conceptual, fntr-o foaie de calcul tabelar se pot efectua caleule, deci puteti insuma punctajele fieiru elev folosind un camp de calcul, Ete pufin mai greu 51 acordai © pondere diferik chestionarelor si testelor, dar nu imposibil, Pe de ati parte, daci dori si examinagi numai o parte a datelor dumneavoasted (numai chestionarele sau numai testele, de exemplu), si faceti comparafii (intre notele baietilor sicole ale fetelor) sau 83 afigai informatii de sumar intr-un mod flexibil, datele proble- mei se schimb&. O foaie de calcul cabelar nu funcyioneazi atit de bine, in timp ce sis- temele de baze de date relayionale executi cu usuringé aceste operagi. Capitolul 1 Inttoducere in MySQL siSQL 55 ‘Unalt clement care trebuie avut in vedere este aceea cl natura abstracts discontinus a davelor reprezentate intr-o baz’ de date relafionalé nu este, la urma urmelor, o problemi ore de mare. Trebuie si vi gandipi la acea reprezentare atunci cind configurati baza de ‘tte, astfel incit si nu vi dispunesi datele intr-un mod lipsit de sens in raport cu felul in Gare dori i leutlizayi Towusi, dupi ce agi determinat modul de reprezentare, vefi conta pe motorul de baze de date pentru adunarea si reprezentarea datelor dumneavoastri Fiurun mod semnificativ. Nu veyi mai privi datele ca pe o adunituri de componente fi legitued intre de. De exemplu, cind registi punctaje din tabelul punete, mu dorgi si vedey identficaroare de eveniment, dori si vedei date. Aceasta nu este 0 problemé. Baza de date va ciuta arele din tabelul eveninent in funcrie de identificatoral de eveniment svi le va prezenta. De asemenea, putesi dori si vederi dack punctajele au fost obsinute la chestionare sau teste, Nici aceasta nu este o problemi. Baza de date va cfuta tipurile de punctaje in celasi mod: felosind identficarorul de eveniment. Nu uitayi acesta este ,punctul forte” al unui sistem de baze de date relafionale ca MySQL: corelarea unui lueru cu altul pentru a extrage informagii din mai multe surse si de a vi prezenta datele pe care doriti si le Sede. In cazxl datelor noastre de evident’ a rezulatelor seolare, MySQL este cel care unt informcpile la un loc folosind ideneificatoii de eveniment, pentru ca dumnea- ‘oastri si.au mai efectuatiaceasti operat. ‘Acum, pentru a da o micd idee yin avans" cu privie la modul in care ceretisistemulai MySQL si execute aceasti corclagie ttre lucruri, si presupunem ci dorigi si vedesi ppunctajele obyinute la data de 23 septembrie 1999. Interogyzea pentru extragerea punc- tajelor aferente unui eveniment produs lao anumitd dati se prezints astfel SELECT puncte.nune, eveninent-data, puncte.puncte, eveniment.tip FOU puncte, eveninent HERE evorinent.data = "1999-09-20" ‘AND puncte.eveninent_id = evoninent.eventment_sd Cam de speriat, este? Accastt interogare regiseste numele elevului, data, punctajul si tipul punctajului prin alicurarea (corelarea) inregistririlor din tabelul pinete cu inregis- trirle din tabelul eveniment. Rezultatul arat asf une oata puncte | Tip! Billy | tog9-09-2915, 19 Missy | 1990-09-2914 14 Gonnty | 1999-08-2917 | 17 Uenny 1999-08-2319 19 Formatul acestor informatii vi_,suni eunoscut? Ar fi si cazul este acelagi cu macheta tabelului prezentat tn figura 1.41 Nu trebuie si cunoasteti identificatorul de eveniment pentru a obfine acest rezultat. Specificayi data care vi intereseaza si lisa sistermul MySQL si determine inregistririle din abelul puncte care corespund datelor respective, ‘Dack vali int-ebat in ce misura din cauza aspectulu abstract yi discontinus se wpierde**, ‘ceva in ceca ce priveste preluarea informarillor dintr-o baza de date intr-o forma semai- ficativi pentra noi, rispunsul este: mu se pierde nimie. 56 Parteal_Uliizarea generald a sistemulul MySQL Desigus, dup ce afi examinat aceasté interogare, vi mai putesi pune gi ali intrebare. Instructiunea pare cam lungi si complicari; nu pare o cantitate cam mare de munci numai pentru regisirea punctajelor obfimute lao anumiti data? Ba da, este, Totusi, exist metode de a evita tastarea mai multor randuri de instrucfiuni SQL de fiecare dati cind dosti sX emiveyio inverogare. In general, determina o singuri datk modul de a executa 6 interogare ca aceea si apoi 0 stocafi, pentru a o putea repeta cu usuringé atunci cind ‘este necesar. Vom vedea cum se procedeazi in sectiunca ,Sugesti pentru interaeyiunea cu MySQL". fn realitate, am cam exagerat punind pe tapet acea interogare, $i totugi interogarea respectivi este, eredepi sat nu, ceva mai simpli decit cea pe care 0 vom folosi efectiv pentru extragerea punctajelor. Motivul este ci trebuie si mai facem o modificare in structura tabelului, In loc de a inregistra numele elevului in cabelul puncte, vom folosi un identificator de clev unie. (Adie vom folosi valoarea din coloana ID a catalogului in locul valorii din coloana Nume.) Apoi vom eres un alt tabel, denumit eley, care congine coloanele nue si elev_id (Figura 1.7) Tabsul elev Tabalul puncte Tebeul_eveninent Mune [Se etev_aa| lovensnont_se] Anco] [eveniment ial Osta | Th] ay fut 1 5 5 1 | roveaoas [c Missy [-F [2 peel 2 4 2 — | 19990908] ¢ sey |W] 3 5 7 3 | resea609 | | omy |e] 4 4 5 8 4 | seep.05.16| 5 é or 19980825 |. 6 5 3 6 fe99-1000[ 1) 1 5 2 8 5 8 Figura 1.1 Tabelele elev, puncte si eveninent, legate prin identificatorul de elev si identificatorul de eveniment. De ce si facem aceasti modificare? fn primul rind pentru ci pot fi doi elevi cu acelasi ume, Utilizarea unui numir unic de identificare a clevului vi ajuti si faceyidiferenga dintre punctajele elevilor. (Este exact acelagi lucrt ca gi diferengierea intre punctajle cobyinute a un test sila un chestionar date in aceeag i prin utilizarea in locul date a unui | identifieator unic de eveniment.) Dupi aceasti modificare a machetci tabelului, interogarea pe care 0 vom folosi efectiv pentru extragerea punctajelor aferente unei anumite dace devine pusin mai complex SELECT elev.nune, eveninent.data, puncte.puncte, eveninent.tip FROW venient, puncte, elev WERE eveninent.data = "1999-09-23" AND eveninent.eveninent_id = puncte.eveninent_id ‘Avo puncte.elev_id = elev.elev id Daci vi ingeijoreaza faptul cX nu putefi determina imediat semnificatia aceleiintecogiv, linigtii-va. Majoritatea oamenilor nu sunt in stare de aga ceva. Vom revedea interogarea dupi ce vom continua parcurgerea acestui manual, dar diferengafntre acum si mai tirziu este ef mai tirziu o vei ingelege. Nu, nu mi yin de bancuri Capitolul 1 Intosucere in MySOL siSQL 57 Din figura 17, veti observa ci am adiugat ceva la tabelul elev care nu exista in catalog: fo coloani pentru sex. Aceasta va permite efectuarea unor operat simple, precum sumararea biietlor gi a fetelor din clas, respectiv mai complexe, precum compararea punctajelor baietilor cu cele ale fetelor. Suntem aproape gata cu tabelele pentru proiectul de evident a rezultatelor scolare. Mai avem nevoie de un singur tabel, pentru inregistrarea absenjelor in vederea determinirii prezente la curs. Continutul acestuia este relativ simplu: un identificator numerical ele- ula gio da (veri figura 1.8) Fiecare and din tel aac ck elvel espeeti a fost absent la acea dati. La sférsitul perioadei de notare, vom apela la caracterstcile de rumirare ale sistemului MySQL pentra a rezuma conjiaueul tabelulus, astfl incit si stim de cite or a fost absent fiecare elev. Tebalul absente fotev ic] Data 2 | 1ose09-02 4 | 1958.09.15, 2 | 1998.09.20, Figura 1.8 Tabell absente, Suntem gata dea crea tabelele noastre de evidengé a rezultatelor scolare, acum cn stim cum vor ardta acestea, Instructiunea CREATE TABLE pentru tabelul eLev araté ast CREATE TABLE elev q ‘mune VARCNAR(20) NOT NULL, sex ENUM(*F',"M") NOT MULL, olov.t4 INT UNSIGNED NOT NULL AUTO_INGREMENT PRIMARY KEY ) ‘Tastayiaceastéinstrucjiune in eysah sau executati urmitoarea comandi de interpretor: ‘© mysq2 sanp_tb < create_student.sal a Instructiunes CREATE TABLE creeazi\ un tabel denumit elev cu trei cdloane: nue, sex si elev id, rune este 0 coloand sir de lungime variabilf, care poate confine maximum 20 de carac- tere, Aceasté reprezentare a numelor este mai simpl& decit cea folosité pentru tabelele Lig istorice, folosind o singur’ coloan’ in locul unor coloane separate pentru nume si presume. Actasta deoarcce stiu dinainte cf nici un exemplu de interogare privind evi- denga rezultatelor scolare nu va trebui si efectueze vreo operajie care s-ar preta mai bine la dou coloane. (Da, trisez, Recunose.) sex determini dact un elev este bilat sau fata. Este o coloani de tip Enum (enumerare), ceca ce insearnnd ci poate lua numai una din valorile enumerate explicit in specificai coloanei, in spetd sau F,adici de sex masculin sau feminin, ENvu este util cind averi ug set limitat de valori pe care le poate confine o coloana. Am fi pueut folosi in schimb* (1R(1), dar ENUM specific mai exact care pot fi valorile din coloana. Dack emiteti 0 instructiune CESCRIBE nune_tabe} pentru un tabel care congine o coloani ENUM, MySQL. viva indica exact care sunt valorile posibile, Partea | 58 Uttizarea goneralé a sistemului MySQL. Apropo, valorile dintr-o coloani ENUM nu trebuie si fie neapSrat compuse dintr-un sin- gur caracter. Coloana tip ar fi putut fi declaratiastfel: ENWW (‘feminin’ ‘nasculin'). elev_id este 0 coloan de tip intreg care va conyine numere unice de identificare a dlevilor. In mod normal, vei primi numercle de identificare a elevlor de la 0 sursi cen- trali, cum ar fi secretariatul coli, dar noi vom folosi valori inventate. Declarayia coloanei elov_id are numeroase pirti, chiar dack nu congine decit numere: (© tht arati ci in coloand sunt incluse mumere intregi(valori firk parte fracfionara) ‘¢ unstoNeo incerzice utilizarea numerclor negative. NOT NULL inseamné ci valoarea coloanel trebuie completatd. (Nici ua elev nu poate fi lipsit de un numar de identifcare.) © AUTO_INOREMENT este un atribuc special in MySQL si functioneazi astfel: daci valoarea din coloana elev_ic lipseste (sau este MULL), atunci cénd creafi o noua inregistrare in tabelul elev, MySQL genereaz’ automat un numir unic cu o unitate mai mare decie valoarea maxim care se afla tn coloani ls momentul respectiv. Vom folosi acest fapt la incircarea tabelolui elev, specificand valori numai pentru coloanele nune si sex si per~ migind sistemului MySQL si genereze automat valoarea coloanei otev_i¢. ‘© panueny KEY arati cK acea coloand este indexati pentru ciutiri rapide si ci fiecare valoare din coloani trebuie si fie unic3. Aceasta ne impiedici si folosim din greseali acelasiiden- tificator de doua ori, ceca ce este o proprictate necesari a numerelor de identificare a clevilor. (Nu numai ati; MySQL impune ca fiecare coloant AUTO_INCRENENT si aibS un | indice unic.) Daca mu infelegeti toate chestile astea despre AUTO_INCHEMENT si PRIMARY_KEY, gindiqi-vi ch ele reprezinta 0 modalitate magici de a genera numere de identificare pentru fiecare clev, Nu conteaza valorile in sine, atita vreme cit sunt unice. Nott: Daci aveati de gind si lua identificatoarele numerice ale clevilor dela secretariat (iri si le generati automat), puteyi declara coloana etev_idn acelasi mod, cu deosebirea cd veyi omite assbutul aUTO_INGREMENT. ‘Tabelul eveninent se prezincé astfel: CREATE TABLE oveninent ( ‘data OATE NOT NULL tip EMMC'T®,°0°) NOT NULL, feveninent_id) INT UNSTONED NOT NULL AUTO_INCREMENT PRIMARY KEY ) . “Tastaiinstrucyiunea de mai sus in mysq} sau executati urmatoarea comand de interpretor ‘© mysql samp_db < create_event.sql ‘Toate coloanele sunt declarate ca NOT NULL, deoarece nu poate lipsi valoarea nici uneia dintre ele. Coloana data conyine o valoare DATE standard MySQL, in format *AAAA-LL-22" (cu anul sexis primul). tip reprezinti tipul punctajului, Ca gi sex din tabelul etey, tip este 0 coloank de tip enumerare, Valorile permise sunt T $10, reprezentind test", respectiv ,chestionar* Capitolul 1 Introducere in MySQL siSQL 59 ‘evoninent_id este 0 coloand AUTO_INORENENT, similaré coloanei elev_td din tabelul «lev. Usilizarea optiunii AUTO_INGREMENT ne permite si generim cu upurintd valor uni ale identificatorilor de eveniment, Ca in cazul coloanei etev_id din tabelul etev, valo~ file particulare sunt mai putin importante decat unicitatea lor. Tabelul puncts aratd astfel: CREATE TABEL puncte ( eley_id INT UNSIGNED NOT NULL, fevendvent_id INT UNSIGNED NOT MULL, punctaj INT NOT NULL, PRIUAIY KEY (eveniment_id, elev_id) ) ‘Tastaiacea instructiune fn aysq2 sau executafi urmitoarea comandé de interpretor: % nysql samp_db < create_score.sql punete este 0 zoloank INT (intreg). Cu alte cuvinte, se presupune ci valorile punctajelor sunt ntotdeavna intregi. Dack dori si permite includerea unor punctaje precum 58,5, care congin o parte fractionar, vet folosi unul din tipurile de coloani cu virguli mobili, precum FLOAT sau DECIMAL, Coloanele etey_id si eveninent_id sunt intregi care reprezinti elevul si evenimentul pentru care a fost acordat ficcare puncta). Folosindu-le pentru a stabili legituri intre tabelele elev gi eventnent, vom putea determina numele elevului si data evenimentulwi De asemenca, am transformat combinatia dintre cele dou coloane intro cheie primar (Pmruany KEY, Astfcl, ne asigurim ci nu vom avea punctaje repetate pentru un elev la tun test sau chestionar dat. De asemenea, modificarea ulterioar’ a unui punctaj este mai simpli. De exzmplu, cind un punctaj a fost introdus incorect, puter elimina tnregis- trarea veche stunci cind inserim fnregistririle noi, folosind instructiunea MySQL REPLACE. Nu este mecesar si folosim o instructiune DELETE combinati cu INSERT; MySQL executd automat aceastt operati . [Retinet unicitatea combinafiei tnt coloancle eveninent_i gi elev_sdsfn tabelul puncte, nici o valoare nu este intrinsee unieS. Vor exista mai multe inregistrii dé punctaje pentru fiecare valoare eveninent ta (cite una pentru fiecare elev), respectiv mai multe inregistrisi pentru fiecarevaloare etev_id (cite una pentru fiecare chestionar sites). ‘Tabelul absen:e pentru determinarea prezentei la curs se prezinté astfel: CREATE TABLE absente a eley_Id INT UNSIGNED NOT NULL, ata OATE NOT NULL, PRIMARY KEY (elev id, data) ) ‘Tastai instructiunea respectivi fn mysq2 sau executati urmitoarea comandi de interpretor ‘% mysql samp_db < create_absence.sql 60 —Parteal’_Utllzarea generalé a sistemului MySQL Coloanele eiev_sd si data sunt ambele declarate NOT MULL pentru a interzice absenga va lorilor. Vom transforma combinatia dintre cele dou’ coloane intr-o cheie primari, astfel fncit sf nu ereim din greseali inregistriri dublate. La urma urmelor, nu-i frumos si pui absengé unui elev de doui ori fnte-o zi! Adaugarea de noi inregistrari mn acest moment, baza noastri de date si tabelele au fost create, iar fn secyiumea urms: toare, ,Regisireainformatilor“, veg afla cum se pot extrage datele din baza de date. Mai ‘nti insf, trebuie si inserim uncle inregistrisi fn tabele, Exist numeroase modalitigi de a adiuga date int-o baz de date. Putey insera manual inregistrieiintr-un tabel emitind instrucgiuni INSERT. De azemenca, puteyi adiuga inre- gistriri ctind-le dintr-un fsier, fie sub form’ de valori de date brute pe eaze le inckrcagi folosind instructiunea LOAD DATA sau utiltarul nysqlinport, fie fa forma de instrucfiuni INSERT redactate anterios, pe care le introduceyi fn aysal. Aceasti sectiune ilustreazi fiecare metodi de insertie a fnregistrirlor in tabelele dum- neavoastri. Ce averi dumneavoastrl de ficut este si vl casi cu diferitele metode, pentru a vedea cum functioneaz. Apoi, deplasat-vi la sfarstul seesiuni si rulagi comenzile pe ‘are le gisigi acolo pentru a sterge contimutul tabelelor si pentru a le eincirca, Astfel, vi ‘efi asigura ci tabelele contin aceleas inregistrir a care am lucrat cind am scrs secgiunea, “urmatoare, iar dumneavoastei veti obyine accleasi rezultate. Si fncepem si adiugim rezultae folosind 1NseRT, o instrucsiune SQL pentru care specifi- cati tabelul fn care dorigi si inserasi un rind de date gi valorile care vor fi plasate in rindul respectiv. Instructiunea INSERT are mai multe forme: # Puteri specifica valori pentru toate coloanele: INSERT INTO num tabet VALUES(vaioare',valoare: De exemplu: mysql> INSERT INTO elev VALUES(“Ihthad”“M*,MULL) 5 fnysql> INSERT INTO eveninent VALUES("1909-9-2", C* NULL); Cuvineal To este optional incepind de Ia MySQL. 3.225. (Acast hucru este val pentru celelalte forme ale instructiunii 1NSERT.) Lista VALUES trebuie sX contin’ o valoare pentru fecare coloani din tabel, in ordinea in care sunt stocate coloanele in tabel. (In mod normal, aceasta este ordinea in care au fost specificate coloanele la exearea tabeluli Folosigi descni8e nune_tabel pentru a afla ordinea, dack nu o cunoasteyi cu exacttate) Pate! incadra fntre ghilimele valorile de tip gir si dati In MySQL, folosind ghilimele simple sau duble, Valorile NULL din exemplul precedent sunt destinate coloanelor ‘AUTO_INGRENENT din tabelele e2ev si eveninent. (Inserpia unei ,valorilipsi* determing generarea urmétorului numir elev_id sau eveninent_ic) ‘Versiunile MySQL incepind de la 3.22.5 va permits inserayi mai multe réndusi fitsun tabel cu o singur’ inscructiune TNSERT, prin specificarea mai multor liste de valo1 INSERT INTO mume_tabel VALUES(..)y(+e-Dye+e Capitolul 1 Introducere in MySQL siSQL_ G4 De exemple: rysal> INSERT INTO elev VALUES( ‘Ana’, *F*,NULL), (thai, "M* NULL); ‘Acest procedeu necesita introducerea dela tastaturi a uni cantititi mai reduse de text decat cea impusi de mai multe instructiuni INSERT, iar execuyia sa de eXtre server este mai eficienti ‘© Puteri denumi coloanele cirora dorigi si le Acest procedeu este util eénd doriti si creagi o coloane trebaie configurate initial INSERT INTO nune_tabet (oune_co!7,une_co12,...) VALUES(valoare?,valosre2;.. De exemplu: nysal> INSERT INTO menbru (nume,prenune) VALUES(‘Tache’, *Stefan'); De la MySQL 3.22.5, aceasti forma a insteucjiunii INSERT permite de asemenea mai multe liste cu valor: aysql> INSERT INTO elev (nune,sex) VALUES( ‘Ana’ °F), (*ihtha Coloanele care nu sunt specificate in lista de coloane primese o valoare prestabilits. Dela My$QL3.22.10, puteyi denumi coloanee si valorile sub forma nune_coloana-valoare. INSERT INTO nume_tabel SET rune_colt-valoare’, nune_col2evaloare?, ... De exemplu: mysql> INSERT INTO menbru SET nunos'Tach’,prenuse='Stefan’; ‘Toate coloansle care nu sunt specificate in clauza SET primese o valoare prestabilits. ‘Nu putefi insera mai multe rinduri folosind aceasti forma a instrucfiunii INSERT, (Olek metod rentru incSrcarea inregistrirlor ite-ua tabel este citirea valoilor datelor direct dintr-un fier. Puteti incirca inregistriri in acest mod cu ajurorul instructiunii {LoaD DATA sau cu utilitarul nysqlinport. Instructiunea Load DATA se comporté ca un incircitor de mare capacitate care citeste date dinte-un figier. Folostiaceast8instrucyiune din interiorul programului nysql: rnysql> LOAD DATA LOCAL INFILE *non®ru.txt" INTO TABLE menbrus Aceasti instructiune citeste confinurul fisierului de date enbru,txt localizat in eata- logul dumneavoastr3 curent din gazda programului client so trimite serverului, pensra afl incireati fn tabelul nesbru, LoAD DATA LOGAL nu va avea efect dact versiunea dumneavoaste& de MySQL. este ante- rioard versiunii 3.22.15, deoarece posbiltatea de citire a figierelor de la client a fost adiugati Ja instructiunea LOAD OATA Tncepiind de la versiunea respectiv3. (Pick cuvantul cheie Loca, fsierul teebuie loalizat pe gxzda serverului si dumneavoastri avefi nevoie de un privilegiv de acces la serves, de care majoritatea utilizatorilor MySQL nu dispun.) {In mod prestabl,instrucyiunea LOAD OATA presupune cf valorile coloanelor sunt sepa- {ncheie cu un caracter linie noua. De asemenea, presopune ci valorileexisté in ordinea in care coloanele sunt stocate fn tabel. Este posi- x, bili citirea fipirelor in alte formate sau specificarea unei alte ordini a coloanelor. Vezi rubricaaferenti comenzii Load DATA din Anexa D, ,Referingi de sintaxi SQL", pentra ‘mai multe detai valor, apoi enumerativalorle, egistrare pentru care numai céteva 62 Parteal_Utiizarea generalé a sistemului MySQL Utilitarul nysq2inport este o interfapi in linie de comand pentru instructiunea LOAD DATA. Acest utiitar se invoci din interpretor si genereaz4 automat o instructiume LOAD DATA ‘% mysqLinport --1ocal sanp_db wenbru.txt nysqlinport genereazi automat 0 instrueyiune LOAD DATA, care determina incircarea Fgierulainenbru-trt in tabelul renbru, Aces ueru nu este posibildacS programe dum- neavoastri MySQL este anterior versiunii 3.22.15, deoarece optiunea ~-Loca2 necesiti LOAD DATA LOCAL, Ca fn cazul programulwi nysql,dacf trebuie sf specifica parametri de conexiune, indica in linia de comands, anterior numelui bazei de date. aysaiinport extrage numele tabelului din numele fisierului de date, (Ca nume al tabelului, se folosesc toate caracterele, pan la primul punct din numele fisierului) De exempla, senbru. txt va fi incircat in tabelul nenbru, iar presedinte txt va fi ncircat jn tabelul presedinte. Daci avesi mai multe fisiere de incircat intrun singur tabel, alegesi numele fierelor eu atengie; in caz contrar, aysqLieport nu va folost mumele corect de tabel. Cu nume ca neabrut txt sau nenbrua.txt, nysalimport va presupune ci numele tabelelor sunt nenbrut, respectiv nembru2. Torusi, pute folosi nume precum inenbru. 1. txt si menbru.2.txt, respectiv menbru.txt1 gi nembru,txt2. Dupi ce ai testat aceste metode de adiugare a inregistrarilo,trebuie si gtergeti continu tul tabelelor 31 apoi si Je reineircati, astfel incit continutul lor si fie cel presupus in secjiunea urmitoare. Din incerpretorul dumneavoastr’, executaji urmitoarele comenzi ‘% mysql samp_db < insert_president.sq2 % mysql samp_db < insert_nenber.sql % mysql sanp_db < insert student.sal ‘% mysql sanp_éb < insert_score.sal mysql samp_db < insert_event- SELECT 2+2, “Salut, lune", VERSION(); 202 Salut, lune” veRsiou() {[5.23.0-atpha-tog ‘4 (Salut, Tune Cind folosigi o clau2i FROM pentru a specifica un tabel de unde vor fi regisite datele, forma cea mai ,generici a instructiunii SELECT este aceea prin care se regisesc toate datele, Pentru aceasta, folositi caracterul %, care este o abreviere de la ,toate coloanele". Incerogarea urmatoare regiseste toate rindurile din tabelul elev gle gfiseazi nnysql> SELECT * FROM elev; 1 2 3 4 Coloanele sunt returnate in ordinea in care MySQL le-a stocat in tabel. Aceasta este ordinea ia care coloanele sunt afigate atunci cind se emite o instrucyiune DESCRIBE elev. Pnetele de sespensie de a sail exempllui arate ioterogarearerurneazd mai multe randuri decit cele prezentate. Puteyi denumiin mod explicit coloana sau coloanele pe care doriti si le vedeyi. Pentru a seleta numai numee elevlor, proceday ase 7 , 64 —Parteal_Utllzarea generat a sistemului MySQL sysql> SELECT nuke FROM elev; =e itegan ssoseph | igne ratio Dack precizagi mai mult de o coloan’, separayi numele coloanelor prin virgule. Instruc~ fiunea urmitoare este echivalenti cu SELECT * FROM elev, dar fiecare caloand este speci~ ficat8 in mod explicit: tysql> SELECT nune,sex,elev_sd FROM elev; ‘une ev id? Wegan 1 Joseph 2 kyle 3 Katie 4 Putesi denumi coloanele in orice ordine: jelov_id FROM elev / Ad, nume FROM elev utesi chiar specifica o coloanii de mai multe ori, dact dori nera, inutil. Numele coloanelor nu sesizeazi diferenta intre majuscule si minuscule in MySQL. Urmitoarele interogiri sunt echivalente: SELECT qune,elev_id FROM elev SELECT NUJE,ELEV_10 FROM elev SELECT nine, eLeV_iD FROW olov Numele bazelor de date gi ale tabelelor pot sesiza diferenfaintre majuscule si minuscule; depinde de sistemul de fisiere folosit pe gazda serverului. Un server care ruleaza in UNIX uateazi numele tabelelor si ale bazelor de date ca sensible la diferenta intre ajuscule $i minuscule, deoarece numele de fisiere UNIX sunt sensible Ia aceasti dife- reagi. Numele de figiere Windows nu sesizes2i aceasti diferenti, deci un server care raleazi fn Windows nu va trata numele tabelelor gi ale bazelor de date ca sensibile la diferenya dintre majuseule si minuscule. MySQL vi permite si selectafi coloane din mai multe tabele simultan, Vom discuta despre aceasta in sectiunea ,Regisirea informagilor din mai multe tabel Specificarea criteriilor de regisire Pentru a limita setul de inregistriri regisite de instructiunea S€LEcT, folositi o clauza Wiehe care specifica criterile pentraselectarea rindurilor.Puteiselecte rindvriexami- nnd acele valori din coloane care satisfac diverse criterii. desi acest Ineru este n ge- Capitolul 1 Introducere in MySQL siSQL_ 65. tet efuta valor’ numerice: ysqi> SELECT * FROM puncte WAERE puncte > 95; ‘sion id ovopinest “ia punats) 5 3 er 18 3 96 1 6 | 100 5 8 97 | " 6 98 lS, 6 28, “Alternativ, pute cduta valor gin (Retinet: compara inte siruri nu sunt, fa mod nor- nl sensible ls diferengaintre majuscule si minuscule) aysql> SELECT mune, prenune FRON presedinte ERE mume*ROOSEVELT"; Prenune FROM presedinte roosevelt"; re ‘ume Roosevelt | Theodore Roosevelt Franklin 0. - Sau potefi chuta valori ale unor date calendaristie: ysal> SELECT nue, prenune, data nastere FROM presedinte +> WHERE data_nastere < °1750-1-1"5 Prenune datas Washington! George 1732-02-22 : Jona”, 4736-10-30 4 Thomas 1743-08-13, 5 store, Sau puteti ciuta o combinazie de valor: hnysql> SELE:T nune, prenune, data_nastere, stat FROM presedinte <> WHERE data_nastere < "1750-1-1" AND (stat="VA" On stat=" ime" prone "data pastors st Wasningten | caorge /y780-08-22 Pn faaes' "Som? se-t0-30 Wk SJeffersee Thonas tras.04-18 A Expresiie din clauzele WHERE pot folosi operatori aritmetic, cain tabelul 1.1, operatori de-comparatie, ca in tabelul 1.2, respectiv operator logici, ca in tabelul 1.3. De aseme- nea, putes folos: paranteze pentru a grupa pirfi ale unei expresii. Operatiile pot fi efec- tuate folosind constante, coloane de tabel gi apeluri la funeyii. Vom avea acazia de a folosi numeroase functii MySQL in interogiri pe parcursul aceseui manval, dar ele sunt 66 —Parteal_Uilizarea generalé a sistemului MySQL. mult prea numeroase pentru a le prezenta aici. Vezi Anexa C, .Referintd de operator si funegii, pentru o list completa. ‘Tabelul 1.1 Operator’ aritmetici Operator Semniatio + ‘Adunare - Scsiere : inmate 1 Inpaie Tabelul 1.2 Operatori de comparatie Operator Semnifcaio < Mal mi = Malic sau ogl : Egat ue Diet > Mai mae su oa! > Ma mare Tabelul 1.3 Operator logici ‘Operator Somnificatio AND SHiogic oR SAU logic Nor Negaie logics Cand formulagi o interogare care necesité operatori logic, fifi atent si mu confundati semnificatia operatorului logic AND cu modul fn care folosim cuvincul ,si* in vorbirea zilnicS. Si presupunem ei doriti si gisiti .presedingii niscusi in statul Virginia presedingii niscugi in statul Massachusetts". Observafi modul de utilizare a Tui ysi Jnseamn’ aceasta ci vetiscrieinterogarea dup cum urmeazi?: SELECT une, prenune, stat FROM presedinte Nu, deoarece aceastd interogare tnseamné ,selecteaz’ presedingii niscusi atit in Virginia, cit sin Massachusetts“, ceea este lipsit de sens. In limbajul uzual putetiexprima intero- garea folosind cuvantal ysi*, dar in SQL cele doui condifi se lagi folosind of (sau): aysql> SELECT nume, prenune, stat FROM presedinte => WHERE VAY OR stat="HA"s Capitolul 1 Iniroducere in MySQL siSQL 67 nume prenune”T'stat washington George) VA ‘dans ohn ua | Gefterson _ Thonas vA Madison” Janes) VA. Monroe Janos VA dans John outney | Wa Harrison | Willian H. VA tyler ohn vA Taylor | Zachary va Wilson | Woodrow vA Kennedy | John F ua Bush George We | MA ‘Acesta este un espect la care trebuie si figiatent, au numai cind vi formulagi propriile dumneavoastri interogiri dar si cind scrietiinterogiri pentru alte persoane. Cel mai bine este sé ascultati cu atengie ce anume doresc si afle aceste dar nu este necesar si le transcriei descririle in SQL folosind aceiasi operatori logici. Pentru exemplul descris anterior, echivalentul in limba vorbiti al interogirii este ,Selecteaz’ presedingi care sau niscut in Virginia sau Massachusetts." Valoarea NULL Valoares MULL eite speciali; deoarece inseam’ ,firi valoare“, nu o putefi compara cu valori cunoscute in modul in care comparati una cu alta dou valori cunoscute. Daci fncercati si folosiqi NULL cu operatorii uzuali de comparayie“aritmeticl, rezultatul este nedefinit: nysql> SELE:T MULL <0, NULL = 0, MULL I= 0, NULL > 05 FMULL "<0 TwuLL 07 WuLL i= "0! MULL > 0! ee gta NLL De fapt, nu puteti compara NULL nici micar cu sine insusi, deoarece rezultatul compa- ‘aici intee dout valori necunoscute nu poate fi cunoscut \ faysql> SELEST MULL = NULL, NULLI= NULLS iui 7 : moet Pentru a efectua ciutiri ale valorilor NULL, trebuie si folositio sintaxi special. fn loc de a folosi» sau {= pentru a testa egalitaea sau inegalitates folosifi 1 NULL sau 18 NOT NULL. Deexemplo, deoarece am reprezentat data decesuhui pentru presedintiaflayi in viagS sub forma MULL, le putem gsi dup cum urmeaza: nysqi> SELECT mune, prenune, FROM presedinte PUL = cL NULL 68 —Parteal_ Utiizarea generalé a sistemului MySQL a For Gerald a | Harter | Janes €. Reagan | ‘Ronald W. Bush George W. Clinton | willian J. Pentru a gisi numele care au un sufix, folosii 18 NoT NULL: nysql> SELECT mune, prenume, sufix FROM presedinte <> WHERE sufix 15 NOT NULLS rune rename sutix | | Foarter vanes €. | ur. ‘MySQL 3.23 si versiunile superioare au un operator de comparatie special, specific pro- gramulai MySQL, si anume <=>, care este adevirat chiar gi pentru comparagilefatre valori NULL. Cele dou interogiri precedente pot fire-scrise folosind acest operator dup cum urmeazat ysal> SELECT nume, prenune, FROM presedinte > MMERE date_deces <=> NULLS | tune”? prenune Ford Gerald A Garter | Janes E. Reagan | Ronald M. Bush George W. Clinton | william J. nysql> SELECT muse, prenume, sufix FROM presedinte ‘> mee sor (auton <> wt) Ci pane iti] aria Temes 6.77 Sortarea rezultatelor unei interogéri ‘Uneori se observa ci, daci se emite o interogare SELECT * FROM nune_tabel asupra unui tabel dupa incdrcarea in tabel a unui set initial de date, randurile sunt regisite in aceeasi ordine tn care au fost inserate, Acest fapt nu este intotdeauna adevirat. Daci sterget inserafi rinduri dup& incircarea inifalé a tabelulu, se observ modificarea ordinii tn care serverul returneaza randurile tabelului. Prin stergerea inregistirilor, in tabel sunt inserate ,goluri* de spatiu nefolosit, goluri pe care MySQL incearci si le umple ulterion, cand inserayi inregistriri noi.) {In mod prestabilit, cénd inserapi rindusi serverul nu garanteazi ordinea in care vor fi returnate rindurile. Pentru a sorta rinduril, folositi o clauzi ORDER BY: rysql> SELECT nune, prenune FROM presedinte “> ORDER BY nunes Capitolul 1 Introducere in MySQL si SQL. 69 ae ‘aad Son Mtsnt | Som outney seine | Gheveer ke Buchanan | Gunes uteti specifica daca sortarea unei coloane se va face in ordine ascendenté sau descen- denti folosind cuvintele cheie asc sau DESC dup numele coloanelor din clauza ORDER 6. De exemplu, pentru a sorta numele presedintilor in ordine inversi (descrescitoare), folosii DESC astfl: aysql> SELECT mune, prenune FROW presedinte > ORDER BY nume DESC; une prenume Wilson”! Woodrow Washington | George Van Buren Wartin Tyler John Ordinea ascendentd este cea prestabilitd dack nu specificagi aSC sau DESC pentru un nume de coloan’ intro clauzi ORDER BY. Dacf Sortafi 0 coloani care poate consine valori NULL, toate valorile MULL apar la ‘nceputul coloane, respectv la sfaryit, dak sortayi in ordine descendent, Rezultatele interogiri pot fi sortate pe mai multe coloane ia fiecare coloans poate fi sor- tat in ordine acendenté sau descendents, independent de celelaee coloane. Interogares urmitoare regiseste rinduri din tabelul presodinte, le sorteazd fn sens descendent in fanctie de starl de nastere si dup numele de familie fn eadeulfecStui stat: sysql> SELEST nune, prenume, stat FROW prenune | stat! ‘ ‘arthur Chester A. VT Coolidge | Sadvin Harrison | Willian H. Jeftersor | Thonas, Macison Janos i Monroe Janos : Taylor | Zachary tyler ohn EWashingten George Wilson | Woodrow | Ekeenhower | Daight D. Johnson Lyndon 8. 70 Parteal_Utiizarea general a sistemului MySQL Limitarea rezultatelor unei interogiri ‘Cand o interogare returneazi mai multe rinduri, dar dumneavoastri doriti si vedesi ‘numai teva, clauza LIMIT este util, mai ales in conjunctie cu ORDER BY. MySQL. vi per- rite si limiayi datele de desire ale unet incerogiri la primele m randuri ale rezultatului returnat, Interogarea urmitoare selecteaz pe primi cinci nlscuyi presedingi americani: nysal> SELECT nume, prenune, datanastere FROM presedinte <> ORDER BY data_nastere LIMIT 5; | Prenune | data nastere Washington! George | 1732-02-28 Adams: von | 1735-10-30, Jefferson | Thonas | 1743-04-13 Wiad Janes 1751-03-16 [dames | 1758-08-28, Monro Daei sortai in ordine inversi, folosind OA0ER BY data_nastere DESC, veti objine pe | uleimicinei nscuti pregeding’ americani. De asemenca, LIMIT vi permite si extragefi o sectiune de inregistrir din mijlocul unui set de rezultate. Pentru aceasta, trebuie si specificari dou valori. Prima valoare este i inigiale din setul de rezultate pe care dorigi si-l vedeyi. (Prima fnregistrare este numerotati cu 0, nu 1.) Cea de-a doua valoare indica numérul de tnre- gistrisi care vor fi revurnate. Interogarea urmitoare este similari cu precedenta, dar rewrneazi cinei taregistris, incepind de la al unsprezecelea rand al rezultatului | ‘nysql> SELECT mune, prenune, data_nactore FHOM presedinte > ORDER BY data_nastere LINIT 10,5; Touma" "prenune "data nastere Tyler ohn; 4780-08-29, Buchanen Janes | 1791-04-23 Polk anes K. | 1795-11-02 Fillmore illard’ | 1800-01-07 Franklin | 9804-11-23 Pierce ncepand cu MySQL versiunea 3.23.2, puteyi ordona rezuleatele interogirilor in funesie deo formuli, De exemplu, pentru a excrage o inregistrare selectati aleator din tabelul presecinte, folosiyi ORDER BY RAiO() in conjuncrie cu LIMIT: aysql> SELECT nume, prenume FROM presedinte <> ORDER BY RAND() LIMIT 15 Mokiniey prenuma watiien Capitolul 1 Iniroducere in MySQLsiSQL 74 Calculul si denumirea valorilor din coloanele de iesire “Majoritateainterogisilor precedente au produs date de iegire prin regisrea valorilor din tubele. MySQL vi mai permite si ealeulai o valoare din coloana de iesite ca rezultat al tunel expresii, Expresile pot fi simple sau complexe, Interogarea urmétoare evalueazi o txprese simpls (0 constant) si o expresie mai complex, care implici sumeroase operai rimetice si ck:eva apeluri la funcpis nysal> SELECT 17, FORKAT(SORT(3*3+4%4),0)5 (SaRT (s*304"4) 0) De asemenea, expresile se pot refer la coloanele din tabele: aysqi> SELECT CONCAT(prenuse,* *,nune) ,CONCA(oras,", *,stat) inte *e)TSOuGAF Cora) 6808)| akotieid, Va ‘George Washington John dans | Thonas detferson Janes: Madison Braintree, WA "Albemarle County, VA ort Conmay, VA “Aceastiinterogare formateazi numele pregedingilor sub forma unui singur sir, prin cor ‘catenarea numelui sia prenumelui separate printr-un spafiu si formateazi locul nasteri sub forma orajelor si statelor separate prin virgula. Cind folositi > expresie pentru a calcula valoarea unei coloane, expresia este folosité pentru antetul coloanei. Aceasta poate duce lao coloand foarte lati, dack éxpresia este Fungi (asa cum o arati interogarea precedent). Pentru a rezolva problema, capului de coloand i se poate atribui un nume, folosind constructia AS nune. Asemenea nume se rumese aliasuci de coloani, Rezultatul interogirii anterioare poate deveni astfel mai sernificativ: . rysql> SELECT CONCAT(prenune," ",nune), AS Nune, *> CONCAT(oras,", *,stat) As Loculnasterss ->_ FROM presedin ite (iceaiwaterd Georae iashington”” aketieid, va Sonn’ ean aineree, tk ‘Albenarle County, VA Part conway, VA ‘Thonas Jefferson anes Vadison re ghilimele In cazul a ear allasul coloane confine spi, aestea vor uebulinserat ‘ysql> SELECT CONGAT(prenune," “,nuge), AS “Nunele presedintelui* “> eOHCAT(oras,", "ystat) AB "Loo masters” © mon presedintes x 72 Parteal_Utiizerea generalé a sistemului MySQL isa" grasaditeiut "Yoo pasherdi George Washington Wakefield, VA Seen haane praurtree, ue Thocas Jefferson Albunarie'coenty, VA Janes Madison Port Conway, VA Lucrul eu date calendaristice Peincipalul spect pe care trebuie si-l tines atunci cand lucrapi cu date ia MySQL este cf acestea sunt intordeauna reprezentate incepind cu anul. Data de 27 iulie 1999 este reprezentati sub forma "1999-07-27", Datele nu se scriu nici sub forma *07-27-1908" si nici sub forma *27-07-1999°, aga cum poate ci erat obignuit si le serie. ‘MySQL ofera numeroase moduri de efectuare a operayilor cu date. Unele dintre aces- tea sunt urmitoarele: © Sortare dupi dati. (Deja am vizut aceasté operatie de mai multe ori) © Ciutarea unei anumite date sau a unui domeniu de date. ¢ Extragerea unci pirgi dintr-o valoare de tip dati, precum anul, una sau ziva © Calcularea diferenyei nite date. Calcularea unei date prin adunarea sau scderea unui interval dintr-o altd dati, 1h continuare sunt prezentate exemple cu aceste opera, Pentru a cfuta anumite date, fie in functie de valoarea exact fe prin comparayie cu o alti valoare, comparati o coloani DATA cu valoarea care vi intereseaza yoql> SELECT * FROW oveninent WHERE data="1909-10-01"; data Sp 1999-10-01 6 nysqi> SELECT nume, prenune, data deces ~> FROW presedinte -> WHERE data_doces >= "1970-01-01" AND data_de eveninent id 18 < "1980-01-01"; uae [Brenume ' data deces Truman! Harry §, 1972-12-26 vohnson | Lyndon B.! 1973-01-22 Pentru acess sau pentru a regis piri ale datelor calendaristce, pats folosi func pre- cum YEAR() (an), MONTH() (lund) sau DAYOFUONTH()(ziua din lund), De exempt, por gist Presedingi care s-au niscut in aceeasi lund ca mine (martie) cfutind datele a tirce valde a huni este egal eu 8 faysql> SELECT mune, prenuse, data_nastere “> FROM presedinte WHERE HONTH(data_nastere) = 9; Capitolul 1 Introducere in MySQL si SQL 73 inune | prenune data naste Wadison Janes 1751-09-16 vackson | Andrew | 1787-08-15 Tyler von” 1780-03-28 Grover 1897-03-16 Glevelang De asemenea, interogarea poate fi scrisi si fn functie de numele luni: date_nastere aysql> SELECT nune, prenune -> FROW presedinte > WHERE WONTHUAME(data_nastere) = "Warch*; ume renune "date nastere | Madison Janes. 1751-03-16 Jackson | Andrew | 1767-08-15, Tyler Jon” | 4790-09-28 Cleveland | Grover | 1897-03-18 ind chiar ziua nasterii ~ pot combina interogirile pentra WoNTH() si DAYOFMONTH() pentru a gisi presedingii niscuqi in ziua mea de nagtere: nnysql> SELE:T nume, prenune, data nastere > FROM presedinte WHERE WONTH(datanastere) = 3 > AND DAYOFNONTH (data_nastere) = 293 ii data nastere 1790-05-29 Pentru a fi mai exact ~ specifi Thane "pronase Tyler John : Acesta este tipul de interogare pe care il folositi pentru a genera liste cu persoanele nis- cute fntr-o anumité zi, list pe care o vedeti in sectiunea de divertisment a ziarclor. ‘Totus, nu tebuie si serieyi o amumicé zi, aa cum s-a procedat in interogarea anterioari Pentru a ciuta presedingii niscutiastizi, indiferent de ziua din an in care ne gisim, com parafi data nasteri lor cu valoarea CURRENT_OATE (dati curenti SELECT ume, prenune, data_nastere ‘ FAOU presedinte YHERE WONTH(date_nastere) = MONTH(CURRENT_OATE) ‘AID DAYOFUONTH(data_nastere) = DAYOFMONTH(CURRENT_DATE) Pueyiscatlea 0 data intro alta data. Aceasta vi permite si gist! intervalul dintre date, care este util pentru determinarea virstelor. De exemplu, pentru: a determina presedin. tele care a trdit cel mai mult, se scade data nasterii din data decesului. Pentra aceasta, convertti data_sestere si data_deces in zilefolosind funcjia T0_DAYS(), lua diferenia sio imparyigi la 365 pentru a objine virsta aproximativ, in ani sysql> SELECT nune, prenune, data.nastere, data_deces, > FLOOR((TO_DAYS(data_deces) ~ TO_paYS(date_nastere))/965 > AS varsta FROM presedinte WHERE data_deces 15 NOT NULL > ORDER BY varsta DESC LIMIT 5; 4 Partea! Utilizarea general a sistemului MySQL ‘oe [poe Cee ‘Adams John 5 1826- P90. foover Herbert 6. iSertoe a “Weimon Harey's. Weise) & Testes ened °° etcescte | jasson-28 | 88 Setterson ltee.tr-on | Thomas | 1743-04-19 Funcgia FLOOR() folositi in aceastdinterogare climing toate pirtilefractionare din valoa- | rea virstel, pentru a genera un intreg. | Stabilirea diferengei intre date este de asemenea utili pentru determinarea distangei in raport cu o anumiti dati de refering’. Astfel, vi pote da seama care sunt membri Ligit | istorice care trebuie si-pi plateascX in curind cotizatia. Calculayidiferenga intr datele de cexpirare si data curent, iar dacd aceasta este mai mici decat o anumiti valoare de prag, fnseamn’ ci plata cotizayici va fin curdnd necesara. Urmatoarea interogare ii giseste pe _membrii care teebuie si-pi achite cotizatia fn termen de 60 de zile: SELECT nume, prenume, data_expirare FROM nenbru WERE (TO_DAYS(date_expirare) ~ TO_AYS(CURRENT_DATE)) < 60 fncepand de la MySQL 3.22, puteyi folosi OATE_A00() sau DATE_SUB() pentru a calcula © dati pornind de la alta. Aceste funcpii preiau o datk si un interval si produc o dati | nous. De exemplu: snysql> SELECT DATE_ADD("1970-1-1", INTERVAL 10 YEAR); OATE_ADD(*1970-1-1", INTERVAL 10 YEAR) “Yos0-01-03 nysai> SELECT DATE SUB("1970-1-1", INTERVAL 10 YEAR); “Dare. SuB("1970-1-18) TNTERVAL”10 YEAR) 1960-01-01 ( interogare prezentati anterior in aceasté secyiune selecta presedingi care au devedat ia timpul anilor 70, folosind date literale pentru extremitiyile domeniului de selectie. Acea interogare poate fi reformulati folosind o dati de pornire literal si 0 data final caleu- lath pe baza datei de pornire gi unui interval ‘ysql> SELECT nuno, prenune, data decos -> FROM presedinte => WHERE data_dec => AND data_dee 1970-41-17 ‘< DATE_ADD(*1970-1-1", INTERVAL 10 YEAR) is nun date does Toman "Wary 8) 167e- 18-28 Somnson__ | Uyndon 8. 1ora-ot-a2 Interogarea pentru plata cotizayiei membrilor poate fi scrisi folosind OATE_ADO(): SELECT nune, prenune, data_expirare FROM monbru WERE ata_expirare < DATE_ADD(OURRENT_OATE, INTERVAL 60 DAY) Capitolul 1 Introducere in MySQL siSQL 78, “Anterior in acest capitol, a fost prezentatk o interogare pentru determinarea pacientilor ‘unui medic stomatolog care mu S-au mai prezentat a control in util timp: SELECT nune, prenune, ultina_vizita FROM pacient WERE ultina_vizita < DATE_SUB(CURAENT_DATE, INTERVAL 6 MONTH) ‘Jn acel moment, interogarea cespectivi nu era prea semnificaivd. Acum este? Stabifirea corespondentei cu un model MySQL vi permite #4 ciutati valori care coréspund unui anumit model. Astel, pute ‘electa inrepistrri fir a furniza o valoare exact, Pentru a executa o operate de stabilie @ ‘corespondengei cu un model, folosiji operatori special (LIKE gi NOT LIKE) si specificati un ‘rca confine caractere de inlocuire. Caracterul _corespunde ori caracte, iat * cores- punde oricirei seevenge de caractere(inclusv o seeventi vida). Stabilirea corespondengei cb fun model folosind Lake si WOT LIKE mu face difereng inre majuscule i minuscule, ‘Acest model giseste numele eare incep ou W (sau cu w, daci ar exista) aysql> SELECT mine, prenume FROM presedinte <> WERE nume LIKE “Wet; ‘tune prenue ‘Washington | George Wilson. Woodrow ‘Aceastl corespondenfi cu un model este eronatis nnysql> SELECT numo, prenune FROM presedinte > WHERE mune = "W's Empty set (0.00 sec) Interogarea ilustreaz’ o eroare comuns, $i anume folosirea unui model cu un operator aritmetic de comparatie. Unica posibiliate ca aceasté operatic si reugeasci este ca in coloani si se afle chiar sirul "We" sau "we", Acest model corespunde numelor de familie care congin litera W sau w orjunde in interio- ‘ul numelui nysqi> SELECT mune, prenune FROM presedinte <> WHERE ume LIKE. "er Frumeprenune ‘George Woodrow Deight 0. ‘Acest model corespunde numelor de familie care congin exact patru caractere: nysql> SELECT muse, prenuxe FRON presedinte <> WHERE nume LIKE *___"; Washingcon Wilson | Eisennover {ina pene | : | Polk ware fora : bon, arorge | 76 —Parteal_Utlzarea generalé a sistemului MySQL. De asemenca, MySQL furnizeari o alti metodi de stabilire a corespondenyei cu un ‘model, in functie de expresile regulate extinse, Expresile regulate stint prezentate in descrierea operatorului REGEXP din Anexa C. Generarea de sumare ‘Una dintre cele mai utile operafi pe care MySQL le poate face pentru dumneavoastrs ‘este si rezume mari cantitigi de date brute sisi realizeze sumarul acestora. MySQL. devine un aliat puternic atunci cind vei favaga si-l folosigi pentru a genera sumare, deoarece aceasta este o activitate extrem de obositoare, consumatoare de timp si supusi Ia erori atunci cand este efectuati manual. © form’ simpli de creare a unui sumar consti in a determina valorile unice prezente fnr-un set de valori. Folosigi cuvantul cheie O1STINCY pentru a elimina rindurile care se repeti dintr-un rezultat. De exemplu, statele distinete in care s-au niscut presedingii americani se pot gisi astfel: nysql> SELECT DISTINCT stat FROM presedinte ORDER BY stat; [stat an cA a A ow oKy mA mo NC ne | na Ny ny om PA 80 * ww M..! até forma de realizare a unui sumar este numirarea, folosind functia CouNT(). Dack folosigi count(*), aceasta vi indici mumérul de rindusi selectat de interogarea dum- neavoastr’ Dacd interogarea nu are nici o clauza WHERE, COUNT(*) vi indie¥ numarul rindurilor din rabetul dumneavoastra Interogarea urmatoare va indict numarul tuturor presedingilor americans sysql> SELECT COUNT(*) FROW presedintes ‘coun (*)) 4 Dacit o interogare are o clauzi WHERE, COUNT(*) indict numirul de rinduri pe care tl selecteaza clauza. Aceastd interogare vi arati numarul de chestionare pe care le-ayi dat clevilor dumneavoasted pani acum: Capitolul 1 Inroducere in MySQL siSQL_ 77 rnysql> SELECT COUNT(*) FROM eveninent RHERE type = caer i Funcfia COUNT(*) numéri fiecare rind selectat. Prin contrast, COUNT(nume_coloana) numar& numai valorile diferite de NULL. Urmitoarea interogare demonstreazi aceste diferenye: ryeal> SELser COUNT) > FROM presecine Seine( =) Goi aurix) "can date’ doces at 1 36 {COUNT (sux) ,COUNT(data_decos) ‘Aceastdinterogare arati cl in total au fost 41 de presedingi, ci numele unui singur pregedinte are un sufix, precum si ck majoritatea pregedingilor nu mai sunt in vi Incepind de la MySQL. 3.23.2, puteti combina COUNT() cu DISTINCT pentru a determi- na numirul de valori distincte dint-un rezultat. De exemplu, pentru a numara statele distincte in care s-au niscut presedingif american’, procedagi astel: rnysql> SELECT COUNT(OISTINGT stat) FROM presedint. coin (OiSTINET stat) 19, Putesi impiryi auméritorile in valori individuale in coloama de sumar. De exemplu, putefi cunoaste numarul total de elevi de la cursul dumneavoastri ca rezultat al rulieii urmitoarei inte:ogiri: mnysql> SELECT COUNT(*) FROW elevs ‘cour (+) as Dar cagi dintre elevi sunt biiepi gi céte sunt fete? © modalitate de a afla aceastd infor- magi este de a cere o numirare separatipentrafiecare sex: \ feysql> SELECT COUT(*) FROM elev WHERE sex='t" cour): [en mysql> SELECT COUNT(*) FROM elev WHERE sex='n'; cour) aie ‘Towusi, desi aceast metods funcrioneaza, este obositoare si nu foarte bine adaptati pen- ‘tru coloanele care pot confine numeroase valori distincte, Si ne gindim cum putem determina in acest mod numirul presedinjilor niscufi in fiecare stat. Va trebui si aflagi care sunt statele reprezentate, pentru a nu omite nici unul (instrucyiunes SELECT 18. 78 Parteal TINCT stat FROW presedinte), apoi rulayio interogare SELECT COUNT(+) pentri fiecare stat. Categorie, nu dori si facet! acest lucru. feticire, MySQL poate numira, folosind o singuri interogare, de cite ori apare fiecare valoare distinct fnu-o coloan’. Pentru lista noastri cu elevi, putem numira Diep i feteleastfek: aysql> SELECT sex, COUNT(*) FROM elev GROUP BY sex; Utlizarea generalé sistemului MySQL ‘Aceeasi forma de interogare indiei numirul de presedingi ndscuti in fiecare sta: nysql> SELECT stat, COUNT(*) FROM presedinte GROUP BY stats Tetae coun ()) a ca oA a 1 Kv wa io No Ne Nit Ns ww oH PA 8c % vA wt Cand numiragivalorile in acest mod, clauza GROUP BY este necesar, deoarece indicX pro- gramului MySQL modul de grupare a valorilor inainte de a le numira, Daci omiteyi aceasti clauz$, veti primi un mesa} de eroare. Usilizarea funcyie} COUNT(*) cu GROUP BY pentru numrarea valorlor are un numit de avantaje in raport cu numizarea individual’ a aparigillor fiecirei valori distinete din coloani: © Nu tebuie si stifidinainte care sunt valorile prezente ta coloana al cirei conginut tl rezumati. © Avegi nevoie de o singurd interogare, nu de mai multe interogir. © Obsinesi toate rezultatele into singurd interogare, deci putei sorta datele de iesire. Primele dou avantaje sunt importante pentru exprimarea cu mai mare usuringé a interogirilor. Cel de-al teilea avantaj este important deoarece vi permite o flexbilitate in afiarea rezultatelor. Capitolul 1 Introducere in MySQL siSQL 79 Cind folosifi c clauzi GROUP BY, rezultatele sunt sortate in coloanele in functie de care realizatigrupare, dar puter! folosi oRDER BY pentru a sorte intro alti ordine. De exem- plu, dack dorit ca numerele de pregedingi si fie grupate in funcyie de starul de nagtere, dar si fie si somate in ordinea descrescdtoare a celor mai bine reprezentate state, puteyi folosio clauzi ORDER BY dup cum urmeazi: rysql> SELECT stat, COUNT(*) AS nusar FROM pr -> GROUP BY stat ORDER BY nunar DESC; dante Sat va SeSeR2Eex5ez52 oA IL AB Cind coloana dup care doriti si sortafi este determinati prin calcul, puteti da coloanci unalias si pute face referire la alias in clauza ORDER BY. Interogarca anterioari demon- streazit acest fa2t; coloana COUNT(*) este demumiti numar. O alti modalitate de a face rcferie lao asemenea coloant este prin poztia sa i datle de iepre Interogarea ace- roar ar fi putvt fi scrisi gi astfel: 4 SELECT state, COUNT(*) FROM presedinte . GROUP BY stat ORDER BY 2 DESC Nu cred ci desemnarea unei coloane prin pozitia acesteia este foarte sugestivi. Dack adiugati, elimina sau re-ordonayi coloanee cu datele de iesire, rebuie si vi amintfi si verficagi clauza ORDER BY si si corectati numarul coloanei, daci acesta s-a modificat. Aliasurile nu sidicd aceast% problema. Daci doriti si folositi cRoUP By cu o coloand care congine valori calculate, trebuie si faceti referire la acea coloand folosind un alias sau pozigiacoloanci, aja cum se pro- cedeazi in cazu.clauzei ORDER BY. Urmitoarea interogare determin’ numirul presedin- filor care s-au niscut in fiecare huni a anului nysql> SELECT HONTH(data_nastere) as Luna, -> WONTHNANE(data_nastere) AS Nume, COUNT(+) AS nunar -> FROM presedinte GROUP BY Nuno ORDER BY Luna; 80 Parteal_Ultiizarea gonorald a sistemului MySQL una Wume Tanuarie | Februarie Marti Aprile was August Septenbrie | 11 | Nolenbrie 12 | Decenbrie Folosind pozitile coloanelor, interogarea poate fi serist asfels SELECT ONTH(data_nastere), VONTINAME(date_nastere), COUNT(*) FIOM presedinte GROUP BY 2 ORDER BY 1; COUNT poste fi combinati cu ORDER BY si LIMIT pentru a gis, de exemphy, cele mai bine reprezentate patru state din tabelul presedinte: ‘ysql> SELECT stat, COUNT(*) AS numar FROM presedinte <> GROUP BY stat ORDER BY nunar DESC LIMIT stat) nunar vA) 8 on 7 Moa ] Ny 4 q ‘Dac nu doriti si limitayi datele de iesire ale interogirii folosind o clauza Ltutt, ci prin clutarea anumitor valori ale functiei COUNT(), utiizayi o clauzi WAVING. Interogarea ‘uemitoare vi va indica numarul de state reprezentate prin doi sau mai multi preseding ysql> SELECT stat, COUNT(*) AS numar FROM presedinte > GROUP BY stat WAVING numar > 1 ORDER BY nunar DESC; ee vA 8 ma wy No wr en In general, acesta este tipul de interogare care trebuie executat tunel cind dori si gisii fntr-o coloana valori care se repeti. HAVING este similar eu WHERE, dar se aplici dupi ce au fost selectate rezultatele interogirii sieste folosie pentru a reduce domeniul rezultatelor trimise efectiv de server clientului. ‘Exist functii de sumar altele decd counr(). Functile MIN(),MAX(), SM) siAVG() sunt ule pentru determinarea valoriiminime, maxime, totale si medi dint-o coloand. Le puteyi chiar Capitolul 1 Introducere in MySQL siSQL Bt {olosi pe toate sinmultan, Urmitoareainterogare prezint diferite caracterstici numerice pen aru fiecare chestionar si test pe care Iai dat. De asemenes, indict numirul de punctaje jncluse in calcululfieckrei valori. (Uni levi au fost abseni gi, ea atare, nu au fost numiray.) nysql> SELECT -> eveninent_ta, -> MIN(puncte) AS ninin, > MAX{puncte) AS maxim, > WAK( puncte <> SUM(punete) AS <> AVG(punete) AS met -> COUNT puncte) AS unary -> FROM puncte ‘> sain BY vensnent 385 (Seninert id ini encin | dono total |” wedie | nunar 1 cy 2: 12 439 15.1979 | 29 b 8 RS Ie 5 oo atas | olaass | St 6 mt Sire Weare ar 8 8m Ste ese Br 8 se 10) 8 ates fares Bo Aéeste informatii pot deveni mai semnificative daci aj sti, desigur, dact valorile respec- tive au fost objinute la punctaje sau teste. Totusi, pentru a,obyine acele informa, tre~ bie si consultim i tabelul eveninent; vom reveni Ia accasté interogare in sectiunea sRegisirea infermasilor din mai multe tabele*. Fungyile de sumar sunt distractive, deoarece sunt foarte puternice, dar vi puteti lisa foarte usor ,dcs de val", Priviti aceastinterogare: nysql> SELECT ~> stat AS Stat, : > AVG((TO_DAYS(data_doces)-T0_DAYS(data_nastere)) 985) AS Varsta, “> FROM presedinte WHERE data_deces 1 NOT MULL -> GROUP BY state ORDER BY Varsti stat! versta [varsta”! ny 74476782 vt MA 721642009 NG VA 1721522085, of PA (77188904, Ni sc |78.284992 NY CA a1 990986 Ny Mo 86.695151 TA._90, 254795, Interogarea selecteaza presedinti care au decedat ii grupeazi in funcyie de data nasterli, le ealculeaza varsta la data decesului, calculeazi varsta medie (per stat) si apoi sorteazd rezultatele dupi varsta medic. Cu alte cuvinte, interogarea determind, pentru presedinti care mu mai sunt in viaf, varsta medie la data decesului in funcrie de statul de nastere. 82 —_Parteal_Uilizatea generalé a sistemului MySQL. $i ce inseamna asta? fnseamn numai ci puter! serie interogarea. Evident, nu inseamni ¥ interogarea merit scrisi, Nu toate operasile pe care le pute aplica unei baze de date stunt la fel de semnificative; torusi, uneori oamenii devin extrem de fericiti cand aflt ce anume pot face eu baza lor de date. Astel se poate explca apariia unui num tot mai mare de statistici din ce in ce mai ezoterice (gi mai ipsite de sens) cu ocat tmentelor sportive televizate din Statele Unite in ultimii ani, Statisticienii sportiv isi pot folosi bazele de date pentru a determina tot ce doriti si stti despre 0 echip% dar gi tot ‘ce nu dorigi s& stji. Chiar este atit de important si sti care funday din Divizia A (mutatis mutandis penteu realitatea romaneasci ~ NT) are la activ cele mai multe inter- | cepfi in careul de 16 mete! atunci cand cchipa lui conduce cu mai mult de dou goluri diferenga, cind pin la sfargtul reprizei a doula sunt mai putin de 15 minute gi antrenorul fnc8 n-a ficut cele tei schimbiri regulamentare? Regisirea informatiilor din mai multe tabele Interogirile pe care le-am scris pind acum av extras date dintrun singur tabel, Acum ajungem la partes interesantd, Am mai spus ci puterea unui SGBD relational rezida in capacitatea sa de a corela un aspect cu altul, deoarece acest fapt vi permite si combinati_| informayi din mai multe tabele pentru a gisi rispunsul la intrebari la care mu se poate ispunde consultind un singur tabel. Aceasti secriune vi prezinti modul de scriere a | imerogirilor de regisire a informagilor din mai multe tabele. Cind selectayi informayii din mai multe tabele, efectuafi 0 operatie denumité wire Aceasta deoarece producesi un rezultat prin unirea informatilor dintun tabel cu informagile din celilaletabel, operatie care are loc prin coroborarea inregistririlor din mai multe tabele care congin valori comune. Si parcurgem un exemplu. Anterior, in secyiunea ,Tabele pentru proiectul de evidengi a rezultarelor scolare*, a fost prezentati, firi nici o explicate, o interogare pentru regisirea punctajelor de la chestionare sau teste date la o anumiti dati. Acum este momentul si dim explicatia. De fap, interogarea implied o unire pe tei ct, deci o von descrie in dou etape. {In prima etapa, construim o incerogare pentru selectares punctajelor obfinute lao anu- smith dati, dup com se poste vedes mat jos aysql> SELECT elov_id, data, puncte, tip -> FROM eveninent, puncte <> WHERE data = *1999-09-23° > AND eveninenteveninent_id = puncte.eveninent_id; data puncte | tip {1999-09-25 we Fe 1999-09-23 wie 1999-09-23 4G y990-09-23 13 | 8 | 4999-09-23 18 Capitolul 1 Introducere in MySQL siSGL 83. ‘Aceast interogare funcgioneazi prin gisireainregistririi evenimentului cu data precizati si apoi foloseste identificatorul de eveniment din acea inregistrare pentra a localiza pnctaje cu atelag identificator de eveniment. Pentru fiecare combinayie corespunzic foare de inregistrare de eveniment si inregistrare de puncta, sunt afigate ideneificatorul levului, punctajul, data gi ipul de eveniment Interogatea diferi de cele scrse pind acum din dou puncte de vedere importante: ‘© Clauza Fnov denumeste mai multe tabele, deoarece datele sunt regisite din mai multe tabele: ‘FROM eveniment, puncte ‘© Clauza wiene precizeazi cl tabelele eventaont si puncte sunt unite prin stabilirea unci cechivalenge ‘ntre valorile coloanei eveniment_id din fiecare tabel: WHERE... eveniment.eveninent_id = puncte. eveninent,_i4 Observayi medul in care se face referire la coloane, folosindu-se sintasa rune_ta~ bel nume_colvana, astfel inca MySQL. si ste care sunt cabelele in chestiune. (Coloana joninent_{@ apare in ambele tabele, deci apare o situafie echivocd daci 0 folosim fri tun nume de tabel pentru a o identifice.) Celclalte coloane din interogare (data, puncte, tip) pot fi folosite firé un element de calificare de tip nume de tabel, deoarece apar int-un singur tabel si, ca atare, suatlipsite de echivoc, Totus. ex in general prefers calf fiecare coloani dintr-o unire, pentru a preciza mai cla tabelul din care face parte coloana, Intr-o forma complet determinati, inverogarea se prezint’ astfel: e SELECT punote.elev_id, oveniment.data, puncts.puncte, eveninent.tip FROM eveninent, puncte WMERE eveninent.cata = "1999-09-28" ‘AND evensnent .oveninent_sd = puncte.eveninent_id ‘De acum incolo, voi folosi forma complet determinata In cea de-a doua etapi, vom finaliza interogarea folosind tabelul elgy pentru a afisa rnumele elevilor. (Datele de iesire ale interogirii din prima etap ng’prezinté cimpul elov_id, dar aumele sunt mai semnificative.) Afigarea numclor este'yealizata folosind faptul ci atat abelul puncte, eft si tabelul e2ev congin coloana viey_td, ceca ce permite ‘corelarea inrezistririlor din aceste tabele. Interogarea rezultantl se prezintS astfel: nysql> SE-ECT elev.nune, eveninent.deta, puncte. puncte, <> eveninent.tip FROM eveninent, puncte, elev -> AND puncte.evensnent_id {nace "sata puncte | tip Megan 1999-09-28 1s Joseph 1999-08-28 12,6 kyle | s909-09-23 | 1 Abby 1999-09-28 13, Nathan 1999-09-23 18 84 Utiizarea general a sistemulul MySQL. Partea | ‘Aceastiinterogare diferi de precedenta din urmitoarele puncte de vedere: (© Tabelul etey este adugat la clauza FROM deoarece este folositalsturi de tabelele evens. rent si puncte. *Coloana etev_id este acum echivock, deci uebuie determinati sub forma puncte.elev_id sau elev.elev_ic, penteu a preciza clar care este tabelul ce urmeari WERE ... puncte.elev_id = lev.eley_sd © Interogarea afigeaz numele elevului, nu identificatorul stu, (Bineingeles ci Je putesi afiga pe ambele, dact dorig.) Cu aceasti interogare, puteti introduce orice dati si obsinesi punctajele dela data respec- tivi alituri de numele clevilor side tipul punctajului, Nu tebuie si stig nimic despre iden- tificatori de elev sau de eveniment. MySQL. se ocupi de determinarea valorlor rlevante ale identficarorilor si de utilizarea lor pentru coroborarea automati a informasilor din rindurile tabelelor O alti sarcind pe care o incumbi proiectul de evidenti a rezultatelor scolare este totali- zarea absenjelor clevilor, Absengele sunt inregistrate in tabelul absenta, in functie de ‘identificatorul elevului si de dati. Pentru a objine numele elevilor (nu doar identifica- tori lor) trebuie si unim tabelul absente cu tabelul elev, in functie de valoarea din coloana elev_id, Interogarea urmitoare afigeaz’ numirul de identficare a elevului gi nnumele acestuia, alituri de numarul absenyelor: nysql> SELECT elev.olev_id, elev.nu -> COUNT(absente.data) AS absente > FROW elev, absente > WHERE eley.elev_id = absente.elev_td > GROUP BY elev.eiov_s« elev id! mune absente 3 kyle + 5 | Abby 4 10 | Poter 2 17 | win 1 20. | Avery 1 ‘Not&: Desi am furnizat un calificator in clauza GROUP BY, nu este absolut necesar pentru aceastfinterogare. GROUP BY se refers la coloanele din lista de selectie (din primele dowd linii ale interogirii), Aici existd o singuri coloani denumitd e1ev_id, deci MySQL cunoaste coloana la care va referigi. Acest fapt este de asemenea valabil pentru coloanele specificate in clauzele ORDER By. Datele de iegire generate de interogare sunt acceptabile daci dorim si stim numai care sunt elevii cu absente. Dar, daci trimitem aceastélisti la secretariatul sco, cei de acolo vor spune: ,Dar celal clevi? Vrem o valoare pentru fiecare elev.” Aceasta este © pro- blemé usor diferits. Inseamni ca dorim si eunoastem numirul absenjelor, chiar si pen a fi folosit. (Acest fapt este valabil chiar dac& preferagi si scrieyi uniri care nu pre- | cizeazi complet fiecare refering’ la 0 coloani.) © Clauza mene are un termen suplimentas, care aati cX nregistcle din tabelul puncte sunt coroborate cu inregistririle din tabetul elev, in funcyie de identificatorul fiecirai elev. Capitolul 1, Introducere in MySQL siSQL_ 85. tru elevii care nu au avut nici o abseni. Deoarece intrebarea este diferit, i interoga- rea este diferié Pentru a rispunde la fotrebare, putem folosi LEFT JOIN in loc de a asocia identificatorul de elev in clauza WHERE. LEFT JOIN indici programului MySQL si genereze un rind de date de iesire pentru fiecare rind selectat din tabelul denumit primul in cadral unirit (adicdtabelul precizat in stinga cuvintelor cheie LEFT JOIN), Precizand mai intai tabelul elev, vom primi date de iesire pentru fiecare elew, chiar gi pentru cei care nui sunt reprezentafi in tabelul absente. Interogarea se prezint’ astfl: nysql> SELECT elev.elev_{d, elev.nune, > COUNT(absente.date) AS absente -> FROM elev LEFT JOIN absonte -> ON elev.eiey_id = absente.elev_id => GROUP BY elev. eley_s43 elev id’ mune absence 1 Megan Joseph 3 kyle 4 katie 5 Abby 6 Wathen Lies Anterior, in sectiunea ,Generarea de sumare“ am rulat o interogare care producea 0 ca~ racterizare numerick a datelor din tabelul puncte. Datele de ieite ale aceleiinterogiri afigau identificatoral de eveniment, dar nu includeau data la care a fost obginut puneta- jul sau tipul acesmuia, deoarece atunci nu gtiam cum sf unim tabelul puncte cu tabelul treniaont, pnt bine date ipl petals, Acom yim, Interogareaurm- toare est similar celei pe care am executat-o anterio, dar prezinta data gi pul pune tajelor, mv numalidentfictoral numeri de eveniment’ oon rysql> sevect ‘ > eveninent. data, eveninent tip -> mtu(punete. puncte) AB minim, “> MAX(puncte.puncte) AS naxin, “> WAX(puncte. puncte) HN puncte, punete)+1 AS donentu, > sum(puncte-puncte) AS total, > aVG(punete.puncte) AS nedie, > COUNT(puncte.puncte) AS numer, => now puncte, evensaent +> MERE" puncte.oventnent_44 = eveninent eveninent id > GROUP BY evensaent.data 86 —Parteal’_Uslizarea generala a sistemului MySQL ate tp { sinin {"saxin Y doneniu’ “total |” nedie numa Y9go-09-03, 6 | 8 | 20. t2; 499°, 18.1970, 20 1999-09-06 ¢ | 8 | 19 |) 12 | 426 | 14.1667; 30 jog9-09-09 TT | 60 | 97 | 38 | 2425 78,2258 31 to00-09-16 c=. «7 = 20; 14 «| 370 | 14.0370. 27 3990-09-23 ¢ | 8 20 | 19 | 989 14.1852, 27 3990-10-01 | T 62 | 100 | 99 | 2928 wort724, 29 Puteti folosi funesii precum cOUNT() sau AVG() pentru a genera un sumar pe coloane multiple, chiar daci aceste coloane provin de la tabele diferite. Interogarea urmitoare | determin numarul de punctaje si punctajul mediu pentru fiecare combinafieintre data evenimentului si sexul elevului fnysql> SELECT eveninent.data, elev.sex, “> COUNT(puncte) AS nusar, AVG(puncte) AS medi > FROM eveninent, puncte, elev > WHERE eveninent.ovenduent_{d = puncte.clev_sd -> AND puncte.eley_id = elev.elevid > GROUP BY eveninent.data, elev.sex; data Sex f numar ? medio {ee9-09:09 Fa) 44.0429 1999-09-08 M | 15 | 15.6000 jop9-09-06 Fo 14 | 14.7143 4989-09-06: M16 | 39.6875, 1999-09-09 F | 15 | 77-4000, tag9-09-09/ | 16 | 79.0000 4999-09-16 F | 43.38.2077 1999-09-16 | uo) tg | 12.8871 1999-09-28 F | 12. 14.0833 1999-09-23 u | 18 : 14.2667 tego-i0-01 Fo; 14 | 77.7857 1999-10-01 | M18. | 82.4000 Patem folosi o interogare similara pentru a efectua una dintre sarcinile aferente proiec- ui de evident a rezultatelor scolare: calculul punctajului total a fiec¥rui clev la sfirytul semestrului, Interogares se prezintd astel SELECT elev.elev_id, elev.nune Suil(punete.puncte) AS total, COUNT(puncte.puncte) AS A FROM eveninent, puncte, elev WHERE eveninent eveninent_id = puncte.eveninent_ié AND puncte.elev_sd = elev.elev_ic GROUP BY puncte-elev_t4 oADER BY total Nu existi nici 0 cerinta conform circia o unire trebuie efectuaté folosindu-se dowd tabele diferite. La inceput poate pirea ciudat, dar puteti uni ua tabel cu el insugi. De exemple, putefi determina daci aw existat preyedingi nfscui in acelagi orag comparind Jocul nagterifiecdrui pregedinte cu locul nasteriiruturor celoralti presedingi Capitolul 1 Introducere in MySQL si SQL a7 nysql> SELECT pt.nume, pt.prenune, pt.oras, pl.stat > FROM presedinte AS pt, prosedinte AS p2 > WHERE pt.oras = p2.orae AND pl.stat = p2.stat > AND (pi.nune 1* p2.nume OR p1.prenume I= p2.prenune) > ORDER stat, oras, mune; name prenune {eras stat Uhdans | John Quiney Braintree: A ‘Adams John Braintr ry Existl douk aspecte cludate ale acestel interogiti: © Trebuie si facem referire la doud instange ale aceluiagitabel, deci vom crea aliasuri ale tabelului (pt, p2) gi le vor folosi pentru a explicitareferrie la eoloanele tabelulu Inregistrares fiecirui preyedinte este echivalentd cu ea insigi, dar nu dorim si vedem acest lucru ia datele de ieire. Cea de-a doua linie a clauzei WERE interzice corespon- denga unei fnregistriri cu ea insisi, asigurind faptal cX tnregistririle comparate apartin sunor presed nti diferf (© ineerogare similaré giseste presedinti care s-au nscut in aceeasi zi, Datele de nagtere ‘mi pot fi comparate direct, deoarece astfel s-ar ,pierde" preyedingi care s-au niscut in ani diferig. In schimb, vom folosi WoNTH() $i DAYOFMONTH() pentru a compara ziua si Tuna datei de nagtere: sysql> SELECT p1.nune, pt.prenune, p1.data_nastere <> FROW presedinte AS pt, presedinte AS p2 > WHERE HONTH(pt.data_nastere) = HONTH(p2.date_nastere) > AND DAYOFHONTH(pt.data_nastere) = > DAYOFHONTH(p2.data_nastere) AND (p1.nune I= p2.nume OR pt-prenune != p2.prenune) ORDER BY pt.nune Pune prenune | data, nastore! Harding | Warren @,, 1865-11-02 4 Polke ama.) 178504 Folosind funcgia DaYOFYEAR() fn locul combinatie ntre Functile woNTH() si DAYOFUONTA() sear obfine o interogare mai simpli, dar s-ar produce rezultate incorecte arunci cnd se compari datele din aniibiseci cu datele din anii cu 365 de zle. Unirile efectuste pint acum au combinat informa din tabele intre care exist o oarecare relajc logic semnificativa, dar numai dumneavoastri cunoagteti semnnificatia ace rela. ‘MySQL au gtie (sau nu-i past) daci tabelele unite au sau nu vreo legiturd unul cu alrul De exemply, putei uni tabelul eveninent cu tabelul presedinte, pentru a afladacé afi dat sau nu chestionare saw teste de ziua de nagtere a unui presedinte: nysql> SELECT presedinte.nuno, presedinte.prenune, . => presedinte.data_nastere, eventnent.tip -> FROM presedinte, eveninent > WHERE HONTH(presedinte.data_nastere) = 88 —Parteal_Utiizarea generalé a sistemului MySQL -> WONTH(evendnont. data) -> AND DAYOFKONTH(presedinte.date_nastere) = > DAYOFMONTH (eveninent data); ‘une prenune ©) teea-10-01 | T "Gata nastere | tip Carter! vam Se pare chai dat un west de za de naptere a unui presedinte, i ce dack? Aceasainscamna | ci MySQL va fi foarte bucuros si scoatt la ivealk rezultate, indiferent daci ele sunt logice sat nu, Numai pentru cd folositi un calculator nu dea sti ce trebuie si face, Stergerea sau actualizarea inregistririlor existente Uncori, doriti si vi descotorositi de inregistriri sau dorgi si le modificati conginutul Instructiunile DELETE si UPOATE vi permit aceste opera Instructiunea DELETE are urmitoarea form: DELETE FROM tabel_nume WHERE inregistrari care trebuie sterse (Clauza WHERE indict inregistrirle care trebuie terse gi este opfionald das, daci o omitey vor fi sterse toate inregistririle. Aceasta inseamnd c® instructiunea DELETE cea mai sim- pli este gi cea mai periculoasi: DELETE FROM nune_tabet Aceasti interogare sterge tn toralitate conginutul tabel respectival lui, Fyi tent ls interogarea Pentru a sterge anumite inregistrir, folosti clauza WHERE pentru a selectafnregistritile cate vi intereseaz’, Aceasta este similark clavzei MERE dints-o instrucfune SELEOT. De exemple, pentru a sterge din tabelul presodinte pe tosi presedingii niscuyi in statul Ohio, folositi aceasedinterogare: rnysql> DELETE FROM presedinte WHERE eta uery OK, 7 rows affected (0.00 sac) Un dezavantaj al clauzei WHERE pentru instructiunea DELETE este acela ci puteti face referire mumai la coloanele tabelului din care stergesi inregistririle Inainte de a emite 0 instructiune DELETE, deseori este bine si testapi clauza WHERE folosind-o cu o instructiune SELECT, pentru a vi asigura cX vei gterge inregistricle pe care dori si le stergeti (ji numai acele inregisteiri) Si presupunem ci dori si stergeti Snregistrarea pentru Teddy Roosevelt. Ar fi bund urmitoarea interogare? DELETE FROM presedinte WHERE nuno=*Roosevels* Da, in sensul cf ar stergefnregistrarea pe care o avetifa vedere, Nu, in sensul ei ar serge si inregistrarea lui Franklin Roosevelt. Cel mai bine este si verificati in prealabl clauza veRe, astel: nysql> SELECT nune, prenume FROM presedinte > WHERE nun et"; sean’ obligatori eX rezultaele une | interogisi sunt utile sau eX merti ostencala. Din fericire sau din picate, nu suntem scutig Capitolul 1 Introducere in MySQL siSQL «89 ‘prenume” aune Din acest exemplu se deduce necesitatea de a fi mai concret: sysql> SELECT nune, prenuse FROM presedinte => WERE nune="Roosevelt* AND prenun prenune | nao Roosevelt Theodore ‘Acum stim care este clauza NHERE corecti pentru selectarea inregistriii dorite, deci jnterogarea DELETE poate fi conseruiti corect nysql> DELETE FROM presedinte <> WHERE nune="Roosevelt* AND prenune="Theodore"s Car multS ranci pentru a stergeo inregistrare, nu-i aga? Paza bunt trece primejdia rea! (Aceasta este sna din situaile fn care veti dori si reduces la minimum numirul carac- terelor introdase de la tastaturd, prin utilizarea tehnicilor de copiere gi lipire,respectiv de editare a linilor de intrare, Vezi sectiunea ,Sugestii pentru interactiunea cu nysql* penecw mai multe informagi.) Pentru modificares inregistirilorexistente folosti UPDATE, care are urmatoarea form: UPDATE nune_tabel SET coloane de modificat WHERE snregistrars de actualizet Clauza miene se foloseste ca in cazul instructiuail DELETE gi este optionali deci, dack ma o specifcay, wor fiactualizate toate inregistrrile din tabel. Interogarea urmatoare trans- form’ numele turor elevilor dumneavoastri in ,George" ayeql> UPOATE elev SET nuse="Georgé Evident, trebvie sf figi atent cu inregisteiri de acest gen. De obicei, vei fi mai concret in ceea ce priveste inregistratile pe care le actualizasi. Si presupuncm oi afi adiugat recent un membr al Ligi istorice, dar afi completat numai citeva coloane din rubrica sa aysql> INSERT wonbru (nune,prenune) => VALUES(‘Tonescu’, 'Vasile") ‘Apoi, vi dagiseama cf afi uitat sf mengionagi data plait cotizayiei. Puteyi remedia acest neajuns dupi cum urmeazas ysql> UPDATE aeabru > SET date_expirare='2001-7-20" > WHERE nume='Tonescu* AND prenun Puteti actualiza mai multe coloane simultan, Insteucfiunea urmatoare actwalizeaz adresa postal side e-mail a hui Vasil nysql> UPDATE menbru <> SET email ='ivasiteeyshoo.con', 23. Str. Lunga’ ,oras= facile’ 90 Parteal_Utilzarea generalé a sistemului MySQL -> stat='NY' ,cod_postal='01003" => WHERE nune=Tonescu* AND prenune="Vasile"; De asemence, putesi ,anula valoarea unei coloane atribuindu-i acesteia valoarea MULL (presupunind ci acea coloané accept valori NULL). Dac la un anumit moment in vitor Vasile se decide si pliteaseX acea cotizayie mare care fi permite sk devin membre ,pe iat Ti putes! modifica inregistrarea in mod adecvat atibuind datei de expirare valoa- rea NULL (in sensul ci mu expird niciodati"): nysql> UPDATE nonbra -> SET data_expirare=HuLL -> WHERE nume='Tonescu' AND prenume="Vasiie' {In cazul instructiunié UPDATE, ca gi pentru DELETE, este bine si testajio clauzi WHERE folosind o instrucyiune SELECT, pentru a vi asigura 4 slegeiSnregist3rle corecte pentru actualizare In cazul in care eriterile dumneavoastri de seleeyie sunt prea inguste sau prea largi, vei actualiza prea purine, respectiv prea multe inregisti Daci afi incercat interogitile din aceastd sectiune, veri fi gters gi modificat inregi din tabelele bazei de date samp_db, Inainte de a trece la sectiunea urmitoare, trebuie si anulaji aceste modificiri. Faceyi aceasta prin reincircarea tabelelor folosind instructiu- nile de la sfarsirul secriunii ,AdSugarea de noi inregistriri". Modificarea structurii tabelelor Va mai amintigi ind am creat tabelul aemoru al Lig istorice fir% 0 coloani a identifica- torului numeric al membrilor, ca pretext pentru a folosi instrucyiunea ALTER TABLE? Este ‘momentul si folosim aceasti instrueyiune, Cu ajutorul instrucgiunii ALTER TABLE, puteji redenurni tabele, adiuga sau sterge coloane, modifica tipuri de coloane si altele. Singural exemplu pe care il voi prezenta aici este modalitatea de a adiuga o coloani now. Vezi capitolul 3 pentru mai multe detalii despre posibiltiileinstrucfiunii ALTER TABLE. Considerentul principal la adiugarea unei coloane cu identificatorul numeric al mem brilor la tabelul nenbru este acela c& valorile trebuie si fe unice, pentru ase evita confuzia Intre rubrci. Aii este utili 6 coloani AUTO_INCREUENT, deoarece putem permite progra- mului MySQL si genereze automat numere unice atunci ind adiugim membri noi Intro instrucfiune CREATE TABLE, specificatia pentru o asemenes coloant ar arita astfel Imenbru_id INT UNSIGNED NOT NULL AUTO_INGREMENT PRIMARY KEY Pentru instrucpiunea ALTE TASLE, sintaxa este similarS. Rulay aceast interogere penta 4 adiuga coloana: fnysqi> ALTER TABLE menbru “> AD menbru_4d INT UNSIGNED KOT NULL AUTO_INGREMENT <> PREWARY. KEYS Acum, cind avem 0 noui coloani pentru memorarea identificatorilor numeric ai mem- brilos, cum repartizaim numere tnregistririlor existente din tabelul menbru? Simplus MySQL s-a ocupat deja de asta! Cand adaugati o coloana la un tabel, MySQL ini zeazi valorile coloanelor cu valoarea prestabilits In cazul unei coloane AUTO_INCREMENT, aceasta determin’ generarea unui now numie din secvenfi pentru fiecare rind. Capitolul 1 Introducere in MySQL siSQL_ 94 Sugestii pentru interactiunea cu mysql ceasti sectiune discuti despre modul de a interactiona cu programul client ysa} intro eri el eficient cu mai pugin tex introdus dela tastaturs. Este descris un mod ‘mai simplu de conectare la server gi metode de introducere a interogirilor fara ao tasta pe ficcare de la inceput pani la sfargit. ‘Simplificarea procesului de conexiune a i i i, numele Probabil ck trebuie si specficati parametri de conexiune precum siumele gazdei, nu devilizator sau parola atunci cénd invocagi mysql, Pentru simpla rulare a unui program trebuie introdusi o cantitate seriossi de text, lucru care devine foarte repede obositor. xistf numeroase metode pentru simplificarea procesului de conectare, prin reducerea Ia minimum a textului introdus de la tastaturs (© Usilizayi un figier'eu optiuni pentru stocarea parametrlor de conectare. ile interpretorului dumaeavoastei de ‘© Repetafi comenzile beneficiind de caracterist memorare @ comenzilor (istoric). «© Defintio scurtituri pentru linia de comands aysqi folosind un alias sav un script de interpretoz Utilizarea unui figier eu opfiuni ste cone facepind de la versiunea 3.22, MySQL vi permite si stocati parametri de conexiune jntrun Fsie- cu optiuni. Apof, nu mai trebuie sf tastayi parameui de ficcare dati cind rulagi mysq4s acestia sunt folosiqi ca si cum i-afi fi introdus in linia de comandi. Parametei sunt de asemenea folosii gi de citre alte programe client MySQL, precum rysqlimport. Aceasta inseamni ci un figier cu optiuni reduce cantitatea de text introdus attnci cand folosit si aceste programe. - ; Pentru a folosi figieral cu opfiuni in vederea specificirit paramerrilor de conexiune, Cheat an fig denumit fay ont (aed un fier denumi ay ont jn eatlogal dum- nneavoastri de bazi). Un figier cu opfiuni este un fsier cu text simply ect il putei crea folosind orize editor de texte. Confinutul figerulut se prezincé astfél: {client} host=gazde user=nunele_qumesvoastra passnoré-parola_duneavoastra hk vit Linia {e1ient] indicd inceputul grupulut cu optiuni pentru prograzml clien; toate linile Care uanesof dup aceastn sont ln ctie de etre programe client MySQL pentra a obtine valorile opsiunilor, pint la sfarsitl fgierului sau pin’ la inceputul unui grup de parametri diferit. Inlocuiyi gazda_serverului, nunele_cunneavoastra gi parola_dun- heavoastra cu numele gazdei, numele de utilizator si parola pe care le specifieati cind vi concctapila server. Pentru mine, fisierul .ny cnt se prezinttastfel ‘ Teléent password-secret 92 Partea!_Utlizarea general a sistemului MySQL Singura line obligatorie este (client), Liniile care definesc valorile parametsilor sunt | ‘optionale; le putep specifica numai pe cele dorite. De exemplu, daci numele dumneavoas, ti de utilizator MySQL este acelasi cu numele UNIX de deschidere a sesiunii de lucra, atunci nu trebuie si include o linie user. | Dupa ce ati creat figieral .ny.cnf, stabilii pentru modul siu de acces o valoare restric- tivd, pentru a vi asigura ci nimeni altcineva nu poate si cteaseat % chuod 600 .ny.ent Sub Windows, consinutul fisierului cu opriuni este acelasi, desi numele este diferit (G:\ny-enf), iar dumneavoastré nu iavacati comanda chaod, Deoarecefigcrele cu opsiuni au fost adfugate la MySQL. decitincepind cu versiunea 3.22, nu le putes folosicu versiunile anterioare. In particulas, nu puteifolosi un fisier eu optiung sub Windows la client inclusi in distributa shareware a sistemului MySQL, deoarece aceea se bazeazi pe MySQL 3.21, Fisierele cu opyiuni sunt compatibile cu versiunea Windows inregistraté a sistemului MySQL, sau vi puteti procura programe client mai recente, compatible cu figierele cu opyuin, din sital Web MySQL. Despre fisierele cu opyiuni se pot obtine mai multe informatiin Anexa F, ,Refering’ de program MySQL", Utilizarea istoricului de comenzi al interpretorului Interpretoare precum esh, tesh si bash retin comenzile dumneavoasteXtntr-o list istorie si vi permit i repetasi comenzi din lista respectivi. Daci folosti un asemenea interpre ‘ot lista dumneavoastri istoric vi poate ajuta si evita tastarea unor intregi comenzs, De ‘exemplu, daci afi invocet programul aysql recent, puteyireexecuta dupa cum urmeazit Stay Caracterul | indicd interpretorului si cavte in istoricul de comenzi pentru a gisi cea mai recenti comandi care incepe cu ay ssi o re-execute casi cum dumneavoast’ aif re trodus-o de la tastaturi. De asemenea, unele interpretoare vi permit si vi deplasati tn sus tn jos in lista istoric folosind tastele cu sige orientate in sus, respectiv th jos (sa poate combinaile de taste Ctr-P si Ctrl-N). Putepiselecta in acest mod comands dorita si apoi apisayi pe Enter pentru a o execute. tosh si bash au aceastécaractersted, povibil existentd si la alte interpretoare. Examinati documentatia interpretorului dumneaveay- ‘a pentru a afla mai multe detalii despre utlizarea listelistorie Utilizarea aliasurilor gi a scripturilor de interpretor Daci interpretorul dumneavoastrd permite atribuirea unui alia, pute configura scurti- turi de comenzi care vi permit si invocapi o comands lungi prin tastarea unui nume scurt, De exempl, in esh sau tesh, pute folosi comanda alias pentru a configura un alias denumit samp_cb, cum este acest: 2iias sanp_db ‘nysal -h pit-viper.snake.net -v -paul -p sap_db Sintaxa pentru bash este ujor diferit alias sanp_db='nysql -h pit-viper.snake.net -u Definizea unui alias face aceste dou comenzi echivalen sanp_db nyse aul -p sanp_db* paul -p sanp_db h pit-viper.snake.net Capltolul 1 Introducere in MySQL. si SQL 93 Evident, prima comands este mai ujor de introdus decit a doua. Pentru caaliasul si aibS fect de fiecare dati cind deschideti sesiunea de lucru, plasayi comanda alias intr-unul din figierele de pornire ale interpretorului dumneavoastri (de exemplu .cehro pentra eah sau -bash_profile pentru bash). Un alt tip de scurtituri este crearea unui script de interpretor care executi aysal automat, cu optiunile adecvate. In UNIX, un figier script echivalent cu aliasul samp. cb prezentat anterior aratl astfl: [bin/sh exec mysql -h pit-viper.snake.net -u -paul -p sanp_sd Daci denumese scriptul sanp_db gi fl transform intr-un executabil (Folosind comanda chmod +x sanp_db), pot rasta samp_ob pentru a rula aysql si pentru a mi conecta la baza mea de date. Sub Windows, in aceleasi scopuri se poate folosi un fgier batch, avind extensia bat gi conjinind ccmenzi executabile fii interventia utilizatorulai. Denumigi figierul sanp_db.bat gi inserati in figier o linie ca aceasta: niyeql -h pit-viper.snake-net -u -paul -p semp_od Acest fier batch poate fi rulat fie tastind sanp_db la promptul dintr-o consoli DOS, fie execurind dublu clic pe pictograma sa din Windows. Dac obgineti acces la mai multe baze de date sau vi conectayi la mai multe gazde, puteyi defini mai multe aliasuri saw scripturi, fiecare din acestea invocind aysql cu opyiuni diferite, ~ Emiterea de interogiri cu o cantitate mai mici de text introdus de la tastaturi sysql este un program extrem de util pentru interactiunea cu baza dumneavoastri de date, dar interfata saest ideali pentru interogiri scure, de un rand, nysq nu este interesat dack @ interogare se extinde pe mai multe randuri, desigus dar nu este prea gmmuzant si tasteri ieterogiri lung. Introducerea une interogiri, chiar sia uneia scurte, nU este nicl ea prea dlistractiva, daci descoperi cl trcbuie si 0 tasteci din nou datoritd unei erori de sneaxk Existl numeroase tehnici pe care le puteyi utiliza pentru evitarea unor introducer gi re- introduceri inutile de text © Folosigi caracteristica de editare a liniei de intrare din nysal. © Utilizati copierea si ipirea, © Rulaji nya in mod batch, ‘* Evita si inwoducei instructiuni INSERT, prin utilizarea datelor existente pentru ctearea de noi inregistrii Utilizarea editorului liniilor de intrare din mysql {In nysat este incorporati biblioteca GNU Realine, care permite editarea linilor de intrare, Putesi manipula linia pe care o introduceti la un moment dat sav puteti relia linile introduse anterior gi le putetire-introduce, fie ca atae, fie dupio modificare ulte- loari. Acest Iucru este convenabil cénd introducefi o lini si observati o greyeala de 94 —Parteal Utlizerea generalé a sistemului MySQL introducere a textuluis puteyireveni in interiorul liniei pentru a corecta problema fnainte de a apisa pe tasta Enter. Dacd introduces o interogare care confine o gresealf, puteti relua interogarea si 0 puteyi edita pentru a remedia problema, dupa care o retrimitey (Acest lueru este cel mai ujor de facut dacktastaji intreaga interogare pe o singuri lini) Unele dintre seevenjele de editare pe care le veti isi utile sunt prezentate in tabelul 1.4, Gar existd mule comenzi de editae a lini de intrare in afaraceloc prezentae in tabel, utefi gis o versiune electronic a manualulvi Readline prin consultarea mororului dumm- genganepreer de ciutare in Internet. Manualul este de asemeneainclus in distributia Readline, disponibila in situl Web al proiectului GNU, la adresa netp: // wm. gru.org/. ‘Tabelul 1.4 Comenzi nysai de editare a lini de intrare Secventi de taste ‘Semnifcatio. ‘Sageats sus, Cli-P Reluares irs anteoare Ségoat jos, Cu-N Reluara iri ulterioare ‘Sigoatstinga, CHB Deplasarea cursor la stnga (apo) ‘Ségoats dreapla, CULE Deplasarea cursruladeapta (nant) Eso C8 Deplasre inapoicu un cava Eso cule DeplasareInainte cs un cavdnt crea Deplasarea cursrui la roeputl net oe Deplasarea cusoru la ttl inl crn ‘Stergerea carter alt sub cursor Delete Stergerea earacterl dn st8nga cursor EscD Storgerea wants Eve Backspace Storgorea cuvéntlu din sténga cursor ux Sterge tot, dels cursor a stp nil or, -Aruleaz uli modficare; se poat peta Exemplul urmator descrie o utlizare simplé pentre editarea liniei de intrare. SB presu- ppunem cf afi inteodus aceasta interogare in timp ce utilizayi nysaa: rnysql> SHOW COLUMNS FROM persedintes Daci observasi e¥in loc de ,pregedinte“ ai scris ,peryedinte*,tnainte de a apisa pe tasta Enter, apisaji casta sigeati stanga sau combinatia de taste Cul-B de cateva ori pentru a ddeplasa cursorul la stanga, pin’ eind ajunge la litera s. Apoi apisayi de dou ori pe tasta Delete pentru a sterge caractercle or, tastati re pentru a remedia eroarea si apisati pe rasta Enter pentru a emite interogarea. Dack apasati pe testa Enter inainte de a sesiza ‘eroarea, nu este nici o problema, Dupi ce nysat ig afigeaz mesajul de eroare, apésati pe rasta sigeati sus sau pe combinagia de taste Ctri-P pentru a relua linia, dupi care 0 edi- ‘agi aga com am aritat mai sus. Editarea linilor de intrare nu este disponibill in versiunea Windows a programului fsysal, dar vi putes! procura distribuya client gratuit eygwin_s2 din stul Web MySQL. Prograrmul aysqie din acea distribuyie este similar cu nysal, dar ingelege comenzile de ceditare a liniei de intrare. Capitolul 1 Introducere in MySQL siSQL 95 Utilizarea copierii si a lipirii pentru emiterea de interogéri ‘acd lucraintr-un mediu cu ferestr, putet salva textul interogirilor care vi se par utile intr-un fisier si puteti folosi operaiile de copiere si lipire pentru a emite cu usuringa acesteinterogiri Pur si simplu respectayi urmitoarea proceduri: 4. Invocayi nysat ints-o fereasteS Telnet sau intr-o fereastri de consoli DOS. 2. Deschideyif serul care confine interogirile dumneavoastriintr-o fereastri document. (De exemplu, eu folosesc BBEdit sub Mac OS, respectiv vi into fereastri xterm sub X Window System in UNIX.) 5, Pentru a exezuta o interogare stocati in fisierul dumneavoastr, selectaji-o si copiati-o. ‘Apoi, comuafi in fereastra dumneavoasttd Telnet sau in consola DOS si lipitiintero- sgarea in MySQL. Proceduca pare cam stingace descrisi pe hartie, dar este o modslitate rapid de a intro- duce interogir. rapid si irk a mai serie nimic atunei cind o folosii efectiv. De asemenea, aceasta tchnici va permite si vi editatiinterogirile in fereastra document, jprecum si si construigi interogiri noi prin copierea si lipirea componentelor interogivilor existente, De exemplu, dact selectati frecvent rinduri dintr-un anumit tabel, dar dorii si vederi datele de iesire sortate in diferite moduri, puteti folosi o listt cu diferte clauze ORDER BY in fereastra dumneavoastri document, dup3 care o copiaji 0 lipiti pe aceea pe care dorii si o utilizayi pentru orice imterogare specific. Puteyi folosi copierea si lipirea si in cealalté directie (de a Telnet cltre fsierul dumnea- voastri cu inte-ogiri). Cind introduces lini in nysq), acestea sunt salvate intr-ua figier denumit .nysql_history din catalogul dumneavoastri de baz. Daca introducefi manval «a interogare pe care dori si o salvati pentru a o consulta ulterior, parisiti programul nysah, deschidesi .nysq1_nistory intr-un editor, apoi copiati gi lipiti interogarea din fisierul -nysql_history in figierul care confine interogarea. Rularea programului mysql in mod batch Nu este necesati rularesintéractiva a programuluimysad; acest program pate citi un fisier fn mod non-intractiv (batch). Acest mod este util pentru interogiei pe clre le rulati perio- dic, deoarece a dori evident, of reintroduce de le tastaturl 0 asemenea interogare de Fiecare dati cind o rulayi, Este mai ujor si inserai o dati interogarea intr-unfisier, dup care si cereti programului mysql si execute conginvtul fiserului conform necesittilor. Si presupunem ci avetio interogare care giseste pe membrii Lig istorice interesati de 0 snumiti perioadi din storia Staelor Unite, chutind in coloana interese a tabelului nendrv. De exemplu, pentru a-igisi pe membrii interesai in perioada de crizi a anilor 30, intero- garea trebuie sors astfel (reine caracterul puncr si virgulé de la sfarsivul instractiuni, Pentru ca mysql si poati sesiza locul unde se incheie aceasta) SELECT nume, prenuse, email, interese FROM sendru 0 LIKE “sorizast Plasagiinterogarea intr-un figier denumit interese.sql, apoi rua interogarea furni ind fgierul programului mysqi,astfel: ‘% mysql sanp_¢b < intorese.sqt 96 Parteal_Vilizarea generalé a sisternului MySQL. {in mod prestabilt, aysal gemereazi date de iesre thtr-un format delimitat prin tabula- tori atunci cind este rulat in mod grup. Daci dori si obfineyi acclasi format tabular atunci cind rulaji ayeal in mod interactiy, folosiyi opriunea % mysql ~t senp_db < interese.sa) | Dact origi si salvati datele de iesie, redirectionati-le spre un fier: % mysql ~t sanp_db < interese.sql > fisier_tesire Pentru a folosi interogarea in scopul de a gisi membri interesafi de personalitatea lui Thomas Jefferson, puteyi edita fisierul cu interogarea pentru a inlocui criza cu verterson, dupi care rulayi aysat din nou, Aceasti metodé functioneaza atita timp cit nu folosiqiinterogarea foarte freevent. Daci o folositi foarte frecvent, atunci este nece- | sari o alti metodi. O modalitate de a spori flexbilitatea interogirii este de a 0 insera {ntr-un script de interpretor care preia un argument din linia de comands a scriptului si foloseste pentru a modifica textul interogiri. Aste, interogarea devine parametrizatd yi va permite si specificafi cuvaneul cheie care arati domeniul de interes atunci cind rulati scriptul. Pentru a vedea modul de funcfionare al acestei metode, serie tun mie script de interpretor, denumit interese.sh: A [bin/sh if [ $# -ne 1 J} then echo "Rog specificati un cuvant cheie"; exit; Ti mysql -t sanp_db < datactxt Comanda cat asteapti datele de intrare. 4. Lipigi datele pe care le-ati copiat din foaia de caleul in fereastra Telnet. Programul cat rede ci introduceyi personal informariile gi le scrieindatoritor in fisierul data. txt. 5. Dupi ce toate datelelipite au fost scrise in fier, apisati pe tasta Enter in cazul tn care cursorul ajunge Ja sférsitul unei linii de date, nu la inéepurul une linii noi. Apoi, apisati pe combinasia de taste Ctrl-D pentru a indica ,sfargtul figierului*. Programul ne {nceteazi si mai astepte date de inteare si inchide fsierul. 5 in acest moment, aveti un fipier data.txt care congine blocul de date pe care lati selec~ turin foaia dumaeavoastr de calcul tabelar gi care este gata deaf incSeat ts bata dim neavoastré de date cu LOAD DATA sau nysqlinport. Copierea x lipiea reprezintd o metoda rapida si simpli de a tcansfera date intr-un figier UNIX, dar este mai adeevatk pentru seturi mai mici de date. Cantiitile mai mari de date pot depisi limitele bufferului de copiere al sistemului dumneavoastri. In ascmenca xml, se recomands salvarea foil de calcul tabelar fn format text snuplu (delimita prin tabulatori). Apoi, putesi wransfera figerul din calculatoral damneavoasted in contul UNIX folosind FTP. Transferafifigerul in mod text (nu in mod binar sau imagine), ast- felincat caracterele sfrsit de rind si fie convertite in caractere UNIX de sfarsit de rand. (UNIX foloseste caractere salt la linie nowa, Mac OS foloseste caractere revur de cat, iat Windows foloseste perechea de caractere retur de car-salt la linie nowi.) Putefi indica instructiunii Low DATA sau programului aysqlinport tipul caracterulul sfargt de rind pe care si-1astepte dar in UNIX este mai usor de lucrat cu figierul daca acesta conjine caractere de sal la linie noua. Dupi transferul fisicrului, este bine sf verificayi dacd are sau au sainduri vide lasfrsi. Daci are, trebuie si le stergeti, deoarece alfel se vor transforma in fnregistriri vide sau deformate arunci cénd incarcaifigirul in baza de date. 98 Parteal_Utiizarea generalé a sistemului MySQL fn fsiercle salvate in format text simplu dintro foaie de caleul tabelar, valorile car ‘onfin spayii pot fi delimitate prin ghilimele, Pentru a elimina ghilimelele atunci cind {ncircagifiierul in baza dumneavoastr3 de dat, folosigi clauza FIELOS ENOLOSED By pentru instructiunea LOAD DATA, respectiv opfiunea ~-fields-enclosed-by pentry rysqlinport. Vezi informayile despre instructiunea LOAD DATA din Anexa D pentru a obgine mai multe detali De aici, incotro? ‘Acum stifi destule despre MySQL. Puteri configura 0 bazi de date si crea tabele, Pate insera inregistrii in acest tabele, le putesiregisi in diverse moduri, le puteyi modific, sau sterge. Dar mai aveyi ined multe de invigat despre MySQL; manualul din acest capi- tol a reprezentat numai o mick introducere. Puteti vedea acest lucru examingnd stares bbazei noastre de date exemplu, Am creat baza de date gi tabelele sae si am popula tunele date inigiale. Pe parcursul acescui proces am vizut mogul de scriere al unora dim interogitile de care avem nevoie pentru a rispunde la Sntrebiri privind informal din | baza de date. Mai sunt, insi, multe de ficut. De exemplu, nw dispunem de nici o modalitate interactivi convenabili de a introduce noi inregistriri de punctaje in cadrul proiectului de evidenté a rezultatelor scolar, respectiv inregistriri cu noii membri in catalogul Ligi itori convenabili de a edita inregistririle existence. i tot nu putem genera formularele tipirite | sau in format electronic pentru catalogul Ligit. Aceste sarcini, precum gi altele, vor f shordate din now in capitolele urmétoare, mai ales in capitolele 7, ,Interfaya APT pentra | Peel DBI", respectiv 8, pInterfata APT pentru PHP* Drumul pe care veyi merge in continuare printre paginile acesti ciri depinde de dome: | niul dumneavoastri de interes. Daci dorigi si vedeti modul in care am finaliza proiectele legate de Liga istorick si de evidenga rezultatelor scolare, Partes a IT-a se refer | Ja programarea in MySQL. Daci vet indeplini funcyia de administrator MySQL pentru sieul dumneavoastrs, Partea a II-a a volumului de fai trateaza despre sarcinile admi wative Toni of recomand sf acumula mal int canon splinenae de ona eneral despre utlizarea sistemului MySQL, citind celelate capitole din Partea I. Acest | Seay a rene peated mearnsii sen aie da suplimentare despre sintaxa si despre utilizarea instructiunilor de interogare zinta modabitigi de rulare mai rapid a interogirilor. O bazi solids de eunostinte leyate de aceste subiccte vi va fi de folos indiferent de contextul in care folositi MySQL: rulaf programul nysal, vi scrieyi propriile programe sau indeplinigi atribusiile unui admi trator de baze de date. Caritowun 2 Lucrul cu date in MySQL si SQL -un fel sau altul, date, deoarece rostul rin definite, acela de gestiune a datelor. © evaluare a unei expresii, cu scopul de Pract, tot ceea ce faceti in MySQL implicé, int tau sistem de gestiune a bazelor de date este Chiar $10 simpld instrucyiune seLect + impli produce o viloare a unei date intregi Fiecare valoare a unei date din MySQL. are un tip. De exemplu, 37.4 este un numa, ‘ape este un sir. Uneori, tipurile de date sunt explicite, ca atunci cind emiteti 0 instructiune CREATE TABLE care specific tipulfiecireicoloane pe care o declarati ca parce a tabeluluis CREATE TABLE tabelul_eeu ‘ J coloana cu valoré intregt */ J coloana cu valori sir */ J coloana cu valori date */ Ant_col INT, sir_col CHAR(20), ) fo ate situa tipurile de date suneimplicte, cum este atuncicind faci referre la valor literal dinr-oexpresi, end transferai valori une func sau cand folosiivaloarea rerur- sat din acea fungi: INSERT INTO tabe2ul_neu (4nt_col,sir_col,éate_col) YALUES(14,CONAT("2%, "b*), 19580115) Aceasti instructiune INSERT efectueazi urmitoarele operatii, din care toate impli tipuri de date: * Auibuie valoarea 14 coloaneifatregi! int_cot # Transfer va oil sir ‘agi "b* funcyiei GONGAT(). Aceastlfunctie eturnenzi valoatea sir "ab, care est repartzati fn coloana si sir_col. ‘ Aurbuie valoareaintreagi 10990115 coloanei de tip dati data_col. Atribuirea implied 6 neconcordanfé intr tipuri, deci MySQL converteste irul 19990118 in data “1809- 01-15% aces: fap aratk cl MySQL executi conversia automat a tipului. Pent a folosi MySQL fa mod eficient, este esenfial si ingelegeyi modul de manipulare a datelor in MySQL. Acest capitol descrie tipurile de date pe care le poate manipula MySQL gi discuss problemele implicae de lucrul cu acese tipuri "Dei nln med a va inelege colon car confine valor uoere ince S-aprferat in waducere ‘rims form, din moive de concn La fel de va proceda cu expres ge claona pi rate. NE, 100 Parteal_Utiizarea generalé a sistemului MySQL © Categorie generale de valori pe care le poate reprezenta MySQL, inchusiv valoarea NULL, * Tipurile concrete de date pe care le furnizeaz’ MySQL pentru coloanele tabelelor, pprecum si proprietijile care earacterizeazi fiecare tip de coloani. Unele dintre tipurile decoloane MySQL au un caracter destul de general, cum este tipulyir CHAR. Alte ipusi, ‘cum este TIMESTAMP, au comportiri speciale, pe care trebuie si le ingelegeti pentru a evita surprizele, © Alegerea adecvati a tipului de coloand pentru tabelele dumneavoastri. Este important SK stigi modul de a alege tipul cel mai adecvat intereselor dumneavoaste& cind con struigi un tabel, precum si si alegey intre un tip gi altul atunci end se pot aplica mai multe tipuri pentru categoria de valori pe care doviti si o stocaf ‘© Regulile MySQL pentru evaluarea expresillor. MySQL. oferio gam lagi de operstori si functii pe care le putey folosi pentru a regisi,afiga si manipula date. Regulile pentru evaluarea expresillor includ regulile care controleaza conversile de tip, atunci cind © valoare de un tip este folositd intr-un context care impune o valoare de un alt tip. Este important si ingelegeyicind se produce si cum functionesza conversia de tip; unele ‘conversii nu au nici un sens gi genereazi valor firi nici o semnificayie. Prin repartizarea sirului ‘13* intro coloand intreagi se objine valoarea 13, dar repartizarea sirafui "abc" in coloana respectivi are ca rezultat valoarea 0, deoarece ‘abo” mu arati ca un num. Mai elu, dac8 efectuati o comparatie fard a cunoaste regulile de conversie puteti provo- ca pagube serioase, cum ar fi actualizarea sau stergerea tuturor rindurilor dintr-un tabel atunei cind intengionati sf modificagi numai citeva randuri. Dou anexe congin informagii suplimentare despre tipurile de coloane, operator si le MySQL. Acestea sunt Anexa B, ,Referintd de tipuri de coloane", respectiv Anexa C, ,Referintd de operator si func Tipuri de date MySQL ‘MySQL ,cunoaste numeroase tipuri de date, in spefS eategorii generale in earé pot fi reprezentate diverse valor. Valori numerice ‘Numerele sunt valori precum 48 sau 199.62. MySQL ingelege numere specificate ca Sncregi (Pied parte fractionara) sau valori cu vingula mobil (cu parte fracfionara). Intregi pot fi specifica in format zecimal sau hexazecimal. Un fntreg consti dintr-o secventi de cifre. Un intreg specifica in form hexazecimalt consti din secvenga x urmati de una sau mai multe cifre hexazecimale (cuprinse intce 0-8, respectiv a-f). De exemplu, 0x0s este 10 in format zecimal, ar Oxf ff este 65535 in format zecimal. Cifrele hexazecimale non-numerice pot fi specificate cu majuscule sau minuscule, dar secvenga de tnceput Ox nu poate fi scrsi sub forma OX. Cu alte euvinte, ‘0x0a gi Ox04 sunt corecte, dar OX0a si OXOA nu sunt. Un numir cu virguld mobili consti dintr-o secventi de cifte, o virguld de separace 2 inti fracsionare gio alté seovenji de cifre. Una dintre cele doua secvente de cifre poate fi vida, dar nu ambele simultan. Capitolul 2 Lucrul cu date in MySQL siSQL 104 MySQL ingelege notatia stiinified. Aceasta este indicatd prin insergia imediat dup un sumar intreg sau in virguli mobili aliterei sau &, unui caracter sem (+ sat) si unui exponent intreg, 1.348+12 gi 43.27e-1 reprezintS numere scrise in notatie gtiintifick orecti. Pe de altS parte, 1.84612 nw este scris corect, deoarece lipseste caracterul semn fnaintea exponentului, Namerele hexazecimale nu pot fi folosite in notagile stiintific; caracterul e care se afl la incepurul exponentului este, de asemenea,o cifri hexazecimali, corecti si astfl se pot erea confuzi Numerele pot fi precedate de un semn minus (-) pentru a semnala 0 valoare negativi. Valori sir (caracter) © girarile sunt valori ca ‘Bucuresti, Ronania* sau "pacientul se simte mai bine Penccu a delimita 0 valoare gir se pot folosighilimele simple sau duble. {In interiorul sirurilor se pot folosi numeroase secvenge escape, care se pot folosi pentru a preciza caractere speciale, aga cum se poate vedea in tabelul 2.1. Fiecare secvengi incepe u_un caracter backslash (\) pentru a semnifica o exceptie temporari de Ja regulile obignuite de irterpretare a caracterelor. Reyineyi ef un octet NUL nu este unl si accl Iucru cu o valoare NULL; NUL este un octet de valoare zero, in timp ce MULL semnificd absenja unei valori. ‘abelul 21 Secvente escape din sruti Seoventa Semnificstia . w uu (asort 0) " Gtilinele simple . Gtilmele dbo Slergre career ener ia Caractere nous \e Retur de car ° ie Caractere taba ‘ W Backtosh . Pentru 2 include ghilimele int-un sis, puteti proceda ast © Dublag ghilimelele, daci sirul este inclusintre ghilimele folosind acelagi caracter: “ani 170" “EL zise: “*TL-am spus eut*** '# fincadrat sirul folosind celelalteghilimele; in acest caz, nu dublati ghilimelete din si sani ‘70° EL zise: “Ti-am spus eu!” * Anulati semnificagiaghilimelelor cu un caracter backslash; aceasté metoda este aplica-., bila indiferere de tipul ghilimelelor folosite pentru a incadea sirul: “ansi. \'70" "anit. \°70" 102 Parteal__Utiizarea generalé a sistemulul MySQL. sel aise: \°Ti-am spus eul\** ‘el aise: \*Ti-am spus cut fn contextelegirurilor, se pot folosi constantele hexazecimale pentru a specifica valorile de tip sr. Sintaxa este cea descrisi anterior pentru valorile numeric, dar perechile de cifre hexazecimale sunt interpretate drepe coduri ASCII si sunt convertte in caractere Rezultatul este folosit sub forma de sir. De exemplu, cind este interpretat sub forma de sir; Ox616269 este “abo. Valori de tip data Datele si orele sunt valori precum "1999-06-17" sau *12:30:43", De asemenea, MySQL. | ingelege valorile dati/ori combinate, precum "1999-08-17 12:20:43". Rejiney faptul ck MySQL reprezinté datele in ordinea an-luni-zi. Acest Iucra ii surprinde deseori pe incepitorii in materie de MySQL, desi acest format este standardul SQL ANSI. Putesi | afiga valorile datelor in orice mod dorigi folosind funcyia OATE_FoRWAT(), dar formacul de afigare prestabilit afigeazi mai intai anul, iar valorile de intrare trebuie specificate Sncepind cu anul. Valoarea NULL NULL este un fel de valoare gfx tip", fn general, este folosid svaloare necunoscuti", ,valoarelipsi*, yin afta domeniului,ynici una din precedentele “optiuni™ si aga mai departe, Puteti insera valori NULL in tabele, le puteri regisi din tabele gi pute testa dact o valoare este sau nu NULL. Nu putefiefectua operat aritmetice cu valori NULL, (Dac$ incercagi, rezultatul este NULL.) Tipuri de coloane MySQL Fiecare tabel dintr-o bazi de date este aleituit dintr-una sau mai multe coloane. Cind creafi un tabel folosind o instructiune OREATE TABLE, specificayi un tip pentru fiecare coloan’, Un tip de coloani este mai specific decit un tip de date, care este numai o cate gorse generali de genul ,numir* sau .sir. Un tip de coloani caracterizeazi eu exact tate categoria de valori pe care © poate confine o coloani a unui tabel dat, cum este SHALLINT sau VARCHAR (32). Tipurile de coloane MySQL reprezinti mijloacele prin care deserieti categoriile de valori pe care le contin coloanele unui tabel, care, la rindul lor, determin modul in care MySQL trateaza aceste valori. De exemplu, daci avefi valori numerice, le puteti stoce folosind un tip de coloané numeric sau sir, dar MySQL va tata valorile oarecum diferit, in funcrie de modul in care le stocati, Fiecare tip de coloani are numeroase caracteristic: © Ce tip de valori putesi stoca in coloana respectivi © Spasiul pe care il ocupt valorile, precum gi daci valorle sunt de lungime fix (toate valorile de acel tip ocupa aceeasi cantitate de spayiu) sau de lungime variabilé (eanti- tatea de spatiu depinde de valoarea particulack stocata) © Modul de comparare i stocare a valorilor din tipul respectiv semnificayia ,fir% valoare’, Capitolul 2 Lucrul cu date in MySQL siSGL 103 ‘e Dac tipul respectiv accepti sau nu valori NULL ‘Daci tipul respectiv poate fi indexat sau nu ‘Yom examina succit tipurle de coloani MySQL pentru a avea o imagine de ansamblu, dupi eare vom discuta mai dealiat proprietyle care caraterizeazafiecare tip. (0 examinare a tipurilor de coloane SQL furnizessi tipuri de coloane pentru valori din toate categorille generale de weg 2c date, cv cxcepta valor NULL. Valoarea MULL acoperd toate puri in sensul ck esblttea unl coloane de a confine sau nu valor MUL este tata ea aribut de tip ‘SQL are tipur de coloane atét pentru valorile intreg, edt si pentru eele cu virgulk aa eyo, poate vede in abel 22. Coloanleinreg por cu sav ek semn. Jo trout special permite valorilor din coloanele intreg si fie generate automat, ceea ce {Bie til in aplicagl care impun numere dintr-o seevensi sau de identificare unice. ‘Tabelul 2.2 Tipuri de coloane numerice mete tipi ‘Semnifcatio EwvINT Un integ foarte mic SuALLINT Un intreg mie ‘Meo1UMINT Un laveg de dimensisne media at Un inbeg standard . BIGINT Un integ mare FLOAT Un num ou vrgld mobi n prec simgl ouBLE Un nur cu vrglé mobi tn dub pectic ECIUAL, [Un numa cu vrgulé mobi, eprezentat sub forma de sir ‘Tipurile de coloane gir din MySQL sunt prezentate in tabelul 2.3. Sirurile pot congine one, chiar si date binare arbitrare, cum sunt imaginile sau sunetele, ‘Sirurjle pot fi com- © parate in functie de sensibilitatea lor la diferengafntre majuscule si minuscale. De aseme- i 6 fapt, fn hea, putefi efeecua co girurh stabilirea de corespondene cu un model. (De fapt, MySQL putopi e'ectua stabilirea de corespondente cu un model pentru orice tip de coloane, dar aceastk operafie se executi cel mai freevent cu tipuri gi.) Tabelul 2.3 Tipusi de coloane sit Numele tiputut ‘Sornificatie owe Uns do caracere de lungime xa VARCHAR Un gird caractre de ungime vai anvaLos [Un BLOB (oiec nar mare) foarte mic B08 ‘Un BLOB mic MeorUWBLos Un BLOB de dimensiun medi Comtinuare 104 — Parteal Utlizarea generalé a sistemuiui MySQL Tabelul 2.3 Continuare ‘Numole tipulu Semnifcaie LoNGBLOB Un BLOB de dimensiun! mat munvrext Un gic tet foarte mic Text Un gi text mic eDTUUTEXT Un girtoxt de dimenstan meat onerexr Un gitext de mari densiuni | Ew (0 enumerare;colcanclr Ise poate atibul un merry al enumert_| ser = Unset; coloanelor ise pot tui mat mul mombri ai unui set Tipurile date si ori din MySQL sunt prezentate in tabelul 24, Pentru valori temporal, ‘MySQL furnizeaza tipuri pentru date (cu sau fara ori), ore si amprente de timp (un tip special, care vi permite si detectati data si ora efectuaei ultimei modifier intr-o inregis- tare). De asemenea, existé un tip pentru reprezentarea eficienti a valorilor anilos, tune | cand nu aveti nevoie de o datk complet’, ‘Tabelul 24 Tipuri de coloane dati si ori Numel tipi Semnificatie ATE © valoare perry den format "AAAA-LL-22" Te © valare penta or, in format “hha 88° DATETINE (© veloare pei dats io in format *ARAR-LL-22 n:mmss* TIMESTAMP © valoare panty amprenia de tnp, In fomat AaAALLzznhmss ean ( veloare penta an in fomat AAA Pentru a crea un tabel emitefi o instructiune OREATE TABLE si specifcay o listS a coloa- nelor care alcatuiesc tabelul, Fiecare coloand are un nume si un tip, iar la fecare tip se pot asocia mai mult atribure. Tatk un exemplu care ereeaz& un tabel denumit vabelul new, | cu trei coloane, denumite f, ¢ $i i: CREATE TABLE tabelut_mou q ¥ FLOAT(10,4), © GHAR(15) NOT NULL DEFAULT ‘ninic*, A TINVINT UNSGNED NULL ) Sintaxa pentru declararea unei coloane este urmitoarea: rnume_col tip_col (atribute_coloana) {atribute generate] Numele coloanei este dat de nune_cot. Numele coloanelor pot avea o lungime de maxi ‘mum 64 de caractere si pot fi aleitute din caractere alfanumerice, precum si din carac- terul de subliniere si simbolul dolarului (in spesi _ si $). Un nume de coloani poate fncepe cu orice caracter admis intr-un nume, inclusiv cu o cifré. Totusi, un nume nu poate fi compus integral din cifre, deoarece astfel ar deveni practic confundabil ca va Capitolul 2 Lucrul cu date in MySQL si SQL 105 sumir, Cuvinte precum SELECT, DELETE sau CREATE sunt rezervate si nu pot fi folosite drept nume dz coloana. Totusi, numele fancyilor (cuvinte precum P08 gi MTN) nu sunt rezervate $i pot fi folosite, Tipul de colocni tip_cot precizeazt categoria exactd de valori pe care le poate contine coloana. Specificatorul de tip mai poate indica i lungimea maxima a valorilor pe care le stocaji in colcand. Pentru unele tipur, specificayi lungimea in mod explicit sub forms rnumeric3. Pentru altel, langimea se deduce din numele tipului, De exemplu, CHAR (10) fick o lurgime expliciti de 10 caractere, in timp ce valorile T1WYBLO8 au 0 lungime maxima implictd de 255 caractere. Unii dintre specificatorii de tip vi permit si indicati 6 litime maxima afigati (numérul de caractere de utilizat pentru afigarea valorlor). Tipurile de coloane cu virguli mobil permit specificarea numarului de cifre dupa vir- 4guli, astfl incit s¥ puteyi controla nivelul de precizie al valorilor. Dupi tipul coloani, putesi specifica atributesoprionale specifice unui anumic tip, pre- cum si atribute de ordin mai general, Atributele funcrioneaz’ ca modificatori ‘Acestea determaini progeamul MySQL si modifice inte-un fel sau altultratamentul apli- cat valorilor din coloani: # Atributele permise specifice tipului depind de tipul de coloani pe care it alegeyi. De exemplu, UNSIGNED este permis numai pentru tipurile intreg, iar BINARY este permis rumai pentru tipurile CHAR si VARCHAR, Acributele generale pot fi date pentru orice tip de coloani, cu anumite exceptii. Puteti specifica NULL sau NOT MULL pentra a preciza daci o coloan poate congine sau nu valori HULL. De asemenea, puteti specifica DEFAULT valoare_prestabiiita pentru a arita ck ‘o coloand trsbuie si primeascd valoarea valoare_prestabilita atunci cind este creat un rind nou firi a se specifica in mod explicit valoarea coloanci. Valoarea valoare_prestabilita trebuie si fie 0 constanti; nu poate fi o expresie si nici mu poate face referire la alte coloane. Nu putesi specifica o valoare prestablitd pentru coloanele 8108 sau TEXT. Daci sunt procizate mai multe atribute specifice unei anumite coloane, acestea pot fi precizate in orice ordine, cu condita ca acestea si respecte tipul colognei si si precead scherale, Similar, daci sunt date mai multe atribute generale, cle pot fi specificate in orice ordine, cv conditia si respecte tipul coloanei si si fie plasate dupa toate atributele specific de coloani existente, th continuare, aceasty secyiune discutk despre fiecare dintre tipurile de coloani MySQL, pentru a prezenta sintaxa utiliza la declararea tipului si proprietiile care o caracteri 2eazi, cum ar fi ceringele privind domeniul si capacitatea de stocare. Specificarile de tip sunt prezentate asa cum sunt utlizateacestea in instruciunile CREATE TABLE. Informasile optionale suntincadrate ntre paranteze drepte ((1). De exemplu, sintaxa MEDIUNINT{(M) ] arati ci Tigimen maxima de afiare, specificati sub forma (I), este opfionali, Pe de alté Parte, pentru o48A (W), lipsa parantezelor arati c(i) este obligatorie. 106 Partea!l_Uitiizarea generalé a sistemului MySQL Tipuri de coloane numerice Tipurile de coloane numerice din MySQL. se tneadreazi in dou’ categorii generale: ‘© Tipuri intregi. Pentru numerele fird parte fracyionari, precum 1, 43, -3,0 sa Puteti folosi coloanele intregi pentru date reprezentate de numere intregi precum greutatea aproximati la cea mai apropiati cantitate in kilograme, inalyimea aproximacd Ta valoarea in centimetri cea mai apropiati, numéeul de stele dints-o galaxie, numirul de persoane dintr-o gospodirie sau numirul de bacteri dintr-un vas de culturi. ‘© Tipuri cu virgul mobili Pentru mumere care pot avea o parte fractionari, preeum, 8.14188, -.00273, -4.78 sau 39.9844, Puteri folosi tipuri de coloane cu virguli mobili pentru valori care pot avea 0 parte fractionari sau care sunt extrem de mari sau de tmici, Printre tipurile de date care pot fi reprezentate sub forma de valori cu virgull mobili sunt: producyia agricola medie, distangle, valorile monetare (pretul unui arti= col sau un salariu), rata gomajului sau prepurile actiunilorla bursa. Acestea sunt tratate sub form’ de valori cu virgula mobili cu o parte fractionari zero. Numele si domeniul fiecirui tip numeric sunt prezentate in tabelul 2.5. Cantitatea de spatiu necesari pentru valorile de fiecare tip este prezentati in tabelul 2.6. Instrucfiunea CREATE TABLE Exempete folsite in acest capitoutizeazd in exfensoinstuctonea CREATE TABLE. Instucunea ar trebuts8 vi fe destl de cunoscut, decarece am folst- In secfunea de manual @ capiolui 1, sinoducere n MySQL gi SQL" De asemenea, ver informatie despre instuchunea CREATE. TABLE dn ‘Anoxa D, Refer de sintaxd SQL ‘Tabelul 2.5 Domenii de existent ale tipusilor de coloane numerice Domeniy Valor cu ser: inte 128 gi 127 (ive -2” 3271) Valor tid semn intr 0 $1 255 (ne Og 21) Valor cu ser: rte -92768 si 32767 (ne -2° si 216.1) Valo fara sern: ne Os 65695 ne 0 si2"-1), Valor cu Sern: rte -8388608 s\ 8380607 (ine -2" gi 2.1) ‘Valor ar sera: ne Ogi 1877215 (hte Ogi 2-1) Valor cu ser: re ~ 2147489648 si 2147489647 (hire -2" gi 251) Valor rd sorn: inte 0 gi 4294967296 (nse 0! 2%-1) Valo cu semn: ie -9223372036854775806 51 £9223372036664775807 (ito -2° gi 2-1) Valo tra sem: Inte 0 s 18446744073709551615 (ne 0s 2-1) Valo minim cite do zero: 4117540435 16-38 Valo maximedifeite de zero: 28 402824686 +38 Valor mine deride zoo: +2.22507386850720 4-308 Valo maxime difrite de zor: #1, 7276981348623157E+208 \Variazs; domeniuldepinde de $10. ‘Specificatie de tip ‘TEWVENTE WO) SUALLINTY (W)] MeDIUMINT (Ht) INTL BIGINT] (4) FLOAT! (H,0)1, FLOAT (4) BOUBLEL (W,D)], FLOAT(B) DECIMAL (HD) 798432. | Capitolul 2 Lucrul cu date in MySQL siSQL 107 de stocare pentru tipurile de coloane numerice Tabelul 2.6 Necestipi de spayi specticatie do tp Spafu necesar Tawar ()} ‘octet © SMALLINTY (1) 2octoy eorumrnr( (1H) 3 oct INTL] 4 octet aI6INTI (H)) 8 octet FLOAT (M,0)1, FLOAT(4) 4 aca DOUBLE( (H,0)}, FLOAT(6) Boca ‘Mocte) (versiune MySQL antooaré versunl 3.28), +2 ote DECIMAL(W,D) ‘MySQL farnizeaza cinci tipuri intregi: TEWVINT, SALLINT, MEDTUMINT, INT si BIGINT. INTEGER este un sinonim pentru INT. Aceste tipuri variazd din punctul de vedere al domeniului de valori pe care il pot reprezenta. Coloanele intregi pot fi declarate ca Ustaueo pentra a interzice valorile negative; astfel, domeniul pentru coloani este depla- satin sus pe axa numerelor, incepand astfel de la 0. De asemenea, tipurile variaz’ din punet de vedere al cantititii de spapiu necesare. Tipurile cu un domenit mai extins nece- siti un spagiu de stocare mai mare. MySQL furnizzazi trei tipuri cu virguli mobil: FLOAT, DOUBLE gi DECZUAL. Spre deose- bire de ipucileintregi,tipurile cu virgula mobila mu pot fi UNSaNeo, iar domeniul lor este rit de acela a tipurilor intreg, prin aceea ci tipul respectiv nu poate reprezenta numai 6 valoare maxis, ci so valoare minim diferiti de zero, Valorile minime furnizeaza o misurd a preciziei ipului ceea ce este deseori important pentru inregistrarea datelor stiingifice. xis, desigus,valori maxime si minime negative corespunzitoare.) DOUBLE PRECISION( (M,D)] si REAL{(W,D)] sunt sinonime pentru DOUBLET (t,0)). NMERYC(H4,0)este sinonim cu DECIMAL (U/,0). FLOAT(4) gi FLOAT(@) sunt furnizate pen= tru compatibiliztea cu ODBC. fnainte de MySQL. 3.23, acestea ert: sinonime cu FLORT(10,2), respectiv DOUBLE(16, 4). Incepand de la MySQL 3.23, FLOAT(4) si FLOAT(8) 441 au proprial eomportament, deseiis pe seurt fn continuare. Cand alegeri un tip numeri, va gindigi la domeniul de valoti pe care trebuie si-l repre- entati $i aleget! cel mai mic tip care va acoperi domeniul. Prin alegerea unui tip mai mare se pierde spatu, rezultind astfelrabele inutil de masi care nu pot fi prelucrate la fel de eficient cz si atunci cand afi fi ales un tip mai mic. Pentru valori intregi, TINVINT «ste optim daci domeniul de valori al datelor dumneavoastri este redus, cum ar fi virsta tunel persoane seu numirul de frati sau surori, weOTuMttT poate reprezenta milioane de valor si poate fi folosit pentru mult mai multe tipuri de valori, cu preful unui spariu de stocare ceva mai mare, 8162NT are cel mai mare domeniu dintre toate tipurile, dar nece- siti un spagiu de stocare dublu fard de cel mai mic tip intreg urmitor (INT) gi trebuie si fie folosit numai atunci cénd este intr-adevir nevoie. Pentru valori cu virguli mobili, DouBL ocups de dows ori mai mult spat decit FLOAT. Cu excepfiasituasilor cind aver nevoie de o precizie exceptionali sau de un domeniu de valori extrem de mare, probabil ci vi puteri reprszenta datele la numai jamatate din spasiul de stocare, folosind FLOAT. 408 —Parteal_Utlizeres gonoral8 a sistemului MySQL ind declarayio coloani de tip intreg, puteti specifica 0 dimensiune oprionali de afigare Bee cede tbuiest foun tne cups ine 2569 reprezintd numirul deca. ractere folosit pentru a afigavalorile din coloani. De exemplu, MEDIUUINT (4) specifici 9 coloani meprvuzws cu o lipime de afigare egali cu 4. Daci declaatio coloani de tip intreg irk o liyime explicit, este atribuitd o ligime prestabilits. Valorle prestabilite constiuie | Iungimile valorlor ,celor mai lungi* pentru fiecare tip. Dack reprezentarea care se poste _| afiga a unei anumite valori necesita mai mult de W caractere, atunci se va afiga valoarea total; valorile nu vor fi samputate” pentru a se incadra in limita celor u earactere. Penira fiecare tip de coloana cu virguli mobili, puteyi specifica o dimensiune max aligare u si numarul de cifre dup virguli 0. Valoarea lui trebuie i fe cuprins: 41255, Valoarea lui 0 poate fi cuprinsé tntre 0 si 30, dar nu trebuie si depigeascd t-2, (Daci sunteyi un cunoscitor al terminologiei ODBC, u si D corespund conceptelor ODBC de .precizie" si .scaré".)m iD sunt opsionale pentru FLOAT si DOUBLE, dar sunt obligatorii pentru DECTHAL. Acolo unde w iD sunt optionale, in caz de omisiune sunt folosite valori prestabilite, Urmatoarea instrucfiune creeazi un tabel pentru a ilusta valorile prestabilite ale opfit~ nilor w siD pentru tipurile de coloane numerice (DECIUAL nu este inclus, deoarece M 510 ‘au sunt optionale pentru tipul respectiv): CREATE TABLE tabelu1_nou ( tiny TINVINT, ‘tény_v TINVINT UNSTGNED, ismal1 SVALLINT, ismall_u SHALLINT UNSIGNED, Sodium MEDIWUINT, isedum_u MEOTUMINT UNSIGNED, reg INT, ireg_u INT UNSIGNED, big BIOINT, ibig_u BIGINT UNSTONED, fp_single FLOAT, tp_double DOUBLE Dal emit o instruyiune 0€SCRIBE ‘abet, su dupa crearea tabelului, coloanele Field si Type ale datelor de iesire se vor prezenta astfel® i Fisid We VGainy einyine (1) i itinyy | tinyint(3) unsigned ismall | snallint(6) Senall_u — snallint(S) unsigned | mediumint (9) ediunint(8) unsigned ane(1t) Ane (10) unsigned bigint(20) bigint(20) unsigned float(10,2) float (18,4) 2 Limeade afigare port BIGINT vf 21 (20) dak rl scent nerogace oon o versune MySQL anterioa vrs 3.23, ator une eo minore =A Capitolul 2 Lucru cu date in MySQL siSOL 109 Fiecare coloani numeric are un domeniu de valori determinat de tipul coloanei. Dact incercafi si inserati o valoare care se afld in afara domeniului coloanei, se produce o trunchiere: MySQL. ,taie* valoarea corespunzitor punctului final adecvat al domeniu Iai gi foloseste rezuleatul. La regisirea valorilor nu se produce nici otrunchiere. Trunchierea valorilor se produce in conformitate cu domeniul tipului coloanei, nu cu lasimea de afigare. De exemplu, o coloans SWALLINT(3) are o ligime de afigare egala cu 3 itn domeniu cuprins intre -92768 32767. Valoarea 12845 este mai glad” decit li Ae afisare, darse alls in interiorul domeniului colosnei, deci este inserati fied ,tSiere" gi regisitd sub forma 12548. Valoarea 90909 se afld in afara domeniului, deci este redsd la 32767 cind este inserati. La regisirile ulterioare, valosrea apare sub forma 2767, {n general, valerile atribuite unei coloane cu virguli mobili sunt rorunjite la numarul de zeci- male indicat lk specifcarea coloanei, Daci scacasi valoarea 1.23486? intro. colon FLOAT (8,1), reaultatul este 1.2. Dac stocatiaceeasi valoare intro coloan’ FLOAT(8, 4), rezul- tanul este 1.2846, Aceastainscanni ci trebuie si declarai coloanele cu virgola mobili eu un snumir de zecimale suficient de mare pentru a vi ofei valor la precizia dorth. Dack ave, nevoie deo preczie de ordinul miimilor, nu declaragiun tip cu aumai dou cif dupa virgul Exceptia dela acest mod de manipulare a valorilor cu virguli mobili consti in acees ci, in MySQL 3.23, comportarea tipurilor FLOAT(4) si FLOAT (8) s-a modificat. Aceste dou tipuri sunt acum de tip precizie simpli (4 octet) respectiv’dubla (8 octey), care sunt ipuri cu virgult mobil& autentice, in sensu! ci valorile sunt stocate aga cum sunt date, in cadral limitelo: impuse de componentele dumneavoastri hardware. ‘pul pecruat este diferi de FLOAT si DOUBLE, in sensul ci valofile DECINAL sunt, de fapt,sto- cate sub form’ de siruri. Domenil maxim posibil penerv DECIMAL este acclsi ea pent bovELE, dar dor.eniulefectv este determinat de valorle parametrilor sip. Dack W variaed {iD rimane fix, domeniul ereyte dact wcreste. Acestfapt este ilustrat de primele rei randuri ale tabelului 2.7 Dack M imine fix sD variazi, domenial devine mai mie daci b creste, des precizia creste, Acest fapt este iustrat de ultimele tei rinduri ale tabelului ‘Tabelul 27 Influenga valorilor parametrilor isi 0 asupra domeniuluitipylui o€o2uAt(w,0) Specificatie do tip Domenis (pentru MySQL <3.23) —Domeniu (pentru MySQL. 3.23) DECIMAL (4,1) Inne -29 9.939 Into 9999 5199909 DECIUAL(5,1) Inte -99 i 900,9 Inte -¢009.9 51 29990,6 DECIMAL (6,1) Inte -999 9 5 9999.8 Inte -99909,8 gi 999909,9 DECIMAL(6, 2) ‘kre -90,29 999,09 Inve -0900,99 gi s0009,99) DECIMAL (6,3) Inte -9999 $99,099 Inte -¢99,908 gi 9999, 999 Domeniu! unui sip 0eCmMAL dat depinde de versiunea dumneavoastrd de MySQL. Pentra srsiunile MySQL anterioare versiunii 323, coloanele de tip OECIMAL (WD) sunt stocate folosind w oct per valoare, iar caraterul sem (daci este necesar) si vigula sunt inclise , in ceiw octegi. Astfel, pentru un tip ogcrWat($,2), domeniul este cuprins intre -9,9 gi 99,99, deoarece in acest interval se incadreazi toate valorile de 5 caractere posiba limba engl, vrgula aecimal se epecis Punetzecmal. MySQL folosete acest sistem, — NT 110 Utiizarea generalé a sistemului MySQL ncepind de la MySQL 3.23, valorile DECIHAL sunt manipulate in conformitate cu speci-_ ficayia ANSI, care precizesza ci un tip DECIWAL (0) trebuie si post’ reprezenta toate va. lorile cu M cifre gi 0 cifre dupa virgult. De exemplu, DECIUAL (5,2) trcbuie si poatl reprezenta valori cuprinse intre -999,99 si 999,99, Caracterul semn gi vngula trebuie yi ele | stocate, deci valorile OECIUAL incepind de la versiunea MySQL 3.23 folosesc us2 octey, Pentru DECIUAL (5,2) sunt necesari 7 octeti pentru cea mai hungi“ valoare (-999,93). La | extremitatea pozitiva a domeniului, octerul de semn nu este necesar pentru memoraren_| unui caracter semn, deci MySQL il foloseste pentru a extinde domeniul dincolo de ca! | cerut prin specificazia ANSI. Pentru DECINAL(S, 2), valoarea maxim’ poate f1 9999,99, | deoarece sunt disponibili 7 octet. Pe seurt, domeniul tipului DecruAL (u,0) pentru versiunile de Ia MySQL 3.23 ,in sus* | este echivalent cu domeniul tipului DECIMAL (&+2,0) din versiunile anterioare. {n toate versiunile de MySQL, daci 0 este egal cu 0 pentru o coloand DECTUAL, virgula tu este stocatd. Efectul este o extindere a domeniului coloanei cu un ordin de mirime suplimentas, deoarece octetul folosit ia mod normal pentru stocarea virgulei se poate utiliza pentru o alti cites Atributele tipului de coloani numerica Auributul 26ROFILt poate fi specificat pentru toate tipurile numerice, Acesta determini completarea cu zerouri inifale 2 valorior afigate pentru coloani, pentru a se objine liimea de afigare. Putesi folosi ZEROFILL cind dori si vi asigurati ci valorile din coloane sunt intotdcauna afigate folosind un numar de cifre dat. De fapt, este mai bine si spunem yun numir minim dat de cifre", deoarece valorite eu un numis de cifre mai amare decit ligimea de afigare sunt afigate complet, firi afi ,tKiate". Puteti vedea acest lucru emizind urmitoarele instruegini ‘CREATE TABLE tabelul_seu (conpletare_zerouri INT(S) ZEROFTLL) INSERT INTO tabelul_meu VALUES(1), (100) (10000), (1000000) SELECT completare_zerouri FROM tabelul_neu Datele de icsire ale instructiunii SeLect sunt prezentate in comtinuare, Observasi ci valoarea finals, care are un numir de cfte mai mare decitligimea de afigare a coloanei, este afigti complet: Partea | compietare zerouri | 0001 cot00 +0000 900000, J Alte dovd atribute pot fi specificate numai pentru tipurile de coloane intregi ‘ AuTo_tNcaGwENT. Folositi atriburul aUTO_INCREUENT cind doriti si generat identifi catori unici sau valori in serie. In mod normal, valorile AUTO_INOREUENT ineep de la 1 si crese ew 0 unitate pentru fiecare rind. Cind inseragi NULL intr-o coloani ‘AUTO_INCRENENT, MySQL. insereazi o valoare cu 0 unitate mai mare decit valoarea ‘maxima curenté din acea coloan’. fntr-un tabel putefi avea maximum o coloani ‘AUTO_INOREMENT. Capitolul 2 Lucrul cu date in MySOL siSQL 114 Pentru orice coloani unde doriti si folosisi avto_tNoREMENT, coloana trebuie si fie declarati NO MULL gi de asemenea, ca PRIWARY KEY sau drept cheie UNIQUE. De exem- plu, putes declara o asemenea coloani in oricare din urmitoarele moduri: CREATE TAELE ai (i INT AUTO_INCREMENT NOT NULL PAIUARY KEY) CREATE TABLE ai (4 INT AUTO_INOREENT NOT NULL, PRIMARY KEY (4)) CREATE TABLE ai (4 INT AUTOINOREMENT NOT NULL, UNTQUE(}) Comportares atributului AUTO_INORENENT este discutatd mai aprofundat in paragraful slaucrul cu seevente", ‘© wst6NeD, Acest aribut interzice valorile negative. Dac 0 coloani primegte atributul SIGNED, dimensiunea domeniului tipului de date de bazi nu se modifi, ci pur si simplu este deplasati inainte (spre dreapta) pe axa numerelor. Gindigi-vi la aceasti specifica de tabel: CREATE TAB.E tabelut_nev a stény TWIT, tiny_a TINYINT UNSTONED ) tiny si itdny_u sunt ambele coloane de tip TtNvnT, cu un domeniu de 256 de valor dar domeniul fui tiny este cuprins intre -128 gi 127, in timp ce domeniul fui este euprins intre 0 $5255, UwisraNeD este util pentru coloane in care intentionati si stBicafi date care nu iau valori negative, cum sunt valorile popularilor sau cifrele privind prezenga la un curs. Dack folosiio coloand objgnwiti, cu semn, pentru asemenea valori, folosfi numa jumitate din domenialripului de coloang. Cand coloana primeste atributul UNSIGNED, eect ig dubleszi domeniul, Dact folositicoloana pentru numere in secvent¥, vefiavea nevoie de un numir dublu de valori pentru 2 epuiza domeniul daci declarati coloana cu atribueul unsieveo. . Dupé atribuele pe care tocmai le-am descris, care sunt caracteristice c@loanelor nume- i specifica si atributele generale HULL si NOT NULL. Dacd nu specificayi NULL aloarea prestabilita este NULL, De asemenea, puteti specifica 0 valoare prestabilie folosind atributul DEFAULT. Daca nu specifica o valoare prestabilitd, aceasta vafi aleasé automat, Pentru toate tipurile de coloane numerice, valoarea prestabilit este WULL pentru coloanele care pot contine MULL, respectiv 0 pentru celelalte. Exemplul urmitor creeazi un tabel cu trei coloane INT, cu valorile prestabilite -1, 1 si wu 44 INT DEFAULT —1, 42 INT DEFAULT 1, 48, INT DEFAULT NULL 12 Lucrul cu seevente ‘Mule aplicaiitrebuie sé foloseascd numere unice pentru motive legate de identificare, Necesitatea unicititi valorilor survine intr-un numdr de contexte: numere de membri, Partea! Utlizarea general a sistemului MySQL ‘Mecanismul sistemului MySQL pentru furnizarea de numere unice foloseste coloanele ‘AUTO _INGREMENT. Acestea vi permit sf generafi automat numere in secvengi. Din pacate, AUTO_INGREMENT este o facilitate uneori prost infeleasi, fenomen determinat poate de ‘modificirile aduse acestei caracteristic in MySQL 3.23. Aceasti secfiune descrie modul de comportare a coloanelor AUTO_INCREUENT astfel inci dumneavoastra si le puteyi folosi in mod eficient, fari a cidea tn capcanele care deseoti iau oamenii prin sur. prindere. De asemenea, secjiunea vi prezinti modul de generate a secvengelor fei uti- lizarea unei coloane AUTO_INCREMENT. AUTO_INCREMENT pentru versiunile MySQL anterioare versiunii 3.23 Pentru versiunile sistemului MySQL anterioare versiunii 3.23, coloanele AUTO_INCAE- MENT se comporti dup cum urmeazi: ‘* Insertia unei valori NULL intr-o coloank AUTO_INGREMENT determin’ MySQL. si gene- reze automat urmétorul numir din secventi gi si insereze in schimb acea valoare in coloani. Secvengele AUTO_INOREWENT incep cu 1, deci prima inregistrare inseraud in tabel primeste in coloand o valoare secventiali egali cu 1, iar inregistririle ulterioare primese valoti egale cu 2, 3 etc. In general, fiecare valoare generat automat va fi eu 0 tanitate mai mare decit valoarea maxima curenti stocati in coloan’. ( Inserga unui 0 nto coloand AUTO_INGREMENT este similar cu inserfa valor MULL fn co- Joani. Inserya unui rind fér8 specficarea unet valori pentra coloana AUTO_INOREWENT este de asemenea similard cu inserfia unei valori NULL. ‘© Dacit inserati o inregistrare gi specificai in mod explicit 0 valoare pentru coloana ‘AUTO_INGREWENT, se va intémpla unul din urmicoarele dous lucruri. Daci existi deja o numerotazea mostrelor sau: a loturilor, identificatori de cliengi, etichete ale rapoartelor | Privind hibele sau ale tichetelor de semnalare a problemelor si altele. Snregistrare cu valoarea respectiva, se va produce o eroare, deoarece valorile din coloa- nnele AUTO_INCREUENT trebuie si fie unice, Dacd mu exist o nregistrare cu acea valoare, Snrogistraren este inscratd gi, daci valoarea din colouni este noua valoare maxima, seevenfa continua cu valoarea urmitoare aceleia pentru rindurile ulterioare. Cu alte cuvinte, putesi ,forga" contoru! prin insertia unel inregisteiri cu o valoare din secvengi ‘mai mare decat valoarea curentS a contorului Foryarea contorului poate determina goluri in secventi, dar puteti exploata aceasté comportare in avantajul dumneavoastrd. Si presupunem ci afi creat un tabel cu o eo- loand auTo_sweneuen, dar dori ca o secvenyi si inceap& cu 1000, nu cu 1. Putey realiza acest lucrw in dou moduri, Mai inti, pute insera prima tnregistrare cu o valoare de secvengi explictX egali cu 1000, dup# care inseratiinregistrtile ultrioare prin intro- ducerea valorii NULL in coloana AUTO_INOREMENT. In al doilea rind, putey inserao falsf fnregisteare in coloana AUTO_INGREUENT, cu valoarea 999. Prima tnregistrare reali pe care o insecagi dupa aceea va primi un numér de secvenfi egal cu 1000, dupa care puteyi sterge fnregistrarea fast Capitotul 2 Lucrul cu date in MySQL siSQL 113 ‘# Dact inseratio valoare incorecti intr coloand AUTO_INGREMENT, au Vi agteptayi i se fntimple ceva util, Rezultatul nu poate fi anticipat. «# Dact stergeiinregstrarea care contine cea mai mare valoare dint-o coloand AUTO_INCRE- ue, valoarearespectiva va fi reuilizaci la urmitosrea generare a unei valori nei. Duck ™ sergei toate inregistririle din tabel, vor fi refolosive toate valorle gi secventa este reluati, pornind de la 1. ¢ Instructiunile REPLACE functionesz’ normal. ‘ Instruciunile UPOATE funcfioneazs folosind regulisimilare celor care se apli «de noi inregictriri, Dact actualizagi o coloan’ AUTO_INCAEMENT cu valoarea NULL 530 0, aceasta este actualizati la urmatorul numis de secvent&. Dack incercati si actualizai coloana la 0 valoare care existi deja, se va produce 0 eroare (cu exceptia situayilor ‘-cind se intimpli si configurati coloana la o valoare pe care o are deja). Daci actuali- ‘zati coloana la valoare mai continua cu rumarul urmitor celui pentru inregistririle ulterioare, # Valoarea celui mai recent numir de secventi generat automat este disponibila prin apelarea functiei LAST_INSERT_1D(). Aceasta vi permite si faceyi referire la valoarea AUTO_ANGREWENT in alte instrueyiuni, fri a cunoaste care este de {apt valoarca, LAST_INSEAT_10() este legati de valor AUTO_INCREMENT generate in timpul sesivni curente a serverului; nu este afectati de activitatea AUTO_IACREMENT asociatX cu ali cliengi, Dacd nici o valoare AUTO_INCAEUENT nu fost generatk in timpul sesiunii curente, funcfia LAST_INSEAT_1D()_returnesz§ 0 e Posibilitatea dea genera automat numerele dint-o seeventi este extrem de utilé. Totusi, comportarea descrisi anterior are douit dezavantaje. Primul:reutilizarea valorilor dint-o seevengé atunci cind sunt sterse inregistrrile din partea superioari a secvenjei ingee- voces generates unset de valor tonotone (rit cesta) pen apleacare pot sterge, dar care pot si insera inregistriri, In al doilea rind, mijloacele prin care Incepeti o secventi la o valoare mai mare decit 1 sunt greosie. AUTO_INCRENENT pentru versiunile MySQL incepénd de la 3.23 MySQL 3.23 a introdus urmétoarele schimbici in comportareaatributului AUTO_INCRE- NcNT Fn coca ce privesteaxpectele retinue anterior: © Valorile dintro serie generati automat sunt strict crescitoare $i nut sunt refolosite. Dack valoare: maxima este 143 si dumneavoastrd gtergesi inregistrarea care contine valoarea respectivi, MySQL va genera valoarea urmatoare egald cu 144, «© Puri specifica mumrul de seovents inigial in mod explicit atanci cind cre Exemplul urmitor creeazi wn tabel cu o coloand AUTO_INGREMENT denumité se, care fncepe de la viloarea 1.000.000: CREATE TABLE tabelul_ wou (Sec INT UNSIGNED AUTO_INOREMENT NOT NULL PRIMARY KEY) ‘AUTO_INOREUENT = 1000060 (Cind un tabelare mai multe coloane (ca majoritateatabelelor), nu exist nici un dubiu cu privire la coloana cireia i se aplick clauza finali AUTO_INCREMENT = 1000000, eoarece intr-un tabel existi o singuri coloand AUTO_INGREUENT. 114 Parteal_Ullizarea general a sistorului MySQL Aspecte de refinut privind atributul AUTO_INCRENENT Trebuie si retineti urmitoarele elemente pentra a evita surprizele atunci cind folosig coloane AUTO_TNCREMENT: (© AUTO_INOREWENT nu este un tip de coloants este un atribut al unui tip de coloan. Mai departe, AUTO_aNOREWENT este un atribut destnat afi tiizat numai pentra tipuriintreg Versiunile de MySQL anterioare versiunii 3.23 nu aplica aceasti restrigie eu strcteye ‘vi vor permite si declarai un tip de coloani cum ar fi CHAR cu atributul AUTO_INCRE. ent, Totugi, numai tipurileintregi functioneaza corect drept coloane AUTO_INGREMENT, Scopul principal al mecanismului AUTO_INORENENT este acela de a vi permite sé generat o secvent de intreg pozitivs cel mai indicat este si folosti coloanele AUTO_INGRENENT numa fn acest mod. Din acest moti, trebuie si declarati coloanele UTO_IWOREMENT ca find UNSIGNED, ceca ce are in plus si avantajul de a vi oferi de douk ori mai mulee numete in secvengt inainte de a ajunge la limita superioari a domeniuluitipului de coloand. In anumite circumstange, este posibil si generati seevente de valori negative folosind ‘o coloan’ auro_incEUENT, dar nu vi recomand aceasti operatie. Dact suntey hoticit si 0 incercayi, nu uitag si efectuat testi adecvate gi si re-efectuai testivile dack tre- efi la 0 versiune mai recent, dferiti, de MySQL. Propriile mele experienge au seos in evidenti 0 comportare oarecum inconseeventi a versiunilor in ceca ee priveste secventele de numere negative. ‘© Nu vi lisapi amagit de ideca cf adiugarea atibutului AsTo_tNcRENEICT Ia o declarafie de coloani este o modalitate magica de a obyine o secvenfi nelimitati de numere, Nici vorbit de aga ceva; scevenjele AUTO_INGRENENT sunt limitate de domeniul tipului de coloana. De exemplu, daci folositi o coloani TINYINT UNSIGNED, numirul maxim de secventi este 255. Cand ajungegila accasi limits, aplicayia dumneavoastei va incepe si Snregistreze erori de genul .cheie duplicats, (© MySQL 3.23 a introdus noile caracterisici ale atribueului AUTO_INCAEUENT de a nu refolosi numerele de seeventa gi de a vi permite s& specificayi un numie initial de secventi in instrucriunea CREATE TABLE. Aceste caracteristici sunt anulate dack stergeyi toate inregiscrarile din tabel folosind o instrucyiune DELETE de forma urmitoare: DELETE FROM nome_tabo! Tacs cam seoven vance det TABLE specificd in mod explicit un numar inifial de secvenya. Acest lucru se produce datoritt modului in care MySQL optimizeaza instructiunile DELETE care golese in {ntregime un tabel: re-creeazd datee gfiseree index dela zero, in loc dea seerge fiecare fnregistrare, ceea ce determina pierderea weuror informayiilor despre numercle de secvengi. Dack dorii si stergepi toate inrogistrivile, dar si pistrayi informayiile de secvenfi, putefi suprima optimizarea si fortapi MySQL si execute in schimb 0 operaye de stergere rind cu rind, astfel: DELETE FROM nume_tabel (HERE 1 > 0 Ce putes face pentru a pistra o serie strict crescivoare daci ave o versiune de MySQL mai veche decit 3.23? O solutie este de a folosi un tabel separat, pe care il folosifi numai pentru generarea de valori AUTO_INGREMENT si din care mu stergefi niciodata inregistris Capitolul 2 Lucrulcu date in MySQLsiSQL 115, ‘Aste, valorile din tabel nu sunt refolositeniciodatd. Cand trebuie si generay o inregi ‘gare novi in tabelul dumneavoastré principal, mai inti inserafio valoare MULL in tabelul gu aumere de secventi. Apoi, inserafi inregistrarea in tabelul dumneavoastré principal folosind valoarea funcriei LAST_INSERT_10() pentru coloana care doriti si conginé un © qumir de secversi: INSEAT INTO ai_tbl SET af_col = NULL INSERT INTO tbi_principal SET id-LAST_INSERT_10()... ‘$4 presupunem ci doriti si srietio aplicatie care genereaza valori AUTO_INcREMENT, dar origi ca secventa si inceapi cu 100 fn loc de 1, Si mai presupunem ci dorigi ca aplicatia Si fie portabili lt roate versiunile de MySQL. Cum putetirealiza acest deziderat? Dacd dorigi si realizati portabilitacea, nu puteyi conta pe fapcul cx MySQL 3.23 asiguré specifcarea numirulai de seevenréinigal tn instructiunea OREATE TABLE. In schimb, chad dori si inserafi o interogare, mai intai verificagi dacd tabelul este gol sau nu prin cemiterea urmatcarei ‘SELECT COUNT(*) FROM nune_tabed ; ‘Aceasta este o etapX suplimentari, dar care nu vi costa prea mult, deoarece instructiunea SELECT COUNT(=) fir nici o clauzi WERE este optimizatt si se execute rapid. Dac tabelul este vid inserayiinregistrarea si specificayi in mod explicit valoarea 100 pentru ‘colonna numerdor de secventi. Daci tabelul nu este vid, pur gi simplu specificati NULL pentru valoarea din coloana cu aumérul de secvent’ si permiteti programului MySQL 5h genereze automat urmitoral numir. ‘Aceasti metodiivi permite s4 inseratiinregistrari cu numerel® de seovengl 100, 101 si aga sai departe si functioneaza indiferent daci MySQL permite sau nu specificarea valorii jnigiale a secverfei, Aceasti abordare nu functioneazi daca impuneti ca mimerele de scovenfi si fie sic crescdtoare chiar gi atunci cind sunt sterseinregistrii din tabel. In azul respectiy, putesi combina aceasti metoda cu tehnica descrisd anterior, de wilizare 41 unui tabel sec andar strict pentru generarea numerelor de secvengi care vor fi folosite {in tabelul dumneavoastra principal. . De ce si incepeti o secventi cto valoare mai mare decit 1? Un moti estp de a determina toate numerele de secventi si aibd acelagi num&r de cfre. Daci generaji umere de iden- tificare a clienglor gi nu vi asteptagt la mai malt de un milion de eliengi, pureyi taeepe feria de la numirul 1,000,000. Vefi putea insera cu mult peste un milion de inregistriri ale clienflor incinte ca numirul de cifre al identificatorului de client s4 se modifice. alts modalitcte de a forza 0 anvmiti dimensiune a numerelor de secventi este de a folosi o coloant ZEROFILL, desigus. Acest procedeu poate ridica probleme, in funcrie de contextul in care vi folosigi datele. De exemplo, daci manipulayi numere de seevengé cu ale in scripturi Perl sau PHP, va trebui si le folositi numai ea siruris dack vor in qumere, zerourile insiale se vor pierde. Urmatorul script Peel scart ilus- treazi pericolel Iucrului cu numere de acest gen: #t usr/binvperd 35 = "00010"; print "Ss\n"5 sents 4 foloseste inorenentul intoligent din Perl # creeaza ‘numar* cu zerouri initiale 446 Parteal Uilizarea generalé a sistemului MySQL 1 print *Ss\n"s | $81; print *S8\n"s Cind este executat, acest script afigeaz urmitoarele date de iesire: # foloseste $s intr-un context nunerie 0010 Ok 0011 ok 2 Hopal Operatorul ++ de auto-incrementare din Perl este inteligent si poate crea valori secven- tiale din sirori sau numere, dar operatorul += functioneazX numai cu numere. In datele de iesire afigate mai sus, puteti vedea e& operatorul += cauzeazi o conversie sir-numas, i inipiale din valoarea lui $s se pierd. Alte motive pentru a nu incepe o secvenfi eu 1 s-ar putea si mu aiba nici o legiurd cu anumite considera de naturi tehnicd. De exemplu, daca atribuifi umere de membru, uteri dori si incepetio secvenfi la un numér mai mare decit 1, pentru a dejuca mane- vrele politice legate de identitatea membrului nr. 1 si pentru a v¥ asiguca cl un asemenea ‘numir nu exist Se mai fncimpld si aga ceva... Trst, dar adevirae. Generarea secvenfelor fiir AUTO_INCRENENT alti metodi de generare a numerelor secventiale nu foloseste 0 coloand ASTO_INCREMENT. Jn schimb, foloseste forma alternativa a functiei LAST_INSERT_ID(), care preia un argu- ment. (Aceasti formd a fost introdust in MySQL 3.22.9.) Dack inserayi sau actualizatio coloand folosind LAST_INSEAT_10(expr), urmatoral apel [a AST_INSERT_10() fer nel un argument va returna valoarea expr. Cu alte cuvinte, expr este tratati ea gi cum ar fi fost. generati de eftre mecanismul AUTO_INORENENT. Aceasta vi permite si generati un numir dle secventd gi apoi si- folosii intr-o instructiune ulterioard in cadrul sesfuni client, fark ca valoarea si fie afecati de alti cient. (© modalitate dea folosi aceastd strategie este de a crea un tabel cu un singur rind, confinand o valoare care este actualizati de fiecare dati cind aveti nevoie de urmtoares valoare din secventi. De exemplu, puteti crea tabelul in acest mod: CREATE TABLE sec_tabel (sec INT UNSIGNED NOT NULL) TNSEAT INTO sec_tabel, VALUES(0) Acesteinstrucgiuni creeazi tabelul see_tabet gil iniializeaz’ cu un singur rand, care ‘confine o valoare sec egali cu 0. Pentru a folosi tabelul, generati urmftorul numir din secventi, dup cum urmeaza: UPDATE sec tabel SET sec = LAST_INSERT_1D(seot1) ‘Aceasti instructiune regiseste valoarea curenti a coloanei sec si o incrementeazi cu 1 pentru a genera urmitoarea valoare din secven{i, Generarea noii valori folosind LAST_aNSERT_10(sec+1) determin’ tratarea acesteia ca si cum ar fi fost valoare ‘AUTO_INRENENT, iar valoarea poate fi regisiti prints-o instrucfiune ulterioarl, apelind funcfia LAST_INSEAT_10() fird argument. Acest procedeu functioneazi chiar daci un alt client a generat intre timp un alt numar din secvenga, deoarece LAST_INSERT_1D() este specifi fecieui client in parte. | Tabelul 2.8 prezinetipurile furnizate de MySQL pentru declararea coloanclor cu val Capitolul 2 Lucrul cu date in MySQL siSQL 117 De asemenes, puttifolosi aceasti metod dact dorigi si generati valori secvengiale care se incrementeazi cu o valoare diferité de 1, respectiv valori seevengiale negative. De exemplu, urmitoarele doud instructiuni por fi folosite pentru a genera o secvensi de snumere cae ereie cu céte 100 de unitit, respectiv o secventi de ntimere negative: UPDATE seo_tabel SET sec = LAST_INSERT_I0(sec+100) UPDATE seo_sabel SET sec = LAST_INSERT_I0(sec-1) Mai putefi folosi aceasti metodi si pentru generarea nei secvenge care incepe de la 0 ‘aloare arbiteari prin stabilirea in coloana see a unei valor infiale adecvate. Pencrao apicafc a acestei metode de generareasecvengelor pentru mai multe contoare, vezi »Configurarea unui tabel contor" in captolul 3, ,Sintaxa gi utilizarea SQL. in MySQL*. Tipuri de coloana sir MySQL furnizerzi numeroase tipuri de giruri pentru stocarea datelor de tip caracter. Sirucile sunt frecvent folosive pentru valori ca acestea: “tonescu, Pepescu & Co.* *Greioane (nina ar. 2)* str. Lunga, nr. 123" ‘Seria Monograph 1X* De fapt, sirurile sunt intr-un fl tipuri generice, deoarece le pute folosi pentru a repre- zenta orice valoare. De exemplu, putet folositipurile sir pentru a stoca date binare, cum sunt imagiile sa sunetele,repoctiv dae de sire din program gi, dack dovi st stocati date comprimate. Pentru toate tiputile sir, valorile prea lungi sunt ,t3iate* pentru a corespunde lungimii stabilit. Dar tipacile sir variazd de la foarte miei la foarte mari, iar tipul cel mai mare poate confine aproape 4GB de date, deci trebuie si putesigisi ceva suficent de hung pentru 4 evita trunchierea informariilor dumneavoasts3', de tp siz, precum: gi dimensiunea maxim’ si spayiul de stocare necesar pantru fiecare tip. Pentru tipuri de coloane cu lungime variabila, cantitatea de spagiu ocupatk de o valoare variazi de la un tind Ia altul si depinde de langimea valorilor efectv stacate fn coloan’, ‘AceastiIungime este reprezentat in tabel prin litera. Octesi suplimencati necesari in afara lui L reprezint numirul de octeyi necesari pentru 4 stoca lungimea valorii, MySQL manipuleazi valorile de lungime variabilA prin sto- carea atit a confinucului valoril ct gia hungimil sale. Acesti octeyisuplimentari sunt wwataji ca un intreg fir semn. Observai corespondenga fntre lungimea maxima a unui tip de lungime veriabili, numarul de octeyi suplimentari necesari pentru tipul respectiv jomenitl tipulsi increg fird semn care foloseste acelagi numir de octeyi. De exemplu, valorile neD1UWB108 pot avea maximum 22-1 octeti lungime gi necesita 3 octeyi pentru fnregistrarea rezultatului, Tipul intreg pe 3 octeyi MEDIUWINT are o valoare firl semn smaximi de 24-1, Aceasta nu este 0 coincident * Datorct limiter impose de dimensiunes maximt + pachetu client/server limite efcace a valorilor din coloang este de J4MB, - NA. protocolul de comunicayie 118 Parteal’_Utiizarea generald a sistemului MySQL Tabelul 2.8 Tipuri de coloane Speciicatia tipi Dimensiune maxima Spatiu necesar ‘CHAR H) oct, Moctey VARCHARCH) Most +1 oc Tunye.os, TuwyText 2H oct + fost BLoB, Text 2181 cota L + 2c MEOTUNBLOB, MeDIUMTEXT 2244 octet 1+ Doct LonceLos, Lowerext 24 octet 1+ 4 oct ENUM (*val1",*val2",...) 65535 membr 1 sau 2octep SET (‘valt*,*val2",...) 64 membé 1,2,3,4 sau 8 oct ‘Tipurile de coloane CHAR si VARCHAR Han si VARCHAR sunt cele mai folosite tipuri sir. Diferenya dintre ele consti in aceea e& ‘HAR este un tip de lungime fix, iar VARCHAR este un tip de lungime variabls. Valorile intro coloand GHAR(1) ocupi fiecare cite W octet valorile mai scurte sunt completace Ja dreapta cv spasii atunci cand sunt stocate. (Tori, la regisirea acestor valor, spayile finale sunt eliminate.) Valorile dintr-o coloani VARCHAR(1) sunt stocate folosind aumal cantitatea de octeri necesari, plus un octet pentru inzegistrarea lungimil Daci lungimea valorilor dumneavoastr& nu variazi prea mult, CHAR este o optiune mai bun’ decat varchar, deoarece tabelele cu rinduri de lungime fix pot fi prelucrate mai ficient decit tabelele ow lungime variabila. Dac valorile dumneavoastrd au toate aceeasi lungime, vaRGHAR va folosi, de fapt, un spatiu mai mare, datoritd octetului suplimentar usilizat pentru inregistrarea lungimil valorilor. Anterior versiunii MySQL 3.23, coloanele GHAR si VARCHAR pot fi declarate cu o lungime ‘maximi w cuprins& intre 1 i255, Incepind de la versiunea MySQL 3.23, cHAR(O) este de asemenea o valoare permisi. GHAR(O) este util ca element de inlocuire atunci cind dori si declaragi o coloani, dar nu vreti st alocafi spayiu pentru aceasta daci nu suntesi sigur de lisimea pe care dorii si i-o atribuiti Puteg folosi ALTER TABLE pentru a miri ulterior imea ealoanei. O coloani CHAn(0) poste fi de ascmenca folositi peutsu a reprezena valorile pornit/oprit, daca ti permiteti si ia valoarea MULL. Valorile dintr-o asemenea coloani pot lua dou valori, in speyd NULL si giral vid. O coloand oHAR(O) ocup un spariu de stocare foarte redus in interiorul tabelului: un singur bit. Cu anumite exceppi imitate, nu putefi combina CHAR si VARCHAR in interiorul aceluiasi tabel. MySQL va proceda chiar la modifiearea coloanelor de la un tip la aleul, in funcpe de circumstange. (Acesta este un lueru éare nu se intimpli in eadrul altorsisteme de baze de date.) Principle care se aplied sunt urmitoarele: # Tabelele cu rinduri de lungime fixi sunt prelucrate mai usor decit tabelele cu rinduri A Tungime vaibil. (Motvee vor fi dscuate in secyunea «Alegerea tipurlor de coloane*,) i sees procedeu diferi de standardul ANSI peatea SQL in ceea ce privestevalorile de tip VARCHAR, - NA. Capitolul 2 Lucrul cu date in MySQL g'SQL 119 # Rindurile unui tabel au lungime fixi numai daci toate coloanele din tabel sunt tipuri Srlungime fxz,Dacé ego singurdcoloand are lngime vara indurletabel Ii devin si ele de hungime variabilt ‘#Deoarece avantaele de performangi ale rindurilor de lungime fixé se pierd arunci cind rndul devine de lungime variabila, toate coloanele de hungime fixt pot fi con- vertite tn echivalente de lungime variabili, arunci cnd o atare misuri poate duce la economii de spagiu ' [Aceasta inseamni cf, dacd aveyi coloane VARGHAR intr-un tabel, nu puteti aves ji coloane Ham; MySQL le sonverteste ype ticute" in VARCHAR. Si presupunem ci ati creat un tabel caacesta: CREATE TABLE tabelul_vew 0 ct CHAR(IO), 162 VARGEAR(10) » - acd emitey o inerogare DESCRIBE tabelu1_neu, datele de iesire se prezinti astfel: cieid 7 Tipe “aad hey ct varchar(10) : YES SB Merete (10). YES CObservati ci prezenga coloanel varcnAn determina programul MySQL si converceasci CS eee eee or Gt la HAR, nu ves reusi. Unica modalitate de a transforma o coloank VARCHAR in coloan’ ‘HAR este de a converti toate coloanele VAAGHAR din tabel in acelagi timp: ALTER TABLE tabelUl neu WOOIFY ct GHAR(10), MODIFY c2 CHAR(1O) Tipurile de coloane 8.08 i TEXT sunt de hingime variabil,ca gi VARCHAR, dar nu au nich tum echivalent de lungime fixi, deci mu putetifolosi coloane CHAR in acelasitabel ca gi coloanele BL08 gi TEXT. Orice coloani CHAR va fi convertii la VARCHAR, Exceptia de la regula neutilizisii in acelasitabel a coloanctor de lungimé fix si a celor de lungime variabila const in acces o¥ acele cloane de tip GHAR nai seurte de patcu ea retere nu sunt convertite la VARCHAR. De exemplu, MySQL nu va transforma coloana Coan din urmtonul abel in VARCHAR CREATE TABLE tabetut_meu q cot OAR(2), (62 VARCEAR(10) ) Motivul pentru care coloanele mai scurte de patra caractere nu sunt convertte este acela cl, in medie, economia de spat pe care o puteti obsine prin nestocarea spatilor finale este anulack de octetul suplimentar necesar int-o coloand VARCHAR pentru inregistrarea lungimii fiecirei valori, De fapt, daci toate coloanele dumneavoastrd sunt scurte, ‘MySQL va convert la CHAR orice coloan declarati ca VARCHAR, MySQL procedexzi as fel deoarece conversia nu va marin medie,canticatea de spagiu necesara si va imbuni 120 Parteal_Uilizarea general a sistemului MySQL performangele prin transformarea rindurilor tabelului in rinduri de lungime fix. Dack reafi un tabel cu urmétoarea specificatie, coloanele vaackAR vor f. toate convertite dis. ret" in CHAR: OREATE TABLE tabelul_nev ( ef VARCHARC), 2 VARCHAR(2), 3 VARCHAR(3) ) Puteti verfica modificarea coloanelor prin examinarea datelor de ieyire ale interogari DESCATBE tabelul_neu: (Feld Type 7 Wald Toy "Tale PBR cr enar(ty es vu ce carta) | es vou Semana) es UML Tipurile de coloane BLOB gi TEXT Un 71.09" este un obit binar mre (binary fags objec) nese un container cae poate stoca orice doriti si pune in el gi pe care il pueti face aproape oricit de mare origi. In MySQL, tipul 8108 este de fapt o familie de tipuri (TTHYBL08, 8108, MEDTUN- £8L08, LONGBLOB) care sunt identice, cu excepyia cantitigii maxime de informatii pe care o pot stoca (vezi tabelul 2.8). MySQL mai are o familie de tipuri Text (TINVTEXT, TEXt, MeDIUTEXT, LoNaTEXT). Acestea sunt identice din toate punctele de vedere cu tipurile BLOB corespunzatoare, cu except faptului ci, la comparare gi sortare, valorile BLOB sunt sensibile a diferenga fntre majuscule gi minuscule, in timp ce valorile TEXT nu sesizeari aceasti diferengi. Coloanele 8108 si TEXT sunt utile pentru stocarea datelor care pot deren foarte mar sacar pot vara foarte mul ea dimensine de aun. ind I al tre exemple se numiri documentele create cu procesoarcle de vext, imaginile sunetele, datele compuse si articolele de stir. nants Coloanele B08 si TEXT pot fi indexate incepand de la MySQL 3.23.2, degi rebuie si specifica o dimensiunes profiad ere vai floss pentru inden cu ecopul dea evita intririle de index care pot deveni enorme si care pot, ca atare, si anuleze toate avant jele dobindite prin utilizarea acelui index. De asemenes, in general nu se efectueazi ciutirl in coloane 8108 sau TEXT, deoarece coloane ca acestea contin deseori date binare {(precum imaginile). Se obignuieste mai frecvent si se ullizeze alte coloane din tabel pea- ‘ru foregistrarea unui anumit tip de informatii de identificare referitoate la valor BLOB sau TEXT si sf se foloseascd aceleinformagii pentru a determina rindurile dorte, Coloancle 8108 si Text pot necesita o atentie specialé: ' Datoriti variatilor mari caracteristice ale dimensiunilor coloanclor 8.08 gi TEXT, tabe- Iele care le congin sunt supuse unor fragmentiri de proporpii daci sunt efeeruate ni- meroase stergeri gi actualiziri, Va fi necesar si rulayi periodic instrucyiunea OPTIMIZE TABLE pentru a reduce fragmentarea si pentru a pistra un nivel riicat de performang’. Veri capitolul 4, ,Optimizares interogisilor", pentru mai multe informal, i Capitolul 2 Lucrul cu date in MySOL siSQL 124 «# Daci folosig valori foarte mari, poate fi necesar si ajustati serverul in vederea cresterii valorii parametrului nax_atiowed_packet. Vezi capitolul 11, ,Administrarca generalé a sistemului MySQL*, pentru mai multe informapi, De asemenea, va trebui si mri dimensiunea pachetului pentru orice client care doreste si foloseasc’ valori foarte mari, Anexa E, ,Referinti de programe MySQL", descrie aceasti operajie pentru client nysqt si aysazdunp. Tipurile de caloane ENUM si SET NU si SET sunctipuri de sruri speciale pentru care valrile coloanelor tebuie alese dintr-un set fix de giruri, Principala difereng’ dintre cele dou tipuri este ci valorile coloanclor de ip tnuy trebuie si fie alciuite dint-un singur membru al serului de valori, in timp ce valorle dintr-o coloani SET pot congine oricare membru al setului sa chiar pe tofi membri. Cu ake tuvinte, EWM exe folosité pentra valori mutual exclusive in timp ce SET permite mai multe coptiuni dints- list de valor, Tipul de coloani Ents defineste o enumerare. fn coloanele ENUM se pot repartiza valori © aledtute din exact un membru ales dint-o list de valorispecificacd in momentul ereiri tabelului. O enumerare poate avea maximum 65536 membri (din care unl este ezervat de citre MySQL). Enumeririle se folosese frecvent pentru a reprezenta valorile dinte-o categorie. De éxemplu, valoriledintr-o coloani declarati ca ENUW("'N","D") pot Fi numai ‘w" sau *D*, ARernativ, putes flosi ens pentru rispunsuri la fatrebiri eu opyivni mul- tiple dintr-un chestionar sau studio, respectiv pentru marimile si culorile unui produs: {uN("sud 100" "100-500", "501-1500", ‘peste 1500") culoare ENM(*rosu", falbastru',"negru") vrarino EWUI("S", "HE *L", a) Dacit prelucrafi select din pagini Web, pute folosi Num pentra a reprezenta opfiunea pe care un vizitator al sitului dumnesvoastrdo alege dintr-un set de butoane radio mutual exchu- sive plasate int-o pagin. De exemplu, dact avegi un servici pe Internet pentru comenzi de pizza, ve poste ‘olosi o enumerare pentru a reprezenta tipul de coajé comandat de un client: coaja ENUM cutie” “normala’, "stil pan") . {in cazul in care categoriile de enumerare reprezinté numere, ste impdyeant si vi alegeti ‘ategoriile in mod corespunzitor atunci cand creafi enumerarea. Dé exemple, cind inregistrafi numdrul de Icucocive rezultat fu uimia unui test de laborator, putefi grupa rnumerele in eategorii fn acest mod: eusacite ENUI(*0-100",*101-300", 300") Cind rezultatu eestului este dat sub forma unei valori exacte, puteti inregistra valoarea sub forma catezoriei tn care se incadreaz§ aceasta. Nu puteyiinsi reveni la valoarea origi nali daci decideyi si convertiti coloana dintr-o enumerare bazati pe categorii fnts-o coloan de intregi, compus8 din valori exact. ‘Tipul SET esce similar cu ENUM in sensul ci, atunci cind creafi o coloand ser, specificasi o listd cu riembdi permisiaisetului. Das, spre deoscbire de ENUw,fiecare valoare a coloanci poate fi alcituiti din orice numar de membri ai setului, Setul poate avea maximum 64 de, Iembri. Pate folosi un SET arunci end aveyi un set fix de valori care nu sunt mutual exclusive, asa cum este cazul in coloana Ent. De exemplu, putetifolosi seT pentru a reprezenta opjiunile disponibile pentru un autotarism: selariat: 122 Parteal_Utiizarea generala a sistemul SET(*portbagaj", "pilot automat", “aor conditionat*, *trapa") Apoi, valorile particulare din Set vor reprezenta opfiunile efectiv comandate de clieni SET(*pilot automat, trapa") SET(*portbvagaj aer conditionat*) SET(*portbagaj,pilot autonst,aer conditionat*) SET(*aer conditionat*) ser(s*) Sirul vid indica faptul ci un client mu a comandat nici o opfiune. Accasta este o valoate admis pentru SET. Valorile din coloana SET sunt reprezentate sub forma unui sir unie. Dack 0 valoare este aleitutd din mai mulji membri ai unui set, membrii sunt separagi in interior girului -virgule, Evident, aceasta inseamni cl nu trebuie si folosti un sir eare include o vir- guli ca membru al unei coloane SET. Coloanele SET mai pot fi utilizate pentru reprezentarea unor informayii precum diag- nosticele unor pacienti sau rezultate din sclecti efectuate in pagini Web. Pentru un diag- nostic, poate existao sti standard de simptome a efror (inJexistengS trebuie aflati dela pacient, iar acesta poate prezenta oricare simptom sav pe toate. Pentru servieiul dum- neavoastri de comenzi de pizza prin Internet, pagina Web pentru comenzi poate avea un set de casete de validare pentru ingredientele din pizza pe care le doreste clientu, ingrediente din care se pot alege mai multe. ‘Modul in care declarafi lista cu valori admise pentru o coloani ENUM sau SET este impor- tant din mai multe puncte de vedere: ¢ Lista determina valorile admise posibile care pot fi incluse fa coloan’, aga cum s-a ark- tat anterior. (© Putetiinsera valori ENuut i SET folosind acat majuscule, cit si minuscule, dar mérimea literelor pentru sirurile specificate in declarayia coloanei determin’ mirimea literei valorilor coloanei atunci cind acestea sunt registe ulterior. De exemplu, dac8 aves o coloani ENuu(*D*,*N*) si stocati in coloanavaborile “a* si*n*,valorile sunt afigate sub forma *O* si *N* atunci cand le regisi. Acest fapt nu afecteazi comportarea tipurilor respective la comparatie sau sortare, deoarece coloanele ENUM 51 SET nu sunt sensbile Ja diferenga intre majuscule gi minuscule. ‘© Ordinea valorilor dintr-o declarayie ENUM este ordinea folositk pentru sortare. Ordinea valorilor dintr-o declarafie S€T determina de asemenea ordinea de sortar, desi relajia este mai complicati in acest caz, deoarece valorile coloanelor pot confine mai multi ‘membri ai setului. * Ordinea valorilor dintr-o declaratie SET determina ordinea in care apar sub-sirusile atunci cind sunt afigate valorile din coloana SET care sunt aleftuite din mai mul ‘membri ai unui set. ENUM si SET sunt clasificate ca tipurr sir, deoarece membrii enumeritli,respectiv ai setu- fui, sunt specificagi sub forma de sir atunci cnd creayi coloane de aceste tipuri. Totusi, membrii sunt stocaji intern sub form de numere si puteyilucra eu ef ca atate. Aceasta {inseamnii ef tipurile ENuut si SET sunt mai eficiente decie alte tipuri sic, deoarece pot fi manipulate frecvent folosind opera Capitotul 2 Lucrul cu date in MySQL giSQL 123 rnumerice in locul operayilor cu giruri, De aseme- hea, inseamni ch valorile ENUM gi SET pot fi folosite ardt in contexte numerice, cit gi in comtexte cu giruri ‘Membrii eu din declarayia coloanei sunt numerotati secvental, incepind de la 1. (0 cate folosit de MySQL pentru membrul ,eroare*, care este reprezentat sub formi de sir prin sical vid.) Numirul valosilor dintr-o enumerare determin dimensiunea spayivlui Te stocare al ucei coloane en. Un octet poate reprezenta 256 de valor, doi octeti pot reprezenta 65526 de valori. (Compara aceste valori cu domeniiletipurilor intregi pe un tutti pe doi octepi TINVINT UNSIGNED gi SNALLINT UNSIGNED.) Astfel, numirul maxim se membre enumer este 68536 (nlasiv membrl eros") iar dimensines spatiului de stocare depinde de existenta sau nu a unui numr de membri mai mare de 2Be, Pe speiicn on mune main S553 (536) demenbindedarac leoarece MySQL rezerva un spaiu pentru membrul eroare" ca membru implicit al Hoare cnvcet Cand aibip oatne icnoetd nor cleat em MYSQL repartizeazi in schimb membrul ,eroare*. Tati un exempl pe care il pute incera folosind clientul nysq). Exemplul prezinti ordo~ ‘area numeticd a membrilor unei enumeriri si demonstreazd, de asemenea, ci valoarea LL nv are nie! un numa in cadrul ordoniri faysal> OREATE TABLE etabel (@ EXUM(" fnysql> INSERT IKTO a VALUES ("ana"), ("on"), ("nae"), (*e2a*)("*) 5 (NULL) § stdon*,tnae*,"ela"))5 nysal> SELECT e, 040, e+1, 0*3 FROM © tabel; ooo fest | eve | Pane fon 2) 3) 6 me 3. 4) 8) ea 4) 5) of tio NULL | MULL NULL NULL A Puteri efectua operafii cu membrii enumeririi in funcyie de nume sau de numar: sysq> SELECT © FROM aysql> SELECT © FROM e_tabel RHERE 03; Se poate declara srul vid ca membru permis a! unei enumeriri, Acestui gir ise ve wtribul o loare numeric diferith de zero, ca oridrui ale membru menponst ic declare “Towusi, utilizarea unui sir vid poate provoca oarecare deruti, deoarecesirul respectiv este de asemenca folosit pentru membrul ,eroare", a eirui valoare numeric este 0. In exem- plul urmitor, epartizarea valor de enumerare incorecte "x" in coloana Enum determin 424 —PartealUtiizarea goneralé a sistemului MySQL repartizarea membrului de eroare. Acesta poate fi diferere ‘mumai atunci cind este regisit in form numeric aysql> OREATE TABLE € (© ENUM(*A",**,"b*))5 faysql> INSERT INTO € VALUES(*="),(2*),(°B") (°°) iat de membrul sir vid mysql> SELECT e e+0 FROM ty oe a 1 2 DD 3 2 Reprezentatea numerici a coloanelor SET este putin diferitk de aceea a coloanelor ENUM, Membrii unui set nu sunt numerotafi secvental. In schimb, fiecirui membru fi cores- unde unui bit individual in valoarea SeT. Primul membru al setului corespunde bitului 0, al doilea membru corespunde bitului 1 etc. O valoare SeT numerici egall cu 0 cores- punde sirului vid. Membrii eT sunt stocayi ca valori pe biti In acest mod se pot stoca fn fiecare octet cite opt valori ale unui set, deci dimensiunea spariului de stocare a une! coloane $€T este determinati de numérul de membri ai setului, pani la o valoare maxims de-64 de membri, Valorile SET pot ocupa 1,2, 3,4 sau 8 octet pentru dimensiuni ale seeulu cuprinse respectiv intre 1-8, 9-16, 17-24, 25-32 si 33-64, Reprezentarea unei valori Set sub forma unui set de biti este cea care fi permite unei ascrenen aloe oe alse dina nl mere una etn vlonese pose stabili orice combinatie de bi, deci valoarea poate fi alcituiti din orice combinatie de siruri din declarayia SeT care corespund acestor biti Tati un exemplu care ilustreazi relafia dintre forma gir si forma numeric a unei coloane ‘SET; valoarea mumerici este afigati atit in forma zecimali, cit si in forma binari: hnysql> GREATE TABLE s_tabel (s SET(*ana",“{on*, nae’, “ela")};, nysql> INSERT INTO s_tabed VALUES(“ana") ("Zon"), (*nae"); ("ea") (°), (NULL) 5 nysql> SELECT 8, s+0, BIN(s+0) FROM s_tabel; ac) Sana ‘ for 210 nee | & | 100 ela) 8 1000 ° ° ue wut nua Dad repartizaji intr-o coloana S€T 0 valoare care confine sub-siruri ce nu au fost rmengionate ca membri ai setului, aceste siruri sunt eliminate gin coloana este repartizaté ‘0 valoare care consti din sub-sirurile rimase. Cind repartizafi valori in coloanele ST, nu este necesar ca sub-sirurile si fie mentionate in aceeasi ordine pe care afi folosit-o atunci cand afi declarat coloana. Totusi, cind regisiti valoarea ulterior, membrii vor fi mengionagi in ordinea de declarare. Si presupunem cl specifcayio coloani SET pentru a reprezenta articole de mobilie,folosind urmitoarea declarayie: Capitolul 2 Lucrul cu date in MySQL si SQL 125 acl repartizayi in aceasté coloani valoarea *scaun canapea,sasa*, se vor intimpla dou Iucruri. Primo sirel "canapea* dispare, deoarece nt este un membra al setului. Al doilea: ind regisiivalearea ulterior aceasta apare sub forma ‘masa, scaun*. Acest Iueru se produce deoarece MySQ” determina biti care corespund fiecirui sub-yiral valor care trebuie repar- tizate si fi activeae¥ in cadral valor stocate. Sub-sirul "cenapea" nu corespunde nici uma bit sieste ignorat. La regisire, MySQL. construieste valoarea sirului din valoarea numeric prin reurgerea biflor in ordine, faptcare are ca efect reordonarea automati a sub-firurilor in ordinea folosii ‘a declararea coloanei. Aceasticaracteristicl mai are i urmitoarea semnifi- caties dack specificagi un membru al setului de mai multe ori intro valoare, acest va aparca o singuri dati h rogisirea valor. Dact repartizati valoaree *2anpa,1anpa, espa" tat-o coloand SET, la regisire aceasta va avea numai valoarea “Lanoa*. Faptul ck MySQL modified ordinea membrilor dintr-o valoare SE inseamna cf, in cazul {n care ciutati valori folosind un sir, trebuie si enumerasi membrii in ordinea adecvatl. Dacd inserayi *eoaun, asa” si apoi clutagi “scaun nasa", nu veti gisi nimic;trebuie sé ‘uta valoarea “masa, scaun*. Sortarea si indexarea coloanclor ENUM si SET se realizeaza in conformitate cu valorile interne (aumerie) ale valorilor din coloand. Exemplal urmitor ar putes pirea altfl incorect, deoarece valorile nu sunt sortate in ordine alfenumericd: ‘nysql> SELECT © FROM e tabel ORDER BY €; co fon nee Valoarea MULL apare dupi sortare inaintea altor valori (sau dup acestea, la sortarea in ordine descendents). Putey exploata sortarea ent dac8avesi un set fixat de valor gi doris le soray tnts-0 acumiti ordine, Atribuifi coloanei tipul enustcind creafi tabelul si mentionati valorile din enumnerare ia declarafia coloane, in ordinea fa care dori si fie sortate care dori ca 0 coloan’ ENUM si fie sortatt in ordine lexicografick nor- Pentru situa ‘mali, puteyi converti coloana int-un gir non-ENW folosind CONcAT (si sortind rezultatal; snysql> SELECT GONCAT(e) AS ‘str FROM @_tabel ORDER BY © str 126 Parteal Uilizarea gonerala a sistemului MySQL Atributele coloanelor de tip sir Acriburul BINARY poate fi specificat pentru tipurile CHAR si VARCHAR pentru a determing twatarea valorilor din coloana sub forma de siruri binare (adick sensibile la diferentaintre ‘majuscule si minuscule in cazul operatiunilor de comparare gi sortare). Auributele generale NULL sau NOT NULL pot fi specificate pentru oricare dintretipurile gin, Dack nu specifica nici unul din acestea, atribucul prestablit este MULL. Totus declararea nei coloane de tip gir ca NOT NULL nu impiedicd introducerea unui gir vid. O ‘aloare vidi este difertsde'o valonre ineisent, deci ru face groyeala de #erede t putetiforja o coloand gir si confini valori nevide declarind-o NOT NULL. In cazul in care cerefi ca valorle girurilor si fie nevide, aceasta este 0 restriyie pe care trebuie si 9 impuneti in cadrul proprillor dumneavoastri aplicapi. De asemenea, puteti specifica o valoare prestabilti folosind atribucul DEFAULT pentru toate coloanele de tip sir, eu excepta tipurilor 8108 si TEXT. Daci nu specificati o valoare prestabilits, o asemenea valoare va fi aleasi in mod automat. Pentru coloanele care pot confine NULL, valoarea prestabilit este NULL. Pentru colosne care nu pot confine NULL, valoarea prestabilitk este sirul vid, cu excepyia tipului ews, unde valoarea prestabilil este primul membru al eaumeriri, (Pentru SET, valoarea prestabilit intr-o coloani care ‘hu poate confine NULL este de fapt setul vid, dar acesta este echivalent cu girl vid.) Coloane de tip dati si ori MySQL furnizeazd numeroase tipuri de coloane pentru valorile temporale: ATE, OATETINE, TIME, TIMESTAMP si YEAR, Tabelul 29 prezintd wipurile furnizate de MySQL pentrt declararea coloanelor care congin valori pentru dati i or8, precum si domenial valoclor permise pentru fiecare tip. Tipul YEAR a fost introdus in MySQL versiunea 3,22, Celelale ‘Spuri a fost prezente in toate versiunile MySQL. Dimensiunile necesare ale spaiului de stocare pentru fiecare tip sunt prezentate fn tabelul 2.10. ‘Tabelul 2.9 Coloane de tip dati gi ori Speciicagia tipuul Domeniy ate Ime ~1000-01-01" si “9990-12-31" TIME inte *-898:59:59" si "e38:59:59" pareriMe Intre “1006-01-01 00:00:00" si "9099-12-31 29:59:59" ‘TIMESTAL (u) ) Inte 1870010100000 § undova tn ani 2037 YEARE (0) 1 Ine 1901 gi2155, ‘Tabel 2.10 Dimensiunile spasiului de stocare necesare pentru coloanele de tip dati si ort Speciicatia tipuul Dimensiuni necesare ale spatiulu de stocare DATE 3 oct (anterior versiuni MySOL 2.22, 4 oct) THe 3 octet DATETIME Boxy | MySQL adaug? automat o pare de ork sub forma ‘1 itolul 2 Lucrul cu date in MySQL siSQL_ 427 ‘Spoetiatatipuiul Dimensiuni necosare ale spatilul de stocere ‘TIMESTAMP oct yeaa octet Fiecare tip dati si orf are o valoare "zero" care este stocatfatunci cind inseratio valoare care este incorectl pentru tipul respectiv, aga cum se poate vedea in tabelul 2.11, Aceasti valoare este, de asemenea, valoarea prestabilitd pentru coloanele de tip dati si ori care sont declarate NOT MULL. ‘Tabelul 2.11 Valorile .zero* pentru coloanele de tip dati si orf Specifcaia tub Valoare ,zero* DATE 0000-00-00" Tae *00:00:00* paTeTiMe 0000-00-00 00:00:00" ‘TIWESTAME ‘0000000000000 yeaa 000 1 intordeauna datele incepind cu anul, in conformitate cu specificayia iphi, 3 decembric 1999 este reprezentat sub forma *1999-12-0% ‘MySQL este oarecum lejer privind modul in care permite specificarea datclor de intrare. De exemplu, v3 converti valorile anilor compuse din dout oifre ta valori din patru cifre, iar dummeavonst nu trebuie si furnizagi un zero initial pentru valorile hinilor ji zilelor care sunt mai nici decit 10. Totus, trebuie si specificati mai int3i anul, Formatele cu care sunteyi mei obignuit, precum "12/3/99" sau "3/12/99" vor fi interpretate incorect. Regul flose de MySQL pentru inerpretare daelor sunt dipcuae in deli ia paragraful ,Lucrul cu coloanele de tip dati si ori". Valorile de tip orf sunt returnate conform fusului orar local al serveruluis MySQL nu executi nici un fel de modificiri in funcrie de fusul orar ale valorilor pe care le returneazi cliewulvi, ‘ ‘Tipurile de coloane DATE, TINE si DATETIME ‘Tipurile one, 1 si oATETINE congin valori de date, ore si valoricombinate de tip dati-or8. Formatele sunt ‘ARAA-LL-22*, “hhcnn:8s", "AAAA-LL-2Z hhiam:ss*. Pentru tipul DATETIWE, partea de dati gicea de ori sunt obligatori daca atribui’ ovaloare DATE unei coloane OATETINE, 00, MySQL trateazt ora din valosile DATETINE gi TIWe in modu ugordiferite. Pentru DATETIE, partea de orf resrezint o ori din 2. Pe de ali parte, ovaloare TIME reprezintitimpul scurs (ad de ce domeniul este atit de mare s de ce sunt permise si valoile negative) Partea din extremitatea dreapt a valori este considera ca indicind secunde deci, dacd inseratio va~ Joate de ori ,scurta" (incomplet definics) precum *12:30° intz-o coloani TIME, valoarea \, Socati este “OC: 12:80", ceea ce este interpretat sub forma 12 minute, 30 de secunde*, Puteti folosi coloanele de tip TINE pentru a reprezenta ora din zi daci dori, dar nu ital deaceastd reguli de conversie daci dort si evita problemele. Pentru a insera valoarea ,12 ‘ore, 30 de minute", trebuie si o specifica’ sub forma "12:00:00" 128 Partea! Utiizerea generalé a sistemului MySQL ‘Tipul de coloani TIMESTAMP Coloancle T:uESTAuP reprezinti valorile in formatul AAAALLZZhhaess, cu un domeniy ccuprins intre 1970101000000 si undeva in anul 2037. Domeniul este legat de ora UNIX, unde prima zi din 1970 este .ziva zero", cunoscuti gi sub mumele de wepoci. Inceputul Jui 1970 determina extremitatca inferioara a domeniului TiuestaWP. Extremitatea supe roar a domeniului corespunde limitei de 4 octeti a orei UNIX, care poate reprezenta valori ip anul 20378, ‘Tipul TIMesTaP are aceasta denumire (amprenti de timp - N-T.) deoarece are proprie- tatea special de a inregistra momentul creiri sau al modifieirii unei inregistriri. Dack inseratio valoare NULL intro coloani T1MeSTAuP, valoarea coloanei devine automat aceea a datei si orci curente, Acest lucru se intimpli si atunei cind creati sau actualizayi un rind, dar nu ateibuiti coloanei nici o valoare expliciti. Totusi, numai prima coloant Timesraue dintr-un rand este tratatk fn acest mod si, chiar si pentru prima coloani, putetianula aplicarea amprentei de timp prin insertia in coloant a unei date gia unei ore ‘xplicite in locul valorii NULL. Declaratia unei coloane TIMESTAMP poate include o specificaye pentru o lisime maxima de afigare u. Tabelul 2.12 afigeaza formatele de afigare pentru valorile permise ale lui Daca i este omis dintr-o declarayie TIMESTAMP sau are o valoare egali cu O sau mai mare decit 14, coloana este tratati ca TIMESTANP(14), Valorile impare ale lui M cuprinse in intervalul 1-15 sunt asimilate urmitorului numir par imedia superior. Tabelul 2.12 Formate de afigare pentru valorile TIMESTAMP Specficatiatpul Formatul de afigare ‘TaesTANP(14) ABMALLZZhnORSS ‘TIMESTAMP (12) ABAALLZZHh ‘TIMESTAMP (10) AaLLZzhhan TIMESTAMP (8) AAAALLZZ ‘Tawestaue (6) AaLizz Tamestaue (4) AALL ‘raueotaun (2) as Lijimeide afisare pentru coloanele TIMESTAMP nu are nici o legituri cu dimensiunes spatiilil de stocare sau cu valorile stocate intern. Valorile TIMESTAMP sunt intotdeatna stocate sub forma de 4 octep si sunt folosite in calcule cu precizie compleri de 14 cifre indiferent de ligimea de afigre. Pentru a vedea acest luers, sf presupunem of declaray vn tabel dup cum urmes2i, dupi care inserajiciteva rinduri in tabel si le regis “ Limitasuperioar a valorilor TIMESTAMP va crest pe misuri ce sstemele de opersce vor i modifi- ‘ate pentru aextinde limita superioari avalerilororei UNIX. Acesta este un aspect ear trebuieabor- dat la nivel biblioteci de sistem. MySQL va exploata aceste modificiri pe masurl ce acetes sunt elecwate NA. Capitotul 2 Lucrulcu date in MySQL siSQL 129 CREATE TAELE tabelUl_geu i ‘ts TINESTANP(A), iat ) INSERT INTO tabelul_neu YALUES(19990801120000,3) INSEAT INTO tabelul_neu VALUES(19990801120001,2) INSEAT INTO tabelul_neu VALUES(19990801120002, 1) INSEAT INTO tabelUl_meu VALUES(19990801120003, 0) SELECT * FROM tabelul_meu ORDER BY ts, i Datele de iesirs ale instructiunii SELECT se prezinti astfel: FTeseoe01 3 119990801 2 9900801) 1 4999080;/ 0 a aparengi, rindurile sunt stocate fat-o ordine gresiet~ valorile din prima coloand sunt toate identice, deci se pare cX sortarea ar trebui si aranjeze randurile fa conformieate cu va- Tore din a doua coloani. Acest rezultat aparent anormal se datoreazi faptului ci MySQL sorteazi in funcje de valorile complete, cu 14 cife,inserate in coloana TIMESTAIP. MySQL nu are nici un tip de coloane care si primeasca si ora crearii inregistedrii si Meo T ssl dept acece Dack dont sevag Soe locos pe soca douk moduri: # Folosii o ccloand TIMESTAMP. Cind fnregistraren este creatf pentru prima dat, ati- big colonnd valarea MULL pentru ao inijaliza cu valoarea dae ya orelcurente: TNGERT INTO rume_eabed (%8_co1, «..) VALUES(NULL, +.) De fiecare dati cind actualizatiinregistrarea lao dati ulterioarS, atribuii in mod expli- cit coloanei valoarea pe care 0 are deja. Prin atribuirea unei valori xplicite se com- tracareazi mecanismul de aplicare a afiprentei de timp, deoarece imptedicd accualizarea sstomatl «valor coloanel UPOATE nome tabed OCT 9_colvte_col MICRE ... ¢ Folosigi o coloani DATETIME, Cand creatio inegistrare, inilalizagi coloana la valoarea wow: INSERT INTD nume_tabet (dt col, ...) VALUES(NOM(), ...) La fiecare actualizare ulterioari a inregistririi, sai coloana nemodificati: UPDATE numz_tabel SET /* orice IN AFARA DE coloana dt_col */ WHERE Daci doriti si folosticoloanele TIMESTAMP pentru a pistra at o valoare a orei crefri, cit sia ore ultimeimodifiedri, putt face aceasta folosind o coloand TIMESTAMP pentru valoarea ‘rei modificSri,respecti o atf eoloan TIMESTAMP pentru valoarea orei credit, Verificat ca, ‘ora modificirii si fie inclusd in prima coloana TIMESTAMP, astfel incit si fie configurati cand“ Snegsrares ee cet ts mdi Tac din coldana oe or ered een dra dova coloand TIMESTAMP si initializati-o la valoarea NOW() atunci cind creati striri noi. ‘Avil, valonrea save reflcta momentul creel inregiou i nu se va modifics ulterior 1430 Parteal Utiizarea goneralé a sistemului MySQL Tipul de coloank YEAR ‘YEAR este un tip de coloand pe un octet folosit pentru reprezentatea eficientd a valorilor _ anilor. Domeniul de valoti este cuprins intre 1901 si 2155. Puteri folositipul YEAR atunc} ‘ind dorii si stocafiinformayii despre dace calendaristice, dar aveti nevoie numai de an, | ‘cum ar fi anul nasteri, anul alegerii in funcyia de pregedinte si altele. Cand nu aves rnevoie de o valoare de tip dati complet, YEAR este mult mai eficient din punctul de vedere al spatiului utilizar decat alte tipuri de date. Declarayia unei coloane YEAR poate include o specificare a litimil de afigare u, care poate 4 sau 2. Dacd t este omis dintr-o declarati de tip YEAR, valoarea prestabiltd este 4 TINYINT are aceeagi dimensiune a spatiului de stocare ca $i YEAR (un octet), dar nu si acelasi domeniu, Pentru a acoperi aceeasi perioadi de timp ca si YEAR folosind un tip intreg, aveyi nevoie de un SMALLINT, care necesito cantitate dubla de spayiu. Dack inter- valul de timp in ani pe care trebuie sil reprezentafi coincide cu domeniul tipului Yea, cel din urmi foloseste spagiul int-un mod mai eficient decat SUALLINT. Un alt avantsj al coloanei YEAR fafi de 0 coloani cu valoriintregi este acela cf MySQL va convertivalo- tile din doua cifre in valori cu patr cifre folosind regulile obignuite de ,ghicire™ aanu- lui din MySQL. De exemplu, 97 ji 14 devin 1997, respectiv 2014, Totusi, refineti cé inserjia valorii numerice 00 va avea ca rezultat stocarea valorii 0000, nu a valorii 2000 Daci dorigi ca o valoare zero si fie convertiti [a 2900, trebuie si o specifica sub forma Atributele coloanelor de tip dati si ord ‘Nu exist nici wn atribus specific coloanelor de tip daté si ori. Aributele generale HULL sau NOT NULL pot fi specificate pentru oricare dintre tipurile dati si or8. Dac nu specificagi nici tunul din aceste atribute, NULL este cel prestabilit. De asemenea, pute specifica o valoare prestabilitdfolosind atributul beFAULT. Daci nu specificagio valoare prestabilt, 0 aseme nea valoare va fi aleasé automat, Valoarea prestabiliti este NULL pentru coloanele care pot confine NULL. In caz contra, valoarea prestabiliti pentrstipul respectiv este .zero"- Lucrul cu coloane de tip dati gi or’ MySQL ineac st imerpreteze valorile de tip dati gi orf intro varietae de formate Valorie o4te pot fi specificate fa oricare din urmitoarele formate, inclusiv formele sie rnumerice. Tabelul 2.13 prezintd formatele permise pentra fiecare dintretipurile dati io ‘Tabelul 2.13 Formate de trare pentru coloanele de tip dati si orf Tip Formate permise PARAACLLAZZ hm: 36* *ARLL-ZZ hens" *AAAALLZZhhnMs* *AaLLzzhhanss* AARALLZZhnames AALLZZHhamss. DATETIME, TIMESTAMP Capitolul 2 Lucu eudate in MySQL siSOL 131, Formate pormise *ARAA-LL-ZZ* *AR-LL-2Z* *ARAALLZZ" “paLLzz* AARALLZZ aauuzz rime “hha: “phan hn ves saa fos AA Formatele cu dovi cifre pentru valoarea anului sunt intexpretate folosind regulile descrise in seeyiunea ,Interpretarea valorilor ambigui ale anilor*, Pentru formate de tip, sir care includ caractere de delimitare, nu trebuie si folositi cratimele pentru date, respectiv caracterul douk puncte pentru ore. Ca delimitator poate fi folosit orice sema. de punctuafie. Interpretarea valorilor depinde de context, nu de delimitatos. De exem- plu, desi orele sunt specificate de obicei folosind delimitatorul dows puncte, MySQL nu va interpreta 0 valoare care contine acest caracter ca "ori intr-un context unde se asteapt’ o dati. In plus, pentru formatele de tp sir care includ delimitatori, nu trebuie 8 specficayi doua cifre pentru valorile lunlor, zilelor,orelor, minutelor sais secundelor care sunt mai mici decat 10. Urmitoarele formate sunt toate echivalente intre cle: "2012-02-38 05:04:09" ‘zor ‘2012 *2012 *2012 Observayi cf valorile eu zerouri inifale pot fi interpretate difert, in funcrie de faptul lack sunt spesificate ca siruri sau ca numere. Sirul *001281 va fi vazut ca 0 valoare cu ase cre si vafiimerpretat sub forma "2000-12-31" pentru o coloand DATE, respectiv ca “2000-12-31 00:00:00" pentru o coloand DATETIME. Pe de alté parte, numéral 001281 va fi asimilat cu 1201 dup’ ce a ,trecut" prin analizor, moment dupa care interpretarea devine problematicl. Aceasta este o situapie unde cel mai bine este si furnizaj o valoare de tp sir sau si folositi o valoare complet detzrminati in cazul in care utilizapi numere (adic 20001231 pentru DATE, respectiv 209012310000 pentru DATETINE). fn general, putesi atribui la discreyie valoriSntre tipurile DATE, DATETIME si TINESTAIP), degi trebuie si yineyi cont de anumite restric ‘© Dacd repartizayi o valoare DATETIME sau TIMESTAMP Tntr-o coloand DATE, partea de ord este elimina, 132 Parteal_Utlizarea generalé a sistemului MySQL (© Daca repartizayi o valoare DATE intr-o coloand DATETIME sau TIMESTAWP, partea de ork a valorifrezultante primeste valoarea zero. ‘© Tipurile respective au domenii diferite fn particulas, TIMESTAUP are un domeniu mai limitat Gintre 1970 gi 2037) deci, de exemplu, nu puteri repartiza o valoate DATETIME anterioard lui 1970 intr-o coloand TEMESTAMP sisi vi apteptati la rezultate rezonabile De asemenea, into coloani TIWeSTANP nu puteti plasa valori din vitor indepirtat. MySQL furnizeazi multe funcfi pentru hucrul cu valorile de tip dati si or3. Pentru mai ‘multe informagi, vezi Anexa C. Interpretarea valorilor ambigue ale anilor Pentru toate coloanele de tip dati si ork care includ o parte care congine anul (OATE, DATETIME, TINESTAMP, YEAR), MySQL manipuleaz’ valori care confin ani exprimati prin doui cifre convertind aceste valor! in ani exprimagi cu patrucifre, Aceasti conversie se produce in conformitate cu urmatoarele reguli” ' Valorile anilor cuprinse intre 00 si 69 se transforma in valori din intervalul 2000-2069 * Valorile anilor cuprinse tntre 70 si 99 se transform in valori din intervalul 1970-1999 utes! vedea cel mai ugor efectul acestor reguli prin separtizarea a doui velori cu doug cifre diferite int-o coloani YeaA si apoi regisind rezultatele, De asemenea, exemplul va scoate in evidentd ceva ce merit repinut: nysal> CREATE TABLE y_tabel (y YEAR); Inysql> INSERT INTO y_tabel VALUES(68), (69),(99), (00); nysql> SELECT * FROM y. f 2068 1969 1909 0000 Observafi ci 0 fost converse in 0000, nn 2000. Aceastadeoarece Oeste 0 valoare abot crc pen ipl ve de ca ero muna tne! vei ie on zero numeric. Pentru a obyine 2000, insrai srl °0" sau "00", Vi pute asigura cl MySQL svede" un sir situ un numr prin inseria valorilor Yeas folossad cokeat() [cea nye returneanltntotdeaun tn rez gi indferont dak argomental este un gr sav un nna In orice ea, refine cB regulile pmtru conversiaanilorcompusi din dou cife tn ani comps din patr cfr asiguri sua ntuzea tn limite rezonabile a valor. Nu exist nici o modaltae ca MySQI si fie sigur de semniicaia unui an exprimat prin dou cife tunel cind ne se specifics scol. Dacsreplile ce converse din MySQL nu genesea2t lo drt, solic evident Frade irk cis ca ep pet ce, In MySQL 40, regulile vor suferio oarecare schimbare, prin aceea ck 69 va fi converte fn 1969, m9 {i 2069, tn conformitate cu regulile specificate prin standardal UNIX X/Open, = NA, Capitolul 2 Lucru cu date in MySQL giSQL 133 Alegerea tipurilor de coloana Secjiunea anterioara descrie difertele tipuri de coloane MySQL din care putefialege, precum si proprietitle generale ale acestor tipur, ca tipurile de valori pe care le pot tontine, cantitavea de spayiu de stocare pe care © pot ocupa si altele. Dar cum alegeti tipurile de coloane pe care le vei folosi cind creaji un tabel? Aceasti sectiune discuté despre aspeetele care trebuie avute in vedere pentru a va ajuta si alegeti. Cele mai .gererale* tipuri de coloane sunt tipurile gir. In aceste coloane putes stoca orice, deoarece aumerele si datele pot fi reprezentate sub formé de sir. Dec, de cei declara toate coloanele sub formé de sirur si si terminati povestea? Si ne gindim la ua singur exemphu, 4 presupunem ci aveti valori care arati ca nigte mumere. Le puteti reprezenta ca nuere, dar chiar trebuie si o faceti? Ce se intAmpli daci procedayiastel? {n primul rnc, probabil c8 vey folosio cantitate mai mare de spatiu, deoarece numerele pot fi stocate intr-un mod mult mai eficient decit sirurle. De asemenea, vefi remarca Uncle diferente fntre rezultatle interogirilor, datoritt modalitiylor dferite de manipy- lare a sirurlor gi a numerelor. De exempla, ordinea de sortare pentru numere nu este aceeasi ca pentru siruri, Numirul 2 este mai mic deci mumarul 11, dar girul "2" este, din punct de vedeze lexicografic, mai mare decit sirul “11". Puteti rezolva aceasta problemi folosind coloana intr-un context numeri, ca acesta: SELECT mune_coloana + 0 AS nun... ORDER BY nun MySQL are , problema anului 2000“? . ‘MySQL nu ars problema anului 2000, decerecestocheazs dale intem sub forms de ani cu patu cite, dar est Sspunderea durmneavoasté surizal de la bun Inceput dete care 88 ab ca rez stores Valottoradoovate, Adevrala problema cu interpreta anor cu coud cite nu este dat de MySQL, ci de dont umend de ao ua pe sourtatur gi de a fumiza dale echivoce, Dac dot 8 v8 esuma} ical sunt ler 85 o face Este riscul umneavoasr, iar rege de determinae a anu dn MySQL sunt adecvate in mite sii. Este bine £8 si, ns, cB exist stual cd rebue & introduce and paty tire. De exenolu, peta inroduoe date denaslore side deces In tbeli presente, care contina present aerican’ incepénd gin seal al XVlloa, se impune uizarea a patuscite Valorie dn 202s fe oloane acoperé mai mute secole, deci isa MySQL s8 ghia cecoll pe'baza unl an cin dou cre este catgorc 0 opine eronat Prin addugares unui zero la coloani se forjeaz% o sortare numeric, dar este oare rez0na~ bil? In general, probabil c8 nu. A determina MySQL si trateze coloana ca pe un numir, rma ca pe un si are citeva implicatii importante. Se forgeaza o conversie sir-numis pen- tru fiecare valoare din coloand, ceea ce este ineficient. De asemenes, transformarea coloanei fnts- coloani cu valori calculate impiedick MySQL si foloseascd un index pentru coloani, ceca ce reduce si mai mult viteza interogirii, Nici una din aceste degradiri ale performangei nu se va produce dack stocati de la bun inceput valorile sub forma de numere. Simpla opyiune de a folosi o reprezentare in locul alteia are implicayi pentru ceringele privind dimensiunea spafiului de stocare, manipulares interogitilor $i, performangele de prehucrare, 134 Parteal Utiizarea generalé a sisternului MySQL Exemplul anterior ilustreazi fapvul c¥ la alegerea tipusilor de coloane intrl in joc mai mult facori. Lista urmitoare parcurge rapid factorii la care trebuie si vi gindipi atunci cand selectayi un tip pentra o coloand. © Ce tip de valori va contine coloana? Numere? Sirus? Date calendaristice? Accasta este o fntrebare evident, dar trebuie si o punesi. Putey reprezenta orice tip de valoare sub forma de gir, dar, aja cum am vézut anterior, probabil veti objine performange superioare dacd folositi alte tipusi mai adecvate pentru valorle mumerice, (Acest hicra este de asemenea valabil pentru valorile de tip dati i ori.) Totusi, evaluarea tipului de valori cu cate lucrafi nu este in mod obligatoriu ceva banal, mai ales daci este vorba despre davcle alteuiva. Este deosebit de important si intrebayi care este tipul de valori ppe care il vor conyine coloanele in eazul in care configurati un tabel pentru alecineva 4 trebuie si fig sigur cl puneyi destuleintrebaei cu scopul de a primi suficiente infor- rmafii pentra a lua 0 deciaie inspirati. © Valorile dumneavoastri se gisese intr-un anumit domeniu particular? Daca sunt {ntregi, vor fi intotdeauna diferite de zero? Daci da, putet folosi uxstaned. Dack sunt siruri, vor fi intotdeauna selectate dintr-un set fixat de valori? Daci da, vefi gis! util ‘pul ENUM sau SET. [Existi wn compromis intre domeaiul unui tip gi cantitatea de spayiu de stocare pe cate 0 foloseste, Cat de ,mare* este tipul de care aveyi nevoie? Pentru numere, putefi alege tipuri mici, cx un domeniu limitae de valori, respectiv tipuri mari, care sunt, in esenfi, nelimitate. Pentru sirur, le putefi face scurte sau fungi si mu veti alege declaraia ‘iian(255) dack toate valorile pe care doryi si le stocayicongin mai pugin de 10 caractere, © Care sunt aspectele legate de performanta si eficient&? Unele tipuri pot fi prelucrate toa efiiene deci altele: Operapile numerics, n gener pot fi efeerate mai rapid decit operagile cu siruri, Sirurile scurte pot fi comparate mai usor decatsirurile lung siimplici, de asemenea, o suprasarcind mai redusi asupra discului. Performangele sunt mai ridicate pentru tipurile de lungime fixi decit pentru cele de lungime variabil’. © Cum doritis8 fie comparate valorile dumneavoastra? Pentra siruri, comparatile pot sesiza sau nu diferenga intre majuscule si minuscule, Aici, opyiunile dumneavoas- tek mai pot afecta si sortarea, care este bazati pe comparafi ‘ Intengionafi si indexati o coloand? Dacé da, acest ucru influenteaza opfiunes dum- neavoastri privind tipul coloanei, deoarece unele versiuni de MySQL nu vi permit si indexagi anumite tipuri, precum 8L08 gi TEXT. De asemenea, unele versiuni de MySQL impun ca 0 coloani indexati si fie declarati ca NOT NULL, ceea ce afecteaza posibili- tatea dumneavoastek de a folosivalori NULL. ‘Acum, si luim in considerare fiecare dintre acest probleme in detalu. Dar, inainte de a trece la fapte, permiteyi-mi un punct de vedere: dorit si faces cele mai bune alegeri posi- bile privind tipurile de coloane atunci end crea un tabel, dar, daci facet o alegere care niu se dovedeste a i optim’, mu este sfargitul lumi, Puri folosi ALTER TABLE pentru a jnlocui tipul cu unl mai bun, ceea ce se poate reduce la inlocuirea unui SUALLINT cu un eDiusnNT dupa ce agi descoperit c& datele dumneavoastri congin valori mai mari decit cele la care v-aji gindit inital. Aceasté operatie poate fi, iasi, complicati, cum ar fi {nlocuirea unui CHAR cu tn ENUM eu un set bine precizat de valori permise. In MySQL 3.23 Capitolul 2 Lucrul cu date in MySQL siSQL 135: siversiunile ulterioare, putes! folosi PROCEDURE ANALYSE) pentru a obsine informasi despre coloanele tabelului dumneavoastri, cum ar fi valorile minime si maxime, precum | gun tip optim propus care si acopere domeniul de valori dint-o coloani. Aceasti funcfie va poate ajuta si concluzionati ci se poate folosi un tip mai mie, eare poate imbunatiti performangele interogirilor care implic% tabelul gi eare reduce cantitatea de spafiu necesarl pentra stocarea tabelului Ce tip de valori va confine coloana? Primul lucru la care vi gindipiatunci cind incercati si vi decideyi asupra unui tip de co- Joani este genul de valori pentru care va fi folositd coloana, deoarece acesta este fapcul cu Smplicagile cele mai evidente pentru tipul pe care il aleget. In general, procedati intr-un mod previzibil stocayi numerele in coloane numerice, sirurile in coloanele sr, respectiv datele si orele in coloane de tip dati si or8. Daci numerele dumneavoastri au o parte fractionary, vet folosi un tip de coloank ew virgula mobilé in locul unui tip tatreg gi aga mai deparce. Uneori exist i except. Aici, principiul este cf trebuie s&ingelegeri natura datelor dumneavoastri, pentru a fi capabil sf alegeyi tipul de coloan fnti-o manieri ~ ,informat’*. Dacd vi veri stoca propriile date, probabil cd stiti bine cum si le caracteri- | zat Pe de ales parte, daci alte persoane vi solictdsX le configurayi un tabel, uneori datele problemei se schimba. S-ar putea si nu aflayi prea usor care sunt elementele pe care le folosigi. Nu uitai si punesi suficiente intrebiei pentru aaflatipusile de walori pe care tre- buie si le contin tabetul ‘i presupunem ci vise spune ci o coloans trebuie sk stocheze’ycantitatea de precipiagi". Este vorba de un numa? Sau este win cea mai mare parte" numeric ~ adici de reguli, dar nu intotdeauna este codificatk sub forma unui numir? De exemple, cind urmirgistirile Ia televizor, buleinul meteorologic include, in general, o misuri a precipitagilor. Uneori este vorba de un numr (de excmplu 6 mm de ploaie*), dar alteori este 0 jurma* de pre- cipitafii, ceea ce fnseamné foarte putin". Toate bune gi frumoase in ceea ce priveste buletinul meteorologic, dar ce inseamni asta pentru stocarea intr-o bazi de date? Fie tre- buie si cuantificati nofiunea de jurmé sub forma unui numa, astfel ince si puter folosi _ ocoloani numersi pentru a inregistra centtiile de precipita, fe trebuie $5 folosig un sir, astfl inet & pres inregitra eurnel ems". Alternativ, putei ven! ev un aranjament ‘mai complica, falosind 0 coloand numeric’ si o coloani gir, caz in care completafi 0 coloani gi inserati fn coalaltd valoarca NULL. Este evident ci doriti si evitayi acea opfiune, dick este posibis tabelul ar deveni mai dificil de ingeles gi ingreuneaz’ semnificativ sericrea interogirlor Probabil c& eu ag incerca si stochez toate rindurile in format numeric si apoi si le con- vertesc conform necesitigilor de afisre, De exemplu, dac8 orice cantitate de precipitayii ‘ai micS de 0,28 mm, dar diferiti de zero, este considerati o cantitate de tip ,urma", putefiafiga valori din coloang astfl: SELECT IF(precip>0 AND precip<.25, urma* precip) FROM ... 136 Partea! Utlizarea generalé a sistemului MySQL Pentre calcule monetare hucrai cu valori care contin dolari si cent. Acestea para fi valor cu virgula mobil, dar FLOAT si DOUBLE sunt supuse la erori prin rotunjire i pot fi inadec- vate, cu exceptia inregistririlor fn care aveti nevoie numai de o precizie aproximat Deoarece oamenii sunt destul de sensibili cind este vorba de banii lor, probabil ci veri avea nevoie de un tip de coloane care si permiti o precizie perfecta. Aveti la disporitie citeva optiuni: © Potefi reprezenta sumele de bani ca un tip DECIHAL(M, 2), alegind ta litime maxi- ii adeevati pentru domeniul de valori de care avegi nevoie. Astfel, obsinesi valori cu virguli mobili cu precizie de dou’ cifre dupi virguli. Avantajul tipului OECTUAL este acela ci valorile sunt reprezencate sub form’ de siruri si nu sunt supuse erorilor prin rotunjire. Dezavantajul este cd operagile eu siruri sunt mai putin eficiente decit cele cu valori reprezentate intern sub formi de mumere. Potegireprezenta intern toate valorile monetare sub formé de cenyi, folosind wn tip intreg. Avantajul este cé toate calculele sunt efectuate intern folosind intregi, ceea ce determini o mare vitezi de calcul. Dezavantajul este ci va trebui si convertifi valorle la intrare sau iesire, prin inmultie sau impietire la 100, Unele valori sunt in mod evident numerice, dar trebuic si determinafi dack vet folosi un tp fntreg sau cu virguli mobil. Trebuie si intrebayi care sunt unitigile de misuri si i le intregi este suficientt sau trebuie si reprezen- tari si unit fractionare? Aceasti intrebare va poate ajuta si faceti diferenta dintre tipurile de coloand intregi si ecle cu virguli mobili. De exemplu, daci reprezentaji ‘greutit, puteyifolosi o coloana cu valor! intregi daci tnregistrativalorile pan’ la cea mai apropiatl cantitate exprimatd in kilograme. Veyi folosi o coloan’ cu virguli mobili dack dori sé inregistrati unitii fracfionare. fn unele situagi, pute folosi chiar si eimpuri ruhiple, de exemplu dack doritis& inregistragi greutatea in kilograme si grame. ndlkimea este un ale tip numeric de informagii pentru care existi numeroase posibilitii de reprezentare: © Un sir de genul "6-2" pentru o valoare de genul 46 picioare si 2 inch™. Aceastd ‘opfiune are avantajul dea avea o form simplu de examinat side ineles (categorie mal simpli decit ,74 inch"), dar accasti categorie de valori este mai dificil de utilizat pentru ‘opersti matematice, precum tnsumarea sau ealeulul medi . © Un camp numeric pentru valorile exprimate in picioare yi altul pentru valorile exprimate in inch. Aceasta este 0 formi ceva mai ugor de tntrebuintat pentru opers- fille matematice, dar dou eimpuri sunt mai dificil de folosit decit unul singur. © Un camp numeric reprezentind valorile in inch. Este cel mai usor de utiliza de cltre o bazi de date, dar cel mai greu de injeles pentru oameni, Dar nu uitayi cl mu tre- buie si prezentati valorile in formatul pe care il folositi pentru a lucra cu ele, Puteyi reformata valorile pentru o afigare mai semnificativi folosind numeroasele funcyi le, * Am prefers psn vexel orginal, deosrece mares" noasts{ mone najonalé a ajun at de tnck inc vortind despre lei ban (ick uta parte dnurun leu) fo momentl sca sci tu producem dec rst! (oma sation) al estorle roman. NT. fa stemal merc anglo-son, unde sur alungimi pci = 39m, 1 inch = 254 on -NT. f Capitolul 2 Lucrul cu date in MySQL siSQL_ 137 sistemului MySQL. Aceasta inseamni cf optiunea de fap este cea mai buni madali- tate de reprezentare a indlyimil, Dack trebuie & stocati informatii despre date calendaristice, vaorile respective includ si ora? Cu alte cuvinte, va fi vreodatd nevoie si includ si ora? MySQL nu furnizeaz3 un tip de date care si aibi o parte optional pentru or%: OATE nu are niciodati ori, iar OATE- ‘TIME trebuie sf aibi 0 or Dacd ora este intr-adevir optional folositi o coloand oaTE pentru ainregistra data, respectiv 0 coloand TIME separati pentru a include ora. Apoi per~ sitesi coloanci TIME si ia valoarea NULL gi interpretafiaceasti valoare ca ,firl or CREATE TABEL tabetul_neu i ata OATE NOT NULL, ora TIME NULL ) Un tip de situatie cind este deoscbit de important si determinayi daci aveti sau nu nevoie de o veloare a orei se prochice atunci cind unigi douk tabele cu o relayie de tip ‘master-detaliu,tabele care sunt ylegate" in functic de informatile legate de dati ‘Si presupunem cf suntefi coordonatorul unei acivitpi de cercerare care implic8 subiceti ce intr in biroul dumneavoastré pentru af testai. Dupi un set iniial standard de teste, potefi efectua mai multe teste suplimentare in aceeasi2i, unde optiunea testelor variaz in functie de rezultatele testelor initial. Putesi reprezenta aceste informati folosind 0 relatie master-detaliu, in care informayiile de identificare a subiectului gi testele standard inigiale sunt stocate intro inregistrare master, iar toate testle suplimentare sunt stocate sub formi de rinduci intr-un tabel secundar cu detalii. Apoi, corelaji cele dou’ tabele in functie de idertificatorul subjectului si data la care au avut loc testee. Intrebarea la care trebuie si rispundesi in aceast8 situatie este daci puteyi fl data sau dact vi trebuie atit data, cit gi ora. Acest lucru depinde de faptul daca un su- biect poate parcurge procedura de testare de mai multe ori, pe durata accleiagi le. Dack da, incegistrati ora (de exemplu ora la care incepe procedura) folosind fie o coloani DATETINE, fie coloane OATE gi TIVE separate, care teebuie completatg amindous. Fick valoarea orei, nu veti putea asocia fpregistririle detaliu ale unui subiect cu inzegistrrile master adecvate daci subiectul a fose sestar de don ori fntr-o 71 ‘Am auzit oamani spunand: ,N-am nevoie de orf; nu voi testa niciodati un subiect de dows ori in aceeasi zi" Uncori au dreptate, dar i-am vizut pe o parte din acciasi oameni ajungind ulterior si se intrebe cum pot preveni asocicrea fnregistrarilor detaliu cu 0 Inregistrare master gresiti, dupi ce au introdus date pentru subiecyi care au fost testafi de mai multe ori fntr-o zi, Scuze, dar atunei e prea tarziu! Uncori puter’ rezolva aceasti problemi prin inserfia post factum tn tabele a unei coloane TIE. Din picate, inregistririle existente sunt dificil de remediat, cu excepfia situaiilor cind aveti o sursé independenti de date, cum sunt inregistrarile original scrise, Altfe, iu avefi nici o modalitate de a yclarifica misterul” inregistrSrilor detaliu ambigui, pen“ tua le asocia ou inregistrarea master adecvati. Chiar dact averi o sursi independent de informagii acecsta este o operate incureati si poate catrza probleme aplicapilor pe care le-agi seris deja cu scopul de a utiliza tabelele. Cel mai bine este si explicayi problema 138 Parteal Utizarea general a sistemului MySQL posesorilor tabelelor si si vi asiguragi cd dispuneti de o buni caracterizare a valorilor datelor inainte dea le crea tabelele. Uneori puteti avea date incomplete, lucru ce poate influensa opyiunes dumneavoastri privind tipurile de coloane, De exemplu, adunati date de nastere i deces pentru cercetiri de naturd genealogici, iar uneori tot ce pute afla este anul in care cineva s-a nAscut sau a decedat, nu gi data exact. Daci folositio coloan’ DATE, nu putefi introduce o dati deci daca dispuneti de toate clementele acesteia. Daci dorii si potetinregistra informatie pe care le aveti, oricare ar fi acestea, chiar daci sunt incomplete, sar putea si fyi obliga si folositi cimpuri separate pentru an, luni si 2. Apoi pute introduce piryie de informayi pe care le aveti si inserai valoarea NULL pentru celelalteinformati. fn MySQL 3.23 si ver= siunile ulterioare exist i o ald posibilitae, care permite pirilor care contin ziua,respec- tiv huna si data, si ia valoarea 0. Asemenea date ,neclare* pot fi folosite pentru a reprezenta valori de date incomplete. Valorile dumneavoastra se incadreaza intr-un anumit domeniu? Daca y-afi oprit asupra unei categorii generale din care si selectati un tip pentru o coloani, stabilirea domeniului de valori pe care dorigi si-I reprezentagi vi va ajuta si redticetiplaja de optiuni la un anumit tip din cadralaceleicategorli. S& presupunem ei doriti si stocati valori intregi. Domeniul valorilor dumneavoastré determin’ tipurile pe care le putet folosi. Daca averi nevoie de valori ia domeniul 0-1900, puteyi folosi orice tip cuprins fntre SUALLINT si BIGINT. Dact valorile dumneavoastr’ ajung pind la dovt milioane, nu putet folosi SUALLINT, iar opsiunile dumneavoasted variazi de la MEDTUMEKT Ja BIGINT. Apoi, trebuie si selecagi un tip dintre posibilitigile existente. Putefi, desigur, si folositi pur si simplu cel mai mare tip pentru categoria de valoare pe care dorifi si o stocati (B7GINT pentru exemplele din parageaful anterior). In general totusi, trebuie sf folositi cel mai mic tip care este sufcient de mare pentru intengile dumneavoastri. Procedind astfel, vefi reduce la minimum cantitatea de spatiu folositi de tabelele dumneavoastra, iar acestea vi vor oferi performance superioare, deoarece coloanele mai mici pot fi, de obicei, peluerate mai rapid decit coloanele mai mati Dack nm cunoastesi domeniul de valori pe care va trebui si-l putes! reprezenta, trebui si va folosigiintuipia sau si utlizayi SIGINT pentru a lua in caleul cel mai ru caz cu puting (Refineyi cd, daci vi dati cu parerea gi folosiji un tip care se dovedeste «fi prea ‘mic, nu este torul pierdut; puteyifolosi mai tirziwALTER TABLE pentru a face coloana mai sincipitoare",) {n capitolul I, am creat un tabel puncte pentru proiectul de evidensé a rezultatelor scolare, ‘are conginea o coloand puncte pentra inregistraea punctaelor obpinute la chestionare sila teste. Tabelul fusese creat folosind nT pentru a pistra simplitatea expuneri, dar acum pputeti vedea ci, daci punctajele se afla in domeniul 0-100, o opyiune mai bund ar fi TINVINT ‘UisraNeD, deoarece ar folosi un spayiu de stocare mai reds. Domeniul de valori din datele dumneavoastriinfluenteazs de asemenea atributele pe care le puteti folosi pentru tipul coloanei dumneavoastra. Daci valorile nu sunt niciodati ne- sative, putes! folosi UNSIGNED; in caz contra, nu puteyi Capitolul 2 Lucrul cu date in MySQL siSQL 139. ‘Tipurile sir nu au un ,domeniu* in sensul domeniului coloanelor numerice, dar ele au 0 Jungime, iar lungimes maxima de care aver! nevoie afecteaz’ tipurile de coloane pe care Je putofi folosi, Dact sirurile dumneavoasted sunt mai seurte de 256 caractere, puteti folosi CHAR, VARCHAR, TINYTEXT sau TINYBLOS. Daci aveti nevoie de siruri mai hu jputeyi folosi un tip TEXT sau aL0B, dar asta inseamnai ci GHAR si VAROHAR nt mai consti- tuie opfiuni viable pentra dumneavoastr. Pentru coloanele sir pe care le vei folosi pentru a reprezenta un set fix de valor, putey lua fn considerare wilizarea unui tip de coloane ENUM sau SET. Acestea pot constitu opfiuni utile, deoa.ece sant reprezentate intern sub formi de numere. Operaille cu acest tipuri sunt efercuate numeric, deci sunt mai eficiente decat alte tipuri de sirur. De asemenea, pot fimai vompacte decit alte tipuri de coloane sir, ceea ce determina economii de spatiu. ‘Cad caracterizai domeniul de valori cu care trebuie si lucrai termeni cei mai inspira sunt sintotdeauaa" si yniciodaté* (de exemplu ,intotdeauna mai mic decit 1000* sa sniciodatd negatv), deoarece vi ajuti si reduceti mai mult opriunile privind tipurile de coloane. Dar pizii-vi si folositi acest! termeni atunci cind nu sunt pe deplin justifc Fi atent mai ales end vi consultai en alte persoane cu privire la date lor i respectivit {ncep si va bombardeze ew acesti doi termeni. Cand omul zice ,intotdeauna" sat ynicio- data", asiguragi-7A cf vorbeste scrios. Uneori oamenii spun cd datele lor au intotdesuna 0 anumitf caracteristicS, pe cind in realtate vor si spund ,aproape intotdeauna”. De exemplu, si presupunem cX proiectai un tabel pentru anumite persoane vi spun: ,Rezukatele latest sunt intotdeauna cuprinse intre 0 si 100." Bazindu-vi pe aceasti afirmatig,alegeti pul THWINT gi fi dati atriburul UNs1eNED, deoarece valorile sunt intotdeauna diferite de zero. Apoi, descoperii ci persoanele care codifica datele pentru introducerea in baza de date folosesc uncori -1 pentru a semnala ci un elev a lipsit pe rmotiv de boala. Mai si fie! P-asta nu v-au spus-o. Poate fi acceptabil si folosigi ULL pen- ‘ua reprezenta isemenea valori dar, dack nu se poate, va trebui si Inregistragiun~1, dupa care nu mai pute folosio coloand UNSIGNED. (Pas alergitor, direcfia ALTER TABLE!) Uneori, deciziile despre aceste tipuri de cazuri se pot lua mai ugor punfnd o intrebare simplt: Existi vreodatd exceprii? Daca se produce vreodata un caz excepgional, chiar si 0 singurk dati, rebuie si fii pregitit. Veri descoperi ci persoanele care discuti cu dum- neavoastri despre proiectarea unei baze de date sunt invariabil de pirere ci, daca excepti- ile nu se produc foarte frecvent, atunci nu conteaz, Cand ereagi un tabel, nu puteri gindi asfel. Intrebare: pe care trebuie si 0 punefi mu este ct de frecvent se produc excepfii, ci acd acestea se produc, Dack exceptile se produc, teebuie si tineti cont de ele. Care sunt problemele de performanti gi de eficient? Optiunea dumueavoaste& privind tipul de coloane poate influenta performangele erogirilor in aumeroase modu. Dack avet in vedere indrumirile generale dseu seofiunile anterioare, veyi putea alegetipuril care vor contribui la prelucrarea mai ef cient in MySQL a datelor dumneavoastri. 140 Parteal_Utllzarea generali a sistemului MySQL Operatii numerice sau cu siruri Operatiile numerice sunt, in general, mai rapide decit operatiile cu sicuri. Si ne gindim Ja operatile de comparatie, Numerele por fi comparate dintr-o singuri operajie, i ntre octet care sunt cu atit Comparaie inte siruci por necesita mai multe comp: mai multe cu cit sirurle devin mai lung Daci o coloani gir are un numér limitat de valori, folosii un tip ENUM sau TYPE, pentru a beneficia de avantajele operatilor cu numere. Aceste tipuri sunt reprezentate intern sub forma de numere gi pot fi prelucrate mai eficient. ‘Si ne gindim la reprezentirile alternative pentru siruri. Uneori, putegi imbunitii per formanjele prin reprezentarea valorilor sir sub form de numere. De exemplu, pentru a reprezenta numerele IP fn notatia cu puncte, cum este 192. 168.0.4, ai putea folosi un sit, Dar, ca alrernativ’, putesi converti numerele IP in intregi prin stocarea fiecirei piri a formei cu puncte intr-un octet din cei patru ai unui tip INT UNSIGNED. Astiel, se va economisi spat si va creste viteza de ciutare. Pe de ales parte reprezentatea numerclor IP sub forma de valori v7 ar face dficila stabilirea de corespondenge cu un model, cum sunt cele pe care le-afi face daci doriti si cfutati numere dintr-o subrevea dati. Deci, au ‘putefi fine cont numai de aspectele legate de spatiu; trebuie si decideri reprezentatea cea, mai adecvata in functie de modul in care dorifi si utiliza valorile. Tipuri mai mari sau mai mict Tipurile mai mici pot fi prelucrate mai rapid decittipurile mai mati. Unul din motive ar fi acela c¥ ocupi spatiu mai putin si implied o suprasarcin’ mai redusé pentru actvitatea discului, Pentru giruri timpul de prelucrare se afla intro relic directa cu lungimes sirului. In general, abelele mai mici sunt mai rapide, deoarece prelucrarea interogirilor necesiti mai putine operatii de intrare-ieyire cu discul. Pentru coloane care folosese tipuri de dimensivne fixt,slegeti cel mai mic tip eare va contine domeniul impus de valori. De exemplu, mu folositi BIGINT dack se poate utiliza WEDTNINT. Nu folosipi 0oUBLE dack aveti nevoie mumai de o precizie FLOAT, Puteti economisispatiu chiar iin cazul tipurilor de dimensiune variabil8. Un 8108 foloseste 2 octet! pentru a fareyistra lungimea valor, ‘un LoNgBt08 foloseste 4 octet. Daci stocasi valoni care u depigese niciodatd 640KB, utilizarea tipului B10 vi economiseste 2 octeti pentru fiecare valoare. (Consideras milare sunt valabile si pentra tipurile Text, desigur) ‘Tipuri de lungime fixk sau variabili iin general, tipurile de hingime fix pot fi prelucrate mai rapid decat tipurile de lungime variabi # fn cazul coloanelor de fungime variabili, un tabel in care se efectueaz’ numeroase actualizari sau stergeri va prezenta un grad superior de fragmentare, datoriti dimen- siunilor diferie a inregistriilor. Va trebui si rulafi periodic procedura OPTIMIZE “ABLE pentru conservarea performangelor. Aceasta nu constiuie o problema in cazul indurilor de lungime fix. © Tabelele cu randuri de lungime fix sunt mai usor de reconstruit in cazul ,ciderii* unui tabel, deoarece poate fi determinat inceputulfieciei inregistriri. Acest lucra au Capitolul 2 Lucrul cu date in MySQLsiSQL 144 este valabil la inregistricle de lungime variabild si nu constituie o problemi de per- formangi in ceea ce priveste prelucritile interogicilos, dar poate accelera in mod evi- dent procesul de refacere a tabelului. Dici fn tabelul dumneavoastré existé coloane eu lungime variabilé, conversia lor la coloane cu lungime fixk va determina o imbunitajire a performantelor, deoarece inregis- tririle cu lungime fix sunt mai ugor de prelucrat Inainte de a incerca aceasti operate, {ineyi cont de urmatoarele aspecte: ¢@ Usilizarea coloanelor eu lungime fixd implici un compromis. Aceste coloane sunt mai rapide, dar ocupi o cantitave mai mare de spatiu. Coloanele GHAR(n) ocup’ fntotdeauna 1 octefi pentru fiecare valoare (chiar gi pentru valorile vide), deoarece valorile sunt completate eu spafii finale arunci cind sunt stocate in tabel. Coloancle VARCHAR(n} ‘ocupi mai pain spariu, deoarece este alocat numai spatiul necesar pentru stocarea ficcivei valod, plus un octet in fiecare valoare pentru tnregistrarea Jungimil, Astfl, daci alegey inte coloanele CHAR si VARGHAR, se face un compromis inte timp si spay. Daci viteza este problema dumneavoastri principals, folosipi coloanele GHAR pentru a cobyine avanteele de performanga ale coloanelor de lungime fix, Dack spaiul este la rare pref, folosisi coloanele VARCHAR, © Nu puteqi converti o singuri coloani de lungime variabili; trebuie si le convertti pe toate, De asemenea, trebuie si convertti simultan toate coloanele de lungime variabild folosind o singuri instructiune ALTER TABLE; in caz.contrar, demersul dumneavoastea ‘nu va avea nici un efect. © Uneori, nu putet folosi un tip de coloand cu hungime fixiychiar dacd doriti acest luc. [Nu exist’ tipari de lungime fixk pentru siruri mai langi de 255 caractere, de exemplu. ‘Tipuri indexabile Indexurile mirsse mult viteza interogitiloy, deci alegeti tipuri pe care le putetiindexa. Vezi sectiunea ,Aspecte legate de indexaze" pentru mai multe informati. ‘Tipuri NULL sau NOT NULL . Dack declarati o coloan ca find NOT NULL, aceasta poate fi manifulaté mai rapid, deoarece MySQL nu trebuie si verifice valorile coloanelor in timpul ptelucrariiintero- irllor, pentru'a vedea dact acestea congin sau nu valuarea NULL. De asemenca, se econiomiseste un bit pentru fiecare rind din tabel. Evitarea valorii NULL in coloane poate simplifica interogirile, deoarece nu trebuie si vi ‘mai gindigi la RULL ca la un caz special. In general, iterogirile mai simple sunt prelu- crate mai rapid Indrumirile legate de performanyé prezentate mai sus intr uneori in conflict. De exem- plu, un rind cu lungime fix’ care conyine coloane CHAR va fi mai rapid deci un rind ou lungime variabill care confine coloane VAROHAA, din punctul de vedere al capacitigi sistemului MySQL de localizare a rindurilor. Pe de alti parte, un asemenea rind va ‘ocupa mai mul: spay, deci implicX o activitate suplimentari a discului. Din acest punct de vedere, vanoHAR poate fi mai rapid. Ca reguli empiric, pureti presupune cd rindurile cu lungime fix vor determina o crestere a performanjelor, chiar daca se foloseyte o can- itate mai mare de spayiu. Pentru o aplicafie deosebit de important, puteyi implementa 142 Parteal_Utiizarea generalé a sistemului MySQL un tabel fa ambele modusi si eventual efecruayi teste pentru a determina alternativa cea ‘mai buni pentru aplicatia respectivi Cum dorifi si fie comparate valorile dumneavoastra? Putefi determina compararea gi sortareatipurilor sir fntr-un mod sensibil sau nu la di rena fntse majuscule si minuscule prin modul in care declarafiaceste tipuri. Tabelul 2.14 prezintl ficare tip care nu este sensibil la diferenta intre majuscule si minuscule, precum sicchivalentul siu sensibil lao atare diferengi. Unele tipuri (HAR, VARCHAR) sunt binare Sau nu jn functie de prezena sau absenta cuvantuli cheie BINARY tn declarajiacoloanei, CCaracterul binar al shor tipuri (@L08, TEXT) este conginat implicit in mumele tipuu. ‘Tabelul 2.14 Sensibilitatea tipurilor gir la diferenjafntre majuscule si minuscule Tip non-binar (insensibil la ciferenfa intre majuscule gi minuscule) Tip binar (sonsiil la ferent Intre majuscule gi minuscule) ‘OnAR) CHAR) BINARY VARCHAR (a) VARCHAR (U)BINARY TINYTEXT THNYBLOS Text BLOB eDTUNTEXT ‘NEDTUMBLOB LoneText \onesLo8, Reyineti cd tipurile binare (sensible la diferenta intre majuscule si minuscule) difera de omoloagele lor non-binare (insensibile la diferenga intre majuscule gi minuscule) aumai in ceea ce priveste comportarea in materie de comparare i sortare. Orice tip sir poate confine orice categorie de date. In particular, tipurile TEXT pot contine date binare fark nici un fel de probleme, in ciuda mentiunii ,TEXT* din numele tipurilor de coloane. Dacé dorig si folosit o coloand atit pentrv compara sensibile la diferenta ttre majus- cule si minuscule, cit si pentru compara insensibile la o asemenea diferent folosit un tip noa-binar. Apoi, de fiecare dati cind dorti o comparatiesensibil a diferenqa ‘majuscule gi minuscule, folosii cuvantal cheie BINARY pentru a for tratarea unui gir ca pe o valoare de tip sir binar, De exemplu, in cazul in care cotoana mea este 0 coloani CHAR, o putesi compara in moduri difeite: coloana_zea = *AB0* Insensibil la diferenga intre majuscule si minuscule BINARY coloana_nea = "A8C* Sensibil la diferenga intre majuscule si minuscule coloananea = BINARY *ABC* — Sensbil la diferenta intre majuscule gi minuscule valori si pe care dori si le sortafi fntr-o anumitd ordine ne-lexicografic, avefi in vedere utilizarea unei coloane ENUM. Sortarea valorilor ENUM se produce in con- formitate cu ordinea in care mentionafi valorle din enumerate in declaratia coloanci, deci putesi determina sortarea acestor valor in orice ordine dori Capitolul 2. Lucrul cu date tn MySQL si SQL_ 143 Intenfionati si indexafi o coloani? Indexurile permit sistemului MySQL si prelucreze interogirile mai rapid. Alegerea indexurilor este 0 problem’ discutatk mai detaliat in capitolul 4, dar un principiu general precizeazi ci accle coloane pe care le folositi de obicei in clauzele WHERE pentru selectarea randurilor consticuie cele mai bune optiuni pentru indexare. ‘Dack dorigi sf indexapi o coloant sau sf 0 includes intr-un index cu mai multe coloane, ‘exist restric privind tipurile pe care le pute alege. in versiunile MySQL anterioare ver- siunii 3.23.2, coloanele indexate trebuie declarate NOT NULL, dup cum tipurile BLOB gi TEXT iu pot fi indexate, Aceste restrict au fost eliminate in MySQL 3.23.2, dar, daci folosii o versiune anterioar3 gi nu pute sau nu dori si weeet la o versiune mai recent, trebuie i lucragi eu acesterestrictii, Totus, puteti ocoli restricile in urmatoarce situai ‘© Daci pate specifica o anumiti valoare ea fiind special, o puteyi trata ca gi cum ar avea aceeasi semnificatie‘ca si NULL. Pentru o coloand DATE, puteyi desemna valoarea 0000-00-00" ca avand semnificayia ,firi dats", Intr-o coloand de tip sir, puteti pre- ciza of un gir vid are semnificayia .valoare lipsi*. Yntr-o coloan numerici, putefi folosi ~1 daci, in mod normal, coloana va congine nurai valori non-negative, © Nu putefiindexa tipurile 8.08 sau TEXT, das, daci sirurile dumneavoastri mu depigese 255 de caraetere, folosii tipul de coloan’ echivalent VARCHAR si indexayi-l pe acela. Puresi folosi VARCHAR(255) BINARY pentru valorile BLOB, respectiv VAACHAA(255) pen- tra valorile “ExT. Intercorelarea problemelor legate de selectarea tipului de coloan’ [Nu putegi lua intotdeauna in considerare problemele legate de selectarea tipurilor de coloane ca gi cum acestea ar fi independente una de alta. De exemplu, in cazul tipurilor numerice domeniul este corelat cu dimensiunea spatiului de stocare; cind domeniul cexeste, aveti nevoie de o cantitate mai mare de spain, ceea ce afecteaza performantele. Ca alt exemplu, luasi fn considerare implicaille opyiunii de utilizare a atriburului ‘ATO_INGREMEAT pentru crearea unei coloane care sé contind numere de secventé unice. Opriunea respectiva are numeroase consecinge, care implicétipul coldanei, indexarea si uuilizarea valorié NULL: ‘© AuTO_INCREVENT este un atribut de coloand care trebuie folosit numai cu tipuri ntzegi Astfel, opyianile dumneavoastré sunt imediat limitate Ja tipurile cuprinse intte TINVINT gi BEGINT, Coloanele #uT0_1NoREMENT trebuie indexate de aga manieri inet numérul curent maxim din cadral seevenei si poats fi determinat rapid, far3 a necesita o parcurgere completi a tabelului. In continuare, pentru a preveni reutlizarea numerelor din seeventi, indexul trebuie si fie unic. Aceasta inscamnd ci trebuie si declarafi coloana ca PRIMARY "1900-1-1" AND data.deces 1S NOT NULL ‘Fiecare coloani selectaté reprezinti o expresie, ca i contimutul clauzei eRe, De asemenea, expresile mai apar fn clauza WHERE a instrucitnilor DELETE si UPOATE, in clauza VALUES() a insteueiunilor INSERT gi aga mai departe. | Cind MySQL intalneste 0 expresie, o evalueaz3 pentru a calcula un rezultat. De exem- plu (4*3)/(4-2) are rezultatul 6, Evaluarea expresiilor poate necesita conversié de tip. De exemplu, MySQL converteste numarul 960821 intr-o dati, si anume "1996-08-21", atunci cnd numarul este folositintr-un context care necesité o valoare de tip data Aceasti secjiune discuti modul in care puteyi serie expresii in MySQL, precum si care sunt regulite care guverneaza difertele categorii de conversii de tip pe care le executi MySQL in decursul procesului de evaluare a expresilor. Fiecare dintre operator MySQL este prezentat aici, dar MySQL are un numir atit de mare de func ince vorn aborda numa edteva. Totusi fecare operator si fiecare funcfie sunt prezentate in detaliu fn Anexa C. Capitolul 2 Lucrul cu date in MySQL siSQL_ 145 Scrierea expresiilor (O expresie se poate reduce la o singuri constanti: ° Constanta numeric ‘abe Constanti de tip sir Expresile folosesc apeluri la fancrii, Unele functiiiau argumente (valori plasate tntre paranteze), altele nu. Argumentele multiple trebuie si fie separate prin virgula. Cand invocasi o furetie, argumentele por fi delimitate prin spayii, dar intre numele funcyci si paranteza de deschidere mu trebuie si existe nici un spayiu: ow) Functie firé argumente STROUP (ebe*, “det*) Foncfic cu dou argumente STRONP( ‘abo*, “def ) Sunt permis spayile in jurul argumentelor STROUP (‘abc*,*det*) Spariile plasate dup mumele funetiei sunt interzise . ack existi un spayiu dup numele functie, analizoral MySQL poate interpreta numele funetiei ca peun nume de coloand. (Numele funcpilor nu sunt cuvinte rezervate sil putefi folosi pentru nume de coloané, dack dori.) Rezultatul obisnuit este o eroare de sintaxi. {In expresii se pot folosi si valori din coloanele tabelelor. fn situaria cea mai simpli, cind tabelul ciruia if apartine o coloand rezultd evident din context, 0 referingi de coloana se poate rezums, pur si simply, la numele coloane. In fiecare din urmitoarele instrucyiuni SELECT este specificat un singur tabel;astfel, referingele la oloane sunt lipsite de echivoc: SELECT une, prenune FROM presedinte SELECT nume, prenune FROM menbro Dac nu este clara identitateatabelului care va fi folosit, aumele coloanelor pot fi pre~ cedate de numele tabelului. Daci mu este clar nici micar numele bazei de date care tre- buie folositl, numele tabelului poate fi precedat de numele bazei de date. De asemenea, pputeyifolosi aceste forme mai concrete in contexte lipsite de echivoc, dack doris! pur si simplu si fri mai explicit: : ‘SELECT ‘ presuuintw.uee, pruswuante.prenun, hnonbru.nune, menbru.prenune FROW presedinte, menbru WERE presedinte.nune = menbru.nune SELECT semp_dbolev.nune FAO sanp_db.clev Jn final, putes combina toate aceste tipuri de valori pentru a forma expresii mai complexe. Tipuri de operatori MySQL include numeroase tipuri de operatori care pot fi folositi pentru a combina ter meniiexpresilos. Operatorii aritmetici, prezentayi in tabelul 2.15, includ operator obignuiti de adunare, scidere, inmulfire si imparyire, precum si operatorl modulo. Operarile aritmetie se executi folosind valoriintregi BIGINT (de 64 bil) pentru opera~ 146 Partea!_Uilizarea generalé a sislemului MySQL torii +, i+ atunci cdind ambii operanzi sunt fntregi, precum si pentru operator / si atuncicind operatia este efectuatd Int-un context unde se ateapt ca rezultatl s fe un Intreg, Retineti ci, dack o operatie implied valori mari, astfel incit rezultarul depigeste domeniul pe 64 de bit, vei obsine rezultate imprevizibile, ‘Tabelul 2.5 Operatori aritmetici Operator Sintaxa ‘Semnifcatie + arp ‘Adunare;suma operon : a-b ‘Scdere; rena inte operanci a Minus unar;negaia operand * ato Inmate; produsol operansior 1 arp impo; ctu operanzior % ayn Modula estul mas dup8 impSxrea operanclor Operatorii logici, prezentati in tabelul 2.16, evalueaza expresii pentru a determina dack sunt adevarate(diferite de zero) sau false (zero). MySQL include operator gin stil C* a L1 si 1 ca forme alternative pentru AND, OR si NOT. Observati mai ales operatorul ||; ANSI SQL specificd || ca operator de concatenare a sirurilor, dar in MySQL are semnificaia unei operatii OR (SAU) logice. Daci executati urmitoarea interogare si v4 asteptati ca scene af encute concatenate pu vei devopei eo empire of etme snumirul 0: SELECT "abe" || “det* 20 *abc* si "det sunt convertite in intregi in vederea operatei iar ambele se transforma fn 0, In MySQL, trebuie si folosigi funcria CONCAT(*abo" "do#*) pentru a efectua concatenarea sirurilor. ‘Tabelul 2.16 Operator: logi Operator Sintexa ‘Sermnifcatie AND, a8 a AND b, a && b Intersectilgicd;adevdraté dacd ambi operanzi sunt sdovirat on, I 2 OR, @ |] Reuniune logic; adevarals dack ovicare din operanai ste adovirat Nor, 1 Nor a, ta Negare logic adovBrals dad operandul est als Operatorii pe bit, prezentati in tabelul 2.17, executd intersecti si reuniuni la nivel de bit, nde lcare biel rezultatlui este evaluat sub forma intersect sau reuni lor corespunzitori ai operanzilor. De asemenea, puteti executa deplasiri ale stinga sau la dreapta. Operatiile cu bigi sunt efectuate folosindu-se valori intregi SIGINT (pe 64 de bis. operator ‘Sintaxa Capitolul 2 Lucrul cu date in MySQL siSQL 147 ‘Tabelul 2.17 Operator pe bit ‘Semniticatie Intersect (AND) I vel de it fecare bt a rezk ‘eso seat dace ii coreepunztor al ambloroperera sunt seta i ale Reurlune (OR a nivel de it care bt a ez ‘esl stat dacd bit corespunzo al oricrula dere opera ete sett Deplasare la singe a acu b poi de bt > ame Deplasare la drespta a lu a cub pal de bit Operatorii de comparatie, prezentayi in tabelul 2.18, includ operatori pentru testarea mirimii relative sau a aranjiri lexicografice a numerelor gia girurilor, precum si opera~ tori pentru stabilirea corespondenjei cu un model si pentru detectarea valosilor NULL. Operatorul <=> este specific limbajului MySQL gi a fost introdus in MySQL 3.23. 8 aan « acd Tabelul 2.18 Operator’ de comparatie Semnifatie Adovraldac8operana sunt eget Operator Sintaxa : Ao0 me a t= b, a b ——Adovéraldacd operanzt sunt fer < aco Adevarat dacd a este ai mic decdt b « acd ‘Adovérat daca este mai mic sau egal cu b > aotb ‘devdrat d2c8 a este mai mare sau egal ov b > asp ‘Adevarat daca este mal mare decdt b N a (bt, 02, ‘Adevdrat daca esto egal cu otcare cn termeni bt, b2, BETWEEN 12 BETWEEN b AND c Adel daca oe af inte valor hip gic, incu sic LiKe a LIKED Coraepondofl cu modu in SQL; adevirat dact = ‘corespunde cub i NOT LIKE @ NOT LIKE D Corasponda vu models in SOL; adevdral dak nu corespunde cu b REGEXP 2 RESEXP CCoraspondanfa cuo expres regula extinstadevaralé acd a corespunde cu b CCoresponden cu 0 expresie regula extinss;adevarats acd a nu corespunde cu b ‘Adovirat dad operanal sunt egal (chiar dad au vaoerea NULL) ‘Adevirat dac8 operandul este NULL ‘Adevdral dac8operandul nu este NULL \ NOT REGEXP a NOT REGEXP b - aero 1s MULL 218 NULL 1s NOT NULL @ 18 NOT NULL Opsratorul BIWARY este disponibil incepind cu MySQL versiunea 3.23 gi poate fi folosit pentru conversia unui sir int-un gir binas, astfl incit si fic sensibil la diferensa fntre 148 Parteal_Utiizarea generalé a sistemului MySQL majuscule si minuscule in cazul comparatillor. Prima dintre urmitoarele comparafii ny la diferenga intre majuscule si minuscule, dar a doua gi a tela sunt: *abe* 1 BINARY *abe" = “Abe ° abo" = BINARY "Abe" ° sti nici o conversie corespunzatoare NOT BINARY. Daca dori i folosii o coloand atit intr-un context sensbil la diferenta intre majuscule si minuscule, tsi fntr-un con- text fir aceasta caracteristicd,folositi un tip de coloand care nu este sensbil la diferenta intre majuscule si minuscule i utilizagi BINARY pentru acele comparafii pe care le doris sensibile la diferenga intre majuscule gi minuscule, Comparafile sunt fntotdeauna sensibile la diferentaintre majuscule si minuscule pentru coloanele pe care le declarati folosind un tip de sir binar (CHAR BINARY, VARCHAR BINARY si tipurile 8.08). Pentru a obfine 0 comparafie care nu este sensibili la diferenga intre ‘majuscule $i minuscule pentru un asemenea tip de coloani, folosfi UPPER() sau LOWER() pentru a converti ambii operanzi la aceeasi mirime a lterei UPPER(nume_coloana) < UPPER(*Tonescu*) LOWER(aume_coloana) < LONER(“Tonescu") Pentru comparatii incre giruci care mu sunt sensibile la diferenga intre majuscule si minuscule, este posibil ea mai multe caractere si fie considerate echivalente, in functie de setul dumneavoastra de caractere. De exemplu, € si s-ar putea si fie tratate identie in cadrul operatillor de comparatie si ordonare. Comparafile binare (sensbile In dife renga intre majuscule si minuscule) se executi folosind valorile ASCII ale caracterelon Corespondenta cu un model vi ajutS si cfutay valori fir afi obiigat si specificaio valoare literal exact MySQL furnizeastcorespondena cu un model ds SQL folosind operat. ral Like si caracterele de inlocuire ¥ (corespunde oricSreiseevenge de caractere) si (cores- punde oricarui caracter individual). De asemenea, MySQL furnizeaz& corespondenga cu un ‘model bazindu-se pe operatoral REGEX? si pe expresile regulate extinse care sunt similare celor foloste in programele UNIX precum grop, sod si vi. Trebuie sf folosii unul dintre aceyti operatori de stable a corespondengelor cu un model pentru a efectua stabilirea corespondengei cu tun model; nu puteyi folosi operatorul =, Pentru a inversa sensul unei ‘operatii de stabilie a corespondentei cu un model, folosiyi NOT LIKE sau NOT REGEXP, Cele dou tipuri de stabilire a corespondentei cu un model diferd sub dou aspecte impor tante, dincolo de utlizarea unor operator diferit si a unor caractere de mode diferte LiKe nu este sensibil la diferengaintre majuscule si minuscule deeét dacf minimum un ‘operand este un sir binar. REGEX? este sensibil la diferentafntre majuscule si minuscule!® © Modelele SQL corespund cu valoarea gisiti numai dack fatregul sir corespunde Expresiile regulate corespund daci ‘modell exe pisit ortund Totesorul iu "© Tacepand de la versiunes 3.234 REGENP nu mai este sensible difereng inte majascale si minus cule dect duck mininsum un operand ete un gr binar = NA. : wae SER a a Capitolul 2 Lucrul cu date in MySQL siSOL 149 Modelele folosite cu operatorul L1KE pot include earacterele de inlocuire % si _. De exemplu, modzlul “eleS* corespunde tuturor sirurilor care incep eu ele’ “elevat* LIKE “olewt ot ‘lonontar* LIKE *elek* e4 Caracterul de inlocuire & corespunde oricirei secvente de caractere, inclusiv cu secvenga vidi, deci *etes* corespunde fui tele” LIKE “ele¥* ot |Aceasta mai inseamni eX modelul “** corespunde oricirui sir, inchisiv sirului vid. Totusi, "¥" nu va corespunde valorii NULL. De fapt, orice stabilire de corespondengy cu tun model care contine un operand NULL va esua: Le? LIKE NULL © NULL, MULL LIKE “lest = NULL Operatoral LIke din MySQL au este sensibil la diferenta intre majuscule si minuscule, decit daca unul din operanai si este un sir binar. Astel, "ele" este echivalent in mod peal sen ral steve piu sirul *Elevat*, dar intr-o comparatie binari va f echivalent namai cu unul din cele dou siruri: "Elovat* LIKE ‘eles* relovat” LIKE “eles BINARY “elevat LIKE ‘eles* BINARY *Elevat* LIKE ‘eleSt 20 ‘Acest hucru nt se intémpli in eazul operatorului L2KE din ANSI SQL, care este sensibil la diferenga fntre majuscule si minuscule. ~ Caracterul de inlocuire poate fi specificat oriunde in interioral modetului, De exemplu, “eat este echivalent cu “birocrat’, ‘colorat® sau ‘aristocrat*. Pe de alth parte, ssuat ie este echivalent cu toate siruile de mai sus, dar gicu siruri gen "erater*, *atent sau “stratuni’. Celilal caracter de inlocuire permis pentru LIKE este _, care corespunde oricirui ter individual. corespunde oricirui sir format din exact trei caractere, "a_r* cores- punde cu ‘aor® i "aur" si chiar cu *a_r*, deoarece _este echivalent’cu el insugi. Pentru a dezactiva semnificapa speciald a caracterelor de inlocuire % gi_, pentru a cores- punde instanjelorliterale ale acestor caractere, precedafi-le cu un backslash (\ sau \_): abe" LIKE tect ot abe" LIKE *a\sc* 20 sake” LIKE ‘a\so* 21 Cealaltt forma folositd in MySQL pentru stabilirea corespondengelor cu un model foloseste expresile regulate. Operatorul este REGEXP, nu LIKE. (RLIKE este un sinonim pentru REGEX.) Caracterele de model cele mai folosite in cazul expresiilor regulate sunt urmitoarele: + corespunde orietrui caracter individual: abe REGEXP “a.c* ot baa 150 Parteal_Utiizarea general a sistemului MySQL {+11 corespunde oricirui caracter plasat intre paranteze drepte. Putesi specifica un do- ‘meni de caractere prin precizarea extremitiflor domeniului, separate printr-o liniut (+ Penaru a nega sensl clase astfel int i corespund tururorcaracterelor care nse afl pe list), specificai ~ ca prim caracter al clase: abc" AEGEXP *[a-2]* o1 ‘abc* REGEXP “[*a-2]* 20 + corespunde oricirui numar de elemente la fel cu eel anterior semaului. De exemplu, x* corespunde oricirui numir de caractere x: abcdet" REGEXP ‘a.*t* e4 “abe REGEXP *[0-8)*abo* en “abe REGEXP *[0-9}[0-8]** 20 »Orice numie* inseamn’ gi zero aparifii, motiv pentru care a doua expresie este ade- Virati “nad gi mods ancoreaza o corespondenfa cu un model astfel incdt modelul nod cores- punde numai atunci cand survine la incepucul sau la sfirgitul unui sig, iar “wodS cores- punde numai daci nod corespunde intregului sir "abo" ESEXP "bY o4 abot REGEXP *-b" 20 abe" REGEXP *bs* 20 “abo” RESEXP *“abes* en “abed" REGEXP "*abcs* 20 ‘Modell necexr poate fi lust din coloana unui tabel, desi aceasti operate va fi mai lent decit un model de tip constanti, in cazul in care coloana confine numeroase valori diferite, Modelul trebuie examinat si convertt in form’ intern’ de fiecare dati cind valoarea din coloans se modific3. Stabliea corespondentelor cu expresile regulate din MySQL dispune si de alte carac- tere model speciale. Vezi Anexa C pentru mai multe informagi, Precedenfa operatorilor ‘Cand MySQL evalueazi c exprésie, examineazi operatorii pentru a determina ordinea in care trebuie i grupeze termenii expresiei. Unil operator! au o precedenyi mai ridicati,adicd sunt mai ,puternici* deci aly, in sensol ef sunt evaluagifnaintea altora. De exempla, inmates. si impirtirea au o precedensi. mai ridicati decit adunarea si scidezea, ‘Unmitoarele doui expresi sunt echivalente, deoarece + gi / sunt evaluate inainte de+ gi -t t+2r9-475 262 146-8 26.2 Precedenfa operatorilor este prezentati in lista urmitoare, in ordine descrescitoare Operatorii mentionagi pe acecasilinie au acceasi precedent. Operatorii cu un nivel de precedent mai ridicat sunt evaluayiinaintea operatosilor eu un nivel de precedent mai redus. BINARY nor t = (minus. unar) Se Capitolul 2 Lucrul cu date in MySQL siSQL 154 ce = cep fe @ >= > IN 1S LIKE REGEXP ALIKE SETWEEN 20 88 omit ute folosi saranteze pentru a ignora precedenfa operatorilor si pentru a modifica ordinea in care sunt evaluati termenii unei expres yeera-4/8 © 62 Weare ass 2-08 Valorile NULL in expresii Fi atent cind folositi valoarea NULL in expresi, deoarece rezultatul s-ar putea si nu fie fntotdeauna cel scontat, Indrumisile urmétoare vi vor ajuta si evtati surprizele, Dack specifieni NULL ca operand pentru orice operator aritmetic sau la nivel de bit, reaultatul este MULL: 4+ MULL = Mute 4 NULL ern Daci folosigi WLL cu wn operator logic, valoarea NULL esta comsideratk falsi + AND NULL 20 4 oR MULL ot © AND NULL 50 0 oR NULL 20 NULL ca operind pentru orice operator de comparatie produce un rezultat NULL, cu exceptia operatorilor <=>, 18 NULL si 13. NOT NULL, care sunt special concepuyi pentra ‘manipularea valorilor NULL: a 4 = NULL © LL NULL = NLL = NutL 1 NULL 20 ULL <=> MULL en 1 1S MULL 20 NULL 18 NULL et fn general, funcile rerumneaz WiLL dact primese argumente MULL, cu excepyia acclor fanegii concepute pentru a manipula argumente NULL. De exemple, IFMULL() poate ‘manipula argumente NULL si returneazi ,adevirat" sau yfals" in consecing8. STROMP() presupune argumente non-NULL; daci descoperi c& i-ati transferat un argument NULL, returneazi NULL, nu ,adevirat” sau yfals". 4 fn cadrul operatilor de sortare, valorile NULL se grupeazd la un loc. NULL este plasat, dup} sonra inirtea tturor valorlor non-WLL (inclusi girul vid) in eazal une sortiri ascendente, respectiv dup toate aceste valori la 0 sortare destkadent’. Baise si 152 Parteal__Utiizarea generalé a sistemului MySQL Conversia de tip MySQL execut3 automat conversii masive de tip, ia conformitate cu genul de operatic pe care o efectuati, ori de cate ori o valoare de un tip este folosita intr-un context care necesito valoare de un alt tip. Conversia de tip se poate produce din oricare din urm- toarele motive: © Conversia operanzilor la un tip adecvat pentru evaluarea unui operator © Conversia argumentului unei functi la un tip seontat de funcyie © Conversia unei valori pentru repartizarea intr-o coloand de tabel eare este de un alt tip Expresia urmitoare necesitl conversa de tip. Expresia consti din operatorul de adunare sidoi operanzi, 1 si "2": tea Operansi sunt de tipur dferie (num gi sir), deci MySQL tl converteste pe unul pentru s-tadice lun numitorcomun, Dar eae exe operandal eae webuie modifea? Ie ace caz, + este un operator numeric, deci MySQL doreste ca operanzii si fie numere si con verteste sirul '2* in qumirul 2. Apoi, evalueaz expresia pentru a produce rezultatul 3. Tati un alt exempl. Funcia CONCAT() concateneazi sirurle pentru a produce drept rezultat un gir mai lung. Pentru aceasta functia isi interpretea3 argumeatele sub forred de siruri, indiferent de tipul acestora. Dact fi transferayi o mulsime de numere, CONCAT() Teva convert in girur, dup eare va return rezultarlconeatendrt acenon concer (12,8) e125" act apelul la funegia cowcar face parte dintr-o expresie mai mare, vor mai avea loc si alte conversii de tip. Sé udm urmatoarea expresie fi rezultatul elt EPEAT (°XCOHCAT(1,2,8)/10) arene cONCAT(1,2,2) produce siral "129", Expresia “123*/10 este convertita in 128/10, deoarece {impittirea este un operator aritmetic. Rezultatul aceste expresi va fi 12 cu virguli mobili, dar functia REPEAT() presupune un numar tnereg de repetiei, deci se executi o impirtize intreagi pentraa se obfine rezultatul 12, Apoi, funcjia REPEAT('X' ,12) are ca rezultat un sir format din 12 caractere 'X'. Un prncipia general care trebue ena este acca ck MySQL fncearc of converteascl walovte in tipe cera. deo expres Toe dea gener c oure, fe faners de een MySQL va converti valorile ficcireia din cele tre: categorii generale (qumere sruti sat date i ore) in valori ale oricareia din celelalte categorit. Totusi, valorile nu pot fi intot- deauna convertitedintr-un tip in altal, Daci o valoare care trebuie convertiy int-un tip dat nu este o valoare admist pentru tipul respectiv, conversia epucazd. Conversia tn Damen unorobigte precum "ab" cae mu preci un pet mimesis areca rezuhat talomead. ‘Conversia in tipuri dati gi ori a unor obiecte care au aspectul nor date sau ore are ca rerultatvaloarea ,zero" pentru tipul respectiv: De exemplu, conversia girului “abe* into dati are ca rezultat data de tip zero "0000-00-00". Pe de alti pare, orice valoare poate fi ‘watati sub forma unui sg, deci in general conversia une valor fate-un sir mu consttuie 0 problemi. Capitolul 2 Lucrul cu date in MySQL si SQL 153, De asemenea, MySQL execut’ si conversii minore de tip. Daci folositi o valoare cu vir- 15 mobili fatr-un context intreg, valoarea este convertti (cu rorunjire). Conversia in Cealatd directie este de asemenea posibili; un intreg poate fi folosit fir probleme ca numar in-virguls mobili. Constantele hexazecimale sunt tratate ca siruri, cu exceptia situafiilor cnd contextul indicd cu clartate un numa. fn contextele sir, fiecare pereche de cifre hexazecimale este converts fntrun caracter si rezultarul este folosit ca gir. Urmitoarele exemple ilus- treazd acest principiu: oxsi eee oxet + 0 oo concar 0x61) et 8 CONGAT(OXS1 + 0) i ‘Acelasi principiu de interpretare se aplici si in cazul comparafilor: 0 constant hexa- zecimali este tratatd ca sis, cu excepyia cazurilor cand este comparati cu un mumir: 40 = ox0a o4 10 = 0x09 20 ‘\n" = 0x08 24 ‘\n" = oa +0 2 et (*\nt = 0x0) + 0 ‘Uni operator forzeaz% conversia operanzilor in tipul asteptat de operator, iniferent de tipal operanzilor. Operatorié aritmetici sunt un exemplu in acest sens; ef agteapti numer, iar operanaii sunt convertiti in consecingé: + ae4 eT roel 27 rar tat eT [Ne este suficent ca un sir si congin§ pur si simplu un numar pe undeva, MySQL nu ‘aut in tot sul, in speranja cf va gisi un mumir; cauti mumai la inceput. Dacd un gir Ja inceput, ezultatul conversci este 0. + 2 1973 ‘ ew seo-vaea' +0 22 “23-valea* +0 2-23 ‘earbon-14" + 0 20 Regineyi ck regula de conversie sir-numir din MySQL s-a modificat incepind de la junea 3.23, Anterior acelei versiuni, siurile cu aspect numeric au fost convert fn valori intregi, cu rotunjire. De la versiunea 3.23, acestea vor fi convertite in valori cu virguld mebili +-428.9" + 0 1-429 (uysal. < 3.23) *-428.9" +0 © -428.9 (aySOl_ 3.23) Operator logil si cu bisi sunt chiar mai stricyi decit operator aritmetici. Acestia, impun ca operanzii si nu fie numai numerici, ci fntregi, iar conversia de tip se executl fn consecingi. Aceasta inseamna ci un numir cu virgula mobili cum este 0,3 nu este iderat adevirat, chiar dact este diferit de zero; aceasta deoarece, atunci cind este 154 —Parteal Utiizarea goneralé sistenuiui MySQL convertt la ua intreg, renultatul este 0. fn expresile urmitoare, operansi au sunt con- siderati adeviragi decat atunci cind au o valoare cel pugin egali cu 1. 0.3 OR .04 20 1.3 0R .04 a4 0.3 AND .04 20 1.8 AND 04 20 1.3 AND 1.04 ot ‘Acest tip de conversie se produce si in cazul funcfiei 1F(), care presupune ca primul argument si fie un intreg, Pentru a testa in mod adecvat valorile cu vinguld mobi, cl mai bine este si folositi o comparatie explicta. In caz contrar, valorile mai miei decit 1 vor fi considerate fas ro*, *20ro") © tnon-zer0* 1F(0.3,"non-2er0*, “20r0") © "zero" IF (0.9°0,'*non-zer0", "zero") © ‘non-zero Operator de stabilire a corespondengelor cu un model se ayteapri sk opereze cu gira. ‘Aceastainsearni ci pute folosi operatorii MySQL de stabilite a cocespondengelor cu sun model folosind numere ca operanzi, deoarece avetia vor converti numerele fa siruri, in incercarea de a gisi o corespondentit 12045 LIKE “18 12545 REGEXP *1.*5* Operator de comparati a mirimil (<<, » si aga mai departe) sunt sensibll la context; cul alte cuvints, sone evaluat in confoomiate cu tpul operanzlor lor Fxpresia uri toare compari operanzii prin mijloace numerice, deoarece ambii operanai sunt mumere: 2 ile care implic8 operatorul <=>, comparagile care implick WLL au ca rezulk tat WULL. (Operatorul <=> este similar cu *, cu excepyi faptului eX afirmatia NULL <=> MULL este adevirath.) Soh foi afimatamas e4 et © Daci ambii operanzi sunt siruri, atunci vor fi comparafi lexicografic ca siruri ‘Comparatiile intre siruri sunt efectuate folosind setul de caractere afl in vigoare pe ‘© Dac ambii operanzi sunt intregi, vor fi comparayi numeric ca intregi. Constantele hexazecimale care nu suat comparate eu un mumir sunt compara girari binare. pee arwees Capitolul 2 Lucrul cu date im MySQL siSQL_ 155 1 Dack oricare dintre operanzi este 0 valoare TIVESTANP sau DATETIME 4 clalalteste 0 con seanti, operanzii sunt compara ca valori TIMESTAWP. Acest lucru se face cu scopul de a determina comparaile si funcfioneze mai bine pentru aplicajile ODBC. In caz.contar, operanzii sunt comparayi numeri ca valori cu virgult mobili. Reqinegi cf aici este inclus gi cazul comparatiei unui sir cu un mur, Sirul este convertit la un hnumie, ceca ce are ca rezultat valoarea 0 daci sirul nu arati ca un num. De exempla, "14.3" este convertit Ia 14.3, dar "L4.9" este converte la 2er0, Reguli de interpretare a datei gia orei MySQL comvertese liber girurle sf numerele in valoride tip da’ i or§, conform cerin~ jelor contextului unci expres, gi viceversa, Valotle de tip dat si ord sunt converste in humere intr-un context numetic; numerele sunt convertite in date stu ore intr-un con- text de tip datS sau or8. Accastd conversic la 0 valoare de tip dati sau ord se produce fuunel cand repartizaji o valoare intr-o coloant de tip dati sav ori, respectiv cind 0 functie necesita o valoare de tip dati sau ork. In comparafi, regula generala este ca valo- tile de tip dati i oF% si fie comparate ca siruri. Dack tabelul tabelu1_nev contine o coloank DATE denumiti data_col, urmitoarele inserucyiuni sant echivalemte: INSERT TATO tabelul_neu SET data_col = "1997-08-19" INSERT INTO tabelul_meu SET data_col = "19970419" INSERT INTO tabelul_seu SET data_col = 19970419 fin exemplele urmitoare, argumentul functii TO_OAYS() este interpretat ca find una si acecagi valoate pentru toate cele trei expresiis To_DAYS("1997-04-10") © 720489 ‘To_DAYS("19970410") 729489 > 729489 ‘o_DAYS( 10970410) ‘Testarea gi forfarea conversiei de tip Pentru a examina modul de efectuare a conversii de tip intr-o expresi, folositi progra- mul aysql pentru a emite o interogare SELECT care evalueazi expresti: ysql> SELEGT Oxe1, Ox81 + 05 ‘oxai oxats"0 n oo ‘Aga cum vi puteti imagina, am ficut 0 mulyime de lucruri ca acesta in timpul scrieri capitolului d>faya! Testarea evaluirii expresillor este importanté mai ales pentru DELETE sau UPDATE care modificS inrepistriri, deoarece doriti si fii sigur ci modificagi rmumai randurileseontate, O modaltate dea verifica o expresie este de a rua o instruc- tune SELECT preliminari cu acecasi clauzd WHERE pe care urmeazi si o folositi pentru Instrucfiunes DELETE satu UPDATE, pentru a verfica in ce misurd clauza selecteaz’ rasiy durile adecvate. Si presupunem cX tabelul tabelui_neu are o coloand CHAR denumiti char_col, care confine urmitoarele valor eucfiunile precum 186 Partea!_Uitiizarea general a sistomului MySQL +001 yo pa “a Daci se dau aceste valori, care este efectul urmitoarel interogiti? DELETE FROM tabelul_neu WHERE char_col » 00 Efecnul scomzat este probabil stergerea celor douit randuri care congin valoarea "00", Efeceal rel este stergerearoturor eindurilor,o surpriad neplicutd, Aveans oe intimpli €2.0 consecinga a regulilor de comparatie folosite in MySQL. char_col este o coloani de Ui sis dar 00 nu este inclus intre ghilimele, deci este eratat ca numa. Conform regulilor de comparatic din MySQL, o comparatie intre un gir gi un numar este considerats ca 0 cemparafie intre dou numerc. La executarea inerogiri DELETE, fiecare valoare din goloana char_cot este convertiti intr-un numir si comparatd cu 0: *00" se conver 12, dar tot i Ose vor convert gi clelaltc gir care nu au appect numec Ga alate, clauza WHERE este adevirati pentru fiecare rind, ir instucranea DELETE sterge tabelul, Evident, aceasta este o situatie unde ar fi fost prudent si se testeze clauza MHERE cu o instrucsiune SELECT inaintea execufiei instructiunii DELETE, deoarece aceasta v-ar fi ark. tat ei expresia selecteaza prea multe einduris (Cand nu suntefi sigur cu privire la modul in care va fi folosity o valoare, puteti dori si Gzploatat wecansmol MySQL de evaluare a expreilr, pent 2 forts conversa la 9 valoare de un anumit tip: Adivgayi +0 sau +0.0 la un termen pentru a forga conversia lao valoare numeric: oxes oe ox65 + 0 8 101 0x65 + 0.0 9 101.0 © Folosigi car () pensru a transforma o valoare intrun sirt, 4 ou Conan (14) 2a © Unilizagiasczz() pentru a obtine valostea ASCII a unui caracter: "A ain ‘ASCIT(*A*) © 65 Capitolul 2 Lucrulcu date in MySQL siSQL 157 ‘© Folosifi 0ATE_ADD() pentru a forya tratarea unui gir sau a unui numa ca dati: 19990101 => 19990101 DATE_ADD(19990%01, INTERVAL 0 DAY) «> "1990-01-01" "19990101" © 19900101 DATE_ADD("19990101", INTERVAL 0 DAY) => "1999-01-01" Conversia valorilor din afara domeniului sau a valorilor nepermise Principiul de bazi este: semeni vant, culegifurtund. Dac nu v8 verificatidatele in prea- Inbil inainte de a le stoca, s-ar putea si nu vi placi rezultatele objinute. Acestea fiind ise, ick cdteva principii generale care descriu modalitiyile folosite de MySQL pentru manipularea valorilor situate in afara domeniului sau necorespunzitoare din alte motive: ‘Pentru coloane numerice sau de tip TINE, valorile care se afl in afara domeniului admis sunt ,tSiate* pani la valoarea celei mai apropiate extremitifi a domeniului, iar valoarea rezaltanti este stocati, # Pentru coloune de tip gir altele decdt EMM sau SET, srurile prea lungi sunt trunchiate, pentru a se incadra tn lungimea maxim’ a coloanei. Repartizarile intr-o coloang ENU sau SET depind de valorile care sunt mengionate ca permise la declararea coloanc Dack repartizagiintr-o coloand ENUM 0 valoare care nu este mentionati ca membra al enumeriri, in locul acesteia este repartizat membrul yeroare* (adici irul vid care corespunde membrului cu valoare zero). Dack repartizayi coloanci SET o valoare care confine sub-siruri care nu sunt menfionate ca membri ai setulu, sirurile respective sunt elimina‘ gi coloana primegte o valoare care consti din membrri rimagi Pentru coloanele de tip dati sau ori, valorile incoreete sunt convertite in valor »2er0" adecvate pentru tipul respectiv (vezi tabelul 2.11), Pentru coloanele de tip data si ort altele decie taut, valorile care se gisesc in afara domeniului aferent tipului de coloané pot fi convertite la valoarea zero", la MULL sau la o alti valoare. (Cu alte cuvinte, rezultatele sunt imposibil de anticipat.) ‘Aceste converai sunt raportate ca avertismente pentru instrucfiunile ALTER TABLE, LOAD DATA, UPDATE, precum si pentru instructiunile INSERT cu mai multe randuri. fn eltentul fyse, aceste informapii sunt afgate in linia de stare care este rsportata pentru o intero~ tare, fntrun limbaj de programare, vi puteyi procura acesteinformafii prin alte mijloace. Dac folosiiimerfaga API din MySQL pentru C, puteyi apela funcia nysq_inta(). Cu ajutoral interfejei API pentru modulul DBI din Perl, pute folosiaributul nysql_into() al conexiunii damneavoastra cu baza de date. Informatie furnizate reprezinti numéul de avertismente, Pentru a vedea care au fost randurile modificate, putefi emite o intero- ge SELECT ... INTO OUTFILE si compara rezultatul cu rindurle originale. CAPITOLUL 3 Sintaxa si utilizarea SQL in MySQL Pentru a putea intretine comunicayi cu servers! MySQL este necesar si yvorbigi" fluent limbajul MySQL. De exemplu, cind folosigi un program cum este clientul mysql, acesta functionesza cu precidere ca un mijloc care vi permite s§ trimiteyi instructiuni SQL cure server in vederea executirii acestora, De asemenea, trebuie si cunoasteyi limbaul SQL daci dori si seriesi programe care folosesc interfasa MySQL furnizatS de limba- jul dumneavoastri de programare, deoarece veyi continua si comunicafi cu serverul ‘ransmipindusi instruegiun’ SQL. Capitolul 1, ,Introducere in MySQL si SQL", a prezentat o introducere in stil ymanual* pentru numeroase dintre caracteristicile sistemului MySQL. Acest capitol se bazeaza pe aterialul respectiy pentru a intra in detali prvind numeroase domenii ale sistemului SQL. implementate de citre MySQL. Se discuti despre modul de referte la elementele bazelor de date, inclusiv regulile de dentmire si restricile care se aplicXprivind sensibilitatea la diferenya incre majuscule si minuscule, De asemtenes, sunt descrse multe dintre instruciunile SQL m importante, precum cele pentru crearea gi disrugerea bazclor de date tabelelor gia indewu- rilog instructiunile pentru regisirea datelorfolosind nisl si nstraciunile care furnizeazs informatii despre bazele de date si tabelele dumneavoastX. Expunerea scoate in evident tunel dintre extensille aduse de MySQL limbajului SQL standard. Ce exista si ce lipseste in MySQL? Instrucgiunile SQL din MySQL pot fi grupate in mai multe categorii largi, aga cum se poate vedea in figura 3.1. In acest capitol, vom discuta despre instructiunile din primele rezentate in aceasta figurd, Uncle dintre utilitarele MySQL furnizeaz’ cea ce este, in esents, o interfats de tip linie de comand’ cu anumite instructiuni SQL. De exemplu, nysaishow este interfari cu instrucyiunea SHOW COLLINS. Acolo unde cste posibil, aceste echivalenge sunt descrise si in capitolul de fafa, Dintre instructiunile care nu au fost prezentate aici, numeroase vor fi discutate in alte capitole, De exemplt, instrucyiunile GRANT si AEVOKE pentru configurarea privilegiilor de utilizator sunt prezentate in capitolul 11, .Administrarea generala a sistemului MySQL". Sintaxa de invocare a tuturor instructiunilor este prezentati in Anexa D, »Referinyd de sintaxd SQL, De asemenea, trebuie si consultayi manualul de refering ‘MySQL pentru informapii suplimentare, mai ales pentru modificdrile efectuate in versi unile mai recente ale limbajului MySQL. Capitolul 3 Sintaxa si utiizarea SQL in MySQL Secti care fi dar avin M tate referent cumva ci MySQL nu este un sistem final a capitolului descriecvea peese_ Acestea sunt funcyionalii [Grearea, ergere gi seletarea bazslor do date ‘CREATE DATABASE. DROP DATABASE USE (Grearea, moaicarea w qergere tbelelor la indexation ALTER TABLE ‘GREATE INDEX ‘CREATE TABLE DROP INDEX DROP TABLE (GBlnerea de normal dors baze de dal, fabele @ iterogan DESCRIBE EXPLAIN SHOW {Seeclarea Wforafior dn tabele SELECT Noaincare infomafior dn labels DELETE INSERT LOAD DATA . OPTIMIZE TABLE REPLACE UPDATE rstucfunt administrative FLusH GRANT LL . REVOKE liieiestuciu’ ~—CSCSCS~;«<; OREATE TABLE tabelul_neu SELECT 1; ERROR 1168 at Line 1: Incorrect coluan nawe (Broare 1166 la linia 1: Nume de coloand incorect '1') Pentru a remedia eroarea, furnizati un alias al coloanei, pentru a atribui coloanei ua ‘nume permis: mysql> OREATE TABLE tabelu2_nou SELECT 1 AS coloana_noa; Query 0K, 1 row affected (0.01 sec} © problema aseminitoare apare daci seleciafi coloane cu acelasi nume din tabele diferite. Si presupunem ci tabelele t1 si t2 au ambele o coloand ¢ si dumneavoastrd doriti si creagi un tabel din toate combinatile de rnduri din cele doui tabele. Putefi furniza aliasuri pentru a specifica nume unice de coloani in noul tabel: Capitolul 3 Sintaxa gi utlizaree SQL in MySQL 169 CREATE TALE 19 SELECT t1.c AS of, t2.c AS o2 FROM t1, t25 Crearea unui tabel prin selectarea unor date in acesta nu copiaza in mod automat nici un index din tabe ul original. Instructiunea DROP TABLE Stergerea unui tabel este cu mult mai simpli decit crearea sa, deoarece nu trebuie si specificagi nimic despre congimutal rabelulu; pur si simplu trebuie sk denumii tabelul: DROP TABLE nune_ taba MySQL extince instructiunea OROP TABLE fn citeva moduri utile. Mai tnt, puter sterge mai multe tabde specificandu-le pe toate in aceeasi instrucyiun: DROP TABLE ume tabel1, nume_tabel2, | Inal doilea rind, dact nu sunteti sigur cu privire la existenga saw nu a unui tabel, dar origi sil stergeti daca exiscd, puteyi adZuga a instrucyiune opgiunea IF EXISTS, Aceasta determin’ sistemul MySQL si nu faci reclamagii si si nu emitd crori dack tabelul sau tabelele specificate in instrucfiune nu exist: OROP TABLE IF EXISTS nune_tabed IF EXISTS este util in scripturi pe care le folosifi cu clientul nysai, deostece mysql, in fg incheie executia la producerea unei erori, iar incercarea de a elimina un tabel care nu existé constituie eroare, De exemplu, puteyi avea un script de configu- rare care creeari tabele pe care le folositi ca baz pentru prelucriri ulterioare in alte scripuuri In aceasté situate, dorit si vi asigurati ci scriprubde eonfigurare porneste »pe ‘curat*, Dacd folosiio instructiune 080 TABLE normali la inceputul seriptuli, acesta va ‘sua prima dati, deoarece tabelele nu au fost niciodati create. Crearea si stergerea indexurilor | Indexurile reprezinti metoda principalé de accelerare 2 accesului la conginutul tabelelor dumneavoastri, mai ales pentru interogiri care implick uniri ale mal multor tabele. Acesta este un subiect suficient de important pentru ca in capitolul', ,Optimizarea interogicilor*, sf se discute despre morivele uiliziei indexusilor, modul de fancsionare 1 acestura gi despre modalicatea de uriizare optima a indexurilor in vederea optimizarii interogisilor. In accasté sectiune, vom discuta despre caractersticile indexurilor $i despre sintaxa pe care o folosigi pentru crearea si stergerea lor, Caracteristicilz indexurilor MySQL asiguri o flexiblitate remarcabilé in ceea ce priveste modul de construire a indexurilor, Puteti indexa coloane individuale sau combina de coloane. De asemenea, pputetiavea mai multe indexuti intun tabel, dack dorii si puteyieluta sapid 0 valoare In diferite coloane ale tabelului. Dacd 0 coloand este de un tip sir diferit de ENUs sau SET, puteti opta pertru indexarea numa a primelor n caractere (numarate de la stinga la dreapta) din coloana. fn cazul in care coloana este predominant unic8 sub aspectul pri smelor n caractere, de regula nu vet sacrifica performanele, ba chiar le pute fmbunktiy: indexarea prefixului unei coloane, si nu a intregii coloane, poate reduce atét dimensiunea indexului, cit sitimpul de acces. \ 170 Parteal Utiizerea generalé a sistemului MySQL Exist gi unele restrict privind crearea unui index, desi acesea tind si se .dilueze smisuri ce sistemul MySQL continua si se dezvolte. Tabelul urmitor prezinti uncle die- zenge dintretabelele ISAM yi MyISAM din puner de vedere al posbilittilor de indexare: Caracteristica indexului Tabele ISAM ‘Tabele MyISAM Valori MULL Interzise Permise Coloane 8108 gi text Nu potfiindexate Por fi indexate Indexuri per tabel 16 32 Coloane per index 16 16 Dimensiune maxim a rindului index Din tabel se poate observa ci, in tabelele ISAM, 0 coloand indexati trebuie declarata Not NULL, iar coloanele aL08 si TEXT mu pot fi indexate. Tipul de tabel MyISAM eliming aceste restricti legate de crearea indexului i le atenueaza pe altele. O consecingS a acestor diferenye intre cele dou tipuri de tabele in ceea ce priveste earacteristicileindexulu este aceea cf, in funcyie de versiunea dumneavoastr’ de MySQL, s-ar putea si nu fiticapabil dea indexa anumite coloane. De exempla, putes folosi numai tabele ISAM daci versiu- nea dumneavoastri de MySQL este anterioarl versiunii 3.23, ceea ce inseamni ci nu uve indexa anumite coloane dacé dori ca acesteas8 poat contine valori NULL. Dacé dispuncti de versiunea MySQL 3.23 sau ulterioar§, puteyi avea tabele mai vechi, care au fost create de la bun inceput ca tabele ISAM. Le puteti converti cu uguringa in formatul de stocare MyISAM folosind instructiunea ALTER TABLE, care vi permite sd beneficiagi de unele dintre caracteristicile de indexare mai recemte: ALTER TABLE mume_tabol TYPE = MVISAH Crearea indexurilor Puteri erea indexuri pentra un tabel now atunci cind folosisi CREATE TABLE sau putefi adiuga indexuri la tabelele existente utilizind CREATE INDEX sau ALTER TABLE. Inseruc- tunes OREATE INDEX a fost introdusi in MySQL 3.22, dar pute folosi ALTER TABLE dack versiunea dumneavoastri de MySQL este anterioard versiunl respective. (In prezent, MySQL mapeszi intern instructiunea CREATE INDEX peste ALTER TABLE.) Puteti specifica dack indexul poate confine sau nu valori duplicate. Daci indexul au poate congine asemenea valori, atunci trebuie creat ea index de tip PRINARY KEY sau stave. Pentru un index unie pe o singur3 coloans, aceastl caracterizare asigur’ imposi- bilitatea existengei valorilor duplicate in coloana respeetivl. Pentru un index unic pe mai multe coloane, este astel garantati imposiblitatea duplicirii unei combinatii de valori Uniindex prruany Key este foarte aseminitor cu un index UNIQUE. De fapt, indexul Par- AURY KEY nu este altceva decat un index UNIQUE cu numele PRIMARY. Aceasta inseamn& cl un tabel poate conjine un singur index PATWARY KEY, deoarece mu putefi avea dvi indewuri cu acelagi nume. Putefi plasa mai multe indexuri uNTOUE fntr-un tabel, desi au se prea obignuieste, Pentru a adiuga un index la un tabel existent, puri folosi ALTER TABLE sau GREATE NOEX. Instrucfiuniea ALTER TABLE cea este mai versatill dinere cele dou’, deoarece © pute folosi pentru a erea un index obignuit, un index UNIQUE sau un index PRIUARY KEY: 256 octeyi 500 octegi aaa TT Capitolul 3 Sintaxa si utlizarea SOL In MySQL 474 |ALTER TABLE nune_tbl ADO INDEX nume_index (2ista_co2) ALTER TABLE nune_tbl ADD UNIQUE nume_index (Lista_co2) ALTER TABLE nume_tbt ADD PRIWARY KEY (Liste col) - 1ume_tbl este numele tabelului la care se va aduga indexul, iar 2iste_cot precizeaza Mfoaae ta toloanle care ebienlenae Dad iederal ne alu cl pon dock coloane, nurrele acestora vor fi separate prin virgula. Numele indexului nume_indox este ‘optional, dec‘ il puteyi omite, iar MySQL. va selecta un nume in functie de numele prim coloane indecate. Instruciunea ALTER TABLE vi permite si specificafi mai multe modi fictri ale tabslului ints-o singura instrucfiune, deci puteti crea mai multe indexuri in acelagi timp. Instructiunes CREATE INDEX poate aduga Tnte-un tabel un index obipmuit sau UNTOUE: CREATE UNTOVE INDEX nume_index ON nune_tb! (2ista_col) CREATE THDEX ume_index ON nume_thi (1ista_col) Opsiunile nune_tbi, rume_index si Lista_col au acceasi semnificagie ca in cazul instrucfiunii ALTER TABLE. Totusi, numele indexului mu este optional. Nu putefi ret un index PRIARY KEY cu instructiunea OREATE. INDEX. entru a cret un index inerun tabel nou atunci cind emiteti o instructiune CREATE Hale, ioad osatad sin nrrucpun ALTER ALE, dar spectca cauzcle de creare a indesului in acea parte a instructiunii unde declarayi coloanele tabelului: CREATE TABEL mume_tabet ‘ . INDEX nume_index (1ista_coloane) , UNIQUE nume_index (1ista_coloane) , PAIUARY KEY (Lista coloane), a . In ceed ce priveste ALTER TABLE, numele indexului este optional pentris INDEX si UNIQUE, iar MySQL va alge en mume, daci dumneavoastr8 mu o faces Ca un caz special, pute crea un index PRINARY KEY cu o singurf coloand prin adugarea opfiunii PRIMARY KEY la sfsitul declarapici coloanci: CREATE TABLE tabelud_neu ) Instrucyiunea de mai sus este echivalenti cu urmétoarea: CREATE TABLE tabelul_seu ( A INT NOT NULL, X PRIUARY KEY (3) 172 Parteal Utilzarea generalé a sistemului MySQL Fiecare din exemplele anterioare de creare a unui tabel au specificat NOT NULL pentru coloanele indexate, Dacd aveti tabele ISAM, aceasta este o ceringS obligstorie, deoarece ‘au puteti indexa coloane care pot confine valori NULL. Daci avesi tabele MyISAM, coloanele indexate pot contine si valoarea NULL, cu condifia ca indexul si nu fie de tip PRIUARY KEY. Dacd indexati un prefix al unci coloane sir (primele n caractere, dela stinga la dreapta, ale valorilor coloanci), sintaxa pentru denumirea coloanci intrun specifiestor Lista_coloane este nume_coloana(n), nu doar un simplu nune_coleana. De exemphi, prima din urmitoarele instrucuni crecazi un tabel cu dou coloane CHAR si un index care foloseste ambele coloane, Gea de-a doua instrucyiune este similary, dar indexeaz’ un prefix pentru fiecare coloani: CREATE TABLE tabolUlseu ‘ ume CHAR(30} , adresa CHAR(60), INDEX (nume,adresa) ) CREATE TABLE tabelul now q rune CHAR(30), adresa CHAR(6O), INDEX (nune(10) ,adresa(20)) ) Jn uncle circumstanfe, vi se poate prea necesara indexarea unui prefix de coloang. De ‘exempla, lungimea rindurilor index are o limiti superioari, deci putegi fi obligat si folosigi prefixe daci lungimea coloanelor indexate ar fi depisit limita respectiva, Prefixele sunt de asemenea necesare pentru coloanele 8.08 sau TexT din indexurile tabelelor MyISAM, Indexatea unui prefix de coloand impune modifickri pe care le pute efecwsa in coloani la o datf ulterioara; nu puteyi reduce lungimea coloanel pana la o dimensiune mai mica decit lungimea prefixului fir% a storgo indexul gi el re crea ulterior folosind un prefix Stergerea indexurilor Patefisterge indexur folosind oROP INDEX sau ALTER TABLE, Similar instructiunii CREATE INDEX, instructiunea DROP INDEX este manipulatd intern ca o instrucfiune ALTER TABLE si «fost introdust in MySQL versiunea 3.22, Sintaxa instructiunii de stergere a indexulei este urmitoarea DROP INDEX nune_index ON nume_tabel ALTER TABLE qune_tabel OROP INDEX num ALTER TABLE nume_tabe! OROP PRIMARY KEY Primele dovi instrucfiuni sunt echivalente. Cea de-a treia este folosité numai pentru stergerea unui index de tip PRIMARY KEY; in acest caz, nu este necesar nici un nuime de index Capitolul 3 Sintaxa si utiizarea SQLin MySQL 173. index, deoarece un tabel poate confine o singurl asemenea cheie. Daci nici un index nu «fost creat in mod explicit ea PRIMARY KEY, dar tabelul are dou sau mai multe indexuri de tip usz0Ue, MySQL il serge pe primul dintre acestea. Indexurile pot fi afectate dacd stergeti coloane dintr-un tabel. Dacé stergeti o coloan’ care face parte dintr-un index, coloana va fi eliminati si din index, Daci sunt gterse toate coloanele care alciruiese un index, atunci intregul index vafi ster. Instructiunea ALTER TABLE ALTER TABLE este o instructiune versatla in MySQL gi se poate folosi in multe scopuri. Deja am vizur citeva dintre posibiliitile sale (penteu cxearea gi stergerea indexurlo: pentru conversiatabelelor dintr-un format de stocare in alr). In aceastl secfiune, worn discuta despre alte cfveva yaptitudini* ale acestei instructiuni. Sintaa completi a instrucfiunii ALTER TABLE este descrisi in Anexa D. ALTER TABLE este utlf atunci cénd sesizayi cd structura unui tabel au mai reflect finali- tatea acestuia. Puteri folositabelul pentru a inregistrainformapi suplimentare, sau poate eX tabelul congineinformafii care au devenit supertlue, Poate ci dimensiunea coloanelor existente este prea mick sau poate ci le-afi declarat mai mari decit este necesar gi dori si le micgorati pentru a economist spagiu gi pentru a imbunitifi performanyele interogivilor. Sau poate cf pur si simplu afi tastatincorect numele tabelului atunci cand ‘mis instrucfiunea GREATE TABLE. Tati céteva exemple: ‘© Efectuagi un chestionar bazat pe Web si stocayi rezulatele fiecdrui chestionar comple- tac sub forma unei inregistriri int-un tabel. Apoi, decideti si modificayi chestionarul pentru a adiuge unele intrebiri suplimentare, Pentru a face loc noilor intrebiri, tre- buie si mai adiugagi coloane in tabel. Derulayiun proiece de cercetare, Repartizati numerc de caz inregistriilor de cercerare folosind o coloank AUTO_ancREVENT. Nu v-agi agteptat ca finanfarea proiectului si dureze suficient pentru a permite generarea a mai mul: de aproximativ 50000 de inre- sistriri, deci declaragi coloana de tip UNSIGNED SMALLINT, care poate confine maximum £65536 valori unice. Torusi,finangarea proiectului a fost reluati gi $e pare cf vefi mai putea genera inc 50000 de inregistrii. Trebuie ca tipul coloane! sé fie mai mare, pen- tru a permite insertia mai multor numere de case © Modificdrile dimensionale pot avea loc si in sens invers. Poate ed afi creat o coloand (Han (255), dar acum vi dati seama ci nici o valoare din acest tabel mu are o lungime mai ‘mare de 100 caractere. Puteti reduce dimensiunea coloanei pentru a economisi spatv. Sintaxa instructiunii ALTER TABLE se prezintd astfl: ALTER TABLE nume_tabel actiune, Fiecare parametru aotiune spevificd 0 modificare pe care dorti si o efectuaj in tabel. MySQL extince instrucriunea ALTER TABLE, permitindu-vi si specifcayi mai multe a uni, separate prin virguli. Acestlucru este util pentru reducerea volumului de text intro- dus de la tastansea, dar un motiv mai important al introduceril acestei extensi il consti- tue imposibilitatea de a transforma tabelele cu rinduri de lungime variabild fn tabele cu anduri de lungime fixd fri a fi obligat si transforma in acelasi timp toate coloanele VARCHAR in coloane CHAR, 174 Parteal__Utiizarea generalé a sistemului MySQL Exemplele urmitoare prezintS citeva dintre caracteristicile instrucyiunii ALTER TABLE: © Redenonirea unaltabel. © oper simp por simplu specificagi numele vechi i ALTER TABLE nume_tabel RENAME AS nune_nov_tabel Jn MySQL 3.23, care dispune de tabele temporare, redenumiea unui tabel temporar ‘cu un nume care deja exist in baza de date determina ascunderea tabelului original pe durata existentei tabelului temporar. Aceasti operatic este similar cu procedeul de ascundere a unui tabel prin erearea unui tabel temporar eu acelagi nume. -area tipului unei coloane. Pentru a modifica tipul unei coloane, putes folosi clauzele CRANGE sau MODIFY. S& presupunem ci in tabelul tabelut mou existi o coloani de tip SHALLINT UNSIGNED gi cK dorifi si o transformayi in WEDTUNINT Ussteneo. Pure face aceasta folosind oricare din urmatoarele dou’ comen: ALTER TABLE tabolUl eu HOOIFY + NEDIUMINT UNSIGNED ALTER TABLE tabelul_neu CHANGE i i WEDIUNINT UNSIGNED De ce numele coloanei este mengionat de dou ori in comanda care foloseste CHANGE? Deoarece CHANGE are posibilitatea (pe care HOOIFY nu o are), in afari de modificarea tipulai coloanei, de a redenumi coloana. Daci af fi veut si redenumisi coloana din 4 fn j simultan eu schimbarea tipului, ai fi procedat astfel: ALTER TABLE tabelul_ou CHANGE i j NEDIUMINT UNSIGNED Aspectal important este ci mai intdi denumiticoloana pe care dori s-0 modifica gi apoi specificayi 0 declarayie completi a coloanci, care include numele coloanei. Numele coloanei trebuie inclus in declaratie, chiar daca este acelagi ca vechiul nume. Un motiv important pentru modificareatipurilor de coloani consti in imbunitifirea ficiengei interogitilor pentru uniri care compari coloane din dou tabele. O com- parajie are loc mai rapid atunci eénd cofoanele comparate sunt de acclagi tip. Si pre- suptinem ef ralag o interogare 2 aceasta SELECT ... FROM t1, t2 SHERE t1.nune = t2.nume Dac tt .nume este CHAR(10) $i €2.nune este CHAR( 15), interogarea nu va rula Ia fel de "ppc in carl incre abel colon ar fox de pul N18), Pu i atribui celor fou coloane acelayi tip prin modificareatipului coloanei +1 .nuse, folosind oriare din urmitonrele dows comenzi " ° ALTER TABLE tt MODIFY mune CHAR(15) ALTER TABLE t1 CHANGE nune nue CHAR(15) Pentru versiuni de MySQL anterioare versiunii 3.23, este esental ca tipurile coloanclor dints-o unire si fie idensie, in eaz contrar indexurrile neputénd fi folosite pentru com- pparajie. Pentru versiunea 3.23 si versiunile ulterioare, indexurile se pot folosi pentru Tipuridiferite, dar interogarea va fi din now mai rapid dacdtipurile sunt identice. © Conversia unui tabel cu randuri de lungime variabilé in tabel cu rinduri de lungime fixd. Si presupunem cf aveti un tabel chart care contine coloane VARCHAR pe care dori sile convert in coloane CHAR, pentru a vedea care sunt imbunitifiile de performanys pe care le obtinesi. (In general, tabelele cu rinduri de lungime fixi pot fi prelucrate mai rapid decit tabelele cu randuri de lungime variabili.) Tabelul a fost creat atfe: CREATE TABLE chartbl (nune VARGHAR(40), adresa VARCHAR(G0)) Gapitolul 3 Sintaxa siutiizarea SQLin MySQL 178 fn acest can, problema ese ck rebuie of modifica simian toe, colanea aceas i fa putesi modifica fecare eoloand in parte, deoarece in acest insane ATER cece ack eoguenOSURIBE, Tare “FExcoper cl tpul coloanelor est in continuare defini ca VANCHAA! Mosival est sla SE Ges modifica o singurdcoloand Ja un moment dats MySQF- ek G bell oe ied colome ct lungime variabilé reconverteye colosna modificatsinapol anguan, pentru 2 economisi spit. Pentra rezolva problema, ‘modifica sinmultan toate coloanele VARCHAR ren TABLE chartbl HODIFY oune GHAR(40), HODEFY adress CHAR(EO) sanrnte moment, netrucunea OESCRIBE va demonstra ci tabelul confine coloane C1 Mee yp de operat reprezineé un tiv pentru care este important ca nsiruchnGt Aten TASLESE accepte mai multe acfiuni ia cadrul une gre instructive. reek o eapeank pe care cebuie sf o cunoastyi atuncl cind dori s& convert! Bai ere renga Ta abel acolonnel ou Text vail ore ieee oe aoe end un tae! la un format cu einduri de lungime fix. Prezenya He #8 ne a val ncn tbe determin exten tbe Cn Bar coarse vaiabily ar acesteipur de coloane (8.08 gi TEXT NT) mu ae thei un echivalent cu randuri de lungime fix. ; «e Conversa anui tabel cv rinduri de Tungime fixa in tabel cu randori de In con tsi, Bun, deci chartbl este mai rapid dact include numal randur cv. Tort dar ocep ma molt spatin dec este necesa deci decide 5 reconver ipo Pere cevoriginall, pentra a economisi spayiu, Conversia unui rabe! ie Siete vache ese ov mult nal simp. Trebuie s tansformag o singurd coboant SAT jicstan i MySQL va convert in mod automat clealeecoloane CHAA, Peni #0 vant tabelul chart, folosii oricare dintre urmétoarele instrucriuné "ALTER TABLE chartDl MODIFY nue. VARCHAR( 40) ‘ALTER TABLE chartbl MODIFY adresa VARCHAR (80) peer «e Conversia unui tip de tabel, Dack ay tecut de lao versiune MySQL anteritan’ Yo casey I aceasth versiune sau la una vlterioar, pute avea tabelegmal vec cat Tore on tabele ISAM Dack dori si le crea in format MyISAM, procedsti 8S [ALTER TASLE nume_tabel TYPE = MYISAM -_ . Dessay proceds afl? Un moti, 2f2 cum s-aritat in serfunen »Crenfes S80 aoe a re ctse acela ch formatul de stocare MyISAM dispune de uncle caraei! inet fnouistente in formaral ISAM, cum ar fi capactatea de a indore W217 No fi dpurlle ds coloane 8.08 gi TEXT. Un alt motiv este acs of tabelle MyISAM sunt fer dente de magn dei le pute deplasa sn alte cleulatoare pp eoPiey inde pnietlor bel, chiar dacdsistemele de calcul au athitecuu hardwive ist Despre acess aspecte vom discuta mai deaiatinseeiunen sRealizares copiilor de sigu- ranf a bazelor de date si copieres acestore® din capitolul 11 x 176 Parteal_Uilizerea general a sistemului MySQL Obtinerea informatiilor despre baze de date si tabele MySQL furnizeaz’ numeroase instructiuni pentru obfinerea de informagii privind bazele de date si tabelele pe care le congin acestea. Instructiunile respective sunt utile pentru urmitirea consinutului bazelor dumneavoastri de date gi pentru a vi reaming, structura tabelelor. De asemenea, le puteti folosi ca ajutor in utlizarea instructiunii ALTER TABLE} este mai usor a determina modul de specificare a unei modificiri into coloani atunci cind puteyiafla cum este defini coloana la un moment dat. Instructiunea SHOW poate fi folositi pentru a se obsine informayii privind numeroase aspecte ale bazelor de date si ale tabelelor dumneavoastré: SHOW DATABASES Afigeaza bazele de date din server SHOW TABLES ‘Afigeazé tabelele din baza de date curenti SHOW TABLES FROW nume_db ‘Afigeari tabelele din baza de date specifica ‘SHOW COLUMNS FROM nume_tabed Afiseaza informatie despre coloancle din tabelul specificat Afigeaza informatiile despre indexurile din tabelul specificat ‘Afigeazd informayii descriptive despre tabelele din baza de date prestabilité Afigeaza informatii deser din baza de date specificatt Instrucpiunile DescRiee mune_tabot si EXPLAIN nune_tabel sunt sinonime cu instrucgiu= nea SHOW COLUMNS FRON mune_tabel, Coinanda nysalshow furnizeazi o parte din informatie oferte de instrucfiumes SHOW, ceca ce vi permite si obyineti din interpretor informatile privind bazele de date si tabelele: © aysqishow Aigenza bazele de dave din server aysalshow nune_db Afigeazi tabelele din baza de date specificatl ‘% nysqlshow nume_db qune_tabe1 Afigenzi informapile despre coloanele din ta- belul specificat % mysqlshow --keys rume_cb nue tabed ASiseazd informatie despre indesurile din ta beta specificat Afigeari informatii descriptive despre tabelele in baza de date specifieat Utilitarul aysqiduep vi permite si vizualizayi structura tabelelor dumneavoastri in forma unei instructiuni CREATE TABLE, (Spre deosebire de instructiunea SHOW COLUUNS, cu sunt de piere cf rezultatele coment nysqléunp sunt mai ugor de citi gi afigeazl sh indexurile in tabel.) Dar, daci folosii aysaldunp, nu uitai si invocagi aceastd comand cu opfiunea --no-data, ca si nu vi impotmoligi in datele tabelului dumneavoasteal nysatdump --no-data nune_cb nune_tabet ‘Att pentru mysqishow eat gi pentra mysql dum, putes specifica opgiunile uzuale, cum ar fi --nost, pentru a va conecta la un server instalat pe o alti gazdi. ‘SHOW INDEX FROW mune_tabel ‘SHOW TABLE. STATUS ‘SHOW TABLE STATUS FAOW nune_cb despre tabelele % mysqishow --status nume_db Capitolul 3 Sintaxa gi utiizarea SOL in MySQL 177 Regasirea inregistrarilor Nu are nici un sens si plasagi inregistriti intr-o baz de date daci nu le regisifi la un ‘moment ulterior si nu le utilizayi inte-un fel sau altul. Acesta este gi rostul instrucyivnii SELECT: si va ajute si ajungesi la datele dumneavoastr’. SELECT este probabil instructiu- ‘nea cea mai fclosita a limbajului SQL, dar poate fi gi cea mai dificilt; restrictiile pe care Ie folositi pentru a alege rindurile pot fi arbitrar de complexe 5i pot necesita, in multe tabele, comparatii intre coloane. Sintaxa de baz’ a instructiunii SELECT se prezintk astfel: selectie __Coloancle care trebuie selectate Tabelele din care sunt selectate rindurile primara Condigiile pe care trebuie si le satisfacd randurile GROUP BY gruvare_coloane — Modul de grupare a rezultatelor ORDER BY sortere coloane Modul de sortare a rezuluatelor HAVING restrictie_secundara Conditii secundare pe care trebuie si le satisfacd rin- duri Limitare aplicati rezultatelor LIMIT usar Toate elementele din aceasti sintaxi sunt optionale, cu exceptia cuvinrului SELECT ji a parametrului ista_selectie, care specfick datele pe care dorii si le regisiti. Uncle sis- teme de baze de date impun si tilizarea clauzei FROU. MySQL nu impune aceasta clauza, ceea ce vi permite si evaluati expresti firi a face referire lvreun tabel: SELECT SaaT (POW(3,2)+POM(4,2)) fn capitolul 1 am acordat 0 atentie deosebiti instrucfiunii SELECT, concenirindu-ne cu precidere asuzra liste cu selecyiacoloanelor gi asupra clauzelor HERE, GROUP BY, ORDER BY, RAVING gi Ltutt. In acest eapitol, ne vom concentra asupra aspectul instrucyiunii SELECT care este, poate cel mai derutant: unirea. Vom discuta despre tipurile de uniri pe care le accept MySQL, despre sensul si modul de specificare a acestora, Astfl vepi putea intre- buinta limbajel MySQL int-un mod mai eficient, deoarece, in multe situati, adevarata problemi a de:erminirii modului de a serie o interogare il constitue sesizarea modalititi adecvate de unire a tabelelor. De asemenea, poate dori si examinafi sectiunea .Breviar de solu, care apace mai tirziu in acest capitol. Acolo vei gsi solufi la numeroase proble- me SQL, din care marea majoritate impli, int-un fel sau altul,instructiunea SELECT. © problemi a instrucgiunii SELECT este accea cf, atunci cind vi intilnii prima daté cu tun nou tip de problema, nu este intotdeauna usor si determinayi modul de a scrie 0 instrucgiune SELECT pentru ao rezolva, Torusi, dup ce v-afi dat seama cum trebuie scrisi interogzrea, puteyi folosi experienta acumulati atunci cand vei inti probleme similare fa vitor. SELECT este, probabil, instrucyiunea in cazul cArcia experienta acumu~ laud este cea mai important& pentru capacitatea dumneavoastri de a o folosi ficient, pur si simplu datoritSimensei varietii de moduri im care putep uriliza instrucyiunea, Pe misuri ce dobindisi experienfi, 0 veyi putea aplica mai ugor la noile probleme gi vi veti trezi gindindu- ‘A, da, asta-iuna din chestilealea cu LEFT JOIN", respec~ tiv ,Aha, pi asta este 0 unire pe tre cli limitati de perechile comune de coloane cheie™. 178 Parteal_Utilzarea generalé a sistemului MySQL (De fapt, mi-e cam jend s¥ spun asta, Vi se poate pirea incurajator si aflagi cl experienja vi poate fi de folos. Pe de ali parte, ¢ putin cam fnspSimincitor sf sjungeti 5X gindii folosind unastfel de vocabular) * nese Bee In urmitoarele citeva secriuni, care demonstreazi modul de utilizare a formelor de operatori de unire acceptati de MySQL, majoritatea exemplelor folosese urmitoarele dovi tabele. Tabelele sunt mici, ceea ce le face suficient de simple pentru a permice sesizarea imediata a efectului fiecirui tip de wnire: tabelul t1: tabelul t2: Unirea normali ‘Cea mai simpli unire este unirea normal, in care este denumit un singur tabel. fn acest a2, rindurile sunt selectate din tabelul specific SELECT * FROM tt Unii autori mu consideri aceasti form a instructiunii SELECT ca fi acest termen numai pentru instructiunile SELECT care regisesc inc ‘mai multe tabele. Eu cred ci este 0 problema de perspectiva. o une si folosese triri din doua sau Unirea complet Daci sunt specificate mai multe tabele, cu numele separate prin virgult, se executl 0 unire complets. De exemplu, dact uniti doud tabele,fiecare rind din primul tabel este combinat cu ficeare rind din al doilca tabel: SELECT tt.*,t2.* FROM ti, t2 (arate e Capitolul 3 Sintaxa si utlizarea SQL in MySQL 479) © unire completé se mai numeste si unire incrucigatd, deoarece fiecare rnd al fiecarui tabel este incrucigatcu fiecare rind dia toate celelaltetabele pentru a produce toate com ~ binaile posbile. Aceast& operagie mai este eunoscuti si sub numele de produs cartezian Unirea in acest mod a tabelelor are potentialul de a genera un numi foarte mare de rin- duti, deoarece numarul de rinduri posibil este produsul numerelor de rnduti din fiecare tabel. O unire complet inte tei tabele eae congin 100, 200 i 300 de randuri poate returna 100 x 200 x 330 = 6 milioane de randuri, ceea ce inseamna un numie foarte mare, chiar daci tabelele fa sine sunt mic. fn situagii precum aceasta, in mod normal se va folosi o clauza mene pentru a educe setul de rezultate lao dimensiunne mai rezonabila! ack adiugas! in clauza WHERE o conditie care sk determine coroborarea tabelelor in fanctie de vaborile anumitor coloane, unirea devine ceea ce se numeste 0 echi-unire, deoarece selecayi numai rindurile cu valori egale din coloanele specifica: SELECT t1.*, 12.* FRO 1, #2 NHERE tH.i1 = 12.32 Tipurile de unire JOIN, CROSS JOIN gi INNER JOIN sunt echivalente cu operatorul de unire ,. unire STRAIGHT _JOIN este similari unci uniri complete, dar tabelele sunt wnite in oF- dinea precizati in clauza FA0u. In mod normal, utlitarul de optimizare din MySQL isi ia libertatea de a rearanja ordinea tabelelor dintr-o unire completk pentru o regisire mai rapidi a rindurilor. Ocezional, utlitarul de optimizare ny va efectua o alegere optim’, alegere pe care o puteyi impune folosind cuvantul cheie STRAIGHT _JOIN. STRATGHT._JOTV poate fi specifica in dova puncte ale instructiunii SELECT. Ilputeiinsera inte cuvannulcheie SELECT gi lista deselect, pentru a avea un efect global asupra tuturor unirilor complete din instrucyiune, respectiv il puteyi specifies in clauza FROv. Urmi- toarele doul instrucyiuni sunt echivalente: SELECT STIAIGHT_JOIN ... FROM tabel1, tabel2, tabeld ... SELECT ... FROM tabel1 STRAIGHT JOIN tabe12 STRAIGHT JOIN, tabel3 ... Explictarea referinelor la coloane Refers a coloanele taboo din strule SELECT ebuie & inf ecivoc la un sigur {abel dena n Gauze FROM, Dacd eta epetica un shgu iol, nu ox nicl un echvo,decerece taal cooanl rebul apa abl respec Dac sunt denumite mal mut abel, tat nunele {ie coand cre apart singr abel sunt Se asemenea, ir ehvee.Tolui,dacé ele colonel pare In rai mute tbl, eee la colon Yebuie 8 cond inurl tabel, flsnd sara ttune_tabel rune coloane, penta predea label Ta care v8 eel. Dacé un label denumt abelul ov confine cea a 3b, un ibe denurit eabezu2_mou? canine clcanele bs {fete colonel asc sunt fr echo, dar eterna coloana bree completa sub una Gn torneo tabelut-seut beau tabelul_nouz SELECT a, tabelUl_neut.b, tabelul_sev2.0, © i" FHOW tabelul_neut, .colt Utlizares generalé a sistemului MySQL Unirea la stinga O echi-unire afigeaz numai rindurile unde in ambele tbele existk 0 corespondenti cu anumite criteri de ekutare. O unire la stinga afigeaz’ de asemenea corespondengele, dar prezineS si rindurile din tabelal din stanga care me au o corespondengi in tabelul dia dreapta. Toate coloanele selectate din tabelul din dreapta pentru aceste rnduri sunt afigate ca NULL. Mecanismml de Funcrionare este acela ck sunt selectate toate randurile din tabelul din stings. Daci exist un rind echivalent fa tabelul din dreapta, randul respec- tiv este selectat, Daci nu exist nici o echivalengi, se sclecteaza totusi un rand, dar acesta este un rind ,fals", in care toate coloanele au primit valoarea NULL. Cu alte cuvinte, 0 une la stinga forgeazK seul de rezultate si contind un rind pentru ficeare rind al tabelu- Jui din stinga, indiferent daci pentru rindul respectiv exist sau ma un echivalent in tabelul din dreapta. Stabilirea corespondentei se efectueazi conform coloanelor denumite {ner-o clauzi ON sau USING(). Puteg folosi opriunea OW indiferent daci numele coloanelor pe care le uni sunt identice: SELECT t1.*, 22.* FROM tt LEFT JOIN t2 OM t1.i1 = t2.42 faPat eR? ey Ya UU MULL, 2 vizio aiolsins Clauza ustne() este similari clauzei of, dar numele coloanei sau ale coloanelor unite trebuie si fie aceleasi in fiecare tabel. Interogarea urmitoare uneste coloana ‘tabelul_meut.b cu coloana tabelu_neu2.b: SELECT tabelul_neut.*, tabelulneu2.* FROM tabelul_nevt LEFT JOIN tabelul_nev2 USING (5) LEFT. JOIN este utilé mai ales atunci cind doriti si gisipi numai acele randuri ale tabelu- Jui din stnga care nu apar fn tabelul din dreapta, Pentru aceasta, adiugayiclauza MERE care caut rndurile tabelului din dreapta ce au valor! NULL: SELECT t1.*, £2. FROM t1 LEFT JOIN t2 ON t1.it = t2.42 WHERE 2.42 78 NULL aie a MULL NULL, Capitolul 3 Sintaxa gi utitzarea SOL in MySQL 181 {In mod normal, nu veti selecta coloanele cu valoarea NULL, deoarece nu prezinté interes. ‘Ceea ce vi intereseazd sunt coloanele firi echivalent ale tabelului din stanga: SELECT t1.* FROW t1 LEFT JOIN €2 ON 1.41 = 2.42 WHERE *2.12 18 NULL Un aspect de care trebuie si vi ferip in ceca ce priveste LEFT JOIN este acela cf, in cazul fn care coloanele pe care realizayi unirea sunt declarate ca fiind xoT MULL, rezultatul poate contine randusi nedorite LEFT JOIN are céteva sinonime gi variante. LEFT OUTER JOIN este sinonim cu LEFT JOIN, De asemenea, exist 0 notarie ODBC pentra LEFT JOIN care este acceptati de citre MySQL (exptesia oj are sensul de smire exterioard ~ outer join): {0} mume_tabol LEFT OUTER JOIN nume_tabe1 ON expr_unire } NATURAL LEFT UOIWeste similar cu LEFT JOTHS exécutdo unire la stinga stabilind corespon- denge pentru toate coloanele cu acelasi nume ae tabelelor din stinga, respectiv din dreapra. Unele sisteme de baze de date au o instructiune RIGHT JOrW echivalenté; MySQL nu dis- pune inca de sceasti instrucfiune. Scrierea comentariilor MySQL vi permite si intercalati comentarit in Puteti scrie comentari in dou moduri, Orice text delimitat de un caracter # la stinga si sfirsitullinici a dreapta este considerat comentariu. Sunt permise gi comentarilefolosite in C. Cu alte cuvinte, orice text inclus inte simbolurile de iaceput, respect sfagit/* si */ este considerat comentariu, Comentarile in C se pot extinde pe mai multe lini ¥ acesta este un conentariu pe o singura Linie : /* si acesta este un conentariu pe o singura Linte */ + /* acesta, totusi, este un conentariu pe mai multe Links ” fncepand de la MySQL versiunea 3.23, puteti ,ascunde" cuvintele cheie specifice lim- bajului MySQL in comentarii de tip C, precedind comentariul prin caracterele J+ in loc de s+. MySQL examineazi acest tip special de comentariu si foloseste cuvintele cheie, dar alte servere de baze de date le vor ignora, deoarece fac parte din comentariu Acest lucra vi ajutd le specfice sistermului MySQL atunci cand sunt executate in MySQL, dar care por fi folosite si de citre alte servere de baz2 de date fart modificir. Urmitoarele dovd instrucyiuni sunt echivalenta, pentru servere de baze de date altele decit MySQL, dar MySQL va efectua o operatic, INSET DELAYED pentru a doua instructiune: 182 Parteal_Utlizerea generalé a sistemului MySQL INSERT INTO absente (elev_sd, data) VALUES(19,"1999-09-28") INSERT /*1 DELAYED */ INTO absonte (elev_id,data) VALUES(19,"1999-09-28") Incepind de la versiunea MySQL 3.233, in afari de stilurile de comentiriu descrise anterior, putes initia un comentariu cu doua liniuye si un spatiu (~~); orice text plasat intre aceste liniuge gi sfarsitul line este tratat ca un comentariu, Alte sisteme de baze de date folosesc cele dou’ liniuye pentru a incepe un comentariu; MySQL permite acest lueru, dar impune utilizarea spatiului pentru eliminarea oricitei confuzi Instructiuni cu expresii precum 8- -7 ar putea fi interpretate ca incluzénd un com. tariu, Este puyin probabil si scrietio expresie precum 5- - 7, deci aceasta este o eur {ek uelk. Tora au este det o curio, deci probsbil est ines folosi une dnte celelaee stluri de comentarii, folosind liniugele duble numai in programe pe care le por. taj dinate ssteme de bare dedate. aa : Breviar de solutii Aceasti seefiune seaman oarccum cu un ,corn al abundenfei“ indict modul de scriere a interogitilor pentru rezolvarea diferitelor categorii de probleme, In majortatea cazu- silos, acestea sunt solupii la probleme care mi-au parvenit din lista de corespondenti. (Muljumiri persoanelor din list care au contribuit cu multe din aceste rispunsuri) Rescrierea subselectiilor sub forma de uniri Incepind cu versiunea 3.24, MySQL va dispune de subseleti. Lipsa acesei caracteris- tici este una dintre cele mai crticate omisiuni din MySQL, dar un lucru de care mulji par si nu-pi dea seama este acela ci interogirile scrise folosind subselecii pot fi frecvent reformulate folosind uniri. De fap, chiar gi cind MySQL va fi dotat ou subseleci, este chiar indicat si examinati imerogirile pe care sunteti Snclinat si le scriei folosindu-le; deseori este mai eficient si folosigio unire in locul subselectie. Rescrierea subselectiilor care selecteaz& valori corespunzitoare unui criteriu de efutare Tati un exemplu de interogare care consine o subselecte; interogarea selecteaz’ punc- tsjele din ste puncte obrinute is cone vere (adica ignoré ‘punctjele obfinute la SELECT * FROM puncte WHERE evensment_is IN (SELECT eventment_id FHOW ovenisont WHERE tip = ‘T") -Acceapiinterogare se poate scrie fri o subselectie, prin conversia ci SELECT puncte.* FROM puncte, eveninent WHERE puncte. eveninent_td = oveniment.eveninent_id AND eveninent.tip = Exemplul urmitor selecteazi punctajele abginute de elev de sex feminin: SELECT * FROM puncte WHERE elov.id IN (SELECT elev_{4 FROM elev WHERE sex = “F*) 1-0 simpli unire: Capitolul 3 Sintaxa gi utlizarea SQL In MySQL 183 Aceastl intercgare se poate converti intr-o unire dup cum se va vedea mai jos: SELECT puncte.* FROM puncte, elev WERE puncte.elev_4d = elev.elov_id AND elev.sex = "F* Se observi existenga unui model, Interogirile cv subselectie respecti urmétoarea form: SELECT * *ROW tabelt NMERE coloanat IW (SELECT coloana? FROW tabe12a HERE colcanazb = , _Asemenea interogiri pot fi convertiteinte-o unire folosind aceasté forma: SELECT tavel?.* FROM tabel1, tabel2 WHERE tabelt.coloanat = tabe12.coloanaza AND tadel2.coloana2d = valéare Rescrierea subselectiilor care selecteazi valori care nu corespund ‘unui criteriu de ciutare (O ale categore comund de interogiricu subselectie cauti valorle dintr-un tabel care mu se regisescin alt tabel. Aga cum am vizut mai sus, tipul de problema ,valori care au exis poate fi slutionat ca ajutorul unel instruct LEFT JOIN Tat o interogate cu subseectie fare testeazi absenta valorlor dinte-un tabel (i giseste pe elevit cu prezengi 100%): SELECT * FROM elev WERE eley_id NOT IN (SELECT elov_sd FROM abeente) _Aceastdintercgare se poate rescriefolosind o instructiune LEFT JIN dup cum urmesza: SELECT elev.* FROU elev LEFT JOIN absente ON WHERE absente.elev id 18 NULL {n eermeni geserali, forma intcrogiri cu subselecte este urmitoateat SELECT * FROM tebel? WHERE coloana’ NOT EXISTS (SELECT coloane2 FROM tabel2) © interogare cu aceasti forma se poate rescrie atfel SELECT tabelt.+ . WHERE capol1 LEFT JOIN tabel2 . ON tabel!.coloanat = tabel2.coloana2 WERE cabel2.coloana? 1S NULL Se presupune ci declarafia coloanci tabel2.coloane? confine atributul NOT NULL. jaloat jley_id = apsente.olev_id Depistarea valorilor inexistente intr-un tabel Deja am vizut in secfiunea ,Regisirea inregistririlor” c&, atunci cind dorit si gusi care sunt valorle dinte-un tabel inexistente fntr-un alt tabel, folosii o instrucyfune LEFT JOIN pentru cele dou tabele gi clutapi rindurile in care este sclectati valoarea NULL din al doilea tabel. Atunci a fost prezentatio situa simpli, care folosea urmétoarele dou’ tabele: 184 Parteal Utlizaree generald a sistemuiui MySQL Capitolul 3 Sintaxe siutitzerea SQL in MySOL = 185, Tastrucyunes LEFT Jorn pentru glsrestueuror valorilo din coloana t1.41 are ou se | Actm, tot ct avem de ficu este si speifcim coloanele pe care dorim sf le vedem ca afld tn coloana t2.42 are forma urmitoare: date de igre g. am termina. Iti interogarea finalt: SELEOT t1.* FROM t1 LEFT JOIN £2 OM £1.41 = 12.42 SELECT WHERE t2.32 TS NULL elev.nune, e2ev.elev_id, Ws evenirent.data, evenisent.oveninent_1d, eventsent.tip pitch) now fe L elev, evenizent ‘Acum, si ne géndim la o versiune mai dificili a intebieii ,Care sunt valorile care | LEFT LOIN puncte ON eas Cee ai lipsese?". In proiecrul de evident a rezultatelor scolare, mengionat pentru prima datiin | AND eveniaant oventnent.id = puncte, eveninent if capitolul 1, avem un tabel e1ev care congine clevii, un tabel eveniment care prezinti | WHERE evenimentele de tip examinare care s-au produs, respectiv un tabel puncte care enumerg | puncte.punete 1S MULL punetajele obginute de fiecare elev la fiecare eveniment de tip examinare. Totusi,dacdun | ORDER BY elev a fost bolnav la data sustineri unui chestionar sau a unui test, tabelul puncte nu va | elev ¢lev.ig, oveniment ,eveninent_éc conse nic un pune al elewuli penta even rentul respectiv, deci este necesari relua- | La rularea interogitii se produc urmftoarele rezultate: rea chestionarului sau a testului. Cum putem gisi aceste fnregistrti lips, pentra a ne See : a putea asigura ci clevii respectivi sustin repetarea examinarii? i Hl elev_id | See Problema consti in determinareaelevilor care nu au nici un puactajla o examinare, pen | Megan 2 to00. 1 8 tru fiecare examinare in parte. Cu alte cuvinte, dorim si aflim care sunt combinayile | 4 | 4999-09-23 s fe clev-eveniment care nu se regisescintabelul puncte. Accasti formulare de tp ,care sunt 13 | 4999-09-05 1 c valorile inexistente este 0 sugestie a faptului ck se doreste o instructiune LEFT vOIk, | 13 s990-10-.01 8 ¢ Unirea mu va fila fel de simpli ca fn exemplul anterior, totugi, deoarece nu clutim numai | Ne ccataete 5 5 valori inexistente intr-o singuri coleand, ci o combinate intre dou coloane. i egory = «23—«1988-10-01 6 sit ‘Combinayile pe care le cfutim sunt toate combinaile elev-eveniment, care se produc 2a | 1990-09-23 Be din nerucisareatabelului elev cu tabelul aveniment: : anton 27 | 1999-08-16 4 © i cartor zr tese-o8-23 |B FROM elev, eveninent l Gabriele 29 1999-09-18 4 c ‘Apoi, [ui rezultatul univ respective gi executim o instrucsiune LEFT JOIN cu tabelul | Grace 80. | 1980-08-28 5 c: puncte pentru a gisi perechile cfutate: F FROM elev, eveniment IE LEFT JOIN puncte ON elev.elev_td = puncte. F ‘AND eveninent.ovoniszent_te Refineti cd clauza ON permite unirea rindurilor din tabelul puncte in conformitate ca valorile echivalente din diferte tabele. Aceasta este chefa pentru rezolvarea probleme, Instructiunea LEFT JOIN forfeazi gonerarea unui rind pentru fiecare rand obginut din unirea incrucigati a tabelelor elev si eveninont, chiar daci nu existi nici o inregistrare corespunzitoare in tabelul puncte. Randurile din seeul de rezuleate pentrit aceste inre- gistrari lipsé din tabelul puncte pot fi identificate prin faprul cX toate coloanele din tabelul puncte vor avea valoarea NULL, Putem selecta aceste inregistriri in clauza WHERE. Se poate utiliza orice coloani din tabelul puncte, dar, deoarece cdutim punctajele lips probabil ci din punct de vedere conceptual este cel mai lar dacitestim coloana puncte WHERE puncte.puncte 1S NULL Putem pune rezultatele fn ordine folosind o clauz3 oROER BY. Cele mai logice dou aran- jamente sunt in functie de elev side eveniment. fl voi alege pe primul: ORDER BY elevelov.d, eveninent..eveninent_id ‘Aici este un element subtil. Datele de iesie afigeaza identificatorit de elev gi de even ment. Colon elev_id apare att in tabelul elev, cit siin tabelul puncte, deci la inceput sar putea si credeyi ed lista de selectie putea consine fie @lev.elev_sd, fie | punete.elev_id. Nu este adevirat, deoarece fundamental capacitigit de a gisi inregis- tririle care neintereseazi este acela ck toate cimpurile din tabelul puncte sunt retumate cca find NULL. Prin selectarea coloanei puncte.elev_sd s-ar fi obginut ca date de iesire ‘numai o coloand de valori NULL. Un rayionament similar se aplicé si in cazul coloanel eveninent._i4, care apare atit in tabelul eveninent, cit gi in tabelul puncte. Efectuarea unei operafii UNTON Dack dorigi ereagi un set de rezuhate prin sclectarea inregisteirilor din mai multe bale care ay acess structur, put face acest fuera in unele sisteme de baze de date Tago de nro! TON. MySQL ns dpe deo asemense i ocoli acest neajuns SSS {olosind o anami instrucfiune (ee pusin pint la MySQL versiunea 3.24), dar put tn Ge re Eae sant at dou poise 186 Partea | Usiizarea general a sistemului MySQL ‘© Efectuapi mai multe interogisi SELECT, céte una pentru fiecare tabel. Accastd soluyie este posibili daci au vi intereseaza ordinea rindurilor pe care le selectai © Selectagi rindurile din fiecare tabel intr-un tabel temporar de stocare. Apoi selectati conginutul acelui tabel. Acest lucra vi permite si sortayi rindurile ga cum dori. In MySQL 3.23 si versiunile ulterioare, putetirezolva cu uguringl aceasti problemi per- migiad serverului si creeze automat tabelul de stocare. De asemenea, putefiatribui acestuitabel un earacter temporar,astel ict si fe gters automat la terminarea s dumneavoastri de lucru cu serverul, {In programa urmitor, vom sterge tabelul in mod explicit, pentru a permite serveru- lui si elibereze resursele asociate acestuia. Aceasta este 0 idee buna daci sesiunea client vacontinua si efectueze gi alte interogiri, De asemenea, vom folosi un tabel HEAP (sto- cat in memorie) pentru a obsine performanfe sporite. CREATE TEMPORARY TABLE tbI_stoc TYPE-HEAP ... FROM tabel? WHERE... INSERT INTO tB1_stoc SELECT ... FROM taDel2 WHERE . INSERT INTO tbI_stoc SELECT ... FROM tabel? WNERE . SELECT * FHOM tO1_stoc ORDER BY... DROP TABLE tb1_stoc Pentru versiunile de MySQL anterioare versiunii 3.23, deca este similar, cu excepfia faptului ef trebuie si declaragi in mod explicit coloanele din tabelul tb1_stoc, iar instrucfiunes OROP TABLE de la sférpit este obligatorie, pentru a impiedica existenta tabclului dupa sfarsitul perioadei de viagh a sesiunii client: CREATE TABLE tb1_stoc (coloanat ..., coloana 2 ... SELECT ... FROM Zabel? WHERE INSERT INTO tb1_stoc SELECT INSERT INTO tb1_stoo SELEOT ... FROU tabel? WHERE. INSERT INTO tbl_stoc SELECT ... FROM tabel? WERE |. SELECT * FROW tb1_stoc ORDER BY ... DROP TABLE tbt_stoc FROM tabel! WHERE... Adiugarea unei coloane cu numere dintr-o secventi Daci folosisi instrucfiunea ALTER TABLE pentru a adiuga o coloani AUTO_INOREWENT, coloana este completats automat cu numere dintr-o. secveni, Urmatorul set de instrueyiuni dintr-o sesiune mysq2 prezints principiul de fancyionare al acestei operat prin crearea unui tabel, inserpia unor date in tabel si apoi adaugarea unei coloane ‘AUTO_INCRENENT: mysql> CREATE TABLE t(o CHAR(10)); fnysql> INSERT INTO t VALUES("2"),("B"), ("0"); fnysql> SELECT * FROM t; Capitolul 3 Sintaxa giutlizarea SQLin MySQL 187. ysql> ALTER TABLE t ADD 4 INT AUTO_INGREMENT NOT MULL PRIMARY KEY rnysql> SELECT * FROM ty at bie Secvenfierea’ sau resecventierea unei coloane existente i seoveni ia daci a fost secvenfiatt act avefi o coloand numeric3, o putef seevengia (sav reseevensia d i cretion dar af pers tanduri ji dori sf renumerotagivaloile pentru ca acentes si fie contigui) astfe: ALTER TABLE € MODIFY 4 INT NULL UPDATE t ST 4 = NULL ALTER TABLE t MODIFY 4 INT UNSIGNED AUTO_INGREVENT NOT HULL PAIUARY KEW Dar 6 modalitete mai simpli de a efeceua aceasti operatic este de a sterge pur si simplu jloana gi de a9 aduga din now, sub forma unel coloane AUTO_INCRENENT. Instructiunea futen TABLE perm uni, deci toate aceste operafii se pot ALTER TABLE permite specificarea mai multor acyiuni, deci pera 5 Pe executa inte-o singuri instructiune: ALTER TABLE RO 4, ‘ADD INT UNSIGNED AUTO_INCREMENT NOT NULL RRIWARY KEY Sortarea intr-o ordine neobignuité Si presupunem ci aveti tn tabel care confine personalul unei instituyiisportive, cum ar fio chips de ftbal: dort si soraidatele de iesire dupa fanctia membrilor personae I, anal foie acestea si spark fat-o anit ordins, cum ar fi uemtoares: antrenor antrenor securd, portar, fundasi mijlocasi, atacani2. Definigi coloana,cu tipul ENUM si ‘mentionaficlementele enumeririi in ordinea in care dorigi si le vedeyi, Rezultatele ope- ratilor de sortare din coloana respectiva vor ap&rea in ordinea pe eare’o specificayi Configurarea unui tabel contor * din capi de generare aunei {a secyiunea yLucral cu seevenje" din capitolol 2, am prezentat modul de g scovengefolos ad funejia LAST-INSERT_10(ex9r). Exempll de acolo istra modo de ‘configurare a unui contor folosind un abel cu un singur rind. Exemplul este foarte bun pentru un singur contor, dar, ack aveti nevoie de mai multe contoare, metoda respec- Grd duce la o multiplicare inucil’ a tabelelor. Sé presupunem cf aveyi un sit Web gi dorgi Thai wanfojara on sevente de mamere fk io oie ve sven oon pn, So adc rato nen lento pete ae 1 km recurs fa ,adapearea® traduceri folosind posturile dintr-o echips de forbal european, posturi eee i ara roma dex in coral uni echipe de ohana folie de fowl ei siglo “NE 188 Partoal Uiizarea generalé a sistomului MySQL inserati in mai multe pagini contoare de genul saceasti pagini a fost deschisi de ang ori*, Probabil ci nu dori si configurayi un tabel contor separat pentru fiecare pagink care are un contor. (© modalitate de a evita crearea de tabele contor multiple este de a erea un singur tabel cu dou coloane. O coloand contine o valoare contor; cealalti congine numele contoru- lui, Putem folosi in continuare functia LAST_INSEAT_10(), dar vom determina randul ruia i se aplicd aceasti funeyie folosind numele contoruli. Tabelul se prezint astel CREATE TABLE contor ‘ ‘numar INT UNSTONED, ‘ume VARCKAR(255) NOT WILL PRIMARY KEY ) ‘Numele este un gir, astfel inet putem apela un contor fn orice mod dorim, motiv pen- tru care il vom transforma in coloand PATUARY KEY pentru a preveni duplicarea numelos, Acest lueru presupune cit aplicatile care folosesc tabelul convin asupra numclor pe care le vor folosi. Pentru contoarele noastre din paginile Web, putem asigura unicitatea ‘numelor contoarelor prin simpla utilizare ea nume de contor al unei pagini « numelui cil de acces la pagina respectivi din cadrul arborelui documentului. De exemplu, con- figurarea unui contor nou pentru pagina de bazi a sitului se realizeaz® astfel: INSERT INTO contor (nume) VALUES(*éndex. heal") Aceastii instructiune initializeazi contorul denumit "index.htal* cu valoarea zero. Pentru a genera urmitoarea valoare din secventi,incrementagi contorul in rindul adec- vat al abelului, dup care regisitil folosind functia LAST_INSERT_10(): UPDATE contor SET nurar = LAST_INSERT_1O(nusar+1) WERE une = ‘index.neml* SELECT LAST_INSERT_10(} (© metod alternativd ar ff incrementarea contorutui fii a folosifuneyia LAST_INSERT_r0(), astie: UPDATE contor SET nunar = nunar+t YHERE nuse = *index.ntal* SELECT numar FROM contor WHEKE mune = “angex.nteL” ‘Totuyi, metoda mu funcioneazi corect daci un alt client incrementeaz’ contorul dupa ce ‘mite instrucjiunea UPDATE gi inainte de a emiteinstructiuniea SELECT. Pure rezolva aceasti problemi delimitind cele dou’ instrucsiuni cu instructiunile LOCK TABLES si UNLOCK TABLES, pentru bloca afi client in timp ce folosigi contorul. Dar metoda LAST_INSERT_10() executl aceeagi operatic mult mai simplu. Deoarece valoarea sa este specified clientului, objineti fototdeauna valoarea pe care al inserat-o, mu pe cea a altu client, gi nu trebvie si complica programut cu blocir pentru a nu permite acesul altor cling, Verificarea existenfei tabelului Uncori este util si putem determina, din interiorul unei aplicagi, dack un tabel dat exist sau nu, Pentru aceasta, putetifolosi oricare din urmitoarele instrucyiuni: Capitolul 3 Sintaxa giutiizarea SOL in MySQL 189 SELECT COUNT(*) FROM nume_tabe2 SELECT * FROM nune_tabel WNERE 1=( Fiecare din este instructiuni reugeste daci tabelul exist, respectiv esueazi dact tabelul ru exist. Ele reprezintdinterogiri performante pentru aceasti categorie de test sis exe- cur foarte rept dei mu avi nevoie de prea mul timp pent a eros, Aceast strate ‘este cea mai indicarl pentru programele de aplicate pe care le scriefi, deoarece puceti feea succestl sau egecul Interogiri i pute intreprinde acfuni in consecings. Metoda nu este deosebit de util intr-un script de grup pe care il rulati din nysai, deoarece la apatijia unei erori nu puteti fave nimic altceva decit si terminati programul (sia si igno- ‘afi eroarea, dar atunci rularea interogirii nu mai are nici un sens). Caracteristici pe care MySQL nu le accepta Aceast sectiune descrie caracteristici aflate in alte sisteme de baze de date si pe care MySQL nu le accepta. Sectiunea de fata prezinté caracteristicile care lipsese gi indica modalitii de a ocoli aceste omisiuni, acolo unde este posibil. In general, caracteristicile lipsesc din MySQL deoarece au consecinge negative asupra performantelor. Numeroase articole din aceastilistd se afli pe lista de prioritiyi a dezvoltatorilor, in vederea imple ‘mentirii in misura timpului disponibil si cu presupunerea ck pot fi implementate fri sacrificarea ssopului lor initial, acela de a obrine un nivel optim de perforant’. ‘© Subselectie. O subselectie este o instructiune SELECT imbricati intr-o alti instructiune SELECT, cum este cazul in urmitoarea interogare: SELECT * FROM puncte WHERE eveninent_4d IN (SELECT eveninent 16 FROM eveninent WHERE tip = °T") Subselecjie sunt programate si apar3 in MySQL versiunea 3.24, moment in care nu ‘yor mai constitui o omisiune. Pana atunci, multe interogiri care sunt scrise folosind subselectii por fi redactate alternativ sub forma de uniri. Vezi secsiunea ,Rescricrea subselecfiilor sub forma de uni © Tranzactii si inregistrare-revenire. O tranzacgie este un set de instrucfiuni SQL care parece on ntrerupere din partea altor cliengi. Carasteristica de inregis~ tuare-reverire vi permite si declarati ci instructiunile trebuie executate unitar sau deloc. Cu alte cuvinte, daca vreo instructiune din cadrul tranzactiei esueazi, toate instructiunile executate pind in acel moment sunt anulate. ‘MySQL executi automat blocarea pentru instructiunile SQL individuale, pentru a pre- ‘veni interactiunile dintre cliengi. (De exemply, doi cliengi mu por scrie simultan in acelasi tabel.) In plus, puteyi folosi LOCK TABLES si UNLOCK "Wake penro a gropa iru ‘intr-un tot unitar, cea ce vi permite si efectuagi operatii pentra care controhul con- aren! pn © ingrdinsuciane ny ete sufens, Problema MySQL legate de ‘tranzactii este aceea cd sistemul nu va grupa in mod automat instructiunile, iar dum- neavoastri nu puteti efecrua anularea (revenirea) instructiunilor dac vreuna epucazi. Pentru a vedea in ce mod pot fi utile tranzacgiile, si presupunem cd activati in dome niul vanzarilor de confeepii si ci actualizati nivelurile de inventar ori de cate ori vre~ unul din azenjii dumneavoastri de vinziri realizeazi o vinzare. Exemplul urmator 190 Parteal_Utiizarea generalé a sistemului MySQL ilustreazd tipul de probleme care pot surven atu actualizeazd simultan baza de date (presupuniind ci 47 de buciti): cand mai mulfi agengi de vanzici wentarul inital de cimgi era de tt Agental 1 vinde tre e&magi 2 Agentul 1 regiseste numarul total de cimisi (47): SELECT cantitate FAG inventar HERE art = “canasa’ 19 Agentul 2 vinde tei cimmigi t¢ ——Agentul 2 regiseste numiral total de eimai (47) SELECT cantitate FROM inventar WHERE art = “canasa* 15 Agentul 1 calculeazi nou! nivel al inventarului cu expresia 47- stabilegte numirul de eSenigi la 4% UPOATE inventar SET cantitate = 44 WHERE art = “canasa” +6 Agenrul 2 caleuleaz3 now! nivel al inventarului cu expresia 47-2=45 gi stabileste numarul de cienigi la 45: UPOATE inventar SET cantitate = 45 WHERE art = “canasa” La sfargivul acestei seevenge de eveni i vandut cinci cima is L mente, ai vandut cinci cimigi(asta-i bine), dar in inventar serie 45 de bucfi in loc de 42 (asta nu-i bine). Problema este cf, in cralia care ciutati valoarea inventarului inte-o instructiune si actualizayivaloarea intro alté instrucfiune, avet o tranzacti cu instrucsiuni multiple. Actiunea intreprins4 ina doua instrucgiune depinde de valoarea regisica in prima. Dar, daci se produc tranzacti se- parate in intervale de timp care se suprapun, instruetiunile din fiecare tranzactic se Intrejes si interfer una cu alta. Intro baz de date tranzacrional, instrucpiunile Secu agent de vinzii pot fi exeewtae cao tanzacti ia inrucfunileAgentlu2 nu vor executa decit dupi finalizarea executieiinstructiunilor Agentului 1. In My pputesi obyine acelagi efect in dou moduci: : sane ' Solutie ocolitoare 1: Executati un grup de instructiuni ca pe un tot unitar. Putefi grupa instructiuni la un loc sie putes executa ca pe o unitate indivizibili delimitandu-le cu ajutorul instructiunilor LOCK TABLES si UNLOCK TABLES: blocati toate tabelele pe care trebuie si le folosti, emiteyinterogacile si anulayi blocirie. Aceasti operatie interzice oricuialtcuiva si foloseased tabelele in timp ce acestea sunt blocate. Folosind blocarea tabelelos, situayia invencarului se prezinté ase: tt — Agentul 1 vinde trei cimisi +2 Agencul 1 obyine o blocare si regisepte numirul curent de cimigi (47): LOCK TABLES inventar WRITE SELECT cantitate FROM inventar WHERE art = £3 Agentul 2 vinde dou’ cimisi 4 Agentul 2 incearcit si obgind o blocare; aceastd incercare va ewua, deoarece Agentul { define deja o blocare: LOCK TABLES inventar WRITE Capitolul 3 Sintaxa gi utlizarea SQL in MySQL 194 4. Agentul 1 calculeazi nowa valoare a inventarului cu formula 47- ‘stabileste numirul de cimagi la 44 si anuleazd blocarea: UPDATE inventar SET cantitate = 44 WHERE art = ‘camasa’ UNLOCK TABLES 6 Acum, cererea pentru o blocare, formulati de Agentul 2, reuseste. Agentul 2 regiseste numarul total de cimisi (44): SELECT cantitate FAO nventar WHERE art = ‘canaca’ t7—Agentul 2 calculeazi noua valoare a inventarului cu formula 44: stabileste numirul de cimisi la 42 si elibereaza blocarea: UPDATE inventar SET cantitate = 42 WHERE art = *camasa’ UNLOCK TABLES ‘Acum, instructiunile din cele doud tranzacfii nu se amestect una cu alta gi nivelul inventarului este stabiliccorect. Vom folosi aici o blocare WAITE, deoarece este nece sar si modificim tabelul inventar, Daci vi rezumafi la citirea tabelelor, puri folosi fin schimb o blocare READ. Aceasta permite altorclieni si citeasc tabelele in timp ce dumnenvoaste le folosifi dar if impiedit si sere fn acestea. fin exemplul prezentat anterior, Agentul 2 probabil ci nu va sesiza nici o seddere a viteze, deoarece tranzacfile sunt scurte gi se vor executa rapid. Tosusi ca regul ‘general, este de dort si evitai blocarea tabelelor pentru un interval lung de timp. Daci folositi mai multe tabele, trebuie sé le blocafipe toate inainte de a executa interog jpate. Daci doar citgi dintr-un anumit tabel,totusi, averi nevoie rnumai de o blocare a tabelului de tip citice, nu de una de tip sesiere. Si pre~ supunem c& avefi un set de interogiri prin care dorti si faceyi unele modificéri fnte-un tabel anvontar, si de asemenea dori s& cititi unele date dintr-un tabel client, In acest caz, avefi nevoie de o blocare la scriere a tabelului tnventar, sespeciiv de o blocare la ctire a tabelului ehéent: Lock TABLES inventar WRITE, client READ Ustock Tastes ‘Aceasti operatie impune ca dumneavoastri si exccutasi personal blocarea, respectiv deblocarea tabelelor. Un sistem de baze de date cu suport pentru tran- zacfii va efectua aceste acfiuni in mod automat. Totus, aspectul privind gruparea instrucyiunilor ca un tot unitar in vederea execuyiel este acelayi ca in cazul sis- temelor de baze de date tranzactionale. 1 Solus ocolitoare 2: Folosti actualiraei relative, nu absolute, A doua modali- tate de a rezolva problema amestecului instructiunilor provenite din multiple teanzai este climinarea dependene! nue instrctuni Dep acest era nu este fntotdeauna posibil, vom peesupune ci este posibil pentru exemplul nostra cu imnchasul Pentre sntoda de sctualizareaiventarlu folose tn solutaocolié toare i, tranzactia consti din cfutarea valorii curente a inventarului,calculul noit valori in funetie de numirul de cimisi vindute gi apoi actualizarea cifrel de 192 Parteal_Utiizarea generalé a sistemului MySQL inventar la noua valoare. Aceasti operafie este posibilé intr-o singurd etap3, prin simpla actualizare a numarului de cimasi relatv la valoarea sa curenti: #1 Agentul 1 vinde tref cimagi +2 Agentul 1 decrementeaz numirul de cimégi cu trl UPOATE inventar SET cantitate = cantitate ~ 3 WHERE art +9 Agentul 2 vinde dous cimasi 4 Agentul 2 decrementeaz numarul de eimai cu doi UPDATE inventar SET cantitate = cantitete ~ 2 WHERE art Dupé cum se poate vedea, aceasti metod nu necesita sub nici o form& tranzactii ‘eu mai multe instructiuni i, ca stare, mu este necesari blocarea tabelelor pentru simvularea caracteristicilor tranzactionale. Dack tipurile de tranzactii pe care le-ai folosit pang acum sunt similare celui prezentat mai sus, putefi rezolva problema fri a folosi deloc tranzacti Exemplul precedent indici modul de evitare a ,necesitiyi* tranzacpillor intr-o anumitd situatie. Aceasta mu inseamni cX nu exist gi alte situaii cand chiar este nevoie de tranzacyi, Un exemplu caracteristic in acest sens implied un transfer financiar, c€nd banii dintr-un cont sune plasagi fner-un ale cont. Si presupunem ci Marin i serie un cec lui Dorin pentra suma de 100 de dolar, iar Dorin incaseazt =,> i BETWEEN, Indexusile sunt de asemenea folosite pentru operafile LIKE, atunci cind modelul are ‘an prefix literal. Dict folositio coloand numai pentru alte categorii de operaii, cum’ar fi STRCHP(), mu are nici un sens si 0 indexari Utilitarul de optimizare a interogirilor din MySQL ‘Cind emitey ointerogare pentru selectarea randurilor, MySQL o analizeazd pentru a vedea daci poate benefcia de optimizii care i-i permiti si prelucreze interogarea mai rapid, In aceastl sectiune, vom examina modul de funeyionare al utlitarului de optimizare. Pentru informa suplimentare, consulaticapitolul ,Obyinerea unui nivel maxim de performants din utlizarea sinemului MySQL" din manualul de refering MySQL. Capitolul respectiv descrie dferite misuri de optimizare pe care le ia MySQL. La acest capital sunt adzugate ‘cazional alte informati, deoarece dezvoltatorii MySQL continu si imbunitigeascd utili. tarul de optimizare, deci meriti si recitii capitolul din cnd in cand, pentru a vedea dack ‘nau aplrut ponturi noi pe care si le utiliza (Versiunes electronic’ a manualului MySQL, dela adresa http: //wwm.mysq2.con/, este in permaneni aevualizat8.) 202 Parteal_Utiizarea generalé a sistemului MySQL Utilitarul de optimizare a interogivilor din MySQL utlizeaz’ indexurile, desiguy, dar foloseste si alte informatii. De exemplu, daci emiteyi urmitoarea interogare, MySQL 0 vva executa foarte rapid, indiferent de dimensiunea tabelului: SELECT * FROM nune_tabel WHERE 1 = 0 In acest caz, MySQL examineazi clauza WHERE, sesizeari ef nici un rnd mu poate satis- {face interogarea gi nici micar nu se mai oboseste si caure in tabel.Putegivedes acest Iucra EXPLAIN, care cere sistemului MySQL si afigeze uncle informayi despre modul in care ar executa o instructiune SELECT, irk a o executa efectiv. Pentru a folosi EXPLAIN, pur si simplu inserayi cuvntul EXPLAIN in fafa instructiunii SELECT: EXPLAIN SELECT * FROM nune_tabel WHERE 1 = 0 Rezultatul instructiunii EXPLAIN este urmitorul: Conmene Inpossipie WHERE (clauzi WHERE inposibita) {In mod normal, EXPLAIN returneazt mai multe informarii decdt cea prezentati mai sus, inclusiv date despre indexurile care vor fi folosite pentru baleerea tabelelo,tipurile de uniri care vor fi foloste,respectiestimneaz numirul de rinduri cave vor tebul parcurse din fiecaretabel Modul de functionare a utilitarului de optimizare Utilitarul de optimizare a interogirilor din MySQL are numeroase seopuri, dar princi- pula mene ented fol ndeartican dc con ere posbilprecum yi de folost indewul cel mai restrictiv, pentru a elimina cit mai multe randuri fnte-un timp cit mai scurt, Poate pirea ciudat, deoarece,atunci cind emitey instructiuni SELECT, scopul dum neavoasird este de a gisi rinduri, nu de a le elimina. Motivul pentru care urilitarul de ‘optimizare funcyioneaza in acest mod este urmitorul: cu cat pot fi scoase din discutie rGnduriints-o manieré mai expeditiva, cu atit pot figisite mai rapid rndurile care satis- fac crterile de efutare, Interogivle pot fi prelucrate mai rapid dacd testele cele mai restrictive se pot efectua prime. Si presupunem ci avetio interogare care estexzi dou soloane, aubele coloane find dorate cu index MERE colt = "o valoare’ AND col2 = *o alte valosre Si presupunem c& testul aplica asupra coloanel { giseste 900 de rinduri, ci tesvl apicat asap coloanei2 gly 300 de valor amb este reujese in caul a 30 de rind ac’ testafi mai intdi coloana 1, trebuie si examinayi 900 de rinduri pentru a le gisi cele 30 care corespund si alos dn colonne 2, Asta inearnd 870 detente rete Deck ‘estafi mai inti coloana 2, trebuie si examinaji numai 300 de randuri pentru ale gisi pe cele 30 care de asemenea corespund valorti din coloana 1. Numirul testelor ratte in acest caz este de 270, ceea ce implicé mai pugine caleule gi operaii de intrare-iegire cu discul Putey ajuta uiltarul de ootimizare si foloseascd inderurile folosind urmatoarele indrumi Cind folositi coloane indexate in comparati, uti -oloane de acelagi tip. De exemple, CHAR(10) este considerat identic cu CHAR(10) sau VARCHAR(10}, dar diferit de CHAR(12) sau VARGHAR(12). INT este dferit de BIGINT. Capitolul 4 Optimizarea interogarilor = 203 ‘Usilizarea coloanclor de acelasi tip este o ceringé obligatorie in versiunile de MySQL. anterioare versiunii 3.23, in caz contrar indexurile pentru coloane nefiind folosite. fncepind de la versiunea 3.23, acest lucru mu este strict necesar, dar tipurile de coloane identice vi vor oferi performange superioare tipurilor de coloane diferite. In cazul in care coloanele pe care le comparati sunt de tipuri diferte, puteyi folosi ALTER TABLE in scopul de a modifica unul dintre ele, pentru a objine asemiinarea ‘# Incercafi si singularizati coloanele indexate in comparafii, Daci folosit o coloan’ fnur-un apd la o funcsie sau intro expresie aritmetic3, MySQL, nu poate folosi index, deoarece trebuie si calculeze valoarea expresiei pentru fiecare rind. Uneori acest lucra ‘este inevitabil, dar de multe ori puteti rescrie o interogare pentru a obfine chiar coloana indexati. Urmitoarde clauze wint ilustreazii acest aspect, fn prima linie, wtlitarul de opti- iizare va simplifia expresia 4/2 la valoarea 2, apoi va folosi un index pe coos! pentru a descoperi rapid valorile mai mici deeit2. fn a doua expresic, MySQL trebuie si regiscasci valoarea din coloene_nea pentru fiecare rind, si multiplice cv 2 si apoi si compare rezultatul cu 4, Nu se poate folosi nici un index, deoarece trebuie regisit fiecare valoare din coloani, astfel incit expresia din membral sting al comparafici si poath f evaluat: WERE coloana_nea < 4 / 2 WHERE coloana_nea * 2 < 4 $i ne gindim la un alt exemplu. Si presupunem ci avetio coloand indexati dat Daci emitei o interogare precum urmatoarea, indexul hu este folosit: SELECT * FROM tabelul_neu THERE YEAR(data_col) < 1990 Expresia na compari valoarea dintr-o coloand indexati cu 1990; se compari o valoare calculaci din valoarea coloane, iar valoarea respectiva trebuie calculaté pentru ficeare rind, Ca rezulta, indexul pe coloana data_col nu poate fifolosit. Care este remedil? Folosit o dat literal, si indexul pentru coloana data_cot va fi util ‘WHERE data_col < 1960-01-01" . Dar si presupunem ci nu avetio dati precizata, In schimb, sunters.interesat in gisirea inregistrirlor a ciror dati se afl la un anumit numa de zile de data de astizi. Exist numeroase metode de scriere a unei interogiri precum aceasta, dar nu toate la fel de bune. Sunt tei posibility WHERE TO_DAYS(data_col) ~ TO_DAYS(CURAENT_DATE) < limita WHERE TO_DAYS(data_col) < limita + TO_DAYS(CURRENT_OATE) WHERE daca_col < DATE ADD(GUARENT_OATE, INTERVAL imita DAY) Pentru prima linie, mu va fi folosit nici un index, deoarcce coloana trebuie regisi pentru fiecare rand, pentru a permite ealculul valorii To_pavS(deta_co2). A doua linie este mai bun. Atdc limita eft gi TO_DAYS(CURRENT_OATE}sunt constante, deci mem- bral drept al comparayiei poate fi calculat 0 singuri dati de utilitarul de optimizare inainte de prelucrarca interogirii. au pentru fiecare rind in parte, Dar coloama, data_col pare Sntr-un apel lao functie, deci indexul mu este folosit. Cea de-a trea linie este etoda idealé. Din nou, membral drept al comparatiei poate ficaleulato sin- interogiei, dar acum valoarea este 0 ol, 204 —PartealUtlizarea generalé a sistemului MySQL. dati calendaristick. Acea valoare poate fi comparati direct cu valorile din coloana data_col, care au mai trebuie convertite in zile, In acest caz, se poate folosi indexul. ‘# Nu folosifi caractere de inlocuire Ia inceputul unui model LtKE. Uneori oamenii cauti sirurifolosind o clauz wien€ de forma urmitoare: HERE qume_coloana LIKE “Ssirs* Aceasta este 0 operatic corecti daci doriti sf gisii girul sir indiferent unde apare acesta in interiorul coloanei. Dar nu inserati caracterul % de ambele pirti doar din obignuing’. Dacd inte-adevir ciutai sirul numai atunci cind acesta apare la ineepucul coloanei, atunci nu mai seriti primul caracter 6. De exemphu, in cazul in care cutayi intr-o coloand care congine nume de familie acele nume care incep cu “Wao”, serieti clauza WHERE astfel: WHERE nume LIKE ‘Mack* ‘Usilitarul de optimizare examincaza partea literal inifalé a modelului gi foloseste indexal pentru a gisi rindusile care corespund acestuia, ca gi cum afi fi scris urm3- , care se afli intro formi ce permite urilizarea unui index pentru ‘WHERE nume >= "Mae* AKO nune < "Mad* ‘Aceasti optimizare nu se aplici operatilor de stabilire a corespondengelor cu un ‘model care folosesc operatorul REGEXP, © Ajutagi utiliarul de optimizare si efectueze estimiri mai bune ale efcientei indexu- lui, fa mod prestabilit, cind comparativalorle din coloanele indexate cu 0 constant’, utiltarul de optimizare va presupune ci valorilecheilor sunt distribuite in mod uniform fn index. De asemenes, uiltarul de optimizare va verifca rapid indexul, pentru a estima ‘numirul de inerri din index eare vor fi flosite atunci cind se determing daci indexul tre~ buie folosit sau nu pentru comparafil cx valori constante. Puteti furniza utlitarului de ‘optimizare informayii mai bune folosind optiunea --anelyze cu ryisarchk sau isanchk, pentru a analiza distribuya valorlor cheilor.Folosiji nyssanchk pentru tabele MyISAM, sespectiv Asanehi pentea tabele ISAM. Pentru a efectua analiza chelor, tebuie si pute deschide o sesiune de lucru la gazda serverului MySQL gi trebuie si avei acces de scriere Ia figcrele tabelului ‘© Usilizagi instructiunca CxrLAIN pentru a verfica funetionares utilitarului de opti- mizare, Verificayi daci in interogirile dumneavoasted sunt folosite indexusile pentru climinarea cu rapiditate a rindurilor. Dack nu, pute incerea si folosigi STRAIGHT_JOIN pentru a forza efectuarea unci uniri folosind tabele fntr-o anumiti ordine, Rulati interogarea in diferite modus pentru a vi forma o opinie; s-ar putea ca MySQL si iba un motiy solid pentru a nu folosi indexusile in ordinea pe care dumneavoastr’ o ‘considerayi cea mai bund. «# Testafi forme alternative ale interogirilos, dar rulati-le de mai multe ori, Cand tes- 1291 formele alternative ale unei interogiti, rulat-le de mai multe ori in fiecare forma. Dac rulayi ambele variance ale unei interogivi cite o singuri dati pe fiecare, veri ddescoperi frecvent ci a doua varianta este mai rapid, si aceasta numai deoarece infor- mayiile de la prima interogare se ala inci in zona cache a discului si nu teebuie si fie cfectiv citte de pe disc. De asemenea, trebuie si incercat si rulay interogirile atunci TTT Capitotul 4 Optimizarea interogarlor 208 ‘ind incitcarea sistemnului este relativ stabili, pentru a evita efectele datorate altor activitii din sisterrul dumneavoastré. Anularea efectelor optimizarii Poate pirea ciudat, dar existdsituapi cind doriyi si contracarafi tehnicile de optimizare ale sistemulsi MySQL. Unele din aceste circumstange sunt descrse in secpiunea de fap © Pentru a forfa sistemul MySQL si stearga incet conginutul unui tabel. Cand doriti si stergeyi complet conginutal unui tbe, acesta poate dispires cel mai repede.dack se foloseste o instructiune DELETE firs nici o clauz¥ WHERE: DELETE FROM nume_tabod MySQL optimizeazi acest caz special de instructiune DELETE; pur si simplu re-creeazi fipiere de dates figiere index vide pornind de la zero, folosind descrierea tabelului din fisierul cu informayii privind tabelul, Accasti optimizare mireste extrem de mult viteza operasiei de stergere, deoarece MySQL nu mai trebuie si steargifiecare rind in parte. Totnsi, operat are unele efecte care nu sunt de dorit in anumite circumstange: = MySQL raporteazé numarul randusilor afectate de instructiune ca fiind zero, chiar dact tabelul nu era vid. In majoritatea cazurilor, acest aspect mu conteazi (desi poate fi derutant dacd nu vi asteptay la aga ceva), dar pentru aplicafii care au efectiv nevoie sf curoasci numirul real de eindur, aceasti optiune nu este adecvati. = Died tabelul confine o coloand AUTO_INGRENANT, numerotarea secvengei din coloand este reinitializati pentru a incepe de la 1. Acest lucru este adevirat chiar si fa condipile imbunititiri metodelor de manipulare a atribucului ‘AUTO_INCRENENT, introduse in MySQL versiunea 3.23 si expuse in secriunea Lucrul cu seevene® a capitolului 2, ,Lucral cu date in MySQL‘. Puteti ,deoptimiza* o instrucyiune DELETE adfugind o clauzi WHERE 1>0: DELETE FROW nume_tabel VHERE 1 > 0 : Aceasti instrucfiune forfeard sistemul MySQL si execute o stergere sind cu rind, Interogares se executi mult mai lent, dar va returna numérul real de randuri terse. De asememtea, va conserva mimerotarea curentk a seevengei AUTO_INCREMENT, degi numai ppenteu tabelcle MyISAM (disponibile in MySQL versiunea 3.23 si in versiunile ulte- rioare). Pentru tabelele ISAM, din picate seevenfa este totugi reiniializaté, © Pentru a evita un ciclu de actualizare infinit. Daci actualizayi 0 coloani indexati, este posibil ca randurile care sunt actualizate si fie acwualizate la infinit, in cazul tn care coloana este fo clauza WHERE i cand actualizarea muti valoarea indexului in partea din domeniu care nu a fost inci prelucrati. S4 presupunem ci tabelal ‘tabolul_neu are o coloan’ intreagi col_cheie care este indexati. Interogiri ca urmi- toarea pot :auza probleme: UPDATE tebelul_meu SET col_cheie = col_cheievt \ WHERE col_cheie > 0; Solutia fn acest caz este utilizarea coloanei cot_cheie intr-o expresie din clauza WHERE, astfel incét MySQL si nu poati folosi index 206 —Parteal Utlizarea generalé a sistemului MySQL UPDATE tabelul_teu SET col_cheie = col_cheie+t WHERE col_cheie+0 > 0; : De fapt, mai existi o soluyie:trecey la versiunea MySQL 3.23.2 sau la o versiune mai recent, ceea ce va avea ca efect remedierea problemei. © Pentru a regisi rezultate intr-o ordine aleatoare. Incepind de la versiunea MySQL 3.23.2, putefi folosi functia ORDER BY RAND() pentru sortarea aleatoare a rezultatelor, O altétchnics, utié pentru versiuni mai vechi de MySQL, este de a selecta 0 coloand de numere aleatoare si de a sorta in functie de coloana respectiva. Totugi, daca serie interogarea dup cum urmeazi, utilitarul de optimizare contracareaza intentia dum- neavoastrit SELECT ..., RANO() AS rand_col FROM ... ORDER BY rand_col Problema in acest caz este ci MySQL yvede" ci respectiva coloant este un apel la 0 functie crede cf valoarea coloanei va fi o constant i optimizexzd clauza ORDER BY chiar din interogare! Puteyi induce in eroare utilitarul de optimizare ficand referire in interiorul expresiei la 0 coloani din tabel. De exemplu, daci tabelul dumneavoastri are o coloani denumicd varsta, pute serie interogarea astfe: SELECT varsta*D+RAND() AS rand_col FROM... ORDER BY rand_cot Pentru a anula ordinea de unire a tabelelor stabilita de utilitarul de optimizare. Folosigi STRAIGHT _JOTN pentru a forja utlitarul de optimizare si foloseascé tabelele {ntr-o anumiti ordine. Daci procedafi astel, trebuie si ordonafi tabelele de asa ‘manierX fncit primal tabel sk fe cel din care va fi selecat cel mai mic num&r de rin~ duri, (Dac nu suntepi sigur care este acest tabel, trecetitabelul cu numarul cel mai mare de rnduri pe prima poriie din list.) Cu alte cuvinte, incercati si ordonati tabelele astfel incit selectia cea mai restrictivi sk se aplice prima. Inverogirile se desfigoark mai bine daci pute elimina cit mai rapid rindurile candidate posibile. Nu nitay sa incercafiinterogarea in ambele sensuri; pot exista motive pentru care utilitarul de optimizare nu uneste tabelele in modul in care credeti ci ar rebui si procedeze, iar instrucfiunea STRATGHT_JOTN poate si nu fie de prea mare ajutor. Alegerea tipurilor de coloana si eficienta interogarilor Aceasti sectiune furnizeazi unele instructiuni pentr alegerea coloanelor care pot con- tribui la executarea mai rapida a interogirilor: © Folosificoloane cu lungime fixi, nu coloane cu lungime variabila, Acest lucra este valabil mai ales pentru tabelele care sunt modificate frecvent si care sunt, ca atare, mai supuse la fragmentare. De exemplu, transformagi toate coloanele caracter in coloane CHAR, nu VARGHAR, Compromisul este acela ei tabelul dumneavoastr’ va folosi mai mult spatiu, dar, dact vi puteti permite spatiul suplimentas, indurile cu lungime fix pot fi prelucrate mai rapid decat rindurile cu lungime variabili 2a aca expunere, ria stipuri BLOB” se vor ingle at TEXE-NA. tipurile BLOB, cit si ipurile CCapitolul 4 Optinizareainterogsilor 207 coloane mai lungi atunci cand se pot utiliza si coloane mai scurte. Dac folositi coloane GHAR de lungime fix, nu le facet inutl de lungi. Dacd veloarea cea mai scurti pe care o stocafi intr-o coloani este de 40 caractere, nu o declarati sub forma ‘0H88 (255); declarayi-o sub forma CHAR(40). Daci puteti folosi MEDTUNINT ‘in loc de BIGINT, tabelal dumneavoastri va fi mai mic (ceea ce implicd mai putine operayii de intrare“iegire2u discul), iar valorile vor fi preluerate mai rapid in cadrul calculelor. © Declarafi colbanele ca NOT NULL. Astfel, obtinetio vitezd de prelucrare mai mare gi veri nevoie de un spatiu de stocare mai redus. De asemenea, va simplifica uncori interogirile, eoarece nu trebuie si tratayi NULL ea pe un eaz speci calcul utilizarea de coloane Nuit. Daci aveti o coloani sir care contine ‘numai un nursir limitat de valori distinete,luai in considerare conversia acesteia la 0 ccoloani nut. Valorie EN pot fi preluerate rapid, deoarece sunt reprezentate intern sub forma de valori numerice, ‘ Folositi PROCEDURE ANALYSE(). Dack dispuneyi de MySQL versiunea 3.23 sau de 0 versiune ulterioari, rulayi functia PROCEDURE ANALYSE() pentru a primi informayii despre coloanele din tabelul dumneavoastri SELECT * FROM mune tebel PROCEOURE_ANALYSE() SELECT * FROM nume_tabel PROCEDURE _ANALYSE(16,256) Una dintre coloanele datelor de iesre este o sugestie a tipului optim de coloank pen- tru fiecare dintre coloanele tabelului dumneavoastr3. Cel de-al doiles exemplu indick funcfiei PROCEDURE ANALYSE() si mu sugereze tipuri ENUM care congin mai mult de 16, vvalori sau care ocupi mai mult de 256 octet (puteyi modifica valorile dup cum dori). Firi asemenea restriepi, datele de iegire pot fi foarte lungi; declaraile ENUM sunt dese oni dificil de ct. ‘In functie de datele de iesire ale functiet PROCEDURE. ANALYSE(), puteyi descoperi ci tabclul dumneavoastré poate fi modificat pentru a beneficia de un tip mai ficient. Folosigi ALTER TABLE daci dorigi si modifica un tip de coloand. © .lmpachetati" date intr-o coloana 8.08. Utilizarea unui tip 8108 pepiru a stoca date pe care le impachetay i le despachetat in aplicagia dumneavoastri vi poate permite sa Obyineyi toate datele printr-o singur& operatie de regisire in loc de mai multe aseme- nea operatii, Utilizarea tipului 808 poate fi de asemenea de folos pentru datele care nu sunt usor de reprezentat intro structurd de tabel standard sau care se modificx in timp. fn expunerea instructiunii ALTER TABLE din eapitolul 3, unul din exemple abor- dan tabel folost pentru stocarea rezultatelor din cimpurile unui chestionar bazat pe Web. Exemplal respectiv prezenta modul in care puteti folosi instructiunea ALTER ‘TABLE pentru 2 adiuga coloane la tabel ori de cite ori addugayi ntrebici la chestionar. O alts modaltate de abordare a acestei probleme este de a determina programul de aplicatie care prelucreazi formularul Web si simpacheteze* datele fntr-un fe de struc- turd de date, iar apoi si le insereze intr-o singurd coloand 8.08. Astfel, aplicaria capi suprasarcina ce codificare a datelor (si de decodificare a acestora mai tirziu, atunci cand regisitiinregistriri din tabel) dar se simplificl structura tabelului si se elimina necesitatea de modificare a structuriitabelului atunci ind chestionarul se modified. 208 Parteal_Uiiizarea general a sistemului MySQL e de alti parte, valorile 6.08 pot provoea propriile lor probleme, mai ales daci efec- twati o mulfime de operati de tip DELETE si UPDATE, Sergerea unui 8L08 poate lisa un ‘mare gol in tabel, gol care va fi umplut ulterior cu o inregistrare sau thregistriri de dimensiuni probabil diferte © Folositi instructiunea optimize TABLE pentru tabele supuse la fragmentiri, ‘Tabelele care suferi mumeroase modificiri, mai ales acelea care congin coloane cu lungime variabila, sunt supuse fragmentiri, Fragmentarea nu este indicat, deoarece duce la aparijia unor spapii nedorite in blocurile de pe disc folosite pentru stocarea tabelului dumneavoastra. In timp, trebuie si citsi mai multe blocuri pentra a obgine indurile valide iar performantele sunt diminuate. Acest lucru este adevirat pentra orice tabel cu rdnduri de lungime variabli, dar este valabil mai ales pentru coloanele 18108, deoarece dimensiunea acestora poate varia foarve mult. Utiizarea sistematica a Sasrueinitorrtur2e TABLE contribuie ln impiedicarea degeadii performanjlor ‘ Folositi un index sintetic. Coloanele unui index sintetic pot fi uneori utile. O tebri ‘este de a crea 0 valoare hash? in functie de alte coloane si de a 0 stoca intr-o coloand separati. Apoi, puteti gisi rinduri prin ciutarea valorilor hash. Acest procedeu este usil numai pentru interogivle care cauth corespondente exacte eu un model dat (alorile hash sunt inutile pentru eiutiiinte-un domeniu cu operatori precum < sau >=) Valorile hash pot fi generate in MySQL 3.23 sau in versiunile ulterioare folosind funcria wos). Un index hash poate fi deosebit de util in ceea ce priveste coloanele aL.08. Unul din motive este ci nu puteti indexa aceste tipuri anterior versiunii MySQL 323.2. Dar, chiar sin versiunea 3.23.2 sau in versiunile ulerioare, valorle BL08 pot fi mai usor de gitsit folosind o valoare hash ca idemtificator decit prin clutarea in coloana 8.08, ‘© Evicat si regisiqi valori aLos sau Text prea mari, cu exceptia situatiilor cfnd sun- teti obligat si o faceti. De exemply, o interogare SELECT * nu este o idee prea bunt decat dacd sunteti sigur ci clauza WHERE va limita recultacele la rinducile pe care le Tn caz contra, este posibil si deplasati prin ree valori 8L08 posibil foarte mari fird absolut nici un rost. Aceasta este 0 alti situatie cfnd informafia de identificare a valorilor 8108, stocati intro ahd eoloans, poate fils, Poteyichuta in coloana respec tivi pentrs a determina rindul sau randucile pe care le dori, dupt care regisiti valoa- ea 8108 din rindurile corespunzitoare. © Deplasafi valorile 8103 intr-un tabel separat. In anumite situafii, este justficatd ‘mutarea coloanelor 808 dintr-un tabel in alt tabel secundas, dac3 acest hucru vi per- site sX convertiti tabelul intr-un format cu randuri de lungime fix’ pentru coloanele rimase. Acest procedeu va reduce fragmentarea in tabelul primar gi, de asemenea, vi permite si profitagi de plusul de performangi determinat de rindurile cu lungime fd. ° Valoare numericl rezultaet prin transformare cose sub numele de funete hash (n cazul no ‘ru MDS) care converteste un identilietor sau ocheie, care a o anumitl semuifcatie pentru ucla tor, intro valoare care indicé locul ecupat de date fatr-un tabel. (CE. Disionar de calelatoare, Edita Teora, 1999) - NT. Capltolul 4 Optinizara inerogirior 209 {ncircarea eficient& a datelor Probabil ci in majoritatea timpului veti i preocupat de optimizarea interogisilor SELECT, deoarece acestea sunt cele mai folositetipuri de interogiri si deoarece modul de optimizare a acestora nu este intotdeauna simplu de intuit. Prin comparatie, incircarea datelor in baza dumneavoastri de date este o operaie simpl&. Totusi existéstrategii pe care le pu:eti folosi pentru a imbunatifieficienta operatiunilor de tncércare a datelor Principiile de baza sunt urmatoarele: ‘* Incircarea unor mari cantitigi de date este mai rapid decat incircarea unui singur rnd, deoarece zona cache a indexului nu trebuie goliek dup incircarea fiecirei inre- gistririsgolirea poate avea loc la incheierea lotului de inregistr ‘ Tncirearea este mai rapida arunci cfind un tabel nu are indexuri decit atunci cind este indexat. Dac exist indexuri, este necesari nu numai adiugarea inrogistri la fisierul de dat, dar fiecare index trebuie modificat pentru a reflecta addugarea noi inregistrisi, # Instruefunile SQL mai scurte sunt mai rapide decit instructiunile mai lungi, deoarece implied o analiza mai redusi din partea serverului si deoarece pot fi trimise mai rapid prin rejea dela client la server. esti factori pot prea minori (mai ales ultimul), dar, act incircagi o mulyime de date, ckiar gi micile trucuri de sporire a eficienfei determin o diferenga. Putem folosi principle generale anterioare pentru a trage numeroase concluzii practice cu privire la ‘modul cel mai rapid de incircare a datelor: . Instrucfunea LOAD DATA, in toate formele sale, este mai eficienta dect INSERT, deoa- rece incarca randurile in cantitifi mari, Golirea zonei cache a indexului are loc mai putin freevent si serverul trebuie si analizeze gi si interpreteze o singura instructiunc, fn Joc de mai multe. © LOAD DATA este mai eficienti decit LOAD DATA LOGAL. Daci se foloseste instrucyiunea LOAD DATA, figierul trebuie s se afle fn server si dumneavoastrdtrebuie si aveyi privie legiul FILE, dar serverul poate citi fiserul direct de pe disc. Cu instructiunca LOAD DATA LOZAL, clientul cites fisierul gil erimite in reyea serveruldi,ceea ce reprezinci o ‘operasie mai lenta. ‘© Dack trcbuie si folosigi 1nsEAT, utilizayi forma care permite specificarea mai multor ‘induri‘n acceag instrucfiune: INSERT INTO nume_tabel VALUES(..2)4(.+)ye+0 (Cu cit se pot specifica numere de rinduri mai mari fn cadral instrucfiuniy cu att mai bine. Asfel se reduce numirul total de instrucyiuni de care aveyi nevoie gi se reduce rnumarul de goliriale zonei cache a indexului. Daci folositi nysaidusp pentru a genera fsiere copii de siguranti pentru baza de date, folositi optiunea --extended-insert, astfel incdt fisicrul de descireare si conting instrucfiuni INSERT pentru mai multe rinduri, De asemenes, putefi folosi --opt (qpti- ‘mizare), care activeazi optiunea --extended-insert. Pe de alti parte, evitai tilizatea ‘opyiunil --complete- insert cu nysqldungs instructiunile INSERT rezultante vor fi pen tru rindari individuale, vor i mai lungi sivor necesita un volum suplimentar de anali- 24 decit instrucriunile generate fird --conplete-insert.

You might also like