Documente Academic
Documente Profesional
Documente Cultură
Curs Sinteza SQL
Curs Sinteza SQL
Nota de la testul grilă (pe calculator) mărită cu două puncte pentru studenţii
care au fost prezenţi la orele de laborator şi care au rezolvat temele de laborator.
O bază de date relaţională este o bază de date care respectă modelul relaţional,
dezvoltat de Dr.E.F.Codd. Modelul relaţional prezintă datele sub forma familiarelor
tabele bidimensionale, similar cu o foaie de calcul tabelar. Spre deosebire de o foaie
de calcul tabelar, nu este obligatoriu ca datele să fie stocate într-o formă tabelară, iar
modelul permite şi combinarea tabelelor (crearea uniunilor (joining), în terminologia
relaţională) pentru formarea vizualizarilor, care sunt prezentate tot ca tabele
bidimensionale. Flexibilitatea extraordinară a bazelor de date relaţionale este dată de
posibilitatea de a folosi tabelele independent sau în combinaţii, fără nici o ierarhie sau
secvenţa predefinita în care trebuie să se facă accesul la date.
Modelul entitate-relaţie
Una dintre cele mai cunoscute abordări ale modelării semantice (cu siguranţă
una dintre cele mai utilizate) este cea bazată pe modelul entitate-relaţie (E/R).
Acesta a fost introdus de către P.P. Chen în 1976 şi rafinat de atunci în diverse moduri
de către acesta şi de mulţi alţi cercetători, ca un model de date conceptual, pentru a
uşura proiectarea bazelor de date. Pentru reprezentarea grafică a modelului sunt
utilizate diagramele E/R, care sunt modele neformalizate pentru reprezentarea unui
model, unui sistem din lumea reală.
Diagramele E/R constituie o tehnică de reprezentare a structurii logice a bazei
de date, într-o manieră grafică. Aceste diagrame oferă un mijloc simplu şi inteligibil
de comunicare a caracteristicilor importante ale designului unei anumite baze de date.
Diagrama E/R este un model de date conceptual de nivel înalt, independent de
platforma hardware utilizată şi de tipul SGBD-ului. Modelul este constituit din
concepte care descriu structura bazei de date şi tranzacţiile de regăsire sau
reactualzare asociate.
Popularitatea modelului E/R ca modalitate de abordare a proiectării bazelor de
date poate fi atribuită în principal tehnicii de realizare a diagramelor E/R. Această
tehnică, ca şi modelul E/R însuşi, a evoluat de-a lungul timpului datorită noilor
problematici care au apărut în proiectarea bazelor de date.
Baza de date poate fi definită ca o mulţime de date ce modelează un sistem
real. Acest sistem este format din obiecte legate între ele. Modelul E/R împarte
elementele unui sistem real în două categorii: entităţi şi relaţii (legături, asocieri)
între aceste entităţi. Entităţiile şi legăturile au anumite caracteristici, numite atribute.
Nu trebuie confundat conceptul de relaţie, în sensul de asociere, care intervine în
definirea diagramei E/R cu conceptul de relaţie care este specific modelului relaţional.
Entitate
Entitatea este un obiect sau un concept, care este semnificativ pentru modelul
real analizat. O entitate poate fi dependentă (slabă), existenţa sa depinzând de altă
entitate sau independentă (tare), caz în care ea nu depinde de existenţa altei entităţi.
Entitatea poate fi persoană, loc, concept, activitate etc. Prin urmare, ea poate fi
un obiect cu existenţă fizică, reală sau poate fi un obiect cu existenţă conceptuală,
abstractă.
Cheia primară este un identificator unic în cadrul entităţii, făcând distincţie
între valori diferite ale acesteia.
Cheia primară:
trebuie să fie unică şi cunoscută la orice moment;
trebuie să fie controlată de administratorul bazei;
trebuie să nu conţină informaţii descriptive, să fie simplă, fără ambiguităţi;
să fie stabilă;
să fie familiară utilizatorului.
Observaţii
Entităţile devin tabele în modelele relaţionale.
În general, entităţile se scriu cu litere mari.
Entităţile sunt substantive, dar nu orice substantiv este o entitate. Trebuie
ignorate substantivele nerelevante.
Pentru fiecare entitate este obligatoriu să se dea o descriere detaliată.
Nu pot exista, în aceeaşi diagramă, două entităţi cu acelaşi nume, sau o aceeaşi
entitate cu nume diferite.
DEPARTAMENT
SARCINA
lucreaza_in conduce
apartine_la
atasat_la
SALARIAT PROIECT
Relaţie
Relaţia (asocierea) este o comunicare între două sau mai multe entităţi. O
valoare a unei relaţii este o comunicare între valorile entităţilor pe care le leagă.
Relaţia exprimă un raport care există între aceste entităţi. Gradul unei relaţii
este dat de numărul de entităţi participante într-o relaţie (de exemplu, relaţie binară,
ternară, cvadruplă, n-ară).
Existenţa unei relaţii este subordonată existenţei entităţilor pe care le leagă.
Între două entităţi pot exista mai multe relaţii.
O relaţie în care aceeaşi entitate participă mai mult decât o dată în diferite
roluri defineşte o relaţie recursivă. Uneori, aceste relaţii sunt numite unare.
Observaţii:
În modelul relaţional, relaţiile devin tabele speciale sau coloane speciale
care referă chei primare.
Relaţiile sunt verbe, dar nu orice verb este o relaţie.
Pentru fiecare relaţie este important să se dea o descriere detaliată.
În aceeaşi diagramă pot exista relaţii diferite cu acelaşi nume. În acest caz,
ele sunt diferenţiate de către entităţile care sunt asociate prin relaţia
respectivă.
Pentru fiecare relaţie trebuie stabilită cardinalitatea (maximă şi minimă)
relaţiei, adică numărul de tupluri ce aparţin relaţiei.
poate (cardinalitate maximă) trebuie (cardinalitate minima)
EXEMPLE:
Câţi salariaţi pot lucra într-un departament? Mulţi!
În câte departamente poate lucra un salariat? In cel mult unul!
Relaţia SALARIAT_lucreaza_in_DEPARTAMENT are cardinalitatea
maximă many-one (n:1).
Exemplu:
Câţi salariaţi trebuie să conducă un departament? Cel puţin unul!
Câte departamente trebuie să conducă un salariat? Zero!
Relaţia SALARIAT_conduce_DEPARTAMENT are cardinalitatea minimă
one-zero (1:0).
Asupra entităţilor participante într-o relaţie pot fi impuse constrângeri care
trebuie să reflecte restricţiile care există în lumea reală asupra relaţiilor. O clasă de
constrângeri, numite constrângeri de cardinalitate, este definită de numărul de
înregistrări posibile pentru fiecare entitate participantă (raport de cardinalitate). Cel
mai întâlnit tip de relaţii este cel binar, iar în acest caz rapoartele de cardinalitate sunt,
în general, one-to-one (1:1), one-to-many (1:n) sau many-to-many (m:n).
Atribut
Atributul este o proprietate descriptivă a unei entităţi sau a unei relaţii. De
exemplu, numele , genul unei film, sunt atribute al entităţii FILM.
Atributele pot fi simple (pretul de închiriere a unui film), compuse (de
exemplu, numele filmului), cu valori multiple (de exemplu, limbile în care e tradus un
film), derivate (de exemplu, vârsta unei persoane se obţine din data naşterii).
Observaţii
Trebuie făcută distincţia între atribut care uzual devine coloană în modelele
relaţionale şi valoarea acestuia, care devine valoare în coloane.
Atributele sunt substantive, dar nu orice substantiv este atribut.
Fiecărui atribut trebuie să i se dea o descriere completă în specificaţiile
modelului (exemple, contraexemple, caracteristici).
Pentru fiecare atribut trebuie specificat numele, tipul fizic (integer, float,
char etc.), valori posibile, valori implicite, reguli de validare, constrângeri,
tipuri compuse.
Diagrama Entitate/relaţie
1
Probleme
1.Să se creeze modelul E/R pentru gestiunea activităţilor de împrumut dintr-o
bibliotecă
CIT
M(1) M(0)
CAR ITOR
codec#
TE nume
codel# imprumuta
dep
titlu
autor
pret
nrex
M(0) 1 DOM
ENIU
apartine coded#
intdom
SCOALA CLIENT
cod_scoala# cod_client#
INSTRUCTOR
cod_instructor# EXAMEN
cod_examen#
EXAMINATOR
MASINA
cod_examinator#
cod_masina#
3. Campionatele de fotbal ale diferitelor ţări
ECHIPA SPONSOR
Cod_echipa# M(1) sustine M(1) M(1)
Cod_sponsor#
Nume Nume
Oras
2
joaca
M(1)
MECI
Tara#
Nr_etapa#
Cod_meci#
M(1)
apartine_de
1
ETAPA
Tara
Nr_etapa
M(1)
atasata_la
1
CAMPIONAT
Tara#
Modelul relaţional
Modelul relaţional a fost conceput şi dezvoltat de E.F. Codd. El este un model
formal de organizare conceptuală a datelor, destinat reprezentării legăturilor dintre
date, bazat pe teoria matematică a relaţiilor. Modelul relaţional este alcătuit numai din
relaţii şi prin urmare, orice interogare asupra bazei de date este tot o relaţie.
Cercetarea în domeniu 3 mari proiecte (System R, INGRES, PRTV)
Calităţi:
este simplu;
riguros din punct de vedere matematic;
nu este orientat spre sistemul de calcul.
Modalităţi pentru definirea unui SGBD relaţional:
Transformarea entităţilor
Transformarea relaţiilor
Relaţiile 1:1 şi 1:n devin chei externe. Relaţia conduce devine coloană în
tabelul DEPARTAMENT, iar relaţia lucreaza_in devine coloană în tabelul
SALARIAT. Simbolul „ ― indică plasamentul cheii externe, iar simbolul
„ ― exprimă faptul că această cheie externă este conţinută în cheia primară.
Relaţia 1:1 plasează cheia externă în tabelul cu mai puţine linii.
Relaţia m:n devine un tabel special, numit tabel asociativ, care are două
chei externe pentru cele două tabele asociate. Cheia primară este
compunerea acestor două chei externe plus eventuale coloane adiţionale.
Tabelul se desenează punctat.
Relaţiile de tip trei devin tabele asociative. Cheia primară este
compunerea a trei chei externe plus eventuale coloane adiţionale.
Transformarea atributelor
SALARIAT
cod_salariat PROIECT
salariu nr_proiect
nume job_cod
descriere
sex ATASAT_LA buget_alocat
AGENT_TERITORIAL cod_salariat
zona nr_proiect
comision functie
PROGRAMATOR
limbaj
nivel
apartine_la
Tabele
Unitatea primară de stocare a datelor într-o bază de date relaţională este
tabelul, care este o structură bidimensională compusă din rânduri şi coloane. Fiecare
tabel reprezintă o entitate, ceea ce înseamnă o persoană, un loc sau un lucru care
trebuie să fie reprezentat în baza de date, cum ar fi un client, un cont bancar sau o
tranzacţie bancară. Fiecare rând al tabelului reprezintă o apariţie a entităţii. Figura 1-1
reprezintă listingul parţial al unui tabel numit FILM(filme).
Tabelul FILM este parte a unei baze de date pentru un magazin de produse
video, folosit ca exemplu în toată aceast curs. Tabelul FILM conţine date care descriu
filmele disponibile în magazinul de produse video. Fiecare rând din tabel reprezintă
un film, iar fiecare coloană reprezintă o caracteristică a filmului respectiv, cum ar fi
titlul filmului sau categoria MPAA(Motion Picture Associationof America care a fost
fondată în 1972 în America ca asociaţie a producătorilor de film pe lângă industria
cinematografică)
Relaţii
Relaţiile reprezintă asocierile dintre tabelele bazelor de date relaţionale. Deşi
fiecare tabel relaţional poate exista independent, esenţa bazelor de date este tocmai
stocarea informaţiilor între care există legături. De exemplu, pe lângă filmele propriu-
zise, puteţi stoca informaţii despre categoriile folosite de magazin pentru organizarea
inventarelor de filme. În acelaşi timp, puteţi stoca şi informaţii despre copiile fiecărui
film, inclusiv data la care a fost primită copia şi formatul acesteia, cum ar fi DVD sau
VHS. Prin folosirea realaţiilor, puteţi asocia tabelele înrudite, într-un mod formal,
uşor de folosit astfel încât puteţi să combinaţi date din tabele multiple în aceeaşi
interogare a bazei de date, dar păstrând flexibilitatea de a include numai informaţiile
care vă interesează.Posibilitatea de a selecta din baza de date numai informaţiile care
vă interesează vă permite să ajustaţi informaţiile din bază de date în funcţie de
cerinţele specifice ale persoanelor sau aplicaţiilor care au acces la baza de date.
Figura 1-2 prezinta patru tabele din baza de date a magazinului de produse
video si relaţiile dintre acestea, într-un format cunoscut sub numele de diagrama de
relatii a entitatilor (ERD – Entity Relationship Diagram). Fiecare dreptunghi din
diagrama reprezintă un tabel relaţional, cu numele tabelului scris deasupra liniei
orizontale si coloanele tabelului enumerate pe verticala , in portiunea principala a
dreptunghiului.
Relaţiile sunt implementate folosind coloane corespondente din cele două
tabele participante. În diagrama ERD coloana sau coloanele subliniate din fiecare
tabel. UN tabel poate avea o singură cheie primară. Totuşi , o cheie primară poate fi
compusă din mai multe coloane, dacă aceasta este calea de formare a unei chei unice.
Dacă o cheie primară este folosită într-un alt tabel pentru stabilirea unei relaţii, poartă
numele de chieie externă. În figură 1-2, observaţi coloanele cheie externă folosite în
tabelul FILM pentru crearea relaţiilor cu tabelele FILM_GENRE şi MPAA_RATING
şi marcate cu identificatoarele „<fk1>‖ şi „<fk2‖> în dreapta numelui coloanei cheie
externă. Şi coloana COD_LIMBA este marcată drept cheie externă , dar tabelul
LANGUAGE şi relaţia acestuia cu tabelul FILM au fost omise din figura de mai sus.
FILM_COPII
FILM_ID <pk, fk>>
NUMAR_COPIE <pk>
DATA_CUMPARARE
DATA_VANZARE
FORMAT_MEDIA
Restricţii
O restricţie este o regulă specificată pentru un obiect al bazei de date (de
obicei un table sau o coloană), având rolul de a limita într-un mod oarecare domeniul
de valori permise pentru obiectul respectiv al bazei de date.După ce sunt specificate,
restricţiile sunt impuse automat de sistemul DBMS şi nu pot fi ocolite decât dacă o
persoană autorizata le dezactivează sau le şterge(le elimină).Fiecare restricţie primeşte
un nume unic, astfel încât să poată fi referită în mesajele de eroare şi în comenzile
folosite ulterior în bază de date.Este recomandabil ca proiectanţii bazei de date să
denumească restricţiile, deoarece numele generate automat de bază de date nu sunt
foare descriptive. Totuşi , nu am denumit restricţiile din baza de date folosită ca
exemplu în această carte, deoarece, din păcate, nu toate produsele RDBMS
disponibile în prezent acceptă restricţiile denumite.
Există mai multe tipuri de restricţii pentru baze de date:
Restricţia NOT NULL Poate fi plasată pe o coloană pentru a împiedica
folosirea valorilor nule.O valoare nulă (null) este o modalitate specială prin care
sistemul RDBMS tratează valoarea unei coloane pentru a indica faptul că valoarea
coloanei respective nu este cunoscută. O valoare nulă nu este acelaşi lucru un un
spaţiu liber, un şir vid sau valoarea zero şi este o valoare specială care nu este egală cu
nimic altceva.
Restricţia cheie primară (primary key) Definită pe coloana (coloanele)
cheie primară ale unui tabel pentru a garanta că valorile cheie primară sunt
întotdeauna unice în întreg tabelul.Atunci când cheia primară este definită pe mai
multe coloane, combinaţia valorilor acelor coloane trebuie să fie unică în tabel - o
coloană care reprezintă doar o parte a valorii cheii primare poate conţine valori
duplicate în tabel. Restricţiile cheie primară sunt aproape inttotdeauna implementate
de RDBMS prin folosirea unui index.Indexul este un tip special de obiect al unei baze
dedate care permite efectuarea căutărilor rapide în valorile coloanei.Atunci când în
tabele sunt înserate rânduri noi, sistemul RDBMS verifică automat indexul pentru a se
asigura că cheia primară a noului rând nu este deja folosită în tabel şi , dacă se
întâmplă acest lucru , respinge cererea de inserare. Căutarea în indexuri se face mult
mai repede decât căutarea în tabel;ca urmare, indexarea cheii primare este esenţială
pentru orice tabel, indiferent de dimensiunea acestuia, astfel încât căutarea cheilor
duplicate la fiecare inserare să nu ducă la o reducere semnificativă a performanţelor.
O caracteristică suplimentară a cheilor primare este faptul că nu pot fi definite decât
pe coloane pentru care a fost definită şi restricţia NOT NULL.
Restricţia de unicitate (unique) Definită pe o coloană sau un set de
coloane care trebuie să conţină valori unice ale tabelului. Ca şi în cazul cheilor
primare, sistemul RDBMS foloseşte aproape întotdeauna un index ca modalitate de
impunere eficientă a restricţiei.Totuşi, spre deosebire de cheile primare, un tabel poate
avea definite mai multe restricţii de unicitate, iar coloanele care participă la o
restricţie de unicitate pot conţine ( în cele mai multe sisteme RDBMS ) şi valori nule.
Restricţia referenţială (numită uneori restricţie de integritate
referenţială) O restricţie care impune o relaţie între două tabele dintr-o bază de date
relaţională. Prin „impunere‖ se înţelege că sistemul RDBMS se asigură întotdeauna,
în mod automat, că fiecărei valori a cheii externe îi corespunde o valoarea a cheii
primare în tabelul părinte.În tabelul FILM, sistemul RDBMS nu-mi permite să inserez
o înregistrare cu valoarea „M‖ în coloana MPAA_COD_RATING, deoarece „M‖ nu
este o valoarea MPAA_COD_RATING validă şi , ca urmare, nu apare ca valoare a
cheii primare din tabelul MPAA_RATING. În sens invers, sistemul RDBMS nu-mi
permite să şterg din tabelul MPAA_RATING rândul cu cheia primară „PG-13‖ ,
deoarece valoarea respectivă este folosită ca valoare a cheii externe pentru cel puţin
una din înregistrările din tabelul FILM. Pe scurt , restricţia referenţială garantează că
relaţia dintre cele două tabele şi valorile corespondente ale cheii primare şi cheii
externe îşi păstrează logica în orice moment.
Restricţia CHECK Foloseşte o instrucţiune logică simplă (scrisă în SQL)
pentru a valida valoarea unei coloane.Rezultatul instrucţiunii trebuie să fie o valoare
logică de adevărat (true) sau fals (false), astfel încât un rezultat adevărat să permită
înserarea în tabel a valorii coloanei, iar un rezultat fals să ducă la rejectarea valorii
coloanei , cu mesajul de eroare corespunzător.
Index
Un index reprezintă o cale rapidă de localizare şi sortare a Inregistrarilor dintr-
o tabelă prin gruparea tuturor înregistrărilor pentru un anumit atribur sau grup de
atribute. Indexarea este utilizată în două scopuri principale:
accelerarea căutărilor în baya de date
asigurarea unicităţii înregistrărilor
Vizualizări
Necesitatea normalizării
Normalizarea este procesul reversibil de transformare a unei relaţii, în relaţii
de structură mai simplă. Procesul este reversibil în sensul că nici o informaţie nu este
pierdută în timpul transformării. O relaţie este într-o formă normală particulară dacă
ea satisface o mulţime specificată de constrângeri.
Procesul normalizării se realizează plecând de la o relaţie universală ce
conţine toate atributele sistemului de modelat, plus o mulţime de anomalii. Orice
formă normală se obţine aplicând o schemă de descompunere. Există două tipuri de
descompuneri.
Descompuneri ce conservă dependenţele. Această descompunere
presupune desfacerea relaţiei R în proiecţiile R1, R2, ..., Rk, astfel încât
dependenţele lui R sunt echivalente (au închideri pseudo-tranzitive
identice) cu reuniunea dependenţelor lui R1, R2, ..., Rk.
Descompuneri fără pierderi de informaţie. Această descompunere
presupune desfacerea relaţiei R într-o mulţime de proiecţii R1, R2, ..., Rj,
astfel încât pentru orice realizare a lui R este adevărată relaţia:
Tabelul de mai jos prezintă tabelul FILM fără normalizare, aşa cum ar arăta
dacă toate informaţiile despre filme ar fi colectate într-un singur tabel.Acest exemplu
va fi folosit pentru ilustrarea procesului de normalizare. În general, numele coloanelor
din tabelele relaţionale folosesc liniuţe de subliniere pentru separarea cuvintelor. În
discuţia despre normalizare am eliminat aceste liniuţe din figuri, pentru a face textul
mai uşor de citit.
Anomaliile care apar în lucrul cu baza de date se produc datorită
dependenţelor care există între datele din cadrul relaţiilor bazei de date.
Dependenţele sunt plasate greşit în tabele!
Există trei probleme care pot apărea în tabelele fără normalizare şi toate trei
există în tabelul de mai jos. Scopul procesului de normalizare este de a elimina aceste
probleme (anomalii) din proiectul bazei de date.
2 Ac Act en, fr, R Sub 17 ani The Last 200 01/10/2005 DVD 19.96
lA Av es necesita Samurai 3
d si prezenta
ave parintilor sau a
ntur unui adult
a
2 Ac Acti en, fr, R Sub 17 ani The Last 200 01/10/2005 VHS 15.95
tA une es necesita Samurai 3
v si prezenta
ave parintilor sau a
ntur unui adult
a
3 Co Co en PG-13 Parintii sunt Something's 200 01/10/2005 1/30/2 DVD 29.99
me med avertizati Gotta Give 3 005
die ie
3 Co Co en PG-13 Parintii sunt Something's 200 2/15/2005 DVD 29.99
me med avertizati Gotta Give 3
die ie
4 Ac Acti en, fr PG-13 Parintii sunt The Italian 200 2/15/2005 DVD 19.99
tA une avertizati Job 3
v si
ave
ntur
a
Anomalia de inserare
Anomalia de inserare se referă la o situaţie în care nu puteţi insera date în baza
de date din cauza unei dependenţe artificiale dintre coloanele unui tabel.
Să presupunem că vreti să adăugaţi în baza de date a magazinului un nou gen
de film care urmează a fi folosit pentru clasificarea filmelor.Tabelul de mai sus nu
permite acest lucru decât dacă aveţi un film care să fie plasat în categoria respectivasi
pe care va trebui să-l adăugaţi în tabelul FILM în acelaşi timp.Ar fi mult mai bine
dacă aţi putea adauga noile genuri înainte de primirea filmelor în magazin.
Anomalia de ştergere
Anomalia de ştergere este inversul anomaliei de inserare. Se referă la situaţia
în care ştergerea unor date duce la pierderea neintenţionată a altor date. De exemplu
dacă primul film din tabel este singurul rând din tabelul FILM pentru care coloana
GEN_COD are valoarea „Drama‖ , şi este şters, se pierde informaţia că a existat
vreodată un gen numit „Drama”
Anomalia de actualizare
Figura 1-5 prezintă rezultatul aducerii relaţiei din figura 1-4 la prima formă
normală. Observaţi următoarele:
FIL NR GEN GEN_D MPA MPAA_RATING_ FILM_NUME A DATA DAT MEDIA PRET
M_I _C _CO ESCRIE A_CO DESC N _CUM A_VA FORMAT _INC
D OPI D RE D_RA _ PARA NZAR HIR
E TING P RE E
R
O
D
U
S
1 1 Dram Drama R Sub 17 ani necesita Mystic River 2 01/01/ DVD 19.96
a prezenta parintilor 0 2005
sau a unui adult 0
3
2 1 AclA Actiune R Sub 17 ani necesita The Last 2 01/10/ DVD 19.96
d si prezenta parintilor Samurai 0 2005
aventura sau a unui adult 0
3
2 2 ActA Actiune R Sub 17 ani necesita The Last 2 01/10/ VHS 15.95
v si prezenta parintilor Samurai 0 2005
aventura sau a unui adult 0
3
3 1 Come Comedie PG-13 Parintii sunt Something's 2 01/10/ 1/30/2 DVD 29.99
die avertizati Gotta Give 0 2005 005
0
3
3 2 Come Comedie PG-13 Parintii sunt Something's 2 2/15/2 DVD 29.99
die avertizati Gotta Give 0 005
0
3
4 1 ActA Actiune PG-13 Parintii sunt The Italian Job 2 2/15/2 DVD 19.99
v si avertizati 0 005
aventura 0
3
• Atributul FILM_ID a fost copiat din relaţia originală (FILM) în noua relaţie
(FILM Language).
• Atributul multivaloare COD_LIMBA a fost mutat din relaţia FILM în relaţia
FILM Language, cu numele Language Code. (Numele abreviate ale atributelor din
figura 1-4 au fost folosite doar pentru ilustrare - este recomandabil să prescurtaţi
numele numai dacă este absolut necesar.)
• Identificatorul unic din relaţia FILM Language este format prin combinarea
atributelor FILM_ID şi Language Code, adică din toate atributele relaţiei.
• Nici FILM, nici FILM Language din figura 1-5 nu conţin grupuri repetitive
sau atribute multivaloare, aşa că ambele relaţii sunt în prima formă normală.
Aplicând aceste criterii relaţiei FILM din figura 1 -5, este clar că avem câteva
probleme. Identificatorul unic este o combinaţie a atributelor FILM_ID şi NR_
COPIE. Totuşi, numai atributele DATA_CUMPARARE, DATA_VANZARE,
MEDIA FORMAT şi PRET_INCHIR depind de întregul identificator. Şi este logic să
fie aşa. Indiferent câte copii ale unui film avem în baza de date, toate au aceleaşi
valori pentru gen, categorie MPAA, TITLU şi AN_PRODUS.
Unele atribute descriu filmul în sine, în timp ce altele descriu copiile pe care le
deţine (sau le-a deţinut) magazinul din filmul respectiv. In esenţă, am amestecat
atribute care descriu în aceeaşi relaţie două lucruri (entităţi) diferite (deşi înrudite) din
lumea reală.
A doua formă normală se aplică numai relaţiilor care au identificatoare unice
concatenate (adică formate din atribute multiple). într-o relaţie care are un singur
atribut ca identificator unic, este imposibil ca un alt atribut să depindă de o parte a
identificatorului unic, deoarece acesta, fiind format dintr-un singur atribut, nu are părţi
componente. Ca urmare, orice relaţie în prima formă normală care are cheia primară
formată dintr-un singur atribut este automat în a doua formă normală.
După ce descoperiţi o încălcare a celei de-a doua forme normale, soluţia este
să se mute atributele parţial dependente într-o nouă relaţie, în care să depindă de
întreaga cheie primară. Figura 1-6 prezintă această soluţie. Toate atributele care
depind numai de FILM_ID sunt acum într-o relaţie (numită FILM) în care FILM_ID
este identificator unic. Cele care depind de combinaţia FILM_ID şi NR_ COPIE sunt
într-o relaţie (numită FILM Copy) în care FILM_ID şi NR_ COPIE formează
identificatorul unic. Relaţia FILM Language era deja în a doua formă normală,
deoarece nu are atribute non-cheie şi, ca urmare, a rămas nemodificată.
FILM:
MPAA_
FILM GEN_ MPAA_DESCRIE AN_PRO
GEN_DESCRIERE COD_R FILM_NUME
_ID COD RE_RATING DUS
ATING
Sub 17 ani Mystic River
necesita
1 Drama Drama R prezenta 2003
parintilor sau a
unui adult
Sub 17 ani The Last
necesita Samurai
2 ActAv Actiune si aventura R prezenta 2003
parintilor sau a
unui adult
Comed Parintii sunt Something's
3 Comedie PG-13 2003
ie avertizati Gotta Give
Parintii sunt The Italian
4 ActAv Actiune si aventura PG-13 2003
avertizati Job
FILM LANGUAGE:
FILM_ID LANGUAGE_CODE
1 En
1 Fr
2 En
2 Fr
2 Es
3 En
4 En
4 Fr
FILM COPY:
DATA_VAN
FILM ID NR_ COPIE DATA_CUMPARARE MEDIA FORMAT PRET_INCHIR
ZARE
1 1 01/01/2005 DVD 19.96
2 1 01/10/2005 DVD 19.96
2 2 01/10/2005 VHS 15.95
3 1 01/10/2005 1/30/2005 DVD 29.99
3 2 2/15/2005 DVD 29.99
4 1 2/15/2005 DVD 19.99
Figura 1-6. Soluţia pentru a doua formă normală
FILM:
MPAA_ PRET_ PRET_
FILM_ GEN_
COD_RA FILM_NUME INCHIR VHS INCHI AN_PRODUS
ID COD
TING R DVD
Mystic River 58.97 19.96
1 Drama R 2003
MPAA Rating :
MPAA_COD_RATING MPAA_DESCRIERE_RATING
PG-13 Parintii sunt avertizati
R Sub 17 ani necesita prezenta parintilor sau a unui adult
FILM GEN :
FILM FILM_GEN_DES
GEN_COD CRIERE
ActAv Actiune si aventura
Comedie Comedie
Drama Drama
O altă modificare făcută pentru a ajunge la a treia formă normală este legată de
atributul PRET_INCHIR (preţ cu amănuntul) din relaţia Movie Copy, aşa cum se
poate vedea în figura 1-6. După o discuţie cu proprietarul magazinului, am stabilit că
preţul depinde de combinaţia dintre Movie ID şi Media Format, toate copiile cu
aceleaşi valori pentru FILM_ID şi Media Format având acelaşi preţ. In mod clar,
aceasta este o dependenţă tranzitivă şi, ca urmare, o încălcare a celei de-a treia forme
normale.
Soluţia normală pentru o asemenea problemă ar fi crearea unei relaţii numite
FILM Price, având ca identificator unic combinaţia dintre FILM_ID şi Media Format,
şi mutarea atributului PRET_INCHIR din FILM Copy în noua relaţie. Totuşi, în
timpul discuţiei s-a aflat că urmează să se renunţe la furnizarea filmelor în format
VHS, deoarece sunt cerute de un număr foarte mic de clienţi şi că peste câteva luni
magazinul va avea numai filme pe DVD.
Ţinând seama de această informaţie, am decis să mut preţul în două coloane
din tabelul FILM, una cu preţul pentru DVD şi una cu preţul pentru VHS. Deşi se
poate spune că aceasta este o încălcare a primei forme normale (şi, din punct de
vedere tehnic chiar este), mi s-a părut a fi cel mai bun compromis.
Proiectarea bazelor de date nu este întotdeauna o ştiinţă exactă, aşa că de
multe ori există posibilitatea unor mici ajustări, cu condiţia ca proiectantul să ia în
calcul consecinţele potenţiale (măsurate în termenii anomaliilor de date) ale fiecărui
compromis.
Forma normală Boyce-Codd (BCNF)
Exemplu:
ADRESA(cod_parsoana#, telefon#, adresa)
cod_persoana
adresa
telefon
Majoritatea exemplelor din acest curs folosesc ca model o bază de date pentru
un magayin virtual de produse video.
Instrucţiunile SQL pentru creare obiectelor bazei de date şi pentru popularea
acestora cu date vor fi prezentate în lecţiile următoare.
În figura 1-8 se prezintă disgrama entitate relaţie, ERD (Entity Relationship
Diagram) pentru această bază de date.
FILM
FILM_ID PK
MPAA_RATING FILM_COD_GEN FK1 FILM_GEN
MPAA_COD_RATING PK MPAA_COD_RATING FK2 FILM_COD_GEN PK
MPAA_DESCRIERE_VARSTE FILM_NUME FILM_DESCRIERE_GEN
RETAIL_PRET_VHS
RETAIL_PRET_DVD
AN_PRODUS
FILM_COPII FILM_INCHIRIERE
FILM_LIMBA FILM_ID PK,FK1 FILM_ID PK,FK1
FILM_ID PK,FK1 NUMAR_COPIE PK NUMAR_COPIE PK,FK1
COD_LIMBA PK,FK2 DATA_CUMPARARE TRANZACTIE_ID PK,FK2
DATA_VANZARE DATA_INTOARCERE
FORMAT_MEDIA COST_INCHIRIERE
COST_INTARZIERE_SAU_PIERDERE
DATA_RETURNARE
LIMBA
COD_LIMBA PK CLIENT_CONT CLIENT_TRANZACTIE
NUME_LIMBA CLIENT_CONT_ID PK TRANZACTIE_ID PK
CLIENT_HOLD_IND CLIENT_CONT_ID FK1
DATA_INSCRIS ANGAJAT_PERSOANA_ID
DATA_TERMINAT TRANZACTIE_DATA
CLIENT_COD_PERSOANA CLIENT_DEPOZIT_SUMA VANZARI_TAXA
CLIENT_CONT_ID PK,FK1 CARD_CREDIT_LA_DOSAR_INDIC
PERSOANA_ID PK,FK2 COPIL_INCHIRIERE_PERMIS_INDIC
PERSOANA ANGAJAT
PERSOANA_ID PK PERSOANA_ID PK,FK1
PERSOANA_PRENUME SUPERVISOR_PERSOANA_ID
PERSOANA_NUME_MIJLOCIU ANGAJAT_TAXA_ID
PERSOANA_NUME ANGAJAT_JOB_CATEGORIE
PERSOANA_ADRESA_1 ANGAJAT_RATA_PE_ORA
PERSOANA_ADRESA_2 ANGAJARE_DATA
PERSOANA_ADRESA_ORAS INCHIDERE_DATA
PERSOANA_ADRESA_JUDET_PROV
PERSOANA_ADRESA_COD_POSTAL
PERSOANA_ADRESA_TARA
PERSOANA_TELEFON
NASTERE_DATA
MOARTE_DATA
Amintim că o tabelă este în a doua formă normală dacă este în FN1 şi fiecare
atribut care nu face parte din cheia primară este dependent de întreaga cheie primară.
Tabela Curs_Student este în FN1, dar nu îndeplineşte cea de-a doua cerinţă
pentru a fi în FN2. Coloana Denumire care depinde numai de IdCurs, nu şi de
NrMatricol , care , împreună cu IdCurs, formează cheia primară. Deci avem o
coloană care nu face parte din cheia primară şi nu depinde de toată cheia, în sensul că
, pentru o valoare dată a lui IdCurs, cunoaştem denumirea cursului fără a mai trebui să
ştim şi NrMatricol. Putem aduce tabelaCurs_Student în FN2 descompunând-o în
două tabele, după următoarea regulă: pentru fiecare dependenţă parţială se formează o
nouă tabelă (pe care o vom numi Curs) conţinând coloanele determinate de această
dependenţa (în acest caz, Denumirea) şi determinantul lor (IdCurs). Coloanele
determinate se elimină din tabela iniţială.
Cheia primară a noii tabele va fi formată din coloanele ce compun
determinantul dependenţei (IdCurs), între cele două tabele rezultate există o relaţie de
tip 1:m asigurată de existenţa lui IdCurs drept cheie străină în tabela Curs_Student.
Analog, deoarece coloanele NumeSt, PrenumeSt şi grupa depind numai de
NrMatricol, le eliminăm din tabela Curs_Student şi formăm o nouă tabelă, Student,
ce le va conţine şi va avea drept cheie primară coloana NrMatricol.
De asemenea , între tabelele Student şi Curs_Student există o relaţie de tip
1:m.
STUDENT
O tabelă este în a treia formă normală dacă este în FN2 şi toate coloanele care
nu fac parte din cheia primară sunt mutual independente (depind direct de cheia
primară şi numai de ea)
Un exemplu calasic de dependenţă tranzitivă este cel al coloanelor calculate.
Astfel , dacă o tabelă de produse ar conţine Coloanele PretUnitar şi Cantitate şi , în
plus, coloana PretTotal această tabelă nu ar fi în FN3.
Coloanele calculate nu sunt singurul caz de dependenţa tranzitivă într-o
tabelă. De exemplu în tabela Profesor se poate observă faptul că salariul depinde de
titlul profesorului, coloanele Salariu, Titlu şi IdTitlu nefăcând parte din cheia
primară.
Dependenţele tranzitivă creează probleme la adăugarea, actualizarea şi
ştergerea înregistrărilor. De exemplu, dacă la tabela Profesor se mai adaugă 20 de
înregistrări , fiecare cu titlul de preparator (prep), va trebui să introducem de 20 de ori
valoarea 5 pentru IdTitlu, descrierea „preparaotr‖ pentru Titlu şi valoarea 800 pentru
Salariu , ceea ce este evident, redundant. De asemenea, dacă salariul unui preparator
se modifică, va trebui să asctualizăm toate înregistrările corespunzătoare.
Pentru a înlătura toate aceste inconvenienţe, vom aduce tabela Profesor la
FN3 prin crearea unei noi tabele, pe care o vom numi Titlu.Tabela Titlu va avea drept
cheie primară coloana IdTitlu şi va mai conţine coloanele Titlu şi Salariu, pe care le-
am eliminat din tabela Profesor.
Profesor
IdProf Nume Catedra IdTitlu
1 Popescu Marin Matematici 1
2 Dragnea Ion Limbi straine 4
3 Iosif Irina Educatie fizica 3
4 Ilie Daniel Informatica 2
5 Savu Cristina Limbi straine 5
6 Cristea George Fizica 3
Titlu
Tabelele Titlu şi Profesor sunt în relaţia 1:m (un Titlu corespunde la mai
multe cadre didactice).
Tabele de mai sus păstrează regulile de integritate?
Constrângere:
toate avioanele cu acelaşi nume au aceeaşi capacitate.
Datorită dependenţei introduse pot exista: anomalii la inserare, modificare sau
ştergere, redundanţă în date, probleme de reconexiune.
1. Redundanţă logică. Cuplul (AIRBUS, 250) apare de trei ori.
2. Anomalie la inserţie. S-a cumpărat un B727 cu 150 locuri. El poate fi
inserat în relaţia AVION doar dacă se defineşte o nouă valoare pentru
cheia primară.
3. Anomalie la ştergere. Dacă este ştearsă înregistrarea pentru care A# este
4, atunci se pierde informaţia că un avion CAR are capacitatea 100.
4. Anomalie la modificare. Dacă se modifică capacitatea lui B707 de la 150
la 170, atunci costul modificării este mare pentru a modifica toate
înregistrările, iar dacă se modifică doar o înregistrare atunci constrângerea
nu va mai fi verificată.
Persoana Vehicul
Eu R25 - W14 - R21
Tu 205
El R5 - 305
noi BX - 305 - R12 - R25
Varianta 1
Persoana Vehicul
Eu R25
Eu W14
Eu R21
Tu 205
El R5
El 305
Noi BX
Noi 305
Noi R12
Noi R25
Varianta 2
Persoana Prima Doi Trei Patru
Eu R25 W14 R21
Tu 205
El R5 305
Noi BX 305 R12 R25
Varianta 3 (4 tabele)
Masina 31 (similar se definesc Masina_32, Masina_33, Masina_34)..
Persoana Vehicul
Eu R25
Tu 205
El R5
Noi BX
Masina_34
Persoana Vehicul
Noi R25
5. Să se aduca la FN2
O relaţie R este în a doua formă normală dacă şi numai dacă:
relaţia R este în FN1;
fiecare atribut care nu este cheie (nu participă la cheia primară) este
dependent de întreaga cheie primară.
ATASAT_LA
S1 PROGRAMATOR P1 SUPERVIZOR 60
S1 PROGRAMATOR P2 CERCETATOR 25
S1 PROGRAMATOR P3 AUXILIAR 10
S3 VANZATOR P3 SUPERVIZOR 60
S5 INGINER P3 SUPERVIZOR 60
ATASAT_2A
COD_SALARIAT# NR_PROIECT# FUNCTIA SUMA
S1 P1 SUPERVIZOR 60
S1 P2 CERCETATOR 25
S1 P3 AUXILIAR 10
S3 P3 SUPERVIZOR 60
S5 P3 SUPERVIZOR 60
ATASAT_2B
COD_SALARIAT# JOB_COD
S1 PROGRAMATOR
S3 VANZATOR
S5 INGINER
atasat_3a
Cod_salariat# Nr_proiect# Functia
S1 P1 Supervizor
S1 P2 Cercetator
S1 P3 Auxiliar
S3 P3 Supervizor
S5 P3 Supervizor
atasat_3b
Functia Suma
Supervizor 60
Cercetator 25
Auxiliar 10
Întrebări
Alegeţi răspunsurile corecte pentru fiecare din următoarele întrebări cu
răspunsuri multiple. Întrebările pot avea mai multe răspunsuri corecte.
1. SQL este
a. Un limbaj orientat spre obiecte
b. Un limbaj procedural
c. Un limbaj nonprocedural
d. Un limbaj declarativ
e. Un limbaj standard
9. Instrucţiunile SQL
a. încep cu un cuvânt cheie reprezentând o comandă
b. Se termină cu un cuvânt cheie reprezentând o comandă
c. încep cu un delimitator, cum ar fi caracterul punct şi virgulă
d. Se termină un delimitator, cum ar fi caracterul punct şi virgulă
e. încep cu o paranteză deschisă
Convenţii de sintaxă
Instrucţiunile SQL DDL au mai multe opţiuni decât alte instrucţiuni SQL.
Următoarele convenţii sunt pentru a prezenta sintaxa instrucţiunilor DDL:
Cuvintele cheie şi cuvintele rezervate din SQL sunt scrise cu majuscule, cum
ar fi CREATE TABLE.
Informaţiile pe care ar trebui să fie furnizate la scrierea instrucţiunilor sunt
scrise cu italic, cum ar fi nume_coloană.
Elementele opţionale sunt încadrate în paranteze pătrate, cum ar fi [WITH
TIME ZONE].
Opţiunile dintr-o listă de elemente posibile sunt separate de o bară verticală
(simbolul logic pentru „sau"), cum ar fi TABLE | VIEW | INDEX. Se pot întâlni
uneori ca listă de elemente opţionale, cum ar fi [NULL | NOT NULL].
Elementele de grup care sunt explicate sau analizate ulterior pe componente
(de obicei după descrierea unui tip principal de instrucţiune) sunt încadrate de
caracterele „mai mic decât" şi „mai mare decât", cum ar fi
<specificaţii_pentru_coloană>.
Un element care se poate repeta este urmat de trei puncte, cum ar fi.
[,<restricţie_pentru_tabel>...].
Toate celelalte simboluri, în special virgulele şi parantezele, fac parte din
sintaxa SQL obligatorie şi, ca urmare, trebuie să fie incluse aşa cum sunt scrise aici.
Tipuri de date
O coloană este cea mai mică unitate denumită care poate fi referită într-o bază
de date relaţională. Fiecare, coloană trebuie să aibă asociate un nume unic şi un tip de
date. Un tip de date este o categorie pentru formatul folosit de o anumită coloană.
Tipurile de date asigură câteva avantaje importante:
Restricţionarea, datelor din coloana respectivă la caracterele care au sens
pentru tipul de date specificat.
Asigurarea unor comportamente utile pentru utilizatorul datelor. De exemplu,
dacă se scade un număr dintr-un alt număr, se obţine ca rezultat un număr; dar dacă se
scade o dată dintr-o altă dată, se obţine ca rezultat diferenţa în zile dintre cele două
date calendaristice.
Creşterea eficienţei sistemului SGBD la stocarea datelor din coloane.
SQL acceptă trei categorii de tipuri de date: tipuri predefinite, tipuri construite
şi tipuri definite de utilizator.
Tipurile de date predefinite sunt cele furnizate de către producător ca parte
nativă a sistemului SGBD(vor fi tratate în continuare).
Tipurile de date construite, cunoscute şi ca tipuri de colecţii, conţin matrice
sau seturi de tipuri de date predefinite, în scopul reprezentării în SGBD a
construcţiilor de date orientate spre obiect.
Tipurile de date definite de utilizator permit utilizatorului bazei de date să
definească propriile tipuri de date, adaptate unor scopuri specifice.
Ultimele două tipuri de date nu vor fi tratate , fiind prea complicate
pentru intenţiile cursului.
Exemple
Pentru memorarea datelor numerice, tipurile cele mai frecvent folosite sunt:
NUMBER, INTEGER, FLOAT, DECIMAL.
Pentru memorarea şirurilor de caractere, cele mai frecvent tipuri de date
utilizate sunt: CHAR, NCHAR, VARCHAR2 , NVARCHAR2 şi LONG.
Informaţii relative la timp sau dată calendaristică se obţin utilizând tipul
DATE. Pentru fiecare dată de tip DATE sunt depuse: secolul, anul, luna, ziua, ora,
minutul, secunda. Pentru o coloană de tip DATE sistemul rezervă 7 bytes, indiferent
dacă se memorează doar timpul, sau doar data calendaristică.
FORMATUL IMPLICIT AL DATEI SE DEFINESTE CU AJUTORUL
PARAMETRULUI DE INITIALIZARE NLS_DATE_FORMAT. ÎN GENERAL,
ACEST PARAMETRU ESTE SETAT LA FORMA DD-MON-YY. DACA NU
ESTE SPECIFICAT TIMPUL, TIMPUL IMPLICIT ESTE 12:00:00.
Oracle9i introduce noi tipuri de date pentru timp:
TIMESTAMP(precizie_fracţiuni_secundă) cuprinde valori
pentru anul, luna şi ziua unei date calendaristice, dar şi valori pentru oră, minut,
secundă
INTERVAL YEAR (precizie_an) TO MONTH stochează o perioadă de
timp specificată în ani şi luni, unde precizie_an reprezintă numărul de cifre din
câmpul YEAR.
INTERVAL DAY (zi) TO SECOND (prec_frac_sec) stochează o
perioadă de timp reprezentată în zile, ore, minute şi secunde.
Probleme
Ex. 2
INSERT INTO timp
VALUES (TIMESTAMP '2010-02-20 09:20:40.20',
INTERVAL '23 7:44:22' DAY TO SECOND,
INTERVAL '200-02' YEAR TO MONTH);
Ex.3
INSERT INTO timp
VALUES (TIMESTAMP '2010-01-25 09:26:50.30',
INTERVAL '23 7:44:22' DAY TO SECOND,
INTERVAL '20-100' YEAR TO MONTH);
Ex.5
INSERT INTO timp
VALUES (TIMESTAMP '2010-01-25 09:26:50.30',
INTERVAL '23 2:2:2' DAY TO SECOND,
INTERVAL '20-12' YEAR TO MONTH);
INTERVAL '20-12' eroare deoarece 12 luni fac un an si depasesc intervalul de
20 ani
Ex.6
Ex.7
INSERT INTO timp
VALUES (TIMESTAMP '2010-01-25 09:26:50.30',
INTERVAL '360' SECOND,
INTERVAL „144‟ YEAR);
Se observa că inregistrarea introdusa are :
Durata_1 este de 6 min(360 sec) si
Durata_2 de 12 ani(144 de zile)
Ex.8
INSERT INTO timp
VALUES (TIMESTAMP '2010-01-25 09:00:00.30',
INTERVAL '20' DAY(2),
INTERVAL „10‟ YEAR);
Exemplu
CREATE TABLE exemplu
(durata INTERVAL YEAR(3) TO MONTH);
INSERT INTO exemplu
VALUES (INTERVAL '120' MONTH);
Exemplu
CREATE TABLE noi_carti
(codel NUMBER,
start_data TIMESTAMP);
MODELE DE FORMAT
UN MODEL DE FORMAT ESTE UN LITERAL CARACTER CARE
DESCRIE FORMATUL VALORILOR DE TIP DATE SAU NUMBER
STOCATE INTR-UN SIR DE CARACTERE. ATUNCI CAND SE
CONVERTESTE UN SIR DE CARACTERE INTR-O DATA
CALENDARISTICA SAU INTR-UN NUMAR, MODELUL DE FORMAT
INDICA SISTEMULUI CUM SA INTERPRETEZE SIRUL RESPECTIV.
ÎN INSTRUCTIUNILE SQL SE POATE FOLOSI UN MODEL DE
FORMAT CA ARGUMENT AL FUNCTIILOR TO_CHAR SI TO_DATE. ÎN
FELUL ACESTA SE POATE SPECIFICA FORMATUL FOLOSIT DE
SISTEMUL ORACLE PENTRU A RETURNA SAU A STOCA O VALOARE
IN/DIN BAZA DE DATE. UN MODEL DE FORMAT NU SCHIMBA
REPREZENTAREA INTERNA A VALORII IN BAZA DE DATE.
O PARTE DINTRE ELEMENTELE CEL MAI FRECVENT
INTALNITE ALE UNUI FORMAT DE TIP NUMERIC SUNT SINTETIZATE
IN TABELUL URMATOR.
El
Exemplu
ement Descriere
Plasează o virgulă în poziţia specificată. Într-un model de
, 9,9 format numeric pot fi precizate mai multe virgule, dar o
(virgulă) 99 virgulă nu poate apărea în partea dreaptă a punctului
zecimal.
Plasează un punct zecimal în poziţia specificată.
. 99.
Într-un format numeric, se poate specifica cel mult un
(punct) 99
punct zecimal.
$99
$ Include semnul „$― în faţa unei valori.
99
099
0 Plasează zerouri în faţa sau la sfârşitul valorii.
9; 9990
Întoarce valoarea cu numărul specificat de cifre.
999
9 Valoarea va avea un spaţiu, respectiv un minus în faţă dacă
9
este pozitivă, respectiv negativă.
Plasează în poziţia specificată simbolul ISO pentru
C99
C monede(valoarea curentă a parametrului
9
NLS_ISO_CURRENCY).
Plasează în poziţia specificată caracterul zecimal,
care este valoarea curentă a parametrului
99D
D NLS_NUMERIC_CHARACTER. Valoarea implicită este
99
punctul. Se poate specifica cel mult un caracter zecimal
într-un model de format numeric.
E 9.9
Returnează o valoare folosind notaţia ştiinţifică.
EEE EEEE
L99 Întoarce în poziţia specificată simbolul monedei
L
9 locale (valoarea curentă a parametrului NLS_CURRENCY).
Plasează semnul minus la sfârşitul valorilor negative şi un
999 spaţiu la sfârşitul celor pozitive. Acest element poate fi
MI
9MI specificat numai pe ultima poziţie a modelului de format
numeric.
S99
Plasează semnele plus sau minus la începutul sau la
99;
S sfârşitul valorii. Acest element poate apărea doar pe prima
999
sau ultima poziţie a modelului de format numeric.
9S
Element Explicaţie
AD sau A.D. Indicatorul AD (Anno Domini) cu sau fără puncte.
BC sau B.C. Indicatorul BC (Before Christ) cu sau fără puncte.
Numărul zilei din săptămână (1-7). Duminica este considerată prima
D
zi a săptămânii.
Numele zilei completat cu spaţii, până la lungimea de 9
DAY
caractere.
DD Numărul zilei din lună (1-31).
DDD Numărul zilei din an (1-366).
DY Numele zilei din săptămână, printr-o abreviere de 3 litere.
FF Fracţiunile de secundă.
HH sau HH12 Ora din zi (1-12).
HH24 Ora din zi (0-23).
MI Minutele din oră (0-59).
MM Luna din an (01-12).
MON Numele lunii, printr-o abreviere de 3 litere.
MONTH Numele lunii completat cu spaţii, până la lungimea de 9 litere.
RM Luna în cifre romane (I-XII).
RR Anul cel mai apropiat de data curentă.
Acceptă intrarea atât cu 2, cât şi cu 4 cifre. Dacă anul de
RRRR
intrare se dă cu 2 cifre, furnizează acelaşi lucru ca şi formatul RR.
SS Secundele din minut (0-59).
SSSSS Secundele trecute de la miezul noptii (0-86399).
TZH Ora regiunii.
TZM Minutul regiunii.
Y,YYY Anul scris cu virgulă după prima cifră.
YEAR sau SYEAR Anul în litere („S― prefixează anii i.Hr. cu semnul minus).
YYYY sau SYYYY Anul cu 4 cifre.
YYY, YY sau Y Ultimele cifre ale anului.
Modificatorii FM şi FX pot fi utilizaţi în modelele de format din cadrul
funcţiei TO_CHAR, controlând completarea cu spaţii şi verificarea exactă a
formatelor. Un modificator poate să apară într-un model de format de mai multe ori.
În acest caz, efectele sale sunt active pentru porţiunea din model care începe la prima
apariţie şi apoi dezactivate pentru porţiunea din model care urmează celei de-a doua
apariţii ş.a.m.d.
Modificatorul FM (Fill Mode) suprimă completarea cu spaţii în valoarea
returnată de funcţia TO_CHAR, iar FX (Format eXact) impune corespondenţa exactă
dintre argumentul de tip caracter şi modelul de format precizat pentru data
calendaristică respectivă.
Exemplu:
Nume Angajare
Pop January 21,2009
Ene October 10,2009
Exemplu
SELECT nume, TO_CHAR(data_ang,‘ DDTH ‖of‖ Month YYYY‘) angajare
FROM angajati
WHERE TO_CHAR(data_ang, ‘YYYY‘)=‘2009‘;
Nume Angajare
Pop 21st of January 2009
Ene 10TH of October 2009
Exemplu
SELECT TO_CHAR(data_ang,‘ fmDDspth Month.Year‘) angajare
FROM angajati
WHERE id_ang=100;
Angajare
Twenty_NineTH July, Two Thousand Nine
Exemplu
SELECT ‘sesiune incepe pe ‘|| TO_DATE(‘20-09-2010‘,‘DD-MM-YYYY‘) from
dual;
Sesiunea incepe pe 20-09-2010
(Afişează formatul standard pentru dată)
Valoarea null, reprezentând lipsa datelor, nu este egală sau diferită de nici o
altă valoare, inclusiv null.
Totuşi, există două situaţii în care sistemul Oracle consideră două valori null
ca fiind egale: la evaluarea funcţiei DECODE şi dacă valorile null apar în chei
compuse. Două chei compuse care conţin valori null sunt considerate identice dacă
toate componentele diferite de null sunt egale.
M M CITI
CAR
(1) (0) TOR
TE imprumut codec#
codel# a nume
titlu dep
autor
pret DOME
M 1
nrex
(0) apartine NIU
coded
coded#
intdom
1. Crearea structurii unui tabel fără a indica cheile:
CREATE TABLE carte
(codel CHAR(5),
titlu VARCHAR2(30),
autor VARCHAR2(30),
pret NUMBER(8,2),
nrex NUMBER(3),
coded CHAR(5));
Dacă cheia primară are mai mult de o coloană atunci cheile trebuie indicate la
nivel de tabel.
CREATE TABLE imprumuta
(codel CHAR(5),
codec CHAR(5),
dataim DATE DEFAULT SYSDATE,
datares DATE,
dataef DATE,
PRIMARY KEY (codel, codec, dataim),
FOREIGN KEY (codel)
REFERENCES carte(codel),
FOREIGN KEY (codec)
REFERENCES cititor(codec));
INSERT INTO domeniu
VALUES(‘I‘, ‘Informatica‘);
Restricţiile coloanelor
Clauză NOT NULL poate fi rescrisă şi sub forma unei restricţii CHECK:
ID_CONT_CLIENT INTEGER
CONSTRAINT CK_CUST _ACCT _ID CHECK (ID_CONT IS NOT
NULL)
Exemplu:
ID_CONT_CLIENT INTEGER NOT NULL UNIQUE
Restricţia PRIMARY KEY - O restricţie de cheie primară (PRIMARY
KEY) impusă asupra unei coloane declară coloana respectivă ca fiind cheia primară a
tabelului, ceea ce înseamnă că în coloana respectivă nu pot exista valori nule, iar
valorile trebuie să fie unice în cadrul tabelului. Sintaxa :
(CONSTRAINT nume_restricţie] PRIMARY KEY
EXEMPLU:
ID_CONT_CLIENT INTEGER NOT NULL PRIMARY KEY
Restricţiile tabelelor
Restricţia UNIQUE
[CONSTRAINT nume_restricţie]
PRIMARY KEY (nume_coloană [,nume_coloană...])
Restricţia de mai jos este chiar definiţia cheii primare din tabelul
CONT_CLIENT [
Exemplu:
CONSTRAINT PK_CONT_CLIENT
PRIMARY KEY (ID_CONT_CLIENT)
EXEMPLE:
1. SA SE DEFINEASCA O CONSTRANGERE LA NIVEL DE
COLOANA PRIN CARE SA SE SPECIFICE CHEIA PRIMARA SI CHEIA
EXTERNA.
CREATE TABLE carte
(codel CHAR(5)
CONSTRAINT cp_carte PRIMARY KEY,
Titlu VARCHAR2(30),
autor VARCHAR2(30),
pret NUMBER(8,2),
nrex NUMBER(3),
coded CHAR(5)
CONSTRAINT nn_coded NOT NULL
CONSTRAINT ce_coded
REFERENCES domeniu(coded));
Observaţii:
Liniile ce nu respectă constângerea sunt depuse automat într-un tabel
special.
Constrângerile previn ştergerea unui tabel dacă există dependenţe.
Constrângerile pot fi create o dată cu tabelul sau după ce acesta a fost
creat.
Constrângerile pot fi activate sau dezactivate în funcţie de necesităţi.
Instrucţiunea DROP
Exemple :
Comanda ALTER TABLE permite:
adăugarea (ADD) de coloane, chei (primare sau externe), constrângeri într-
un tabel existent;
modificarea (MODIFY) coloanelor unui tabel;
specificarea unei valori implicite pentru o coloană existentă;
activarea şi dezactivarea (ENABLE, DISABLE) unor constrângeri;
suprimarea unei coloane;
suprimarea (DROP) cheii primare, a cheii externe sau a unor constrângeri.
Comanda ALTER TABLE are următoarea sintaxă simplificată:
Dintre bazele de date care acceptă această sintaxă este numai Oracle,
începând cu versiunea 8.0
ALTER TABLE nume_tabel
RENAME COLUMN nume_vechi_coloană TO nume _nou_coloană;
ALTER TABLE timp
RENAME COLUMN durata_1 TO dur_1;
ALTER TABLE timp
RENAME COLUMN durata_2 TO dur_2;
Observaţii
Nu se poate specifica poziţia unei coloane noi în structura tabelului. O
coloană nouă devine automat ultima în cadrul structurii tabelului.
Modificarea unei coloane presupune schimbarea tipului de date, a
dimensiunii sau a valorii implicite a acesteia. O schimbare a valorii implicite
afectează numai inserările care succed modificării.
Dimensiunea unei coloane numerice sau de tip caracter poate fi mărită, dar
nu poate fi micşorată decât dacă acea coloană conţine numai valori null sau
dacă tabelul nu conţine nici o linie.
Tipul de date al unei coloane poate fi modificat doar dacă valorile coloanei
respective sunt null.
Alte opţiuni ale comenzii ALTER TABLE, care au apărut începând CU
VERSIUNEA ORACLE8I, SUNT SET UNUSED ŞI DROP UNUSED
COLUMNS:
ALTER TABLE NUME_TABEL
ET UNUSED [ ( ] NUME_COLOANĂ [ ) ];
ALTER TABLE NUME_TABEL
DROP UNUSED COLUMNS;
Opţiunea SET UNUSED permite marcarea uneia sau mai multor coloane
ca fiind nefolosite, cu scopul de a fi şterse atunci când necesităţile sistemului
impun acest lucru. Coloanele nefolosite sunt tratate ca şi cum ar fi fost
suprimate, deşi datele acestora rămân în liniile tabelului. După ce o coloană a
fost marcată UNUSED, utilizatorul nu mai are acces la aceasta prin intermediul
cererilor. În plus, numele şi tipurile de date ale coloanelor nefolosite nu vor fi
afişate cu comanda DESCRIBE din SQL*Plus. Utilizatorul poate să adauge
tabelului o nouă coloană având acelaşi nume cu cel al unei coloane nefolosite.
DROP UNUSED COLUMNS şterge din tabel toate coloanele marcate ca
fiind nefolosite. Acest lucru se poate utiliza pentru eliberarea spaţiului de pe disc
corespunzător coloanelor nefolosite din tabel. Dacă tabelul nu conţine nici o
coloană nefolosită, instrucţiunea nu întoarce o eroare şi nu are nici un efect.
Atunci când se elimină o coloană dintr-un tabel folosind opţiunea DROP a
comenzii ALTER TABLE, vor fi suprimate şi coloanele din tabel care sunt
marcate cu opţiunea SET UNUSED.
Instrucţiunea DROP
Exemplu:
DROP TABLE DEPARTAMENT ;
DROP TABLE COD_CLIENT CASCADE CONSTRAINTS; (Oracle)
EXEMPLU:
SELECT 'DROP TABLE' || OBJECT_NAME || ';'
FROM USER_OBJECTS
WHERE OBJECT_TYPE = 'TABLE';
Instrucţiunea CREATE INDEX
Crearea unui index (care nu este obligatoriu unic) pe una sau mai multe
coloane ale unui tabel se face prin comanda:
Exemplu:
Pentru a asigura că server-ul Oracle utilizează indexul şi nu efectuează o
căutare asupra întregului tabel, valoarea funcţiei corespunzătoare expresiei
indexate trebuie să nu fie null în interogările ulterioare creării indexului.
Următoarea instrucţiune garantează utilizarea indexului dar, în absenţa clauzei
WHERE, server-ul Oracle ar putea cerceta întreg tabelul.
SELECT * FROM artist
WHERE UPPER(nume) IS NOT NULL
ORDER BY UPPER(nume);
Exemplu:
Să se creeze tabelul artist, specificându-se indexul asociat cheii primare.
CREATE TABLE artist(
cod_artist NUMBER
PRIMARY KEY USING INDEX
(CREATE INDEX artist_cod_idx
ON artist(cod_artist)),
nume VARCHAR2(30) NOT NULL,
prenume VARCHAR2(30));
Secvenţe
O secvenţă este un obiect în baza de date care serveşte pentru a genera întregi
unici în sistemele multi-utilizator, evitând apariţia conflictelor şi a blocării.
Secvenţele sunt memorate şi generate indiferent de tabele aceeaşi secvenţă
poate fi utilizată pentru mai multe tabele. O secvenţă poate fi creată de un utilizator şi
poate fi partajată de mai mulţi utilizatori.
Crearea unei secvenţe se face cu ajutorul comenzii:
CREATE SEQUENCE [<nume_schema>.]<nume_secventa>
[INCREMENT BY n] [START WITH m]
[{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}]
[{CACHE k | NOCACHE}]
CACHE k | NOCACHE specifică numărul de valori alocate de server-ul Oracle pe
care le va păstra în memoria cache pentru a oferi utilizatorilor un acces rapid
(implicit sunt alocate 20 de valori);
O secvenţă este referită într-o comandă SQL cu ajutorul pseudo-coloanelor:
NEXTVAL – referă valoarea următoare a secvenţei;
CURRVAL – referă valoarea curentă a secvenţei.
NEXTVAL şi CURRVAL pot fi folosite în:
clauza VALUES a unei comenzi INSERT;
clauza SET a unei comenzi UPDATE;
lista SELECT a unei subcereri dintr-o comanda INSERT;
lista unei comenzi SELECT.
NEXTVAL şi CURRVAL nu pot fi folosite în:
subinterogare in SELECT, DELETE sau UPDATE;
interogarea unei vizualizări;
comandă SELECT cu operatorul DISTINCT;
comandă SELECT cu clauza GROUP BY, HAVING sau ORDER BY;
clauza WHERE a unei comenzi SELECT;
condiţia unei constrângeri CHECK;
valoarea DEFAULT a unei coloane într-o comandă CREATE TABLE sau
ALTER TABLE;
comandă SELECT care este combinată cu altă comandă SELECT printr-un
operator mulţime (UNION, INTERSECT, MINUS).
Din dicţionarul datelor pot fi obţinute informaţii despre secvenţe folosind
vizualizarea USER_SEQUENCES.
1) Să se creeze o secvenţă domeniuseq care să fie utilizată pentru a insera noi
domenii în tabelul domeniu şi să se insereze un nou domeniu.
2) Să se afişeze informaţiile referitoare la secvenţa domeniuseq.
CREATE SEQUENCE domeniuseq
START WITH 1
INCREMENT BY 1;
Comentarii
Sistemul Oracle oferă posibilitatea de a comenta obiectele create, printr-un
text care este inserat în dicţionarul datelor. Comentariul se poate referi la tabele,
vizualizări, clişee sau coloane.
COMMENT ON {TABLE nume_obiect | COLUMN
nume_obiect.nume_coloana}IS ‘text comentariu‘
Sinonime
Oracle oferă posibilitatea de a atribui mai multe nume aceluiaşi obiect. Aceste
nume adiţionale sunt numite sinonime (synonymes). Ele sunt utile deoarece permit
simplificarea formulării cererii şi referirea la obiecte, fără a fi nevoie să se specifice
proprietarii obiectelor sau localizarea acestora.
Spre deosebire de alias a cărui durată de viaţă este limitată la cererea ce
conţine alias-ul, sinonimele sunt salvate în dicţionarul datelor şi pot fi reutilizate.
Sistemul Oracle permite crearea de sinonime pentru obiecte de tipul:
tabel, vizualizare, secvenţă, funcţie, procedură, pachet, clişeu, sinonim.
CREATE [PUBLIC] SYNONYM [schema.]nume_sinonim
FOR [schema.]obiect
Exemplu:
CREATE SYNONYM artist1 FOR artist;
SELECT * from user_objects;
SELECT * from artist1;
Grupări
Cluster-ul este o regrupare fizică a două sau mai multe tabele, relativ la una
sau mai multe coloane, cu scopul măririi performanţelor. Coloanele comune definesc
cheia cluster-ului.
Un cluster este un obiect al bazei care necesită:
un nume unic la nivelul schemei,
specificare a coloanelor care compun cheia cluster-ului,
specificare a spaţiului de stocare (opţional),
un index (relativ la cheia cluster-ului).
Un cluster trebuie să aibă cel puţin un index. Acest index trebuie creat înaintea
oricărei comenzi LMD care va acţiona asupra tabelelor cluster-ului. Un index al
cluster-ului se deosebeşte de un index al tabelului (de exemplu, absenţa indexului
afectează utilizatorul – datele cluster-ului nu sunt accesibile).
Coloanele comune definite pentru cluster, reprezintă cheia cluster-ului şi
criteriul de regrupare.
Liniile diferitelor tabele sunt regrupate în interiorul aceluiaşi bloc
urmărind cheia cluster-ului. Dacă liniile asociate unei aceiaşi valori a cheii
cluster-ului necesită un spaţiu de mai multe blocuri, atunci blocurile sunt
înlănţuite.
Crearea unui cluster presupune:
crearea structurii cluster-ului;
crearea indexului cluster-ului;
crearea tabelelor care vor compune cluster-ul.
Crearea unui cluster se realizeaza prin comanda:
CREATE CLUSTER nume_cluster
(nume_coloana tip_data [,nume_coloana tip_data] …) [SIZE n]
Există două modalităţi pentru introducerea unui tabel într-un cluster.
O primă variantă presupune că cluster-ul este creat pentru un tabel care deja
există. De fapt, nu se poate asocia un cluster unui tabel care există!
A doua variantă presupune că introducerea tabelului în cluster se face în
momentul creării structurii tabelului (comanda CREATE TABLE).
Exerciţiu:
Să se obţină un cluster referitor la lista cărţilor din fiecare domeniu.
Varianta 1
CREATE CLUSTER cdoml(cdom CHAR(1));
CREATE INDEX indcom ON CLUSTER cdoml;
CREATE TABEL domino
CLUSTER cdoml(coded)
AS SELECT * FROM domeniu;
DROP TABEL domeniu;
RENAME domino TO domeniu;
ALTER TABLE carte
MODIFY coded NOT NULL;
CREATE TABEL carticica
CLUSTER cdoml(coded)
AS SELECT * FROM carte;
DROP TABLE carte;
RENAME carticica TO carte;
Varianta 2
CREATE CLUSTER cdoml(cdom CHAR(1));
CREATE INDEX indcom ON CLUSTER cdoml;
-- crearea spatiului
CREATE TABLE domeniu
(coded CHAR(1) NOT NULL,
intdom CHAR() ... )
CLUSTER cdoml(coded);
CREATE TABLE carte
(codel CHAR(5) NOT NULL,
…
coded CHAR(1) NOT NULL)
CLUSTER cdoml(coded);
Pentru a scoate un tabel dintr-un cluster sunt parcurse următoarele etape: se
creează un nou tabel, în afara cluster-ului, prin duplicarea celui vechi; se distruge
tabelul din cluster; se suprimă cluster-ul.
CREATE TABLE alfa
AS SELECT * FROM domeniu;
DROP TABLE domeniu;
RENAME alfa TO domeniu;
CREATE TABLE beta
AS SELECT * FROM carte;
DROP TABLE carte;
RENAME beta TO carte;
DROP CLUSTER cdoml;
Un alt tip de cluster oferit de Oracle este cluster-ul hash. În acest caz, pentru a
accesa o înregistrare, cluster-ul hash nu foloseşte un index, ci o funcţie numerică,
numită funcţia hash. Funcţia are ca parametru cheia cluster-ului şi returnează o
anumită valoare (valoare hash). Această valoare corespunde blocului de date din
cluster pe care Oracle îl va citi sau scrie pe baza comenzii executate.
De exemplu, apelurile telefonice efectuate de un client într-o lună vor fi
facturate împreună. Apelurile pot fi depozitate într-un cluster hash a cărui cheie este
formată din coloanele ce conţin numărul telefonului, anul şi luna în care a avut loc
convorbirea.
Suprimarea unui cluster din baza de date se face prin comanda:
DROP CLUSTER nume_cluster
În urma ştergerii unui cluster, tabelele pe care acesta le conţine nu mai sunt
grupate. Secvenţa următoare suprimă: cluster-ul, toate tabelele definite relativ la acest
cluster şi constrângerile lor de integritate.
DROP CLUSTER nume_cluster
INCLUDING TABLES
CASCADE CONSTRAINTS;
Modificarea unui cluster permite redefinirea condiţiilor, modificarea
parametriilor de stocare şi a caracteristicelor de stare (ALTER CLUSTER).
Întrebări
Alegeţi răspunsurile corecte pentru fiecare din următoarele întrebări cu
răspunsuri multiple. Reţineţi că întrebările pot avea mai multe răspunsuri corecte.
1. Tipurile de date oferă următoarele avantaje
a. Respectă standardele publicate
b. Oferă un set de comportamente utile pentru utilizatorii bazei
c. Asigură independenţa faţă de date
d. Restricţionează datele din coloane la caractere care au sens în context
e. Ajută sistemul DBMS să stocheze mai eficient datele din coloane
2. Tipurile de date pentru caractere
a. Sunt mai flexibile decât tipurile de date numerice
b. Acceptă atât date cu lungime fixă, cât şi date cu lungime variabilă.
c. Necesită întotdeauna specificarea preciziei şi a scalei
d. Determină completarea coloanelor până la lungimea maximă maximă
e. Pot stoca şiruri de caractere în format specific unei limbi naţionale
3. Tipurile de date numerice
a. Sunt mai flexibile decât tipurile de date pentru caractere
b. Restricţionează valorile din coloane la numere şi simboluri înrudite, cum
ar fi virgulele şi simbolul dolar
c. Necesită întotdeauna specificarea preciziei şi a scalei
d. Stochează valori exacte sau aproximative
e. Sunt potrivite pentru a fi folosite în calcule
4. Tipurile numerice standard includ
a. INTEGER
b. NUMBER
c. FLOAT
d. BOOLEAN
e. INTERVAL
5. Tipurile de date temporale standard includ
a. DATETIME
b. DATE
c. TIMESTAMP
d. TIMEZONE
e. TIME
6. Valorile NULL
a. Pot fi folosite pentru reprezentarea datelor care lipsesc sau nu sunt
cunoscute
b. Înseamă acelaşi lucru ca şi spaţiile libere
c. Sunt egale cu alte valori NULL
d. Nu sunt egale cu alte valori NULL
e. Sunt întotdeauna permise în mod prestabilit
7. Instrucţiunile DDL includ
a. CREATE
b. ALTER
c. DELETE
d. INSERT
e. UPDATE
8. Instrucţiunea CREATE DATABASE
a. Funcţionează exact la fel în toate sistemele DBMS relaţionale
b. Specifieă întotdeauna numele bazei de date
c. Specifieă întotdeauna numele proprietarului bazei de date
d. Poate include parametri specifici producătorului
e. Funcţionează la fel cu instrucţiunea CREATE SCHEMA
9. Definiţia unei coloane din instrucţiunea CREATE TABLE poate include
a. Numele tabelului
b. Numele coloanei
c. restricţie la nivel de tabel
d. clauză DEFAULT
e. O clauză NULL sau NOT NULL
10. Numele unei coloane dintr-un tabel
a. Trebuie să fie specificat în instrucţiunea CREATE TABLE
b. Trebuie să fie unic în cadrul bazei de date
c. Trebuie să fie unic în cadrul tabelului
d. Poate fi folosit într-un singur index
e. Trebuie să fie specificat în instrucţiunea ALTER TABLE
11. O restricţie la nivel de coloană
a. Poate referi una sau mai multe coloane
b. Poate fi inclusă într-o instrucţiune CREATE TABLE sau ALTER TABLE
c. Foloseşte o sintaxă identică sau aproape identică cu cea a unei restricţii de
acelaşi tip la nivel de tabel
d. Poate fi folosită oriunde ar putea fi folosită o restricţie la nivel de tabel
e. Are o sintaxă care diferă de la un tip de restricţie la altul
12. Sintaxa corectă pentru clauza DEFAULT este
a. DEFAULT (precizie, scală)
b. DEFAULT [NULL | NOT NULL]
c. DEFAULT (expresie)
d. DEFAULT (nume–coloană) REFERENCES name–tabel (nume_coloană.)
e. DEFAULT [UNIQUE | PRIMARY KEY]
13. Sintaxa corectă pentru o restricţie NOT NULL este
a. nume_coloană tip --de–date IS NOT NULL
b. nume_coloană tip–de–date NOT NULL
c. DEFAULT [NULL | NOT NULL]
d. CREATE NOT NULL INDEX ON nume_coloană
e. nume–coloană REFERENCES NOT NULL
14. Sintaxa corectă pentru o restricţie UNIQUE este
a. [CONSTRAINT nume—restricţie] UNIQUE (nume_coloană)
b. [CONSTRAINT nume—restricţie] UNIQUE (nume_tabel)
c. DEFAULT UNIQUE (nume_coloană)
d. nume_coloană REFERENCES UNIQUE nume_tabel
e. DEFAULT [UNIQUE | PRIMARY KEY]
15. Sintaxa corectă pentru o restricţie referenţială este
a. [CONSTRAINT nume—restricţie] REFERENCES nume_index
b. [CONSTRAINT nume—restricţie] REFERENCES nume_tabel
c. FOREIGN KEY nume_coloană REFERENCES nume_tabel
(nume_coloană)
d. REFERENCES nume—tabel (nume_coloană)
e. nume_coloană REFERENCES UNIQUE nume_tabel
16. Instrucţiunea CREATE INDEX
a. Poate fi folosită pentru crearea restricţiilor de unicitate şi cheie primară
b. Poate include cuvântul cheie UNIQUE
c. Trebuie să refere două sau mai multe nume de coloane
d. Poate include cuvintele cheie ASC sau DESC pentru orice coloană
e. Poate specifica ordinea ascendentă sau descendentă pentru una sau mai
multe coloane
17. Instructiunea CREATE VIEW
a. Stochează o interogare în baza de date
b. Poate include cuvântul cheie opţional CASCADE
c. Poate include cuvântul cheie opţional OR REPLACE
d. Trebuie să conţină o comandă DMI, validă
e. Trebuie să conţină o instrucţiune SELECT validă
18. Utilizările valide ale instrucţiunii ALTER TABLE includ
a. Adăugarea coloanelor
b. Modificarea lungimii sau a preciziei coloanelor
c. Redenumirea unui tabel
d. Eliminarea unei chei primare
e. Adăugarea unei chei primare
19. O instrucţiune ALTER TABLE nu poate fi folosită pentru
a. Schimbarea tipului de date al unei coloane la un tip numeric dacă în
coloana respectivă există date de alt tip
b. Redenumirea unei coloane
c. Schimbarea unei restricţii din NULL în NOT NULL pentru o coloană care
conţine valori nule
d. Eliminarea unei chei exteme care referă o cheie primară
e. Eliminarea unei chei primare dacă există chei exteme care referă cheia
primară
20. Instrucţiunea DROP poate fi folosită pentru a şterge
a. restricţie referenţială
b. Un index
c. Un tabel
d. coloană dintr-un tabel
e. vizualizare
Lecţia 3. Limbajul de interogare a datelor(DQL)
Limbajul SQL de interogare a datelor (DQL – Data Query Language)
include o singură comandă SELECT, care este cea mai folosită pentru a obţine date
din baza de date, astfel încât acestea să fie prelucrate de o anumită aplicaţie sau să fie
afişate. Rezultatul unei instrucţiuni SELECT, numit şi set de rezultate, este
returnat sub forma unui tabel. Deoarece SQL este un limbaj neprocedural, se specifică
rezultatele pe care le doriţi să le obţineţi, nu şi modul lor de obţinere.
Sortarea rezultatelor
Rezultatele interogărilor sunt deseori mult mai utile dacă se specifică pentru
rândurile returnate o ordine care să aibă o semnificaţie pentru persoana sau aplicaţia
care foloseşte informaţiile. În SQL, acest lucru este făcut prin adăugarea în instrucţiunea
SELECT a clauzei ORDER BY, cu o listă de una sau mai multe coloane care vor fi
folosite pentru sortarea rândurilor în ordine ascendentă sau descendentă, în conformitate
cu valorile datelor din coloane. De asemenea, se ţine seama de următoarele aspecte:
Ordinea prestabilită pentru fiecare coloană este ascendentă, dar se poate
adăuga cuvântul cheie ASC după numele coloanei pentru obţinerea unei ordonări
ascendente sau cuvântul cheie DESC pentru obţinerea unei ordonări descendente.
Nu este obligatoriu ca numele coloanelor din lista ORDER BY să fie incluse şi
în lista de rezultate (adică în lista SELECT).
Motorul SQL din SGBD va găsi cea mai bună cale de ordonare a coloanelor.
În general, sortarea datelor este un proces costisitor din punct de vedere al resurselor
de calcul, aşa că majoritatea sistemelor SGBD folosesc un index pentru accesul la
rânduri în ordinea dorită, presupunând că există, şi fac o sortare propriu-zisă numai ca
ultimă soluţie.
Se poate folosi pseudonimele coloanelor în clauza ORDER BY, dar dacă se
face acest lucru se forţează motorul SQL să sorteze rezultatele abia după rularea
interogării.
În locul coloanelor, se poate specifica în lista de ordonare poziţia relativă a
coloanelor. De exemplu, clauza ORDER BY 1,2 va sorta rezultatele în ordine
ascendentă după primele două coloane din setul de rezultate. Numărul specificat nu
are nici o legătură cu poziţia coloanei în tabelul sau vizualizarea sursă. Această
opţiune nu este agreată în programarea SQL formală, deoarece dacă ulterior cineva
modifică interogarea, este posibil să amestece coloanele din lista SELECT, fără să-şi
dea seama că astfel schimbă şi coloanele folosite pentru sortarea rezultatelor.
Dacă dorim să ordonăm acum crescător după rating şi descrescător după gen,
atunci instrucţiunea de mai sus odificată va fi
Operator Descriere
= Egal cu
< Mai mic decât
<= Mai mic sau egal
> Mai mare decât
>= Mai mare sau egal
!= Diferit de
<> Diferit de (standard ANSI)
Exemple:
Să se afişeze toate filmele pentru care RATING are valoarea PG-13.
Să se afişeze toate filmele pentru care categoria RATING este PG-13 sau
preţul de vânzare cu amănuntul pentru formatul DVD este 19.99 sau mai
mic, în ordinea crescătoare a preţurilor.
SELECT COD_RATING AS RATING,
PRET_VANZARE_DVD AS PRET, TITLU_FILM
FROM FILM
WHERE COD_RATING = 'PG-13'
OR PRET_VANZARE_DVD <= 19.99
ORDER BY PRET_VANZARE_DVD;
Operatori logici
IS NULL
Operatorul IS NULL este folosit pentru a determina dacă o valoare este nulă.
Exemple:
Să se găsească toate conturile de clienţi active, adică toate conturile pentru
care coloana DATA–TERMINATA conţine o valoare nulă:
SELECT ID_CONT_CLIENT
FROM CONT_CLIENT
WHERE DATA_INCHEIERE IS NULL;
BETWEEN
Operatorul BETWEEN este folosit pentru a determina dacă o valoare
se încadrează într-un interval special. Intervalul este specificat folosind o valoare
minimă şi o valoare maximă, fiind un interval inclusiv, ceea ce înseamnă că include şi
valori specificate.
Exemple:
Să se afişeze toate filmele cu preţul de vânzare cu amănuntul pentru
formatul DVD între 14.99 şi 19.99, ordonate crescător după preţ.
SELECT TITLU_FILM, PRET_VANZARE_DVD
FORM FILM
WHERE PRER_VANZARE_DVD BETWEEN 14.99 AND 19.99
ORDER BY PRER_VANZARE_DVD;
LIKE
Operatorul LIKE este folosit pentru a compara o valoare de tip caracter cu un
tipar*, returnând valoarea logică ―adevărat‖ dacă valoarea de tip caracter se
încadrează în tipar şi ―fals" în caz contrar. Pentru definirea tiparului pot fi folosite
două caractere de înlocuire:
Liniuţa de subliniere (_) - Caracterul liniuţă de subliniere poate fi folosit
drept caracter de înlocuire poziţional, ceea ce înseamnă că se potriveşte cu orice
caracter aflat pe poziţia respectivă în şirul de caractere evaluat.
Procent (%) - Simbolul procent (%) poate fi folosit drept caracter de înlocuire
nepoziţional, ceea ce înseamnă că se potriveşte cu orice număr de caractere, indiferent
de lungime.
Tipar Interpretare
%Now Se potriveşte cu orice şir de caractere care se termină
cu „Now".
Now% Se potriveşte cu orice şir de caractere care incepe cu
„Now".
%Now Se potriveşte cu orice şir de caractere care confine
% „Now" (1a inceput, la sfârşit sau în mijloc).
N_w Se potriveşte cu orice şir de caractere format din exact
trei caractere, care începe cu „N" şi se termină cu „w".
%N-w% Se potriveşte cu orice şir de caractere care conţine
litera „N", urmată de orice alt caracter, urmat de litera „w" (1a
începutul, la sfârşitul sau undeva în mijlocul şirului de
caractere)
EXISTS
Operatorul EXISTS este folosit pentru a detemina dacă o subinterogare conţine
înregistrări. Dacă în setul de rezultate al subinterogării nu există nici un rând,
operatorul returnează valoarea „false‖; dacă setul de rezultate conţine cel puţin un
rând, valoarea devine „adevărat‖.
Exemple de utilizare a operatorului EXIST:
Filmul The Last Samurai se închiriază bine atât în format DVD, cât şi-n
format VHS şi se doreşte să se asigure că în inventarul magazinului există o copie
VHS. Tabelul FILM_COPIAT conţine un rând pentru fiecare copie a unui film din
inventarul magazinului, aşa că puteţi folosi o subinterogare pentru a afla dacă există
copii VHS ale filmului în inventar. De cele mai multe ori, operatorul EXISTS este
folosit in conjuncţie cu o formă mai complexă de subinterogare, numită subinterogare
corelat. (correlated subquery),în care valorile datelor din interogarea externă
(ID_FILM, în acest caz) sunt comparate cu rândurile din interogarea intenă.
SELECT ID_FILM, TITLU_FILM
FROM FILM m
WHERE TITLU_FILM = 'The Last Samurai'
AND EXISTS
(SELECT ID_FILM
FROM FILM_COPIAT c
WHERE m. ID_FILM = c. ID_FILM);
Dacă se inversează logica, folosind operatorul NOT EXISTS, puteţi afişa titlul
filmului numai dacă nu există o copie VHS în inventar.
SELECT ID_FILM, TITLU_FILM
FROM FILM m
WHERE TITLU_FILM = 'The Last Samurai'
AND NOT EXISTS
(SELECT ID_FILM
FROM FILM_COPIAT c
WHERE m. ID_FILM = c. ID_FILM);
Operatori aritmetici
În SQL, operatorii aritmetici sunt folositi pentru efectuarea calculelor
matematice – la fel ca şi în formulele dintr-o foaie de calcul tabelar sau într-un limbaj
de programare, precum Java sau C. Cei patru operatori aritmetici din SQL sunt:
Op Descri
erator ere
+ Adun
are
- Scăde
re
* Înmul
ţire
/ Împăr
ţire
Ca şi în cazul operatorilor conjunctivi, dacă se amestecă operatorii aritmetici
în aceeaşi instrucţiune SQL fără a folosi paranteze, ordinea în care sunt evaluate
operaţiile este determinată de prioritatea predefinită. Din fericire, prioritatea
operatorilor din SQL este cea pe care o folosim în operaţiile matematice obişnuite.
Exemple de utilizare a operatorilor aritmetici:
Cât v-ar costa să cumpăraţi copiile VHS şi DVD ale filmului The Last
Samurai?
SELECT PRET_VANZARE_VHS + PRET_VANZARE _DVD AS COST
FROM FILM
WHERE TITLU_FILM = 'The Last Samurai';
Cât v-ar costa aceeaşi achiziţie dacă aţi avea un bon valoric de 5$?
SELECT (PRET_VANZARE _VHS + PRET_VANZARE _DVD) - 5 AS
COST
FROM FILM
WHERE TITLU_FILM = 'The Last Samurai';
Dacă taxele sunt de 8.25% (0.0825), cât reprezintă taxele de vânzare din
costul achiziţiei anterioare?
SELECT (PRET_VANZARE _VHS+ PRET_VANZARE _DVD) * 0.0825
AS TAX
FROM FILM
WHERE TITLU_FILM = 'The Last Samurai';
Care este costul mediu pentru o copie a filmului The Last Samurai?
SELECT (PRET_VANZARE_VHS+PRET_VANZARE _DVD) / 2
AS AVG_COST
FROM FILM
WHERE TITLU_FILM = 'The Last Samurai'
Funcţii SQL elementare
UPPER
Funcţia UPPER transformă literele dintr-un şir de caractere în litere mari.
Numerele şi caracterele speciale sunt lăsate ca stare.
Exemple:
Să se afişeze comediile (COD_GEN_FILM = 'Comdy') scriind titlurile cu
majuscule.
SELECT UPPER(TITLU_FILM) AS TITLU_FILM
FROM FILM
WHERE COD_GEN_FILM = 'Comdy';
Funcţia UPPER este deseori folosită în condiţiile WHERE. Să presupunem că
nu vă amintiţi dacă valorile COD_GEN_FILM au fost stocate cu litere mari, litere
mici sau combinaţii ale acestora. Dacă în condiţia WHERE transformaţi valorile în
litere mari, puteţi obţine rezultatele corecte indiferent de modul de stocare.
SELECT UPPER(TITLU_FILM) AS TITLU_FILM
FROM FILM
WHERE UPPER(COD_GEN_FILM) = 'COMDY';
LOWER
Funcţia LOWER este inversa funcţiei UPPER — transformă literele dintr-un *
de caractere în litere mici.
Îată câteva exemple de utilizare a funcţiei LOWER:
Să se afişeze comediile (GEN_COD_FILM = 'Comedy') scriind titlurile cu
minuscule.
SELECT LOWER(TITLU_FILM) AS TITLU_FILM
FROM FILM
WHERE GEN_COD_FILM = 'Comedy';
Se poate folosi funcţia LOWER într-o clauză WHERE, atunci când nu ştiti
sigur ce tip de litere confine textul pe care vreţi să-1 comparaţi. Afişaţi toate filmele
care au în titlu cuvântul „of ", indiferent dacă este scris cu litere mari sau mici.
SELECT TITLU_FILM
FROM FILM
WHERE LOWER(TITLU_FILM) LIKE ' % of %'
OR LOWER(TITLU_FILM) LIKE 'of % '
OR LOWER(TITLU_FILM) LIKE ' % of ';
SUBSTR
LENGTH
Funţii matematice
Funcţiile matematice manipulează valori numerice, în conformitate cu regulile
matematicii.
ROUND
Funcţia ROUND rotunjeşte o valoare la un număr specificat de zecimale.
Valoarea numerică este furnizată prin primul parametru, iar numărul de zecimale prin
cel de-al doilea. În continuare este prezentat formatul general al funcţiei ROUND.
ROUND (expresie numerică, număr de poziţii zecimale)
Care este costul mediu al unei copii a filmului The Last Samurai, rotunjit la
două zecimale?
SELECT ROUND((PRET_VANZARE_VHS + PRET_VANZARE
_DVD) / 2, 2) AS AVG_COST
FROM FILM
WHERE TITLU_FILM = 'The Last Samurai';
F Descriere
uncţie
A Valoarea absolută a unui număr dat
BS
C Cosinusul trigonometric al unui unghi specificat în radiani
OS
E Valoarea exponenţială a unui număr dat
XP
P Ridică un număr la o putere (numărul şi puterea sunt fumizate ca
OWER parametri)
SI Sinusul trigonometric al unui unghi specificat în radiani
N
T Tangenta trigonometrică a unui unghi specificat în radiani
AN
Funcţii de conversie
Funcţiile de conversie transformă date dintr-un tip de date în altul.
CAST
Funcţia CAST transformă date dintr-un tip de date în altul. Iată sintaxa
generală a funcţiei CAST, urmată de un exemplu:
CAST (expresie AS tip de date)
Afişati preţul pentru formatul DVD al filmului The Last Samurai, cu un
simbol dolar în faţa sumei. Valoarea numerică trebuie să fie convertită într-un şir de
caractere pentru a putea fi concatenată cu o valoare literală conţinând simbolul dolar.
SELECT '$' || CAST(PRET_VANZARE _DVD AS VARCHAR(6)) AS PRET
FROM FILM
WHERE TITLU_FILM = 'The Last Samurai';
CONVERT TO
Multe implementări DBMS pun la dispoziţie o funcţie CONVERT sau
CONVERT TO. Totuşi este recomandată folosirea funcţiei CAST, deoarece este
implementată într-un mod mai unitar de către diferiţi producători.
F Descriere
uncţie
A Calculează valoarea medie pentru o coloană sau o
VG expresie.
C Numără valorile dintr-o coloană.
OUNT
M Găseşte valoarea maxină dintr-o coloană.
AX
M Găseşte valoarea minimă dintr-o coloană.
IN
S Însumează valorile dintr-o coloană.
UM
Exemple:
Care este preţul mediu al unui DVD?
SELECT ROUND(AVG(PRET_VANZARE _DVD),2) AS AVG_PRET
FROM FILM;
Câte filme există în tabelul FILM?
SELECT COUNT(*) AS NUM_FILM
FROM FILM;
Câte genuri diferite de filme sunt reprezentate în tabelul FILM?
SELECT COUNT(DISTINCT(COD_GEN_FILM)) AS NUM_GEN
FROM FILM;
Care sunt lungimea minimă şi maximă a titlurilor filmelor?
SELECT MIN(LENGTH(TITLU_FILM)) AS MIN_LENGTH,
MAX(LENGTH(TITLU_FILM)) AS MAX_LENGTH
FROM FILM;
Clauza GROUP BY
GROUP BY cere sistemului DBMS să grupeze rândurile selectate de
interogare pe baza valorilor din una sau mai multe coloane şi să aplice funcţia (sau
funcţiile) de agregare fiecărui grup, returnând un rând pentru fiecare grup din setul de
rezultate.
Sistemul DBMS va ordona rândurile selectate de interogare după coloanele
din clauza GROUP BY, aşa că grupurile vor fi returnate în ordine ascendentă,
exceptând cazul în care se adăugă o clauză ORDER BY care specifică un alt mod de
ordonare.
Exemplu:
Afişati fiecare cod de gen, împreună cu numărul de filme asociate fiecărui cod.
SELECT COD_GEN_FILM AS GEN, COUNT(*) AS COUNT
FROM FILM
GROUP BY COD_GEN_FILM;
Ce se întâmplă dacă scoateţi clauza GROUP BY din această interogare?
Sistemul DBMS retumează un mesaj de eroare şi, din nefericire, mesajul de eroare
este deseori destul de criptic. Functia COUNT(*) este o functie de agregare şi, în
absenta clauzei GROUP BY, retumează un singur rând de date.
UNION ALL
UNION ALL funcţionează la fel ca şi operatorul UNION, exceptând faptul că
rândurile duplicate nu sunt eliminate.
INTERSECT
Operatorul INTERSECT găseşte valorile selectate dintr-o interogare, care apar
şi într-o altă interogare. În esenţă, găseşte intersecţia valorilor din cele două
interogări. Totuşi, doar un număr mic de sisteme DBMS (cele mai importance fiind
Oracle şi DB2) implementează acest operator. Nu-1 veţi găsi în Microsoft SQL Server
sau MySQL.
Exemplu:
Există în tabelul FILM filme pentru care preţul pentru DVD este egal cu preţul
pentru VHS?
SELECT INCHIRIAT_FEE AS FEE
FROM FILM_ INCHIRIAT
WHERE INCHIRIAT _FEE IS NOT NULL
INTERSECT
SELECT LATE_OR_LOSS_FEE AS FEE
FROM FILM_ INCHIRIAT
WHERE LATE OR_ LOSS FEE IS NOT NULL
EXCEPT
EXCEPT este operatorul standard ANSI/ISO care găseşte diferenţele dintre
două seturi de rezultate, returnând, în esenţă, valorile din prima interogare care nu
apar în cea de-a doua interogare. Foarte puţine sisteme DBMS implementează acest
operator. În unele implementări, precum Oracle, operatorul se numeşte MINUS, nu
EXCEPT.
Întrebări şi Probleme
S-au prezentat până acum instrucţiuni SQL care selectează date dintr-un singur
tabel. Deseori, este util să se combine date din tabele multiple într-o singură
interogare . De exemplu, în listingul celor trei coloane ale tabelului FILM din figura
următoare, observaţi valorile afişate pentru coloană FILM_GEN_COD. Atunci când
s-a proiectat baza de date pentru magazinul de produse video, s-au folosit coduri în
locul descrierilor complete pentru genurile filmelor în tabelul FILM. Din discuţia
despre procesul de normalizare, s-a evitat anomalia de actualizare – dacă se schimbă
descrierea unui gen, nu este nevoie să actualizăm acea descriere pentru toate filmele
asociate genului respectiv în tabelul FILM. În timpul normalizării, descrierea
genurilor a fost mutată în tabelul, FILM_GEN, iar coloană FILM_GEN_COD a
devenit cheie externă în tabelul FILM, referind coloană cheie primară (cu acelaşi
nume) din tabelul FILM_GEN. S-a optat pentru folosirea unui cod mnemonic pentru
codurile genurilor, deoarece astfel permit celor familiarizaţi cu datele respective să
înţeleagă genul asociat filmelor fără să le caute în tabelul FILM_GEN.
FILM_GEN_COD FILM_GEN_DESCRIERE
ActAd Actiune
Anime Animatie
ChFam Copii şi Familie
Class Clasic
Comedie Comedie
Doc Documentar
Drama Drama
Forgn Strain
Hor Horror
Indep Independent
Music Muzical
Rmce Romance(Romantic, Idila)
SciFi Stiintifico-Fantastic
Sport Sport
Thriller Groaza
Tabelul FILM_GEN
Uniuni (join)
O uniune (join) este o operaţie într-o bază de date relaţionale care combină
coloane din două sau mai multe tabele în rezultatele unei singure interogări. O uniune
apare de fiecare dată când clauza FROM a unei instrucţiuni SELECT specifică
numele mai multor tabele.
De exemplu:
SELECT FILM_ID, FILM_GEN_DESCRIERE AS GEN, FILM_TITLU
FROM FILM, FILM_GEN ORDER BY FILM_ID;
Exemple:
• JOIN cu condiţie ON:
• JOIN folosind cuvântul cheie USING (în locul condiţiei ON) o scurtatură
elegantă atunci când coloanele din cele două tabele au acelaşi nume(nu e recunoscută
de toate SGBD-urile).
Instrucţiunile care folosesc clauza JOIN sunt mai scurte , iată interogarea
precedentă scrisă folosind condiţii de legătură în clauza WHERE. Remarcaţi că în
acest caz trebuie să specificaţi numele complet al coloanelor FILM_ID şi
COPY_NUMAR, pentru a evita referirea ambiguă a lor. Instrucţiunea de mai jos
afişează aceleaşi rezultate ca şi instrucţiunea anterioară.
Uniuni naturale
O uniune naturală (natural join) se bazează pe toate coloanele cu acelaşi
nume din două tabele, în esenţă, toate uniunile de egalitate sunt uniuni naturale.
Totuşi, sintaxa unei uniuni naturale este mult mai simplă, deoarece nu este necesar să
specificaţi o condiţie sau o listă de coloane - se înţelege de la sine care sunt coloanele
folosite. Reţineţi,nu toate SGBD-urile acceptă această sintaxă pentru clauza
JOIN(accepta sigur Oracle şi MySQL )..
Uniune externă completă (full outer join). Returnează toate rândurile din
ambele tabele. Acest tip de uniune este cel mai puţin probabil să fie acceptată de toate
implementari;e SQL. Această uniune nu este acelaşi lucru cu un produs cartezian,
care leagă fiecare rând dintr-un tabel cu fiecare rând din celălalt tabel. O uniune
externă completă leagă fiecare rând dintr-un tabel cu zero sau mai multe rânduri
corespondente din celălalt tabel.
Este folosită mai mult pentru tabelele aflate in relaţia m:m
Subinterogări
LIMBA_COD LIMBA_NUME
Ja Japoneza
Ko Coreana
ni Olandeza
ru Rusa
zh Chineza
TRANZACTIE_ID TRANZ_DATA
9 03/01/2005
10 03/01/2005
Subinterogări corelate
CLIENT_CONT_ID
2
7
9
Observaţi pseudonimele asociate numelor de tabele din interogările
internă şi externă, precurn şi folosirea acestora în clauza WHERE a interogării
interne. Acesta este elementul de identificare al unei subinterogări corelate.
Interogarea externă selectează o lista de valori CLIENT_CONT_ID distincte din
tabelul CLIENT_TRANZACTIE. Fiecare valoare găsită este transmisă interogării
interne, care este rulată pentru a calcula suma taxelor de închiriere din tranzacţia
respectivă. Dacă suma taxelor de închiriere este mai mare sau egală cu 15, atunci
clauza WHERE din interogarea externă ia valoarea logică „adevărat", iar rândul
CLIENT_ID este adăugat în setul de rezultate.
Vizualizări în linie
MAX_INCH_NUMAR
5
Întrebări şi probleme
Alegeţi răspunsurile corecte pentru fiecare din următoarele întrebări cu
răspunsuri multiple, şi reţineţi că întrebările pot avea mai multe răspunsuri corecte.
l. O subinterogare
a. Poate fi folosită pentru a selecta valorile care vor fi aplicate condiţiilor din
clauza WHERE
b. Poate fi corelată sau necorelată
c. Reprezintă o cale puternică de calculare a coloanelor
d. Trebuie să nu fie încadrate în paranteze
e. Permite selectarea flexibilă a rândurilor
4. O auto-uniune (selfjoin)
a. Nu poate avea niciodată ca rezultat un produs cartezian
b. Poate fi o uniune internă sau o uniune externă
c. Rezolvă relaţiile recursive
d. Poate folosi o subinterogare pentru a limita şi mai mult rândurile selectate
e. Implică două tabele diferite
5. O uniune (Join)
a. Combină coloanele din două sau mai multe tabele în rezultatele unei
singure interogări
b. Combină rânduri din interogari multiple într-un singur set de rezultate
c. Este realizată ori de câte ori în clauza FROM sunt specificate mai multe
tabele
d. Necesită folosirea unei clauze JOIN
e. Necesită o listă de tabele separate prin virgule în clauza FROM
Funcţiile pentru caractere operează asupra datelor de tip text. Această secţiune
prezintă câteva funcţii frecvent folosite, pe lângă cele discutate în lecţia 3.
REPLACE
SELECT PERSOANA_TELEFON,
REPLACE(PERSOANA_TELEFON, '-', '.') AS DISPLAY_TELEFON
FROM PERSOANA;
PERSOANA_TE DISPLAY_TE
LEFON LEFON
230—229—8976 230.229.8976
401—617—7297 401.617.7297
LTRIM
RTRIM
Funcţia RTRIM este similar cu LTRIM, dar elimin spatiile de la sfârsitul unui
sir de caractere. Daca trebuie sa eliminati atât spatiile de la inceputul sirului, cat şi pe
cele de la sfarsit, puteti imbrica funcţiile LTRIM şi RTRIM, ca în urmatorul exemplu:
Oracle:
SELECT NVL(TAXA_INTARZIERE_SAU_PIERDERE, 0) AS
TAXA_INTARZIERE_SAU_PIERDERE
FROM FILM_INCHIRIAT WHERE TRANSACTIE_ID=9;
TAXA_INTARZIERE_SAU_PIE
RDERE
0
29.98
2 rows selected.
TAXA_INTARZIERE_SAU_PIE
RDERE
29.98
.00
(2 rows affected)
MySQL:
SELECT IFNULL(TAXA_INTARZIERE_SAU_PIERDERE, 0) AS
TAXA_INTARZIERE_SAU_PIERDERE
FROM FILM_INCHIRIAT WHERE TRANZACTIE_ID=9;
TAXA_INTARZIERE_SAU_PIE
RDERE
29.98
0.00
2 rows în set (0.16 sec)
ASCII
Funcţia ASCII returnează valoarea din setul de caractere ASCII (un numar
între 0 şi 255) pentru un şir format dintr-un singur caracter.
De exemplu:
ASCII(‗ ‗) eturnează valoarea 32(codul ASCII pentru spaţiu)
ASCII(‗A‘) eturnează valoarea 65(codul ASCII pentru caracterul A)
ASCII(‗a ‗) eturnează valoarea 97(codul ASCII pentru caracterul a)
ASCII(‗1‗) eturnează valoarea 49(codul ASCII pentru caracterul 1)
CHAR (CHR)
Valoare Caracter
ASCII
9 Tab
10 Linie noua
13 Retur de car
(CR)
39 Apostrof
Amintim că operatorul de concatenare nu este ace1aşi pentru toate
implementările SGBD(‗+‗ pentru Microsoft SQL Server şi ‗||‘ pentru majoritatea
celorlalte sisteme).
Exemple cu funcţiile ASCII şi CHAR:
Să se găsească toate titlurile de filme care conţin un caracter Tab:
FILM_ID
(0 rows affected)
Oracle:
SELECT FILM_ID FROM FILM
WHERE FILM_TITLU LIKE ‗%‗ || CHR(9) || ‗%‗ ;
no rows selected
Funcţii matematice
SIGN
Funcţia SIGN primeşte ca argument o expresie numerică şi returnează una
dintre următoarele valori, în funcţie de semnul numărului de intrare:
Valoare Semnificatie
returnata
-1 Numărul de intrare este
negativ
0 Numărul de intrare este
zero
1 Numărul de intrare este
pozitiv
Null Valoarea de intrare este
nulă
Exemplu:
SELECT TAXA_PENALIZARE,
SIGN(TAXA_PENALIZARE) AS TAXA_SIGN
FROM FILM_INCHIRIERE
WHERE TAXA_PENALIZARE IS NOT NULL;
TAXA_PENALIZARE TAXA_SIGN
29.99 1
4 1
4 1
29.98 1
SQRT
SELECT TAXA_INTARZIERE_SAU_PIERDERE,
SQRT (TAXA_PENALIZARE) AS TAXA_SQRT
FROM FILM_INCH
WHERE TAXA_INTARZIERE_SAU_PIERDERE IS NOT NULL;
TAXA_PENA TAXA
LIZARE _SQRT
29.99 5.4763
1263
4 2
4 2
29.98
5.47539953
CEILING (CEIL)
Funcţia CEILING returnează cel mai mic întreg mai mare sau egal cu valoarea
expresiei numerice furnizată ca parametru de intrare, adică rotunjeşte numărul prin
adăugire până la următorul număr întreg. Există câteva probleme interesante de
compatibilitate legate de denumire între implementarile SQL: Microsoft SQL Server
foloseşte numele CEILING, Oracle foloseşte numele CEIL, în timp ce DB2 şi
MySQL permite folosirea ambelor nume (CEIL şi CEILING).
Ca exemplu, să aplicăm funcţia CEILING asupra valorilor din coloana
TAXA_PENALIZARE :
SELECT TAXA_PENALIZARE,
CEILING (PENALIZARE) AS TAXA_CEILING
FROM FILM_INCHIRIERE
WHERE TAXA_PENALIZARE IS NOT NULL;
TAXA_INTARZIERE_SAU_PIE TAXA_C
RDERE EILING
4.00 4
4.00 4
29.99 30
29.98 30
FLOOR
SELECT TAXA_PENALIZARE,
FLOOR(TAXA_INTARZIERE_SAU_PIERDERE) AS TAXA_FLOOR
FROM FILM_INCH WHERE TAXA_INTARZIERE_SAU_PIERDERE IS NOT
NULL;
TAXA_PENALIZARE TAXA_FLOOR
4.00 4
4.00 4
29.99 29
29.98 29
Oracle are mai multe de 24 de funcţii pentru data şi ora. Retineţi că Oracle
numeşte acest tip de date DATE şi toate datele au o componentă pentru orã, care are
valoarea zero (reprezentând miezul noptii) atunci când nu este folosită. Funcţiile pe
care este cel mai probabil să le folosiţi sunt prezentate în tabelul următor:
NOTA:
• Cuvântul cheie pentru câmpul data_şi__ora este un cuvânt cheie care
specifică unul dintre câmpurile conţinute de o dată Oracle, respectiv YEAR,
MONTH, DAY, HOUR, MINUTE şi SECOND.
• Şir_pentru_formatare este un şir de simboluri care specifică formatul
folosit pentru dată atunci când aceasta este convertită în sau dintr-un şir de caractere.
Există peste 40 de simboluri diferite care pot fi folosite în şirurile de formatare (puteţi
găsi lista completă în documentaţia Oracle). De exemplu, şirul de formatare
'MM/DD/YYYY HH:MI' are ca rezultat o dată, ca şir de caractere, de forma
'12/01/2004 11:58‘, iar şirul de formatare 'DD-MON-RR' (formatul Oracle prestabilit)
are ca rezultat o dată de forma '01-Dec-04‘.
• Funcţia TO_CHAR poate fi folosită şi pentru transformarea valorilor
numerice în şiruri de caractere.
• Funcţia TRUNC poate fi folosita şi pentru trunchierea valorilor numerice,
având ca efect ştergerea cifrelor din dreapta punctului zecimal.
Funcţie Scop Parametri de intrare
Data, numarul de luni (o
Adauga numarul de luni specificat la data
ADD_MONTHS valoare pozitiva sau
furnizata ca parametru
negativa)
Returnează data curenta în zona orara stabilita
CURRENT_DATE Nu are
pentru sesiunea bazei de date
Extrage campul data_si_ora specificat din data Cuvant cheie pentru
EXTRACT
furnizata ca intrare data_si_ora, data
Returnează data furnizata, cu ziua inlocuita cu
LAST_DAY data
ultima zi a lunii respective
Returnează numarul de luni (inclusiv partea
fractionara) intre doua date furnizate ca intrare;
MONTHS_BETWEEN Prima data, a doua data
rezultatul este negativ daca a doua data este
inaintea primei
Returnează valoarea curenta data_si_ora furnizata
SYSDATE Nu are
de sistem
Atunci cand este folosita pentru o data, funcţia
TO_CHAR returnează un sir de caractere, în formatul Data, sir_pentru_formatare
specificat de sirul_pentru_formatare
Transforma sirul de caractere furnizat ca intrare
intr-o data formatata intern de Oracle, folosind
TO_DATE Data, sir_pentru_formatare
sirul_pentru_formatare ca tipar pentru a interpreta
conţinutul sirului de caractere
Trunchiaza o data la unitatea de timp specificata
de cuvantul cheie data_si_ora. Daca acest Data, cuvant cheie pentru
TRUNC
parametru este omis, data este trunchiata la ziua data_si_ora
curenta.
Expresia CASE
Expresia CASE este o adăugire recentă, dar foarte importantă, la standardul
SQL. Pentru prima dată, părţi ale instrucţiunilor SQL pot fi executate condiţional. De
exemplu, o coloană din rezultatele interogării poate fi formatată în funcţie de valorile
conţinute pe o altă coloana.
Expresia CASE admite două forme generale:
notă:
Fiecare condiţie WHEN este evaluată sub forma expresie_de_intrare =
expresie_comparare şi, dacă rezultatul are valoarea TRUE logic, este returnată
valoarea expresie_rezultata şi nici o altă condiţie WHEN nu mai este evaluată.
Dacă nici una dintre condiţiile WHEN nu este evaluată ca adevărată şi exista o
condiţie ELSE, este returnată valoarea expresie_rezultat asociată condiţiei ELSE.
Dacă nici una dintre condiţiile WHEN nu este evaluată ca adevărată şi nu
există o condiţie ELSE, este returnată o valoare nula.
CASE
WHEN condiţie THEN expresie_rezultat
[WHEN condiţie THEN expresie_rezultat. . . ]
ELSE expresie_rezultat
END
notă:
Fiecare condiţie poate fi orice expresie SQL care este evaluată ca adevărata
sau falsă.
Condiţiile WHEN sunt evaluate secvenţial şi, dacă una este evaluată ca
adevărata, este returnata valoarea expresie_rezultat asociată şi nici o altă condiţie
WHEN nu mai este evaluata.
Dacă nici una dintre condiţiile WHEN nu este evaluată ca adevărată şi există o
condiţie ELSE, este returnată valoarea expresie_rezultat asociată condiţiei ELSE.
Dacă nici una dintre condiţiile WHEN nu este evaluata ca adevărată şi nu
exişti o condiţie ELSE, este returnată o valoare nulă.
1 58.97 Scump
2 15.95 Convenabil
3 14.95 Convenabil
4 11.95 Convenabil
5 24.99 Mediu
6 24.99 Mediu
7 14.95 Convenabil
8 50.99 Scump
9 12.98 Convenabil
10 49.99 Scump
Întrebări şi Probleme
1. Funcţiile SQL
a. Returnează un set de valori
b. Returnează o singură valoare
c. Pot fi folosite în clauza WHERE a unei instrucţiuni SQL
d. Pot fi folosite ca pseudonime pentru numele tabelelor intr-o instr. SQL
e. Pot fi folosite în lista de coloane a unei instrucţiuni SQL
2. Funcţia REPLACE
a. Înlocuieşte un nume de tabel cu un nume de vizualizare
b. Înlocuieşte numele unei coloane cu pseudonimul coloanei
c. Înlocuieşte un şir de caractere dintr-o coloană cu un alt şir de caractere
d. Înlocuieşte toate valorile dintr-o coloană cu un alt set de valori
e. Înlocuieşte toate rândurile dintr-o vizualizare cu rânduri conţinând date
dintr-un alt tabel
3. Funcţia LTRIM
a. Elimină spaţiile de la sfârşitul şirurilor de caractere
b. Elimină spaţiile de la începutul şirurilor de caractere
c. Poate fi imbricată cu alte funcţii
d. înlocuieşte valorile nule cu alte valori în şirurile de caractere
e. Elimină spaţiile de la începutul şi de la sfârşitul şirurilor de caractere
4. Funcţia CHAR
a. Este numită CHR în unele implementări SQL
b. Este identică cu funcţia ASCII în unele implementări SQL
c. Returnează valoarea corespunzătoare unui caracter din setul de caractere
ASCII
d. Returnează caracterul corespunzător unei valori
e. Transformă o valoare numerică într-un şir de caractere
5. Funcţia SIGN
a. Returnează -l daca parametrul furnizat are valoare negativa
b. Returnează 0 dacă parametrul furnizat are valoarea zero
c. Returnează +1 dacă parametrul furnizat are o valoare pozitivă
d. Returnează 0 dacă parametrul furnizat are valoarea NULL
e. Returnează o valoare nulă dacă parametrul furnizat nu este un număr
6. Funcţia CEILING
a. Rotunjeşte un număr prin adăugire până la primul număr întreg
b. Rotunjeşte un număr prin scădere până la primul număr întreg
c. Returnează întotdeauna un număr întreg
d. Returnează un număr întreg sau o valoare nulă
e. Este numită CEIL în unele implementări SQL
7. Funcţia FLOOR
a. Rotunjeşte un număr prin adăugire până la primul număr întreg
b. Rotunjeşte un număr prin scădere până la primul număr întreg
c. Returnează întotdeauna un număr întreg
d. Returnează un număr întreg sau o valoare nulă
e. Este numită FLR în unele implementări SQL
8. Expresiile CASE
a. Permit executarea condiţională a clauzelor dintr-o instrucţiune SQL
b. Există sub două forme, respectiv statice şi dinamice
c. Exista sub două forme, respectiv cu căutare şi fara cautare
d. Există sub două forme, respectiv simple şi cu cautare
e. Există sub două forme, respectiv standard şi cu cautare
Un alt aspect de care este important să se ţină seama, sunt restricţiile definite
în tabelul referit de instrucţiunea DML. Sistemul SGBD nu va efectua în baza de date
nici o modificare care încalcă una din restricţii.
La formarea instructiunilor DML, trebuie să se ţină seama de urmatoarele
aspecte referitoare la restricţiile tabelului modificat:
Restricţii de tip cheie primară
Atunci când inseraţi un nou rând într-un tabel, cheia primară a noului rând
trebuie sa fie unică în întregul tabel.Cand modificati valoarea unei chei primare (ceea
ce se intampla rareori), noua valoare trebuie să fie unică în întregul tabel.
Restricţii de unicitate
Ca şi în cazul cheilor primare, coloanele pe care a fost definită o restricţie de
unicitate trebuie sa aibă valori unice în întregul tabel.
Restricţii NOT NULL
O valoare nula (null) este o modalitate specială prin care sistemul SGBD
tratează valoarea unei coloane pentru a indica faptul ca valoarea coloanei respective
nu este cunoscută. O valoare nula nu este acelasi lucru un un spatiu liber, un sir vid
sau valoarea zero – este o valoare speciala care nu este egala cu nimic altceva.
În cazul instrucţiunilor INSERT, trebuie specificate valori pentru toate
coloanele cu restricţii NOT NULL.
În cazul instrucţiunilor UPDATE nu se pot inlocui valorile unei coloane cu
valori nule dacă pe coloana respectivă este definită p restricţie NOT NULL.
Dacă instrucţiunea DML referă o vizualizare , nu se poate sa o folosim intr-o
instrucţiune INSERT dacă una dintre coloanele tabelului cu o restricţie NOT
NULL(obligatorii) lipseşte din definirea vizualizării.
Restricţii referenţiale
Nu se poate insera sau actualiza valoarea unei chei externe decât dacă există
deja rândul părinte corespondent care conţine valoarea cheii în coloana cheii primare.
In sens invers, nu se poate şterge un rând părinte dacă există rânduri subordonate care
referă valoarea din rândul părinte, decât dacă restricţia a fost definită cu opţiunea ON
DELETE CASCADE. In general inserările în tabele trebuie făcute ierarhic (mai intai
randurile parinte, apoi randurile copii), iar ştergerile trebuie făcute în ordine inversă
(copiii inaintea părinţilor).
Instrucţiunea INSERT
Instrucţiunea SQL INSERT este folosită pentru inserarea noilor rânduri de
date în tabele. Instrucţiunea are două forme de bază: una în care valorile coloanelor
sunt specificate chiar în instrucţiune şi alta în care valorile sunt selectate dintr-un tabel
sau o vizualizare, folosind o subinterogare.
Lista de coloane este opţională, dar dacă este inclusă trebuie sa fie incadrată în
paranteze.
Dacă lista de coloane este omisă, trebuie specificată o valoare pentru fiecare
coloană din tabel, în ordinea în care sunt definite coloanele în tabel. Este bine
ca întotdeauna să includeţi lista de coloane, deoarece opiterea acesteia face ca
instrucţiunea INSERT să fie dependentă de definiţia tabelului. Dacă o coloană
este modificată sau în tabel este adăugată o nouă coloană, chiar şi opţională,
probabil instrucţiunea INSERT va eşua la următoarea rulare.
Dacă lista de coloane este specificată, lista de valori trebuie să conţin o valoare
pentru fiecare coloană din listă, în aceeaşi ordine. Cu alte cuvinte, între lista de
coloane şi lista de valori trbuie să existe o corespondenţa unu-la-unu. Orice
coloana care lipseşte din listă va primi o valoare nulă, presupunund că valorile
nule sunt acceptate în coloana respectivă.
Cuvântul cheie NULL poate fi folosit în lista de valori pentru specificarea unei
valori nule pentru o coloană.
În Microsoft SQL Server şi Sybase Adaptive Server nu puteţi insera valori într-
o coloană care a fost definită proprietatea IDENTITY. Proprietatea IDENTITY
este o metodă frecven folosită pentru a atribui valori secvenţiale unei chei
primare, cum ar fi coloana FILM_ID din tabelul FILM. Dacă pentru o coloană
a fost definită proprietatea IDENTITY, puteţi să omiteţi coloana respectivă din
instrucţiunea INSERT, iar sistemul SGBD va atribui cheii primare următoarea
valoare unică disponibilă. O altă soluţie este să dezactivaţi restricţia, folosind
următoarea instrucţiune:
SET identity_insert nume_tabel ON
Exemplul următor conţine două instrucţiuni INSERT, una care creează un nou
rând în tabelul FILM, cu o listă opţională de coloane, din care este omisă coloana
RETAIL_PRET_VHS, şi alta care creează un rând în tabelul FILM_COPII pentru
acelaşi timp, dar fără lista opţională de coloane.
INSERT INTO FILM
(FILM_ID, FILM_COD_GEN, MPAA_RATING_COD, FILM_NUME,
PRET_INCHIRIAT_DVD, AN_PRODUCERE)
VALUES (21,‘Drama‘,‘PG-13‘,‘Ray‘, 29.95, ‘2004‘);
INSERT INTO FILM_COPII
VALUES (21, 1, ‘2005-04-01‘,NULL,‘V‘);
Pentru Microsoft SQL Server şi Sybase Adaptive Server, dacă este definită
proprietatea IDENTITY pentru tabelul FILM, se poate folosi următoarea variantă a
primei instrucţiuni INSERT:
Se remarcă următoarele:
Lista de coloane este opţională, dar dacă este inclusă trebuie să fie încadrată în
paranteze.
Dacă lista de coloane este omisă, instrucţiune SELECT internă trebuie să
furnizeze o valoare pentru fiecare coloană din tabel, în ordinea în care sunt
definite coloanele în tabel. Este bine ca întotdeauna să includeţi lista de
coloane, deoarece opiterea acesteia face ca instrucţiunea INSERT să fie
dependentă de definiţia tabelului. Dacă o coloană este modificată sau în tabel
este adăugată o nouă coloană, chiar şi opţională, probabil instrucţiunea
INSERT va eşua la următoarea rulare.
Dacă lista de coloane este specificată, instrucţiune SELECT internă să
furnizeze o valoare pentru fiecare coloană din lista de valori, în aceeaşi ordine.
Cu alte cuvinte, între lista de coloane şi setul de rezultate al instrucţiunii
SELECT trebuie să existe o corespondenţa unu-la-unu. Orice coloană care
lipseşte din listă va primi o valoare nulă, presupunund că valorile nule sunt
acceptate în coloana respectivă.
Cuvântul cheie NULL poate fi folosit în instrucţiunea SELECT pentru
specificarea unei valori nule pentru o coloană.
Instrucţiunea UPDATE
Se remarcă următoarele:
Clauza SET conţine o listă cu una sau mai multe coloane, împreună cu o
expresie care specifică noua valoare pentru fiecare coloană. Aceasta este o listă
de perechi nume-valoare, separate prin virgule, cu un operator de egalitate între
fiecare nume şi valoare.
Expresia poate fi o constantă, un alt nume de coloană sau orice altă expresie pe
care SQL o poate transforma într-o singură valoare, care poate fi apoi atribuită
coloanei respective.
Clauza WHERE conţine o expresie care limitează rândurile actualizate. Dacă
această clauză este omisă, motorul SQL va încerca să actualizeze toate
rândurile din tabel sau din vizualizare.
Exemple:
Un film a fost adăugat cu un preţ incorect. Instrucţiunea următoare va actualiya
două coloane din acelaşI rând a tabelului MOVIE.
UPDATE FILM
SET RETAIL_PRET_VHS = 29.95 ,
RETAIL_PRET_DVD = 34.95
WHERE FILM_ID = 21
Instrucţiunea DELETE
Instrucţiunea DELETE şterge unul sau mai multe rânduri dintr-un tabel.
Instrucţiunea poate să folosească şi o vzualizare, dar numai dacă aceasta se bazează pe
un singur tabel (ceea ce înseamnă că instrucţiunile DELETE nu pot fi folosite pentru
vizualizări care conţin uniuni). În instrucţiunile DELETE nu sunt referite niciodată
coloane, doarece instrucţiunea şterge rânduri întregi de date, inclusiv toate valorile
datelor (toate coloanele) din rândurile afectate. Dacă vreţi să ştergeţi o singură valoare
din rândurile existente, folosiţi instrucţiunea UPDATE pentru a înlocui valorile
respective cu valori nule (presupunând că valorile nule sunt permise în acele coloane).
Sintaxa generală a instrucţiunii DELETE este
DELETE FROM nume_tabel_sau_vizualizare
[ WHERE conditie ];
Se remarcă următoarele:
Exemple:
Să se şteargă filmul adăugat mai devreme (cu FILM_ID = 21 ). Se observă că
trebuie să se ştergă mai întâi rândurile corespondente din tabelele
FILM_COPY şi FILM_LIMBA, deoarece acestea sunt rânduri „copii‖ ale
rândului din tabelul „FILM‖
DELETE FROM FILM_COPY
WHERE FILM_ID = 21;
Întrebări şi probleme
1. Limbajul DML include următoarele comenzi SQL:
a. INSERT
b. REMOVE
c. UPDATE
d. SELECT
e. DROP
9. O instrucţiune UPDATE
a. Trebuie să includă o clauză SET
b. Trebuie să furnizeze o nouă valoare pentru cel puţin o coloană
c. Trebuie să includă o clauză WHERE
d. Poate atribui unei coloane valoarea unei alte coloane
e. Poate atribui unei coloane o listă de valori derivate dintr-o expresie
11. Clauza SET dintr-o instrucţiune UPDATE poate atribui unei coloane o
valoare care este
a. O constantă
b. Numele unei alte coloane
c. O listă de valori
d. Orice expresie din care rezultă o singură valoare
e. Cuvântul cheie NULL
12. Instrucţiunea SELECT internă a unei instrucţiuni INSERT poate include
a. O clauză WHERE
b. O clauză GROUP BY
c. Una sau mai multe funcţii de agregare
d. O uniune a mai multor tabele
e. O clauză UNION
FILM_ID: 99
FILM_COD_GEN: 'TRAIN'
MPAA_COD_RATING: NR
FILM_NUME: ANGAJAT
Training Video
BIBLIOGRAFIE