Sunteți pe pagina 1din 18

BAZE DE DATE

LABORATOR 1

1. Noiuni introductive

n prezent, bazele de date reprezint nucleul sistemelor informatice din orice companie sau instituie, avnd un
impact major asupra modului de funcionare i organizare al acestora. Totodat ofer o deschidere major asupra
pieii pe care o vizeaz, oferind posibilitatea clienilor de a avea acces n mod facil la datele eseniale de care acetia
au nevoie.

Trebuie avut n vedere faptul c de multe ori, n viaa de zi cu zi, prin abuz de limbaj, se folosete termenul de Baz
de Date (BD) pentru a desemna de fapt un Sistem de Gestiune a Bazelor de Date (SGBD). Ce este deci o baz de
date i care este diferena fa de un sistem de gestiune a bazelor de date?

Putem defini ntr-o prim etap o Baz de Date (BD) ca fiind un ansamblu de date structurat, stocat n mod
centralizat sau nu, pe servere, accesibil, interogabil i modificabil de un grup de utilizatori care lucreaz n paralel,
prin intermediul uneia sau a mai multor aplicaii. Pe de alt parte, un Sistem de Gestiune a Bazelor de Date (SGBD)
poate fi vzut generic ca un sistem care se ocup de structurarea, stocarea, actualizarea i mentenana datelor,
reprezentnd de fapt interfaa ntre baza de date i utilizator sau aplicaiile acestuia.

n cadrul acestui laborator vom lucra cu baze de date relaionale, iar ca sistem de gestiune a bazei de date se va
utiliza programul MySQL.

Bazele de date relaionale au la baz modelul relaional care lucreaz cu dou concepte importante: relaie i tabel,
Cele dou difer prin natura lor, dar sunt foarte corelate. Noiunea de relaie este formal, deoarece conceptul
provine din matematic, n particular din teoria mulimilor, n timp ce noiunea de tabel este simpl i intuitiv. Pe de
o parte tabelele ofer o nelegere natural a structurii bazei de date chiar i pentru utilizatorii ce nu sunt specializai
n domeniu. Pe de alt parte, existen unei formalizri matematice clare i simple a permis dezvoltarea unei teorii
care s sprijine modelul, cu rezultate foarte interesante n industrie.

Atunci cnd o relaie este conceput sub forma unui tablou de valori, fiecare linie din tabel reprezint un ansamblu de
valori corelate. n cazul modelului relaional, fiecare linie din tabel corespunde de fapt unei entiti sau unei relaii
din lumea real. Dac se consider un tabel denumit tblStudent (Figura I.1) caracterizat de coloanele reprezentative:
nume, numarMatricol, anStudiu i specializare atunci toate valorile dintr-o coloan a tabelului sunt de acelai tip.
n cazul terminologiei modelului relaional, o linie din tabel poart denumirea de tuplu, nregistrrile stocate n
coloanele tabelului sunt denumite atribute, n timp ce tabelele poart numele de relaii. Tipurile de date introduse n
fiecare coloan sunt reprezentate de ctre un domeniu de valori posibile.

Fig. I.1. Relaia tblStudent

1
Orice relaie poate fi definit ca un ansamblu de tupluri. Elementele acestui ansamblu nu sunt ordonate, adic ntr-o
relaie, tuplurile nu se supun nici unei reguli particulare putnd fi ordonate n mod arbitrar. De asemenea, atributele
unei relaii pot fi ordonate pe baza unui set de reguli ns nu exist o ordine preferenial. n cazul exemplului
prezentat n Figura I.1, relaia tblStudent este definit prin: nume, numarMatricol, telefonMobil, telefonFix, adresa,
varsta, mediaNotelor i este considerat identic cu relaia tblStudent definit astfel: nume, numarMatricol, varsta,
adresa, telefonFix, telefonMobil, mediaNotelor.

n cazul general, o baz de date este format dintr-un ansamblu de relaii (tabele Figura I.2) ntre care se stabilesc
o serie de corespondene.

Fig. I.2. Exemplu de baz de date

Din Figura I.2 se poate observa c diferitele coloane aferente tabelelor din baza de date au o semnificaie diferit n
ceea ce privete modul de reprezentare al entitilor. Astfel, n funcie de rolul pe care l joac se pot distinge trei
tipuri de coloane:

1. Cheie primar - reprezint o coloan care permite identificarea unei nregistrri (a unei linii din tabel). Pentru baza
de date din Figura I.2, coloana poate reprezenta identificatorul nregistrrilor din tabelul ,
iar pentru nregistrrile din tabelul . Atunci cnd o coloan este specificat ca identificator
sau cheie pentru un tabel se impune implicit ca valoarea atributului s fie diferit pentru toate tuplurile relaiei.

n practic, de cele mai multe ori este posibil gsirea unor chei primare printre atributele care se definesc n mod
natural pentru o clas de entiti ce trebuie modelat, ns sunt i situaii n care acest lucru nu este posibil. Pentru
astfel de cazuri se poate introduce un atribut suplimentar care se genereaz i se asociaz fiecrui tuplu n momentul
inserrii informaiei. De altfel este o practic bun de a folosi aceast soluie ori de cte ori exist un dubiu c
valorile unei chei primare se pot modifica n timp sau nu pot identifica n orice situaie, n mod unic un tuplu. Se
poate remarca faptul c i n lumea real se recurge la aceast soluie pentru identificarea fr echivoc a persoanelor
(CNP) / a studenilor (numr de nmatriculare) / a documentelor (numr de nregistrare), etc.

2. Al doilea tip de coloane care pot forma o tabel l reprezint cheile strine. Cheile strine sunt de fapt o copie a
identificatorului primar dintr-un alt tabel. Fiecare valoare a sa joac rolul unei referine la o linie dintr-un alt tabel cu
care se afl n asociere. Din acest motiv, acest tip de coloan se mai numete i coloan de referine.

Pentru exemplul din Figura I.2, tabelul tblOferte conine dou chei strine: care reprezint o referin
ctre o entitate de tip Furnizori (respectiv ctre o linie din tabelul tblFurnizori) i codProdus care reprezint o
2
referin ctre o entitate de tip Produs (respectiv ctre o linie din tabelul tblProduse). Se poate observa deci, c prin
intermediul cheilor strine se pot pune n coresponden tupluri din tabele distincte. Pentru fiecare ofert specificat
pe cte o linie n cadrul relaiei tblOferte, putem cunoate att informaiile privind furnizorul (ex: nume, telefon) ct
i detalii despre produsul ofertat (ex: descriere).

Trebuie notat faptul c numele unei coloane care formeaz o cheie strin este independent de cel al identificatorului
la care se face referire. Pot exista situaii n care dezvoltatorul bazei de date alege numele cheii strine s fie similar
cu cel al cheii primare la care se face referire (ex: numele cheii primare codProdus din tblProduse este identic cu
numele cheii strine din tblOferte), sau foarte bine ele pot fi diferite (ex: numele cheii primare idFurnizor din
tblFurnizor este diferit de numele cheii strine codFurnizor din tblOferte ).

Analiznd n detaliu exemplul din Figura I.2 se poate remarca faptul c relaia tblOferte nu deine un atribut propriu
care s joace rolul de identificator primar aa cum se ntmpl n cazul tabelului tblFurnizori care are cheia primar
idFurnizor sau tblProduse care deine cheia primar codProdus. Pentru tblOferte, cheia primar va fi compus din
setul de atribute codFurnizor i codProduse care sunt totodat i chei strine. ns, n acest caz se presupune c un
furnizor nu va putea s fac dect o singur ofert pentru un anumit produs.

3. Cel de-al treilea tip de coloane care apar n cadrul tabelelor dintr-o baz de date, l reprezint coloanele cu
informaii suplimentare, care nu au dect rolul de a descrie entitatea pe care o reprezint. Pentru exemplul din
Figura I.2, este cazul atributelor nume i telefon din tabelul tblFurnizori, descriere din tblProduse sau pret din
relaia tblOferte.

De manier general, obiectele, mpreun cu proprietile ce le caracterizeaz se supun unor reguli stricte n lumea
real. n mod similar, atunci cnd se dorete modelarea lor sub form de informaii digitale i stocarea n baze de date
este necesar pstrarea regulilor dup care ele sunt guvernate. Spunem c datele trebuie s respecte o serie de
constrngeri de integritate. Orice operaie de modificare, adugare sau tergere a unei valori din baza de date nu
trebuie s conduc n vreun fel la nclcarea acestor constrngeri. Figura I.3 prezint o instan a unei baze de date n
care mai multe constrngeri de integritate sunt violate, astfel:

a) n relaia tblNote, cel de-al doilea tuplu conine o valoare care nu poate fi admis pentru atributul medie,
dac se impune ca nota maxim la o materie s fie 10.
b) n relaia tblStudenti, studentul cu numrul matricol 2459 nu poate avea burs de merit avnd n vedere c are
un examen picat (la Retele de comunicaii).
c) ultimele dou tupluri din relaia tblStudent conin informaii despre doi studeni diferii, dar care au acelai
numr matricol. Acest lucru este imposibil dac lum n calcul faptul c atributul numarMatricol este considerat
cheie primar pentru relaia tblStudenti i ar trebui s identifice n mod unic fiecare entitate.
d) tabelul tblMedii conine un tuplu pentru care atributul Student are o valoare (3256) care nu se regsete
printre numerele matricole nregistrate n relaia tblStudeni (coloana corespunztoare atributului
numarMatricol). Similar, studentul Popescu Mihai are nregistrat o not pentru un curs care nu se regsete n
lista de cursuri din tblCursuri.
e) relaia tblCursuri conine un tuplu pentru care valoarea atributului idCurs (care este cheie primar) are
valoarea Null.

3
Fig. I.3. Exemplu de baz de date care ncalc o serie de constrngeri de integritate

Tocmai pentru a evita astfel de situaii n cadrul bazelor de date a fost definit conceptul de constrngere de integritate
care trebuie respectat indiferent de situaie. Constrngerile de integritate pot fi definite fie n momentul crerii
tabelelor, fie ulterior pentru a putea impune condiii suplimentare.

Din punctul de vedere al elementelor afectate de constrngeri, se pot defini dou categori:

- Constrngeri intra-relaie fac referire doar la o singur tabel din baza de date. Aceast clas poate fi divizat
n trei subclase, astfel:

Constrngeri de tuplu pot fi evaluate pentru fiecare tuplu n mod independent de restul celorlalte
linii din tabel. Pentru exemplul considerat anterior, n aceast categorie intr cazurile prezentate la
punctele a) i e)
Constrngeri de domeniu sunt evaluate valorile atributelor pentru a asigura integritatea domeniilor
(ex: dac valorile sunt de un anumit tip de date, dac sunt ntr-un anumit domeniu de valori, dac
sunt obligatorii sau nu, etc ). Pentru exemplul considerat anterior, n aceast categorie intr cazurile
prezentate la punctele a) , c) i e). Un caz particular, dar important, al acestei subclase de
constrngeri l reprezint constrngerile referitoare la cheia primar.
Constrngeri de dependen ntre valorile atributelor sunt evaluate valorile anumitor atribute n
funcie de alte atribute din cadrul relaiei (cazul c) din exemplul considerat).

- Constrngeri inter-clas presupune stabilirea unor reguli care implic mai multe relaii. Pentru exemplul
considerat anterior, n aceast categorie intr cazurile prezentate la punctele b) i d). Cele mai importante
constrngeri inter-clas sunt cele legate de integritatea referenial care impun reguli asupra cheilor strine (cazul d)
din exemplul considerat).

2. Limbajul SQL

SQL (Structured Query Language sau limbaj structurat de interogri) reprezint un limbaj structurat de programare
care permite crearea de baze de date, adugarea de informaii i recuperarea de date precise care sunt necesare la un
anumit moment de timp. Limbajul SQL a fost dezvoltat n special pentru lucrul cu baze de date care se axeaz pe
modelul relaional, fiind n prezent cel mai utilizat limbaj folosit n cadrul sistemelor de gestiune a bazelor de date.
4
Limbajul SQL permite att definirea structurii (schemei) bazei de date ct i manipularea acesteia, sub form de
interogri (comenzi) pe care sistemele de gestiune a bazelor de date trebuie s le execute n mod corespunztor.
Aceste interogri pot fi introduse direct n terminal, rezultatul afindu-se direct pe ecran sau pot fi trimise indirect
ctre SGBD prin intermediul unor programe dezvoltate n limbaje de programare precum C++, Java, PHP, caz n
care rezultatele sunt stocate linie cu linie n variabile de program.

n prezent exist o multitudine de dezvoltatori de sisteme de gestiune a bazelor de date care ofer diferite
funcionaliti pentru uurarea modului de interaciune al utilizatorului cu baza de date pe care o administreaz sau o
utilizeaz. Putem aminti aici de cteva exemple de sisteme de gestiune a bazelor de date, precum: MySQL, Oracle,
IBM DB2, Microsoft SQL Server, etc. Avnd n vedere ns, c SQL este un limbaj standardizat la nivel
internaional, toate aceste sisteme adopt o aceeai norm pentru definirea relaiilor i manipularea datelor.

n cadrul acestui material va fi utilizat pentru exemplificare sistemul de gestiune al bazelor de date MySQL dezvoltat
de compania suedez MySQL AB. MySQL este un sistem de tip open source (codul surs este disponibil n mod
gratuit i poate fi modificat n funcie de necesitile programatorului), foarte popular printre dezvoltatorii de aplicaii
software i pagini web. Are la baz limbajul de date SQL, ruleaz pe orice tip de sistem de operare i poate fi
interconectat cu uurin cu alte aplicaii dezvoltate n limbaje de programare precum: C++, Java, Perl, PHP, etc.

MySQL poate fi instalat utiliznd pachetul de aplicaii WampServer care este disponibil la adresa web:
http://www.wampserver.com/. Acest pachet conine pe lng MySQL i o serie de alte utilitare folosite pentru
dezvoltarea de aplicaii web (Wamp = Apache, PHP, MySQL). Nota: n cazul n care pe sistem nu este instalat deja
un mediu de dezvoltare Visual Studio, nainte de rularea serverului Wamp, este necesar instalarea pachetului Visual
C++ Redistributable.

n mod predefinit, serverul Wamp se instaleaz n C:\wamp (C:\wamp64), iar MySQL se gsete n directorul:
C:\wamp\bin\mysql. Pachetul MySQL include dou module: MySQL server i MySQL client. Serverul MySQL se
ocup de partea de management a bazei de date, a tabelelor, a controlului accesului utilizatorilor i de procesarea
interogrilor SQL. Modulul de client permite utilizatorilor conectarea i interaciunea cu serverul MySQL. Prin
intermediul clientului MySQL, utilizatorul trimite toate interogrile ctre server.

Dup instalarea i pornirea pachetului WampServer, managerul aplicaiei poate fi deschis din zona de notificri de pe
bara de start (system tray) conform Figurii I.4. n cazul n care toate aplicaiile din pachet ruleaz n mod corect,
iconia aplicaiei are culoarea verde, ceea ce nseamn c serverul MySQL este pornit. Pentru a porni un client
MySQL se ruleaz executabilul mysql.exe conform Figurii I.4.

Figura 1.4. Lansarea consolei MySQL pentru client

5
n momentul pornirii consolei MySQL, aplicaia solicit introducerea unei parole pentru administrare. n mod
predefinit, n MySQL, numele de utilizator este root i nu este setat nici o parol. Deci, la solicitarea introducerii
unei parole se poate apsa direct tasta Enter. Pornirea consolei MySQL se poate realiza i din terminalul de
Windows. Pentru aceasta, la butonul de start se tasteaz cmd, iar n fereastra deschis se introduce comanda:

C:\wamp\bin\mysql\mysql5.7.19\bin\mysql -u root -p

Nota: Calea ctre executabilul mysql.exe trebuie modificat n mod corespunztor n funcie de locaia unde a fost
instalat pachetul WampServer.

Iniial utilizatorul nu este conectat la nici o baz de date, deci nu poate manipula n nici un fel tabelele existente, dar
poate lansa o serie de comenzi privind starea sistemului. Pentru exemplificare, vom enumera n continuare cteva
interogri i comenzi care nu au legtur direct cu o baz de date:

Comand pentru a cunoate versiunea clientului MySQL i pentru a afla data curent (setat pe sistemul de
operare) :

mysql> SELECT VERSION( ), CURRENT_DATE;

Se poate observa faptul c orice comand sau interogare se termin cu simbolul ;. Dac acest simbol este omis i se
apas tasta Enter, atunci interpretorul MySQL nu va executa comanda respectiv ci va trece pe rnd nou,
considernd c utilizatorul dorete s continue scrierea comenzii pe mai multe linii:

mysql> SELECT VERSION( ),


-> CURRENT_DATE
-> ;

Rezultatul interogrii:

n ambele cazuri prezentate anterior, rezultatul interogrii este returnat sub forma unui tabel, unde prima linie conine
numele informaiilor cerute, iar cea de-a doua linie conine efectiv datele corespondente. Sub tabel este afiat
numrul de rezultate returnate (n acest caz 1) i timpul necesar pentru execuia comenzii.

Comand pentru a determina utilizatorul curent conectat:

mysql> SELECT user();

Se poate observa faptul c MySQL este invariant la modul de scriere al caracterelor, capitalizat sau nu.

6
Pentru a anula o comand care a nceput s fie scris pe mai multe rnduri, se poate aduga la comand \c:

mysql> SELECT VERSION( ),


-> CURRENT_DATE
-> \c
mysql>

Pentru a nchide sesiunea de lucru MySQL se poate folosi comanda:

mysql> quit

n acest caz nu este necesar adugarea simbolului ; la sfritul comenzii.

Pentru a putea vizualiza i alte comenzi pe care MySQL le poate interpreta se poate folosi:
mysql> help

n terminal se pot realiza n mod direct i operaii matematice:

mysql> SELECT cos(PI( )/ 3), (235 + 24)*3

Pentru a putea vizualiza bazele de date existente se poate folosi comanda:

7
mysql> SHOW DATABASES;

Pentru a accesa o baz de date din cele existente se poate folosi comanda (ex: information_schema, care
conine date generale despre mediul SQL):

mysql> USE information_schema;

Odat selectat o baz de date, se pot vizualiza tabelele din cadrul acesteia cu ajutorul comenzii:

mysql> SHOW TABLES;

Limbajul SQL este format din dou mari componente:


- Limbajul de descriere a datelor (DDL Data Description Language) care permite definirea schemei (structurii)
bazei de date, definirea tabelelor i a relaiilor dintre elementele componente, precum i atribuirea drepturilor de
acces a utilizatorilor la baze de date;
- Limbajul de manipulare a datelor (DML Data Manipulation Language) permite adugarea de informaii n
baza de date (INSERT), actualizarea (UPDATE) sau tergerea (DELETE) lor, precum i interogarea datelor
pentru a avea acces doar la o subcolecie de informaii care sunt utile utilizatorului la un anumit moment de
timp.

Limbajul de descriere a datelor - DLL

Limbajul de descriere a datelor este compus n principal din trei comenzi: CREATE, ALTER i DROP. Instruciunea
CREATE este folosit pentru crearea structurii (schemei) eseniale a bazei de date, ALTER pentru modificarea
structurii existente i DROP pentru tergerea acesteia n ntregime sau a doar a unor componente (tabele).

O baz de date este definit de propria sa schem. Din acest motiv, SQL propune crearea unei scheme nainte de
definirea componentelor sale (tabele). Acest lucru se poate realiza cu ajutorul instruciunilor:

mysql> CREATE SCHEMA companieDB;


SAU
mysql> CREATE DATABASE companieDB;

Cele dou instruciuni sunt echivalente. Crearea unei baze de date nu implic i selecia ei. De aceea, pentru a o putea
manipula este necesar utilizarea comenzii USE.

8
mysql> USE companieDB;

Odat creat baza de date i selectat, se pot defini tabele cu ajutorul clauzei CREATE TABLE specificnd numele
tabelului, numele i tipul coloanelor (numele atributelor plus domeniul asociat) precum i constrngerile acolo unde
este cazul. Aceast instruciune va crea un tabel gol, fr date.

mysql> CREATE TABLE tblAngajati (


idAngajat SMALLINT NOT NULL,
numeAngajat VARCHAR(50),
CNP CHAR(13),
departament SMALLINT DEFAULT 1,
functia CHAR(20),
salariu DECIMAL(7,2),
dataNasterii DATE
);

Odat definit structura unui tabel, aceast poate fi verificat/vizualizat cu ajutorul comenzi:

mysql> DESCRIBE tblAngajati;

Din exemplul anterior se poate observa c n momentul definirii unui tabel, fiecare coloan are asociat un tip de date
care va reprezenta n mod corect informaia care este stocat pe acea coloan. De exemplu, coloana numeAngajat
este definit cu tipul de date VARCHAR(30) ceea ce corespunde unui ir de caractere de lungime variabil, dar de
maximum 50 de caractere. Pentru a optimiza structura tabelelor este necesar ntotdeauna alegerea tipului de date
potrivit care utilizeaz ct mai puin memorie, dar care s permit stocarea oricrei informaii care ar putea fi
plasat n acea categorie. De exemplu, nu are sens definirea coloanei numeAngajat ca un tip de date CHAR(1000),
deoarece cu fiecare nregistrare, memoria ocupat va crete inutil. Pe de alt parte, dac definim coloana
numeAngajat ca un tip de date CHAR(10), exist riscul ca pentru unele persoane s nu poat fi stocat informaia
complet.

Tipuri de date definite n MySQL

Pentru o nelegere mai exact a modului n care trebuie definite coloanele din tabelele unei baze de date n funcie de
informaia pe care trebuie s o modeleze, se vor prezenta n continuare tipurile de date suportate de MySQL:

Tipurile de date numerice

n MySQL tipurile de date numerice pot fi mprite n dou clase:

9
tipuri de date numerice exacte - permit reprezentarea unei valori n mod precis sub form de numr ntreg
sau fracionar (ex: valoarea unei monede 4,5136):
- TINYINT(M) numr ntreg foarte scurt, reprezentat pe 8 bii; Domeniul de valori n cazul reprezentrii cu
semn este de la -128 pn la 127. Domeniul de valori n cazul reprezentrii fr semn (UNSIGNED) este de la
0 pn la 255. Opional se poate impune ca numrul s fie reprezentat din M cifre.
- SMALLINT(M) numr ntreg scurt, reprezentat pe 16 bii; Domeniul de valori n cazul reprezentrii cu
semn este de la -32768 pn la 32767. Domeniul de valori n cazul reprezentrii fr semn (UNSIGNED) este
de la 0 pn la 65535. Opional se poate impune ca numrul s fie reprezentat din M cifre.
- MEDIUMINT(M) numr ntreg de lungime medie, reprezentat pe 24 de bii; Domeniul de valori n cazul
reprezentrii cu semn este de la -8388608 pn la 8388607. Domeniul de valori n cazul reprezentrii fr
semn este de la 0 pn la 16777215. Opional se poate impune ca numrul s fie reprezentat din M cifre.
- INTEGER(M) sau prescurtat INT reprezint un numr ntreg lung, reprezentat pe 32 de bii; Domeniul de
valori n cazul reprezentrii cu semn este de la -2147483648 pn la 2147483647. Domeniul de valori n
cazul reprezentrii fr semn este de la 0 pn la 4294967295. Opional se poate impune ca numrul s fie
reprezentat din M cifre.
- BIGINT(M) reprezint un numr ntreg foarte lung, reprezentat pe 64 de bii; Domeniul de valori n
cazul reprezentrii cu semn este de la -9223372036854775808 pn la 9223372036854775807. Domeniul
de valori n cazul reprezentrii fr semn este de la 0 pn la 18446744073709551615. Opional se poate
impune ca numrul s fie reprezentat din M cifre.
- DECIMAL(M,Q) sau prescurtat DEC definete un numr zecimal, unde M reprezint numrul total de
cifre care formeaz un numr, din care Q cifre dup virgul. Dac valoarea lui Q nu este specificat, atunci
aceasta este considerat n mod predefinit 0. Dac valoarea lui M nu este specificat, atunci aceasta este
considerat n mod predefinit 10. Valoarea maxim a lui M este 65, iar cea pentru Q este 30. Semnul (pentru
numere negative) i punctul zecimal nu sunt luate n calcul cnd se specific valoarea lui M sau a lui Q. De
exemplu, pentru o coloan definit ca DECIMAL(4, 2) se pot stoca valori pe 4 cifre dintre care dou
reprezint partea zecimal, iar domeniul de valori va fi ntre -99,99 i 99,99.
- FIXED(M,Q) i NUMERIC(M,Q) sunt similare cu DECIMAL, dar au fost introduse pentru compatibilitate
cu alte sisteme de gestiune a bazelor de date.

tipuri de date aproximate permite reprezentarea numerelor reale sub form aproximat (de exemplu, un
numr precum PI va fi stocat ca un numr real, dar cu o anumit precizie):

- FLOAT(M,Q) reprezint un numr real, n virgul mobil, cu precizie simpl. Valorile sunt reprezentate
ca, de exemplu, 3,48E15 care este echivalent cu 3,481015. Valorile permise sunt: valori cuprinse ntre
-3.402823466E+38 i -1.175494351E-38, 0, i valori ntre 1.175494351E-38 i 3.402823466E+38.
- DOUBLE(M,Q) reprezint un numr real, n virgul mobil, cu precizie dubl. Valorile permise sunt:
valori cuprinse ntre -1.7976931348623157E+308 i -2.2250738585072014E-308, 0, i valori cuprinse ntre
2.2250738585072014E-308 i 1.7976931348623157E+308.
- REAL(M,Q) este sinonim cu FLOAT(M,Q);

10
Toate valorile numerice pot fi negative sau pozitive. n cazul n care se dorete ca o anumit coloan a unui tabel s
poat conine numai numere pozitive, atunci se adaug dup tipul de date i cuvntul cheie UNSIGNED. De exemplu,
coloana salariu din tabelul tblAngajati poate fi definit ca: salariu DECIMAL(7,2) UNSIGNED.

Pentru tipul de date numerice, MySQL pune la dispoziie atributul opional ZEROFILL care permite adugarea de
zerouri n faa unui numr astfel nct s fie reprezentat pe un numr de cifre egal cu capacitatea maxim permis de
tipul de date respectiv. De exemplu, coloana departament din tabelul tblAngajati reprezint codul departamentului
n care este angajat un salariat. Dac acest cod ar fi compus din 3 cifre de forma 00X, 0XX sau XXX, atunci se poate
folosi tipul de date SMALLINT cu parametrul M setat la valoarea 3. Pentru a pstra formatul specificat, chiar dac
utilizatorul introduce un cod format dintr-o cifr sau dou se poate folosi cuvntul cheie ZEROFILL care va permite
completarea codului cu un numr de zerouri corespunztor (ex: un cod 7 va fi transformat n 007). n consecin,
coloana departament din tabelul tblAngajati poate fi definit ca: departament SMALLINT(3) ZEROFILL . Folosirea
cuvntului cheie ZEROFILL pentru o coloan de tip numeric atrage dup sine adugarea atributului UNSIGNED.

Date de tip ir de caractere


- CHAR(M) sau CHARACTER(M) definete un ir de M caractere. Dac informaia ce trebuie stocat
depete cele M caractere, atunci aceasta va fi trunchiat. Dac este mai mic de M caractere, atunci se vor
aduga spaii libere pentru completare. M poate lua i valoarea 0. Acest lucru poate fi util atunci cnd se
urmrete pstrarea compatibilitii cu versiuni de aplicaii mai vechi care depind de existena unei coloane,
dar care nu folosesc efectiv valorile din ea.
- VARCHAR(M) sau CHARACTER VARYING(M) definete un ir variabil de caractere de lungime
maxim M. n acest caz, lungimea irului de caractere (i implicit spaiul de memorie necesar pentru stocare)
se stabilete adaptiv n funcie de informaia introdus n coloan, dar nu poate depi valoarea lui M (se
realizeaz trunchiere).
Pentru a nelege diferena dintre tipurile de date CHAR(M) i VARCHAR(M) se poate analiza exemplul din
Tabelul I.1.
Tabelul I.1. Diferena ntre tipurile de date CHAR i VARCHAR
Tipul de date irul de caractere ce se dorete a fi stocat irul de caractere stocat
CHAR (40) acesta este un sir de 37 de caractere
acesta este un sir de 37 de caractere
VARCHAR (40) acesta este un sir de 37 de caractere
CHAR (40) acesta este un sir care depaseste 40 car
acesta este un sir care depaseste 40 caractere
VARCHAR (40) acesta este un sir care depaseste 40 car

n marea majoritate a cazurilor este de preferat utilizarea tipului de date VARCHAR, deoarece lungimea irului de
caractere nu este ntotdeauna cunoscut a priori (spre exemplu numele unei persoane).
- TEXT este similar cu tipul de date VARCHAR, dar elimin inconvenientul de a stabili numrul maxim de
caractere care poate fi stocat. n realitate, exist o limit de maximum 65,535 (216 - 1) caractere. Pentru a
putea stoca iruri de caractere i mai mari se poate utiliza MEDIUMTEXT care permite stocarea a maximum
16,777,215 (224 1) caractere sau LONGTEXT cu o lungime de pn la 4,294,967,295 (232 1) caractere,
echivalentul a 4GB. Exist de asemenea i varianta redus TINYTEXT care poate stoca pn la 257 de
caractere.
- BLOB este similar cu tipul de date TEXT, cu singura diferen c ine cont de literele mici i mari (case
sensitive). Spre exemplu, dac avem dou iruri de caractere Popescu i popescu definite ca tip de date
11
TEXT, atunci o comparaie ntre ele ar indica faptul c sunt identice, n timp ce dac ar fi definite ca BLOB,
s-ar putea preciza c sunt diferite. Exist de asemenea variantele: TINYBLOB, MEDIUMBLOB i
LONGBLOB.

Date de tip calendaristic


- DATE permite definirea datelor calendaristice sub formatul AAAA-LL-ZZ, unde AAAA reprezint
anul, LL luna i ZZ ziua (ex: 2020-02-22). Spaiul ocupat pentru stocarea unei date este de 3 octei.
- DATETIME permite definirea datelor calendaristice i a orei sub formatul AAAA-LL-ZZ HH:MM:SS.
unde AAAA reprezint anul, LL luna, ZZ ziua, HH ora, MM minutul, SS - secunda. De exemplu:
2020-02-22 11:23:10. Spaiul ocupat pentru stocarea unei date de tip DATETIME este de 8 octei.
- TIMESTAMP permite stocarea datei i a orei de manier automat sub formatul AAAA-LL-ZZ
HH:MM:SS la crearea sau actualizarea unei informaii.
- TIME permite stocarea unui durate (sau al diferenei de timp ntre dou evenimente) reprezentat sub
forma HH:MM:SS. Intervalul stabilit pentru or este ntre -838 i 838. n cazul n care este necesar
stocarea unui durate de timp mai mare se poate folosi formatul ZZ-HH:MM:SS. n acest caz este necesar
conversia orelor n zile.
- YEAR permite specificarea unui an ntre 1901 i 2155. Totui anumite sisteme (care stocheaz timpul ca o
variabil pe 32 de bii) pot ntmpina dificulti n a salva date mai mari de 2037 din cauza unei erori
cunoscute sub numele de Unix Millennium Bug.

Date de tip enumerare


- ENUM permite crearea de mulimi de valori autorizate pentru elementele dintr-o coloan. De exemplu,
pentru un tabel tblMasini, poate exista un atribut culoare ce poate lua valori doar din mulimea {alb,
rosu, verde, albastra, portocalie}; O astfel de coloan poate fi definit n urmtorul mod: culoare
ENUM(alb, rosu, verde, albastra, portocalie). n momentul inserrii unei noi linii n tabel se va
verifica dac valoarea corespunztoare coloanei culoare ia una i numai una dintre valorile specificate de
enumerare.
- SET este echivalent cu ENUM cu singura observaie c atributul culoare corespunztor unei nregistrri
poate lua mai multe valori din mulimea specificat. Poate fi util, spre exemplu, n cazul n care se dorete
nregistrarea mainilor bicolore.

Not: Spre deosebire de alte sisteme de gestiune a bazelor de date, MySQL nu suport definirea de ctre utilizator a
unor noi tipuri de date.

Exercitiu 1: a) Creai o baz de date denumit bibliotecaDB.


b) Creai un tabel denumit tblCarti stabilind un set de atribute convenabile i identificai tipurile de date potrivite
pentru fiecare atribut n parte.
c) S se vizualizeze structura tabelului tblCarti.

Not: Pentru a putea verifica/insera/modifica date n cadrul tabelelor vor fi redate n continuare cteva comenzi de
baz existente n MySQL, revenindu-se asupra lor n detaliu n laboratoarele urmtoare:

12
tergere tabel:
DROP TABLE numeTabel;

Inserare nregistrare n tabel:


INSERT INTO numeTabel VALUES (valoareAtribut1, valoareAtribut2, );

Inserare nregistrare n tabel, dar asignare valori doar pentru anumite atribute:
INSERT INTO numeTabel (numeAtributX, NumeAtributY, ) VALUES (valoareAtributX, valoareAtributY, );

Modificare valoare atribut n funcie de o condiie:


UPDATE numeTabel SET numeAtribut = valoare WHERE condiie;

Vizualizarea coninutului unui tabel:


SELECT * FROM numeTabel;

tergerea unei nregistrri din tabel:


DELETE FROM numeTabel WHERE condiie;

Not: Deoarece introducerea comenzilor complexe n consola MySQL este dificil, este recomandat scrierea lor
ntr-un editor de text (de exemplu: notepad++) i rularea lor cu ajutorul comenzii:

mysql> source cale_catre_fisier/nume_fisier.sql;

Exercitiu 2: S se introduc n tabelul tblCarti trei nregistrri diferite, apoi s se vizualizeze coninutul tabelului.

Exercitiu 3: Introducei n tabelul tblCarti nregistrri care au valori necorespunztoare cu tipul de date i domeniul
specificat pentru atributele definite.

Tipuri de constrngeri definite n MySQL

n momentul definirii unui tabel, pe lng numele i tipul coloanelor, se poate specifica opional i un set de
constrngeri pe care valorile inserate trebuie s le satisfac. Spre exemplu, pentru tabelul tblAngajati definit anterior,
s-a specificat constrngerea NOT NULL asociat atributului idAngajat, ceea ce nseamn c aceast valoare nu
trebuie s lipseasc n momentul inserrii unei noi linii n tabel. n continuarea acestui capitol se vor detalia tipurile
de constrngeri care pot fi aplicate diverselor coloane dintr-un tabel.

1. Constrngerea NOT NULL

Constrngerea de tip NOT NULL asigur faptul c o coloan nu poate avea valori nule (NULL). Acest lucru impune
ca atunci cnd se adaug o nou nregistrare n tabel, s se cunoasc deja valoarea corespunztoare atributului
declarat de tip NOT NULL. De exemplu, pentru tabelul tblAngajati se poate impune ca atributul numeAngajat s fie
declarat NOT NULL astfel:

13
mysql> CREATE TABLE tblAngajati (

numeAngajat VARCHAR(50) NOT NULL,

);

Exercitiu 4: a) ncercai inserarea unui tuplu pentru care atributul titlu s aib valoarea NULL. Vizualizai
nregistrrile din tabel.
b) Recreai tabelul tblCarti astfel nct atributul titlu s nu poat lua valori nule.
c) ncercai inserarea unui tuplu pentru care atributul titlu s aib valoarea NULL.

2. Condiia de unicitate

Constrngerea de unicitate (UNIQUE) impune ca ntr-o coloan a unui tabel, valorile corespunztoare din tupluri
diferite s nu coincid. Este permis totui existena valorilor nule, dar numai dac nu a fost aplicat i constrngerea
NOT NULL pentru acea coloan. Valoarea NULL este considerat a nu fi echivalent cu nimic, chiar nici cu ea
nsi. De exemplu, pentru tabelul tblAngajati se poate impune ca atributul CNP s fie declarat UNIQUE astfel:

mysql> CREATE TABLE tblAngajati (



CNP VARCHAR(13) UNIQUE,

);
sau
mysql> CREATE TABLE tblAngajati (

CNP VARCHAR(13),

CONSTRAINT unique_cnp UNIQUE(CNP)
);

n cel de-al doilea caz se poate observa utilizarea clauzei CONSTRAINT care permite atribuirea unui nume pentru
constrngerea definit (unique_cnp).

Exercitiu 5: a) Recreai tabelul tblCarti astfel nct atributul ISBN s fie declarat de tip UNIQUE.
b) ncercai inserarea a dou nregistrri pentru care atributul ISBN s fie identic.
c) Repetai exerciiul folosind i cea de-a doua metod care utilizeaz clauza CONSTRAINT. Observai diferena fa de
primul caz, atunci cnd se ncearc inserarea a dou nregistrri cu ISBN diferit.

Constrngerea UNIQUE se poate aplica de asemenea mai multor coloane dintr-un tabel n acelai timp. n acest caz
nu vor fi permise noi nregistrri care ncalc simultan condiia de unicitate.

mysql> CREATE TABLE tblAngajati (



numeAngajat VARCHAR(50),

dataNasterii DATE,
CONSTRAINT name_data UNIQUE(numeAngajat, dataNasterii)
);

14
Exercitiu 6: a) Recreai tabelul tblCarti astfel nct constrngerea UNIQUE s se aplice simultan pe atributele titlu i
anPublicare.
b) ncercai inserarea a dou nregistrri pentru care atributul titlu s fie identic. Este posibil acest lucru?
c) ncercai inserarea a dou nregistrri pentru care atributul anPublicare s fie identic. Este posibil acest lucru?
d) ncercai inserarea a dou nregistrri pentru care atributul anPublicare s fie identic i de asemenea anPublicare
s aib aceeai valoare. Este posibil acest lucru?

3. Setarea valorilor predefinite pentru atribute

Cuvntul chei DEFAULT permite definirea unui atribut care s aib o valoare implicit n cazul n care nu se
specific una n momentul inserrii unei nregistrri. n cazul n care nu se specific o valoare predefinit, utiliznd
clauza DEFAULT, atunci este asignat valoarea NULL n mod automat. Valorile specificate de ctre DEFAULT
trebuie s fie constante i s fie compatibile cu tipul i domeniul de valori ale atributului asupra cruia se aplic.

De exemplu, pentru tabelul tblAngajati se poate impune ca atributul salariu s aib valoarea implicit 1400.00,
astfel:

mysql> CREATE TABLE tblAngajati (



salariu DECIMAL(7,2) DEFAULT 1400.00 ,

);

Not: Pentru a insera o nregistrare n tabel, pentru care nu se dorete introducerea valorii unui atribut, cu scopul de a
se folosi valoarea predefinit, se pot folosi urmtoarele dou sintaxe:
INSERT INTO numeTabel VALUES (valoareAtribut1, DEFAULT, valoareAtribut3, );
SAU
INSERT INTO numeTabel (numeAtribut1, NumeAtribut3, ) VALUES (valoareAtribut1, valoareAtribut3, );

n primul caz se observ utilizarea cuvntului cheie DEFAULT cu scopul de a evita introducerea unei valori pentru
(spre exemplu) atributul2, iar n cel de-al doilea caz se specific atributele pentru care se introduc valori (omindu-
se, spre exemplu, atributul2).

Exercitiu 7: a) Recreai tabelul tblCarti astfel nct s se aplice constrngerea DEFAULT pentru atributul editura,
valoarea predefinit fiind Teora.
b) Inserai cte o nregistrare, prin cele dou metode prezentate anterior, pentru care atributul editura s ia valoarea
predefinit.
c) Inserai o nou nregistrare pentru care editura s aib valoarea Litera. Mai este posibil acest lucru?

4. Definirea unei chei primare

n cadrul unui tabel, pentru garantarea unicitii unei linii, care corespunde unei anumite informaii modelate din
lumea real, este necesar definirea a cel puin unui identificator. ntr-o relaie (tabel) pot exista mai muli
identificatori (o coloan sau grup de coloane) care s diferenieze n mod unic nregistrrile dintr-un tabel. Coloana
aleas s ndeplineasc aceast funcie este denumit cheie primar. n cadrul MySQL clauza folosit pentru
definirea cheii primare este PRIMARY KEY i poate fi folosit n dou moduri:

- n momentul definirii coloanei care reprezint identificatorul primar:

15
mysql> CREATE TABLE tblAngajati (
idAngajat SMALLINT PRIMARY KEY,

);

- sau la sfritul definirii tuturor atributelor specificnd coloana care reprezint cheia primar:
mysql> CREATE TABLE tblAngajati (
idAngajat SMALLINT,

dataNasterii DATE,
PRIMARY KEY (idAngajat)
);

n cazul n care se dorete crearea unei chei primare pe baza informaiilor din mai multe coloane, se poate folosi ce-a
de-a doua metod prezentat anterior, specificnd numele coloanelor.

mysql> CREATE TABLE tblAngajati (


idAngajat SMALLINT,
numeAngajat VARCHAR(50),

dataNasterii DATE,
PRIMARY KEY (numeAngajat, dataNasterii)
);

Exercitiu 8: a) Recreai tabelul tblCarti astfel nct s se defineasc o cheie primar.


b) Inserai dou nregistrri pentru care atributul definit ca identificator primar s fie identic.

5. Definirea unei chei strine

Cea mai important constrngere inter-relaii o reprezint constrngerea de tip referenial care se stabilete prin
definirea cheilor strine. Acest tip de constrngere creeaz o legtur ntre valorile unui atribut (sau atribute) dintr-un
tabel cu valorile atributelor dintr-un alt tabel. Constrngerile refereniale asigur faptul c valoarea unei chei strine
pentru orice tuplu dintr-o relaie (care refer) se regsete printre valorile cheii primare din relaia referit.

De exemplu, dac exist un tabel tblDepartamente definit n MySQL astfel:

mysql> CREATE TABLE tblDepartamente (


idDep SMALLINT PRIMARY KEY,
numeDep VARCHAR(50),
locatie VARCHAR(50)
);

atunci atributul departament din tabelul tblAngajati poate deveni cheie strin care s fac referire la valorile din
coloana idDep a tabelului tblDepartamente. n acest fel se restricioneaz adugarea de nregistrri n tabelul
tblAngajati care prin atributul departament nu fac referire la nici un departament existent n tblDepartamente. n
acest caz tblDepartamente este denumit tabel printe (tabelul la care se face referire), iar tblAngajati este considerat
tabelul copil (tabelul din care se face referirea).

Observaie: MySQL poate utiliza mai multe tipuri de motoare de stocare (storage engine) a tabelelor care permit
optimizarea bazei de date. Tipurile de motoare de stocare a tabelelor disponibile n MySQL sunt: InnoDB,
16
MRG_MYISAM, MEMORY, BLACKHOLE, MyISAM, etc. Lista complet poate fi vizualizat cu ajutorul
comenzii show engines. Cel mai important element care difereniaz tipurile de motoare de stocare a tabelelor l
reprezint gradul de siguran n manipularea datelor. Modelul InnoDB este cel mai sigur din punct de vedere al
asigurrii constrngerilor impuse unor tabele. n mod predefinit, MySQL utilizeaz motorul MyISAM care permite
indexarea full-text i ofer faciliti de cutare, dar care nu interzice introducerea de nregistrri care ncalc
constrngerile refereniale. Din acest motiv, pentru scopul acestui document, este de preferat modificarea motorului
utilizat de MySQL pentru crearea tabelelor. Pentru a realiza acest lucru este necesar modificarea documentului de
configurare my.ini prin adugarea urmtoarei linii la sfritul fiierului:
default-storage-engine=InnoDB

Sintaxa folosit n MySQL pentru definirea unei chei strine n tabelul copil este:
FOREIGN KEY (numeColoanaInTabelCopil)
REFERENCES numeTabelParinte (numeColoanaInTabelParinte)
[ON DELETE action]
[ON UPDATE action]

FOREIGN KEY specific ce coloan din tabelul copil este cheie strin. Valorile din aceast coloan trebuie
s se potriveasc cu valorile din coloana (cheie primar) la care se face referire n tabelul printe.
REFERENCES specific tabelul i numele coloanei la care face referire cheia strin.
ON DELETE permite specificarea aciunii care trebuie s aib loc asupra nregistrrilor din tabela copil
atunci cnd se terge o nregistrare referit din tabelul printe. n MySQL exist urmtoarele dou opiuni:
- ON DELETE CASCADE- permite eliminarea unui tuplu din tabela printe, concomitent cu
identificarea i tergerea tuturor liniilor din tabela copil care fceau referire la acea nregistrare.
- ON DELETE SET NULL - permite eliminarea unui tuplu din tabela printe, concomitent cu
identificarea i modificarea tuturor liniilor din tabela copil care fceau referire la acea nregistrare astfel
nct valorile cheii strine s ia valoarea NULL. Acest lucru este posibil doar dac atributul cheie strin
nu este declarat facultativ.
- Nespecificat n cazul n care clauza ON DELETE nu este folosit, atunci tergerea unei nregistrri
din tabela printe, care este referit ntr-o tabel copil, nu va fi posibil.
ON UPDATE - permite specificarea aciunii care trebuie s aib loc asupra nregistrrilor din tabela copil
atunci cnd se modific n tabelul printe, valoarea cheii primare a unei nregistrri referite. Clauza ON
UPDATE este similar cu clauza ON DELETE, cu diferena c acioneaz atunci cnd este actualizat o
nregistrare n tabela printe, nu atunci cnd este tears.

Pentru a defini relaia tblAngajati astfel nct s cuprind cheia strin departament se poate folosi comanda:

mysql> CREATE TABLE tblAngajati (


idAngajat SMALLINT PRIMARY KEY,
numeAngajat VARCHAR(50),
departament SMALLINT,
functia CHAR(20),
salariu DECIMAL(7,2),
dataNasterii DATE,
FOREIGN KEY (departament)
REFERENCES tblDepartamente(idDep) ON DELETE CASCADE ON UPDATE CASCADE
);

17
Exercitiu 9: a) Creai un tabel denumit tblEdituri stabilind un set de atribute convenabile i identificai tipurile de
date potrivite pentru fiecare atribut n parte. Se va stabili o cheie primar care va respecta formatul XYZ (utiliznd
clauza ZEROFILL).
b) S se introduc n tabelul tblEdituri trei nregistrri diferite, apoi s se vizualizeze coninutul tabelului.
c) Recreai tabelul tblCarti astfel nct s se foloseasc o cheie strin codEditura care s fac referire la cheia primar
din relaia tblEdituri. Cheia strin va fi creat avnd activate opiunile ON DELETE CASCADE i ON UPDATE
CASCADE.
d) Inserai 3 nregistrri n tabelul tblCarti astfel nct cheia strin codEditura s fac referire la codurile deja
existente n tabelul tblEdituri.
e) Inserai o nregistrare n tabelul tblCarti astfel nct cheia strin codEditura s NU fac referire la codurile deja
existente n tabelul tblEdituri.
f) tergei dou nregistrri din tabelul tblEdituri. Vizualizai coninutul celor dou tabele. Specificai modificrile
aprute.

5. Clauza AUTO_INCREMENT

Dei nu este o constrngere n adevratul sens al cuvntului, clauza AUTO_INCREMENT poate fi utilizat pentru a
constrnge valorile unui atribut s se incrementeze n mod automat, asigurnd astfel unicitatea tuplurilor dintr-un
tabel. Clauza AUTO_INCREMENT permite generarea automat de numere unice, incrementate cu o unitate, pentru
atributul asociat, n momentul inserrii de noi tupluri n tabel. Aceast funcionalitate este util de regul pentru
generarea cheii primare astfel nct, utilizatorul/aplicaia care insereaz datele s nu aib responsabilitatea asigurrii
unui cod unic pentru fiecare nregistrare. De exemplu, pentru tabelul tblDepartamente se poate atribui coloanei
idDep clauza AUTO_INCREMENT, astfel:

mysql> CREATE TABLE tblDepartamente (


idDep SMALLINT PRIMARY KEY AUTO_INCREMENT,

);

n mod predefinit valoarea de start pentru AUTO_INCREMENT este 1 i realizeaz incrementarea cu 1 la fiecare
nregistrare adugat.

Exercitiu 10: a) Recreai tabelul tblCarti astfel nct cheia primar s se autoincrementeze.
b) Inserai dou nregistrri n tabelul tblCarti astfel nct valoarea pentru cheia primar s se genereze automat.
c) Inserai o nregistrare n tabelul tblCarti astfel nct valoarea pentru cheia primar s fie 12.
d) Inserai o nregistrare n tabelul tblCarti astfel nct valoarea pentru cheia primar s se genereze automat. Care
este valoarea cheii primare pentru noua nregistrare?

18