Sunteți pe pagina 1din 14

2.

MODELUL RELAȚIONAL și ALGEBRA


RELAȚIONALĂ

I. OBIECTIVE

1. Modelul relațional
2. Algebra relațională
3. Operaţii de creare şi manipulare a bazei de date și a tabelelor acesteia
4. Operații asupra datelor (INSERT/UPDATE/DELETE)

II. FUNDAMENTE TEORETICE

Fiecare sistem de gestiune a bazelor de date administrează datele conform unui anumit model
de date. Modelul ierarhic, și modelul rețea sunt modele apărute primele ,azi ele nu mai au utilizare, iar
modelul relațional, orientat-obiect, modelul semistructurat XML sau cele din categoria modelelor
noSQL cum ar fi cheie-valoare,bazat pe documente sau pe grafuri, au implementări în sistemele de
gestiune actuale ,sisteme numite din acest considerent sisteme multimodel (https://db-
engines.com/en/ranking).
Modelul relațional este modelul cel mai larg răspândit, în special în aplicațiile economice
comerciale. Alături de datele propriu-zise (colecţiile de informaţii stocate de utilizator în baza de date)
există dicţionarul de date, care conţine metadate ce reprezintă : structura bazei de date, definiţiile
tipurilor de date ,restricţiile de integritate (chei primare/chei străine) o serie de obiecte specific cum ar
fi vederile/procedurile stocate/triggerele, indecşii, precum şi fişierele anexe care conţin contextul curent
de lucru (parametrii de configurare) și catalogul bazei de date ( dicționarul datelor) toate acestea
formează baza de date și proprietățile ei.

Interogarea (engl.Query) este operaţia prin care se regăsesc datele( engl. Data retrieval)
dorite dintr-o bază de date, selectate conform unor criterii. Deoarece această operaţie este cea mai
importantă operaţie, limbajele de manipulare a datelor sunt denumite şi limbaje de interogare ,iar SQL
este un astfel de limbaj. Limbajele de programare pot fi procedurale sau ne-procedurale, astfel în
limbajele procedurale, utilizatorul indică sistemului succesiunea de operaţii pentru a determina
rezultatul dorit, iar în limbajele declarative, utilizatorul descrie rezultatul dorit, fără a indica procedura
prin care acesta este obţinut. Cele mai multe sisteme relaţionale de baze de date folosesc un limbaj de
interogare în care sunt prezente elemente ale ambelor abordări (SQL, QBE, Datalog.). Limbajul SQL
este declarativ cu extensii procedurale.

Pentru formularea conceptuală a regăsirii datelor relaţionale s-au dezvoltat două limbaje
abstracte de interogare: algebra relațională şi calculul relațional. Acestea sunt limbaje matematice,
formale, ambele asociate cu modelul relaţional de date și cu un anumit grad de echivalență.

2.1.MODELUL RELAȚIONAL

O bază de date relaţională reprezintă o structură prin care se reprezintă datele şi legăturile
dintre ele. În cadrul bazei de date relaţionale, datele sunt organizate sub forma unor tablouri
bidimensionale (tabele) de date, numite relaţii. Asocierile dintre relaţii se reprezintă prin atributele
de legătură respectând principii specifice modelului relațional ( de ex. integritatea referențială).

1
Prezentarea structurii relaţionale a datelor impune definirea noţiunilor de:
domeniu;relaţie;atribut;schemă a unei relaţii.

Conceptele utilizate pentru a descrie elementele de bază ale organizării datelor , din cele trei
perspective posibile sunt prezentate în următorul tabel, astfel termenii unei linii se consideră
sinonimi:

formal uzual fizic


relație tabel fișier
tuplu linie înregistrare
atribut coloană câmp
domeniu Tip de dată Tip de dată

Tabelul 2.1. Concepte uzuale folosite în exprimarea formală, uzuală şi fizică

Domeniul reprezintă o mulţime de valori, notată prin litere mari D1,D2 etc., caracterizată
printr-un nume. Modalităţile de definire a unui domeniu sunt:
 explicit: prin enumerarea tuturor valorilor aparţinând domeniului;
 implicit: prin precizarea proprietăţilor pe care le au valorile din cadrul domeniului.

Printr-un tuplu se înţelege o succesiune de valori de diferite tipuri. Un tuplu se notează enumerând
valorile sale <V1,V2,V3,...,Vn>, unde V1 este o valoare din domeniul D1, V2∈D2 etc.

Relaţia R este un subansamblu al produsului cartezian dintre mai multe domenii D1, D2, ...,
Dn, reprezentată sub forma unei tabele de date (tabelul bidimensional) şi deci, o mulţime de tupluri.

Definiții :Cardinalul relaţiei este numărul tuplurilor dintr-o relaţie.


Gradul relaţiei este numărul valorilor dintr-un tuplu.
Aritatea reprezintă numărul de atribute ale unei relații.

Atributul reprezintă coloana unei tabele de date, caracterizată printr-un nume și tip de date.

cnp: D2 data_înreg:D3 tip_


soluţionare:D3
2661805270023 2006-05-27 Da
1701205230023 2006-07-03 Nu

Tabelul 2.2. Relaţia R reprezentată cu ajutorul atributelor

Atributele sunt utile atunci când într-o relaţie un domeniu apare de mai multe ori, astfel prin
numele dat fiecărei coloane (atribut), se diferenţiază coloanele care conţin valori ale aceluiaşi
domeniu, eliminând dependenţa faţă de ordinea acestora.

Schema unei relaţii este numele relaţiei urmată de lista de atribute, pentru fiecare atribut
precizându-se domeniul asociat.
Astfel, pentru o relaţie R cu atributele A1, A2, ... , An şi domeniile D1, D2, ... ,Dm,
cu m ≤ n, schema relaţiei R poate fi prezentată astfel:

R(A1: D1, A2:D2, ... , An: Dm)


Sau grafic
R:
A1:D1 ... An:Dm

23:int Sir:varchar

Fig. 2.1. Reprezentarea schemei relaţiei R

2
Caracteristicile modelului relaţional sunt:
 nu există tupluri identice;
 ordinea liniilor şi a coloanelor este arbitrară;
 articolele unui domeniu sunt omogene (de același tip);
 fiecare coloană defineşte un domeniu distinct şi nu se poate repeta în cadrul aceleiaşi
relaţii.

2.2.ALGEBRA RELAȚIONALĂ

Algebra relațională a fost introdusă de E.F. Codd ca o mulţime de operații formale (


susținute de operatorii adecvați) acționând as upra unor relații având ca rezultat alte relații. Baza
teoretică pentru limbajele de interogare relaționale o constituie operatorii introduși de Codd pentru
prelucrarea relațiilor.
Operatorii modelului relațional definesc operațiile care se pot efectua asupra relațiilor în scopul
realizării funcțiilor de prelucrare asupra bazei de date. Scopul fundamental al algebrei relaționale este
de a permite scrierea expresiilor relationale și înțelegerea modului de execuție a diverselor fraze de
acces la date exprimate în limbajul SQL. Expresiile algebrei relaționale servesc ca o reprezentare de
nivel superior, simbolică, a intențiilor utilizatorului și pot fi supuse unei diversități de reguli
de transformare a lor (numite reguli de optimizare ).
Operatorii algebrei relaționale sunt:
 operatori tradiționali din teoria mulțimilor (UNION, INTERSECT,
PRODUCT, DIFFERENCE);
 operatori relaționali specifici (PROJECT, SELECT, JOIN, DIVISION).

O proprietate fundamentală în algebra relaţională constă în faptul că fiecare operator acceptă


instanţele unei relaţii sau mai multor relații în calitate de argumente şi întoarce ca rezultat o altă instanţă
de relaţie. Această proprietate permite compunerea operatorilor pentru a forma fraze de interogare
complexe. O astfel de frază de interogare corespunde unei expresii algebrice relaţionale, care se
defineşte recursiv ca fiind o relaţie, un operator algebric unar aplicat unei singure expresii, sau ca un
operator algebric binar aplicat la două expresii.

Operatorii algebrei relaționale realizează următoarele funcții:


 UNION (reuniune) – reunește două relații;
 INTERSECT (intersecție) – extrage tupluri care apar în ambele relații;
 DIFFERENCE (diferență) – extrage tupluri care apar într-o relație, dar nu apar în cealaltă;
 PRODUCT (produs cartezian) – generează toate perechile posibile de tupluri, primul element
al perechii fiind luat din prima relație, iar cel de- al doilea element din cealaltă relație;
 DIVISION (diviziune) – extrage valorile atributelor dintr-o relație, care apar în toate valorile
atributelor din cealaltă relație;
 SELECT (selecție) – extrage tupluri ce satisfac o condiție specificată;
 PROJECT (proiecție) – extrage atributele specificate;
 JOIN (compunere) – extrage tupluri din mai multe relații corelate:
 NATURAL JOIN (compunere naturală) – combină tupluri din două relații, cu condiția ca
atributele comune să aibă valori identice;
 Θ-JOIN (Θ-compunere) – combină tupluri din două relații (nu neaparat corelate), cu condiția
ca valorile atributelor specificate să satisfacă o anumită condiție;
 OUTER JOIN (compunere externă) – combină tupluri din două relații, astfel încât condițiile
de corelare să fie satisfăcute. Tuplurile din orice relație care nu satisfac aceste condiții sunt
completate cu valori null.

3
I.OPERAȚII PE MULȚIMI APLICATE RELAȚIILOR

REUNIUNEA

Fie R, S relaţii. Reuniunea este t = R ∪ S, unde t = {tupluri ti, a. î. ti ∈ R, ∀ti ∈ R sau ti ∈ S, ∀ti ∈ S}.
Reuniunea a două relații R şi S este mulțimea tuplurilor aparținând fie lui R, fie lui S, fie
ambelor relații.
Condiţii: R, S au mulţimi identice de atribute, cu aceleaşi domenii de valori.

Notații:
RS
UNION(R, S)
OR(R, S)
APPEND(R, S).

INTERSECŢIA
Intersecția conține mulțimea tuplelor t = R ∩ S, unde t = { tupluri ti, a. î. ti ∈ R ∧ ti ∈ S}.
Intersecția a două relații R şi S este mulțimea tuplurilor care aparțin şi lui R şi lui S. Operatorul
INTERSECT este un operator binar, comutativ, derivat:
R  S= R – (R – S)
R  S = S – (S – R).
Notații:
INTERSECT(R, S)
RS
AND(R, S).

DIFERENŢA
Diferența a două relații R şi S este mulțmea tuplurilor care aparțin lui R, dar nu aparțin lui S.
Diferența este o operație binară necomutativă care permite obținerea tuplurilor ce apar numai într-o
relație.

t = R – S, unde t = { tupluri ti, a. î. ti ∈ R ∧ ti ∉ S }.


t = S – R, unde t = { tupluri ti, a. î. ti ∈ S ∧ ti ∉ R }.

Observăm că R – S ≠ S – R.

Notaţii:
R–S
DIFFERENCE(R, S)
REMOVE(R, S)
MINUS(R, S).
Observație.În anumite dialecte SQL există operator special (INTERSECT), care realizează această
operație. Operatorii INTERSECT ș i DIFFERENCE pot fi simulați în SQL (în cadrul comenzii
SELECT) cu ajutorul opțiunilor EXISTS, NOT EXISTS, IN, != ANY.

ÎMPĂRȚIREA
Diviziunea este o operaţie binară care defineşte o relaţie ce conţine valorile atributelor dintr-o
relaţie care apar în toate valorile atributelor din cealaltă relație.
Sunt utilizate diferite notaţii:
DIVISION(R, S)
R  S.

4
Diviziunea conţine acele tupluri de dimensiune n – m la care, adăugând orice tuplu din S, se obţine
un tuplu din R.
Operatorul diviziune poate fi exprimat formal astfel:
R(n)  S(m) = {t(n-m)   s  S, (t, s)  R} unde n > m şi S  .

Operatorul DIVISION este legat de cuantificatorul universal () care nu există în SQL. Cuantificatorul
universal poate fi însă simulat cu ajutorul cuantificatorului existențial () utilizând relația:
x P(x)  ¬  x ¬ P(x).
Prin urmare, operatorul DIVISION poate fi exprimat în SQL prin succesiunea a doi operatori NOT
EXISTS

PRODUSUL CARTEZIAN

Fie relaţiile R şi S de arităţi m și n. Fie în R şi S tuplurile (ri1, ri2, ..., riK1), respectiv (si1, si2, ..., sik2).
Formal, produsul cartezian t = R × S al relaţiilor R şi S se defineşte prin:

t = { tupluri ti, a. î. ti = (ri1ri2...riK1si1si2...siK2), cu (ri1ri2...riK1) ∈ r şi (si1si2...siK2) ∈ s }.

Observaţie: numărul de tupluri ale produsului cartezian este produsul numerelor de tupluri ale
relaţiilor R şi S (mxn), rezultă astfel consecinţe privind timpul de execuţie şi memoria ocupată pentru
relații de dimensiuni mari.

Notații:
RS
PRODUCT(R, S)

II.OPERAŢII SPECIFICE MODELULUI RELAŢIONAL

PROIECŢIA

Fie relaţia R cu atributele A1, A2, ..., An. Fie, de asemene atributele A1, A2, ..., Ak, a. î.{ A1, A2, ..., Ak }
⊂ { A1, A2, ..., An }.
Atunci, proiecţia relaţiei R pe atributele A1, A2, ..., Ak (sau pe coloanele acestor atribute), notată cu:

∏ A1, A2, ..., Ak (r), este relaţia obţinută din R prin extragerea coloanelor atributelor A1, A2, ..., Ak.

Observație: Proiecţia se poate defini formal ca fiind relaţia:

∏i1,i2, ..., ik = { tupluri ti, a. î. ti = (a1, a2, ..., ak), iar în r ∃ tuplul (b1, b2, ..., bn), aj = bj pentru j = 1... k }
Mai sus aj, respectiv bj, sunt valori ale atributelor corespunzătoare din mulţimile { A1, A2, ..., Ak } şi,
evident, { A1, A2, ..., An }. Simbolurile i1, i2, etc. reprezintă coloane din relația R.

Proiecția este o operație unară care elimină anumite atribute ale unei relații producând o submulțime
„pe verticală“ a acesteia. Suprimarea unor atribute poate avea ca efect apariția unor tupluri
duplicate, care trebuie eliminate.
Prin proiecţie se construiește dintr-o relație R, o nouă relație:
 ştergând din R atributele care nu sunt menţionate în parametrii proiecţiei;
 eliminând dublurile care apar după ştergere.

Notații:
ΠA1, ..., Am (R)

5
PROJECT (R, A1, ..., Am) R[A1, ..., Am]
unde A1, A2, ..., Am sunt parametrii proiecţiei relativ la relaţia R.

SELECŢIA

Prin definiţie, operaţia de selecţie aplicată unei relaţii R, notată cu σF(R), constă în extragerea din R a
acelor tupluri care îndeplinesc clauza (formula sau expresia logică) F. Selecția este o operaţie unară
care produce o submulțime pe „orizontală“ a unei relații R. Schema relaţiei obţinute este
aceeaşi cu schema relaţiei R, atributele fiind aranjate – prin convenţie – în aceeaşi ordine. Operanzii
conţinuţi în clauza F sunt constante sau atribute din schema relaţiei R, iar operatorii sunt fie operatori
aritmetici uzuali (de comparaţie), fie operatori logici.

Notaţii:
σcondiţie(R)
SELECT(R, condiţie)

JONCŢIUNEA „TETA”

Joncţiunea „teta” este o operaţie compusă, care implică efectuarea unui produs cartezian şi a unei
selecţii. Fie relaţiile R şi S, precum şi o clauză F care conţine ca operanzi constante şi atribute din
schemele relaţiilor, iar ca operatori – operatorii aritmetici uzuali şi operatorii logici.

Notaţia folosită θ-JOIN


JOIN(R, S, condiţie) = σcondiţie (R  S)

Conform definiţiei, joncţiunea „teta” este efectuată în următoarea ordine:


1. se calculează produsul cartezian r × s;
2. din relaţia rezultată sunt extrase prin selecţie tuplurile care satisfac clauza F.

JONCTIUNEA NATURALA

Fie relaţiile r şi s ale căror scheme conţin un număr de atribute comune. Operatorul de compunere
naturală (NATURAL JOIN) combină tupluri din două relații R şi S, cu condiția ca atributele
comune să aibă valori identice. Joncțiunea naturală poate fi descrisă astfel :
1. se calculează produsul cartezian R  S;
2. pentru fiecare atribut comun A care definește o coloană în R şi o coloană în S, se
selectează din R  S tuplurile ale căror valori coincid în coloanele R.A şi S.A (atributul
R.A reprezintă numele coloanei din R  S corespunzătoare coloanei A din R); asupra
produsului cartezian obţinut, este efectuată o operaţiune de selecţie, prin extragerea
tuplurilor care conţin acelaşi valori ale atributelor comune din schemele relaţiilor
incidente R şi S;
3. pentru fiecare astfel de atribut A se proiectează coloana S.A, iar coloana R.A se va numi
A. Sunt eliminate coloanele redundante rezultate.

Operatorul NATURAL JOIN poate fi exprimat formal astfel:

JOIN(R, S) = Πi1,...,im σ(R.A1 = S.A1) ... (R.Ak = S.Ak)(R  S),


unde A1, ..., Ak sunt atributele comune lui R şi S, iar i1, ..., im reprezintă lista componentelor din
R  S (păstrând ordinea iniţială) din care au fost eliminate componentele S.A1, ..., S.Ak.

6
JONCŢIUNEA EXTERNĂ

Operația de compunere externă combină tupluri din două relații pentru care sunt satisfăcute
condițiile de corelare. În cazul aplicării operatorului JOIN se pot pierde tupluri, atunci când există
un tuplu în una din relații pentru care nu există nici un tuplu în cealaltă relație, astfel încât să fie
satisfăcută relaţia de corelare.
Operatorul elimină acest inconvenient prin atribuirea valorii null valorilor atributelor care există
într-un tuplu din una dintre relațiile de intrare, dar care nu există și în cea de-a doua relație.
Practic, se realizează compunerea a două relaţii R şi S la care se adaugă tupluri din R şi S, care
nu sunt conţinute în compunere, completate cu valori null pentru atributele care lipsesc.
Compunerea externă poate fi: LEFT, RIGHT, FULL. De exemplu, OUTER JOIN LEFT reprezintă
compunerea în care tuplurile din R, care nu au valori similare în coloanele comune cu relația S,
sunt de asemenea incluse în relaţia rezultat.
Detalii suplimentare pot fi consultate la http://www.bazededate.org/AlgebraRelationala.pdf și în
lucrarea în care se prezintă operatorii SQL (Lucrarea 5)

REDENUMIREA SCHEMELOR DE RELAŢIE ȘI OPERATORI DE CALCUL

Fie schema de relaţie R, cu atributele { A1, A2, ..., An }. Pentru a schimba numele schemei din R în Q,
dar cu aceleaşi atribute, folosim operatorul ρ, cu sintaxa (în algebra relatională): ρS(A1,A2,...,An ) (R).
Rezultatul este exact aceeaşi relaţie, dar cu numele Q.

La operaţiile descrise anterior se pot adăuga operaţii de calcul pe relaţii. Aceste operaţii sunt justificate
de numeroasele interogări (cereri) care necesită operaţii de calcul. Operaţiile de calcul sunt
implementate în toate limbajele de interogare. Aceşti operatori de calcul formează deci o extensie a
operatorilor de bază şi nu pot fi exprimaţi cu ajutorul acestora.

COUNT - este o operaţie care permite numărarea tuplurilor dintr-o relaţie (liniilor dintr-o tabelă) care
au aceeaşi valoare pe atributul considerat (sau aceleaşi valori pe atributele considerate). Relaţia
rezultantă va conţine numai atributul (atributele) de regrupare Xi , iar tuplurile vor fi formate din
valorile distincte şi numărul de apariţii.

SUM – este o operaţie care permite efectuarea sumei valorilor atributului Y pentru fiecare din valorile
diferite ale atributelor de regrupare X1,...,Xn . Atributul Y trebuie să fie numeric.

AVG – este o operaţie care permite efectuarea mediei aritmetice a valorilor atributului Y pentru fiecare
din valorile diferite ale atributelor de regrupare X1,...,Xn . Atributul Y trebuie să fie numeric.

MAX şi MIN - este o operaţie care permite determinarea valorii maxime / minime a atributului Y
pentru fiecare din valorile diferite ale atributelor de regrupare X1,...,Xn . Atributul Y trebuie să fie
numeric.MAX (R, Y) - rezultatul este un număr (poate fi interpretat şi ca o relaţie cu un singur atribut
şi un singur tuplu, care are ca valoare maximul valorilor atributului Y din toate liniile tabelei).
Observaţie. Pentru operaţia MIN sintaxa este similară.

2.3.OPERAŢII DE CREARE ȘI MANIPULARE A BAZELOR DE DATE ȘI A TABELELOR

MySQL-SGBD, oferă următoarele categorii de instrucțiuni organizate în cele trei sublimbaje SQL:
• limbajul de definire a datelor - Data Definition Language (DDL) –,pentru a crea /modifica şi
şterge baza de date și tabelele acesteia, etc
• limbajul de manipulare a datelor- Data Manipulation Language (DML) – pentru a interoga
(selecta) , insera, şterge şi actualiza datele din tabele.

7
• limbajul de securizare a datelor – Data Security Language (DSL) – pentru a securiza accesul
la datele stocate în baza de date.

Cele mai importante instrucțiuni DDL(CREATE/DROP/ALTER) și


DML(INSERT/DELETE/UPDATE) vor fi prezentate în continuare, excluzând instrucțiunea
de interogare a datelor SELECT , care va fi tratată într-o lucrare distinctă.

Operaţii de creare şi manipulare a BAZEI DE DATE

În MySQL, informațiile sunt structurate sub formă de baze de date , fiecare dintre acestea putând conține
mai multe tabele corelate logic asociate unui anumit model de busines ce necesită modelul aferent de
date.

CREAREA UNEI BAZE DE DATE se realizează prin instrucțiunea:

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] database_name

unde database_name este numele bazei de date ce se doreşte a fi creată. Operația este realizată cu succes
dacă utilizatorul deține dreptul CREATE asupra bazei de date și dacă baza de date nu există anterior
(altfel, trebuie specificată clauza IF NOT EXISTS). Inițial, baza de date este vidă (nu are conținut de
date)

Pentru a considera o bază de date implicită ( utilizată curent) la care se vor referi toate operațiile care
îi urmează se foloseşte instrucțiunea:
USE database_name

Pentru a afla ce baze de date există într-un anumit moment pe server, se foloseşte instrucţiunea
SHOW {DATABASES | SCHEMAS} LIKE ' pattern ' | [WHERE expr]

ȘTERGEREA UNEI BAZE DE DATE se realizează prin instrucțiunea:

DROP {DATABASE | SCHEMA} [IF EXISTS] database_name

Această comandă şterge baza de date împreună cu toate tabelele pe care le conține, cu excepția celor
marcate ca fiind temporare care sunt eliminate odată cu sesiunea curentă. Operația este realizată cu
succes dacă utilizatorul deține dreptul DROP asupra bazei de date și dacă baza de date există în prealabil
(altfel, trebuie specificată clauza de verificare IF EXISTS).

Detalii și sintaxă: http://www.mysqltutorial.org/mysql-create-drop-database.aspx

Operaţii de creare şi manipulare a TABELELOR

CREAREA UNEI TABELE :Pentru a crea o tabelă în baza de date se va utiliza comanda:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS]


nume_tabela nume_coloana1 definitii_coloana1,
nume_coloana2 definitii_coloana2,
………………………………………………………………
[NOT NULL | NULL] [AUTO_INCREMENT]
PRIMARY KEY (nume_coloana)…
UNIQUE (nume_coloana)…
FOREIGN KEY (nume_coloana )
REFERENCES nume_tabela_referita index_coloana_referita…

8
[ON DELETE optiuni_referinta]
[ON UPDATE optiuni_referinta]
[optiuni_referinta]:
RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

Detalii și sintaxă: http://www.mysqltutorial.org/mysql-create-table/

PRIMARY KEY = constrângere de integritate a relaţiei care impune valori unice şi nenule pentru
coloanele care fac parte din cheia primară (cheia primară poate fi compusă). Poate să existe o singură
cheie primară pentru o tabelă. La creearea unei chei primare se va crea în mod automat și un index
pentru a scurta timpul de răspuns în cazul unei interogări.Deasemenea se poate specifica proprietatea
de AUTO-INCREMENT caz în care valorile respective vor fi gestionate de SGBD (auto incrementate)
Detalii suplimentare : http://www.mysqltutorial.org/mysql-primary-key/

UNIQUE = constrângere care impune valori unice pentru una sau mai multe coloane, fiind un
mecanism de definire al cheilor candidate din tabelă.
Detalii suplimentare: http://www.mysqltutorial.org/mysql-unique/

FOREIGN KEY…REFERENCES = impune condiţia ca orice valoare a coloanei curente( din


tabela care referă) să se regăsească printre valorile coloanelor din tabela referită; coloana referită
trebuie să îndeplinească fie constrângerea de primary key, fie de unique. Pot exista mai multe astfel
de constrângeri la nivelul unei tabele, acestea permițând relaționarea complete a tabelelor în cadrul
bazei de date.De remarcat faptul că este posibilă definirea ca proprietate a unei coloane , sau la
nivelul întregii tabele.
De remarcat faptul că este posibilă referirea unei tabele de către ea însăși ( recursivă)

Reguli pentru FOREIGN KEY


 inserarea unei linii într-o tabelă relațională (pe care am definit FOREIGN KEY) nu se poate
face dacă valoarea pe care vrem să o inserăm pe coloana pe care avem foreign key nu există în
tabela referită (în care am definit PRIMARY KEY sau UNIQUE) corespunzător coloanelor de
relaționare. Se poate totuși insera valoarea null.
 ștergerea unei linii din tabela de referință nu se poate face atâta timp cât există linii relaționale
pe linia respectivă în tabela relațională.

Detalii suplimentare : http://www.mysqltutorial.org/mysql-foreign-key/

Opțiunea ON DELETE CASCADE ( similar pentru operația UPDATE)


 pentru a putea șterge în tabela de referință linii referite în alte tabele se folosește opțiunea ON
DELETE CASCADE. În acest caz, când se șterge o tuplă (linie) în tabela de referință se vor
șterge toate liniile din tabelele relaționate care sunt în relație cu ea,,în cazul unei tabele
relaționată cu ea însăși, ștergerea unei tuple care este referită duce la apariția de valori nule pe
toate coloanele în liniile relaționate.
 folosind opțiunea ON DELETE SET NULL, coloanele de relație din tabela relaționată devin
nule și nu sunt șterse liniile relaționate atunci când se șterge o linie din tabela de referință.
 Folosind opțiunea ON DELETE RESTRICT, operația de ștergere nu va fi transferată ( aplicată)
tuplelor relaționate din tabela referită

Observații privind caracteristici generale ale constrângerilor de integritate :


1. Fiecare constrângere va avea un nume dat de user sau generat de sistem.
2. Constrângerile pot fi activate sau dezactivate cu comanda ALTER TABLE.
3. Constrângerile pot fi adăugate sau șterse și după ce o tabela a fost creată.
4. Informațiile legate de constrângeri se păstrează în dicționarul de date.

9
ȘTERGEREA UNEI TABELE.Pentru a şterge o tabelă din baza de date se va folosi comanda:

DROP [TEMPORARY] TABLE [IF EXISTS] table_name [RESTRICT | CASCADE]

În urma executării cu succes sunt şterse atât structura cât şi conţinutul tabelei. Clauza
TEMPORARY șterge tabelele temporare, fără a avea nici un impact asupra tranzacțiilor în desfășurare
la momentul respectiv și fără a mai verifica drepturile de acces. Pentru a preveni erori în cazul în care
tabela nu există se foloseşte opţiunea IF EXISTS.

Detalii suplimentare: http://www.mysqltutorial.org/mysql-drop-table

MODIFICAREA DEFINIȚIEI UNEI TABELE :Pentru a modifica definiţia unei tabele se va folosi
comanda:

ALTER TABLE table_name [alter_specification]

Specificarea pentru operația ALTER este deosebit de complexă , ea permite orice tip de
modificare necesară asupra tabelelor bazei de date. Astfel ,prin intermediul acestei instrucţiuni se pot
adăuga sau şterge coloane, se poate schimba tipul de date sau dimensiunea unei coloane, se pot
adăuga sau şterge constrângeri de tip cheie primară sau străină respectiv index, se poate redenumi o
coloană sau chiar tabela însăşi.

ALTER TABLE tbl_name


[alter_specification [, alter_specification] ...]
[partition_options]

alter_specification:
table_options
| ADD [COLUMN] col_name column_definition
[FIRST | AFTER col_name]
| ADD [COLUMN] (col_name column_definition,...)
| ADD {INDEX|KEY} [index_name]
[index_type] (key_part,...) [index_option] ...
| ADD {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name]
(key_part,...) [index_option] ...
| ADD [CONSTRAINT [symbol]] PRIMARY KEY
[index_type] (key_part,...)
[index_option] ...
| ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
[index_name] [index_type] (key_part,...)
[index_option] ...
| ADD [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (col_name,...)
reference_definition
| ADD check_constraint_definition
| DROP CHECK symbol
| ALTER CHECK symbol [NOT] ENFORCED
| ALGORITHM [=] {DEFAULT|INSTANT|INPLACE|COPY}
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
| ALTER INDEX index_name {VISIBLE | INVISIBLE}
| CHANGE [COLUMN] old_col_name new_col_name column_definition
[FIRST|AFTER col_name]
| [DEFAULT] CHARACTER SET [=] charset_name [COLLATE [=] collation_name]
| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
| {DISABLE|ENABLE} KEYS
| {DISCARD|IMPORT} TABLESPACE
| DROP [COLUMN] col_name
| DROP {INDEX|KEY} index_name
| DROP PRIMARY KEY

10
| DROP FOREIGN KEY fk_symbol
| FORCE
| LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE}
| MODIFY [COLUMN] col_name column_definition
[FIRST | AFTER col_name]
| ORDER BY col_name [, col_name] ...
| RENAME COLUMN old_col_name TO new_col_name
| RENAME {INDEX|KEY} old_index_name TO new_index_name
| RENAME [TO|AS] new_tbl_name
| {WITHOUT|WITH} VALIDATION

De regulă, instrucțiunea ALTER TABLE crează o copie temporară a tabelei, operează modificările
asupra acesteia și atunci când acestea sunt pregătite, șterge tabela originală și redenumește tabela în
care au fost realizate actualizările.

Detalii suplimentare: http://www.mysqltutorial.org/mysql-alter-table.aspx

Vizualizarea listei ce conține tabelele existente în baza de date implicită poate fi realizată prin
intermediul comenzii SHOW TABLES.

Instrucțiunea DESCRIBE table_name are un efect similar cu SHOW COLUMNS și oferă informații cu
privire la structura tabelei specificate.

2.4.OPERAȚII DE INSERARE/MODIFICARE/ȘTERGERE A DATELOR

Pentru a INSERA date în tabele se va folosi comanda:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]


[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
{VALUES | VALUE} (value_list) [, (value_list)] ...
[ON DUPLICATE KEY UPDATE assignment_list]

Trebuie să existe o corespondență unu la unu între denumirile coloanelor și valorile specificate.
În cazul în care nu sunt indicate explicit denumirile coloanelor pentru care sunt introduse datele, clauza
VALUES / VALUE trebuie să specifice valori pentru toate atributele tabelei (în ordinea specificată la
definirea tabelei). Prin cuvântul cheie DEFAULT se precizează faptul că valoarea coloanei este cea
implicită.

Un exemplu de utilizare : INSERT INTO table_name() VALUES();

Pentru a MODIFICA datele înregistrărilor din tabele se va folosi instrucțiunea:

UPDATE [LOW_PRIORITY] [IGNORE] table_reference


SET assignment_list
[WHERE where_condition]
[ORDER BY ...] ]
[LIMIT row_count

Instrucţiunea UPDATE poate fi folosită pentru actualizarea informaţiilor din mai multe tabele
simultan (situație în care clauzele ORDER BY şi LIMIT nu vor mai putea fi folosite; între tabelele în
cauză trebuie să existe o relaţie de tip cheie primară-cheie străină, ea fiind condiţia de identificare a
înregistrărilor din clauza WHERE):

11
Când se face actualizarea datelor într-o tabelă se verifică automat și constrângerile de integritate definite
pe tabela respectivă ( FK, PK) .Astfel , situațiile în care pot apărea erori sunt:
 noile valori sunt duplicare de cheie primară sau unică.
 Actualizarea valorii cu o valoare nulă când coloana este NOT NULL.
 valorile noi nu respectă constrângerea FOREIGN KEY.
 Valorile vechi erau referite de alte tabele printr-o constrângere FOREIGN KEY.
Detalii suplimentare:
http://www.mysqltutorial.org/mysql-insert-statement.aspx
http://www.mysqltutorial.org/mysql-update-data.aspx

Ştergerea simplă/condiţională a datelor din tabele

Pentru a ȘTERGE înregistrări din din una sau mai multe tabele se va folosi comanda:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name


[PARTITION (partition_name [, partition_name] ...)]
[WHERE where_condition]
[ORDER BY ...] [LIMIT
TRUNCATE [TABLE] tbl_name row_count]

este o instrucţiune ce şterge toate rândurile şi resetează la 0 coloana id de tip AUTO-INCREMENT.

Detalii suplimentare:
http://www.mysqltutorial.org/mysql-delete-statement.aspx
http://www.mysqltutorial.org/mysql-on-delete-cascade/
http://www.mysqltutorial.org/mysql-truncate-table/

III. EXERCIȚII REZOLVATE

3.1.Se va parcurge tutorialul Workbench pentru crearea și manipularea bazei de date și tabelelor de la
adresa
https://ftp.utcluj.ro/pub/users/civan/IBD/2_LABORATOR/02_SQL_ModelulRelational/MySQL_WorkBEnch_tutorial.pdf

3.2.Pentru ilustrarea utilizării instrucțiunilor prezentate, se va utiliza schema bazei de date PERSONAL.

12
 Tabela angajat conţine informaţii despre angajaţi (nume, prenume, salariu, vechime) şi despre
departamentele în care aceştia lucrează;
 Tabela department conţine informaţii precum numele şi id-ul departamentului in care lucrează
un angajat. Fiecare deprtament are un angajat cu rol de manager.

Se cere: să se creeze baza de date, tabelele, să se aleagă tipurile de date necesare şi să se populeze cu
date tabelele,inserând minim 10 tuple în fiecare tabel.

Pentru etapele necesare creeării în manieră grafică ,se va urmări tutorialul aflat la adresa
https://ftp.utcluj.ro/pub/users/civan/IBD/1_LABORATOR/02_Intro/MySQL_WB_tutorial

CREATE DATABASE IF NOT EXISTS personal;


use personal ;

CREATE TABLE IF NOT EXISTS departament


(id int unique auto_increment
primary key, nume char(20),
manager_id int);

CREATE TABLE IF NOT EXISTS angajat


(id int unique auto_increment
primary key, nume char(20),
prenume char(20),
departament_id int, manager_id
int , salariu int, angajare
date, vechime date,
INDEX (departament_id),
FOREIGN KEY (departament_id) REFERENCES departament(id),
FOREIGN KEY(manager_id) REFERENCES angajat(id));

Să se populeze cu date prin execuție de cod SQL , respectiv ,direct ( vezi manual Workbench -
https://downloads.mysql.com/docs/workbench-en.pdf ). Un exemplu de conținut pentru cele
două tabele.
INSERT INTO departament (nume, manager_id) VALUES
('R&D', 1), ('QA', 2), ('IT', 3), ('Backend', 4), ('HR', 5);

INSERT INTO angajat (nume, prenume, departament_id, manager_id, salariu, angajare)


VALUES
('Popa', 'Ion', 1, NULL, 8000, '2000-1-12'),
('Popescu', 'Maria', 1, 1, 3000, '2003-5-6'),
('Marinescu', 'Vasile', 1, 1, 5000, '2004-6-3'),
('Ionescu', 'Andrei', 1, NULL, 3000, '2002-1-1'),
('Vasilescu', 'Ana', 2, NULL, 2000, '2006-3-3');

IV. Exerciţii propuse

4.1.Identificați și explicați operatorii algebrici preluați în algebra relațională din teoria mulțimilor.

4.2.Ce semnificație are operatorul JOIN ? Ce tipuri au fost propuse și ce semnificașie au acestea,
definind modul de obținere a relației rezultate? Care este cardinalitatea relației rezultat funcție de
tipurile respective de operatori ?

13
4.3.Modificați tipul d edate INT(11) la INT(15) pentru toate acele atribute care au domeniul de date
respectiv.
4.4. Transformați tipul char în varchar pentru o mai buna utilizare a spațiului de stocare.
4.5. Actualizați salariul angajaților cu 10% (intr. UPDATE)
4.5.Să se creeze o nouă bază de date care să permită stocarea informaţiei despre angajaţii unei companii
de software;
 Angajatii sunt identificati prin cod numeric personal, calificare, salariu, adresă şi telefon.
 Proiectele la care acestia lucrează sunt caracterizate prin număr de proiect, numele
proiectului şi bugetul alocat
 Angajatii sunt implicați în proiecte, fiecare proiect fiind gestionat de un angajat cu rol de
manager de proiect.

Creaţi baza de date şi adăugati tabelele necesare;


Adăugaţi minim 3 înregistrări în fiecare tabelă;
Adăugaţi o tabelă nouă în baza de date, numită salarii_angajati. În această tabelă:
 Adăugaţi coloanele nume_angajat, prenume_angajat şi adresa de tip char(50).
 Ştergeţi câmpul prenume_angajat;
 Redenumiti câmpul nume_angajat în Nume_Angajat;
 Adăugaţi o coloană nouă, data_angajare de tip date;
 Modificaţi tipul datelor din coloana nume_angajat din char(50) în varchar(50).

14

S-ar putea să vă placă și