27.06.2013 Views

Capitolul V MYSQL

Capitolul V MYSQL

Capitolul V MYSQL

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

1<br />

<strong>Capitolul</strong> V <strong>MYSQL</strong><br />

Crearea şi exploatarea bazelor de date relaţionale reprezintă una dintre<br />

direcţiile principale de dezvoltare a informaticii. Implementarea conceptelor<br />

matematice care stau la baza modelului relaţional s-a realizat prin definirea unui<br />

limbaj specializat, SQL (Structured Query Language). Scrierea comenzilor în<br />

SQL fiind relativ dificilă, firmele care au creat sisteme de gestiune de baze de<br />

date s-au concentrat asupra realizării unei interfeţe prietenoase, apărând pe piaţă<br />

sisteme ca Access, FoxPro, Paradox etc..<br />

Noţiunile de HTML prezentate permit realizarea de situri web a căror<br />

funcţie este aceea de comunicare de informaţii prin intermediul unui ansamblu<br />

de pagini păstrate pe un server accesibil prin Internet. Pentru a asigura<br />

accesarea unei baze de date prin intermediul unui formular conţinut într-o<br />

pagină, numărul de componente software folosite trebuie extins, rezultatul fiind<br />

o aplicaţie pentru web.<br />

Arhitecturii client-server realizată de perechea de aplicaţii browserserver<br />

de web (de obicei Internet Explorer - Apache) i se adaugă încă o pereche<br />

de aplicaţii, script asociat formularului - server de baze de date. În acest<br />

tandem scriptul asociat formularului (scris în C, C++, Perl, PHP etc) este client<br />

iar serverul de baze de date (Oracle, MySQL etc) are rolul de server. Scriptul<br />

formulează comenzi SQL iar serverul SQL le execută.<br />

MySQL este o aplicaţie de tip server capabilă să execute un mare<br />

număr de comenzi SQL. Ea este gratuită şi poate fi instalată pe calculatoare<br />

funcţionând sub diferite sisteme de operare (Windows, Linux, Unix etc.).<br />

5.1 Noţiuni de SQL<br />

SQL este limbajul care serveşte la comunicarea cu un server de baze<br />

de date. Pentru a da comenzile prezentate în continuare se va instala pe<br />

calculator MySQL şi se va deschide o fereastră (DOS sau Linux, supă caz) din<br />

care se vor introduce comenzile. În cazul unui calculator funcţionând sub<br />

Windows, conectarea pentru a lucra în mod interactiv cu serverul MySQL


PAGE |294}<br />

instalat pe acelaşi calculator se realizează lansând în execuţie mysql.exe din<br />

directorul mysql\bin:<br />

În cazul unui server MySQL instalat pe un calculator funcţionând sub<br />

Linux, sistemul de operare fiind multiuser comanda va fi:<br />

$ mysql –u mdamian –p<br />

Enter password:<br />

mysql><br />

Parametrii suplimentari introduşi după mysql servesc la precizarea<br />

utilizatorului (-u mdamian) şi a faptului că trebuie introdusă parola acestuia (p).<br />

Comenzile SQL se termină cu un caracter ";".<br />

• Comanda create database<br />

Înaintea realizării ansamblului de tabele care vor servi la păstrarea<br />

datelor, trebuie creată o bază de date folosind comanda create database.<br />

Exemplu :<br />

mysql> CREATE DATABASE proiect;<br />

• Comanda use database<br />

Pentru a lucra cu o bază de date, aceasta trebuie precizată folosind<br />

instrucţiunea use. Exemplu:<br />

mysql> USE DATABASE proiect


• Comanda create table<br />

După crearea bazei de date şi selectarea ei ca bază de date curentă se<br />

poate trece la crearea tabelelor (fişierelor) bazei. Instrucţiunea create table are<br />

sintaxa:<br />

CREATE TABLE nume<br />

(<br />

nume_coloana1 tip atribute,<br />

nume_coloana2 tip atribute, ...,<br />

primary key (nume_coloană),<br />

index nume_index(nume_coloană)<br />

)<br />

următor:<br />

Text<br />

Tipurile de date utilizate de MySQL sunt prezentate în tabelul<br />

Nume tip Utilizare Descriere<br />

char char(14) Şir de caractere de lungime fixă, L <<br />

255 caractere.<br />

varchar varchar(17) C şi char dar lungimea este variabilă.<br />

Un caracter suplimentar va fi adăugat<br />

sistematic pentru a indica lungimea<br />

efectivă.<br />

tinytext tinytext Text de lungime variabilă, L < 255.<br />

Ca şi varchar(255).<br />

text text Text de lungime variabilă, L < 65535<br />

caractere. Pot servi la indexare,<br />

luându-se în consid. primele 255<br />

caractere.<br />

mediumtext mediumtext Ca şi text, L < 16 777 215 caractere.<br />

longtext longtext Ca şi text, L < 4 292 967 295<br />

caractere.<br />

enum *) Limitează domeniul valorilor posibile.<br />

Max. 65535 valori.<br />

3


PAGE |294}<br />

Numeric<br />

Dată<br />

int / integer int(6) [unsigned]<br />

[zero fill]<br />

[autoincrement]<br />

tinyint tinyint(4)<br />

[unsigned]<br />

[zero fill]<br />

mediumint mediumint(5)<br />

[unsigned]<br />

[zero fill]<br />

bigint bigint(12)<br />

[unsigned]<br />

[zerofill]<br />

float float(m,d)<br />

[zerofill]<br />

-2147483648 < n < 2147483647 (0 <<br />

n < 4294967295 pentru unsigned).<br />

Numărul dintre paranteze indică<br />

lungimea câmpului folosit la<br />

imprimare. Autoincrement se foloseşte<br />

frecvent la definirea câmpului ca fiind<br />

cheie primară.<br />

-127 < n < 127 (0 < n < 255 pentru<br />

unsigned)<br />

-8 388 608


INDEX nume_index (nume_coloană_1 [, nume_coloană_2...])<br />

Numărul de indecşi este limitat la 16. Orice coloană poate fi declarată<br />

ca fiind index. Se pot declara indecşi compuşi, la realizarea cărora valorile<br />

provin din mai multe coloane ale tabelului. Exemple:<br />

create table note(<br />

nrcrt int unsigned not null auto-increment,<br />

id_student int unsigned,<br />

nota decimal(5,2) not null,<br />

data date,<br />

primary key(nrcrt),<br />

INDEX idstud(id_student)<br />

);<br />

create table complex(<br />

id int unsigned not null,<br />

nume char(45) not null,<br />

INDEX dual(id,nume)<br />

);<br />

Un câmp declarat ca fiind cheie primară este implicit un index.<br />

Declararea numelui unui index nu este strict necesară. Dacă numele<br />

este omis, numele implicit atribuit de MySQL este cel al coloanei folosite (sau a<br />

primei coloane dacă este un index compus).<br />

• Comanda alter<br />

Modificarea definiţiei unui tabel se realizează folosind comanda alter.<br />

Exemple:<br />

a. Modificarea numelui unui tabel :<br />

ALTER table note rename note2002;<br />

b. Adăugareea unei coloane suplimentare<br />

5


PAGE |294}<br />

ALTER table note2002 add column modul int not null;<br />

Adăugarea se va realiza implicit la sfârşitul listei de câmpuri. Dacă se<br />

doreşte adăugarea la începutul listei de câmpuri se va folosi atributul first iar<br />

dacă se doreşte adăugarea după o coloană dată se va folosi atributul after.<br />

ALTER table note2002 add column modul int not null first;<br />

ALTER table note2002 add column modul int not null after data;<br />

c. Suprimarea unei coloane<br />

ALTER table note2002 drop column data;<br />

d. Adăugarea unui index<br />

ALTER table note2002 add index codmod(modul);<br />

e. Suprimarea unui index<br />

ALTER table note2002 drop index codmodul;.<br />

f. Schimbarea numelui unei coloane<br />

ALTER table note2002 change modul codmodul int not null;<br />

integral.<br />

Se observă că la redenumirea unei coloane aceasta trebuie redefinită<br />

• Comanda insert<br />

Insert serveşte la adăugarea de înregistrări (linii) într-un tabel al bazei<br />

de date curente. Sintaxa comenzii este:


INSERT into nume_tabel (col1, col2, ...) values (val1, val2, ...);<br />

Din lista coloanelor pot lipsi coloanele pentru care este permisă<br />

valoarea NULL.<br />

Valorile de tip text trebuie puse între apostroafe ('). Dacă şirul de<br />

caractere conţine caractere apostrof, acestea vor fi dublate sau precedate de<br />

backslash "\". Tot precedate de "\" vor fi caracterele: " \ % şi _. Secvenţele<br />

escape \n \t \r şi \b au aceleaşi semnificaţii ca şi în limbajul C.<br />

• Comanda update<br />

Comanda update permite modificarea valorilor unor câmpuri dintr-un<br />

tabel. Sintaxa ei este:<br />

UPDATE nume_tabel set col_1 = valoare_1, col_2 = valoare_2 ... where col = value<br />

Deşi condiţia din clauza where poate fi complexă, de cele mai multe<br />

ori ea este de forma cheie_primara = valoare şi serveşte la selectarea unei linii<br />

din tabel în care una sau mai multe valori trebuie corectate. Exemplu:<br />

UPDATE personal set sal_negociat=sal_negociat*1.1 where sal_negociat


PAGE |294}<br />

Comanda show se foloseşte pentru listarea tabelelor care compun baza<br />

de date curentă sau pentru listarea câmpurilor unei tabele. Sintaxa ei este:<br />

SHOW tables; (listare tabele din baza curentă)<br />

SHOW fields from nume_tabel (listarea câmpurilor din tabelul nume_tabel ).<br />

5.2 Construcţia unei comenzi select<br />

Comanda select este cea mai complexă comandă din limbajul SQL.<br />

Complexitatea provine din faptul că ea trebuie să permită extragerea oricărui set<br />

de date dintr-o bază de date. Pentru a asigura aceasta, la scrierea ei pot fi<br />

folosite mai multe clauze.<br />

Rezultatul unei comenzi select poate fi asimilat unui tabel având 0, 1<br />

sau mai multe rânduri şi ale cărui coloane sunt definite prin lista câmpurilor care<br />

este scrisă după select.<br />

Sintaxa comenzii select este următoarea:<br />

SELECT [DISTINCT] coloana1 [,coloana2]<br />

FROM tabe11[,tabel2]<br />

[WHERE "condiţii"]<br />

[GROUP BY "listă-coloane"]<br />

[HAVING "conditii"]<br />

[ORDER BY "listă-coloane" [ASC | DESC] ]<br />

În continuare va fi prezentat un ansamblu de exemple alese astfel încât<br />

să arate modul de folosire a clauzelor comenzii în cele mai întâlnite situaţii.


5.2.1. Selectarea dintr-un singur tabel<br />

Exemple de comenzi Efect<br />

SELECT * from Elevi; Mulţimea de selecţie (m.d.s.)<br />

cuprinde toate înregistrările şi<br />

toate coloanele tabelului Elevi<br />

SELECT Nume, Prenume, Nr_Matricol<br />

from Elevi;<br />

SELECT * from Elevi where Nr_Matricol<br />

< 100<br />

SELECT Nr_Zbor, Compania from Orar<br />

where Destinatie = 'Roma' and Dela =<br />

'Amsterdam';<br />

SELECT * from utilizatori where<br />

cod_oras 4300 or cod_oras is null;<br />

SELECT distinct Oras, Judet from Client<br />

where Judet='Brasov'<br />

M.d.s. cuprinde coloanele Nume,<br />

Prenume şi Nr_Matricol din<br />

tabelul Elevi<br />

9<br />

M.d.s. cuprinde liniile din tabelul<br />

Elevi pentru care valoarea<br />

câmpului Nr_Matricol < 100.<br />

Pentru condiţie se pot folosi<br />

operatorii:<br />

= (sau !=) < > = Like<br />

*) and or<br />

M.d.s. conţine câmpurile<br />

Nr_Zbor şi Compania, pentru<br />

liniile din tabelul Orar care<br />

respectă condiţia Destinaţie =<br />

'Roma' şi Dela= 'Amsterdam'<br />

cod_oras poate fi null. Pentru a<br />

selecta şi liniile în care cod_oras<br />

= null, trebuie adăugată ultima<br />

condiţie.<br />

Clauza distinct împiedică<br />

includerea în mulţimea de selecţie<br />

a rândurilor cu conţinut identic<br />

(în exemplu, mai multi clienţi din<br />

acelaşi oraş din jud. Braşov).<br />

SELECT * from studenti where Clauza between permite


PAGE |294}<br />

Data_inscrierii between '2000-04-15' and<br />

'2001-06-01';<br />

SELECT * from users where state in ('US',<br />

'RO', 'FR', 'DE');<br />

SELECT * from Stud order by Cod_centru<br />

desc, Nume asc;<br />

SELECT * from utilizatori order by nume<br />

limit 1,12;<br />

SELECT Oras, count(*) as 'Numar_cli'<br />

from Clienti group by Oras;<br />

SELECT Oras, count(*) as 'Numar_cli',<br />

sum(plati) as 'Total_tranzactii' from Clienti<br />

group by Oras;<br />

SELECT Nume, Oras, Donatie, from<br />

Sponsori having donatii > 100;<br />

selectarea unui set de articole<br />

având o valoare într-un interval<br />

dat.<br />

clauzele in / not in servesc la<br />

crearea m.d.s. în care un câmp<br />

este / nu este într-o mulţime<br />

precizată.<br />

Clauza order by permite<br />

precizarea ordinii în care să fie<br />

aşezate înregistrările în m.d.s.<br />

Modul de sortare este indicat prin<br />

clauzele asc (ascending,<br />

crescător) şi desc (descending,<br />

descrescător). Clauza asc este<br />

implicită.<br />

Clauza limit permite precizarea<br />

liniei de la care se doreşte<br />

includerea în m.d.s. (1) şi a<br />

numărului de linii de inclus (12).<br />

Clauza group by permite crearea<br />

de grupuri de înregistrări cărora li<br />

se pot aplica funcţii ca şi count()<br />

(pentru numărare) sau sum()<br />

(pentru realizarea de sume<br />

parţiale, pe grup). În exemplu,<br />

m.d..s. va conţine câte un rând pt.<br />

fiecare oraş. În rând vor fi două<br />

câmpuri, Oraş şi numărul de<br />

clienţi din oraş (as 'Numar_cli'<br />

precizează numele câmpului).<br />

M.d.s. va conţine rânduri cu 3<br />

câmpuri. Ultimul câmp,<br />

Total_tranzacţii, va coţine suma<br />

plăţilor clienţilor aparţinând<br />

fiecărui grup.<br />

Clauza having se foloseşte în<br />

cazul grupării articolelor (cu


group by) şi limitează rândurile<br />

afişate la cele care respectă<br />

condiţia impusă.<br />

*) like permite selectarea folosind pentru şirul de caractere cu care se<br />

compară caractere generice. Caracterele generice permise sunt _ (underscore,<br />

ţine locul unui caracter) şi % (ţine locul unui număr oarecare de caractere,<br />

inclusiv niciunul). Exemplu:<br />

SELECT * from Utilizatori where Nume like 'Dan%'; -<br />

va selecta rândurile în care Nume = 'Dan', Nume='Daniel' etc.<br />

5.2.2. Selectarea din mai multe tabele:<br />

Comanda Efect<br />

SELECT Elevi.Nume,<br />

Obiecte.Materie, Note.Data,<br />

Note.Nota from Elevi, Obiecte, Note<br />

where Elevi.ID_Elev=Note.ID_Elev<br />

and Note.Cod_Materie =<br />

Obiecte.Cod_Materie;<br />

SELECT * from Contact left join<br />

Sotii on Contact.ID_Sotie =<br />

Sotii.ID_Sotie;<br />

11<br />

Mulţimea de selecţie cuprinde câmpuri<br />

din două tabele, Elevi şi Note. Pentru<br />

rândurile selectate, cheia primară ID_Elev<br />

din tabelul Elevi are aceeaşi valoare cu<br />

ID_Elev din tabelul Note şi Cod_Materie<br />

din tabelul Materie = Cod_Materie din<br />

tabelul Note.<br />

M.d.s. cuprinde rândurile din tabelul<br />

Contact, fiind incluse şi rândurile în care<br />

ID_Sotie = NULL.<br />

Tabelele la care se referă ultimul exemplu au structura următoare:<br />

Contact<br />

Sotii<br />

Nume Prenume ID_Sotie ID_Sotie Nume Prenume<br />

Ionescu Vasile 1 1 Ionescu Mariana<br />

Popescu Marin


PAGE |294}<br />

5.3 Realizarea unei baze de date folosind phpMyAdmin<br />

Dificultăţile legate de crearea şi administrarea unei baze de date<br />

folosind comenzi SQL sunt evidente şi ele devin şi mai mari în cazul scrierii<br />

comenzilor select. Scrierea comenzilor se realizează mai uşor dacă se foloseşte<br />

o aplicaţie dedicată dispunând de o interfaţă prietenoasă. Pentru serverul de<br />

baze de date MySQL, o astfel de aplicaţie este phpMyAdmin, conţinută în<br />

pachetul de aplicaţii phpTriad. Acesta poate fi descărcat de la adresa http://<br />

www.phpgeek.com/ , înaintea descărcării alegându-se fişierul phptriadsetup*.*<br />

adecvat sistemului de operare folosit. phpTriad va instala o versiune a<br />

serverului de web Apache, o versiune a serverului, MySQL şi aplicaţia destinată<br />

administrării bazelor de date MySQL (phpMyAdmin).<br />

Lansarea în execuţie a phpMyAdmin trebuie precedată de lansarea în<br />

execuţie a serverului MySQL şi a serverului de web Apache.<br />

Fig. 5.1 Lansarea în execuţie Apache, MySQL, phpMyAdmin<br />

Pornire Apache<br />

Lucrul cu phpMyAdmin urmează etapele prezentate în continuare.<br />

WinMySQLadmin<br />

• Crearea sau selectarea unei baze de date<br />

După pornirea aplicaţiei phpMyAdmin se indică numele noii baze de<br />

date şi se apasă butonul Create pentru crearea unei noi baze de date sau se<br />

selectează în cadrul din stânga numele bazei active.


Fig. 5.2 Interfaţa aplicaţiei phpMyAdmin<br />

• Crearea tabelelor bazei de date.<br />

Fig.5.3 Crearea unui tabel în baza de date<br />

În formularul de mai sus, rydb este numele noului tabel iar 16 este<br />

numărul de câmpuri ale noului tabel. După apăsarea butonului Go, aplicaţia<br />

afişează interfaţa necesară definirii câmpurilor tabelului.<br />

Fig. 5.4 Structura tabelului rydb<br />

După indicarea numelor câmpurilor, a tipului şi a dimensiunilor<br />

acestora, se apasă butonul Save, rezultatul fiind crearea tabelului şi afişarea<br />

frazei CREATE TABLE generată :<br />

13


PAGE |294}<br />

Fig.5.5 Afişarea frazei sql şi a structurii tabelului creat<br />

Dacă baza de date va fi ulterior mutată pe un alt calculator, cu un alt<br />

sistem de operare, această comandă va fi necesară pentru crearea aceluiaşi tabel.<br />

Se poate realiza uşor acest lucru dacă se selectează şi apoi se copiază comanda<br />

într-un fişier text.<br />

• Adăugarea de înregistrări<br />

Odată tabelele create, folosind comanda Insert se pot adăuga<br />

înregistrări într-un tabel selectat în panoul din stânga. Rezultatul este crearea<br />

unei comenzi Insert, afişată de altfel şi în fereastra corespunzătoare din<br />

phpMyAdmin :<br />

Fig. 5.6 Adăugarea înregistrărilor


Fig. 5.7 Vizualizarea frazei insert<br />

• Scrierea comenzilor SELECT<br />

Complexitatea comenzii SELECT, mai ales în cazul selectării dintr-o<br />

mulţime de tabele legate prin relaţii, face scrierea acesteia deosebit de dificilă.<br />

Fereastra afişată de phpMyAdmin poate însă servi la scrierea şi testarea acestor<br />

comenzi. Odată testul reuşit, comanda SQL afişată poate fi copiată într-un fişier<br />

separat în vederea folosirii ei la scrierea scripturilor CGI.<br />

Iniţierea procesului de generare a unei fraze se declanşează selectând<br />

în fereastra principală opţiunea Query by Example :<br />

Fig. 5.8 Interfaţa pentru scrierea frazelor select<br />

În fereastra care se afişează se pot apoi indica tabelele implicate,<br />

câmpurile în ordinea în care apar în lista specifică comenzii, condiţiile de<br />

legătură între tabele etc. Fereastra conţine iniţial 4 coloane, dar numărul<br />

acestora poate fi modificat schimbând valoarea din caseta Add/Delete Field<br />

Column şi apăsând butonul Update Query. Dacă fraza trebuie completată cu<br />

alte clauze, acestea pot fi scrise direct în caseta de text afişată, ţinând însă cont<br />

de sintaxa frazei SELECT care impune ca ordinea clauzelor să fie WHERE <br />

GROUP BY HAVING ORDER BY LIMIT.<br />

15


PAGE |294}<br />

Fig. 5.9 Crearea interogărilor cu ajutorul inerfeţei<br />

Rezultatul interogării împreună cu fraza SELECT corespunzătoare<br />

sunt vizualizate prin apăsarea butonului Submit Query :<br />

Fig. 5.10 Rezulatatul interogării


Aplicaţie (8)<br />

a. Creaţi cu ajutorul aplicaţiei phpMyAdmin o bază de date denumită<br />

perla. În această bază de date, creaţi trei tabele denumite, clienţi,<br />

hoteluri respectiv rezervari, alegând "Create new table on database"<br />

şi respectând următoarea structură a câmpurilor care compun cele trei<br />

tabele:<br />

clienti rezervari hoteluri<br />

codcli INT(8) cheie<br />

primara<br />

nume CHAR(30)<br />

index<br />

codrez INT(8) cheie<br />

primara<br />

codhot INT(3) cheie<br />

primara<br />

codcli INT(8) nume CHAR(30)<br />

index<br />

prenume CHAR(30) codhot INT(3) nrcam1 1 INT(2)<br />

email CHAR(30) tipcam 2 INT(1) nrcam2 3 INT(2)<br />

telefon CHAR(10) data 4 INT(6) nrap 5 INT(2)<br />

nrzile 6 INT(1)<br />

Observaţie: De fiecare dată când este creat un tabel, aplicaţia<br />

phpMyAdmin, generează câte o frază SQL, de tipul CREATE. Salvaţi toate<br />

aceste comenzi într-un fişier denumit sql_perla.txt în directorul c:\promo.<br />

CREATE TABLE clienti (codcli INT (8) not null , nume CHAR (30) not null , prenume<br />

CHAR (50) not null , email CHAR (30) not null , telefon CHAR (10) not null , PRIMARY<br />

KEY (codcli), INDEX (nume));<br />

1<br />

Numărul de camere de tip single ale hotelului (spaţiului de cazare)<br />

2<br />

Tipul de cameră care a fost rezervată 1-single, 2-dubla, 3-apartament<br />

3<br />

Numărul de camere duble ale hotelului (spaţiului de cazare)<br />

4<br />

Data la care începe rezervarea<br />

5<br />

Numărul de apartamente ale hotelului (spaţiului de cazare)<br />

6<br />

Numărul de zile pentru care a fost efectuată rezervarea<br />

17


PAGE |294}<br />

CREATE TABLE hoteluri (codhot INT (3) not null , nume CHAR (20) not null , nrcam1<br />

INT (2) not null , nrcam2 INT (2) not null , nrap INT (2) not null , PRIMARY KEY (codhot),<br />

INDEX (nume));<br />

CREATE TABLE rezervari (codrez INT (8) not null , codcli INT (8) not null , codhot INT<br />

(3) not null , tipcam INT (1) not null , data INT (6) not null , nrzile INT (2) not null ,<br />

PRIMARY KEY (codrez));<br />

b. Verificaţi unde şi cum a fost salvată pe disc această bază de date şi<br />

tabelele componente. În directorul c:\...\mysql\data a fost creat<br />

directorul perla iar în acesta au fost create câte 3 fişiere pentru fiecare<br />

tabel în parte.<br />

c. Adăugaţi câteva înregistrări în fiecare din aceste tabele, conform<br />

modelelor prezentate pentru fiecare din acestea. Observaţi că la<br />

inserarea fiecărei înregistrări, phpMyAdmin, generează câte o frază<br />

INSERT. Salvaţi toate aceste fraze în fişierul sql_perla.txt creat<br />

anterior.<br />

Fig. 5.11 Inregistrările tabelului clienti


Fig. 5.12 Inregistrările tabelelor hoteluir şi rezervări<br />

INSERT INTO clienti (codcli, nume, prenume, email, telefon) VALUES ('1', 'Popescu',<br />

'Ion', 'popescu@email.com', '0433111111');<br />

INSERT INTO hoteluri (codhot, nume, nrcam1, nrcam2, nrap) VALUES ('1', 'Plaza', '50',<br />

'99', '50');<br />

INSERT INTO rezervari (codrez, codcli, codhot, tipcam, data, nrzile) VALUES ('1', '1', '7',<br />

'3', '040325', '5');<br />

Observatie: Pentru câmpul telefon din tabelul clienti, a fost definit<br />

tipul CHAR(10), iar numerele de telefon au fost înregistrate inclusiv cu cifra 0<br />

de la începutul acestora. Pentru cîmpul data din tabelul rezervari, a fost definit<br />

tipul INT(6), iar valoarea datelor de început a rezervărilor a fost înregistrată fără<br />

cifra 0, de la începutul acestora. S-a preferat tipul int pentru dată, deoarece întro<br />

aplicaţie de acest tip (rezervări), valorile datelor calendaristice necesită<br />

prelucrari ulterioare (de exemplu s-ar putea verifica dacă la hotelul pentru care<br />

se solicită rezervare, există camere libere în perioada solicitată) şi în asemenea<br />

prelucrări e preferabil să se lucreze cu numere, decât cu şiruri de caractere.<br />

Numerele de telefon nu necesită acemenea prelucrări, deci pot fi păstrate ca<br />

şiruri de caractere.<br />

d. Adăugaţi încă un câmp, denumit cnp BIGINT(13) în tabelul clienti între<br />

câmpurile prenume şi email. Observaţi că pentru modificarea structurii<br />

19


PAGE |294}<br />

tabelului, phpMyAdmin, generează o frază SQL, de tipul ALTER. Salvaţi<br />

această frază ALTER, în fişierul sql_perla.txt creat anterior. Completaţi<br />

valorile câmpului cnp nou introdus, pentru toţi clienţii.<br />

Fig. 5.13 Adăugarea unui câmp suplimentar<br />

ALTER TABLE clienti ADD cnp BIGINT (13) not null AFTER prenume;<br />

Fig. 5.14 Rezultatul adăugării câmpului cnp<br />

e. Adăugaţi încă două câmpuri, denumite tip 7 CHAR(1) şi categ 8 INT(1)<br />

în tabelul hoteluri între câmpurile nume şi nrcam1.Observaţi că pentru<br />

modificarea structurii tabelului, phpMyAdmin, generează o frază SQL,<br />

de tipul ALTER. Salvaţi această frază ALTER, în fişierul sql_perla.txt<br />

creat anterior. Completaţi valorile câmpurilor nou introduse, pentru<br />

toate hotelurile.<br />

ALTER TABLE hoteluri ADD tip CHAR (1) not null AFTER nume , ADD categ INT (1) not<br />

null AFTER tip;<br />

7 Defineşte tipul hotelului şi va avea una din valorile: H-hotel, V-vilă, M-motel, Ppensiune,<br />

C-camping, A-vilă agroturism<br />

8 Defineşte categoria hotelului (numărul de stele)


Fig. 5.15 Inregistrările tabelului hoteluri după adăugarea câmpului tip<br />

f. Realizaţi următoarele interogări utilizând doar tabelul clienti:<br />

• Să se afişeze lista tuturor clienţilor, cu toate datele disponibile:<br />

SELECT clienti.codcli, clienti.nume, clienti.prenume, clienti.cnp, clienti.email,<br />

clienti.telefon FROM clienti;<br />

sau<br />

SELECT * from clienti;<br />

• Să se afişeze lista tuturor clienţilor în ordine alfabetică după nume (fără<br />

codcli şi e-mail);<br />

SELECT clienti.nume, clienti.prenume, clienti.cnp, clienti.telefon FROM clienti ORDER<br />

BY clienti.nume ASC;<br />

• Să se afişeze în ordine alfabetică numele, prenumele şi adresa de e-mail<br />

ale tuturor clienţilor, al căror nume începe cu „Pop“:<br />

SELECT clienti.nume, clienti.prenume, clienti.email FROM clienti WHERE ((clienti.nume<br />

like 'Pop%')) ORDER BY clienti.nume ASC;<br />

21


PAGE |294}<br />

• Să se afişeze în ordine alfabetică numele şi prenumele clienţilor de sex<br />

feminin (cnp începe cu 2):<br />

SELECT clienti.nume, clienti.prenume FROM clienti WHERE ((clienti.cnp like '2%'))<br />

ORDER BY clienti.nume ASC;<br />

• Să se afişeze în ordine alfabetică numele şi prenumele clienţilor de sex<br />

masculin (cnp începe cu 1 sau 3):<br />

SELECT clienti.nume, clienti.prenume FROM clienti WHERE ((clienti.cnp like '1%')) OR<br />

((clienti.cnp like '3%')) ORDER BY clienti.nume ASC;<br />

• Să se afişeze în ordine alfabetică numele, numărul de telefon şi codul<br />

clientului (codcli), pentru clienţii având codcli cuprins între 3 şi 7:<br />

SELECT clienti.nume, clienti.telefon, clienti.codcli FROM clienti WHERE ((clienti.codcli<br />

>=3)) AND((clienti.codcli


SELECT hoteluri.nume, hoteluri.tip, hoteluri.categ FROM hoteluri WHERE ((hoteluri.tip<br />

not like 'H')AND(hoteluri.categ


PAGE |294}<br />

=hoteluri.codhot)AND(hoteluri.tip not like 'H')) ORDER BY clienti.nume ASC,<br />

clienti.prenume ASC;<br />

• Să se afişeze lista rezervărilor efectuate de un client. Se vor afişa<br />

numele şi prenumele clientului, denumirea, tipul şi categoria spaţiului de<br />

cazare, codul tipului de cameră rezervată, data şi numărul de zile pentru<br />

care a fost efectuată rezervarea:<br />

SELECT clienti.nume, clienti.prenume, hoteluri.nume, hoteluri.tip, hoteluri.categ,<br />

rezervari.tipcam, rezervari.data, rezervari.nrzile FROM clienti, hoteluri, rezervari WHERE<br />

((rezervari.codcli =clienti.codcli)AND(rezervari.codhot =hoteluri.codhot))<br />

AND((rezervari.codcli =1)) ORDER BY clienti.nume ASC, clienti.prenume ASC;

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!