Mysql Tutorial

download Mysql Tutorial

of 65

Transcript of Mysql Tutorial

1

2

Cuprinsul "Tutorial-ului MySQL" 1. Introducere in aplicatii web si baze de date. . . . . . . . . . . . . . . . . . . . . . 3

Functionarea aplicatiilor Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Ce este MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Baze de date relationale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2. Instalarea serverului MySQL, a Apache si a PHP-ului. . . . . . . . . . . . 7

Instalare MySQL sub Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Instalare Apache sub Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Instalare PHP sub Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Instalare MySQL sub Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Instalare PHP/Apache sub Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

3. Utilizarea server-ului MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13

Conectarea la server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Privilegiile utilizatorilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Crearea bazelor de date si a tabelelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Tipuri de campuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Inserarea de inregistrari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Actualizarea inregistrarilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19 Extragerea inregistrarilor cu SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Join-uri intre tabele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Stergerea inregistrarilor si a tabelelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Crearea indecsilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27 Modificarea tabelelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

4. Limbajul folosit de MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29

Siruri de caractere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29 Numere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30 NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Numele folosite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Variabile definite de utilizator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30 Comentarii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30 Cuvinte rezervate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Functii pentru compararea de siruri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .32 Functii matematice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Functii pentru siruri de caractere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Functii pentru date si timp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Functii diverse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 Sintaxa completa a celor mai folosite comenzi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

1

5. Administrarea server-ului MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41

Administrarea utilizatorilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41 Controlul accesului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Comezile GRANT si REVOKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Backup-ul bazelor de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 Securitatea datelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45 Optimizarea MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .46

6. Configurarea server-ului MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47

Schimbarea setului de caractere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47 Mesaje de eroare in romana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 Utilitarele MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 mysql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 mysqladmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49 mysqldump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 mysqlimport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

7. Utilizarea MySQL cu PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

Crearea tabelelor cu PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 Conectarea la baza de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53 Deschiderea bazei de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53 Executia comenzilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53 Adaugarea de inregistrari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53 Formulare HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53 Afisarea inregistrarilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .54 Actualizarea inregistrarilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Functiile PHP pentru lucrul cu MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

8. Quiz MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 9. Linkuri utile. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

2

Introducere in aplicatii Web si baze de date relationale

Functionarea aplicatiilor Web Ce este MySQL Baze de date relationale

Aplicatiile Web sunt prezentul si viitorul. Orice limbaj de programare ai fi facut in trecut, sau daca stii numai HTML, CV-ul tau va fi vazut altfel cu experienta in dezvoltarea aplicatiilor Web. La nivel cel mai de jos World Wide Web-ul se bazeaza pe o arhitecura client/server. Asta insemna ca si severul central dar si aplicatia-client sunt responsabile de o parte din procesarea datelor. Clientul Aplicatiile care se pot dezvolta folosind MySQL si PHP folosesc un singur client: browser-ul Web. Unele aplicatii mai sofisticate pot folosi si un applet Java (spre exemplu un client de chat in timp real). Singurul client de care trebuie sa fii preocupat este browser-ul care va interpreta aplicatiile tale. Server-ul Aproape tot ce fac aplicatiile Web are loc pe un server. O aplicatie specifica, numita server Web, va fi responsabila pentru comunicarea cu browser-ul. In cele din urma, mai este nevoie de un limbaj care sa intermedieze cereri intre server-ul web si un server de baze de date, in cazul nostru si sa realizeze sarcini prin program asupra informatiilor ce vin si se duc spre sever-ul Web. Toate aceste trei elemente (server-ul Web, limbajul de programare si serverul de baze de date) trebuie sa fie compatibile si cu sistemul de operare din calculatorul pe care sunt folosite. Cele mai folosite sisteme de operare pe serverele Web sunt Windows NT/2000 si UNIX (peste 90% din numarul total de servere de pe Web). Ce ar trebui sa folosesti pentru aplicatii Web ? Ei bine, foarte pe scurt PHP si MySQL sunt produse gratuite, spre deosebire de celelate optiuni gratuitatea nu inseamna ca nu au aceleasi performante ca sistemele de mii de dolari. Windows NT sau Windows 2000 este o buna alegere, dar poti folosi MySQL si PHP si pe Windows 95/98/Me. Cu toate acestea, in lumea de afara aproape toate aplicatiile PHP/MySQL ruleaza pe o versiune de UNIX: Linux, Irix, Solaris, HP-UX.. Server-ul Web Cele mai folosite servere Web sunt Apache si Microsoft's IIS. Apache este si el gratuit si in sistem Open Source ca si PHP, MySQL si Linux. El functioneaza bine pe un sistem UNIX dar si pe un sistem Windows (dar nu pe un server foarte incarcat). Cea mai buna alegere este realizarea si testarea aplicatiei pe Windows cu Apache, PHP si MySQL si apoi transferul aplicatiei pe un server Linux fara schimbari in script-uri. Middleware 3

PHP face parte din clasa limbajelor middleware (ASP, Perl, ColdFusion etc.). Aceste limbaje lucreaza cu serverul Web pentru a interpreta cererile facute din dinspre World Wide Web, proceseaz aceste cereri, interactioneaza cu alte programe pe server pentru a indeplini cererile si va indica, apoi, server-ului exact ceea ce trebuie servit browser-ului clientului. Limbajul middleware va fi folosit pentru marea majoritate din munca ta. O tranzactie normala cu baza de date Web se constituie din urmatorii pasi (numerotati in figura):

1. Browser-ul unui utilizator face o cerere HTTP pentru o anumita pagina (spre exemplu se cauta o anumita carte un site prin intermediul fisierului results.php). 2. Server-ul Web primeste cererea pentru results.php, cauta fisierul si il paseaza motorului PHP pentru a fi procesat. 3. Motorul PHP incepe procesarea si gaseste o comanda de conectare la o baza de date si o interogare dupa un anumit criteriu. PHP deschide o conexiune cu server-ul MySQL si ii trimite interogarea. 4. Server-ul MySQL primeste interogarea si o proceseaza si trimite rezultatul (o lista de carti, in cazul nostru) PHP-ului. 5. PHP-ul termina de rulat script-ul (de obicei are loc o formatare a rezultatelor interogarii in HTML) si returneaza fisierul HTML rezultat server-ului Web 6. Server-ul Web trimite HTML-ul inapoi catre browser de unde utilizatorul poate vedea lista cartilor pe care le-a cerut.

De ce sa folosesti PHP si MySQL ?

Daca ai un calculator, Linux, Apache si PHP sunt absolut gratuite. La fel si MySQL cu unele limitari. PHP si MySQL pot fi folosite pe majoritatea platformelor. Desi MySQL nu dispune de toate caracteristicile suportate de concurenta, este la fel de rapid si de puternic. Conectivitatea, viteza si securitatea face server-ul MySQL extrem de potrivit pentru accesarea bazelor de date pe Internet. PHP a reusit sa ajunga la mix-ul perfect de putere, rapiditate, structura si usurinta in folosire. Si PHP si MySQL sunt imbunatatite in mod constant

Ce este MySQL ? MySQL este un server SQL pentru baze de date foarte robust, rapid, multi-utilizator, multi-thread. MySQL este un sistem de gestiune a bazelor de date. O baza de date este o colectie strucurata de date. Ca sa adaugi, sa accersezi si sa procesezi informatiile din baza de date ai nevoie de un sistem de gestiune a bazelor de date ca, de exemplu MySQL. MySQL este un sistem de gestiune a bazelor de date relationale. O baza de date relationala memoreaza date in tabele separate in loc de a stoca toate informatiile intr-o singura structura adaugand astfel viteza si flexibilitate. Tabelele sunt legate prin relatii permitandu-se

4

afisarea datelor combinate la cerere. Sistemele de gestiune a bazelor de date relationale (SGBDR) ofera o cale excelenta pentru a stoca si a accesa informatii complexe. Cele mai populare SGBDR-uri sunt Oracle, Infomix, Microsoft's SQL Server, IBM's db2 si SGBD-uri "open-souce": MySQL, Postgres si Interbase.

Baze de date relationale Tabele Tabela are un nume, un numar de coloane corespunzatoare tipurilor de informatii si linii corespunzatoare inregistrarilor din tabele. De exemplu:CLIENTI ID 1 2 3 Nume Adresa Oras Julie Smith 25 Oak Street London Alan Wong 47 Haines Avenue New York Michelle Arthur 357 North Road Chicago

Coloanele au un nume unic si contin informatii diferite. Fiecare are un tip de date asociat (de exemplu, integer pentru 'ID' si string pentru 'Nume', 'Adresa' si 'Oras'). Coloanele mai sunt numite campuri sau atribute. Liniile reprezinta cate un client diferit in tabela noastra. Mai sunt numite inregistrari sau tupluri. Valorile specificate la intersectia coloanelor cu liniile trebuie sa aiba tipul de date corespunzator. Cheile reprezinta o cale de a identifica fiecare inregistrare in parte. Baze de date care au mai multe tabele folosesc o cheie primara sau o cheie externa(Primary Key sau Foreign Key ) ca referinta de la o tabela la alta. Daca adaugam o noua tabela cu comezile facute de clienti, putem face legatura intre cele doua tabele pe baza campului comun 'ID' care este PK in tabela 'clienti' si FK in 'comenzi':COMENZI ComID ID 1 2 3 4 Cantitate 3 30.66 1 23.00 2 5.00 4 40.87

Relatii Exista 3 tipuri de relatii intr-o BD relationala:

Relatie una-la-una - Exista cate una/unul din fiecare in relatie (dcaca am fi pus adresele intr-o tabela separata intre CLIENTI si ADRESE ar fi existat un corespondent pentru fiecare inregistrare). Relatie una-la-mai-multe - O linie dintr-o tabela e legata la mai multe linii din alta tabela (un client ar putea face mai multe comenzi). Relatie mai-multe-la-mai-multe - Mai multe linii din tabela 1 sunt legate la mai multe din tabela 2 (de exemplu, in cazul a doua tabele, CARTI si AUTORI, o carte ar putea fi scrisa de doi coautori, fiecare dintre ei mai avand si alte carit scrise).

Sfaturi de proiectare pentru baze de date

5

1. Gandeste-te la obiectele reale pe care le modelezi. 2. Evita sa stochezi informatiile care sunt redundante. 3. Foloseste valori "atomice" in coloanele tabelei (adica nu memora valori multiple in cadrul aceluiasi camp al tabelei). 4. Alege chei foarte sensibile, care pot identifica unic o inregistrare. 5. Gandeste-te la ce vrei sa ceri prin interogari din baza de date si include informatii aditionale. 6. Evita sa folosesti prea multe atribute nule (coloane din inregistrari fara continut).

6

Instalare MySQL, PHP si ApacheInstalare MySQL sub Windows Instalare Apache sub Windows Instalare PHP sub Windows Instalare MySQL sub Linux Instalare PHP/Apache sub Linux

MySQL este disponibil pentru Windows, Linux si alte variante de Unix. Se poate copia de la site-ul MySQL: www.mysql.com. Versiunea Windows are un nume asemanator cu mysql-shareware-x_xx_xxwin.zip (unde 'x' este versiunea. Download-ul RPM este cel recomandat pentru versiunea Linux. Pachetul MySQL este compus din:

Serverul MySQL : Este inima MySQL-ului (programul care se ocupa cu bazele tale de date). Programe-client MySQL: Cel mai folosit este mysql.exe care ofera o interfata prin care se pot inteorga bazele da date pentru a afla informatiile dorite din baza de dateMySQL comes with many client programs. The one with which we'll be dealing a lot is called mysql (note: smallcaps). This provides an interface through which you can issue SQL statements and have the results displayed. Libraria-client MySQL: Ajuta la scrierea programelor client in C.

Diferenta dintre MySQL si mysql MySQL se refera la toata pachetul de distributie MySQL, in timp ce mysql este doar un program-client.

Instalare pe WindowsTrebuie sa ai instalat protocolul TCP/IP (e pe CD-ul cu Windows) si libraria Winsock 2 (Windows 95 nu-l are!!) ca sa mearga MySQL. Pentru a instala pachetul copiat, dezarhiveaza-l intr-un director temporar si ruleaza Setup.exe. Implicit MySQL-Windows se va instala in `C:\mysql'. Daca vrei sa-l instalezi in alt director, instaleaza-l mai intai in `C:\mysql' si apoi muta-l unde vrei, trebuind apoi sa specifici programului cand il startezi noua cale cu comanda:C:\> D:\programs\mysql\bin\mysqld --basedir D:\programs\mysql

Copiaza fisierul C:\mysql\my-xxxxx.cnf in C:\my.cnf si modifica optiunile implicite ale serverului dupa preferinte (vezi sectiunea de "Administrare MySQL"). Instalarea e acum completa. Pentru a testa daca MySQL merge incepe o sesiune MS-DOS (in casuta Start menu-Run tasteaza command) in directorul c:\mysql\bin si scrie urmatoarea comanda:mysqld-shareware --standalone

Se va porni serverul MySQL. Tasteaza mysql si promptul se va schimba in mysql. Tasteaza show databases si ar trebui sa obtii urmatorul rezultat:

7

+----------------+ | Database | +----------------+ | mysql | | test | +----------------+ 2 rows in set (0.00 sec)

Acum vei adauga o parola pentru utilizatorul root in locul utilizatorului anonim care poate fi folosit de oricine:C:\> C:\mysql\bin\mysql mysql< mysql> DELETE FROM user WHERE Host='localhost' AND User=''; mysql> QUIT C:\> C:\mysql\bin\mysqladmin reload C:\> C:\mysql\bin\mysqladmin -u root password your_password

Acum, pentru a opri serverul vei folosi comanda:C:\> mysqladmin --user=root --password=your_password shutdown Tasteaza quit la promptul mysql.

Windows 95/98 Versiunea de MySQL pentru Windows 95/98 are doua versiuni de servere: mysqld si mysqld-opt, optimizat pentru procesoare Pentium. Poti starta serverul cu comanda:C:\mysql\bin\mysqld-opt

si-l poti opri cu comanda:C:\mysql\bin\mysqladmin -u root shutdown

Windows NT/Win2000 Serviciul e instalat cu numele MySQL si trebuie pornit din Services Control Manager (SCM) Utility din Control Panel. Poti configura serverul MySQL sa relueze ca serviciu prin:C:\mysql\bin\mysqld-nt -install

Acum poti porni/opri serviciu cu:NET START mysql M NET STOP mysql

Daca nu vrei sa rulezi MySQL ca serviciu, il poti porni cu comanda:C:\> C:\mysql\bin\mysqld-nt --standalone

In continuare, vei instala serverul APACHE. Este recomandat sa download-ezi versiunea de Apache pentru Windows cu extensia '.exe' de la Apache.org daca esti incepator si nu vrei sa compilezi codul sursa. In continuare, tot ce trebuie sa faci e sa dai click pe fisierul executabil si Apache se va instala pe disc. Poti rula Apache de la o fereastra-consola sau ca un serviciu Windows. Pentru a rula Apache de la consola alege optiunea 'Start Apache as console App' din grupul Apache din meniul Start. Se va deschide o fereastra de consola care va ramane activa pana vei opri serverul Apache alegand 'Shutdown Apache as Console App' sau apasand CTRL+C in ferestra de consola sau deschizand alta fereasta MS-DOS si tiparind:C:\Program Files\Apache Group\Apache> apache -k shutdown

Apache va "asculta" protul 80 dupa ce va fi pornit. Pentru a te conecta la server, deschide browser-ul de Internet si scrie una din adresele: 8

http://localhost/ http://127.0.0.1/

Se va deschide o pagina HTML de bun-venit si informatii despre Apache. Daca nu se intampla nimic si apare o eroare deschide fisierul error.log din direcotrul logs al Apache si vei alfa ce a mers rau. Daca ai schimbat portul (altul decat 80) adauga :numar_port dupa adresa de URL La drum cu PHP... Copiaza distributia PHP de la PHP.net si dezarhiveaza pachetul in directorul 'C:\php4\'. Din acest director copiaza fisierele MSVCRT.DLL and PHP4TS.DLL in 'c:\windows\system'. Apoi, redenumeste php.inidist in php.ini and muta-l in directorul in care e instalat Windows-ul ('c:\windows\'). Deschide acest fisier cu Notepad si caua sirul de caractere "extensio_dir". Schimba valoarea implicita cu 'C:\php4'. Daca ai nevoie de extensii speciale (de exemplu, pentru grafice) sterge comentariile (caracterul ;) din fatza randului din php.ini de genul:

;extensions=php_**.dll

Acum ve trebui sa faci legatura intre PHP, Apache si MySQL. Du-te in directorul in care ai instalat Apache, cauta fisierul 'httpd.conf' din directorul '\conf' si adauga aceste linii:ScriptAlias /php4/ "c:/php4/" AddType application/x-httpd-php4 .php AddType application/x-httpd-php4 .php3 AddType application/x-httpd-php4 .php4 AddType application/x-httpd-php4 .phtml Action application/x-httpd-php4 "/php4/php.exe"

Si gata. Porneste server-ul Apache. Creaza un fisier in Notepad cu continutul:

Salveaza-l ca test.php in "\htdocs" din directorul Apache (locul in care va trebui sa pui toate scripturile PHP ca sa mearga). Apoi deschide-l in browser:http://localhost/test.php

9

Se va obtine un fisier HTML cu informatii despre configirarea PHP. PHP poate fi folosit si fara server-ul Apache prin rularea din linia de comanda (Command Prompt) cu parametru un fisier *.php:C:\php4\php text.php

Pentru a folosi PHP cu Apache, se vor copia toate fisierele *.php in directorul htdocs din folder-ul /Apache Group/Apache.

Instalare pe LinuxLinux Varianta 1 - Distributia RPM MySQL Este metoda recomandata de a instala MySQL pe Linux. Fisierele RPM care te intereseaza sunt: MySQL-VERSION.i386.rpm - Server-ul MySQL. MySQL-client-VERSION.i386.rpm - Programele-client MySQL. MySQL-VERSION.src.rpm - Codul sursa al tutoror RPM-urilor. Intra ca superuser (Tasteaza "su" la prompt si da parola de root). Intra in directorul cu RPM-urile copiate si tasteaza:shell> rpm -ivh "mysql_file_name.rpm"

Acum vom stabili o parola pentru utilizatorul root:shell> mysqladmin -u root password parola_ta

Pentru a starta clinetul mysql:shell> mysql -u root -p

Vei fi intrebat parola. Tasteaz-o (e cea pe care ai pus-o in loc de 'parola_ta' in comanda de mai sus). Daca nu esti intrebat de parola intra in '/etc/rc.d/init.d/' si tasteaza ./mysql start si acum porneste serverul mysql ca mai sus. Odata ce clientul mysql a pornit vei primi promptul mysql>. Tasteaza:shell> show databases;

Rezulatul va fi unul similar cu:+----------------+ | Database | +----------------+ | mysql | | test | +----------------+ 2 rows in set (0.00 sec)

Linux Varianta 2 - distributia sursa (Doar pentru avansati !!!) Copiaza fisierul .tar.gz de la http://www.mysql.com/downloads/. Dezarhiveaza-l cu:gunzip mysql-3.23.22.tar.gz tar xf mysql-3.23.22.tar

Se va crea un director cu numele distributiei. Intra in acest director cu 'cd'. Comenzile pe care le vei folosi pentru a instala distributia sursa sunt:shell> shell> shell> shell> shell> groupadd mysql useradd -g mysql mysql gunzip < mysql-VERSION.tar.gz | tar -xvf cd mysql-VERSION ./configure --prefix=/usr/local/mysql

10

shell> shell> shell> shell> shell> shell> shell> shell>

make make install scripts/mysql_install_db chown -R root /usr/local/mysql chown -R mysql /usr/local/mysql/var chgrp -R mysql /usr/local/mysql cp support-files/my-medium.cnf /etc/my.cnf /usr/local/mysql/bin/safe_mysqld --user=mysql &

Primul pas acum e sa rulezi confiruarea serverului cu comanda:./configure --prefix=/path/to/installation

Apoi:make make install

Configurare post-instalare Se vor instala tabelele de grant (cu drepturile de utilizatori) si se porneste server-ul cu comenzile: - pt. distributia sursa:shell> ./scripts/mysql_install_db shell> cd mysql_installation_directory shell> ./bin/safe_mysqld --user=mysql &

- pt. distrubita binara(nu cea cu pachete RPM sau pkg:shell> cd mysql_installation_directory shell> ./bin/mysql_install_db shell> ./bin/safe_mysqld --user=mysql &

Testeaza acum daca serverul e pornit si functioneaza:shell> BINDIR/mysqladmin version shell> BINDIR/mysqladmin variables

PHP si Apache pe Linux Pe UNIX PHP e instalat ca o extensie a Apache. Deci instalarea lor se va face simultan. Incepe prin dezarhivarea pachetelor PHP si Apache.gunzip apache 1.3.x.tar.gz tar xf apache1.3.x.tar gunzip php-4.02.tar.gz tar xf php-4.02

Foloseste 'cd' pentru a ajunge in directorul in care ai dezarhivat Apache si ruleaza 'configure' pentru a specifica calea in care se va instala Apache:./configure --prefix=/path/to/apache

Acum, revino la PHP si dupa ce-ai rulat 'configure' da-i comenzile:make make install

In directorul Apache ruleaza din nou 'configure':./configure --prefix=/path/to/apache --activate-module=src/modules/php4/libphp4.a

Apoi:make make install

Apache e instalat acum in directorul specificat. Ultimii pasi: in directorul PHP copiaza fisierul php-ini.dist in /usr/local/lib/php.ini si deschide fisierul 'httpd.conf' din '/conf' al Apache si sterge comentariul (semnul ;) din fata liniei:AddType application/x-httpd-php .php

Starteaza Apache din directorul '/bin':./apachectl start

11

Felicitari! Ai reusit sa instalezi MySQL, PHP si Apache. Daca, totusi, ceva a mers rau consulta sectiunile de F.A.Q. din documentatiile aferente.

12

Utilizarea server-ului MySQLConectarea la server Privilegiile utilizatorilor Crearea bazelor de date si a tabelelor Tipuri de campuri Inserarea de inregistrari Actualizarea inregistrarilor Extragerea inregistrarilor cu SELECT Join-uri intre tabele Stergerea inregistrarilor si a tabelelor Crearea indecsilor Modificarea tabelelor

Conectarea si deconectarea de la serverPrimul lucru pe care trebuie sa-l observi este ca fiecare comanda data server-ului se termina cu ';'. Fara aceste terminator nu se va intampla nimic. Asta inseamna ca poti avea linii noi in mijlocul unei comenzi sau poti da mai multe comenzi pe aceeasi linie:1. 2. -> -> -> 3. mysql> SELECT VERSION(); SELECT NOW(); mysql> SELECT USER() , CURRENT_DATE; mysql> grant select ->

Acest ultim prompt insemna ca MySQL mai asteapta sa fie introdus ceva (asteapta ';'). Alta caracteristica de notat este ca declaratiile SQL (Structured Query Language - un limbaj de interogare a bazelor de date) nu sunt case sensitive Daca vrei sa nu mai executi o comanda pe care ai scris-o partial, o poti anula cu '\c':mysql> SELECT -> USER() -> \c mysql>

Ce insemna prompt-urilemysql> Gata pentru o noua comanda. -> Asteapta urmatoarea linie dintr-o comanda. multi-linie. '> Astepta continuarea unui sir de caractere care incepe cu '. "> Astepta continuarea unui sir de caractere care incepe cu ".

13

Este important de stiut ce inseamna prompt-urile '> and "> , deoarece daca din greseala introduci un sir neterminat, orice altceva ce vei tasta (chiar si quit) nu va fi luat in seama. Pentru a te conecta la server, de obicei esti nevoit sa dai numele de utilizator si parola:shell> mysql -h host -u user -p Enter password: ********

Comanda mysql invoca programul-monitor MySQL, un program client care te conecteaza la server. -h specifica numele gazdei (host) la care te vei conecta (doar daca te conectezi pe alta statie de lucru). -u specifica numele tau de utilizator ('root' daca ai MySQL pe propria statie, sau alt nume dat de administrator..). -p spune server-ului ca te vei conecta folosind o parola.shell> mysql -h host -u user -p Enter password: ******** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 459 to server version: 3.22.20a-log Type 'help' for help. mysql>

In functie de cum ai instalat si configurat MySQL, ai putea fi lasat sa te conectezi la server fara nume de utilizator sau parola:shell> mysql

Dupa ce te-ai conectat cu succes la server te poti deconecta cu comanda QUIT sau apasand CTRL+Dmysql> QUIT

14

Crearea utilizatorilorSistemul de privilegii al MySQLUna dinte cele mai bune caracteristici ale MySQL este ca suporta un sistem de privilegii (dreptul de a face o anumita actiune asupra unui obiect) pentru utilizatori foarte sofisticat. Cand vei crea un utilizator, ii vei da acces la un set de privilegii pentru a specifica ce anume poate sa faca si ce nu poate sa faca un utilizator. Un utilizator ar trebui sa aiba cel mai mic nivel de privilegii necesar pentru a-si indeplini sarcina. Crearea drepturilor pentru utilizatori se face cu comanda GRANT, iar retragerea drepturilor cu REVOKE Pentru a crea un administrator:mysql> grant all -> on * -> to fred identified by mnb123 -> with grant option;

Pentru a-i retrag drepturile acestui utilizator:mysql> revoke all -> on * -> from fred;

Exemplu de acordare drepturi pentru un utilizator:mysql> grant select, insert, update, delete, index, alter, create, drop -> on carti.* -> to alina;

Crearea tabelelorVom crea o baza de date angajati pe care o vom folosi si in alte ocazii: Pe Windws:create database angajati;

Sa vedem cate baze de date sunt in sistem:show databases; +----------------+ | Database | +----------------+ | angajati | | mysql | | test | +----------------+ 3 rows in set (0.00 sec)

Sub Linux: Trebuie sa devii superuser si sa tastezi parola de root:create database angajati; GRANT ALL ON angajati.* TO marius@localhost IDENTIFIED BY "eagle"

Ultima conanda acorda toate drepturile asupra tabelei angajati utilizatorului Marius. Iesi cu QUIT si intra din nou cu nume de utilizator de aceasta data:

15

mysql -u user_name -p

Ar trebui sa apara ca in continuare:[marius@localhost marius]$ mysql -u marius -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is X to server version: 3.XX.XX

Deschiderea unei baze de date se poate face cu una din metodele:

Specificand nume bazei de date la inceputul sesiunii:mysql angajati (sub Windows) mysql angajati -u user1 -p (sub Linux)

Cu comanda USE: mysql>USE angajati; Specificand direct numele bazei de date la prompt:

mysql>\u angajati;

Daca nu specificam o baza de date cand lucram cu MySQL, se va genera o eroare! Pentru baza noastra de date vom avea o tabela cu detalii despre angajati si o tabela cu date personale. Dupa ce ai selectat baza de date angajati dai urmatoarea comanda:mysql> CREATE TABLE angajati_data -> ( -> emp_id int unsigned not null auto_increment primary key, -> f_name varchar(20), -> l_name varchar(20), -> title varchar(30), -> age int, -> yos int, -> salary int, -> perks int, -> email varchar(60) -> ); Query OK, 0 rows affected (0.01 sec) CREATE TABLE e urmata de numele tabelei si poia de numele si tipul de date al campurilor din baza de

date. 'varchar' inseamna caractere de lungime variabile. Numarul din paranteza este lungimea maxima de caractere admise.'not null' specifica ca nu avem voie sa avem valori nule pe acel camp in inregistrari. 'int' inseamna numar inreg, iar 'unsigned' numar pozitiv. 'auto_increment' specifica pentru MySQL sa atribuie o valoare automat la o noua adaugare de inregistrare cu o valoare mai mare cu 1 decat cea mai mare valoare din acel camp (necesar pentru un camp ID). 'primary key' speciofica ca acel camp va fi indexat (fiecare valoare va fi unicat).

Tipuri de campuriCele trei tipuri de baza pentru campuri sunt: numeric, data si timp si sir de caractere(string). Cand alegi un anumit tip sau subtip, poti specifica si lungimea maxima admisa (M, maxim 255). Tipurile de date numerice Pentru numerele in virgula flotanta (float), poti specifica cu D numarul de cifre dupa puctul zecimal. 16

Pentru numerele intregi poti sa specifici daca vor fi doar pozitive cu 'unsigned'. Tipuri de date intregiTip Interval TINYINT[(M)] -127..128 or 0..255 SMALLINT[(M)] -32768..32767 or 0..65535 MEDIUMINT[(M)] -8388608.. 8388607 or 0..16777215 INT[(M)] -231..231-1 or 0..232-1 INTEGER[(M)] BIGINT[(M)] -263..263-1 8 or 0..264-1 (Bytes) 1 2 3 Descriere Foarte mic integers Intregi mici Marime medie

4

Intregi normali Sinonim cu INT Intregi mari

Tipuri de date flotanteTip FLOAT(precision) dubla FLOAT[(M,D)] DOUBLE[(M,D)] Interval depinde (Bytes) Descriere Precizie simpla sau precizie Precizie simpla Precizie dubla

1.175494351E-38 3.402823466E+38 1.7976931348623157E +308 2.2250738585072014E -308 la fel la fel variaza

4 8

DOUBLE PRECISION[(M,D)] REAL[(M,D)] DECIMAL[(M[,D])]

M+2

Float stocat ca char.

NUMERIC[(M,D)]

la fel

Sinonim cu DECIMAL.

Tipurile pentru data si timpTip DATE Interval 1000-01-01 9999-12-31 TIME -838:59:59 838:59:59 DATETIME 1000-01-01 00:00:00 9999-12-31 23:59:59 TIMESTAMP 1970-01-01 [(M)] 00:00:00 YEAR[(2|4)] 7069 format. 19012155 Descriere O data(YYYY-MM-DD). Un time(HH:MM:SS). Data si timp(YYYY-MM-DDHH:MM:SS).

Un timestamp, folosit in tranzactii. Un an in format cu 2 sau 4 cifre You can specify 2 or 4 digit

TIMESTAMP-uriType Specified TIMESTAMP TIMESTAMP(14) TIMESTAMP(12) TIMESTAMP(10) Display YYYYMMDDHHMMSS YYYYMMDDHHMMSS YYMMDDHHMMSS YYMMDDHHMM

17

TIMESTAMP(8) TIMESTAMP(6) TIMESTAMP(4) TIMESTAMP(2)

YYYYMMDD YYMMDD YYMM YY

Tipuri pentru siruri de caractere Se impart in trei grupuri:siruri normale: CHAR (fixed length character) si VARCHAR (variable length character), siruri TEXT si BLOB pentru siruri lungi/date binare si sirurile SET si ENUM (valori predefinte). Tipuri pentru siruri de caractere regulareTip [NATIONAL] CHAR(M) [BINARY] [NATIONAL] VARCHAR(M) [BINARY] Interval 1 to 255 1 to 255

Tipuri TEXT si BLOBLungime maxima (Caractere) 28-1 (255) TINYTEXT 28-1 BLOB 216-1 (65.535) TEXT 216-1 MEDIUMBLOB 224-1 (16.777.215) MEDIUMTEXT 224-1 LONGBLOB 232-1 (4.294.967.295) LONGTEXT 232-1 Tip TINYBLOB

Tipuri SET si ENUMTip Nr. valori in set Descriere ENUM(valoare1, 65535 O singura valoare din lista sau NULL valoare2,...) SET(valoare1, 64 Un set dintre valorile din lista. valoare2,...)

Exemplu:create table _tabela1 ( id int auto_increment primary key, answer enum (da, nu) default nu );

Tipul de camp NULL Pentru a face o valoare dintr-un camp NULL, nu include acel camp in declaratia INSERT. Campurile au ca valoare implicita NULL daca nu specifici 'NOT NULL'. Pentru compararea valorilor cu NULL se folosesc 'IS NULL' sau 'IS NOT NULL'. Descrierea tablelelor Permite afisarea detaliilor despre campurile tabelei.mysql> DESCRIBE angajati_data;

18

+--------+------------------+------+-----+---------+------+ | Field | Type | Null | Key | Default | Extra| +--------+------------------+------+-----+---------+------| | emp_id | int(10) unsigned | | PRI | 0 | | | | auto_increment| | | | | | f_name | varchar(20) | YES | | NULL | | | l_name | varchar(20) | YES | | NULL | | | title | varchar(30) | YES | | NULL | | | age | int(11) | YES | | NULL | | | yos | int(11) | YES | | NULL | | | salary | int(11) | YES | | NULL | | | perks | int(11) | YES | | NULL | | | email | varchar(60) | YES | | NULL | | +--------+------------------+------+-----+---------+------+ 9 rows in set (0.00 sec)

Inserarea inregistrarilor in tabeleComanda SQL INSERT inseareaza informatii in tabele.INSERT into nume_tabela (camp1, camp2....) values (val1, val2...);

Exemplu:mysql> INSERT INTO angajati_data -> (f_name, l_name, title, age, yos, salary, perks, email) -> values -> ("Manish", "Sharma", "CEO", 28, 4, 200000, -> 50000, "[email protected]"); Query OK, 1 row affected (0.00 sec)

Daca vrei sa inserezi unul dintre urmatoarele caractere intr-un camp de tip text, trebui sa-i adaugi inainte un caracter backslash(\): \ % _ (apostrof) :\' (ghilimele):\" (backslash) :\\ (procent) :\% (liniuta de subliniere) :\_

Actualizarea datelor din tabeleSe face cu comanda SQL UPDATE.UPDATE nume_tabela SET nume_camp1 = val1, nume_camp2 = val2, nume_camp3 = val3 ... [WHERE conditii]; UPDATE angajati_data SET salary = salary + 20000,

19

perks = perks + 5000 WHERE title='CEO'; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0

Extragerea informatiilor dorite din tabelaInformatiile dorite sunt extrase din tabela (preocesul de interogare) cu comanda SELECTSELECT nume_campuri from nume_tabela [WHERE ...conditii];

De exemplu, pentru a extrage nume si prenumele tuturor angajatilor (presupunand ca ai mai adaugat pe parcurs mai multe inregistrari cu INSERT sau LOAD DATA INFILE):mysql> SELECT f_name, l_name from angajati_data; +---------+------------+ | f_name | l_name | +---------+------------+ | Manish | Sharma | | John | Hagan | | Ganesh | Pillai | | Anamika | Pandit | | Mary | Anchor | | Fred | Kruger | | John | MacFarland | | Edward | Sakamuro | | Alok | Nanda | | Hassan | Rajabi | | Paul | Simon | | Arthur | Hoopla | | Kim | Hunter | | Roger | Lewis | | Danny | Gibson | | Mike | Harper | | Monica | Sehgal | | Hal | Simlai | | Joseph | Irvine | | Shahida | Ali | | Peter | Champion | +---------+------------+ 21 rows in set (0.00 sec)

Pentru a afisa intreaga tabela, in loc sa specificam toate campurile vom folosi simbolul '*':SELECT * from angajati_data;

Selectia conditionala Puterea SGBD-ului sta in permiterea de a extrage informatii dupa anumite conditii specificateSELECT f_name, l_name from angajati_data where f_name = 'John'; +--------+------------+ | f_name | l_name | +--------+------------+ | John | Hagan | | John | MacFarland | +--------+------------+ 2 rows in set (0.00 sec)

20

Comparatiile MySQL sunt case insensitive ceea ca inseamna ca "john", "John" sau "JoHn" ar merge in exemplul de mai sus. Operatori de comparatieOperator Nume = eqalitate > mai mare Exemplu customerid = 3 amount>60.00

< mai mic amount= mai mic sau egal amount>=60.00 IN ('Web Designer', 'System Administrator'); +---------+--------+----------------------+ | f_name | l_name | title | +---------+--------+----------------------+ | Anamika | Pandit | Web Designer | | Mary | Anchor | Web Designer | | Roger | Lewis | System Administrator | | Danny | Gibson | System Administrator | +---------+--------+----------------------+ 4 rows in set (0.00 sec) select f_name, l_name, age from -> angajati_data where age BETWEEN -> 32 AND 40; +---------+------------+------+ | f_name | l_name | age | +---------+------------+------+ | John | Hagan | 32 | | Ganesh | Pillai | 32 | | John | MacFarland | 34 | | Alok | Nanda | 32 | | Hassan | Rajabi | 33 | | Arthur | Hoopla | 32 | | Kim | Hunter | 32 | | Roger | Lewis | 35 | | Danny | Gibson | 34 | | Mike | Harper | 36 | | Shahida | Ali | 32 | | Peter | Champion | 36 | +---------+------------+------+ 12 rows in set (0.00 sec) select -> -> -> f_name, l_name, salary from angajati_data where salary NOT BETWEEN 90000 AND 150000;

+---------+------------+--------+ | f_name | l_name | salary | +---------+------------+--------+ | Manish | Sharma | 200000 | | Mary | Anchor | 85000 | | Fred | Kruger | 75000 | | John | MacFarland | 80000 | | Edward | Sakamuro | 75000 | | Alok | Nanda | 70000 | | Paul | Simon | 85000 | | Arthur | Hoopla | 75000 | | Hal | Simlai | 70000 | | Joseph | Irvine | 72000 | | Shahida | Ali | 70000 | +---------+------------+--------+ 11 rows in set (0.00 sec)

22

Sortarea datelor Inregistrarile extraswe anterior au fost afisate in rodinea in care erau stocate in tabela. Pentru a le sorta folosim clauza ORDER BY a comenzii SELECT.SELECT l_name, f_name from angajati_data ORDER BY l_name; +------------+---------+ | l_name | f_name | +------------+---------+ | Ali | Shahida | | Anchor | Mary | | Champion | Peter | | Gibson | Danny | | Hagan | John | | Harper | Mike | | Hoopla | Arthur | | Hunter | Kim | | Irvine | Joseph | | Kruger | Fred | | Lewis | Roger | | MacFarland | John | | Nanda | Alok | | Pandit | Anamika | | Pillai | Ganesh | | Rajabi | Hassan | | Sakamuro | Edward | | Sehgal | Monica | | Sharma | Manish | | Simlai | Hal | | Simon | Paul | +------------+---------+ 21 rows in set (0.00 sec)

sau (ordine descrerscatoare):SELECT f_name from angajati_data ORDER by f_name DESC;

Limitarea numarului de inregistrari extraseSELECT f_name, l_name from angajati_data LIMIT 5; +---------+--------+ | f_name | l_name | +---------+--------+ | Manish | Sharma | | John | Hagan | | Ganesh | Pillai | | Anamika | Pandit | | Mary | Anchor | +---------+--------+ 5 rows in set (0.01 sec)

Similar, putem lista cei mai tineri doi angajati:SELECT f_name, l_name, age from angajati_data ORDER BY age LIMIT 2;

23

+--------+----------+------+ | f_name | l_name | age | +--------+----------+------+ | Edward | Sakamuro | 25 | | Mary | Anchor | 26 | +--------+----------+------+ 2 rows in set (0.01 sec)

Forma generala a clauzei LIMIT este:SELECT (...) from tabela LIMIT nr_rand_incepere, nr_inreg_extrase; SELECT f_name, l_name from angajati_data LIMIT 6,3; +--------+------------+ | f_name | l_name | +--------+------------+ | John | MacFarland | | Edward | Sakamuro | | Alok | Nanda | +--------+------------+ 3 rows in set (0.00 sec)

Comanda de mai sus extrage 3 angajati incepand de la inregistrarea 6. Folosirea clauzei DISTINCT permite listarea doar a valorilor distincte din baza de date pentru fiecare camp in parte. Functii agregatMIN(): Valoare minima MAX(): Valoare maxima SUM(): Suma valorilor AVG(): Media aritmetica COUNT(): Numarul inregistrarilor extrase select MIN(salary) from angajati_data; +-------------+ | MIN(salary) | +-------------+ | 70000 | +-------------+ 1 row in set (0.00 sec) select MAX(salary) from angajati_data; +-------------+ | MAX(salary) | +-------------+ | 200000 | +-------------+ 1 row in set (0.00 sec) select SUM(salary) from angajati_data; +-------------+ | SUM(salary) | +-------------+

24

| 1997000 | +-------------+ 1 row in set (0.00 sec) select COUNT(*) from angajati_data; +----------+ | COUNT(*) | +----------+ | 21 | +----------+ 1 row in set (0.00 sec)

Denumirea campurilor in SELECT MySQL permite sa denumesti campurile extrase cu termeni mai descriptivi pentru datele extrase.select avg(salary) AS 'Salariu mediu' from angajati_data; +----------------+ | Salariu mediu | +----------------+ | 95095.2381 | +----------------+ 1 row in set (0.00 sec)

Clauza GROUP BY permite gruparea informatiilor similare. Deci, pentru a lista toate functiile unice din tabela:select title from angajati_data GROUP BY title; +----------------------------+ | title | +----------------------------+ | CEO | | Customer Service Manager | | Finance Manager | | Marketing Executive | | Multimedia Programmer | | Programmer | | Senior Marketing Executive | | Senior Programmer | | Senior Web Designer | | System Administrator | | Web Designer | +----------------------------+ 11 rows in set (0.01 sec)

Clauza HAVING permite specificare unei conditii pentru gruparea inregistrarilorselect title, AVG(salary) from angajati_data GROUP BY title HAVING AVG(salary) > 100000;

25

+----------------------------+-------------+ | title | AVG(salary) | +----------------------------+-------------+ | CEO | 200000.0000 | | Finance Manager | 120000.0000 | | Senior Marketing Executive | 120000.0000 | | Senior Programmer | 115000.0000 | | Senior Web Designer | 110000.0000 | +----------------------------+-------------+ 5 rows in set (0.00 sec)

Extragerea inregistrarilor din mai multe tabele (JOIN-uri)De multe ori, ca sa raspunzi la o intrebare trebui sa extragi date din mai multe tabele. De exemplu, pentru a afla ce clienti au facut comenzi luna asta trebuie sa folosesti tabela clienti si tabela comenzi. Pentru acest lucru in SQL trebuie realizata o relatie intre tabele (JOIN) pe baza unor informatii comune (un camp de ID). In exemplul nostru campul care relationeaza tabela 'angajati_data' este emp_id, iar pentru 'angajati_per 'e_id. Sa extragem numele angajatilor casatoriti din angajati_data si numele sotiei din angajati_per (vom folosi functia CONCAT pentru a alipi doua siruri de caractere):select CONCAT(f_name, " ", l_name) AS Name, s_name as 'Spouse Name' from angajati_data, angajati_per where m_status = 'Y' AND emp_id = e_id; +-----------------+-----------------+ | Name | Spouse Name | +-----------------+-----------------+ | Manish Sharma | Anamika Sharma | | John Hagan | Jane Donner | | Ganesh Pillai | Sandhya Pillai | | Anamika Sharma | Manish Sharma | | John MacFarland | Mary Shelly | | Alok Nanda | Manika Nanda | | Paul Simon | Muriel Lovelace | | Arthur Hoopla | Rina Brighton | | Kim Hunter | Matt Shikari | | Danny Gibson | Betty Cudly | | Mike Harper | Stella Stevens | | Monica Sehgal | Edgar Alan | | Peter Champion | Ruby Richer | +-----------------+-----------------+ 13 rows in set (0.00 sec)

Tipuri de join-uri in MySQL Produs cartezian, Full Join, Cross join Toate combinatiile tuturor liniilor din tabela. Se specifica prin virgula si fara clauza WHERE. Inner join Poate fi specificat prin virgula intre numele tabelelor sau prin folosirea WHERE sau cu cuvintele cheie INNER JOIN. Equi-join Foloseste o conditie cu '=' pentru a face corespondente intre inregistrari.

26

Left join Incearca sa gasesca corespondente intre tabele si cand nu gaseste, umple inregistrarile fara pereche cu NULL.

Stergerea inregistrarilor din tabelaDELETE FROM table [WHERE condition] [LIMIT number]

delete from customers where customerid=5;

Stergerea tabelelorDROP TABLE angajati_data;

Stergerea unei baze de dateDROP DATABASE database;

Crearea indecsilorSe poate face cu comanda INDEX sau specificand la crearea unui tabel un camp ca PRIMARY KEY.index nume_index (nume_coloana_indexata) create table my_table ( id_col int unsigned auto_increment primary key, another_col text );

Indecsi pot cuprinde si mai multe campuri:create table mytable( id_col int unsigned not null, another_col char(200) not null, index dual_col_index(id_col, another_col) );

In versiunea MySQL 3.23 poti indexa si dupa o parte dintr-un campindex index_name (column_name(column_length))

De exemplu:create table my_table( char_column char (255) not null, text_column text not null, index index_on_char (char_column(20)), index index_on_text (text_column(200)) );

Modificarea tabelelor dupa creareALTER TABLE nume modificare [, modificare ...]

Posibile modificari cu ALTER TABLESintaxa ADD [COLUMN] column_description [FIRST | AFTER column ] ADD [COLUMN] (column_description, ADD INDEX [index] (column,...) ADD PRIMARY KEY (column,...) Descriere Adauga o coloana Adauga o descriere de coloana Adauga un index Transforma campul in PK

27

ADD UNIQUE [index] (column,...) ALTER [COLUMN] column {SET DEFAULT value | DROP DEFAULT} CHANGE [COLUMN] column new_column _description MODIFY [COLUMN] column_description DROP [COLUMN] column DROP PRIMARY KEY DROP INDEX index RENAME[AS] new_table_name

Adauga un index pt. unicate Adauga/sterge valorile implicite Modificari pentru coloane

Sterge un camp Sterge PK Sterge indexul Redenumeste o tabela

MySQL ofera 3 tipuri de tabele: ISAM, MyISAM (implicit), BDB, and Heap alese dupa sintaxa:create table nume type=tip_tabela( nume_col coloana attribut );

Heap-urile sunt tabele hash temporare rezidente in memorie. Tabelele BDB sunt folosite la tranzactii, iar tabelele ISAM nu mai sunt recomandate. Deci alegerea implicita MyISAM este cea mai buna si nu trebuie sa-ti faci grji ca trebui sa specifici vreodata un tip de tabela. Sintaxe ALTER: (Redenumire tabela:)alter table nume_vechi rename nume_nou (Modificare camp:)alter table my_table add column my_column text not null (Stergere camp):alter table nume_tabela drop column nume_camp Indecsi:alter alter alter alter alter table my_table add index index_name (column_name1, column_name2, ...) table my_table add unique index_name(column_name) table my_table add primary key(my_column) table table_name drop index index_name table_name test10 drop primary key

28

Limbajul MySQL-functii si comenziSiruri de caractere Numere NULL Numele folosite Variabile definite de utilizator Comentarii Cuvinte rezervate Functii pentru compararea de siruri Functii matematice Functii pentru siruri de caractere Functii pentru date si timp Functii diverse Sintaxa completa a celor mai folosite comenzi

MySQL are o interfata SQL foarte complexa, dar si intuitiva si usor de invatat. Capitolul acesta se ocupa cu prezentarea detaliata a unor comenzi diverse (cum se folosesc ele ai aflat in Utilizare MySQL), tipuri de date si functii de care vei avea nevoie ca sa folosesti MySQL eficient.

Structura limbajului folositSiruri de caractere Un sir de caractere (string) este o secventa de caractere aflata intre apostrofuri sau ghilimele ('un sir' sau "un sir"). Intr-un sir de caractere, unele secvente au un inteles special. Aceste secvente incep cu '\'. MySQL recunoste urmatoarele secvente de escape:\0 0 (NULL) \' Apostrof \" Ghilimele. \b , \\ Backslash \n Linie noua \r Carriage return \t Tab. \z Control-Z (sfarsit de fisier) \% Procent `%' \_

29

Undersore `_'

Daca vrei sa incluzi ghilimele si apostrofuri in siruri de caractere:mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello'; +-------+---------+-----------+--------+--------+ | hello | "hello" | ""hello"" | hel'lo | 'hello | +-------+---------+-----------+--------+--------+ mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello"; +-------+---------+-----------+--------+--------+ | hello | 'hello' | ''hello'' | hel"lo | "hello | +-------+---------+-----------+--------+--------+

Numere Numerele intregi sunt reprezentate ca o secventa de cifre, iar float-urile folosesc '.' ca separator decimal. Valoarea NULL Valoarea NULL inseamna 'Nici o informatie' si difera de valoarea 0 pentru intregi si de sirul gol pentru siruri de caractere. Numele folosite pentru baze de date, tabele, indecsi, coloane si alias-uri Un nume poate contine caractere alfanumerice din setul curent de cacactere (implicit ISO-8859-1 Latin1). Un nume poate incepe cu orice caracter valid in nume. Un nume poate incepe si cu un numar, dar nu poate fi compus numai din numere. Nu poti folosi '.' in nume deoarece e folosit pentru a referi coloanele din tabele. sensibilitatea la majuscule sau minuscule pentru numele alese depinde de sistemul de operare (case sensitive in Unix si case insensitive in Windows). Oricum, in Windows nu poti referi aceeasi baza de date in aceeasi interogare cu un nume in cazuri diferite. Urmatoare interogare nu merge:mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

Numele de coloane sunt case insensitive. Alias-urile sunt case sensitive. Variabile definite de utilizator Se pot defini cu @nume_variabila. Ele nu trebuiesc initializate, contin de la inceput valoare NULL si pot stoca un integ, un numar real, un float sau un sir de caractere. Poti seta o variabila la o anumita valoare cu:SET @variable= { integer expression | real expression | string expression }[,@variable= ...].

sau cu:select @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3; +----------------------+------+------+------+ | @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 | +----------------------+------+------+------+ | 5 | 5 | 1 | 4 | +----------------------+------+------+------+

Comentarii MySQL suporta cometariile #pana la sfarsit de linie, --pana la sfarsit de linie si /*linii multiple*/.mysql> select mysql> select mysql> select mysql> select /* comentariu multi-linii 1+1; # Comentariu pana la sfarsitul linie 1+1; -- Comentariu pana la sfarsitul liniei 1 /* comentariu in-line */ + 1; 1+

30

*/ 1;

Cuvinte rezervateaction alter asc between blob cascade change columns cross data datetime day_second dec delay_key_write distinct end enclosed fields float4 from global having hour_minute ignore inner integer int3 if key leading lines lock longtext match middleint modify natural null optionally add after avg bigint bool case check comment current_date database day dayofmonth decimal delete distinctrow else enum file float8 for grant heap hour_second in insert interval int4 is keys left limit logs low_priority mediumblob min_rows month numeric on or aggregate and bit both char checksum constraint current_time databases day_hour dayofweek default desc double escape explain first flush full grants high_priority hosts index insert_id int1 int8 isam kill length load long max mediumtext minute monthname no optimize order all as binary by character column create current_timestamp date day_minute dayofyear delayed describe drop escaped exists float foreign function group hour identified infile int int2 into join last_insert_id like local longblob max_rows mediumint minute_second myisam not option outer

avg_row_length auto_increment

31

outfile precision processlist references replace rlike select smallint sql_small_result starting tables then tinytext type unlock values varbinary where

pack_keys primary privileges reload restrict row set soname

partial procedure read regexp returns rows show

password process real rename revoke second shutdown

sql_big_tables sql_big_selects sql_log_update sql_select_limit straight_join table text tinyblob to unique usage varying when zerofill string terminated timestamp trailing using update variables write year_month

sql_low_priority_updates sql_log_off status temporary time tinyint use unsigned varchar with year

sql_big_result sql_warnings

Urmatoarele cuvinte pot fi folosite si pentru nume de tabele, coloane etc.:ACTION BIT DATE ENUM NO TEXT TIME TIMESTAMP

FunctiiFunctii pentru compararea de siruri LIKE Cauta un 'pattern' intr-o expresie folosind caracterele wildcard:%(orice numar de caractere) si _ (un singur caracter).expr LIKE pat [ESCAPE escape-char] mysql> select jay greenspan like jay%; jay greenspan like jay% 1

REGEXP Face o cautare folosind o expresie string si o expresie regulara. Returneaza 1 (a gasit) sau 0(n-a gasit).expr REGEXP pat mysql> select name from guestbook where name regexp ^j.*g;

STRCMP STRCMP(expr1,expr2) Returneaza 0 daca sirurile sunt egale, -1 daca primul sir e mai mic si 1 daca sirul 2 e mai mic ca sirul 1. Functii pentru controlul programului IFNULL IFNULL(expr1,expr2)

32

Daca expr1 nu e NULL, returneaza expr1, altfel ret. expr2.mysql> select ifnull(1/0, exp 1 is null); +--------------------------------+ | ifnull(1/0, exp 1 is null) | +--------------------------------+ | exp 1 is null | +--------------------------------+ 1 row in set (0.00 sec)

IFIF(expr1,expr2,expr3) mysql> select if(name like jay%, Yes, No) as Jay Names -> from guestbook;

Functii matematice ABS (modulul unui numar) SIGN (semnul:-1 negativ, 1 pozitiv, 0 egal cu 0) MOD (rstul impartirii) FLOOR (cea mai mare valoare intreaga mai mica ca un numar) CEILING (cea mai mica valoare intreaga mai mare ca un numar) ROUND (un numar rotunjit la o valoare intreaga) TRUNCATE (trunceaza un numar la un anumit numar de zecimale)mysql> select truncate(8.53,0), truncate(8.43,0), truncate(8.534,2);

|truncate(8.53,0)|truncate(8.43,0)|truncate(8.534,2)| | 8 | 8 | 8.53 | 1 row in set (0.05 sec)

EXP (exponentiala unui numar) LOG (logaritm) LOG10 (logaritm zecimal) POW(X,Y) (X la puterea Y) SQRT (radacina patrata) PI (aproximarea lui PI) COS (cosinus) SIN (sinus) TAN (tangenta) ACOS (arccosinus) ASIN (arcsinus) ATAN (arctangenta) COT (cotangenta) RAND (valoare la intamplare intre 0 si 1.0) LEAST (cel mai mic argument)mysql> select least(2,7,9,1); |least(2,7,9,1)| | 1 | 1 row in set (0.00

sec)

GREATEST (cea mai mare valoare dintre argumente)

33

DEGREES (converteste din radiani in grade) RADIANS (converteste din grade in radiani) Functii pentru siruri de caractere ASCII(str) (codul ASCII)mysql> select ascii(\n); | ascii(\n)| | 10 | 1 row in set (0.00 sec)

ORD(str) CONV(N,from_base,to_base) BIN(N) (converteste N in baza 2) OCT(N) (converteste N in baza 8) HEX(N) (converteste N in baza 16) CHAR(N1,N2,...) (sirul de caractere format din reprezentarile ASCII ale argumentelor intregi) CONCAT(str1,str2,...) (concateneaza doua siruri de cacactere) LENGTH (lungimea unui sir) LOCATE(substr,str [,pos]) (cauta pozitia unui subsir intr-un sir)mysql> select locate(s, mysql functions) as example1, -> locate(s, mysql functions,4) as example2; |example1|example2| | 3 | 15 | 1 row in set (0.00 sec)

INSTR(str,substr) (pozitia subsirului in sir) LPAD(str,len,padstr) (sirul padstr e adaugat la stanga lui srt) RPAD LEFT(str,len) (primele 'len' caractere din str) RIGHT(str,len) SUBSTRING(str,pos[,len]) sau MID(str,pos,len)mysql> select mid(mysqlfunctions,6,8); | mid(mysqlfunctions,6,8)| | function | 1 row in set (0.00 sec)

SUBSTRING_INDEX(str,delim,count)mysql> select substring_index(mysqlfunctionsmysql, fu, | substring_index(mysqlfunctions, fu, 1) | | mysql | 1 row in set (0.00 sec) mysql> select substring_index(mysqlfunctionsmysql, fu, | substring_index(mysqlfunctionsmysql, fu, -1) | nctionsmysql 1 row in set (0.00 sec) | | -1); 1);

LTRIM RTRIM 34

TRIM TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str) REPLACE(str,from_str,to_str) SOUNDEX(str) (sirul in format SOUNDEX) SPACE(N) (un spatiu de N pozitii) REPEAT(str,count) (repeta str de 'count' ori) REVERSE (inverseaza un sir) INSERT(str,pos,len,newstr)mysql> select insert(mysqlfunctions, 6,2,FU); + + |insert(mysqlfunctions, 6,2,FU)| + + |mysqlFUnctions | + + 1 row in set (0.44 sec)

FIELD(str,str1,str2,str3,...) (pozitia str in cadrul argumentelor) LCASE (lowercase) UCASE (uppercase) LOAD_FILE (continutul unui fiser ca sir Functii pentru data calendaristica si timp DAYOFWEEKmysql> select dayofweek(2001-01-01); + + | dayofweek(2001-01-01)| | 2 | 1 row in set (0.33 sec)

WEEKDAY DAYOFMONTH DAYOFYEAR MONTHNAME QUARTER (semestrul din care face parte data) WEEK(date [, first]) (first=0-saptamana incepe duminica, first=1-saptamana incepe luni) YEAR YEARWEEK (anul si saptamana in format YYYYWW) HOUR MINUTE SECOND PERIOD_ADD(P,N) (adauga N luni la perioda P) PERIOD_DIFF(P1,P2) DATE_ADD DATE_SUB(date,INTERVAL expr type) TO_DAYS FROM_DAYS DATE_FORMATSpecificatori pentru DATE_FORMAT %M Luna (JanuaryDecember) %W Ziua (Sunday Saturday) %D Numarul zilei(1st, 2nd, 3rd, etc.)

35

%Y %y %a %d %e %m %c %b %j %H %k %h %I %l %i %r %T %S %s %p %w %U %u %V %v %X %x %%

Anul AAAA Anul AA Numele abreviat al zilei(Sun..Sat) Numarul zilei lunii(00..31) Numarul zilei lunii(0..31) Numarul lunii(01..12) Numarul lunii(1..12) Numele lunii(Jan..Dec) Numarul zilei in an(001..366) Ora (00..23) Ora (0..23) Ora (01..12) Ora (01..12) Ora (1..12) Minutele(00..59) Timpul, 12-ore (hh:mm:ss [AP]M) Timpul, 24-ore (hh:mm:ss) Secundele(00..59) Secundele (00..59) AM sau PM Ziua saptamanii (0=Sunday..6=Saturday) Saptamana (0..53) Saptamana (0..53) Saptamana (1..53) Saptamana (1..53) Anul pentru saptamana Anul pentru saptamana Caracterul % %W %M %d, %Y);

Exemplu:mysql> select date_format(2001-01-01, | date_format(2001-01-01, %W %M | Monday January 01, 2001 1 row in set (0.00 sec) %d, %Y) | |

TIME_FORMAT CURDATE CURTIME NOW (data si ora curenta YYYY-MM-DD HH:MM:SS) Alte functii diverse Database (numele bazei de date curente) User (numele utilizatorului curent) VERSION (versiunea MySQL) LAST_INSERT_ID (ultima valoare inserata intr-un camp 'auto_increment')

Sintaxa completa a celor mai folosite comenzi MySQLSELECTSELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [HIGH_PRIORITY] [DISTINCT | DISTINCTROW | ALL]

36

select_expression,... [INTO {OUTFILE | DUMPFILE} 'file_name' export_options] [FROM table_references [WHERE where_definition] [GROUP BY {unsigned_integer | col_name | formula} [ASC | DESC], ...] [HAVING where_definition] [ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...] [LIMIT [offset,] rows] [PROCEDURE procedure_name] [FOR UPDATE | LOCK IN SHARE MODE]]

INSERTINSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES (expression,...),(...),... sau INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name,...)] SELECT ... sau INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name SET col_name=expression, col_name=expression, ...

ALTER TABLEALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec ...] alter_specification: ADD [COLUMN] create_definition [FIRST | AFTER column_name ] sau ADD [COLUMN] (create_definition, create_definition,...) sau ADD INDEX [index_name] (index_col_name,...) sau ADD PRIMARY KEY (index_col_name,...) sau ADD UNIQUE [index_name] (index_col_name,...) sau ADD FULLTEXT [index_name] (index_col_name,...) sau ADD [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name,...) [reference_definition] sau ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT} sau CHANGE [COLUMN] old_col_name create_definition sau MODIFY [COLUMN] create_definition sau DROP [COLUMN] col_name sau DROP PRIMARY KEY sau DROP INDEX index_name sau DISABLE KEYS sau ENABLE KEYS sau RENAME [TO] new_tbl_name sau ORDER BY col sau table_options

UPDATEUPDATE [LOW_PRIORITY] [IGNORE] tbl_name SET col_name1=expr1, [col_name2=expr2, ...] [WHERE where_definition] [LIMIT #]

37

LOAD DATA INFILELOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE tbl_name [FIELDS [TERMINATED BY '\t'] [[OPTIONALLY] ENCLOSED BY ''] [ESCAPED BY '\\' ] ] [LINES TERMINATED BY '\n'] [IGNORE number LINES] [(col_name,...)]

DELETEDELETE [LOW_PRIORITY | QUICK] FROM table_name [WHERE where_definition] [ORDER BY ...] [LIMIT rows] sau DELETE [LOW_PRIORITY | QUICK] table_name[.*] [table_name[.*] ...] FROM table-references [WHERE where_definition]

CREATE INDEXCREATE [UNIQUE|FULLTEXT] INDEX index_name ON tbl_name (col_name[(length)],... )

CREATE TABLECREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [select_statement] create_definition: col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [PRIMARY KEY] [reference_definition] sau PRIMARY KEY (index_col_name,...) sau KEY [index_name] (index_col_name,...) sau INDEX [index_name] (index_col_name,...) sau UNIQUE [INDEX] [index_name] (index_col_name,...) sau FULLTEXT [INDEX] [index_name] (index_col_name,...) sau [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name,...) [reference_definition] sau CHECK (expr) type: sau sau sau sau sau sau sau sau sau sau TINYINT[(length)] [UNSIGNED] [ZEROFILL] SMALLINT[(length)] [UNSIGNED] [ZEROFILL] MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL] INT[(length)] [UNSIGNED] [ZEROFILL] INTEGER[(length)] [UNSIGNED] [ZEROFILL] BIGINT[(length)] [UNSIGNED] [ZEROFILL] REAL[(length,decimals)] [UNSIGNED] [ZEROFILL] DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL] FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL] DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL] NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]

38

sau sau sau sau sau sau sau sau sau sau sau sau sau sau sau sau

CHAR(length) [BINARY] VARCHAR(length) [BINARY] DATE TIME TIMESTAMP DATETIME TINYBLOB BLOB MEDIUMBLOB LONGBLOB TINYTEXT TEXT MEDIUMTEXT LONGTEXT ENUM(value1,value2,value3,...) SET(value1,value2,value3,...)

index_col_name: col_name [(length)] reference_definition: REFERENCES tbl_name [(index_col_name,...)] [MATCH FULL | MATCH PARTIAL] [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT table_options: TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MYISAM } sau AUTO_INCREMENT = # sau AVG_ROW_LENGTH = # sau CHECKSUM = {0 | 1} sau COMMENT = "string" sau MAX_ROWS = # sau MIN_ROWS = # sau PACK_KEYS = {0 | 1} sau PASSWORD = "string" sau DELAY_KEY_WRITE = {0 | 1} sau ROW_FORMAT= { default | dynamic | fixed | compressed } sau RAID_TYPE= {1 | STRIPED | RAID0 } RAID_CHUNKS=# RAID_CHUNKSIZE=# sau UNION = (table_name,[table_name...]) sau DATA DIRECTORY="directsauy" sau INDEX DIRECTORY="directsauy" select_statement: [IGNORE | REPLACE] SELECT ...

(Some legal select statement)

CREATE DATABASECREATE DATABASE [IF NOT EXISTS] db_name

DROP DATABASEDROP DATABASE [IF EXISTS] db_name

DROP INDEX

39

DROP INDEX index_name ON tbl_name

DROP TABLEDROP TABLE [IF EXISTS] tbl_name [, tbl_name,...] [RESTRICT | CASCADE]

RENAME TABLERENAME TABLE tbl_name TO new_table_name[, tbl_name2 TO new_table_name2,...]

JOINtable_reference, table_reference table_reference [CROSS] JOIN table_reference table_reference INNER JOIN table_reference table_reference STRAIGHT_JOIN table_reference table_reference LEFT [OUTER] JOIN table_reference ON conditional_expr table_reference LEFT [OUTER] JOIN table_reference USING (column_list) table_reference NATURAL LEFT [OUTER] JOIN table_reference { oj table_reference LEFT OUTER JOIN table_reference ON conditional_expr }

40

Administrarea MySQLAdministrarea utilizatorilor Controlul accesului Comezile GRANT si REVOKE Backup-ul bazelor de date Securitatea datelor Optimizarea MySQL

Administrarea oricarui sistem de gestiune a bazelor de date relationale (SGBDR) necesita putina munca. Fiecare sistem are propriile metode pentru administrare si propriile dificultati cand vine vorba de adaugarea si stergerea de conturi ale utilizatorilor, backup si asigurarea securitatii. Administarea serverului MySQL nu este dificila per ansamblu, dar poate speria la inceput.

Administrarea utilizatorilorTabelele de grant Drepturile utilizatorilor MySQL sunt stocate in cateva tabele care sunt create automat la instalarea MySQL. Aceste tabele apartin bazei de date mysql:mysql> use mysql Database changed mysql> show tables; +-------------------+ | Tables in mysql | +-------------------+ | columns_priv | | db | | func | | host | | tables_priv | | user | +-------------------+ 6 rows in set (0.00 sec)

Fiecare dintre aceste tabele corespunde controlului unui nivel de acces. Poti crea un oricati utilizatori care pot accesa MySQL de pe diferite gazde. Pentru fiecare combinatie utilizator/gazda, acorzi acces la o intreaga baza de data, la anumite tabele, sau la anumite coloane dintr-o tabele. Aditional, aceste tabele acorda privilegii de administrare. Utilizatorilor le poate fi dat dreptul de a adauga/sterge baze de date sau de a acorda altor utilizatori drepturi de administare. In practica, nu ar trebui sa acorzi mai multe drepturi decat e necesar pentru a proteja datele de curiosi sau de incompetenti. Pentru asta trebuie sa stii ca drepturile sunt acordate intr-un mod ierarhic. Cele acordate pe tabela user sunt universale: daca un utilizator are privilegiu de stergere(drop) in tabela user,

41

acesta poate sterge orice tabela din rocie baza de date din MySQL. Tabela db acorda privilegii asupra unei intregi baze de date. Pentru o tabela/set de tabele foloseste tables_priv. Tabela columns_priv acorda drepturi asupra unor anumite colobne dintr-o tabela. Tabela user Orice utilizator care vrea sa lucreze in MySQL trebuie sa fie inscris in acesta tabela. Drepturile pot fi acordate in alta parte, dar fara o inscriere aici, utilizatorului nu i se va permite conectarea la server.mysql> show columns from user; +-------------------+---------------+-------+-------+-----------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------------------------------------------------------------+ | Host | char(60) | | PRI | | | | User | char(16) | | PRI | | | | Password | char(16) | | | | | | Select_priv | enum(N,Y) | | | N | | | Insert_priv | enum(N,Y) | | | N | | | Update_priv | enum(N,Y) | | | N | | | Delete_priv | enum(N,Y) | | | N | | | Create_priv | enum(N,Y) | | | N | | | Drop_priv | enum(N,Y) | | | N | | | Reload_priv | enum(N,Y) | | | N | | | Shutdown_priv | enum(N,Y) | | | N | | | Process_priv | enum(N,Y) | | | N | | | File_priv | enum(N,Y) | | | N | | | Grant_priv | enum(N,Y) | | | N | | | References_priv | enum(N,Y) | | | N | | | Index_priv | enum(N,Y) | | | N | | | Alter_priv | enum(N,Y) | | | N | | +-------------------+---------------+-------+-------+-----------+-------+ 17 rows in set (0.00 sec)

MySQL identifica un utilizator dupa combinatia user-host. Prin urmare, un utilizator poate avea cate un set de drepturi diferite pentru fiecare gazda (host) pe care o foloseste pentru a se conecta la MySQL. Drepturile setate pe Y (yes) sunt acodate pentru toate tabele din orice baza de date. Alte drepturi: - File_priv acorda dreptul de a scrie si citi fisiere de pe disc. - process_priv acorda dreptul de a vedea si de a termina toate comenzile si threrad-rile in curs de executie(poti vedea ce fac si ce tasteaza ceilalti utilizatori !!). - Grant_priv da dreptul de a putea acorda mai departe privilegiile proprii altor utilizatori. - Reload_priv e folosit, in special pentru a face comenzi flush - Shutdown_priv da dreptul de a opri server-ul folosind mysqladmin shutdown. Tabela dbmysql> show columns from db; +---------------------------------------------------------------------------+ | Field | Type | Null | Key | Default | Extra | +---------------------------------------------------------------------------+ | Host | char(60) | | PRI | | | | Db | char(32) | | PRI | | | | User | char(16) | | PRI | | | | Select_priv | enum(N,Y) | | | N | | | Insert_priv | enum(N,Y) | | | N | | | Update_priv | enum(N,Y) | | | N | | | Delete_priv | enum(N,Y) | | | N | |

42

| Create_priv | enum(N,Y) | | | N | | | Drop_priv | enum(N,Y) | | | N | | | Grant_priv | enum(N,Y) | | | N | | | References_priv | enum(N,Y) | | | N | | | Index_priv | enum(N,Y) | | | N | | | Alter_priv | enum(N,Y) | | | N | | +---------------------------------------------------------------------------+ 13 rows in set (0.01 sec)

Drepturile specificate aici merg doar pentru baza de date specificate in coloana db_column. Tabelele tables_priv si columns_priv Ofera drepturi asupra unei tabele sau asupra unor coloane dintr-o tabela.mysql> show columns from tables_priv; +-------------------------------------------------------------------+ | Field | Type | Null | Key | Default | Extra | +-------------------------------------------------------------------+ | Host | char(60) | | PRI | | | | Db | char(60) | | PRI | | | | User | char(16) | | PRI | | | | Table_name | char(60) | | PRI | | | | Grantor | char(77) | | MUL | | | | Timestamp | timestamp(14) | YES | | NULL | | | Table_priv |set(Select,Insert,Update, | | | | Delete,Create,Drop,Grant, | | | | References,Index,Alter) | | | | | | | | | | Column_priv | set(Select,Insert, | | | | | Update,References) | | | +-------------------------------------------------------------------+ 8 rows in set (0.00 sec)

Controlul accesuluiMySQL foloseste tabelele de privilegii pentru a determina ce are si ce nu are un utilizator dreptul sa faca in doi pasi: 1. Verificarea conexiunii: MySQL verifica daca ai voie sa te conectezi la server bazandu-se pe numele de utilizator (blank insemna orice utilizator), numele de gazda si pe parola. Pentru numele gazdei poti folosi caracterul wildcard '%' ca semnificand orice gazda. 2. Verificarea cererii: MySQL verifica in toate tabele de drepturi daca ai drepturile necesare pentru a obtine informatiile dorite.

Comenzile GRANT si REVOKETabele descrise mai sus sunt tabele normale MySQl si pot fi modificate cu comenzile invatate. De exemplu, pentru a crea un nou utilizator:INSERT INTO user (Host, User, Password, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv) VALUES (localhost, juan, password, N, N, N, N, N, N, N, N, N, N, N, N, N,

43

N)

Nu este insa ce si-ar dori sa fac administratorul de fiecare data. Din fericire, MySQL ofera cateva comenzi care fac lucrul cu utilizatorii mult mai usor:

GRANTGRANT privilegii [coloane] ON obiect TO utilizator [IDENTIFIED BY parola] [WITH GRANT OPTION]

Niveluri de drepturi grant all on *.* Acorda drepturi universale grant all on database.* Acorda drepturi asupra tuturor tabelelor din baza de date grant all on database.table_name Drepturi pentru o singura tabela grant all(col1, col2) on database.table_name Drepturi pentru anumite coloane dintr-o tabelamysql> grant all on guestbook.* to ion@localhost identified by parola1; Prima parte a comenzii poate fi all sau alta optiune din tabela user. Partea a doua a comenzii (on guestbook) arata unde se vor aplica drepturile (vezi tabelul de mai sus). Partea a treia arata cui i se acorda

drepturile (utilizator@gazda), iar ultima parte arata parola cu care este identificat utilizatorul.grant select, update, insert on guestbook2k.guestbook to adi@localhost identified by parola2;

Acesta comanda permite lui adi sa vada, sa modifice, sa actualizeze si sa insereze inregistrari in tabela 'guestbook' din baza de date 'guestbook2k'.grant select, update (nume, email) on guestbook2k.guestbook to monica@localhost identified by Mel12068;

Monica poate vedea si actualiza doar campurile 'nume' si 'email'.grant all on *.* to marius@localhost identified by xxx456;

Marius are drepturi depline (poate chiar acorda privilegii altor utilizatori).

REVOKEDaca vrei sa anulezi drepturile acordate unui utilizator poti folosi comanda REVOKE:REVOKE privilegii [(coloane)] ON item FROM utilizator

Comanda revoke Shutdown on *.* from cosmin@localhost; revoca dreptul de shutdown al lui Cosmin. Daca vrei sa stergi un utilizator de tot trebuie sa-l stergi din tabela 'user':delete from user where user=user and host=host

Afisarea drepturilor Din versiunea 3.23.4 MySQL a introdus comanda show grants care permite vizualizarea drepturilor acordate la un moment dat:mysql> show grants for jayg@localhost; +------------------------------------------------------------| Grants for ion@localhost +------------------------------------------------------------| GRANT ALL PRIVILEGES ON testul1.* TO ion@localhost +------------------------------------------------------------1 row in set (0.00 sec) + | + | +

44

Reincarcarea drepturilor MySQL citeste automat tabelele de privilegii cand e pornit si cand sunt date comenzi GRANT sau REVOKE. Modificarile facute manual tabelelor de drepturi nu iau efect decat daca se restarteaza MySQL. Ca sa functioneze aceste modificari reincarca tabelele:flush privileges

saumysqladmin flush-privileges

saumysqladmin reload

Backup-ul bazelor de datePentru a face un backup complet al bazelor de date:mysql> mysqldump --tab=/cale/director --opt --full

saumysql> mysqlhotcopy database /path/director

Poti, de asemenea copia toate fisierele tabelelor (`*.frm', `*.MYD', and `*.MYI' files) cat timp serverul nu actualizeaza nimic. Poti face si backup-uri selective cu SELECT * INTO OUTFILE 'nume_fisier' FROM nume_tabela si sa restaurezi datele cu LOAD DATA INFILE 'nume_fisier' REPLACE ... Pentru a evita inregistrarile duplicat (inregistrarile noi le inlociesc pe cele mai vechi daca sunt identice in cazul comenzii REPLACE) ai nevoie de o cheie primara sau de o cheie unica.

Securitatea in MySQLSecuritatea e foarte importanta, in special cand vei conecta baza ta de date MySQL la site-ul Web. Cand rulezi MySQL ia in considerare urmatoarele sfaturi:

Nu da nimanui acces la tabela user ! Invata sistemul de privilegii al MySQL ! Tasteaza mysql -u root. Daca te poti conecta fara sa ti se ceara o parola, oricine poate face acelasi lucru. Vezi, in pagina de instalare cum se poate pune parola de root pe sever. Nu folosi parole din dictionar deoarece exista programe care le pot sparge! Foloseste initialele cuvintelor dintr-o propozitie (de exemplu aaum 'Ana are un miel') sau combinatii de pe tastatura (in loc de stefan-dyrgsm, adica o litera spre dreapta de pe tastatura). Investeste intr-un firewall. Foloseste parole pentru toti utilizatorii MySQL si ai grija in ce fisiere script le memorezi. Poti cripta parolele cu functiile PASSWORD() sau MD5(). La conectarea pe Web, ar trebui sa creezi un utilizator special numai pentru Web (de exemplu, sa aiba doar drepturi de SELECT pe tabela cu produse si de INSERT pe tabela cu comenzile facute). Daca utilizatorii care folosesc formularele de pe Web tasteaza date confidentiale, trebuie sa folosesti SSL (Secure Socket Layer) pentru ca altfel datele vor fi transmise spre server in fomatul text.

45

Optimizarea MySQL

Optimizeaza tabele care pot deveni fragmentate dupa multe actualizari si modificari cu OPTIMIZETABLE nume_tabela

Alege cel mai potrivit si cel mai scurt tip de date pentru campurile din tabele. Foloseste indecsi cand sunt necesari pentru a face interogarile mai rapide. Foloseste valori implicite in comanda INSERT Invata sa folosesti comanda EXPLAIN SELECT.. care arata ce se va intampla in cazul unei interogari. Nu uita ca privilegiile sunt citite la fiecare interogare. Deci, simplifica cat mai mult privilegiile acordate. Nu uita ca exista mai multe tipuri de tabele care pot fi create cu CREATE TABLE nume TYPE=tip (MyISAM-implicit, HEAP-temporar, BDB-sigure pentru tranzactii).

46

Configurarea MySQLSchimbarea setului de caractere Mesaje de eroare in romana Utilitarele MySQL mysql mysqladmin mysqldump mysqlimport

Schimbarea setului de caractere Implicit, MySQL foloseste setul de caractere ISO-8859-1 Latin1 cu sortarea in orinea limbii suedeze. Pentru a schimba acest set implicit de caractere, foloseste comanda:mysql> ./configure --with-charset=CHARSET

unde CHARSET poate fi big5, cp1251, cp1257, czech, danish, dec8, dos, euc_kr, gb2312, gbk, german1, hebrew, hp8, hungarian, koi8_ru, koi8_ukr, latin1, latin2, sjis, swe7, tis620, ujis, usa7, or win1251ukr. Pentru a adauga un nou set de caractere decide daca setul e unul simplu sau complex (are nevoie de sau nu de suport multi-byte) si: I.Set simplu: 1. Adauga SETUL la sfarasitul fisierului `sql/share/charsets/Index' si atribuie-i un numar. 2. Creaza un fisier `sql/share/charsets/SETUL.conf'. (Foloseste ca model `sql/share/charsets/latin1.conf'). 3. Adauga numele 'SETUL' la listele CHARSETS_AVAILABLE and COMPILED_CHARSETS din 'configure.in'. II.Set complex: 1. Creaza fisierul `strings/ctype-SETUL.c'. 2. Adauga SETUL la sfarasitul fisierului `sql/share/charsets/Index' si atribuie-i un numar. 3. Plaseaza un comentariu in partea de sus a fisierului creat la 1. :4. 5. 6. 7. 8. /* * * * * */ This comment is parsed by configure to create ctype.c .configure. number_MYSET=MYNUMBER .configure. strxfrm_multiply_MYSET=N .configure. mbmaxlen_MYSET=N mysqld --language=romanian

saushell> mysqld --language=/usr/local/share/romanian

Pentru a actualiza fisierul cu mesaje de eroare, modifica `errmsg.txt' si executa:shell> comp_err errmsg.txt errmsg.sys

Utilitarele MySQLSunt niste programe-client care se folosesc pentru a construi, configura si intretine bazele de date. myisamchk Descrie, verifica si optimizeaza tabele. make_binary_release Face un pachet binar cu dstrubutia MySQL. msql2mysql Converteste programe mSQL in MySQL. mysql mysqlaccess Verifica privilegii de acces pentru o combinatie de gazda-utilizator-baza de date. mysqladmin mysqlbug Genereaza un raport cu defectge (bugs) gasite in MySQL. mysqld Daemon-ul SQL. mysqldump mysqlimport mysqlshow Afiseaza informatii despre baze de date, tabele, coloane, indecsi. mysql_install_db Creaza tabelele de privilegii. replace Program utilitar care inlocuieste un sir de caractere cu al sir dintr-un anumit fisier.shell> replace a b b a -- fisier1 fisier2 ...

safe_mysqld Porneste daemon-ul mysqld cu unele optiuni de siguranta.

mysql.exeEste interfata in linie de comanda a MySQL-ului si-ti permite sa rulezi comenzi SQL sau comenzi

48

specifice MySQL. Sintaxa este:mysql [options] [database name] [outputfile] Tasteaza help pentru a vedea unele facilitati ale mysql: help (\h) Afiseaza acest text ? (\h) Sinonim pentru help clear (\c) "Curata" ecranul connect (\r) Reconectare la server edit (\e) Comanda edit cu $EDITOR exit (\q) Iesire din mysql go (\g) Trimite comanda la server ego (\G) Trimite comanda si afiseaza rezultatul vertical print (\p) Tipareste comanda curenta quit (\q) Iesire din mysql rehash (\#) Reconstruieste hash-ul status (\s) Status info use (\u) Foloseste o baza de date ** nou in versiunea 3.23: source (\.) Executa un fisier script .sql

Alte optiuni pentru programul-client mysql:-? -B -D, e -E -f -h -H -L --help --batch --database=.. --execute=... --vertical --force --host=... --html --skip-linenumbers -n --unbuffered -p[password] --password[=...] -P --port=... -q --quick -r --raw -t --table in -u --user=# current user. -w --wait Help Afiseaza rezultatele cu TAB ca separator. Baza de date folosita Executa comanda si iese Afisare veritcala a rezultatelor Continua chiar daca apar erori Conectare la gazda specificata Produce iesiri in format HTML. Nu afiseaza numere de linii in cazul erorilor Goleste buffer-ul dupa fiecare interogare Parola care va fi folosita Portul TCP/IP folosit Tipareste rezultatul linie cu linie Scrie numele de campuri cu tot cu caracterele de escape Iesiri in formatul tabeleiOutput in table format. This is default non-batch mode. Utilizatorul care intra nu e cel curentUser for login if not Asteapta si reincearca conectarea

mysqladminEste utilitarul pentru sarcini administrative. Sintaxa:mysqladmin [OPTIONS] command command...

unde comenzile pot fi:create databasename drop databasename extended-status flush-hosts flush-logs flush-tables flush-privileges Mesaj extins despre status-ul server-ului

Reincarca tabelele de privilegii

49

kill id,id,... Termina thread-urile mysql password newpassword Schimba parola ping Verifica daca mysgld e pornit processlist Lista proceselor active reload Reincarca tabelele de privilegii refresh shutdown status variables Afiseaza variabilele disponibile version Versiunea MySQL slave-start Starteaza thread-ul slave (nou in v3.23) slave-stop Opreste thread-ul slave. (nou in v3.23) -? --help -# --debug=... -f --force Continua chiara daca apar erori -h --host=# -p[...] --password[=...] -P --port=... -I --sleep=sec Executa comenzile in continuu cu o pauza intre -r --relative Arata diferentele obtinute -s --silent Iesire daca nu e permisa conecatarea -t --timeout=... Timeout pentru conectare -w --wait[=retries] -W --pipe -E --vertical

Exemplu:mysqladmin proc stat +----+-------+-----------+----+-------------+------+-------+-----| Id | User | Host | db | Command | Time | State | Info +----+-------+-----------+----+-------------+------+-------+-----| 6 | monty | localhost | | Processlist | 0 | | +----+-------+-----------+----+-------------+------+-------+-----Uptime: 10077 Threads: 1 Questions: 9 Slow queries: 0 Opens: 6 Flush tables: 1 Open tables: 2 Memory in use: 1092K Max memory used: 1116K + | + | +

mysqldumpEste un utilitar pentru mutarea/stergerea informatiilor din tabele. Sintaxa:mysqldump [OPTIONS] database [tables]

Folosire (pentru backup):mysqldump --opt mydatabase > backup-file.sql

Poti citi inapoi in MySQL informatiile cu:mysql mydatabase < backup-file.sql

Optiuni:-? -a --add-locks --add-drop-table --allow-keywords -c --delayed -F --help --all Adauga LOCK TABLES inainte si UNLOCK TABLE dupa fiecare dump

--complete-insert --flush-logs

50

-f --force -h --host=.. -l --lock-tables -t --no-create-info -d --no-data --opt -p[...] --password[=...] -P --port=port_num -q --quick -T path-to--tab=path-tocontinutul some-directory, some-directory --fields-terminated-by=... --fields-enclosed-by=... --fields-optionally-enclosed-by=... --fields-escaped-by=... --lines-terminated-by=... -u user_name, --user= user_name -w --where= wherecondition

Creaza un fisier .sql si un fisier .txt cu tabelei

mysqlimportEste o interfata in linie de comanda pentru comanda SQL LOAD DATA INFILE. Sintaxa:mysqlimport [options] database textfile1 [textfile2....]

Folosire (cu mysqldump):mysqldump -T . tracking tabela1 mysql tracking