Titlu original: MySQL
• Copyright © 2001 Teora
Toate drepturile asupra versiunii în limba română aparţin Editurii Teora. Reproducerea integrală sau parţială a textului sau a ilustraţiilor din această carte este posibilă numai cu acordul prealabil scris al Editurii Teora.
Authorized translation from the English language edition published by New Riders Publishing. Copyright ©2000.
All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Romanian language edition published by Teora Publishing. Copyright © 2000.
Teora
Calea Moşilor nr. 211, sector 2, Bucureşti
f ax: 01/210.38.28
e-mail: teora@teora.kappa.ro
Teora - Cartea prin poştă
CP 79-30, cod 72450 Bucureşti, România
tel: 01/252.14.31
e-mail: cpp@teora.kappa.ro
Copertă: Gheorghe Popescu Tehnoredactare: Cătălin Şleam Director Editorial: Diana Rotaru
Preşedinte: Teodor Răducanu
NOT 4897 CAL MY SQL ISBN 973-20-0246-8
Printed in Romania
Cuprins
Despre autor.......................................................................................................7
Despre referenţi..................................................................................................7
Prefaţă..................................................................................................................9
Introducere.......................................................................................................11
Partea I: Utilizarea generală a sistemului MySQL..............................23
Capitolul l Introducere în MySQL si SQL..............................................24
Capitolul 2 Lucrul cu date în MySQL şi SQL.........................................99
Capitolul 3 Sintaxa si utilizarea SQL în MySQL...................................158
Capitolul 4 Optimizarea interogărilor.....................................................195
Parteo a Ik: Utilizarea interfeţelor de programare ale sistemului MySQL— 217
Capitolul 5 Introducere în programarea MySQL..................................218
Capitolul 6 Interfaţa API MySQL pentru C..........................................237
Capitolul 7 Interfaţa API pentru Perl DBI.............................................293
Capitolul 8 Interfaţa API pentru PHP....................................................372
Partea a Ilk: Administrarea sistemului MySQL......................................413
Capitolul 9 Introducere în administrarea sistemului MySQL..............414
Capitolul 10 Catalogul de date MySQL....................................................419
Capitolul 11 Administrarea generală a sistemului MySQL.....................436
Capitolul 12 Securitate................................................................................469
Capitolul 13 întreţinerea şi repararea bazelor de date.............................488
6 Cuprins
Partea a nfa:
Anexa A
Anexa B
Anexa C
Anexa D
Anexa E
Anexa F
Anexa G
Anexa H
Anexa I
Anexa J
Anexe.......................................................................499
Obţinerea şi instalarea programelor....................................500
Referinţă de tipuri de coloane..............................................516
Referinţă de operatori şi funcţii...........................................525
Referinţă de sintaxă SQL......................................................564
Referinţă de programe MySQL...........................................597
Referinţă API C.....................................................................634
Referinţă API Perl DBI........................................................663
Referinţă API PHP...............................................................680
Instrumente utile produse de terţe părţi.............................702
Furnizori de servicii Internet...............................................704
Index
715
Despre autor
în ultimii 15 ani, Paul DuBois a fost administrator de reţea si de baze de date la Universitatea Madison a statului Wisconsin. Este autorul volumelor Software Portability with imake şi Using csh & tcsh (O'Reilly & Associates, ISBN 1-56592-226-3 si 1-56592-132-1) si a redactat materiale pentru manualul de referinţă MySQL.
Despre referenţi
David Axmark a lucrat drept consultant software timp de peste 15 ani. Printre numeroasele proiecte la care a activat se numără un sistem ultramodern de cercetare a pieţei (CommonLISP+CLOS+MySQLs-ISAM), grafică industrială avansată (în 32k de RAM), precum şi un sistem de scriere a ordinelor de funcţionare pentru o companie de electricitate. A scris numeroase linii de program în limbajele 6502 si în asamblorul Z80, BASIC, C, CommonLisp, (Bourne)-Shell si Perl. A început să se implice în MySQL la câţiva ani înainte de prima lansare publică a limbajului. David locuieşte în Uppsala, Suedia, cu plantele si calculatoarele lui.
Vijay Chaugule lucrează ca administrator principal de sisteme pentru o companie din Bay Area care manipulează o reţea UNIX de mari dimensiuni. Are opt ani de experienţă în gestiunea sistemelor şi a reţelelor si a utilizat o mulţime de instrumente comerciale şi sub licenţă GNU. Adoră să scrie scripturi în Perl si să compileze si să instaleze programe GNU. în prezent, foloseşte MySQL la un proiect pentru induscrafts.com.
Chad Cunningham este dezvoltator de sisteme pentru departamentul de matematică a Universităţii de Stat din Ohio, acolo unde se concentrează asupra dezvoltării unor instrumente de învăţare bazate pe Web, care să potenţeze procesul tradiţional de instruire din sala de curs.
Bill Gerrard este vicepreşedinte responsabil cu tehnologia al firmei Daze Networks, Inc. din Huntington Beach, California. Daze Networks execută servicii Internet, inclusiv serverele Web virtuale DigitalDaze, care vă oferă un control complet asupra propriului dumneavoastră server MySQL de baze de date, precum şi DNSCentral.com, care oferă înregistrarea numelor de domenii, parcare, transmitere prin Web (Web forwarding) si reexpedierea mesajelor de e-mail folosind MySQL ca bază de date back-end.
Jijo George John este îndrumător tehnic în cadrul Diviziei de dezvoltare software a grupului de analiză chimică din cadrul companiei Hewlett-Packard. Are experienţă în dezvoltarea de programe de sistem si de aplicaţie pentru instrumente chimice. A lucrat cu programe apropiate instrumentelor sau dispozitivelor, dar si cu aplicaţii pentru baze de date de mari dimensiuni, în prezent, foloseşte MySQL la un proiect pentru induscraf ts. corn.
Fred Read îşi are propriul său serviciu de consultanţă, ServaLan Systems Limited, de 14 ani. ServaLan Systems este specializată în producţia de sisteme UNIX în domenii ca telecomunicaţiile, bazele de date, finanţe şi Internet, în prezent, lucrează la un sistem de comutaţie pentru telecomunicaţii, în ultimii trei ani, a întreţinut şi un furnizor de servicii Internet (PremierISP) şi o mică afacere de publicitate în Web (PremierAds). Este însurat cu Helen de nouă ani. Cei doi au trei copii (două fete şi un băiat) si locuiesc în Anglia.
8
Dr. Egon Schmid lucrează la Six Offene Systeme GmbH din Leinfelden-Echterdingen, Germania, unde face parte din echipa de dezvoltare care realizează soluţii sofisticate de baze de date bazate pe Web. De asemenea, este membru al grupului de realizare a documentaţiei pentru limbajul PHP. A fost co-autor al primei cărţi de PHP scrisă în limba germană.
Jani Tolonen este dezvoltator software al sistemului MySQL. Este un student în vârstă de 23 de ani al Universităţii de Tehnologie din Helsinki, unde se dedică tehnologiei calculatoarelor şi programării de produse software în multe domenii. Jani s-a aflat sub îndrumarea lui Michael "Monty" Widenius, creatorul sistemului MySQL, şi doreşte să se dedice în continuare dezvoltării acestui sistem. Jani şi Monty au devenit „din greşeală" foarte buni prieteni: au fost vecini cu peste 10 ani în urmă. Activitatea lui Jani în domeniul MySQL a început la puţin timp după ce Monty a început să creeze MySQL în 1995.
Michael "Monty" Wîdenius este un finlandez vorbitor de suedeză, care a lucrat cu baze de date din 1978. A fost angajat de TcX (al cărei co-patron a devenit) din 1981 si a scris în totalitate componenta UNIREG (predecesorul lui MySQL) şi cea mai mare parte a programului server MySQL. A studiat fizica la Universitatea de Tehnologie din Helsinki, dar în materie de programare este în cea mai mare pane un autodidact. A lucrat mai ales în Basic, Assembler, C, LISP, Perl, SQL, C++ (în această ordine), dar doreşte mereu să examineze limbaje noi, atunci când dispune de timpul necesar. Este însurat şi are doi copii (un băiat si o fată - Max si My), două broaşte ţestoase, un câine si doi şerpi, în prezent, îşi petrece majoritatea timpului răspunzând la mesaje de e-mail.
Editura New Riders doreşte să mulţumească şi lui Thomas Karlsson, Colin McKinnon, Sasha Pachev, Eric Savage, Derick H. Siddoway şi Bob Worthy pentru contribuţia adusă la această carte.
Prefaţă
Când mi s-a oferit posibilitatea de a efectua o expertiză tehnică a cărţii lui Paul, nu m-am aşteptat să mă „înţepenesc" la prefaţă. Am fost întotdeauna de părere că un programator nu trebuie niciodată lăsat să scrie o carte, nici măcar una pentru programatori.
S-ar putea să am un oarecare talent pentru construirea unor linii de program utilizabile dar, din fericire, Paul are un mare talent de a explica lucruri pe care un mare număr de utilizatori le-ar înţelege altfel foarte greu. Aceia dintre noi care am lucrat la MySQL ne-am străduit din greu pentru a face ca acest limbaj să fie rapid şi uşor de folosit, dar MySQL are numeroase caracteristici distincte, iar marea majoritate a utilizatorilor vor avea nevoie de informaţii care pot fi acumulate numai din experienţă pentru a putea utiliza MySQL la maximum de potenţial, în anul care a trecut, Paul a lucrat la manualul MySQL, proces în cursul căruia ne-a pus multe sute de întrebări privind modul de funcţionare a limbajului MySQL, într-un efort de a înţelege totul, în această carte, el vă împărtăşeşte şi dumneavoastră cunoştinţele acumulate. (De asemenea, sunteţi bineveniţi să lucraţi cu manualul electronic de MySQL, chiar dacă acum aveţi la dispoziţie o modalitate mai rapidă de a înţelege MySQL.)
Manualul de MySQL a fost întotdeauna privit de noi, cei de la TcX, ca o referinţă tehnică pentru MySQL. Am avut întotdeauna nevoie de un manual de utilizare care să poată transmite conceptele tehnice într-un mod mai „relaxat". Credem că volumul de faţă va umple în mod elegant acest gol! Unul dintre scopurile limbajului MySQL este de a fi cât mai compatibil cu putinţă cu versiunile anterioare. Suntem siguri că, în ciuda ritmului rapid de dezvoltare al limbajului MySQL, majoritatea conceptelor din această carte îşi vor păstra veridicitatea pentru o lungă perioadă de timp.
Dacă mă mai bucur de atenţia dumneavoastră, aş dori să mă folosesc de această ocazie pentru a mulţumi soţiei mele, Carola, pentru timpul pe care m-a lăsat să mi-1 petrec cu MySQL în ultimii trei ani. Aş vrea să le mulţumesc şi copiilor mei, Max şi My, care au înţeles că, chiar dacă tatăl lor lucrează acasă, nu este întotdeauna disponibil. De asemenea, doresc să-i mulţumesc lui David pentru că m-a convins să scriu MySQL, precum şi lui Allan Larson, care mi-a oferit posibilitatea de a face acest lucru. De asemenea, am avut parte de un mare ajutor din partea echipei actuale de MySQL: Jani Tolonen, Sinisa Milivojevic, Antti Halonen şi Tonu Samuel, în final, dar nu în ultimul rând, doresc să le mulţumesc tuturor acelora care au scris interfeţe API si programe client, care au trimis remedii şi rapoarte privind unele defecte, care ne-au ajutat să transformăm MySQL în programul de succes care este astăzi.
Michael "Monty" Widenius Helsingfors, 14 noiembrie 1999
Din partea autorului
Volumul de faţă a beneficiat în mare măsură de comentariile, corecturile şi criticile furnizate de referenţii tehnici: David Axmark, Vijay Chaugule, Chad Cunningham, Bill Gerrard, Jijo George John, Fred Read, Egon Schmid şi Jani Tolonen. Mulţumiri speciale pentru Michael "Monty" Widenius, principalul creator al limbajului MySQL, care nu numai că a revizuit manuscrisul, dar a ridicat sute de întrebări la care am răspuns pe parcursul redactării cărţii. Evident, toate erorile rămase îmi aparţin.
De asemenea, aş dori să mulţumesc lui Tomas Karlsson, Colin McKinnon, Sascha Pachev, Eric Savage, Derick H. Siddoway si Bob Worthy, care au examinat manuscrisul iniţial si au ajutat la transpunerea acestei cărţi în forma sa actuală.
Personalul editurii New Riders este responsabil în primul rând pentru conceperea acestei cărţi si în al doilea rând pentru transformarea mâzgălelilor mele în opera finita pe care o aveţi în faţă. Laurie Petrycki a fost editor executiv. Katie Purdum, editor responsabil cu achiziţiile, m-a ajutat să-mi „intru în formă" şi a preluat toate criticile atunci când nu reuşeam să respect termenele. Leah Williams a fost nu numai editor de dezvoltare, dar si redactor de carte propriu-zis; a lucrat târziu de multe ori, mai ales în 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, au aranjat cartea în forma pe care o vedeţi acum. Mulţumiri fiecăruia dintre ei.
Cel mai mult, doresc să-mi exprim recunoştinţa faţă de soţia mea, Karen, care s-a împăcat cu încă o carte, precum şi pentru înţelegerea si răbdarea ei atunci când dispăream, uneori cu zilele, în „zona de scriere". Sprijinul ei mi-a uşurat munca în multe situaţii şi sunt bucuros să-mi exprim recunoştinţa; ea m-a ajutat să scriu fiecare pagină a cărţii.
Introducere
Un sistem de gestiune a bazelor de date relaţionale (SGBDR) este un instrument esenţial în numeroase medii, de la utilizările mai tradiţionale în contexte de afaceri, cercetare si învăţământ şi până la aplicaţiile mai recente, cum ar fi operarea motoarelor de căutare din Internet. Totuşi, în ciuda importanţei unei baze de date performante pentru gestiunea şi accesul la resursele informaţionale, aceasta s-a dovedit a fi dincolo de resursele financiare a numeroase instituţii. Din punct de vedere istoric, sistemele de baze de date au constituit o propunere costisitoare, firmele distribuitoare percepând onorarii substanţiale, atât pentru program cât şi pentru asistenţa necesară, iar deoarece motoarele de baze de date prezentau frecvent cerinţe hardware substanţiale pentru a putea rula cu performanţe cât de cât rezonabile, costurile erau si mai mari.
în anii din urmă, situaţia s-a schimbat, atât din punct de vedere al echipamentelor, cât si din acela al programelor. Calculatoarele personale au devenit necostisitoare, dar puternice; pe de altă parte, a apărut o întreagă mişcare în direcţia scrierii unor sisteme de operare cu performanţe ridicate pentru aceste calculatoare, sisteme disponibile la preţul unui compact disc ieftin, sau chiar gratuit, prin Internet. Acestea includ numeroase sisteme derivate din BSD UNIX (FreeBSD, NetBSD, OpenBSD), precum si diferite forme de Linux (RedHat, Caldera, LinuxPPC, pentru a numi doar câteva).
Producţia de sisteme de operare gratuite care să permită utilizarea calculatoarelor personale la maximum de capacitate s-a desfăşurat în mod concertat cu dezvoltarea unor instrumente disponibile gratuit, cum ar fi gcc, compilatorul GNU de C, fiind în mare măsură posibilă datorită acestora din urmă. Aceste eforturi de a pune programele la dispoziţia oricărui doritor au avut ca rezultat ceea ce se numeşte acum mişcarea Open Source si au generat multe programe importante. Cel mai solicitat sit FTP din lume, şi anume ftp.cdrom.com, rulează FreeBSD. Apache este cel mai folosit server Web din Internet. Alte succese ale iniţiativei Open Source sunt limbajul de scripting de uz general Perl si PHP, un limbaj a cărui popularitate este într-o creştere rapidă, datorită uşurinţei cu care permite scrierea paginilor Web dinamice. Toate acestea contrastează cu soluţiile „de firmă", care vă obligă să folosiţi produse costisitoare, create de fabricanţi care nici măcar nu furnizează codul sursă.
Programele de baze de date au devenit si ele mai accesibile. Sistemele de baze de date precum Postgres şi mSQL au devenit disponibile gratuit sau la un preţ scăzut. Mai recent, producătorii comerciali, precum Informix şi Oracle, au început să-si ofere programele gratuit pentru sisteme de operare precum Linux. (Totuşi, aceste din urmă produse sunt livrate, în general, numai în formă binară, fără suport, ceea ce le limitează utilitatea.)
Unul din noii veniţi în domeniul bazelor de date cu preţ scăzut sau gratuite este MySQL, un sistem client/server de gestiune a bazelor de date relaţionale originar din Scandinavia. MySQL include un server SQL, programe client pentru accesul la server, instrumente administrative şi o interfaţă de programare pentru scrierea propriilor dumneavoastră programe.
Bazele sistemului MySQL au fost puse în 1979, o dată cu instrumentul pentru baze de date UNIREG, creat de Michael "Monty" Widenius pentru compania suedeză TcX. în 1994, TcX a început să caute un server SQL pentru a-1 utiliza la dezvoltarea aplicaţiilor
12
Introducere
Web. Compania a testat unele servere comerciale, dar toate s-au dovedit a fi prea lente pentru tabelele de mari dimensiuni ale firmei. De asemenea, compania a examinat mSQL, dar acestuia îi lipseau anumite caracteristici obligatorii pentru TcX. în consecinţă, Monty a început să programeze un server nou. Interfaţa de programare era proiectată în mod explicit pentru a fi similară celei folosite de mSQL, deoarece pentru mSQL erau disponibile numeroase instrumente gratuite, iar prin utilizarea unei interfeţe similare aceleaşi instrumente puteau fi folosite pentru MySQL, cu un efort de portare minim.
în 1995, David Axmark de la Detron HB a început să facă presiuni pentru ca TcX să lanseze MySQL pe Internet. De asemenea, David lucra la documentaţie şi la a determina MySQL să construiască folosind utilitarul GNU configure. MySQL 3.11.1 a fost dat lumii întregi în 1996, sub forma de distribuţie binară pentru Linux si Solaris, în prezent, MySQL funcţionează pe mult mai multe platforme si este disponibil atât în formă binară, cât şi sursă.
MySQL nu este un proiect Open Source, deoarece este necesară o licenţă în anumite condiţii. Totuşi, MySQL se bucură de o amplă popularitate în comunitatea Open Source, deoarece termenii de licenţă nu sunt foarte restrictivi, (în esenţă, MySQL este în general gratuit, dacă nu doriţi să obţineţi profit prin vânzarea sistemului sau a unor servicii care necesită utilizarea acestuia.)
Popularitatea sistemului MySQL nu este limitată la comunitatea Open Source. Da, rulează pe calculatoare personale (într-adevăr, o bună parte din programarea cu MySQL are loc pe sisteme Linux ieftine). Dar MySQL este portabil si rulează pe sisteme de operare comerciale (precum Solaris, Irix si Windows) şi pe echipamente care merg până la servere de întreprindere, în plus, performanţele sale rivalizează cu acelea ale oricărui sistem de baze de date cu care doriţi să îl comparaţi şi poate manipula baze de date de mari dimensiuni, cu milioane de înregistrări.
MySQL apare foarte clar în imaginea care se desfăşoară dinaintea ochilor noştri: sisteme de operare disponibile gratuit, care rulează pe echipamente puternice, dar necostisitoare, punând la dispoziţia unui număr de oameni mai mare ca oricând o putere substanţială de prelucrare a datelor şi alte caracteristici, pe o varietate de sisteme mai largă ca oricând. Această „coborâre" a barierelor economice în ceea ce priveşte prelucrarea automată a datelor pune soluţii puternice pentru baze de date la dispoziţia unui număr fără precedent de mare de persoane şi instituţii. De exemplu, eu folosesc MySQL cu Perl, Apache şi PHP pe calculatorul meu. G3 PowerBook, care rulează LinuxPPC. Aceasta îmi permite să-mi transport oriunde rezultatele activităţii mele. Preţ total: costul calculatorului PowerBook.
Instituţii care în trecut se mărgineau să viseze la a exploata în folos propriu puterea unui SGBDR cu performanţe ridicate au acum această posibilitate, la un preţ foarte redus. Utilizarea bazelor de date este tot mai frecventă si la nivel individual. Oameni care nu se gândeau niciodată că vor folosi baze de date încep să ia în considerare tot felul de utilizări ale acestora, din moment ce procurarea unui sistem de baze de date este facilă - de exemplu, stocarea si accesul la rezultatele unor cercetări genealogice, urmărirea si întreţinerea colecţiilor de diferite tipuri (fluturi, mărci poştale, cărţi de joc cu jucători de baseball etc.), asistenţă în demararea unei afaceri sau furnizarea de posibilităţi de căutare pentru situri Web personale.
Introducere
13
De ce să optez pentru MySQL?
Dacă sunteţi în căutarea unui sistem gratuit sau necostisitor de gestiune a bazelor de date, puteţi alege din mai multe opţiuni: MySQL, mSQL, Postgres, unul din motoarele gratuite (dar fără suport) furnizate de producătorii comerciali şi aşa mai departe. Când comparaţi MySQL cu alte sisteme de baze de date, gândiţi-vă la ceea ce este cel mai important pentru dumneavoastră. Performanţă, suport, caracteristici (conformantă cu SQL, extensii etc.), condiţii si restricţii de licenţiere, preţ; toate acestea constituie factori care trebuie luaţi în considerare. Date fiind aceste consideraţii, MySQL are de oferit numeroase caracteristici atractive:
• Viteză. MySQL este rapid. Programatorii pretind că MySQL este cel mai rapid sistem de baze de date pe care îl puteţi găsi. Puteţi verifica această afirmaţie vizitând http: //www. mysql. com/benchmark. html, o pagină de comparaţie a performanţelor din situ! Web MySQL.
• Uşurinţă în utilizare. MySQL este un sistem de baze de date cu performanţe ridicate, dar relativ simplu, a cărui configurare şi administrare sunt mult mai simple decât în cazul sistemelor mai mari.
• Cost. MySQL este gratuit pentru majoritatea utilizărilor interne. Vezi secţiunea „MySQL este gratuit?" ulterior în această introducere.
• Suport pentru limbaje de interogare. MySQL înţelege SQL (Structured Query Language - limbaj de interogare structurat), limbajul preferat al tuturor sistemelor moderne de baze de date. De asemenea, puteţi avea acces la MySQL folosind aplicaţii care acceptă ODBC (Open Database Connectivity), un protocol de comunicaţie cu bazele de date creat de Microsoft.
• Caracteristici. La server se pot conecta mai mulţi clienţi simultan. Clienţii pot folosi mai multe baze de date simultan. Puteţi obţine acces la MySQL în mod interactiv, folosind numeroase interfeţe care vă permit să introduceţi interogări şi să vizualizaţi rezultate: clienţi în linie de comandă, browsere Web sau clienţi X Window System. De asemenea, este disponibilă o varietate de interfeţe de programare pentru limbaje precum C, Perl, Java, PHP şi Python. Astfel, aveţi opţiunea de a folosi programe client preambalate sau de a vă scrie propriile programe client pentru aplicaţii personalizate.
• Conectivitate şi securitate. MySQL poate fi folosit integral în reţele, iar bazele de date sunt accesibile de oriunde din Internet, deci vă puteţi partaja datele cu oricine, oriunde. Dar MySQL are controlul accesului, astfel încât persoanele care nu au dreptul să vă citească datele nu vor avea această posibilitate.
• Portabilitate. MySQL rulează pe numeroase varietăţi de UNIX, precum şi pe alte sisteme non-UNIX, ca Windows şi OS/2. MySQL rulează pe echipamente de la calculatoare de birou la servere cu performanţe ridicate.
• Distribuţie liberă. MySQL este uşor de obţinut; pentru aceasta, folosiţi-vă browserul de Web. Dacă nu înţelegeţi funcţionarea unei componente sau sunteţi curios cu privire la un algoritm, vă puteţi procura codul sursă si îl puteţi examina. Dacă nu vă place modul de funcţionare a unei componente, îl puteţi modifica.
Dar suportul? Bună întrebare; o bază de date nu este de prea mare folos dacă nu puteţi obţine asistenţă în raport cu ea. Natural, mi-ar plăcea să cred că această carte conţine tot
14
Introducere
ajutorul de care aveţi nevoie. Realist vorbind, însă, veţi avea întrebări la care nu m-am gândit niciodată sau pentru care nu am avut spaţiu suficient. Veţi descoperi că mai există şi alte resurse, dar şi că MySQL este dotat cu un sistem de asistenţă performant:
• MySQL include un manual de referinţă de mari dimensiuni (450 de pagini si mai creşte...)
• Sunt disponibile contracte de asistenţă tehnică de la dezvoltatorii MySQL, pentru cei care preferă un acord formal.
• Există o listă de corespondenţă activă, la care se poate înscrie oricine. Această listă conţine numeroşi participanţi utili, inclusiv dezvoltatorii MySQL. Ca resursă pentru asistenţă, mulţi o găsesc suficientă pentru necesităţile proprii.
Comunitatea MySQL, programatori si ne-programatori, este extrem de cooperantă. Răspunsurile la întrebările din lista de corespondenţă sosesc, de regulă, în câteva minute. La semnalarea unor hibe, programatorii lansează un remediu în câteva zile (uneori ore!), iar remediile sunt disponibile imediat prin Internet. Comparaţi aceasta cu experienţa deseori frustrantă a navigării prin canalele „bizantine" de suport ale marilor producători. (Aţi fost pe-acolo? Şi eu am fost. Ştiu ce alternativă să folosesc atunci când am o întrebare despre un produs. Nu se poate face comparaţie între a fi pus pe „apel în aşteptare" la discreţia unui producător si posibilitatea de a publica o întrebare într-o listă de corespondenţă şi a verifica existenţa răspunsurilor atunci când îmi convine.)
MySQL este un candidat ideal pentru evaluare dacă vă aflaţi în procesul de selectare a sistemelor de baze de date. Puteţi încerca MySQL fără nici un pericol de implicare financiară. Totuşi, dacă vă încurcaţi, puteţi folosi lista de corespondenţă pentru a fi ajutat. O evaluare costă o parte din timpul dumneavoastră, dar acest lucru este valabil indiferent de sistemul de baze de date pe care îl aveţi în vedere - si este perfect adevărat că timpul de instalare si configurare pentru MySQL este mai redus decât pentru multe alte sisteme.
Folosiţi deja un alt SGBDR?
Dacă în prezent utilizaţi un alt sistem de baze de date, trebuie să treceţi la MySQL? Nu în mod necesar. Dacă sunteţi satisfăcut de sistemul dumneavoastră actual, de ce să vă deranjaţi cu o atare tranziţie? Dar dacă vă simţiţi limitat de sistemul folosit, trebuie categoric să aveţi în vedere MySQL. Poate că performanţele sistemului dumneavoastră curent reprezintă o problemă, sau poate că sistemul respectiv este „de firmă" şi nu vă place să fiţi „blocat" de acesta. Poate aţi prefera să folosiţi componente hardware care nu sunt acceptate de sistemul dumneavoastră actual sau poate că programul este furnizat în format binar, iar dumneavoastră preferaţi să aveţi la dispoziţie codul sursă. Sau poate că pur şi simplu e prea costisitor! Toate acestea reprezintă motive pentru a lua în considerare MySQL. Folosiţi această carte pentru a vă familiariza cu posibilităţile sistemului MySQL, puneţi câteva întrebări în lista de corespondenţă MySQL si probabil că veţi găsi răspunsurile necesare pentru a lua o decizie.
Dacă aveţi în vedere trecerea de la un alt sistem de baze de date SQL la MySQL, examinaţi pagina de comparaţie din situl Web MySQL, la adresa http://www.mysql.com/ crash-me-choose. htmy. Apoi, consultaţi capitolele care tratează tipurile de date MySQL şi dialectul SQL. Puteţi ajunge la concluzia că versiunea de SQL acceptată de sistemul dumneavoastră curent de gestiune a bazelor de date relaţionale este mult prea diferit şi că portarea aplicaţiilor dumneavoastră ar implica un efort semnificativ.
Introducere 15
O parte din evaluarea dumneavoastră trebuie să o reprezinte încercarea de a porta diferite exemple, desigur, deoarece s-ar putea să nu fie atât de greu precum credeţi. S-ar putea să nu fie chiar atât de greu chiar dacă sistemul dumneavoastră de baze de date este unul mai vechi, care nu înţelege SQL. Eu am convertit recent un sistem de gestiune a înregistrărilor de la un SGBDR care nu era bazat pe SQL. Nu exista nici o asemănare între limbaje care să poată fi utilizată, iar unele dintre tipurile de date nu aveau echivalent în SQL. Acest proces a necesitat conversia metodelor de acces la reţea si zeci de programe de introducere bazate pe ecran si de interogări „conservate". A fost necesară o lună si jumătate de eforturi „cu normă întreagă", ceea ce n-a fost chiar atât de rău.
Instrumente furnizate cu MySQL
Distribuţia MySQL include următoarele instrumente:
• Un server SQL. Acesta este motorul care activează MySQL si care furnizează accesul la bazele dumneavoastră de date.
• Programe client pentru accesul la server. Un program interactiv vă permite să introduceţi interogări în mod direct şi să vizualizaţi rezultatele, iar numeroasele programe administrative şi utilitare vă ajută să vă rulaţi situl. Un utilitar vă permite să controlaţi serverul. Altele vă permit să importaţi sau să exportaţi date, să verificaţi permisiunile de acces si multe altele.
• O bibliotecă client pentru scrierea propriilor dumneavoastră programe. Puteţi scrie programe client în C, deoarece biblioteca este scrisă în C, dar biblioteca mai furnizează si baza pentru terţe asocieri pentru alte limbaje.
In afara programelor furnizate cu MySQL, MySQL însuşi este folosit de către numeroase persoane talentate şi capabile, cărora le place să scrie programe pentru a-şi îmbunătăţi productivitatea şi care doresc să pună la dispoziţia publicului aceste programe. Rezultatul este că aveţi acces la o diversitate de instrumente produse de terţe părţi, care facilitează utilizarea sistemului MySQL sau care extind aria de acţiune a acestuia în domenii precum dezvoltarea siturilor Web.
MySQL este gratuit?
MySQL nu este un produs Open Source, dar, în general, poate fi folosit gratuit. Trebuie să consultaţi manualul de referinţă MySQL pentru detalii privind licenţa, dar principiile de bază sunt următoarele:
• Programele client şi biblioteca de programare a clienţilor sunt gratuite, pe toate platformele.
• Pentru UNIX si alte platforme non-Windows, serverul MySQL poate fi folosit gratuit, cu excepţia situaţiilor când doriţi să vindeţi serverul sau alte programe sau servicii care impun utilizarea acestuia, în această situaţie, trebuie să obţineţi licenţă pentru server. Ideea este că, dacă obţineţi un profit din MySQL, este normal ca dezvoltatorii sistemului să primească o parte din acesta. (200 de dolari este o nimica toată pentru un specialist SGBDR care vă ajută să obţineţi un profit şi există o mulţime de programe gratuite pe care vi le puteţi procura pentru a folosi eficient sistemul.)
16
Introducere
• Versiunea Windows a serverului MySQL impune obţinerea unei licenţe.
• Versiunile mai vechi de MySQL sunt disponibile în condiţiile licenţei publice GNU (GPL) şi pot fi folosite în orice scopuri, fără nici o plată. MySQL 3.20.32a este disponibil în condiţiile GPL.
Indiferent daca aveţi sau nu nevoie de o licenţa pentru server, se poate obţine o asistenţa formală, contra cost, de la programatorii MySQL, şi vă sfătuiesc să folosiţi această ocazie, mai ales dacă lucraţi într-o firmă a cărei conducere „mârâie" la fiecare program pentru care nu există un astfel de acord. Sunt disponibile numeroase niveluri de suport şi, în afară de obţinerea unei asistente excelente, veţi contribui la dezvoltarea în continuare a sistemului MySQL şi, implicit, a întregii comunităţi MySQL.
O notă despre licenţa Windows
Uneori se pune întrebarea: „Cum adică trebuie să obţin licenţă pentru serverul MySQL numai fiindcă rulez
•. Windows?" Aceasta este o întrebare rezonabilă, la care există un răspuns rezonabil. Gândiţi-vă la
' aspectele economice ale problemei. Pentru a vă angaja în dezvoltarea de programe, aveţi nevoie de un
sistem de operare si de unele instrumente de dezvoltare, cum ar fi un editor şi un compilator. Relativ la ., aceste cerinţe, există o diferenţă fundamentală între dezvoltarea pentru UNIX si dezvoltarea pentru
Windows. Sub UNIX, puteţi obţine gratuit cam tot ceea ce aveţi nevoie:
'' • Pentru sistemul de operare, aveţi numeroase opţiuni, cum sunt Linux sau una din variantele BSD gratuite, cum sunt FreeBSD, NetBSD şi OpenBSD.
• Pentru instrumentele de dezvoltare, toate aceste sisteme de operare sunt dotate cu editoare precum vi si emacs, precum şi compilatoare ca gcc şi egcs.
• Când sunt lansate actualizări ale sistemelor de operare sau ale instrumentelor de dezvoltare, le puteţi pur şi simplu descărca din Internet sau vă puteţi procura un compact disc necostisitor. Acest lucru este valabil chiar si pentru revizuirile substanţiale.
Pe de altă parte, dezvoltarea programelor în Windows este relativ costisitoare:
• Sistemul de operare nu este gratuit.
• Instrumentele de dezvoltare, precum compilatorul, nu sunt gratuite.
'' • Când sunt lansate actualizări ale sistemului de operare sau ale instrumentelor, trebuie să plătiţi din nou, chiar dacă acestea nu sunt altceva decât remedii pentru hibe sau actualizări incrementale de mică importanţă.
Toate acestea înseamnă ca, în timp ce costurile pentru dezvoltarea programelor în UNIX sunt, în esenţă, nule, pentru Windows acestea pot atinge valori considerabile. Se prea poate ca dezvoltatorilor MySQL să le placă să lucreze cu MySQL, dar nu atât de mult încât sa fie dispuşi să plătească pentru acest privilegiu. Costurile de dezvoltare sub Windows trebuie recuperate într-un fel sau altul, iar taxa pentru licenţă este modul în care se produce această recuperare.
în plus, dezvoltatorii au descoperit că programarea sub Windows necesită mai mult timp decât cea sub UNIX. Deoarece timpul dezvoltatorilor are o mărime fixă, acesta este un cost care trebuie suportat pe • spezele versiunii UNIX (care este, în fond, platforma primară de dezvoltare a sistemului MySQL). Taxa de licenţă Windows furnizează un stimulent pentru orientarea timpului şi a eforturilor spre portul Windows,
Dacă doriţi să rulaţi Windows, dar nu doriţi să obţineţi licenţă pentru server, aveţi unele opţiuni:
• Există o versiune shareware a sistemului MySQL, pe care o puteţi testa pentru evaluare. Această versiune vă oferă 30 de zile pentru utilizarea serverului, după care puteţi decide dacă veţi plăti licenţa pentru el.
• Dacă rulaţi serverul Windows în scopuri educaţionale sau în instituţii universitare sau de cercetare guvernamentale, puteţi cere dezvoltatorilor să vă scutească de taxa de licenţă.
-• • Programele client sunt gratuite în orice caz, deci, dacă puteţi găsi pe cineva care rulează deja un server si este dispus să vă permită să-l folosiţi, aveţi acces complet la caracteristicile sistemului MySQL.
Introducere
17
Ce puteţi aştepta de la această carte
Citind volumul de faţă, puteţi învăţa sa folosiţi sistemul MySQL in mod eficient, astfel încât să vă puteţi face treaba într-un mod mai productiv. Veţi putea determina modul de introducere a informaţiilor dumneavoastră într-o bază de date şi veţi învăţa să formulaţi interogări care să vă ofere răspunsuri la întrebări pe care doriţi să le puneţi relativ la acele date.
Nu trebuie să fiţi programator pentru a înţelege sau pentru a folosi SQL. Această carte vă va arăta cum funcţionează sistemul. Dar, pentru a înţelege modul de utilizare adecvată a unei baze de date, nu este suficient să cunoşti sintaxa SQL. Lucrarea pune accentul pe caracteristicile unice ale sistemului MySQL şi indică modul de utilizare a acestora. Alte cărţi se concentrează asupra limbajului SQL în general, respectiv asupra dialectului SQL al unui alt SGBDR.
De asemenea, veţi vedea care este modul de integrare al sistemului MySQL cu alte instrumente. Cartea prezintă modul de utilizare a sistemului MySQL cu PHP sau Perl pentru a genera pagini Web dinamice, create din rezultatele interogărilor aplicate bazelor de date. Veţi învăţa să scrieţi propriile dumneavoastră programe care să aibă acces la bazele de date MySQL. Toate acestea îmbunătăţesc posibilităţile SQL de a satisface cerinţele aplicaţiilor dumneavoastră particulare.
Dacă veţi fi responsabil cu administrarea unei instalări MySQL, această carte vă va arăta care sunt îndatoririle dumneavoastră şi modul de îndeplinire a acestora. Veţi învăţa să configuraţi conturi de utilizator, să executaţi copii de siguranţă ale bazelor de date şi să luaţi măsuri pentru a asigura securitatea sitului dumneavoastră.
„Harta rutieră" a acestei cărţi
Lucrarea de faţă este structurată în patru părţi.
Partea I: Utilizarea generală a sistemului MySQL
• Introducere în MySQL şi SQL. Discută despre modul în care MySQL vă poate fi de folos şi conţine un manual general care prezintă programul client interactiv MySQL şi care tratează elementele fundamentale ale limbajului SQL.
» Lucrul cu date în MySQL. Discută tipurile de coloane furnizate de SQL pentru descrierea datelor dumneavoastră, proprietăţile şi dezavantajele fiecărui tip, când şi cum să utilizaţi aceste tipuri, modul de selectare dintre tipuri similare, evaluarea expresiilor şi conversia tipurilor.
• Sintaxa si utilizarea SQL în MySQL. Fiecare SGBDR important existent în prezent înţelege SQL, dar fiecare motor de baze de date implementează un dialect SQL uşor diferit. Acest capitol discută despre SQL, cu accent asupra acelor caracteristici distinctive ale sistemului MySQL. De asemenea, discută despre caracteristici prezente în alte sisteme de baze de date, dar inexistente în SQL, precum şi soluţiile existente.
• Optimizarea interogărilor. Un mod mai eficient de rulare a interogărilor.
18
Introducere
Partea a Il-a: Utilizarea interfeţelor de programare ale sistemului MySQL
• Introducere în programarea MySQL. Discută despre unele interfeţe de programare a aplicaţiilor disponibile sub MySQL si conţine o comparaţie generală a interfeţelor API pe care cartea le tratează în detaliu.
• Interfaţa API MySQL pentru C. Modul de scriere a programelor C folosind interfaţa API furnizată de biblioteca client inclusă în distribuţia MySQL.
• Interfaţa API pentru Perl DBI. Modul de scriere a scripturilor Perl folosind modulul DBI. Tratează scripturile autonome si scripturile CGI pentru programarea siturilor Web.
• Interfaţa API pentru PHP. Modul de utilizare a limbajului de scripting PHP pentru a scrie pagini Web dinamice, care obţin acces la bazele de date MySQL.
Partea a Hl-a: Administrarea sistemului MySQL
• Introducere în administrarea sistemului MySQL. Prezintă îndatoririle unui administrator de baze de date şi noţiunile pe care trebuie să le cunoaşteţi pentru a rula un sit performant.
• Catalogul de date MySQL. O examinare aprofundată a organizării şi conţinutului catalogului de date, regiunea în care MySQL stochează bazele de date si fişierele de stare.
• Administrarea generală a sistemului MySQL. Modul în care vă puteţi asigura că serverul dumneavoastră porneşte, respectiv se opreşte în mod adecvat atunci când sistemul dumneavoastră execută această operaţie. De asemenea, include instrucţiuni pentru configurarea conturilor de utilizator MySQL si discută despre întreţinerea fişierelor jurnal, despre strategiile de creare a copiilor de siguranţă, despre ajustarea serverelor si despre strategiile de realizare a copiilor de siguranţă, respectiv de refacere a bazelor de date.
• Securitate. Ceea ce trebuie să ştiţi pentru a proteja instalarea sistemului dumneavoastră MySQL împotriva intruşilor, atât contra altor utilizatori ai gazdei serverului, cât şi a clienţilor care se conectează prin reţea.
• întreţinerea şi repararea bazelor de date. Modul de a reduce posibilitatea de apariţie a dezastrelor printr-o întreţinere preventivă, precum şi metodele de a efectua refacerea în urma căderilor, dacă dezastrele survin în ciuda măsurilor dumneavoastră de pre-
venire.
Partea a IV-a: Anexe
• Obţinerea şi instalarea programelor. De unde să vă procuraţi principalele instrumente descrise în carte si modul de instalare a acestora.
• Referinţă de tipuri de coloane. Descrierea tipurilor de coloane MySQL.
• Referinţă de operatori şi funcţii. Descrierea operatorilor şi a funcţiilor care se pot folosi pentru a scrie expresii în instrucţiunile SQL.
• Referinţă de sintaxă SQL. Descrierea fiecărei instrucţiuni SQL pe care MySQL oi poate înţelege. i
Introducere
19
• Referinţă de programe MySQL. Descrierea fiecărui program furnizat în distribuţia MySQL.
• Referinţă API C. Descrierea tipurilor de date şi a funcţiilor din biblioteca client C a sistemului MySQL.
• Referinţă API Perl DBI. Descrierea metodelor şi a atributelor furnizate de modulul Perl DBI.
• Referinţă API PHP. Descrieri ale funcţiilor furnizate de PHP pentru suportul MySQL.
• Instrumente utile produse de terţe părţi. O succintă trecere în revistă a unora dintre instrumentele disponibile pentru a vă ajuta să utilizaţi MySQL, cum sunt utilitarele de conversie a datelor sau utilitarele administrative.
• Furnizori de servicii Internet. Ce anume trebuie avut în vedere atunci când alegeţi un ISP care furnizează, acces MySQL. Ce anume trebuie avut în vedere atunci când funcţionaţi ca furnizor de servicii Internet care asigură clienţilor servicii MySQL.
Cum să citiţi această carte
Indiferent de porţiunea din carte pe care o citiţi la un moment dat, cel mai bine este să încercaţi exemplele pe măsură ce parcurgeţi cartea. Dacă MySQL nu este instalat în sistemul dumneavoastră, trebuie să îl instalaţi sau să rugaţi pe cineva să îl instaleze. Apoi, procuraţi-vă fişierele necesare pentru configurarea bazei de date demonstrative la care vom face referire pe parcursul cărţii. Anexa A, „Obţinerea si instalarea programelor", vă arată de unde vă puteţi procura toate acestea şi conţine instrucţiuni pentru instalarea lor.
Dacă nu aveţi nici cele mai elementare noţiuni privind MySQL sau SQL, începeţi de la capitolul l, „Introducere în MySQL si SQL". Acest capitol vă oferă o introducere de tip manual care vă prezintă fundamentele conceptelor privind MySQL şi SQL si vă oferă cele necesare pentru a putea parcurge restul cărţii. Apoi, treceţi la capitolul 2, „Lucrul cu date în MySQL", respectiv capitolul 3, „Sintaxa şi utilizarea SQL în MySQL", pentru a descoperi modul de descriere şi manipulare a datelor dumneavoastră, astfel încât să puteţi exploata caracteristicile sistemului MySQL pentru propriile dumneavoastră aplicaţii.
Dacă aveţi unele noţiuni de SQL, trebuie totuşi să citiţi capitolele 2 şi 3. Implementările SQL diferă şi veţi dori să ştiţi care sunt elementele distinctive ale implementării MySQL în raport cu alte implementări pe care, poate, le cunoaşteţi.
Dacă aveţi experienţă cu MySQL, dar aveţi nevoie de mai multe informaţii privind detaliile de efectuare a anumitor operaţii, puteţi folosi cartea ca pe o referinţă, căutând subiectele dorite în funcţie de necesităţi.
Dacă sunteţi interesat în a vă scrie propriile dumneavoastră programe pentru accesul la bazele de date MySQL, citiţi capitolele referitoare la API, începând de la capitolul 5, „Introducere în programarea MySQL". Dacă doriţi să generaţi o interfaţă bazată pe Web la bazele dumneavoastră de date pentru a facilita accesul la acestea sau, invers, pentru a furniza un back end de baze de date pentru situl dumneavoastră de Web în scopul de a vă îmbunătăţi situl cu un conţinut dinamic, examinaţi capitolele 7, „Interfaţa API pentru Perl DBI", respectiv 8, „Interfaţa API pentru PHP".
20
Introducere
Dacă evaluaţi MySQL pentru a-1 raporta la sistemul dumneavoastră curent de gestiune a bazelor de date relaţionale, numeroase porţiuni ale cărţii vă vor fi de ajutor. Citiţi capi-j tolele referitoare la tipurile de date si la sintaxa SQL din Partea I pentru a compara' MySQL cu sistemul SQL cu care sunteţi obişnuit, capitolele de programare din Partea a Il-a dacă aveţi aplicaţii personalizate, respectiv capitolele despre administrare din Partea a III-a pentru a estima nivelul de suport administrativ necesar unei instalări a sistemului MySQL. Aceste informaţii sunt de asemenea utile dacă nu folosiţi în mod curent o bază de date, dar efectuaţi o analiză comparativă a sistemului MySQL şi a altor sisteme de baze de date, în scopul de a alege unul din ele.
Dacă doriţi acces la MySQL si căutaţi un furnizor de servicii Internet (ISP) care să-1 ofere, vezi Anexa J, „Furnizori de servicii Internet", pentru sugestii privind alegerea unui furnizor. De asemenea, această anexă conţine sfaturi pentru furnizorii de servicii care doresc să asigure MySQL pentru a-şi atrage noi clienţi sau pentru a-i Servi mai bine pe clienţii actuali.
Versiuni de programe tratate în această carte
în momentul scrierii acestor rânduri, versiunea curent stabilă de MySQL este seria de versiuni 3.22, iar seria 3.23 se află într-un proces de dezvoltare activă. Cartea se ocupă de ambele serii. Acolo unde anumite caracteristici nu există în versiunile anterioare (inclusiv seria 3.21), acest lucru este semnalat.
Pentru celelalte pachete principale de programe discutate aici, versiunile recente sunt suficiente pentru exemplele date în carte. Versiunile curente sunt:
Pachet Versiune
PerlDBI 1.13
Driver Perl DBI pentru MySQL l .22.xx (stabilă), l .23.xx (beta)
PHP 3.0.12 (4.0 se află la orizont)
Apache 1.3.9
CGLpm 2.56
Toate programele discutate în această carte sunt disponibile din Internet. Anexa A furnizează instrucţiuni pentru încărcarea în sistemul dumneavoastră a sistemului MySQL, a suportului pentru modulul Perl DBI, a limbajului PHP, a serverului Apache şi a limbajului CGI.pm. Această anexă mai conţine instrucţiuni pentru procurarea bazei de date demonstrative folosite în exemplele din carte, precum şi a programelor exemplu create în capitolele de programare.
Convenţii folosite în carte
Convenţiile tipografice folosite sunt următoarele:
Corpul de literă monospaţiat indică nume de gazde, nume de fişiere, nume de cataloage, comenzi, opţiuni si situri Web.
Introducere
21
Acolo unde comenzile sunt indicate atunci când le introduceţi, caracterele aldine indică textul pe care îl introduceţi. Promptul indică modul de rulare a comenzii:
% Comanda este rulată ca utilizator UNIX obişnuit
# Comanda este rulată ca utilizator UNIX rădăcină (root)
C: \> Comanda este rulată în Windows
Corpul de literă cu caractere italice din comenzi indică locul unde trebuie să introduceţi o valoare la libera dumneavoastră alegere.
în instrucţiunile SQL, cuvintele cheie şi numele funcţiilor SQL sunt scrise cu caractere majuscule. Numele bazelor de date, ale tabelelor şi ale coloanelor sunt scrise cu caractere minuscule, în descrierile sintactice, parantezele drepte ([ ]) indică informaţii opţionale.
Resurse suplimentare
Această carte încearcă să vă spună practic tot ceea ce trebuie să ştiţi despre MySQL. Dar dacă aveţi o întrebare al cărei răspuns nu se găseşte în carte, încotro trebuie să vă îndreptaţi?
între resursele utile sunt incluse siturile de Web pentru programele în raport cu care aveţi nevoie de ajutor:
Pachet Sit Web principal
MySQL http: //www.mysql.com/doc.html
Perl DBI http://www.symbolstone.org/technology/perl/DBI/
PHP http://www.php.net/
Apache http://www.apache.org/
CGI.pm http://stein/cshl.org/WV\IW/software/CGI/
Utilizarea manualului electronic de referinţa MySQL
Nu uitaţi să examinaţi ocazional manualul electronic de referinţă MySQL pentru informaţii privind cele mai recente îmbunătăţiri referitoare la MySQL. Manualul va fi modificat continuu, pe măsura apariţiei de noi schimbări.
Aceste şiruri conţin indicatori spre diferite forme de informaţie, cum ar fi manualele de referinţă, liste cu întrebări frecvente (FAQ) şi liste de corespondenţă:
* Manuale de referinţă
Principala documentaţie inclusă chiar în SQL este manualul de referinţă. Acesta este disponibil în numeroase formate, inclusiv o versiune electronică.
Manualul PHP este disponibil, de asemenea, în mai multe versiuni,- totuşi, versiunea electronică tinde să fie mai completă decât versiunea în format tipărit.
Modulul DBI si driverul său specific pentru MySQL au o documentaţie separată. Documentul DBI conţine concepte de ordin general. Documentul driverului MySQL discută caracteristici specifice sistemului MySQL.
* întrebări frecvente (FAQ)
Există liste FAQ pentru DBI, PHP si Apache.
22
Introducere
• Liste de corespondenţă
Există numeroase liste de corespondenţă orientate spre programele discutate în această) carte. Este o idee bună să vă abonaţi la cele care se referă la instrumentele pe care doriţj să Ie utilizaţi. Vă rugăm să nu uitaţi, totuşi, că trebuie să învăţaţi să folosiţi arhiveld (pentru listele care dispun de asemenea arhive). Dacă sunteţi începător în utilizarea unui instrument, veţi avea multe întrebări care au fost puse (si la care s-a răspuns) de un milion de ori, deci nu aveţi nici un motiv să întrebaţi din nou dacă puteţi găsi răspunsul printr-o căutare rapidă prin arhive.
Instrucţiunile pentru a vă abona la listele de corespondenţă variază, dar puteţi găsî informaţii la adresele URL prezentate aici:
Pachet Instrucţiuni pentru lista de corespondenţa
MySQL http://www.mysql.com/doc.html
Perl DBI http://www.symbolstone.org/technology/perl/DBI/
PHP http://www.php.net/support.php3
Apache http://www.apache.org/foundation/mailinglists.html
• Situri Web subordonate ,
în afara siturilor Web oficiale, unele dintre instrumentele discutate aici dispun de siturj subordonate, care furnizează informaţii suplimentare, cum ar fi cod sursă demonstrativ sau articole centrate pe anumite subiecte. Căutaţi o regiune "Links" (legături) diij situl oficial pe care îl vizitaţi.
PARTEA l
Utilizarea generală a sistemului MySQL
1 Introducere în MySQL şi SQL
2 Lucrul cu date în MySQL şi SQL
3 Sintaxa şi utilizarea SQL în MySQL
4 Optimizarea interogărilor
CAPITOLUL l
Introducere în MySQL şi SQL
Acest capitol constituie o introducere în sistemul de gestiune a bazelor de date relaţionale (SGBDR) MySQL si în limbajul de interogare structurat (SQL) pe care îl înţelege sistemul MySQL. Capitolul prezintă termeni şi concepte fundamentale pe care trebuie să le înţelegeţi, descrie baza de date demonstrativă pe care o vom folosi în exemplele din carte şi conţine un manual care vă indică modul de utilizare a sistemului MySQL pentru a crea o bază de date şi pentru a interacţiona cu aceasta.
începeţi de aici dacă sunteţi un neofit în domeniul bazelor de date şi, poate, nu sunteţi sigur dacă aveţi nevoie sau dacă puteţi folosi o bază de date. De asemenea, trebuie să' citiţi capitolul de faţă dacă nu ştiţi nimic despre MySQL sau SQL şi aveţi nevoie de un! ghid introductiv pentru început. Cititorii cu experienţă în MySQL sau cu sistemele de baze de date pot omite acest material. Totuşi, toată lumea trebuie să citească secţiunea) „O bază de date demonstrativă", deoarece este cel mai bine să fiţi familiarizat cu desti-'
naţia si conţinutul bazei de date pe care o vom folosi în mod repetat pe parcursul cărţii.!
i j
Cum vă poate ajuta MySQL
Această secţiune descrie situaţii în care sistemul de baze de date MySQL poate fi util.. Astfel, vă veţi forma o părere cu privire la tipurile de operaţii pe care le poate efectua MySQL şi la modalităţile în care acest sistem vă poate ajuta. Dacă nu trebuie să vă convingeţi de utilitatea unui sistem de baze de date - poate fiindcă deja aveţi o problems în minte şi doriţi pur si simplu să aflaţi care este modul în care puteţi folosi MySQL pentru a vă ajuta să o rezolvaţi - puteţi trece la secţiunea „O bază de date demonstrativă".
Un sistem de baze de date este, în esenţă, o modalitate de a gestiona liste cu informaţii Informaţiile pot proveni dintr-o varietate de surse. De exemplu, pot reprezenta date de cercetare, înregistrări de afaceri, cereri ale clienţilor, statistici sportive, rapoarte d( vânzări, informaţii despre hobby-urile proprii, înregistrări de personal, rapoarte privim defecţiuni sau notele unor elevi. Totuşi, deşi sistemele de baze de date pot lucra cu gamă largă de informaţii, nu folosiţi un asemenea sistem doar de dragul de a-1 folosi Dacă o sarcină este de la bun început uşor de îndeplinit, nu aveţi nici un motiv de î insera o bază de date numai pentru a o folosi. O listă de cumpărături este un exemplv bun: scrieţi articolele pe care trebuie să le cumpăraţi, le ştergeţi de pe listă atunci când 1< cumpăraţi şi apoi aruncaţi lista. Este puţin probabil să folosiţi o bază de date pentru asta Chiar dacă aveţi un calculator de tip palmtop (care poate fi ţinut în palmă - N.T.) probabil că pentru lista de cumpărături veţi folosi funcţia sa de editare de texte, nu caracteristicile sale de baze de date.
Capitolul 1 Introducere în MySQL şi SQL
25
Puterea unui sistem de baze de date intră în acţiune atunci când informaţiile pe care doriţi să le organizaţi si să le gestionaţi devin voluminoase sau complexe, astfel încât înregistrările dumneavoastră devin prea dificil de manipulat manual. Bazele de date pot fi folosite, desigur, de către mari corporaţii, care prelucrează milioane de tranzacţii zilnic. Dar chiar şi operaţiile la scară mică, care necesită o singură persoană pentru a întreţine informaţii de interes personal, pot necesita o bază de date. Nu este greu să ne gândim la situaţii încarc utilizarea unei baze de date poate fi benefică, deoarece nu trebuie să aveţi cantităţi imense de informaţii înainte ca acele informaţii să devină dificil de gestionat. Să ne gândim la următoarele situaţii:
• întreprinderea dumneavoastră de tâmplărie are numeroşi angajaţi. Trebuie să păstraţi înregistrările cu salariaţi si statele de plată astfel încât să ştiţi pe cine aţi plătit şi când aţi efectuat plata; de asemenea, trebuie să rezumaţi aceste înregistrări pentru a putea remite declaraţiile de venit autorităţilor, în vederea stabilirii impozitelor. De asemenea, trebuie să păstraţi evidenţa sarcinilor pe care compania dumneavoastră a fost angajată să le îndeplinească si salariaţii pe care i-aţi programat să lucreze la fiecare sarcină.
• Sunteţi administratorul unei reţele de depozite cu piese de schimb pentru autoturisme şi trebuie să ştiţi care sunt depozitele care dispun de o anumită piesă în inventar, astfel încât să puteţi onora comenzile clienţilor.
• Ca vânzător de jucării, sunteţi supus cu precădere unei cereri (dependente de capriciile cumpărătorilor) de articole pe care le puteţi transporta. Doriţi să ştiţi care este traiectoria curentă a vânzărilor pentru anumite articole, astfel încât să puteţi estima dacă să măriţi inventarul (pentru un articol care devine mai popular) sau dacă să-1 reduceţi (pentru a nu vă „înţepeni" cu un stoc foarte mare dintr-un produs care nu se mai vinde bine).
• Stiva de date de cercetare pe care le-aţi adunat în cursul mai multor ani trebuie să fie analizată în vederea publicării, pentru ca nu cumva dictonul „publică sau dispari" să devină epitaful carierei dumneavoastră. Doriţi să reduceţi mari cantităţi de date brute pentru a genera informaţii de sumar, precum şi să extrageţi subseturi selectate de observaţii în vederea unei analize statistice mai detaliate.
• Sunteţi un orator cunoscut, care călătoreşte prin ţară pentru a participa la numeroase tipuri de adunări, cum sunt festivităţile de absolvire, întâlnirile de afaceri, întruniri civice si convenţii politice. V-aţi adresat publicului de atâtea ori, încât este dificil să vă amintiţi ce anume aţi spus în fiecare loc unde aţi fost, deci aţi dori să păstraţi înregistrări ale discursurilor dumneavoastră trecute şi să le folosiţi pentru a vă ajuta în planificarea angajamentelor dumneavoastră viitoare. Dacă reveniţi într-un loc unde aţi mai vorbit, nu doriţi să ţineţi un discurs similar cu unul pe care 1-aţi mai ţinut în acel loc, iar o înregistrare a fiecărui loc pe unde aţi fost vă va ajuta să evitaţi repetările. De asemenea^ doriţi să reţineţi modul în care au fost receptate discursurile dumneavoastră. (Monologul dumneavoastră „De ce-mi plac pisicile" de la Metropolitan Kennel Club a fost oarecum un fiasco, deci nu vreţi să faceţi din nou aceeaşi greşeală, daqă reveniţi, acolo.) ,
• Sunteţi un profesor care trebuie să-si păstreze evidenţa notelor date si a prezenţei la curs. De fiecare dată când daţi un test sau un chestionar, înregistraţi nota obţinută de
26 Partea i Utilizarea generală a sistemului MySQL
fiecare elev. Este destul de simplu să scrieţi notele într-un catalog, dar utilizarea ulterioară a notelor este o treabă dificilă. Preferaţi să evitaţi sortarea notelor de la fiecare test pentru a determina distribuţia notelor; de asemenea, preferaţi să nu adunaţi punctajele fiecărui elev atunci când determinaţi mediile finale de la sfârşitul perioadei de notare. Nici numărarea absenţelor fiecărui elev nu are nici un haz.
• Instituţia al cărei secretar sunteţi foloseşte un catalog al membrilor. (Instituţia poate avea orice profil: o societate profesională, un club, o companie cu depozite, o orchestră simfonică sau un club pentru întreţinerea condiţiei fizice.) în fiecare an, generaţi acest catalog în formă scrisă pentru membri, în funcţie de un document creat cu un procesor de texte pe care îl editaţi atunci când informaţiile despre membri se modifică.
V-aţi plictisit să folosiţi catalogul în acest mod, deoarece limitează modurile de utilizare a acestuia. Sortarea intrărilor în diferite moduri este dificilă si nu puteţi selecta cu uşurinţă numai anumite părţi ale fiecărei intrări (cum ar f i o listă alcătuită numai din nume si numere de telefon). Nici nu puteţi descoperi uşor un subset de membri, cum sunt aceia care trebuie să-si plătească în curând cotizaţia; dacă aţi putea, aţi elimina necesitatea de a căuta lunar în diferite rubrici pentru a-i găsi pe acei membri cărora trebuie să li se trimită înştiinţări pentru plata cotizaţiei.
De asemenea, doriţi efectiv să evitaţi să editaţi personal catalogul, dar bugetul societăţii este limitat, iar angajarea unei alte persoane este în afara oricărei discuţii. Aţi auzit despre „biroul fără hârtii" care ar rezulta din întreţinerea electronică a înregistrărilor, dar încă nu aţi „simţit" nici un avantaj al acestuia, înregistrările pentru fiecare membru sunt în format electronic dar, ironic, nu se află într-o formă care poate fi folosită cu uşurinţă în orice scop, mai puţin generarea de hârtii prin tipărirea catalogului membrilor!
Aceste scenarii variază de la situaţii care implică mari cantităţi de informaţii si până la cazuri cu un volum de informaţii relativ redus. Elementul comun este existenţa unor operaţii care pot fi efectuate manual, dar care pot fi executate mai eficient de către un sistem de baze de date.
Care sunt avantajele concrete pe care trebuie să le aşteptaţi din utilizarea unui sistem de baze de date precum MySQL? Aceasta depinde de necesităţile şi cerinţele dumneavoas- i tră specifice, iar acestea sunt extrem de variate, aşa cum s-a arătat în exemplele prece- j dente. Să examinăm un tip de situaţie care survine frecvent şi care astfel este destul de j reprezentativ pentru utilizarea bazelor de date.
Sistemele de gestiune a bazelor de date sunt frecvent utilizate pentru executarea unor operaţii cum sunt cele pentru care se folosesc fişierele (nu cele electronice - N.T.). într-adevăr, o bază de date este un fişier de mari dimensiuni din anumite puncte de vedere, dar un fişier cu un sistem de fişare încorporat. Păstrarea prin metode electronice a înregistrărilor prezintă câteva avantaje importante faţă de păstrarea manuală a înregistrărilor. De exemplu, i dacă lucraţi într-un birou în care sunt păstrate înregistrările clienţilor, iată câteva modalităţi în care MySQL vă poate ajuta:
• lîmp redus de fişare a înregistrării. Nu trebuie să căutaţi în sertarele fişierelor pentru a determina unde să puneţi o nouă înregistrare, „înmânaţi" înregistrarea sistemului de fişare si îi permiteţi să plaseze înregistrarea la locul potrivit pentru dumneavoastră.
Capitolul 1 Introducere în MySQL şi SQL
27
• Timp redus de regăsire a înregistrării. Când căutaţi înregistrări, nu căutaţi personal în fiecare înregistrare pentru a le găsi pe cele care conţin informaţiile dorite. Să presupunem că lucraţi într-un cabinet stomatologic. Dacă doriţi să trimiteţi înştiinţări tuturor pacienţilor care nu s-au prezentat la control de mai mult timp, cereţi sistemului de fişare să găsească înregistrările adecvate. Desigur, veţi proceda altfel decât dacă aţi vorbi cu o altă persoană. Acesteia i-aţi spune: „Fii amabil si află care sunt pacienţii care nu s-au prezentat la control în ultimele 6 luni." în faţa unei baze de date, emiteţi o incantaţie bizară:
SELECT nume, prenume, ultima_vizita FROM pacient WHERE ultima_vizita<DATE_SUB(CURRENT_DATE, INTERVAL B MONTH) Această expresie vă poate intimida dacă nu aţi mai văzut-o niciodată, dar perspectiva de a obţine rezultate în câteva secunde, fără a mai căuta o oră încheiată, ar trebui să fie atrăgătoare, (în orice caz, nu vă îngrijoraţi. Bălmăjeala aia stranie nu vă va mai părea ciudată pentru multă vreme. De fapt, veţi înţelege exact ce înseamnă când veţi termina de citit acest capitol.)
• Ordine de regăsire flexibilă. Nu trebuie să regăsiţi înregistrări în funcţie de ordinea fixă în care le stocaţi (în funcţie de numele de familie al pacientului, de exemplu). Puteţi cere sistemului de fişare să extragă înregistrări sortate în orice ordine preferaţi: după numele de familie, numele companiei de asigurări, data ultimei vizite şi altele.
• Format flexibil al datelor de ieşire. După ce aţi descoperit înregistrările care vă interesează, nu trebuie să copiaţi informaţiile manual. Puteţi cere sistemului de fişare să genereze automat o listă. Uneori doriţi numai să tipăriţi informaţiile. Alteori, doriţi să le folosiţi într-un alt program. (De exemplu, după ce generaţi lista cu pacienţii întârziaţi la control, puteţi insera această informaţie într-un procesor de texte care tipăreşte note pe care le puteţi trimite acestor pacienţi.) Sau vă interesează numai informaţii de sumar, cum ar fi numărul înregistrărilor selectate. Nu trebuie să le număraţi personal; sistemul de fişare poate genera automat sumarul.
• Acces simultan la înregistrări pentru mai mulţi utilizatori. Cu înregistrările tipărite, dacă două persoane doresc să caute o înregistrare în acelaşi timp, a doua persoană trebuie să aştepte ca prima să pună înregistrarea înapoi. MySQL oferă posibilitatea accesului de către mai mulţi utilizatori, astfel încât amândoi să poată avea acces simultan la înregistrare.
• Acces de la distanţă la înregistrări şi transmiterea electronică a acestora, înregistrările tipărite vă impun să vă aflaţi în punctul de amplasare a acestora, sau trebuie ca o persoană să execute copii ale înregistrărilor si să vi le trimită, înregistrările electronice creează posibilitatea de acces de la distanţă la înregistrări sau posibilitatea de transmitere electronică a acestora. Dacă grupul dumneavoastră de medici stomatologi are asociaţi în filiale, aceşti asociaţi pot avea acces la înregistrările dumneavoastră de la sediile proprii. Nu trebuie să le trimiteţi copii prin curier. Dacă o persoană care are nevoie de înregistrări nu dispune de acelaşi tip de program de baze de date ca dumneavoastră, dar are un program de poştă electronică, puteţi selecta înregistrările dorite şi le puteţi trimite conţinutul pe cale electronică.
28 Partea l Utilizarea generală a sistemului MySQL
Dacă aţi mai folosit sisteme de gestiune a bazelor de date, deja sunteţi la curent cu avantajele descrise anterior şi probabil vă gândiţi să depăşiţi etapa aplicaţiilor uzuale de tip „înlocuire a fiselor pe hârtie". Sistemele de baze de date sunt acum folosite pentru a oferi: servicii în moduri care nu erau posibile în trecutul apropiat. Modul în care multe instituţii folosesc o bază de date în conjuncţie cu un sit Web este un bun exemplu.
Să presupunem că firma dumneavoastră are o bază de date inventar care este folosită de personalul de la biroul de service atunci când clienţii sună să afle dacă aveţi sau nu un articol în stoc, precum şi preţul acestuia. Aceasta este o utilizare relativ tradiţională a unei baze de date. Totuşi, dacă firma dumneavoastră alcătuieşte un sit Web pentru a fi vizitat de clienţi, puteţi oferi un serviciu suplimentar, si anume o pagină de căutare care l permite clienţilor să determine preţul şi prezenţa în stoc a unui produs. Acest lucru oferă j clienţilor informaţiile pe care le doresc, iar modul în care le oferiţi constă în căutarea automată a informaţiilor de inventar stocate în baza de date, pentru a se găsi articolele în chestiune. Clientul obţine informaţia imediat, fără a fi pus „în aşteptare" şi obligat să asculte o muzică înregistrată agasantă si fără a fi obligat să respecte orele de funcţionare a biroului de service. Fiecare client care foloseşte situl dumneavoastră de Web înseamnă un apel telefonic în minus de rezolvat de către o persoană de la biroul de asistenţă. (Poate că astfel situl Web îşi amortizează investiţia.)
Puteţi utiliza baza de date chiar mai bine. Cererile bazate pe Web de căutare în inventar pot furniza informaţii nu numai clienţilor, dar si dumneavoastră. Interogările vă arată ce anume caută clienţii, iar rezultatele interogărilor vă arată dacă sunteţi sau nu în măsură să le satis-faceţi cererile. Dacă nu averi ceea ce caută clienţii, riscaţi să pierdeţi afacerea. Deci, este logic să înregistraţi informaţii despre căutările în inventar, si anume produsele căutate de clienţi, respectiv dacă le aveţi sau nu în stoc. Apoi, puteţi folosi aceste informaţii pentru a vă ajusta inventarul si pentru a asigura clienţilor dumneavoastră servicii mai bune.
O altă aplicaţie recentă pentru bazele de date este deservirea publicităţii pe manşete în paginile Web. Nici mie nu-mi plac aceste reclame mai mult decât dumneavoastră, dar nu e mai puţin adevărat că reprezintă o aplicaţie populară pentru MySQL, care poate fi folosit pentru stocarea reclamelor şi regăsirea lor în vederea afişării de către un server Web. De asemenea, MySQL poate executa operaţiile de evidenţă a înregistrărilor asociate deseori acestei activităţi, urmărind reclamele care au fost afişate, numărul de afişări, siturile care au obţinut accesul la acestea etc.
Deci, cum funcţionează MySQL? Cea mai bună modalitate de a afla este de a încerca personal, iar pentru aceasta vom avea nevoie de o bază de date de lucru.
O bază de date demonstrativă
Această secţiune descrie baza de date demonstrativă pe care o vom folosi pe tot parcursul volumului de faţă. Vă este oferită o sursă de exemple pe care le puteţi încerca pe măsură ce învăţaţi să utilizaţi MySQL. Vom extrage exemple mai ales din două dintre situaţiile prezentate anterior:
• Scenariul de organizare cu secretarul. Avem nevoie de ceva mai bine definit decât o „instituţie", deci voi crea una cu următoarele caracteristici: este compusă din persoane care au în comun o afinitate pentru istoria Statelor Unite (denumită, în lipsa unui
Capitolul 1 Introducere în MySQL şi SQL 29
nume mai bun, Liga istorică americană). Membrii îşi păstrează această calitate prin reînnoirea afilierii, plătind o cotizaţie. Cotizaţiile sunt alocate cheltuielilor Ligii, cum ar fi publicarea unui buletin de ştiri, denumit „Cronici ale trecutului SUA". De asemenea, Liga dispune de un mic sit Web, dar acesta nu este foarte dezvoltat. Până acum, situl a fost limitat la informaţii elementare, legate de scopurile Ligii, identitatea persoanelor din conducere şi modul de înscriere în organizaţie.
• Scenariul de evidenţă a rezultatelor şcolare. Pe durata perioadei de notare, administraţi chestionare şi teste, înregistraţi punctaje şi daţi note. După aceea, determinaţi notele finale, pe care le predaţi secretariatului şcolii alături de o situaţie a prezenţei elevilor.
Acum, să examinăm mai îndeaproape aceste situaţii din punctul de vedere a două cerinţe:
• Trebuie să decideţi ce anume doriţi să obţineţi cu baza de date; cu alte cuvinte, scopurile pe care doriţi să le atingeţi.
• Trebuie să determinaţi ce anume veţi insera în baza de date; cu alte cuvinte, datele a căror evidenţă doriţi să o păstraţi.
Poate părea ciudat să ne gândim la rezultatele unei baze de date înainte de a avea în vedere datele ce trebuie introduse în aceasta. La urma urmelor, trebuie să introduceţi date înainte de a le putea regăsi. Dar modul de utilizare a unei baze de date este determinat de scopurile dumneavoastră, iar acestea sunt asociate mai strâns cu rezultatele bazei de date decât cu datele inserate în aceasta, în mod categoric nu doriţi să irosiţi timp si efort inserând informaţii într-o bază de date, decât dacă intenţionaţi să le folosiţi într-un anume scop în viitor.
Liga istorică americană
Situaţia iniţială a acestui scenariu este aceea că dumneavoastră, ca secretar al Ligii, administraţi lista cu membri folosind un document creat cu un procesor de texte. Această situaţie este adecvată pentru generarea unui catalog tipărit, dar reduce posibilităţile de utilizare a informaţiilor în alte moduri. Aveţi în vedere următoarele obiective:
• Doriţi să puteţi produce date de ieşire din catalog în diferite formate, folosind numai informaţii adecvate aplicaţiei. Un deziderat este posibilitatea de a genera catalogul tipărit în fiecare an - o cerinţă din trecut a Ligii, pe care dumneavoastră intenţionaţi să continuaţi a o îndeplini. Vă puteţi gândi şi la alte utilizări pentru informaţiile din catalog - de exemplu, de a furniza lista membrilor actuali pentru programul editat cu ocazia banchetului anual al Ligii. Aceste aplicaţii implică diferite seturi de informaţii. Catalogul tipărit foloseşte întregul conţinut al intrării corespunzătoare fiecărui membru. Pentru programul de la banchet, trebuie să extrageri numai numele membrilor (operaţie deloc uşoară dacă se foloseşte un procesor de texte).
• Doriţi să căutaţi în catalog pe acei membri ale căror intrări satisfac diferite criterii. De exemplu, doriţi să ştiţi care sunt membrii care trebuie să-si plătească în curând cotizaţia. O altă aplicaţie care necesită căutări apare din lista de cuvinte cheie aferentă fiecărui membru (de exemplu Războiul de Secesiune, criza din Wall Street, drepturile civile sau viaţa lui Thomas Jefferson). Uneori, unii membri vă cer o listă a altor membri cu interese similare cu ale lor, iar dumneavoastră doriţi să puteţi satisface aceste cereri.
30
Partea l Utilizarea generală a sistemului MySQL
• Doriţi să plasaţi catalogul pe Internet, în situl Web al Ligii, ceea ce ar fi avantajos atât pentru membrii Ligii, cât si pentru dumneavoastră. Dacă puteţi converti catalogul în pagini Web printr-un proces oarecare cu un grad adecvat de automatizare, o versiune on-line a catalogului poate fi menţinută „la zi" într-o manieră mai oportună decât versiunea tipărită. Iar dacă în acest catalog electronic se pot efectua căutări, membrii pot căuta personal informaţii, cu uşurinţă. De exemplu, un membru care doreşte să ştie care sunt membrii interesaţi de Războiul de Secesiune poate afla această informaţie fără a fi nevoit să vă aştepte să efectuaţi căutarea, iar dumneavoastră nu veţi mai avea nevoie să găsiţi timp pentru a efectua personal căutarea.
Sunt perfect conştient de faptul că o bază de date nu este cel mai interesant lucru din lume, deci n-am de gând să fac cine ştie ce afirmaţii trăsnite, cum că o bază de date stimulează gândirea creatoare. Totuşi, dacă încetaţi să asimilaţi informaţiile ca fiind o entitate cu care trebuie să luptaţi (aşa cum faceţi cu documentul dumneavoastră creat cu procesorul de texte) şi începeţi să le asimilaţi cu o entitate pe care o puteţi manipula relativ uşor (aşa cum speraţi să procedaţi cu SQL), acest lucru va avea un efect eliberator asupra capacităţii dumneavoastră de a veni cu noi modalităţi de a folosi sau de a prezenta acele informaţii:
• Dacă informaţiile din baza de date pot fi mutate în situl Web sub forma unui catalog electronic, puteţi face ca informaţiile să se „scurgă" si în sens invers. De exemplu, dacă membrii îşi pot edita propriile rubrici on-line pentru a actualiza baza de date, nu mai este necesar să efectuaţi personal toate modificările şi astfel s-ar contribui la sporirea acurateţei informaţiilor din catalog.
• Dacă aţi stocat adrese de e-mail în baza de date, le puteţi folosi pentru a trimite mesaje e-mail membrilor care nu si-au mai actualizat rubricile în ultimul timp. Mesajele pot indica membrilor conţinutul curent al rubricii lor, le pot cere să-1 reînnoiască şi pot indica modalitatea de efectuare a diferitelor modificări, folosind facilităţile furnizate pe situl Web.
• O bază de date poate contribui la sporirea utilităţii unui sit Web în moduri care nu au nici cea mai mică legătură cu lista membrilor. Liga publică un buletin de ştiri, „Cronici ale trecutului SUA", care are în fiecare număr o secţiune dedicată copiilor, ce conţine un chestionar pe teme istorice. Unele dintre numerele recente s-au concentrat asupra unor date biografice ale preşedinţilor americani. Situl Web poate include de asemene; o secţiune pentru copii, unde chestionarele sunt puse on-line. Această secţiune poa căpăta, eventual, un caracter interactiv, prin inserarea în baza de date a informaţiilo care au stat la baza chestionarelor si determinând serverul Web să interogheze baza de date în căutarea unor întrebări care vor fi prezentate aleator.
Bun! în acest moment, numărul de utilizări pentru baza de date la care v-aţi gândit vz poate duce la concluzia că v-aţi cam lăsat dus de val. După o scurtă pauză pentru a reveni din nou pe Pământ, începeţi să vă puneţi unele întrebări practice:
• Nu e puţin cam prea ambiţios? Nu e cam multă muncă pentru toate astea? Orice pars mai uşor atunci când doar vă gândiţi si nu puneţi în practică, desigur, iar eu nu mă voi preface spunând că toate acestea sunt banal de implementat. Totuşi, la finele acestei cărţi veţi fi realizat deja tot ce am amintit anterior. Reţineţi un singur lucru: nu eşti
l d
e,
s
Capitolul 1 Introducere în MySQL şi SQL 31
necesar să faceţi totul deodată. Vom împărţi sarcina în componente şi vom aborda fiecare componentă în parte.
• Poate face MySQL toate astea? Nu, nu poate. De exemplu, MySQL nu dispune de caracteristici directe pentru interacţiunea cu Web-ul. Totuşi, chiar dacă MySQL nu poate face singur tot ceea ce am discutat, există alte instrumente care pot colabora cu MySQL pentru a-i completa si extinde posibilităţile.
Vom folosi limbajul de scripting Perl şi modulul Perl DBI (interfaţă cu bazele de date) pentru a scrie scripturi care obţin acces la bazele de date MySQL. Perl dispune de excelente posibilităţi de prelucrare a textelor, care permit manipularea rezultatelor unei interogări într-o manieră extrem de flexibilă, pentru a obţine date de ieşire într-o varietate de formate. De exemplu, putem folosi Perl pentru a genera catalogul în format Rich Text Format (RTF), un format care poate fi citit de către toate categoriile de procesoare de texte.
De asemenea vom folosi PHP, un alt limbaj de scripting. PHP este adaptat pentru scrierea aplicaţiilor Web şi lucrează cu bazele de date. Acesta vă permite să rulaţi interogări MySQL direct din paginile Web şi să generaţi pagini noi, care includ rezultatele interogărilor bazelor de date. PHP colaborează bine cu Apache (cel mai popular server Web din lume), simplificând efectuarea unor operaţii precum prezentarea unui formular de căutare şi afişarea rezultatelor căutării.
MySQL se integrează bine cu aceste instrumente şi vă oferă flexibilitatea de a le combina în funcţie de preferinţele dumneavoastră, optând pentru realizarea scopurilor scontate.
Nu sunteţi obligat să folosiţi componentele unui singur set de programe cu posibilităţi de integrare clamate pe toate tonurile, dar care nu pot funcţiona bine decât unele cu altele.
• In final, marea întrebare: cât vor costa toate acestea? La urma urmelor, Liga are un buget limitat. S-ar putea să vă surprindă, dar probabil că nu va costa nimic. Dacă sunteţi un cunoscător al sistemelor de baze de date, atunci ştiţi că sunt destul de costisitoare. Prin contrast, MySQL este de regulă gratuit. Există unele situaţii când aveţi nevoie de o licenţă, dar aceasta costă numai 200 de dolari pentru un număr nelimitat de utilizatori. (Vezi prefaţa pentru îndrumări generale privind licenţa, precum şi manualul de referinţă MySQL pentru detalii concrete.) Celelalte instrumente pe care le vom folosi (Perl, DBI, PHP, Apache) sunt gratuite deci, dacă ţinem cont de toate aspectele, puteţi alcătui un sistem util fără nici o cheltuială.
Alegerea sistemului de operare pentru dezvoltarea bazei de date vă aparţine. Toate programele pe care le vom discuta rulează sub UNIX, iar majoritatea lor rulează sub Windows. Eu vă recomand să folosiţi MySQL si celelalte instrumente sub UNIX. Toate instrumentele îşi au originea în UNIX si de acolo au fost portate ulterior spre Windows, Hind desfăşurate mai frecvent în UNIX decât în Windows. Aceasta înseamnă că versiunile Windows au avut o perioadă de maturizare mai scurtă şi că nu au fost testate şi utilizate atât de aprofundat ca versiunile sub UNIX.
Acum, să abordăm şi cealaltă situaţie pentru care vom folosi baza de date demonstrativă.
32 Partea l Utilizarea generală a sistemului MySQL
Proiectul de evidenţă a rezultatelor şcolare
Scenariul iniţial în acest caz este acela că, în calitate de profesor, aveţi şi responsabilităţ legate de evidenţa rezultatelor şcolare. Doriţi să convertiţi procesul de calcul al noteloi de la o operaţie manuală (folosind un catalog şcolar) la o reprezentare electronică folosind MySQL, în acest caz, rezultatele pe care doriţi să le obţineţi cu baza de dât< sunt implicite, prin modul în care folosiţi catalogul în prezent:
• Pentru fiecare chestionar sau test, înregistraţi punctajele. Pentru teste, puneţi puncta jele în ordine, astfel încât să le puteţi examina si determina ajustările pentru fiecan notă literală (A, B, C, D, E şi F).
• La finalul perioadei de notare, calculaţi punctajul total al fiecărui elev, apoi sortaţi rezultatele totale şi determinaţi notele în funcţie de acestea. Rezultatele totale pot necesita calcule cu ponderi, deoarece doriţi să acordaţi testelor o importanţă mai mare decât chestionarelor.
• La sfârşitul perioadei de notare, furnizaţi secretariatului şcolii informaţii despre pre zenţa elevilor la curs.
Obiectivele sunt de a evita sortarea manuală şi totalizarea manuală a punctajelor si a evi denţelor privind prezenţa. Cu alte cuvinte, doriţi ca MySQL să sorteze punctajele si s; efectueze calculele necesare pentru a determina punctajul total al fiecărui elev si numărul de absenţe la încheierea perioadei de notare. Pentru a realiza aceste deziderate, veţi ave nevoie de lista elevilor din clasă, de punctajele pentru fiecare chestionar şi test, precum si datele la care elevul a lipsit.
Cum se poate aplica baza de date demonstrativă în cazul dumneavoastră
Dacă nu vă interesează în mod deosebit Liga istorică sau evidenţa rezultatelor şcolare vă puteţi întreba ce legătură au toate acestea cu dumneavoastră. Răspunsul este că aceste scenarii-exemplu nu sunt un scop în sine. Acestea nu fac decât să furnizeze un vehicu prin care să se poată ilustra operaţiile posibile cu MySQL si cu instrumentele asociat acestuia.
Cu puţină imaginaţie, veţi vedea cum exemplele de interogări ale bazelor de date s aplică problemelor specifice pe care doriţi să le rezolvaţi. Să presupunem că lucraţi î acel cabinet stomatologic de care am vorbit anterior. Nu veţi vedea în această carte pre multe interogări din domeniul stomatologic, dar veţi observa că multe dintre interogăr se pot aplica propriilor dumneavoastră interese. De exemplu, determinarea acelor mem bri ai Ligii istorice care trebuie să-şi achite în curând cotizaţiile este similară cu deter^ minarea pacienţilor care n-au mai trecut de mult pe la dentist. Ambele sunt interogăr bazate pe date deci, o dată ce aţi învăţat să scrieţi interogarea de determinare a perj soanelor ce au de plătit cotizaţia, o puteţi aplica pentru a scrie interogarea de depistare a pacienţilor „delincvenţi", care vă interesează mai mult.
Capitolul 1 Introducere în MySQL şi SQL 33
O terminologie esenţială a bazelor de date
Poate aţi observat că aţi citit deja mai multe pagini dintr-o carte despre baze de date si încă nu aţi dat peste terminologia si jargonul de specialitate. De fapt, încă nu am spus nimic despre modul în care arată efectiv o „bază de date", chiar dacă avem o idee brută cu privire la modul în care va fi folosită baza noastră de date demonstrativă. Totuşi, suntem pe cale să proiectăm acea bază de date, după care vom începe să o implementăm, deci nu mai putem evita terminologia. Acesta este şi scopul secţiunii de faţă: să descrie unii termeni care apar pe parcursul cărţii, pentru ca dumneavoastră să-i cunoaşteţi. Din fericire, multe concepte legate de bazele de date relaţionale sunt, în realitate, foarte simple. De fapt, o bună parte din atractivitatea bazelor de date provine din simplitatea conceptelor lor fundamentale.
Terminologie structurală
în lumea bazelor de date, MySQL este clasificat ca sistem de gestiune a bazelor de date relaţionale (SGBDR). Această expresie poate fi divizată după cum urmează:
• Baza de date (literele BD din abrevierea SGBDR) constituie depozitul pentru informaţiile pe care doriţi să le stocaţi, structurat într-un mod simplu, obişnuit:
• Colecţia de date dintr-o bază de date este organizată în tabele.
• Fiecare tabel este organizat în rânduri şi coloane.
• Fiecare rând dintr-un tabel este considerat o înregistrare.
• înregistrările pot conţine mai multe componente de informaţie; fiecare coloană dintr-un tabel corespunde uneia din aceste componente.
• Sistemul de gestiune (literele SG) este programul care vă permite să vă folosiţi datele prin inserarea, regăsirea, modificarea sau ştergerea înregistrărilor.
• Cuvântul „relaţional" (iniţiala R) indică un anumit tip de SGBD, adică unul care se pricepe foarte bine la relaţionarea (în speţă coroborarea) informaţiilor stocate într-un tabel cu informaţiile stocate într-un alt tabel, prin căutarea elementelor comune din fiecare tabel. Puterea unui SGBD relaţional constă în capacitatea sa de a extrage în mod convenabil date din aceste tabele si de a combina informaţii din tabele corelate pentru a genera răspunsuri la întrebări la care nu se poate răspunde numai pe baza tabelelor individuale.
Iată un exemplu care prezintă modul în care o bază de date relaţională organizează datele în tabele si corelează informaţiile dintr-un tabel cu un alt tabel. Să presupunem că administraţi un sit Web care include un serviciu de publicitate pe manşete. Stabiliţi contracte cu companiile care doresc ca reclamele lor să fie afişate atunci când sunt vizitate paginile din situl dumneavoastră. De fiecare dată când un vizitator deschide una din paginile dumneavoastră, furnizaţi reclama înglobată în pagină browserului vizitatorului şi percepeţi companiei o mică taxă. Pentru a reprezenta aceste informaţii, folosiţi trei tabele (vezi figura 1.1). Un tabel, company (companie) are coloane pentru numele com-paniei, numărul, adresa si numărul de telefon. Un alt tabel, ad (reclamă), prezintă numerele reclamelor, numărul companiei care „deţine" reclama şi tariful pe care îl percepeţi
34 Partea l Utilizarea generală a sistemului MySQL
pentru fiecare deschidere a paginii. Cel de-al treilea tabel, hits (reuşite) conţine evident
citirii reclamelor în funcţie de numărul reclamei şi de data la care a fost furnizată reclam
company table
companyjiame
companyjium add
ress phone
Big deal, Ltd. Pickles, Inc. Real Roofing Co. GigaFred & Son
13
C5>
17 23
14 Gram -i 59Cucu 928 Shir 2572 Fa
i Blvd. 875-2934 mber Dr. 884-2472 tgles Rd. 882-4173 milyAve. 847-4738
ad table
conpany_nun
ad HUB
hitjee
14 23 17 13 23 23 23 13 23 14 13 17
diD>— i
49 52 55 62 63 64 77 99
Cjoj>i
102 119
0.01 0.02 0.01 0.03 0.02 0.01 0.02 0.03 0.03 0.01 0.01 0.02
hit table
ad_nun
date
49 55 48 63 101 62 119 102 52
July 13 July 13 July 14 July 14 July 14 July 14 July 14 July 14 July 14 July 14 July 14 July 14 July 14 July 14 July 15 July 15 July 15 July 15
64 119 48
mi
63 49 77 99
Figura 1.1 Tabele pentru evidenţa reclamelor pe manşete.
Din aceste informaţii, se poate răspunde la unele întrebări folosind un singur tab« Pentru a determina numărul de companii cu care aveţi contracte, trebuie numai număraţi rândurile din tabelul company. Similar, pentru a determina numărul de reuşi (citiri) într-o anumită perioadă de timp, este necesară numai examinarea tabelului Alte întrebări sunt mai complexe şi este necesară consultarea mai multor tabele peni a determina răspunsurile. De exemplu, pentru a determina de câte ori a fost servii fiecare reclamă a companiei Pickles, Inc. pe data de 14 iulie, veţi folosi toate cele t: tabele, după cum urmează:
Capitolul 1 Introducere în MySQL şi SQL
35
1. Căutaţi numele companiei (Pickles, Inc.) în tabelul company pentru a determina numărul companiei.
2. Folosiţi numărul companiei pentru a descoperi înregistrările corespunzătoare în tabelul ad pentru a determina numerele asociate ale reclamelor. Există două asemenea reclame, în speţă 48 şi 101.
3. Pentru fiecare dintre înregistrările echivalente din tabelul ad, folosiţi numărul reclamei din înregistrare pentru a descoperi înregistrările corespunzătoare din tabelul hit care se încadrează la data respectivă, după care număraţi echivalenţele. Există trei echivalenţe pentru reclama 48 şi două echivalenţe pentru reclama 101.
Pare complicat, dar acesta este chiar domeniul în care excelează sistemele de baze de date relaţionale. Complexitatea este de fapt oarecum iluzorie, deoarece fiecare din etapele descrise anterior reprezintă ceva mai mult decât o simplă operaţie de echivalare: stabiliţi o corelaţie între un tabel si alt tabel prin echivalenţe între valorile din rândurile unui tabel cu valorile din rândurile unui alt tabel. Aceeaşi operaţie simplă poate fi exploatată în diferite moduri, pentru a se răspunde la toate categoriile de întrebări: Câte reclame diferite are fiecare companie? Care este compania cu reclamele cele mai populare? Care este venitul pe care îl aduce fiecare reclamă? Care este onorariul total ce trebuie plătit de fiecare companie pentru perioada de tarifare curentă?
Acum ştiţi suficientă teorie privind bazele de date relaţionale pentru a înţelege restul cărţii, motiv pentru care nu trebuie să vorbim despre a treia formă normală, diagrame entitate-relaţie şi alte chestii de acest gen. Dacă chiar doriţi să aflaţi detalii despre aceste lucruri, este excelent, dar aţi greşit cartea. Vă propun să începeţi prin a consulta autori ca C.J. Date sau E.F. Codd.
Terminologia limbajului de interogare
Pentru a comunica cu MySQL, folosiţi un limbaj denumit SQL (Structured Query Language - limbaj de interogare structurat). SQL este în prezent limbajul standard pentru baze de date şi este acceptat de toate sistemele importante de baze de date. SQL include numeroase categorii diferite de instrucţiuni, toate fiind concepute pentru a vă permite să interacţionaţi cu baza dumneavoastră de date în moduri interesante şi utile.
Ca orice alt limbaj, SQL poate părea ciudat atunci când îl învăţaţi pentru prima dată. De exemplu, pentru a crea un tabel, trebuie să indicaţi sistemului MySQL care va fi structura tabelului. Dumneavoastră şi cu mine ne gândim la un tabel ca la o diagramă sau o imagine, dar MySQL nu, deci veţi crea tabelul indicând sistemului MySQL ceva de genul acesta:
CREATE TABLE companie (
nume_companie CHAR(30),
nr_companie INT,
adresa CHAR(30),
telefon CHAR(12)
36 Partea l Utilizarea generală a sistemului MySQL
Dacă sunteţi începător în domeniul SQL, instrucţiuni ca acestea pot părea oarecun impunătoare, dar nu trebuie să fiţi programator pentru a învăţa să folosiţi SQL în mo< eficient. Pe măsură ce vă familiarizaţi cu limbajul, veţi privi instrucţiunea CREATE TABLI într-o altă lumină - ca pe un aliat care vă ajută să vă descrieţi informaţiile, nu ca pe < bălmăjeală ciudată.
Terminologia folosită în arhitectura sistemului MySQL
Când folosiţi MySQL, în realitate utilizaţi două programe, deoarece MySQL opereaz folosind o arhitectură client/server:
• Serverul de baze de date este un program localizat în calculatorul unde sunt stocaţi datele dumneavoastră. Acesta ascultă cererile clienţilor care sosesc prin reţea si obţin< acces la conţinutul bazei de date în funcţie de aceste cereri, pentru a furniza clienţilo informaţiile pe care le solicită.
• Clienţii sunt programe care se conectează la serverul de baze de date şi emit interogări pentru a-i indica acestuia informaţiile pe care le doresc.
Distribuţia MySQL include serverul si numeroase programe client. Clienţii sunt utilizat în funcţie de scopurile urmărite. Cel mai folosit program este mysql, un client interacth care vă permite să emiteţi interogări şi să vedeţi rezultatele. Alţi clienţi sunt mysqldump s mysqlimport, care trimit conţinutul tabelelor într-un fişier şi invers, respectiv mysqladmin care vă permite să verificaţi starea serverului si execută operaţii administrative, cum ar : solicitarea de oprire a serverului. Dacă aveţi aplicaţii pentru care utilizarea clienţilor standard nu este adecvată, MySQL mai furnizează o bibliotecă de programare a clienţilor, ăst fel încât dumneavoastră să vă puteri scrie propriile programe. Biblioteca este utilizabil direct din programele C, după cum există si numeroase alte interfeţe, dacă preferaţi limbaj decât C.
Arhitectura client/server din MySQL are anumite avantaje:
• Serverul asigură controlul concurenţei, pentru ca doi utilizatori să nu poată mo difica aceeaşi înregistrare simultan. Toate cererile clienţilor trec prin server, dec serverul determină clientul care execută cutare operaţie si când o execută. Dacă mă mulţi clienţi doresc simultan accesul la acelaşi tabel, ei nu sunt obligaţi să se găseasc si să negocieze unii cu alţii. Ei îşi trimit cererile la server şi îl lasă pe acesta să se ocup de determinarea ordinii în care vor fi onorate cererile.
• Nu trebuie să deschideţi sesiunea de lucru la calculatorul unde este conectată baz dumneavoastră de date. MySQL „ştie" să lucreze prin Internet, deci puteţi rula u program client de oriunde vă aflaţi, iar clientul se poate conecta la server prin reţea Distanţa nu contează; puteţi obţine acces la server din orice parte a lumii. Dac serverul se află pe un calculator din Australia, vă puteţi lua calculatorul laptop într-călătorie în Islanda si tot puteţi obţine acces la baza dumneavoastră de date.
Aceasta înseamnă oare că oricine poate avea acces la datele dumneavoastră, prin Internet Nu. MySQL include un sistem flexibil de securitate, deci puteţi permite accesul numi persoanelor îndrituite să beneficieze de el. De asemenea, vă puteţi asigura că aceste per soane pot face numai ceea ce trebuie să facă. Poate că Sally de la biroul de facturare tre buie să poată citi şi actualiza (modifica) înregistrările, în timp ce Phil de la biroul de ser
Capitolul 1 Introducere în MySQL şi SQL
37
vice trebuie să poată numai să citească înregistrările. Le puteţi stabili privilegiile în consecinţă. Dacă doriţi să rulaţi un sistem autonom, pur si simplu stabiliţi privilegiile de acces astfel încât clienţii să se poată conecta numai de la gazda pe care rulează serverul.
Un manual MySQL
Acum, aveţi toate cunoştinţele necesare; este momentul să puneţi MySQL la lucru!
Această secţiune vă va ajuta să vă familiarizaţi cu MySQL, propunându-vă un manual pe care să-1 încercaţi. In timp ce parcurgeţi manualul, veţi crea o bază de date demonstrativă şi tabelele care o compun, apoi veţi interacţiona cu baza de date prin adăugarea, regăsirea, ştergerea şi modificarea informaţiilor, în plus, pe durata lucrului cu baza de date demonstrativă, veţi învăţa următoarele aspecte:
• Cum să comunicaţi cu un server MySQL folosind programul client mysql.
• Elementele fundamentale ale limbajului SQL pe care MySQL le înţelege, (în cazul în care cunoaşteţi deja SQL din utilizarea unui alt SGBDR, este o idee bună să parcurgeţi rapid acest manual, pentru a vedea dacă versiunea SQL a sistemului MySQL diferă de versiunea pe care o cunoaşteţi.)
Aşa cum s-a arătat în secţiunea anterioară, MySQL operează folosind o arhitectură client/server, în cadrul căreia serverul rulează pe calculatorul care conţine bazele de date, iar clienţii se conectează la server printr-o reţea. Acest manual se bazează în cea mai mare parte pe utilizarea programului client mysql. Clientul citeşte interogările SQL emise de dumneavoastră, le trimite serverului pentru a fi executate si afişează rezultatele, pentru ca dumneavoastră să puteţi vedea ce s-a întâmplat, mysql rulează pe toate platformele acceptate de MySQL şi constituie metoda cea mai directă de a interacţiona cu serverul, deci este logic să începem cu acest client.
Pe parcursul acestei cărţi, vom folosi samp_db ca nume al bazei noastre de date demonstrative. Uneori, va fi necesar să folosiţi un alt nume pentru baza de date în timp ce parcurgeţi exemplele. Poate că altă persoană din sistemul dumneavoastră foloseşte deja numele samp_db sau poate că administratorul v-a repartizat un alt nume pentru baza de date. In ambele cazuri, înlocuiţi samp_db cu numele real al bazei dumneavoastră de date ori de câte ori vedeţi primul nume în exemple.
Numele tabelelor pot fi folosite exact aşa cum apar în exemple, chiar dacă mai multe persoane din sistemul dumneavoastră îşi au propriile lor baze de date demonstrative, în MySQL, nu contează dacă o altă persoană foloseşte aceleaşi nume de tabele. Atâta timp cât fiecare din dumneavoastră îşi are propria sa bază de date, MySQL va păstra numele nealterate şi va împiedica interferenţele între utilizatori.
Cerinţe preliminare
Pentru a încerca exemplele din acest manual, este necesar ca MySQL să fie instalat, în particular, trebuie să aveţi acces la clienţii MySQL şi la un server MySQL oarecare. Programele client trebuie să fie instalate în calculatorul dumneavoastră. Veţi avea nevoie cel puţin de mysql, iar mysqlimport este de asemenea util. Serverul se poate afla în cal-
38 Partea l Utilizarea generală a sistemului MySQL
culatorul dumneavoastră, deşi acest lucru nu este necesar. Dacă aveţi permisiunea să v conectaţi la server, acesta poate fi amplasat oriunde.
Dacă se întâmplă ca serverul să ruleze pe calculatorul dumneavoastră, programele clier sunt probabil de asemenea instalate, iar dumneavoastră sunteţi pregătit. Dacă trebuie s vă procuraţi MySQL, vezi Anexa A, „Obţinerea şi instalarea programelor", pentr instrucţiuni. Fie consultaţi capitolul respectiv (dacă instalaţi personal MySQL), fie ari taţi-1 administratorului dumneavoastră de sistem. Dacă accesul dumneavoastră la reţ« are loc prin intermediul unui furnizor de servicii Internet (ISP), verificaţi dacă furn zorul dumneavoastră dispune sau nu de MySQL. Dacă furnizorul dumneavoastră n oferă serviciul MySQL si nu este dispus să-1 instaleze, consultaţi Anexa J, „Furnizori c servicii Internet", pentru sfaturi cu privire la alegerea unui furnizor mai adecvat.
în afara programului MySQL, aveţi nevoie de permisiunea de a crea baza de dat
demonstrativă şi tabelele sale. Dacă nu aveţi permisiunea, cereţi-o administratorul!
dumneavoastră MySQL. Administratorul vă poate acorda această permisiune rulân
clientul mysql şi emiţând comenzi ca acestea:
GRANT ALL ON samp_db.* TO paul@localhost IDENTIFIED BY "secret" GRANT ALL ON samp_db.* TO paul@% IDENTIFIED BY "secret"
I Diferenţa între MySQL si mysql Pentru a evita confuziile, trebuie să precizăm că "MySQL" se referă la întregul SGBDR MySQL, "mysql" este numele unui anumit program client. Cele două se pronunţă la fel, dar le vom deosebi pr diferenţele determinate prin majuscule şi tipurile de literă.
Prima comandă oferă utilizatorului paul un acces complet la baza de date samp_db şi toate tabelele acesteia, atunci când paul se conectează de la calculatorul localhost (aceea gazdă pe care rulează serverul). De asemenea, atribuie parola secret. A doua comandă est similară, dar permite lui paul să se conecteze de la orice gazdă (% este un caracter c înlocuire). De asemenea, puteţi înlocui % cu un anumit nume de gazdă, pentru a permi lui paul să se conecteze chiar de la gazda respectivă. (O atare instrucţiune GRANT poate necesară dacă serverul dumneavoastră permite acces anonim de la localhost, datori modului în care serverul caută în tabelele de acordare echivalenţe cu conexiunile < intrare.) Mai multe informaţii despre instrucţiunea GRANT si despre configurarea conturil< de utilizator MySQL pot fi găsite în capitolul 11, „Administrarea generală a sistemul MySQL".
Obţinerea distribuţiei bazei de date demonstrative
Acest manual face referire, în anumite situaţii, la fişiere din „distribuţia bazei de da demonstrative". Acestea sunt fişiere care conţin interogări sau date care vă vor ajuta configuraţi baza de date demonstrativă. Pentru a vă procura această distribuţie, ve" Anexa A. Când despachetaţi distribuţia, aceasta va crea un catalog denumit samp_c care conţine fişierele de care aveţi nevoie. Vă sugerez să comutaţi în catalogul respect ori de câte ori încercaţi exemple referitoare la baza de date demonstrativă.
Capitolul 1 Introducere în MySQL şi SQL
39
Stabilirea şi întreruperea conexiunilor cu serverul
Pentru a vă conecta la serverul dumneavoastră, invocaţi programul mysql din interpre-torul dumneavoastră (adică de la promptul UNIX sau de la o consolă DOS sub Windows). Comanda arată astfel:
% mysql opţiuni
Am folosit caracterul % în carte pentru a indica promptul interpretorului. Acesta este unul din prompturile UNIX standard; un altul este $. In Windows, promptul este ceva degenulC:\>.
Partea opţiuni a liniei de comandă mysql poate fi vidă, dar cel mai probabil va trebui să emiteţi o comandă ca următoarea:
% mysql -h nume_gazda -u nume_utilizator -p
Este posibil să nu fie necesar să specificaţi toate aceste opţiuni când invocaţi mysql; apelaţi la administratorul MySQL pentru a afla sintaxa exactă a comenzii pe care trebuie să o folosiţi. Probabil că va trebui să specificaţi cel puţin un nume şi o parolă.
Când sunteţi la primii paşi în învăţarea sistemului MySQL, probabil că sistemul său de securitate vi se va părea agasant, deoarece îngreunează efectuarea operaţiilor dorite. (Trebuie să obţineţi permisiunea de a crea şi de a obţine acces la o bază de date şi trebuie sa vă specificaţi numele şi parola de fiecare dată când vă conectaţi la server.) Totuşi, după ce veţi trece dincolo de baza de date demonstrativă şi veţi introduce şi folosi propriile dumneavoastră înregistrări, perspectiva dumneavoastră se va schimba radical. Apoi, veţi aprecia faptul că MySQL împiedică alte persoane să vă spioneze (sau, mai rău, chiar să vă distrugă!) datele.
Iată care este semnificaţia opţiunilor:
• -h nume_gazda (formă alternativă: --host=nume_gazc/a)
Gazda serverului la care doriţi să vă conectaţi. Dacă serverul rulează pe acelaşi calculator pe care utilizaţi mysql, în mod normal această opţiune poate fi omisă. •-u nume_utilizator (formă alternativă:--user=nume_i/tiJizator)
Numele dumneavoastră de utilizator MySQL. Dacă folosiţi UNIX si numele dumneavoastră de utilizator MySQL este acelaşi ca numele dumneavoastră de deschidere a sesiunii de lucru, puteţi omite această opţiune; mysql va folosi numele de deschidere a sesiunii de lucru ca nume MySQL.
Sub Windows, numele de utilizator prestabilit este ODBC, ceea ce nu este foarte util. Fie specificaţi un nume în linia de comandă, fie stabiliţi un nume prestabilit în mediul dumneavoastră prin configurarea variabilei USER. De exemplu, pot folosi următoarea comandă set pentru a specifica numele de utilizator paul: set USER=paul
* -p (formă alternativă: --password)
Această opţiune indică programului mysql să vă solicite parola dumneavoastră MySQL. Notă: vă puteţi insera parola în linia de comandă tastând-o sub forma -pparola_dvs (formă alternativă: - -parola=parola_c/vs). Totuşi, din motive de securitate, cel mai bine
40 Partea l Utilizarea generală a sistemului MySQL
3
este să nu procedaţi astfel. Dacă specificaţi opţiunea - p fără nici o parolă, indicaţi prd gramului mysql să vă solicite o parolă la deschidere. De exemplu:
% mysql -h num<3_gazela -u nume_utilizator -p
Enter password:
Când vedeţi mesajul Enter password: (introduceţi parola), tastaţi parola dumnea voastră. (Parola nu va fi reflectată pe ecran, în caz că vă spionează careva.) Reţineţi c parola dumneavoastră MySQL nu este obligatoriu aceeaşi ca parola UNIX sa Windows.
Dacă omiteţi opţiunea -p în totalitate, mysql presupune că nu aveţi nevoie de ea si n o solicită.
Notă: Opţiunile * h si -u sunt asociate cuvintelor care urmează după acestea, indiferen dacă între opţiune şi cuvântul următor există sau nu un spaţiu. Acest lucru nu este va labil pentru opţiunea -p. Dacă specificaţi parola în linia de comandă, nu trebuie s existe nici un spaţiu între -p si parolă.
De exemplu, să presupunem că numele meu de utilizator MySQL şi parola mea sur respectiv paul şi secret, si că doresc să mă conectez la serverul care rulează pe acelaşi cal culator la care am deschis sesiunea de lucru. Comanda mysql pentru această operaţie est<
% mysql -u paul -p
Enter password: ****** După ce am introdus comanda, mysql afişează textul Enter password: pentru a-mi cer parola, iar eu o tastez (şirul ****** arată locul unde am scris secret).
Dacă totul merge bine, mysql afişează un mesaj de salut şi un prompt mysql> prin car îmi arată că aşteaptă să scriu comenzi. Secvenţa de pornire completă se prezintă astfel:
% mysql -u paul -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g. ;
Your MySQL connection id is 1805 to server version: 3.22.25-log
Type 'help' for help.
mysql>
Pentru a mă conecta la un server care rulează pe un alt calculator, trebuie să specific nume! gazdei folosind opţiunea -h. Dacă gazda respectivă are numele pit-viper, snake, ne comanda arată astfel:
% «ysql -h pit-viper„snake.net -u paul -p în majoritatea exemplelor care urmează si care prezintă o linie de comandă mysql, vc omite opţiunile -h, -u şi -p, din motive de concizie. Se presupune că veţi introduc opţiunile necesare.
Există modalităţi de a vă configura contul astfel încât să nu fie necesar să tastaţi parametr de conexiune de fiecare dată când rulaţi mysql. Acest lucru este discutat în secţiunea „Sugest pentru interacţiunea cu mysql". Puteţi trece chiar acum la secţiunea respectivă, pentru a v face o idee cu privire la unele din posibilităţile de a simplifica conectarea la server.
Capitolul 1 Introducere în MySQL şi SQL
41
După ce stabiliţi o conexiune cu serverul, puteţi încheia sesiunea oricând tastând QUIT:
mysql> QUIT
Bye De asemenea, puteţi termina sesiunea tastând Control-D, cel puţin în UNIX.
Emiterea de interogări
După ce v-aţi conectat la server, sunteţi gata de a emite interogări. Această secţiune descrie unele aspecte generale pe care trebuie să le cunoaşteţi despre interacţiunea cu mysql.
Pentru a introduce o interogare în mysql, pur şi simplu tastaţi-o. La sfârşitul interogării, tastaţi un caracter punct si virgulă (;) si apăsaţi pe tasta Enter. Caracterul punct si virgulă indică programului mysql că interogarea este completă. (De asemenea, puteţi folosi \g pentru terminarea interogărilor, dacă preferaţi să scrieţi două caractere în loc de unul.)
După ce aţi introdus o interogare, mysql o trimite serverului pentru a fi executată. Serverul prelucrează interogarea si trimite rezultatele înapoi programului mysql, care afişează rezultatul pentru dumneavoastră.
Iată un exemplu de interogare simplă şi rezultatul acesteia: mysql> SELECT NOWQ
NOW(]
1999-07-24 11:02:36
1 row in set (0.00 sec)
Această comandă indică data si ora curentă. (Funcţia NOW() nu este utilă ca atare, dar se poate folosi în expresii - de exemplu, pentru a calcula diferenţa dintre data curentă si o altă dată.)
De asemenea, mysql afişează numărul rândurilor rezultatului. De regulă, nu voi prezenta acest număr în cadrul exemplelor.
Deoarece mysql aşteaptă caracterul punct si virgulă înainte de a trimite interogarea serverului, nu trebuie să introduceţi toată interogarea pe un singur rând. Puteţi extinde o interogare pe mai multe linii, dacă doriţi: mysql> SELECT NOW(), -> USER(), -> VERSION()
NOW()
:USER()
• VERSION{)
1999-07-24 11:06:16 jpauieiocalhosti 3.23.1 -alpha-log
Observaţi modul în care promptul se modifică din mysql în după ce aţi introdus prima linie a interogării; acest lucru vă arată că mysql crede că încă mai introduceţi interogarea. A-ceasta este o reacţie importantă, deoarece, dacă uitaţi să plasaţi caracterul punct si virgulă la sfârşitul unei interogări, promptul vă ajută să sesizaţi că mysql continuă să aştepte ceva. în caz contrar, dumneavoastră veţi aştepta, întrebându-vă de ce o avea nevoie MySQL de atâta timp pentru a vă executa interogarea, iar mysql va aştepta la rândul lui, mtrebându-se de ce aveţi nevoie de atâta timp pentru a termina de introdus interogarea!
42 Partea l Utilizarea generală a sistemului MySQL
în majoritatea cazurilor, nu are importanţă dacă introduceţi interogările folosind majusi cule, minuscule sau litere de diferite mărimi. Toate aceste interogări sunt echivalente:
SELECT USER()
select user()
Select UsEr()
Exemplele din această carte folosesc majuscule pentru cuvintele cheie si numele d funcţii din SQL, respectiv minuscule pentru nume de baze de date, tabele şi coloane.
Când invocaţi o funcţie într-o interogare, nu trebuie să existe spaţii între numele funcţie si paranteza care urmează după acesta: mysql> SELECT NOW();
NOW ()
1999-07-17 12:44:52
mysql> SELECT NOW ();
ERROR 1064: You have an error in your SQL syntax near '()' at line 1 (Aveţi o eroare în sintaxa SQL lângă '()' pe linia 1)
Cele două interogări par similare, dar a doua eşuează, deoarece paranteza nu apare ime diat după numele funcţiei.
Dacă aţi început să scrieţi o interogare cu mai multe linii şi decideţi că nu doriţi să o exe cutaţi, tastaţi \c pentru a o anula (cancel): mysql> SELECT NOW(), -> VERSIONO, -> \c mysql>
Remarcaţi că promptul revine la forma mysql>, indicând că mysql este gata pentru nouă interogare.
Puteţi stoca interogările într-un fişier şi puteţi cere programului mysql să citeasc interogările din fişier, în loc să aştepte ca dumneavoastră să le introduceţi de la tastaturi Folosiţi pentru aceasta facilităţile interpretorului de redirecţionare a datelor de intran De exemplu, dacă am interogări stocate într-un fişier denumit fisieruljneu.sql, pe executa conţinutul fişierului astfel: % mysql < fisieruljneu.sql Puteţi denumi fişierul cum doriţi. Eu folosesc sufixul sql pentru a arăta că fişien conţine instrucţiuni SQL.
Execuţia programului mysql în acest mod va reapărea în secţiunea „Adăugarea de înregis trări noi" atunci când introducem date în baza de date samp_db. Este mult mai comod s încărcăm un tabel determinând programul mysql să citească instrucţiuni INSERT dintr-u fişier decât tastând manual fiecare instrucţiune.
In continuare, acest manual va prezenta multe interogări pe care le puteţi încerca pe cot propriu. Acestea sunt indicate prin promptul mysql> care precede interogarea si pr caracterul punct si virgulă (de terminare) plasat după aceasta, iar asemenea exemple si; de regulă însoţite de rezultatul interogării. Trebuie să puteţi tasta aceste interogări cum sunt prezentate, iar datele de ieşire rezultate trebuie să fie identice.
Capitolul 1 Introducere în MySQL şi SQL
43
Interogările prezentate fără un prompt sau fără caracterul punct si virgulă de terminare a instrucţiunii sunt menite pur şi simplu a ilustra o idee si nu trebuie executate. (Le puteţi încerca, dacă doriţi, dar, dacă o faceţi, nu uitaţi să inseraţi caracterul punct şi virgulă la sfârşit.)
în capitolele viitoare ale cărţii, de regulă nu voi mai prezenta promptul mysql> sau caracterul punct şi virgulă în instrucţiunile SQL. Motivul este acela că puteţi emite interogări în contexte diferite de programul client mysql (de exemplu în scripturi Perl sau PHP), contexte în care nu apare nici un prompt şi nu este necesar nici un caracter punct si virgulă. Voi indica situaţiile în care se intenţionează în mod specific ca dumneavoastră să introduceţi o interogare în mysql.
Crearea bazei de date
Vom începe prin a crea baza de date samp_db si tabelele din interiorul acesteia, prin a popula tabelele sale si prin a efectua unele interogări simple asupra datelor incluse în aceste tabele.
Utilizarea unei baze de date implică mai multe etape:
1. Crearea (iniţializarea) bazei de date
2. Crearea tabelelor din cadrul bazei de date
3. Interacţiunea cu tabelele prin inserţia, regăsirea, modificarea sau ştergerea datelor.
Regăsirea datelor existente este, evident, cea mai frecventă operaţie efectuată cu o bază de date. Următoarele operaţii, în ordinea frecvenţei, sunt inserţia datelor noi si actualizarea sau ştergerea datelor existente. Mai puţin frecvente sunt operaţiile de creare a tabelelor, iar operaţia cel mai puţin frecventă este crearea bazelor de date.
Noi pornim de la zero, deci trebuie să începem de la crearea bazei de date, operaţia cel mai puţin frecventă, şi vom parcurge pas cu pas operaţiile de creare a tabelelor şi de inserţie a datelor noastre iniţiale, înainte de a ajunge să efectuăm operaţia cea mai comună: regăsirea datelor.
Pentru a crea o bază de date nouă, conectaţi-vă la server folosind mysql şi apoi emiteţi o instrucţiune CREATE DATABASE care specifică numele bazei de date:
mysql> CREATE DATABASE samp_db;
Va trebui să creaţi baza de date samp_db înainte de a putea crea oricare dintre tabelele care vor fi incluse în aceasta sau înainte de a efectua orice operaţii folosind conţinutul acelor tabele.
Prin crearea bazei de date, devine aceasta baza de date curentă (prestabilită)? Nu, nu devine, aşa cum se poate vedea prin executarea următoarei interogări: mysql> SELECT DATABASE(); i DATABASE(]
Pentru ca baza de date samp_db să devină curentă, emiteţi o instrucţiune USE: mysql>* USE samp_db
44 Partea l Utilizarea generală a sistemului MySQL
USE este una dintre puţinele instrucţiuni care nu necesită un caracter punct si virgulă c terminare a instrucţiunii, deşi îl puteţi adăuga, dacă doriţi. HELP este o altă instrucţiuu de acest gen, iar dacă emiteţi o instrucţiune HELP, aceasta vă va prezenta o listă cu toal instrucţiunile care nu necesită un caracter punct si virgulă.
După ce emiteţi instrucţiunea USE, samp_db devine baza de date prestabilită: mysql> SELECT DATABASEf); DATABASE() samp_db
Cealaltă modalitate de a transforma o bază de date în bază de date curentă este de a denumi în linia de comandă atunci când invocaţi mysql:
% mysql samp_db
Acesta este, de fapt, modul uzual de a denumi baza de date pe care doriţi să o folosi Dacă aveţi nevoie de parametri de conectare, specificaţi-i înainte de numele bazei date. De exemplu, următoarele două comenzi îmi permit să mă conectez la baza de da samp_db de la gazda locală şi de la sistemul pit-viper.snake.net:
% mysql -u paul -p sanp_db
% mysql -h pit-viper.snake.net -u paul -p samp_db
Dacă nu se precizează altfel, toate exemplele care urmează vor presupune că, atunci cam invocaţi mysql, specificaţi baza de date samp_db în linia de comandă pentru a o transfoi mă în bază de date curentă. Dacă invocaţi mysql, dar uitaţi să specificaţi baza de date î linia de comandă, emiteţi o instrucţiune USE samp_db.
Crearea tabelelor
în această secţiune, vom construi tabelele necesare pentru baza de date demonstrativ samp_db. Mai întâi, vom lua în considerare tabelele necesare pentru Liga istorică. Ape ne vom ocupa de tabelele necesare pentru proiectul de păstrare a evidenţei rezultatele şcolare. Aceasta este partea unde unele cărţi de baze de date încep să vorbească despJ analiză şi proiectare, diagrame entitate-relaţie, proceduri de normalizare si altele de ace gen. Există un loc pentru toate acestea, dar prefer să spun numai că trebuie să ne gândul puţin la modul în care va arăta baza noastră de date: care sunt tabelele pe care trebuie s le conţină, care trebuie să fie conţinutul fiecărui tabel, precum şi unele din aspecte implicate în decizia privind modul de reprezentare a datelor.
Opţiunile care se fac aici privind reprezentarea datelor nu sunt absolute, în alte situat: puteţi opta la fel de bine să reprezentaţi date similare într-un mod diferit, în funcţie < cerinţele aplicaţiilor dumneavoastră şi de modurile în care doriţi să vă utilizaţi datele.
Tabele pentru Liga istorica
Structura tabelelor pentru Liga istorică este relativ simplă:
• Un tabel preşedinte (preşedinte). Acesta conţine o înregistrare descriptivă pentr fiecare preşedinte al Statelor Unite. Vom avea nevoie de acesta pentru chestionări electronic din situl Web al Ligii (analogul interactiv al chestionarului tipărit care apai în secţiunea pentru copii a buletinului de ştiri al Ligii).
Capitolul 1 Introducere în MySQL şi SQL
45
• Un tabel membru (membru). Acesta este folosit pentru a păstra informaţii actuale despre fiecare membru al Ligii. Tabelul va fi folosit pentru crearea versiunilor tipărită şi electronică a catalogului cu membri, pentru trimiterea de note automate de înştiinţare pentru plata cotizaţiilor şi altele.
Tabelul preşedinte
Tabelul preşedinte este mai simplu, deci să discutăm despre el mai întâi. Acest tabel va conţine unele informaţii biografice elementare despre fiecare preşedinte al Statelor Unite:
• Nume. Numele pot fi reprezentate într-un tabel în mai multe moduri. De exemplu, putem avea o singură coloană care conţine întregul nume, respectiv coloane separate pentru nume si prenume. Este evident mai simplu să folosim o singură coloană, dar acest lucru vă dezavantajează în câteva moduri:
• Dacă introduceţi numele cu prenumele scris primul, nu le puteţi sorta în funcţie de numele de familie.
• Dacă introduceţi numele cu numele de familie scris primul, nu le puteţi afişa cu prenumele scris primul.
• Căutarea în funcţie de nume este mai dificilă. De exemplu, pentru a căuta un anumit nume de familie, trebuie să folosiţi un model si să căutaţi numele care corespund acelui model. Această operaţie este mai puţin eficientă şi mai lentă decât căutarea unui anumit nume de familie.
46
Partea l Utilizarea generală a sistemului MySQL
• Data naşterii şi a decesului. Singura problemă specială în acest caz este aceea că putem cere să fie trecută data morţii, deoarece unii preşedinţi sunt încă în viat MySQL furnizează o valoare NULL specială care înseamnă „fără valoare", pe care putem folosi în coloana cu data morţii, pentru a arăta că persoana respectivă trăieşte
Tabelul membru
Tabelul membru pentru lista cu membrii Ligii istorice este similar cu tabelul presedint în sensul că fiecare înregistrare conţine informaţii descriptive elementare pentru o sii gură persoană. Fiecare înregistrare membru conţine însă mai multe coloane:
• Nume. Vom folosi aceeaşi reprezentare pe trei coloane ca în cazul tabelului presedint nume de familie, prenume (si al doilea prenume, dacă există), sufix.
• Număr de identificare. Aceasta este o valoare unică, atribuită fiecărui membru atun când acesta capătă calitatea respectivă. Liga nu a mai folosit niciodată numere de idei tificare, dar acum, când înregistrările sunt organizate mai sistematic, este o ocazie bur (Eu anticipez că veţi găsi programul MySQL util şi că vă veţi gândi şi la alte moduri < a-1 aplica înregistrărilor Ligii. Când acest lucru se va întâmpla, înregistrările din tabehj membru vor fi mai uşor de asociat cu alte tabele referitoare la membri pe care eventuJ le veţi crea, dacă folosiţi numere în locul numelor.)
• Data expirării. Membrii trebuie să-şi plătească periodic cotizaţia, pentru a evil pierderea calităţii de membru. Pentru unele aplicaţii, puteţi folosi data plăţii ultimi cotizaţii, dar acest lucru nu este convenabil pentru interesele Ligii. Cotizaţiile pot plătite pentru un număr variabil de ani (de regulă unul, doi, trei sau cinci ani), iar da plăţii ultimei cotizaţii nu indică momentul când trebuie plătită următoarea cotizaţi De asemenea, Liga permite calitatea de membru pe viaţă. Putem reprezenta aceas informaţie printr-o dată din viitorul îndepărtat, dar valoarea NULL pare mai adecvat deoarece „fără valoare" poate fi asimilat logic cu „nu expiră niciodată".
• Adresă de e-mail. Pentru membrii care au adresă de e-mail, aceasta le va permite comunice cu uşurinţă unii cu alţii. Pe linia îndatoririlor dumneavoastră ca secretar Ligii, aceasta vă va permite să trimiteţi înştiinţări de plată a cotizaţiei pe cale electroni şi nu prin poşta clasică, ceea ce este mai uşor decât să vă deplasaţi la poştă şi mai puf costisitor. De asemenea, veţi putea folosi poşta electronică pentru a expedia membrii conţinutul curent al intrărilor lor din catalog şi pentru a le cere să-şi actualizeze info maţiile, dacă este necesar.
• Adresă poştală. Aceasta este necesară pentru contactarea membrilor care nu dispun < postă electronică (sau care nu răspund la mesajele primite). Vom folosi coloane pent stradă, oraş, stat si cod postai. Coloana pentru stradă se poate dubla pentru a inclufl numărul cutiei poştale, pentru acei membri care au o adresă precum P.O. Box 123 loc de 123 Elm St.
Eu presupun că toţi membrii Ligii locuiesc în Statele Unite. Pentru instituţii ai căra membri au mai multe naţionalităţi, această presupunere este o simplificare excesiv] desigur. Dacă doriţi să utilizaţi adrese din mai multe ţări, veţi da peste unele aspecte i ciudate legate de diversele formate de adrese folosite în diferite ţări. De exemplu, coc poştal nu este un standard internaţional, iar unele ţări nu au state, ci provincii.
Capitolul 1 Introducere în MySQL şi SQL
47
• Număr de telefon. Ca si câmpurile cu adrese, acesta este util pentru contactarea membrilor.
• Cuvinte cheie speciale pentru zonele de interes. Se presupune că fiecare membru este interesat de istoria Statelor Unite în general, dar probabil că membrii sunt interesaţi cu precădere de anumite domenii. Această coloană înregistrează zonele de interes respective, pe care membrii le pot folosi pentru a descoperi alţi membri cu interese similare.
Crearea tabelelor
Acum, suntem pregătiţi pentru crearea tabelelor aferente Ligii istorice. Pentru aceasta, vom folosi instrucţiunea CREATE TABLE, care are următoarea formă generală: CREATE TABLE nume_tabel ( specificatii_coloane )
nume_tabel indică numele pe care doriţi să-1 daţi tabelului. specificatii_coloane conţine specificaţiile pentru coloanele din tabel, inclusiv indexurile (dacă aveţi vreunul). Indexurile permit căutări mai rapide; vom discuta despre ele în capitolul 4, „Optimizarea interogărilor".
Instrucţiunea CREATE TABLE pentru tabelul preşedinte se prezintă astfel: CREATE TABLE preşedinte (
nume VARCHAR(15) NOT NULL, prenume VARCHAR(IS) NOT NULL, sufix VARCHAR(S) NULL, oraş VARCHAR(20) NOT NULL, Stat VARCHAR(2) NOT NULL, data_nastere DATE NOT NULL, data_deces DATE NULL )
Dacă doriţi să introduceţi personal instrucţiunea respectivă, invocaţi programul mysql, transformând samp_db în bază de date curentă:
% mysql samp_db
Apoi, introduceţi instrucţiunea CREATE TABLE aşa cum s-a arătat mai sus. (Nu uitaţi să adăugaţi caracterul punct şi virgulă la sfârşitul instrucţiunii; altfel, mysql nu va şti care este sfârşitul instrucţiunii.)
Pentru a crea tabelul preşedinte folosind un fişier cu o descriere scrisă anterior din distribuţia bazei de date demonstrative (vezi „Obţinerea distribuţiei bazei de date demonstrative"), rulaţi această comandă din interpreter:
% mysql samp_db < create_president.sql
Indiferent de modul în care invocaţi mysql, specificaţi toţi parametrii de conexiune de care aveţi nevoie (numele gazdei, numele utilizatorului sau parola) în linia de comandă, înainte de numele bazei de date.
Fiecare specificaţie de coloană din instrucţiunea CREATE TABLE constă din numele coloanei, tipul (genul de valori pe care le va conţine coloana) şi eventual unele atribute ale coloanei.
48 Partea l Utilizarea generală a sistemului MySQL
Cele două tipuri de coloane folosite în tabelul preşedinte sunt VARCHAR şi DATE. VARCHAR(j arată că acea coloană conţine valori caracter (şir) de lungime variabilă, cu o lungime max mă de n caractere pentru fiecare valoare. Veţi alege valoarea lui w în funcţie de lungim* scontată a valorilor. Coloana stat este declarată ca VARCHAR(2); nu avem nevoie de o v; loare mai mare, dacă numele statelor sunt introduse folosind abrevieri din două caracter Celelalte coloane cu valori şir trebuie să fie mai late, pentru a permite inserţia unor valo mai lungi.
Celălalt tip de coloană pe care 1-am folosit este DATE. Acest tip indică, deloc ####surprinzăto că acea coloană conţine valori de tip dată calendaristică. Totuşi, ceea ce vă poate surprinde este că datele sunt reprezentate începând cu anul. Formatul standard este "AAAA-LL-Zi (de exemplu "1999-07-18"). Acesta este standardul SQL ANSI pentru ####reprezenta» datelor calendaristice.
Singurele atribute de coloană pe care le folosim pentru tabelul preşedinte sunt NUL (valorile pot lipsi), respectiv NOT NULL (valorile trebuie introduse). Majoritat< coloanelor au valoarea NOT NULL, deoarece avem întotdeauna o valoare pentru ele. Ce două coloane care pot avea valori NULL sunt sufix (majoritatea numelor nu au aşa cev şi data_deces (unii preşedinţi sunt încă în viaţă, deci nu există o dată a decesului).
Instrucţiunea CREATE TABLE pentru tabelul membru se prezintă astfel: CREATE TABLE membru
nume VARCHAR(20) NOT NULL,
prenume VARCHAR(20) NOT NULL,
sufix VARCHAR (5) NULL,
data_expirare DATE NULL DEFAULT "0000-00-00",
email VARCHAR(100) NULL,
Strada VARCHAR(SO) NULL,
oraş VARCHAR(50) NULL,
Stat VARCHAR(2) NULL,
Cod_postal VARCHAR(10) NULL,
telefon VARCHAR(20) NULL,
interese VARCHAR (255) NULL
Tastaţi această instrucţiune în mysql sau executaţi următoarea comandă de interprete*
% mysql samp_db < create_«e>ber.sql în ceea ce priveşte tipurile de coloane, tabelul membru nu este foarte interesant; fieca coloană, cu o singură excepţie, este creată sub forma unui şir de lungime variabi Excepţia, data_expirare, este de tip DATE. Valoarea prestabilită a datei de expirare & "0000-00-00", care este o valoare de tip non-NULL, ce indică faptul că nu a fost introdu nici o dată corectă. Motivul este că data_expirare poate avea valoarea NULL pentru arăta că un membru are această calitate pe o perioadă nelimitată de timp. ####Toni deoarece coloana poate avea valoarea NULL, aceasta devine valoarea prestabilită dacă j specificaţi o altă valoare. Dacă aţi creat un membru nou, dar aţi uitat să specificaţi da expirării, membrul respectiv va deveni membru pe viaţă! Folosind valoarea prestabil
Capitolul 1 Introducere în MySQL şi SQL
49
"0000-00-00" vom evita această problemă. De asemenea, avem o valoare pe care o putem căuta periodic, pentru a găsi înregistrările unde data expirării nu a fost niciodată introdusă în mod adecvat.
Reţineţi că am „omis" să inserez o coloană pentru numărul de identificare al unui membru. Aceasta deoarece am nevoie de un pretext ca să folosesc comanda ALTER TABLE mai târziu, iar omiterea acestei coloane furnizează un atare pretext.
Să verificăm că MySQL a creat tabelele conform aşteptărilor, în mysql, emiteţi următoarea interogare:
mysql> DESCRIBE preşedinte;
Field
Type
Nuli
Key
Default
Extra
Nume
varchar(15)
prenume
varchar(15)
Sufix
varchar(5)
YES
NULL
oraş
varchar(20)
stat
char(2)
data naştere
date
0000-00-00
Data_deces
date
YES
NULL
Ca în cazul versiunii MySQL 3.23, datele de ieşire includ încă o coloană, care prezintă informaţii privind privilegiile de acces. Nu am prezentat aici coloana respectivă, deoarece rândurile devin prea lungi pentru a putea fi afişate cu uşurinţă.
Datele de ieşire sunt conform aşteptărilor, cu excepţia faptului că se precizează că tipul coloanei stat este char (2). Ciudat; nu am declarat coloana ca fiind de tip VARCHAR(2) ? Ba da, am declarat-o, dar MySQL a modificat „pe şest" tipul din VARCHAR în CHAR. Motivul acestei acţiuni este legat de eficienţa spaţiului de stocare pentru coloanele scurte cu date de tip caracter, despre care nu vom discuta în detaliu aici. Dacă doriţi detalii, consultaţi paragrafele dedicate instrucţiunii ALTER TABLE din capitolul 3, „Sintaxa şi utilizarea SQL în MySQL", care conţin detalii. Pentru noi, în acest moment, nu există nici o diferenţa între cele două tipuri.
Dacă emiteţi o interogare DESCRIBE membru, atunci mysql vă va prezenta informaţii similare pentru tabelul membru.
Interogarea DESCRIBE este utilă atunci când uitaţi numele unei coloane din tabel, când trebuie să ştiţi tipul coloanei, când trebuie să ştiţi care este lăţimea coloanei si altele. De asemenea, este util pentru a afla ordinea în care MySQL stochează coloanele în rândurile tabelului. Ordinea respectivă este importantă atunci când folosiţi instrucţiunile INSERT sau LOAD DATA, care presupun afişarea valorilor din coloane în ordinea prestabilită a coloanelor.
DESCRIBE se poate abrevia sub forma DESC sau, dacă preferaţi să tastaţi mai mult, SHOW COLUMNS FROM nunte_tabel este sinonim cu DESCRIBE numejtabel.
Şi dacă uitaţi numele tabelelor dumneavoastră? Atunci puteţi folosi SHOW TABLES. Pentru oaza de date samp_db, care conţine cele două tabele pe care le-am creat până acum, datele de ieşire ale comenzii se prezintă astfel:
l