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;