Documente Academic
Documente Profesional
Documente Cultură
CURS Baze de Date
CURS Baze de Date
10
11
12
13
14
administrator
ntreprindere
a
c
procesor
schema
conceptual
administratorul
aplicaiilor
procesor
schema
intern
DESCRIERE
administratorul
bazei de date
dicionarul
datelor
procesor
schema
extern
procesor
intern/
alocare
procesor
conceptual/
intern
procesor
extern/
conceptual
sistem
de
alocare
program
aplicaii
extern
h
m
programator
aplicaie
PRELUCRARE
utilizatori
memorii
secundare
15
16
17
18
19
20
Un sistem multibaze de date (SMB) este alctuit din mai multe sisteme
de baze de date privite integrat, n care se construiesc una sau mai multe
scheme globale pe baza schemelor fiecrei baze de date componente, astfel
nct s se poat realiza accesul uniform i integrat la fiecare din bazele de
date componente. Fiecare schem global este construit pe baza unui model
particular de date. De exemplu, se poate construi o schem global ce are la
baz modelul relaional pentru utilizatorii care sunt familiarizai cu acest
model, dar se poate construi o schem global bazat pe modelul orientat
obiect pentru utilizatorii bazelor de date orientate obiect.
Pentru o schem global dat, un sistem multibaze de date const din
sistemele componente mpreun cu un sistem front-end, care suport un
singur model de date i un singur limbaj de interogare. Principalele sarcini ale
sistemului front-end sunt gestionarea schemei globale i procesarea cererilor
globale.
Un avantaj major al acestui model, fa de altele, este faptul c o
singur interogare poate accesa date din mai multe baze de date ntr-un mod
integrat, fr s afecteze nici o aplicaie care este scris utiliznd una dintre
bazele de date componente.
Baze de date cu suport decizional
Sistemele informatice, n particular bazele de date, au ajuns la
maturitate. Marile companii au acumulat o mare cantitate de informaii din
domeniul lor de activitate, pe care le pstreaz n tabele istorice i sunt
nefolositoare sistemelor operaionale ale companiei, care funcioneaz cu
date curente. Analizate, aceste date ar putea oferi informaii despre tendine
i evoluii care ar putea interesa compania. Pentru a putea analiza aceste
mari cantiti de date este nevoie de tehnologii i instrumente speciale.
Ideea de a analiza colecii de date provenind din sistemele
operaionale ale companiei sau din surse externe pentru a le folosi ca suport
n procesul de decizie nu aparine ultimului deceniu, dar baze de date care
s funcioneze eficient dup aceste criterii au fost studiate i implementate
n ultimii ani. Principalul scop al acestor baze de date a fost de a ntmpina
nevoile sistemelor operaionale, a cror natur este inerent tranzacional.
Sistemele tranzacionale sunt interesate, n primul rnd, s controleze
la un moment dat o singur tranzacie. De exemplu, ntr-un sistem bancar,
atunci cnd clientul face un depozit, sistemul operaional bancar este
responsabil de a nregistra tranzacia ntr-un tabel al tranzaciilor i de a
crete nivelul curent al contului clientului, stocat n alt tabel.
21
22
Utilitare
cereri,
rapoarte
META-FLUX
Sursa 1
Date operationale
FLUX
INTERN
Metadate
Date cu nivel
mare de agregare
Administrator
incarcare date
Administrator
cereri
FLUX
Date cu nivel
EXTERN
mic de agregare FLUX
ASCENDENT
Date detaliate
SGBD
Sursa n
Date operationale
Utilitare
OLAP
Utilitare
Data mining
Arhive/ date
backup
FLUX
DESCENDENT
Utilitare pentru
accesul
utilizatorilor finali
23
24
25
26
Data Warehouse
Pstreaz date istorice
Stocheaz date detaliate, agregate uor
Stocheaz date detaliate
sau puternic
Datele sunt dinamice
Datele sunt n mare msur statice
Prelucrare ad-hoc, nestructurat i
Prelucrare repetitiv
euristic
Nivel nalt de transfer al Nivel mediu sau sczut de transfer al
tranzaciilor
tranzaciilor
Tipar de utilizare previzibil Tipar de utilizare imprevizibil
Conduse prin tranzacii
Susin deciziile de zi cu zi
Deservesc un numr mare
de utilizatori
Orientate spre aplicaii
27
28
29
30
31
simplitate;
independena de platform;
interfaa grafic cu utilizatorul;
acces transparent n reea;
standardizare (HTML standard de facto).
Arhitectura de calcul n reea a sistemului Oracle (NCA Network
Computing Architecture) se axeaz n principal pe furnizarea
extensibilitii pentru mediile distribuite. Arhitectura este construit pe
baza tehnologiei CORBA pentru manipularea obiectelor. Este o structur
three tier care se bazeaz pe utilizarea de:
cartue de software care permit utilizatorilor s adauge
funcionaliti individuale n aplicaii (cartuele pot fi construite
n Java, C/C++, Visual Basic, SQL i pot fi conectate la oricare
din cele 3 straturi);
protocoale deschise i interfee standardizate care permit
comunicarea ntre cartue (distribuite ntr-o reea) prin
intermediul unui program magistral (ICX);
clieni extensibili, server-e de aplicaie, server-e de baze
de date;
dezvoltarea i administrarea integrat a cartuelor.
Un cartus utilizeaza un limbaj de definire a interfetelor (IDL)
pentru a putea fi identificat de alte obiecte intr-un sistem distribuit. De
exemplu, PL/SQL este un astfel de cartus.
32
HTTP
Clienti HTTP
Oracle9i Application
Server
Oracle9i Database
Nivel 1
Nivel 2
Nivel 3
2 MODELAREA
ENTITATE - RELAIE
Proiectarea bazelor de da te orientate ob iect
MODEL AREA BAZELO R D E DAT E
2.1. Preliminarii
Un model este o reprezentare a obiectelor i evenimentelor lumii reale i
a asocierilor dintre ele. De fapt, el reprezint o abstracie asupra aspectelor
semnificative ale unei ntreprinderi, ale unui sistem real, ignornd proprietile
accidentale. Modelul este cel pe care utilizatorii trebuie s-l cunoasc;
implementarea unui model este cea pe care utilizatorii nu este necesar s o
cunoasc. Diferena dintre model i implementare este, de fapt, un caz special i
important al deosebirii uzuale dintre logic i fizic.
Modelele se impun prin sintaxa i prin semantica lor i, din acest punct
de vedere, exist trei tipuri fundamentale de modele:
modele care descriu aspectele statice ale procesului modelat;
modele care descriu aspectele dinamice ale procesului modelat;
modele care descriu aspectele funcionale ale procesului modelat.
Un model de date reprezint o colecie integrat de concepte necesare
descrierii:
datelor,
relaiilor dintre ele,
constrngerilor existente asupra datelor sistemului real analizat.
Modelarea unei baze de date permite trecerea de la percepia unor fapte
din lumea real la reprezentarea lor prin date. Modelul de date trebuie s
reflecte fidel fenomene ale lumii reale, s urmreasc evoluia acestei lumi i
comunicarea dintre fenomenele lumii reale.
Modelul trebuie s asigure conceptele de baz care permit proiectantului
bazei de date i utilizatorilor s comunice, fr ambiguiti, cunotinele lor
privind funcionarea i organizarea modelului real analizat. Prin urmare, un
model de date trebuie s reprezinte datele i s le fac nelese.
n esen, modelul de date are trei componente:
o mulime de reguli conform crora sunt construite bazele de date
(partea structural);
o mulime de operaii permise asupra datelor, care sunt utilizate pentru
reactualizarea sau regsirea datelor (partea de prelucrare);
o mulime de reguli de integritate, care asigur coerena datelor.
Abordarea general a problemei modelrii semantice a datelor se face n
patru etape.
58
Modelarea entitate-relaie
59
Studiu de caz
Exemplele din acest capitol se refer la proiectarea unui model de date ce
furnizeaz informaii despre prezentri de mod, evenimente care reprezint
momente importante n lumea caselor de mod.
Vom prezenta modelul de date, restriciile pe care trebuie s le respecte i
vom ncerca, ntr-o manier didactic, s construim diagrama E/R
corespunztoare. Vom considera, n abordarea iniial, anumite situaii care nu
sunt optime, n sensul c pot genera redundan, anomalii la reactualizri sau nu
permit rezolvarea anumitor interogri asupra modelului. Vom ncerca s artm
care sunt deficienele modelului, situaiile care le-au generat i cum pot fi
corectate (parial sau total) anomaliile respective.
Modelul de date va gestiona informaii legate de organizarea i
funcionarea prezentrilor de mod. Exist firme organizatoare care se ocup de
buna desfurare a acestor prezentri. O firm organizatoare poate fi contactat
prin angajai specializai pe diferite domenii (financiar, social, publicitate,
securitate, sisteme de iluminare, coregrafie, sisteme de sonorizare, cazare,
primiri/plecri aeroport etc.).
Firme specializate sunt angajate pentru soluionarea problemelor legate
de securitate, publicitate, asigurri, iar restul problemelor sunt rezolvate cu
salariaii proprii ai caselor de mod i a firmei organizatoare. Modalitile de
securitate, asigurri, publicitate proprii caselor de mod, modelelor sau
ageniilor de modele nu intr n proiectarea modelului.
Prezentrile pot fi sponsorizate, considerndu-se doar informaiile
referitoare la persoane (fizice sau juridice) care au contribuit efectiv la
finanarea prezentrilor de mod. Mai exact, nu sunt inclui sponsorii posibili.
La aceste evenimente particip case de mod, care prezint vestimentaii
concepute de creatorii casei respective. Creatorii pot fi cei care concep
vestimentaia (designeri) sau cei care o realizeaz efectiv, incluznd croitori,
lucrtori care se ocup cu broderia sau cu realizarea diverselor accesorii.
n cadrul prezentrii de mod, vestimentaiile sunt purtate de manechine
care aparin anumitor agenii de modele. Casele de mod angajeaz modele care
s le prezinte vestimentaiile cu prilejul acestor evenimente. Modelul de date
prezint i un istoric al activitii manechinelor (n cadrul diverselor agenii).
Casele de mod angajeaz pentru o prezentare stiliti care se ocup cu
machiajul i coafura modelelor.
De asemenea, modelul analizeaz informaii legate de localizarea i
accesarea firmelor de publicitate, a persoanelor de contact din firmele
organizatoare, a caselor de mod, a ageniilor i a modelelor, a sponsorilor, a
societilor de asigurare i a firmelor care asigur securitatea evenimentelor.
Modelul de date respect anumite restricii de funcionare.
Casele de mod pot fi organizatori de prezentri.
Chiar dac o cas de mod este organizator, ea apeleaz la serviciile
unei firme specializate n organizarea unor astfel de evenimente.
60
Modelarea entitate-relaie
61
62
Modelarea entitate-relaie
63
64
Modelarea entitate-relaie
65
66
pentru
entitile
FIRMA_PUB,
FIRMA_SEC,
ORGANIZATOR,
CASA_MODA, SPONSOR, ANGAJAT_TEMP, SOC_ASIG, CREATOR,
LOCATIE i AGENTIE, care sunt legate de entitatea INFO_CONTACT,
permind astfel accesarea tuturor structurilor modelului.
ANGAJAT_TEMP_primeste_la_PREZENTARE_de_la_CASA_MODA = relaie
de tip 3 ce leag entitile ANGAJAT_TEMP, PREZENTARE i
CASA_MODA, reflectnd cine a fost angajat temporar, de ce cas de mod,
pentru ce prezentare. Denumirea acestei relaii va fi primeste.
Atribut
Atributul este o proprietate descriptiv a unei entiti sau a unei relaii. De
exemplu, numele unei case de mod este un atribut al entitii CASA_MODA,
iar data la care o cas de mod particip la o prezentare este un atribut al relaiei
particip ce leag entitile PREZENTARE i CASA_MODA.
Atributele pot fi simple (de exemplu, suma cu care este pltit un model de
ctre o cas de mod pentru o prezentare), compuse (de exemplu, adresa unei
firme de publicitate), cu valori multiple (de exemplu, numerele de telefon ale
unei persoane de contact), derivate (de exemplu, vrsta unei persoane se obine
din data naterii).
Observaii
Trebuie fcut distincia ntre atribut care uzual devine coloan n
modelele relaionale i valoarea acestuia, care devine valoare n coloane.
Atributele sunt substantive, dar nu orice substantiv este atribut.
Fiecrui atribut trebuie s i se dea o descriere complet n
specificaiile modelului (exemple, contraexemple, caracteristici).
Pentru fiecare atribut trebuie specificat numele, tipul fizic (integer,
float, char etc.), valori posibile, valori implicite, reguli de validare,
constrngeri, tipuri compuse.
n continuare vor fi prezentate, parial, atributele entitilor i relaiilor
dnd o descriere a fiecruia, a caracteristicilor i a constrngerilor pe care
trebuie s le ndeplineasc. Semnificaia unor atribute a cror denumire nu este
semnificativ sau care include mai multe caracteristici dect denumirea va fi
comentat pe parcursul lucrrii.
Entitatea independent ANGAJAT_TEMP are ca atribute:
cod_angajat_temp = variabil de tip ntreg, de lungime maxim 5, care
reprezint codul unui angajat temporar.
nume = variabil de tip caracter, de lungime maxim 25, care reprezint numele
angajatului.
prenume = variabil de tip caracter, de lungime maxim 25, care reprezint
prenumele angajatului.
data_nastere = variabil de tip dat calendaristic, care reprezint data naterii
angajatului respectiv.
sex = variabil de tip caracter, lund valorile m sau f, de lungime 1, care
reprezint sexul angajatului.
Modelarea entitate-relaie
67
68
69
Modelarea entitate-relaie
70
Modelarea entitate-relaie
71
72
INFO_CONTACT
1
are
1
are M(1)
PERS_CONTACT
ORGANIZATOR 1
1
M(1)
are
1
organizeaza
LOCALIZARE
FIRMA_PUB
1
face
M(1)
M(1)
PUBLICITATE
FIRMA SEC
1
LOCATIE
1
are
are
M(1)
M(1)
M(1)
M(1) paza M(1) 1
M(1) finanteaza M(0)
ANGAJAT SEC
PREZENTARE
SPONSOR
M(1) 1
M(1)
SOC ASIG
se_face
asigura
participa
M(1)
CASA_MODA
prezinta
1
primeste
lucreaza
M(1)
1 CREATOR
1
ANGAJAT_TEMP
MODEL 1(0) ISA
M(1)
1
1
creeaza prezinta
face
M(1) M(0)
VESTIMENTATIE
1
are
M(0)
M(0)
ACCESORIU
lucreaza_la
M(1) are
1
AGENTIE
1
M(0)
ISTORIC M(1)
refera
Modelarea entitate-relaie
73
74
Modelarea entitate-relaie
75
76
Modelarea entitate-relaie
77
78
Modelarea entitate-relaie
79
80
81
Modelarea entitate-relaie
Clas
Asociere (relaie)
Asociere (relaie)
Entitate
Obiect
Cardinalitate
Multiplicitate
Model
date
conceptual
UML
de Diagram de clase
82
Modelarea entitate-relaie
83
Diagrame entitate-relaie
Diagrama E/R model neformalizat pentru reprezentarea unui
sistem din lumea real. Este un model de date conceptual de nivel nalt
dezvoltat de Chen (1976) pentru a facilita proiectarea bazelor de date.
Modelul de date conceptual este independent de:
tipul SGBD-ului;
platforma hardware utilizata.
Modelul conceptual este constituit din concepte care descriu:
structura bazei de date;
tranzactii de regasire si reactualizare asociate.
SARCINA
lucreaza_in
conduce
apartine_la
SALARIAT
atasat_la
PROIECT
Observaii:
Entitile devin tabele n modelele relaionale.
n general, entitile se scriu cu litere mari.
Entitile sunt substantive, dar nu orice substantiv este o entitate.
Pentru fiecare entitate este obligatoriu s se dea o descriere
detaliat.
Nu pot exista, n aceeai diagram, dou entiti cu acelai nume,
sau o aceeai entitate cu nume diferite.
Cheia primar este un identificator unic n cadrul entitii, fcnd
distincie 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 conin informaii descriptive, s fie simpl, fr
ambiguiti;
s fie stabil;
s fie familiar utilizatorului.
SALARIAT
cod_salariat
nume
prenume
sex
salariu
1
conduce
1(0)
M(0)
atasat_la
data_initiala
functia
M(0)
PROIECT
nr_proiect
descriere
buget_alocat
1
M(0)
apartine_la
lucreaza_in
1
DEPARTAMENT
cod_departament
nume
nr_cladire
SARCINA
nr_proiect
nr_sarcina
data_inceperii
stare
Diagrama E/R.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
1(0)
ISA
1
1(0)
1
conduce
1(0)
job_cod
AGENT_TERITORIAL
zona
comision
M(0)
PROGRAMATOR
limbaj
nivel
atasat_la
data_initiala
functia
PROIECT
nr_proiect
descriere
M(0) buget_alocat
1
apartine_la
1(0)
M(1)
M(0)
lucreaza_in
1(0)
casatorit
DEPARTAMENT
cod_departament
nume
nr_cladire
Diagrama E/R.
SARCINA
nr_proiect
nr_sarcina
data_inceperii
stare
CARTE
codel#
titlu
autor
pret
nrex
M(0)
M(1)
imprumuta
M(0)
apartine
CITITOR
codec#
nume
dep
DOMENIU
coded#
intdom
SALARIAT
cod_salariat#
tip
nume job
ISA
1
1(0)
M(0)
GRAFICIAN
tip
TEHNOREDACTOR
tip_editor
ISA
1
M(1)
1(0)
scrie
FRAME
nr_publicatie#
nr_capitol#
nr_frame#
M(0)
include
1
M(0)
1 realizeaz
CAPITOL
nr_publicatie#
nr_capitol#
M(1)
cuprinde
1
ISA
1
1(0)
REDACTOR_SEF
experienta
M(0)
coordoneaza
PUBLICATIE
nr_publicatie#
stil
limba
8
SANTIER
nr_santier#
specialitate
sef
CONTRACTANT
cod_contractant#
adresa
telefon
cont
banca
tip_contractant
M(0)
executa
SUBANTREPENOR
nume
nume_adm
functie_adm
1
ISA
LUCRARE
M( cod_obiectiv#
1) cod_lucrare#
adresa
1(0)
M(1)
necesita
INVESTITOR
tip_investitor
ISA
1
ISA
executa
PERS_FIZICA
nume
prenume
bi
1
investeste_in
OBIECTIV_
INVESTITIE
M(1) cod_obiectiv#
denumire
adresa
1(0)
1
atasat_la
ISA
PERS_JURIDICA
tip_juridic
nume
functie
CONTRACT
nr_contract#
M(1) tip_contract
data_avans
incheie
1
petrecut_in
PUNCT
gasita_in
ARTICOL
publicata
stantata_cu
MONEDA
STANTA
inclusa_in
pastrata_la
TEZAUR
MUZEU
CLIENT
cod_scoala#
cod_client#
INSTRUCTOR
EXAMEN
cod_instructor#
cod_examen#
MASINA
cod_masina#
EXAMINATOR
cod_examinator#
10
M(1)
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#
sustine
M(1)
SPONSOR
Cod_sponsor#
Nume
11
Modelul relaional
Modelul relaional a fost conceput i dezvoltat de E.F. Codd. El este
un model formal de organizare conceptual a datelor, destinat reprezentrii
legturilor dintre date, bazat pe teoria matematic a relaiilor. Modelul
relaional este alctuit numai din relaii i prin urmare, orice interogare
asupra bazei de date este tot o relaie.
Caliti:
este simplu;
riguros din punct de vedere matematic;
Structura datelor
Definirea noiunilor de domeniu, relaie, schem relaional, valoare
null i tabel vizualizare (view).
Conceptele utilizate pentru a descrie formal, uzual sau fizic
elementele de baz ale organizrii datelor sunt date n urmtorul tabel:
Formal
relaie
tuplu
atribut
domeniu
Uzual
tablou
linie
coloan
tip de dat
Fizic
fiier
nregistrare
cmp
tip de dat
12
(
SMALLINT,
VARCHAR(25),
VARCHAR(20),
CHAR(1),
INTEGER,
SMALLINT,
VARCHAR(6),
SMALLINT );
13
14
Fie schemele relaionale R1(P1, S1) i R2(S1, S2), unde P1 este cheie
primar pentru R1, S1 este cheie secundar pentru R1, iar S1 este cheie
primar pentru R2. n acest caz, vom spune c S1 este cheie extern (cheie
strin) pentru R1.
Modelul relaional respect trei reguli de integritate structural.
Regula 1 unicitatea cheii. Cheia primar trebuie s fie unic i
minimal.
Transformarea relaiilor
15
Transformarea atributelor
PROIECT
cod_salariat#
conduce
nr_proiect#
lucreaza_in
apartine_la
DEPARTAMENT
SARCINA
cod_departament#
SALARIAT
cod_salariat#
nr_proiect#
nr_sarcina#
atasat_la
cod_salariat#
nr_proiect#
PROIECT
nr_proiect#
TELEFON
SALARIAT
cod_salariat#
nr_telefon#
cod_salariat#
16
Tabel
Independent
Subtabel
Dependent
Asociativ
Reprezint
entitate independent
subentitate
entitate dependent
atribute multiple
relaie m:n
relaii de tip 3
Cheie primar
nu conine chei externe
o cheie extern
o cheie extern i una sau mai
multe coloane adiionale
dou sau mai multe chei externe
i (opional) coloane adiionale
SALARIAT
cod_salariat#
salariu
nume
sex
job_cod
ATASAT_LA
cod_salariat#
nr_proiect#
functie
AGENT_TERITORIAL
zona
comision
PROIECT
nr_proiect#
descriere
buget_alocat
PROGRAMATOR
limbaj
nivel
apartine_la
conduce
lucreaza_in
DEPARTAMENT
cod_departament#
nume
nr_cladire
casatorit
TELFON
cod_salariat#
nr_telefon#
SARCINA
nr_proiect#
nr_sarcina#
data_inceperii
stare
17
adresa,
telefon,
cont,
banca,
18
CONTRACTANT
cod_contractant#
adresa
telefon
cont
banca
tip_contractant
SUBANTREPENOR
nume
nume_adm
funcie_adm
executa
LUCRARE
cod_lucrare#
cod_obiectiv# executa
ANTIER
nr_antier#
specialitate ef
necesita
INVESTITOR
tip_investitor
OBIECTIV_INVESTITIE
cod_obiectiv#
denumire
adresa
PERS_FIZICA
nume
prenume
bi
investeste_in
atasat_la
CONTRACT
PERS_JURIDICA
tip_juridic
nume
functie
nr_contract#
tip_contract
data_avans
incheie
19
REALIZEAZA
cod_salariat#
nr_publicatie#
nr_capitol#
nr_frame#
FRAME
nr_publicatie#
nr_capitol#
nr_frame#
tip
include
TEHNOREDACTOR
tip_editor
scrie
REDACTOR_SEF
experienta
CAPITOL
nr_publicatie#
nr_capitol#
dimensiune
coordoneaza
TELEFON
cod_salariat#
nr_telefon#
LIMBA
cod_salariat#
limba_cun#
cuprinde
PUBLICATIE
nr_publicatie#
stil
20
Algebra relaional
Limbajul de definire a datelor (LDD) precizeaz entitile, relaiile
dintre ele, atributele, structura atributelor, cheile, constrngerile, prin
urmare definete structura obiectelor bazei de date (schema bazei).
Limbajul de prelucrare a datelor (LMD) dintr-o baz de date
relaionale cuprinde aspecte referitoare la introducerea, eliminarea,
modificarea i cutarea datelor.
Introducerea datelor permite adugarea de tupluri la o relaie.
Tuplurile pot fi introduse de utilizator sau pot fi obinute din alte
relaii existente n baza de date.
21
rezultatele sunt relaii ieirea unei operaii poate deveni intrare pentru
alta) posibilitatea imbricrii expresiilor n algebra relaional).
Operatorii algebrei relaionale sunt:
22
Operatorul PROJECT
Proiecia este o operaie unar care elimin anumite atribute ale unei
relaii producnd o submulime pe vertical a acesteia. Suprimarea unor
atribute poate avea ca efect apariia unor tupluri duplicate, care trebuie
eliminate.
Prin proiecie se construiete dintr-o relaie R, o nou relaie:
a) tergnd din R atributele care nu sunt menionate n parametrii
proieciei;
b) eliminnd dublurile care apar dup tergere.
Pentru a reprezenta operatorul proiecie sunt utilizate diferite notaii:
A1, ..., Am (R)
SELECT
FROM
3.
SELECT
FROM
23
Operatorul SELECT
Selecia (restrictia) este o operaie unar care produce o submulime
pe orizontal a unei relaii R. Aceast submulime se obine prin
extragerea tuplurilor din R care satisfac o condiie specificat.
Sunt utilizate diferite notaii:
condiie(R)
R[condiie]
SELECT(R, condiie)
RESTRICT(R, condiie).
Selecie n SQL:
SELECT
FROM
WHERE
*
salariat
sex = m;
Operatorul UNION
Reuniunea a dou relaii R i S este mulimea tuplurilor aparinnd
fie lui R, fie lui S, fie ambelor relaii.
Sunt utilizate notaiile:
RS
UNION(R, S)
OR(R, S)
APPEND(R, S).
Exemplu. S se obin lista cu numele persoanelor fizice i a
subantreprenorilor.
SELECT
FROM
UNION
SELECT
FROM
nume
subantreprenor
nume
pers_fizica;
24
Operatorul DIFFERENCE
Diferena a dou relaii R i S este mulimea tuplurilor care aparin
lui R, dar nu aparin lui S. Diferena este o operaie binar necomutativ
care permite obinerea tuplurilor ce apar numai ntr-o relaie.
Sunt utilizate diferite notaii:
RS
DIFFERENCE(R, S)
REMOVE(R, S)
MINUS(R, S).
Exemplu. S se obin lista cu numrul contractului, tipul
contractului, valoarea investiiei i durata lucrrii pentru contractele de
subantrepriz pentru care valoarea investiiei nu depete 60000$.
1. Diferen n algebra relaional:
R=PROJECT(SELECT(CONTRACT, tip_contract=T),
nr_contract, tip_contract, val_investitie, durata_lucrare);
S=PROJECT(SELECT(CONTRACT, val_investitie > 60000),
nr_contract, tip_contract, val_investitie, durata_lucrare);
Rezultat = DIFFERENCE(R, S)
2. Diferena n SQL:
SELECT
nr_contract,tip_contract,
val_investitie,durata_lucrare
contract
tip_contract
FROM
WHERE
MINUS
SELECT
nr_contract,tip_contract,
val_investitie,durata_lucrare
FROM
contract
WHERE
val_investitie>60000;
Evident diferena se poate referi la tabele diferite! Implementai
cererea prin care se listeaz toate oraele n care se afl o filial, dar nici o
proprietate.
Operatorul INTERSECT
Intersecia a dou relaii R i S este mulimea tuplurilor care aparin
i lui R i lui S. Operatorul INTERSECT este un operator binar, comutativ,
derivat:
25
R S = R (R S)
R S = S (S R).
Sunt utilizate diferite notaii:
INTERSECT(R, S)
RS
AND(R, S).
n anumite dialecte SQL exist operator special (INTERSECT), care
realizeaz aceast operaie. Operatorii INTERSECT i DIFFERENCE pot
fi simulai n SQL (n cadrul comenzii SELECT) cu ajutorul opiunilor
EXISTS, NOT EXISTS, IN, != ANY.
Exemplu. Utiliznd tabelele agent_teritorial i programator s se
obin lista codurilor salariailor care sunt programatori, dar care lucreaz i
ca ageni teritoriali.
1.
R = PROJECT(AGENT_TERITORIAL, cod_salariat);
S = PROJECT(PROGRAMATOR, cod_salariat),
Rezultat = INTERSECT(R, S).
2.
Intersecie n SQL:
SELECT
cod_salariat
FROM
agent_teritorial
INTERSECT
SELECT
cod_salariat
FROM
programator;
3.
SELECT
cod_salariat
FROM
programator p
WHERE EXISTS
(SELECT cod_salariat
FROM
agent_teritorial a
WHERE
p.cod_salariat=a.cod_salariat);
Operatorul PRODUCT
Fie R i S relaii de aritate m, respectiv n. Produsul cartezian al lui R
cu S este mulimea tuplurilor de aritate m + n unde primele m componente
formeaz un tuplu n R, iar ultimele n componente formeaz un tuplu n S.
Sunt utilizate diferite notaii:
26
RS
PRODUCT(R, S)
TIMES(R, S).
Exemplu. S se obin lista tuturor posibilitilor de investiie n
diverse obiective de ctre o firm care este persoan juridic.
1.
SELECT
FROM
Operatorul DIVISION
Diviziunea este o operaie binar care definete o relaie ce conine
valorile atributelor dintr-o relaie care apar n toate valorile atributelor din
cealalt relaie.
Sunt utilizate diferite notaii:
DIVIDE(R, S)
DIVISION(R, S)
R S.
Diviziunea conine acele tupluri de dimensiune n m la care, adugnd
orice tuplu din S, se obine un tuplu din R.
Operatorul diviziune poate fi exprimat formal astfel:
R(n) S(m) = {t(n-m) s S, (t, s) R} unde n > m i S .
Operatorul DIVISION este legat de cuantificatorul universal () care
nu exist n SQL. Cuantificatorul universal poate fi ns simulat cu ajutorul
cuantificatorului existenial () utiliznd relaia:
x P(x) x P(x).
Prin urmare, operatorul DIVISION poate fi exprimat n SQL prin
succesiunea a doi operatori NOT EXISTS.
Exemplu. S se obin codurile salariailor ataai tuturor proiectelor
pentru care s-a alocat un buget egal cu 1000.
1.
27
Diviziune n SQL:
SELECT
UNIQUE cod_salariat
FROM
atasat_la sx
WHERE NOT EXISTS
(SELECT *
FROM
proiect pp
WHERE
proiect.buget=1000
AND NOT EXISTS
(SELECT *
FROM
atasat_la bb
WHERE
pp.nr_proiect=bb.nr_proiect
AND bb.cod_salariat=sx.cod_salariat));
3.
SELECT
cod_salariat
FROM
atasat_la
WHERE
nr_proiect IN
(SELECT nr_proiect
FROM
proiect
WHERE
buget=1000)
GROUP BY cod_salariat
HAVING
COUNT(nr_proiect)=
(SELECT COUNT(*)
FROM
proiect
WHERE
buget=1000);
Operatorul JOIN
Operatorul de compunere (uniune) permite regsirea informaiei din
mai multe relaii corelate. Operatorul combin produsul cartezian, selecia
i proiecia.
28
2.
3.
SELECT
FROM
WHERE
*
salariat, departament
nr_depart = cod_departament;
Operatorul -JOIN
Operatorul -JOIN combin tupluri din dou relaii (nu neaprat
corelate) cu condiia ca valorile atributelor specificate s satisfac o
anumit condiie specificat explicit n cadrul operaiei.
Operatorul -JOIN este un operator derivat, fiind o combinaie de
produs scalar i selecie:
JOIN(R, S, condiie) = condiie (R S)
Exemplu. S se afieze pentru fiecare salariat, codul acestuia i grila
sa de salarizare.
SELECT
empno, level
FROM
salgrade, emp
WHERE
sal BETWEEN losal AND hisal;
Exemplu. S se obin informaii despre contractani (codul i banca)
i obiectivele de investiie asociate acestora (denumire, numr certificat de
urbanizare) cu condiia ca obiectivele s nu fie la aceeai adres ca i
contractanii.
29
1.
SELECT
FROM
WHERE
cod_contractant,banca, nr_cert_urb,
denumire
contractant a,obiectiv_investitie b
b.adresa <> a.adresa;
Operatorul SEMI-JOIN
Operatorul SEMI-JOIN conserv atributele unei singure relaii
participante la compunere i este utilizat cnd nu sunt necesare toate
atributele compunerii. Operatorul este asimetric.
Tupluri ale relaiei R care particip n compunerea (natural sau
-JOIN) dintre relaiile R i S.
SEMI-JOIN este un operator derivat, fiind o combinaie de proiecie
i compunere natural sau proiecie i -JOIN:
SEMIJOIN(R, S) = M (JOIN(R, S))
SEMIJOIN(R, S, condiie) = M (JOIN(R, S, condiie)),
unde am notat prin M atributele relaiei R.
Exemplu. S se obin informaii referitoare la persoanele fizice
(nume, buletin) care investesc n obiective cu caracter recreativ.
1.
SELECT
FROM
WHERE
AND
30
31
32
Ideea general:
cerere arbore algebric (nu este unic) plan de executie optimizare
Un plan de execuie implic o secven de pai pentru evaluarea cererii
(n mod obinuit, fiecare pas din planul de execuie corespunde unei operaii
relaionale) precum i metoda care va fi folosit pentru evaluarea operaiei.
De obicei, pentru o operaie relaional dat, exist mai multe metode ce pot
fi folosite pentru evaluarea acesteia.
Dou planuri de execuie diferite care au ntotdeauna acelai rezultat se
numesc echivalente. Planuri de execuie echivalente pot avea diferite
costuri. Scopul optimizrii cererilor este de a gsi, printre diversele planuri
de execuie echivalente, pe acela de cost minim. ntr-un sistem centralizat,
costul evalurii unei cereri este suma a dou componente, costul I/O
(transferuri de date) i costul CPU (verificare de condiii, operaii join etc.).
33
34
35
36
37
38
NORMALIZAREA RELAIILOR
n procesul modelrii unei baze de date relaionale, o etap important
o reprezint normalizarea relaiilor conceptuale (Codd, 1972), adic
obinerea de relaii molecularefr a pierde nimic din informaie pentru a
elimina:
redundana;
39
Dependene funcionale
O relaie universal este o relaie ce grupeaz toate atributele care
modeleaz sistemul real cercetat. Fie E, mulimea dependenelor
considerate de proiectantul bazei pentru o schem relaional sau pentru o
relaie universal. Plecnd de la o mulime de proprieti formale ale
dependenelor, proprieti considerate drept reguli de deducie (axiome),
poate fi obinut mulimea maximal de dependene asociate lui E. Aceast
mulime definete nchiderea lui E.
Fie E mulimea dependenelor unei relaii i p1, p2, ..., pr, r 1,
proprieti formale ale acestor dependene. Dac exist o mulime E, astfel
nct orice dependen a mulimii E este derivabil din E prin aplicarea
proprietilor p1, p2, ..., pr, atunci mulimea E definete acoperirea lui E
pentru proprietile p1, p2, ..., pr.
E este o acoperire minimal pentru E, dac nu exist nici o
submulime proprie, nevid a lui E care s fie o acoperire pentru E.
40
Dac X Y i X Z, atunci Z Y.
2.
Dac X Y i W Z, atunci X Z Y W.
3.
Dac X Y atunci X Z Y Z.
4.
Dac X Y atunci X Z Y.
41
42
Exemplu:
1. Graful dependenelor funcionale pentru schema relaional
CONSUMATOR_DE_VIN(W#, localitate, varsta, calitate, regiune, tara, D#,
nume, data, cantitate) i acoperirea minimal.
localitate
W#
calitate
varsta
regiune
tara
data
cantitate
D#
nume
localitate
W#
calitate
varsta
43
regiune
tara
data
cantitate
D#
nume
adresa
nr_contract
nr_aut_construtie
cod_contractant
Necesitatea normalizrii
Anomaliile care apar n lucrul cu baza de date se produc datorit
dependenelor care exist ntre datele din cadrul relaiilor bazei de date.
Dependenele sunt plasate greit n tabele!!!
Avion
A#
1
2
3
4
5
6
nume
AIRBUS
AIRBUS
AIRBUS
CAR
B707
B707
capacitate
250
250
250
100
150
150
localitate
PARIS
PARIS
LONDRA
PARIS
LONDRA
LONDRA
Constrngere:
toate avioanele cu acelai nume au aceeai capacitate.
Datorit dependenei introduse pot exista: anomalii la inserare,
modificare sau tergere, redundan n date, probleme de reconexiune.
44
1.
2.
3.
4.
5.
Descompuneri
ce
conserv
dependenele.
Aceast
descompunere presupune desfacerea relaiei R n proieciile R1,
R2, ..., Rk, astfel nct dependenele lui R sunt echivalente (au
45
BCNF
FN4
FN5
46
Capacitate
150
100
150
AVION2
A#
Nume
1
AIRBUS
2
AIRBUS
3
AIRBUS
4
CAR
5
B707
6
B707
Localitate
PARIS
PARIS
LONDRA
PARIS
LONDRA
LONDRA
Vehicul
Eu
Tu
205
El
R5 - 305
noi
Varianta 1
Persoana
Eu
Eu
Eu
Tu
El
El
Noi
Noi
Noi
Noi
Vehicul
R25
W14
R21
205
R5
305
BX
305
R12
R25
47
Varianta 2
Persoana
Prima
Doi
Trei
Eu
R25
W14
R21
Tu
205
El
R5
305
Noi
BX
305
R12
Patru
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
atasat_la
Cod_salariat#
S1
S1
S1
S3
S5
Job_cod
Programator
Programator
Programator
Vanzator
Inginer
Nr_proiect#
P1
P2
P3
P3
P3
Nr_proiect#
P1
P2
P3
P3
Functia
Supervizor
Cercetator
Auxiliar
Supervizor
Functia
Supervizor
Cercetator
Auxiliar
Supervizor
Supervizor
atasat_2a
Cod_salariat#
S1
S1
S1
S3
Suma
60
25
10
60
Suma
60
25
10
60
60
48
S5
P3
Supervizor
60
atasat_2b
Cod_salariat#
S1
S3
S5
Job_cod
Programator
Vanzator
Inginer
K2
49
X1
X3
X2
50
Nr_proiect#
P1
P2
P3
P3
P3
Functia
Supervizor
Cercetator
Auxiliar
Supervizor
Supervizor
atasat_3b
Functia
Supervizor
Cercetator
Auxiliar
Suma
60
25
10
51
1.
2.
3.
4.
5.
6.
52
f2: F P;
F4: P C; f5: P T;
f3: P, F, N U;
f6: C T;
f7: N F.
f3: P, F, N U sau N, P, F U;
f2: F P;
53
f4: P C; f6: C T;
f7: N F.
54
K2
Exemplu:
ADRESA(cod_parsoana#, telefon#, adresa)
cod_persoana
adresa
55
telefon
56
6.
y'
z'
x
x
y
y'
z'
z
57
tupluri <x, y, z> i <x, y, z>, se obine y = y. Prin urmare n relaie apar
tuplurile <x, y, z> i <x, y, z> i deci X Y (MVD).
Fie W, V, X, Y i Z submulimi de atribute ale unei scheme relaionale
R. Fiind dat o mulime T de multidependene exist o mulime complet
de axiome (Ax1Ax8) care permit obinerea tuturor multidependenelor ce
se pot deduce din mulimea T:
Ax1. Dac Y X, atunci X Y.
Ax2. Dac X Y, atunci X Z Y Z.
Ax3. Dac X Y i Y Z, atunci X Z.
Ax4. Dac X Y, atunci X R {X Y}.
Ax5. Dac X Y i V W, atunci W X V Y.
Ax6. Dac X Y i Y Z, atunci X (Z Y).
Ax7. Dac X Y, atunci X Y.
Ax8. Dac X Y, Z W, W Y i Y Z = , atunci X W.
O multidependen elementar este o multidependen care are
pri stngi i drepte minimale (nu exist X X i Y Y a.i. X Y).
Formal, relaia R este n a patra form normal dac i numai dac:
R este n BCNF;
orice dependen multivaloare este o dependen funcional.
O relaie BCNF este n FN4 dac pentru orice multidependen
elementar de forma X Y, X este o supercheie a lui R. Aducerea
relaiilor n FN4 presupune eliminarea dependenelor multivaloare atunci
cnd sunt mai mult de una n cadrul unei relaii.
Regula de descompunere n relaii FN4. Fie R(X, Y, Z) o schem
relaional care nu este n FN4 i fie X Y o multidependen
elementar care nu este de forma CHEIE atribut. Aceast relaie
este descompus prin proiecie n dou relaii:
R = JOIN(XY(R), XZ(R)).
Aplicnd recursiv aceast regul, se obin relaii FN4.
Exemplu. Fie relaia INVESTITIE(cod_contractant#, denumire,
telefon) i presupunem c un investitor poate avea mai multe numere de
telefon i c poate investi n mai multe obiective. ntre atributele relaiei
exist multidependenele:
cod_contractant# denumire;
cod_contractant# telefon.
58
59
Formal, o relaie R este n FN5 dac i numai dac orice joindependen *{R1, R2, ..., Rp} care are loc n R fie este trivial, fie conine o
supercheie a lui R (adic, o anumit component Ri este o supercheie a lui
R). Cu alte cuvinte, o relaie R este n FN5 dac orice join-dependen
definit pe R este implicat de cheile candidat ale lui R.
ntre mulimile de atribute X, Y i Z din cadrul relaiei R exist o joindependen dac exist multidependene ntre fiecare dintre perechile de
mulimi (X, Y), (Y, Z) i (X, Z).
Aducerea n FN5 prin eliminarea join dependenelor!
Exemplu.
Fie schema R(furnizor, cod_consumabil, cantitate, pret).
Reguli:
Furnizor
F1
F2
F2
F2
Cod_consumabil
1
1
1
2
Cantitate
500
100
500
500
Pret
100
80
100
100
60
R2(furnizor,
cantitate,
pret),
Exemplu.
Fie schema relaional:
EXECUTANT(nr_santier#, cod_obiectiv#, cod_lucrare#, data_inceput,
data_sfarsit). Un antier poate executa mai multe lucrri referitoare la
acelai obiectiv sau poate executa o lucrare pentru un obiectiv n intervale
de timp distincte. Se presupune c mai multe antiere pot executa aceeai
lucrare, n acelai interval de timp sau n intervale de timp distincte.
Relaia, datorit dependenelor formulate anterior, nu este n FN5. Ea
se poate desface prin proiecie n trei relaii:
EX1(nr_santier#, cod_obiectiv#, cod_lucrare#);
EX2(nr_santier#, data_inceput, data_sfarsit);
EX3(cod_obiectiv#, cod_lucrare#, data_inceput, data_sfarsit).
Sunt evidente relaiile:
EXECUTANT JOIN(EX1, EX2),
EXECUTANT JOIN(EX1, EX3),
EXECUTANT JOIN(EX2, EX3),
EXECUTANT = JOIN(JOIN(EX1, EX2), EX3).
Concluzii:
1.
2.
3.
4.
61
5.
6.
7.
referitoare
la
62
63
64
65
SELECT
FROM
WHERE
p.*, ptr.nume
proprietate_de_inchiriat p, proprietar ptr
p.nrptr=ptr.nrptr AND nrfil='S3';
p.*
proprietate_de_inchiriat p
nrfil='S3';
ptr.nume
proprietate_de_inchiriat p, proprietar ptr
p.nrptr=ptr.nrptr AND p.nrfil='S3';
p.nume
proprietar p
nrfil='S3';
66
67
68
ANSI, IBM, Microsoft, Borland, etc. Din pcate, lipsa unui standard unic
SQL are drept consecine creterea costurilor programelor de gestiune a
bazelor de date i ngreunarea ntreinerii arhitecturilor client/server.
Un grup de specialiti n baze de date s-au reunit sub numele SAG
(SQL Access Group) cu scopul de a construi un limbaj SQL comun i de a
realiza pentru fiecare dialect un program de conversie din dialect n SQL, i
invers.
Rezultatul a fost c n:
Limbaje algebrice
n abordarea algebric, o relaie este considerat ca o mulime de
tupluri, iar o baz de date este considerat ca o mulime de relaii pe care
sunt definii operatorii algebrici.
Exist dou tipuri de operatori algebrici: mulime (intersecie,
reuniune, diferen, produs cartezian) i relaionali (proiecie, selecie,
diviziune, compunere). Operatorii selecie, proiecie, produs cartezian,
reuniune i diferen sunt ireductibili i sunt considerai drept operatori de
baz, iar operatorii intersecie, diviziune i compunere pot fi dedui din
operatorii anteriori i sunt considerai operatori derivai.
Operatorii limbajului algebric permit exprimarea unor cereri
nerecursive. Dac cererea este recursiv este necesar un operator special i
anume nchiderea tranzitiv a unei relaii.
69
Limbaje predicative
Limbajele predicative se bazeaz pe calculul predicatelor. Cererile
sunt exprimate sub forma unor mulimi de tupluri sau valori pentru care se
specific, sub forma unor predicate, proprietile pe care trebuie s le
ndeplineasc.
70
AND (a.codel=v.codel)
AND (a.autor=Cioran))
=
COUNT (a.codel WHERE (a.autor=Cioran))
Carte Codel
Titlu
P.X
Autor
'Cioran'
Pret
Nrex
>10
Coded
Codel
Titlu
Autor
GROUP BY
Pret
MAX
Nrex
SUM
Coded
71
Algebric:
R1 = SELECT(carte, autor = 'Popa')
R2 = SELECT(carte, titlu = Geometrie')
R3 = R1 R2
Rezultat = PROJECT (R3, codel)
SEQUEL:
SELECT
FROM
WHERE
OR
codel
carte
autor = Popa
titlu = Geometrie
QBE:
Carte
Codel
Titlu
Autor
Pret Nrex Coded
P.X
'Popa'
P.Y
'Geometrie'
Exemplu.
Numele cititorilor care au mprumutat cel putin o carte scrisa de
Cioran.
Algebric:
R1 = PROJECT(cititor, codec, nume)
R2 = SELECT(carte, autor = 'Cioran')
R3 = PROJECT(R2, codel)
R4 = PROJECT(imprumuta, codel, codec)
R5 = JOIN(R4, R3, codel)
R6 = JOIN(R5, R1, codec)
Rezultat = PROJECT(R6, nume)
QBE:
Cititor
Imprumuta
Codec
Y
Codel
Z
Nume
P.X
Codec
Y
Autor
'Cioran'
SEQUEL:
SELECT
FROM
WHERE
nume
cititor
codec IS IN
Dataim
Pret
Dep
Datares
Nrex
Dataef
Coded
72
SELECT
codec
FROM
imprumuta
WHERE
codel IS IN
SELECT
codel
FROM
carte
WHERE
autor = Cioran
extensia.
73
Exemplu.
S se obin o relaie avnd numele rezultat, ce conine toate crile
scrise de Cioran care au preul mai mare de 150000.
VAR rezultat: abc;
BEGIN
rezultat:=[];
FOR EACH x IN carte DO
IF(x.autor = Cioran) AND (x.pret >= 150000)
THEN rezultat:=rezultat + [x]
END;
Relaia rezultat poate fi construit i direct prin atribuirea:
rezultat := [EACH (x) IN carte:
(x.autor = Cioran) AND (x.pret >= 150000)];
Null
OR
Null
Null
Null
Null
Null F
Null
Null T
Null Null
Tabel
Reprezint
Independent entitate independent
Subtabel
subentitate
entitate dependent
Dependent
Atribut multiplu
relaie m:n
Asociativ
relaie de tip 3
Cheie primar
nu conine chei externe
o cheie extern
o cheie extern i una sau mai
multe coloane adiionale
dou sau mai multe chei externe
i (opional) coloane adiionale
11
INFO CONTACT
LIMBA
FIRMA_PUB
cunoaste
ORGANIZATOR
face
are
are
PERS CONTACT
are
PUBLICITATE
organizeaza
FIRMA_SEC
LOCATIE
se_face
are
ANGAJAT_SEC
SOC ASIG
LOCALIZARE
are
PAZA
PREZENTARE
asigura
FINANTEAZA
SPONSOR
PARTICIPA
PRIMESTE
CASA MODA
prezinta
lucreaza
ANGAJAT_TEMP
MODEL
CREATOR
creeaza prezinta
face
VESTIMENTATIE
lucreaza_la
are
AGENTIE
are
ACCESORIU
refera
12
ISTORIC
14
limba_cunoscuta#,
16
niv_scris,
niv_citit,
17
19
20
4. NORMALIZAREA RELAIILOR
4.1. Preliminarii
n procesul modelrii unei baze de date relaionale, o etap important o
reprezint normalizarea relaiilor conceptuale. Aceasta presupune obinerea de
relaii moleculare, fr a pierde nimic din informaie, avnd scopul de a
elimina redundana i anomaliile reactualizrii informaiilor. Tehnica
normalizrii permite determinarea unei scheme conceptuale rafinate, printr-un
proces de ameliorare progresiv a unei scheme conceptuale iniiale a bazei de
date relaionale. Dup fiecare etap de ameliorare, relaiile bazei de date ating
un anumit grad de perfeciune, deci se afl ntr-o anumit form normal.
Trecerea unei relaii dintr-o form normal n alta presupune eliminarea unui
anumit tip de dependene nedorite, care sunt transformate n dependene
admisibile, adic dependene care nu provoac anomalii.
Procesul de ameliorare progresiv a schemei conceptuale trebuie s
satisfac urmtoarele cerine:
s garanteze conservarea datelor, adic n schema conceptual
final trebuie s figureze toate datele din cadrul schemei iniiale;
s garanteze conservarea dependenelor dintre date, adic n
schema final fiecare dependen trebuie s aib determinantul i
determinatul n schema aceleiai relaii;
s reprezinte o descompunere minimal a relaiilor iniiale, adic
nici una din relaiile care compun schema final nu trebuie s fie
coninut ntr-o alt relaie din aceast schem.
Exist dou metode pentru a modela baze de date relaionale fr
anomalii sau pierderi de informaie.
Schema descompunerii pleac de la o schem relaional
universal care conine toate atributele bazei de date. Schema se
descompune prin proiecii succesive n subrelaii. Descompunerea
se oprete atunci cnd continuarea ei ar duce la pierderi de
informaie. Algoritmii de descompunere se bazeaz, n general, pe
descrierea formal a dependenei dintre atribute.
Schema sintezei pleac de la o mulime de atribute independente.
Utiliznd proprieti de semantic i legturi ntre atribute se pot
compune noi relaii, astfel nct acestea s nu sufere de anumite
anomalii pe care dorim s le evitm. Algoritmii de sintez se
bazeaz n general pe teoria grafurilor pentru a reprezenta
legturile ntre atribute.
21
denumire
luna_start
primavara
primavara
primavara
iarna
toamna
mai
mai
mai
martie
august
cod_organizato
r
11
37
11
32
11
23
2.
3.
4.
24
Pentru un tabel R care se descompune prin proiectie n mai multe tabele: R1,
R2, Rn, conditia de descompunere fr pierdere de informatie presupune
ca n urma operatiei de compunere natural a tabelelor R1, R2, Rn s se
obtin tabelul R.
Regula Casey-Delobel (caz particular de descompunere fr pierdere de
informatie):
Fie un tabel R(X, Y, Z) care se descompune prin proiectie n tabelele R1(X,
Y) si R2(X, Z) unde prin X notm setul de coloane comune ale tabelelor R1
si R2, iar prin Y si Z, coloanele specifice lui R1, respectiv R2. Conditia de
descompunere fr pierdere de informatie presupune ca tabelul R s fie
obtinut prin compunerea natural a tabelelor R1 si R2.
n SQL:
SELECT R1.X, R1.Y, R2.Z
FROM R1, R2
WHERE R1.X = R2.X
Algoritm AFN2 (aducerea unei relaii n FN2 prin eliminarea dependenelor funcionale pariale din cadrul unor relaii aflate n FN1)
1. Pentru fiecare dependen funcional parial se creeaz o nou
relaie avnd schema format din determinantul i determinatul
acestei dependene.
2. Se elimin din cadrul relaiei iniiale atributele care formeaz
determinatul dependenei pariale.
3. Dac n relaia iniial exist mai multe dependene pariale cu
acelai determinant, pentru acestea se creeaz o singur relaie cu
schema format din determinant (luat o singur dat) i din
determinaii dependenelor considerate.
4. Se determin cheia primar a fiecrei noi relaii create. Aceasta va
conine atributele din determinantul dependenei funcionale
pariale care au stat la baza constituirii relaiei.
5. Dac noile relaii create conin dependene pariale, atunci se face
transfer la pasul 1, altfel procesul de aducere la FN2 s-a terminat.
26
Exemplu
Fie schema relaional PARTICIPA (cod_prezentare#,
cod_casa_moda#, tip, data, data_start, data_final, denumire)
Pentru relaia PARTICIPA sunt adevrate dependenele:
{cod_prezentare} {data_start, data_final, denumire}
{cod_prezentare, cod_casa_moda} {data, tip}
Relaia PARTICIPA este n FN1, dar nu este n FN2 deoarece
atributele data_start, data_final i denumire nu depind de codul casei de
mod, deci nu depind de ntreaga cheie primar.
Pentru a obine o relaie n FN2 se aplic regula Casey Delobel i
relaia PARTICIPA se proiecteaz n dou relaii:
PARTI1(cod_prezentare#, data_start, data_final, denumire)
PARTI2(cod_prezentare#, cod_casa_moda#, data, tip).
Not (reamintim C2):
Entitatea PREZENTARE are atributele: cod_prezentare, denumire,
data_start, data_final, cod_organizator, cod_soc_asig, cod_locatie.
Entitatea CASA_MODA are atributele: cod_casa_moda, nume, cifra_afaceri,
proprietar, director, istoric, data_creare, cod_localizare, cod_info_acces.
Atribute ale relatiei PARTICIPA
tip = variabil de tip caracter, de lungime maxim 15, care reprezint
modalitatea n care o cas de mod particip la o prezentare, n sensul c
poate fi organizator sau neorganizator.
data = variabil de tip dat calendaristic reprezentnd ziua n care defileaz
modelele casei de mod. Atributul nu este multiplu, deoarece s-a presupus c
defilarea unei case de mod are loc ntr-o singur zi.
Alt Exemplu:
Fie tabelul VANZARI care se foloseste la nregistrarea tranzactiilor unui
magazin ce vinde articole la comand.
VANZARI (cod_client#, cod_comanda#, cod_articol#, nume_client,
nr_telefon, data, nume_articol, cost_articol, cantitate)
A1 C1 P1 Popescu 415355 08.10.04 camasa 400000 2
A1 C1 P3 Popescu 415355 08.10.04 tricou 200000 1
27
28
4.
Exemplu
Fie schema relaional PREZENT(cod_prezentare#, data_start,
data_final, denumire, cod_locatie, capacitate, cod_info_acces).
Pentru relaia PREZENT sunt adevrate dependenele:
{cod_prezentare} {data_start, data_final, denumire, cod_locatie}
{cod_locatie} {capacitate, cod_info_acces}
Relaia PREZENT este n FN2, dar nu este n FN3 deoarece atributele
capacitate, cod_info_acces depind indirect de cheia primar, prin
intermediul atributului cod_locatie.
Pentru a obine o relaie n FN3 se aplic regula Casey-Delobel i
relaia PREZENT se proiecteaz n dou relaii, prin eliminarea
dependenelor funcionale tranzitive.
PREZENT1(cod_prezentare#, data_start, data_final, denumire, cod_locatie)
PREZENT2(cod_locatie#, capacitate, cod_info_acces)
Forma normal Boyce-Codd (BCNF)
Determinantul este un atribut sau o mulime de atribute neredundante,
care constituie un identificator unic pentru alt atribut sau alt mulime de
atribute ale unei relaii date.
Intuitiv, o relaie R este n forma normal Boyce-Codd dac i numai
dac fiecare determinant este o cheie candidat.
Formal, o relaie R este n forma normal Boyce-Codd dac i numai
dac pentru orice dependen funcional total X A, X este o cheie a lui
R.
Algoritm ABCNF (aducerea unei relaii FN3 n BCNF prin
eliminarea dependenelor funcionale ai cror determinani nu sunt chei
candidat)
1. Dac relaia conine unul sau cel mult dou atribute, atunci nu pot
exista dependene noncheie i deci relaia este n BCNF.
2. Dac relaia conine mai mult de dou atribute, se caut dac ea
conine dependene noncheie. Dac nu exist astfel de dependene,
relaia este n BCNF.
3. Pentru fiecare dependen noncheie X Y se creeaz dou relaii.
Una dintre ele va avea schema format din atributele {X, Y}, iar
30
4.
Exemplu
Se consider relaia FINANTEAZA1, ce leag entitile
PREZENTARE i SPONSOR. Ea are cardinalitatea many to many i va
genera un tabel asociativ. Se presupune c acest tabel are schema
relaional:
FINANTEAZA1(cod_prezentare#, cod_sponsor#, nume_prezentare,
cod_ordin_plata).
Pentru exemplul analizat se presupune c numele prezentrilor sunt
unice. Prin urmare, n orice moment fiecare prezentare are un cod unic i
un nume unic. Cheile candidat sunt {cod_prezentare, cod_sponsor},
respectiv {nume_prezentare, cod_sponsor}.
ntre atributele relaiei exist dependenele:
{cod_prezentare, cod_sponsor} {cod_ordin_plata}
{cod_prezentare} {nume_prezentare}
Tabelul nu este n BCNF deoarece conine doi determinani,
cod_prezentare i nume_prezentare, care nu sunt chei candidat pentru
tabelul respectiv. Ambele atribute sunt determinani deoarece fiecare l
determin pe cellalt.
Soluia problemei const n divizarea relaiei n dou proiecii
conform tehnicii Casey-Delobel.
PREZENTARE(cod_prezentare#, nume_prezentare)
FINANTEAZA(cod_prezentare#, cod_sponsor#, cod_ordin_plata)
Forma normal 4 (FN4)
Dac BCNF elimin redundanele datorate relaiilor singulare, FN4
elimin redundanele datorate relaiilor m:n, adic datorate dependenei
multiple.
Intuitiv, o relaie R este n a patra form normal dac i numai dac
relaia este n BCNF i nu conine relaii m:n independente.
Exemplu
Fie schema relaional
PERS_CONTACT(cod_pers#, limba_cunoscuta, nr_telefon).
Se presupune c o persoan de contact poate cunoate mai multe limbi
strine i poate avea mai multe numere de telefon. ntre atributele relaiei
exist multidependenele:
31
cod_pers# limba_cunoscuta
cod_pers# nr_telefon.
Pentru a aduce relaia PERS_CONTACT (care este n BCNF) n FN4,
aceasta se va diviza n dou proiecii :
PERS_CONTACT1(cod_pers#, limba_cunoscuta)
PERS_CONTACT1(cod_pers#, nr_telefon).
Forma normal 5 (FN5)
Semnificaia lui FN5 este mai mult academic, ea aprnd rar n
practic. A cincea form normal i propune eliminarea redundanelor care
apar n relaii m:n dependente. n general, aceste relaii nu pot fi
descompuse. S-a artat c o relaie de tip 3 este diferit de trei relaii de tip
2. Exist totui o excepie, i anume, dac relaia este ciclic.
Intuitiv, o relaie R este n forma normal 5 dac i numai dac:
1. relaia este n FN4;
2. nu conine dependene ciclice.
Exemplu
Se consider o relaie ce conine informaii despre creatori,
vestimentaiile create de acetia i accesoriile corespunztoare. Se consider
schema
relaional
CREARE(cod_vestimentatie#,
cod_creator#,
cod_accesoriu#).
Se presupune c fiecare creator poate crea una sau mai multe
vestimentaii. Fiecare vestimentaie poate fi creat de unul sau mai muli
creatori. Similar, fiecare creator este responsabil de crearea unuia sau a mai
multor accesorii, iar fiecare accesoriu este creat de unul sau mai muli
creatori. Fiecare accesoriu apare n una sau mai multe vestimentaii, iar
fiecrei vestimentaii i se ataeaz unul sau mai multe accesorii.
Mai mult chiar, dac creatorul C creeaz vestimentaia V, iar
accesoriul A este ataat lui V, iar C este este responsabil de A, atunci C
creeaz accesoriul A pentru vestimentaia V.
innd seama de constrngerile impuse modelului se obin
dependenele:
{cod_vestimentatie#, cod_creator#} {cod_accesoriu}
{cod_vestimentatie#, cod_accesoriu#} {cod_creator}
{cod_accesoriu#, cod_creator#} {cod_vestimentatie}.
Datorit dependenelor formulate anterior, relaia nu este n FN5. Ea
se poate rupe prin proiecie n trei relaii:
CREARE1(cod_vestimentatie#, cod_creator#)
32
CREARE2(cod_vestimentatie#, cod_accesoriu#)
CREARE3(cod_creator#, cod_accesoriu#).
n acest caz, sunt evidente relaiile:
CREARE JOIN(CREARE1, CREARE2)
CREARE JOIN(CREARE1, CREARE3)
CREARE JOIN(CREARE2, CREARE3)
CREARE = JOIN(JOIN(CREARE1, CREARE2), CREARE3).
Concluzii:
1. FN1 FN2 elimin redundanele datorate dependenei netotale a
atributelor care nu particip la o cheie, fa de cheile lui R. Se
suprim dependenele funcionale care nu sunt totale.
2. FN2 FN3 elimin redundanele datorate dependenei tranzitive.
Se suprim dependenele funcionale tranzitive.
3. FN3 BCNF elimin redundanele datorate dependenei
funcionale. Se suprim dependenele n care partea stng nu este
o supercheie.
4. BCNF FN4 elimin redundanele datorate multidependenei. Se
suprim toate multidependenele care nu sunt i dependene
funcionale.
5. FN4 FN5 elimin redundanele datorate dependenei ciclice. Se
suprim toate join-dependenele care nu sunt implicate de o cheie.
6. BCNF, FN4 i FN5 corespund la regula c orice determinant este
o cheie, dar de fiecare dat dependena cu care se definete determinantul este alta i anume dependena funcional,
multidependena sau join-dependena.
7. Descompunerea unei relaii FN2 n FN3 conserv datele i
dependenele, pe cnd descompunerea unei relaii FN3 n BCNF
i, respectiv, a unei relaii BCNF n FN4 conserv doar datele.
33
Productor
SGBD
Client SQL
Descriere
Microsoft Access este o baz de date de uz
personal, cu clientul SQL integrat n
Microsoft
Access
Nu exist
DBMS, toate fiind rulate local pe staia de
lucru a utilizatorului.
Client SQL care ruleaz ca aplicaie n
Microsoft
SQL Server
iSQL
Microsoft
SQL
care
ruleaz
ca
MySQL
MySQL
Oracle
Oracle
iSQL*Plus
SQL
bazat
pe
web
SQL
care
ruleaz
ca
Oracle
SQL*Plus
Microsoft
Mac
OS
Windows,
X,
diferite
SQL
scris
Java
Oracle
SQL Worksheet
nlocuit de iSQL*Plus n Oracle
10g.
Clientul SQL care ruleaz ca aplicaie
n linia de comand ntr-un nucleu de
comenzi
Sybase
Sybase
Microsoft
Windows.
iSQL
nu
sunt
ntmpltoare
primele
10
11
12
Tipuri de date
O coloan este cea mai mic unitate denumit care poate fi referit
ntr-o baz de date relaional. 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 cteva
avantaje importante:
Restricionarea, 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 numr dintr-un alt numr, se
obine ca rezultat un numr; dar dac se scade o dat dintr-o alt
dat, se obine ca rezultat diferena n zile dintre cele dou date
calendaristice.
Creterea eficienei 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 ctre productor
ca parte nativ a sistemului SGBD(vor fi tratate n continuare).
Tipurile de date construite, cunoscute i ca tipuri de colecii, conin
matrice sau seturi de tipuri de date predefinite, n scopul reprezentrii n
SGBD a construciilor 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 inteniile cursului.
Tipuri de date predefinite din standardul SQL:2003
Majoritatea implementrilorSQL accept cea mai mare parte parte
13
14
Definiie
Anul calendaristic, pe dou sau
patru cifre
Luna din an
Ziua din lun
Ora din zi
Minutul din or
Secunda din minut
Valoarea orei cu diferena de fus
orar
Valoarea minutului cu diferena
de fus orar
YEAR
MONTH
DAY
HOUR
MINUTE
SECOND
TIMEZONE_HOUR
TIMEZONE_MINUTE
16
18
Oracle
Oracle SQL accept urmtoarele tipuri de date standard:
BLOB -Obiecte binare mari, cu dimensiunea maxim de (4GB-1)
x (dimensiunea unui bloc din baza de date).
CHAR - iruri de caractere cu lungime fix, coninnd cel mult
2000 de octei.
CLOB - Obiecte de tip caracter mari, cu dimensiunea maxim de
(4GB- 1) x (dimensiunea unui bloc din baza de date).
DATE - Funcioneaz ca tipul standard de date DATE, dar din
punct de vedere tehnic seamn mai mult cu tipul DATETIME,
deoarece poate stoca att data, ct i ora. Accept date de la 1
ianuarie 4712 .e.n. la 31 decembrie 9999 e.n. Opional, poate fi
inclus i ora, n ore, minute i secunde. Dac partea opional
este omis, este stocat cu valoarea zero, echivalent cu miezul
nopii.
DECIMAL - Implementat ca NUMBER(precizie,scal).
DOUBLE PRECISION - Implementat ca NUMBER.
FLOAT - Implementat ca NUMBER.
INTEGER - Implementat ca NUMBER(38).
19
20
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);
22
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);
Ex.7
INSERT INTO timp
VALUES (TIMESTAMP '2010-01-25 09:26:50.30',
INTERVAL '360' SECOND,
INTERVAL 144 YEAR);
24
25
Exemplu
CREATE TABLE exemplu
(durata INTERVAL YEAR(3) TO MONTH);
INSERT INTO exemplu
VALUES (INTERVAL '120' MONTH);
SELECT TO_CHAR(SYSDATE+durata, 'DD-monFROM exemplu;
Exemplu
CREATE TABLE noi_carti
(codel NUMBER,
start_data TIMESTAMP);
INSERT INTO noi_carti
VALUES (1,TIMESTAMP '2009-10-31 09:26:50.30');
SELECT codel ,start_data
FROM noi_carti;
YYYY')
DD-
27
Modele de format
Un model de format este un literal caracter care descrie formatul
valorilor de tip DATE sau NUMBER stocate ntr-un ir de caractere.
Atunci cnd se convertete un ir de caractere ntr-o dat calendaristic
sau ntr-un numr, modelul de format indic sistemului cum s
interpreteze irul respectiv.
n instruciunile SQL se poate folosi un model de format ca
argument al funciilor TO_CHAR i TO_DATE. n felul acesta se poate
specifica formatul folosit de sistemul Oracle pentru a returna sau a stoca
o valoare n/din baza de date. Un model de format nu schimb
reprezentarea intern a valorii n baza de date.
O parte dintre elementele cel mai frecvent ntlnite ale unui format
de tip numeric sunt sintetizate n tabelul urmtor.
Element Exemplu Descriere
, (virgul) 9,999
. (punct)
99.99
$9999
0999;
9990
0
9
9999
C999
99D99
EEEE
9.9EEEE
L999
MI
9999MI
S9999;
9999S
28
Explicaie
AD sau A.D.
BC sau B.C.
DAY
DD
DDD
DY
FF
Fraciunile de secund.
HH sau HH12
HH24
MI
MM
MON
29
MONTH
RM
RR
RRRR
SS
SSSSS
TZH
Ora regiunii.
TZM
Minutul regiunii.
Y,YYY
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
Angajare
January 21,2009
October 10,2009
Exemplu
SELECT nume, TO_CHAR(data_ang, DDTH of Month YYYY)
angajare
FROM angajati
WHERE TO_CHAR(data_ang, YYYY)=2009;
30
Nume
Pop
Ene
Angajare
21st of January 2009
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-MMYYYY) from dual;
Sesiunea incepe pe 20-09-2010
(Afieaz formatul standard pentru dat)
Valoarea null, reprezentnd lipsa datelor, nu este egal sau diferit
de nici o alt valoare, inclusiv null.
Totui, exist dou situaii n care sistemul Oracle consider dou
valori null ca fiind egale: la evaluarea funciei DECODE i dac valorile
null apar n chei compuse. Dou chei compuse care conin valori null sunt
considerate identice dac toate componentele diferite de null sunt egale.
Pseudocoloane
31
cod_opera)
MPAA_RATING
MPAA_COD_RATING
MPAA_DESCRIERE_VARSTE
PK
FILM_LIMBA
FILM_ID
COD_LIMBA
PK,FK1
PK,FK2
FILM
FILM_ID
FILM_COD_GEN
MPAA_COD_RATING
FILM_NUME
RETAIL_PRET_VHS
RETAIL_PRET_DVD
AN_PRODUS
FILM_COPII
FILM_ID
NUMAR_COPIE
DATA_CUMPARARE
DATA_VANZARE
FORMAT_MEDIA
PK
FK1
FK2
PK,FK1
PK
FILM_GEN
FILM_COD_GEN
FILM_DESCRIERE_GEN
PK
FILM_INCHIRIERE
FILM_ID
PK,FK1
NUMAR_COPIE
PK,FK1
TRANZACTIE_ID
PK,FK2
DATA_INTOARCERE
COST_INCHIRIERE
COST_INTARZIERE_SAU_PIERDERE
DATA_RETURNARE
LIMBA
COD_LIMBA
NUME_LIMBA
CLIENT_COD_PERSOANA
CLIENT_CONT_ID
PERSOANA_ID
PERSOANA
PERSOANA_ID
PERSOANA_PRENUME
PERSOANA_NUME_MIJLOCIU
PERSOANA_NUME
PERSOANA_ADRESA_1
PERSOANA_ADRESA_2
PERSOANA_ADRESA_ORAS
PERSOANA_ADRESA_JUDET_PROV
PERSOANA_ADRESA_COD_POSTAL
PERSOANA_ADRESA_TARA
PERSOANA_TELEFON
NASTERE_DATA
MOARTE_DATA
PK
PK,FK1
PK,FK2
CLIENT_CONT
CLIENT_CONT_ID
PK
CLIENT_HOLD_IND
DATA_INSCRIS
DATA_TERMINAT
CLIENT_DEPOZIT_SUMA
CARD_CREDIT_LA_DOSAR_INDIC
COPIL_INCHIRIERE_PERMIS_INDIC
CLIENT_TRANZACTIE
TRANZACTIE_ID
CLIENT_CONT_ID
ANGAJAT_PERSOANA_ID
TRANZACTIE_DATA
VANZARI_TAXA
ANGAJAT
PERSOANA_ID
SUPERVISOR_PERSOANA_ID
ANGAJAT_TAXA_ID
ANGAJAT_JOB_CATEGORIE
ANGAJAT_RATA_PE_ORA
ANGAJARE_DATA
INCHIDERE_DATA
PK
33
PK
FK1
PK,FK1
34
35
GALERIE
cod_galerie
#
inclusa_in
M(1)
SALA
cod_sala#
cod_galerie#
1
cuprinsa_in
M(1)
1
ARTIST
creata_de
M(1)
SECURITATE
protejata_prin
M(0)
asigurata_de
M(0)
sistem#
OPERA
cod_opera#
cod_artist#
cod_opera#
POLITA_ASIG
cod_polita#
M(1)
M(1)
M(1)
mentionata_in
studiaza
M(0)
M(0)
SURSA_BIBLIO
cod_sursa#
tip
SPECIALIST
cod_specialist#
ARTICOL
CARTE
figureaza_in
M(0)
EXPOZITIE
M(1)
organizata_de
M(1)
ORGANIZATOR
M(1)
editata_de
cod_expo#
cod_organizator#
M(1)
AUTOR
cod_autor
#
36
37
[<restricie_coloan>]
Componentele din definiia unei coloane sunt:
Numele coloanei - Numele coloanei trebuie s fie unic n cadrul
tabelului.
Tipul de date - Tipul de date trebuie s fie un tip de date valid
pentru implementarea SGBD
Restrictiile coloanei care sunt prezentate n continuare
Structura unui tabel poate fi creat n urmtoarele patru moduri:
fr a indica cheile;
indicnd cheile la nivel de coloan;
indicnd cheile la nivel de tabel;
prin copiere din alt tabel.
M(1)
CARTE
codel#
titlu
autor
pret
nrex
coded
imprumuta
M(0)
apartine
CITITOR
codec#
nume
dep
DOMENIU
coded#
intdom
carte
(codel
CHAR(5),
titlu
VARCHAR2(30),
autor
VARCHAR2(30),
pret
NUMBER(8,2),
nrex
coded
NUMBER(3),
CHAR(5));
38
CREATE TABLE
(codel
titlu
autor
pret
nrex
coded
carte
CHAR(5) PRIMARY KEY,
VARCHAR2(30),
VARCHAR2(30),
NUMBER(8,2),
NUMBER(3),
CHAR(5) NOT NULL
REFERENCES domeniu(coded));
39
40
Constrngeri
Constrngerea este un mecanism care asigur c valorile unei
coloane sau a unei mulimi de coloane satisfac o condiie declarat. Unei
constrgeri i se poate da un nume unic. Dac nu se specific un nume
explicit atunci sistemul automat i atribuie un nume de forma SYS_Cn,
unde n reprezint numrul constrngerii. Constrngerile pot fi terse, pot
fi adugate, pot fi activate sau dezactivate, dar nu pot fi modificate.
Restriciile coloanelor
Restriciile unei coloane limiteaz ntr-un mod oarecare valorile ce
pot fi stocate ntr-o coloan a unui tabel. Restriciile coloanelor pot avea
oricare dintre urmtoarele forme:
Exemplu, crearea tabelului CONT_CLIENT, din baza de date a
magazinului de produse video.
CREATE TABLE CONT_CLIENT
(
ID_CONT_CLIENT INTEGER NOT NULL,
STARE_CONT_CLIENT CHAR(1) DEFAULT N NOT NULL
CHECK (STARE_CONT_CLIENT IN (Y, N)),
DATA_INSCRIERE DATE NOT NULL,
DATA_INCHEIERE DATE NULL,
SUMA_DEPOZIT_CLIENT NUMERIC(5,2) NULL,
IND_CREDIT_CARD CHAR(1) NOT NULL
CHECK (IND_CREDIT_CARD IN (Y, N)),
INDIC_PERMIS_INCHIRIERE_COPIL CHAR(1) NOT NULL
CHECK(INDIC_PERMIS_INCHIRIERE_COPIL IN(Y,N)),
PRIMARY KEY (ID_CONT_CLIENT)
);
Descriere tabel:
ID_CONT_CLIENT - cheie primara
STARE_CONT_CLIENT de tip DA/NU, care indica daca un cont este sau nu
blocat.(inchirierile nu sunt permise pt conturile blocate)
DATA_INSCRIERE - data la care s-a deschis contul in magazin
DATA_INCHEIERE - daca contul a fost inchis contine data; daca contul e activ
contine NULL
41
42
43
Restriciile tabelelor
Restricia unei coloane poate fi rescris i ca restricie a ntregului
tabel, astfel nct clauza care definete restricia s apar n instruciunea
CREATE TABLE dup definiiile tuturor coloanelor, nu dup definiia
unei coloane. Principalul avantaj al restriciilor la nivelul tabelului este c
pot referi mai multe coloane.
Restricia CHECK
[CONSTRAINT nume_restricie] CHECK (condiie)
Restricia de mai jos mpiedic stocarea unei valori negative n
coloana SUMA_DEPOZITE_CLIENT . Operatorul OR permite stocarea
valorilor nule , deoarece o valoare nulA nu este mai mare sau egal cu
zero.
Exemplu:
CONSTRAINT CK_SUMA_DEPOZITE_CLIENT
CHECK (SUMA_DEPOZITE_CLIENT >= 0 OR
SUMA_DEPOZITE_CLIENT IS NULL)
Restricia UNIQUE
[CONSTRAINT nume_restricie) UNIQUE (nume_coloan
[,nume coloan...])
Conform acestei restricii , combinaia de coloane
ID_CONT_CLIENT i DATA_INSCRIERE trebuie s fie unic
n rndurile din tabel.
Exemplu:
CONSTRAINT UK_DATA_INSCR_CONT_CL
UNIQUE (ID_CONT_CLIENT, DATA_INSCRIERE )
CHAR(5),
titlu
VARCHAR2(30),
autor
VARCHAR2(30),
pret
NUMBER(8,2),
nrex
NUMBER(3),
coded
CHAR(5) NOT NULL,
CONSTRAINT cp_carte PRIMARY KEY (codel),
CONSTRAINT ce_coded FOREIGN KEY (coded)
REFERENCES domeniu(coded));
45
Observaii:
Liniile ce nu respect constngerea sunt depuse automat ntr-un
tabel special.
Constrngerile previn tergerea unui tabel dac exist
dependene.
Constrngerile pot fi create o dat cu tabelul sau dup ce acesta
a fost creat.
Constrngerile pot fi activate sau dezactivate n funcie de
necesiti.
Constrngeri declarative pot fi: constrngeri de domeniu,
constrngerea de integritate a entitii, constrngerea de integritate
referenial.
Constrngerile de domeniu definesc valori luate de un atribut
(DEFAULT, CHECK, UNIQUE, NOT NULL).
constrngerea (coloan) DEFAULT ;
constrngerea (coloan sau tabel) CHECK ; constrngerea CHECK la
nivel de tabel poate compara coloane ntre ele, poate face referin la
una sau mai multe coloane, dar nu poate conine subcereri.
Constrngerea la nivel de coloan nu poate referi alte coloane ale
aceluiai tabel.
CREATE TABLE carte
(codel
CHAR(5),
nrex
NUMBER(3),
pret
NUMBER(8,2)
CONSTRAINT alfa
CHECK (pret < nrex),);
La execuia acestei comenzi apare mesajul: ORA 02438: Column
check constraint cannot reference other columns.
Dac dup NUMBER(8,2) se adaug o virgul, atunci
constrngerea va fi la nivel de tabel, iar n aceste caz este permis
referirea altei coloane.
constrngerea (coloan sau tabel) UNIQUE ;
constrngerea declarativ NOT NULL poate fi doar la nivel coloan.
Constrngerea de integritate a entitii precizeaz cheia primar
a unui tabel. Cnd se creeaz cheia primar se genereaz automat un
index unic. Valorile cheii primare sunt distincte i diferite de valoarea
null.
46
47
(ENABLE,
DISABLE)
unor
48
49
51
Pentru a activa
constrngeri:
ALTER TABLE
ENABLE
(ENABLE)
sau
dezactiva
(DISABLE)
nume_tabel
nume_constrangere;
ALTER TABLE
DROP CONSTRAINT
carte
beta;
ALTER TABLE
ADD CONSTRAINT
cititor
cp_cititor
PRIMARY KEY (codec)
DISABLE;
ALTER TABLE
cititor
ENABLE CONSTRAINT cp_cititor;
Stergerea unei coloane se face ca i a unei constringeri;
ALTER TABLE nume_tabel
DROP nume_coloana;
ALTER TABLE CONT_CLIENT
DROP (DATA_CLIENT ,INTRODUSE_DE );
Observaii
Nu se poate specifica poziia unei coloane noi n structura tabelului. O
coloan nou devine automat ultima n cadrul structurii tabelului.
52
Instruciunea DROP
Instruciunea DROP este cea mai simpl dintre instruciunile DDL.
Sintaxa de baz este:
Pentru tergerea unui tabel este utilizat comanda DROP TABLE:
DROP TABLE [nume_schema.]nume_tabel
[CASCADE CONSTRAINTS];
Clauza CASCADE CONSTRAINTS permite suprimarea tuturor
constrngerilor de integritate referenial corespunztoare cheilor primare
i unice din tabelul supus tergerii. Dac se omite aceast clauz i exist
constrngeri de integritate referenial, sistemul returneaz o eroare i nu
suprim tabelul.
Suprimarea unui tabel presupune:
0suprimarea definiiei sale n dicionarul datelor;
0suprimarea indecilor asociai;
0suprimarea privilegiilor conferite n legtur cu tabelul;
0recuperarea spaiului ocupat de tabel;
0permanentizarea tranzactiilor in asteptare;
0invalidarea (dar nu suprimarea) funciilor, procedurilor,
vizualizrilor, secventelor, sinonimelor referitoare la tabel.
Odat executat, instruciunea DROP TABLE este ireversibil. Ca
i n cazul celorlalte instruciuni ale limbajului de definire a datelor,
aceast comand nu poate fi anulat (ROLLBACK).
54
Tipul de obiect specific tipul obiectului care urmeaz s fie ters, cum ar
fi INDEX, TABLE sau VIEW.
Opiunile de tergere sunt specifice fiecrui SGBD. Sintaxa este diferit
de la un productor la altul PostgreSQL i MySQL folosesc n acest
scop cuvntul cheie CASCADE, n timp ce n Oracle trebuie s se
foloseasc CASCADE CONSTRAINTS.
Exemplu:
DROP TABLE COD_CLIENT;
DROP TABLE COD_CLIENT CASCADE CONSTRAINTS; (Oracle)
DROP INDEX IX_TITLU_FILM;
Pentru tergerea ntregului coninut al unui tabel i eliberarea
spaiului de memorie ocupat de acesta, sistemul Oracle ofer
instruciunea:
TRUNCATE TABLE nume_tabel;
DESCRIBE USER_TABLES;
TABLE_NAME
TABLESPACE_NAME
CLUSTER_NAME
PCT_FREE
PCT_USED
INI_TRANS
NITIAL_EXTENT
NEXT_EXTENT
MIN_EXTENTS
MAX_EXTENTS
PCT_INCREASE
BACKED_UP
NUM_ROWS
BLOCKS
EMPTY_BLOCKS
AVG_SPACE
AVG_ROW_LEN
TABLE_LOCK
PARTITIONED
TEMPORARY
NESTED
Numele tabelului
Spaiul tabel n care se afl tabelul
Numele cluster-ului din care face parte tabelul
Procentul de spaiu pstrat liber n interiorul fiecrui
bloc
Procentul de spaiu ce poate fi utilizat n fiecare bloc
Numrul iniial de tranzacii concurente n interiorul
unui bloc
Dimensiunea spaiului alocat pentru prima extensie
Dimensiunea spaiului alocat pentru urmtoarea
extensie
Numrul minim de extensii ce se aloc la crearea
unui tabel
Numrul maxim de extensii ce se aloc la crearea
unui tabel
Procentul cu care crete dimensiunea unei extensii
Y sau N, dup cum tabelului i-a fost fcut o copie de
siguran de la ultima modificare
Numrul de nregistrri din tabel
Numrul de blocuri utilizate de tabel
Numrul de blocuri ce nu conin date
Spaiul mediu liber din tabel
Lungimea medie, n octei, a unei linii
ENABLED (activat) sau DISABLED (dezactivat):
este activat sau nu blocarea tabelului
YES sau NO, indic dac tabelul este partiionat (sau
nu)
Y sau N, indic dac tabelul este temporar (sau nu)
YES sau NO, indic dac tabelul este imbricat (sau
nu)
Exemplu:
SELECT TABLE_NAME, NUM_ROWS, NESTED
FROM USER_TABLES;
Exemplu:
SELECT 'DROP TABLE ' || OBJECT_NAME || ';'
FROM USER_OBJECTS
WHERE OBJECT_TYPE = 'TABLE';
56
57
59
60
61
nume
prenume
Numele indexului
Tipul indexului (NORMAL, LOB, CLUSTER etc.)
Proprietarul tabelului indexat
Numele tabelului indexat
Tipul tabelului indexat (TABLE, CLUSTER etc.)
Starea de unicitate (UNIQUE, NONUNIQUE)
Spaiul tabel n care este stocat indexul
Spaiul alocat pentru prima extensie
Spaiul alocat pentru urmtoarea extensie
Numrul minim de extensii alocate
Numrul maxim de extensii
Procentul cu care cresc extensiile
Nivelul din B-arbore. Acesta arat adncimea indexului de
la ramuri la frunze
Numrul de blocuri frunz din index
Numrul de chei distincte n index
Starea indexului (VALID, INVALID, DIRECT_LOAD)
Numrul de linii utilizate. Acesta nu trebuie s includ
valorile NULL din tabelul de baz
Determin dac indexul este partiionat (YES sau NO)
Determin dac sistemul a generat numele indexului (Y)
sau utilizatorul (N)
63
Exemplu:
S se obin informaii referitoare la indecii tabelului carte.
64
SELECT
FROM
WHERE
AND
a.index_name, a.column_name,
a.column_position poz, b.uniqueness
user_indexes b, user_ind_columns a
a.index_name = b.index_name
a.table_name = CITITOR;
Secvene
Multe aplicaii necesit utilizarea de numere unice ca valori ale
cheilor primare. Pentru a obine astfel de numere, se pot implementa n
aplicaie uniti de program corespunztoare sau se pot utiliza secvene.
De obicei, secvenele sunt utilizate pentru crearea de valori ale
cheii primare care trebuie s fie unice pentru fiecare linie. Secvena este
incrementat sau decrementat de ctre o rutin intern Oracle. Numerele
secvenei sunt stocate i generate independent de tabele. Prin urmare,
aceeai secven poate fi utilizat pentru mai multe tabele.
O secven este un obiect al bazei de date, creat de utilizator. Acest
obiect poate fi folosit de mai muli utilizatori pentru a genera numere
ntregi unice n sistemele multi-utilizator, evitnd apariia conflictelor i a
blocrii.
O secven poate fi creat de un utilizator i poate fi partajat de
mai muli utilizatori.
65
1)
2)
67
Sinonime
68
69
Vizualizri
70
71
72
73
implic
reactualizarea
vederea2
AS SELECT
FROM
vederea2
SET
WHERE
SELECT
job = 'programator'
nume = 'Popescu';
nume, prenume, job FROM
salariat;
vederea2
nume = 'Popescu';
76
77
view
without
vederea4
tip = 'designer'
cod_salariat = 3;
Exemplu:
Care dintre coloanele unei vizualizri sunt actualizabile?
SELECT
column_name, updatable
FROM
WHERE
user_updatable_columns
table_name = 'vederea4';
Exemplu:
1. S se creeze un view (vederea3) care s conin, pentru fiecare
categorie de salariat, salariile medii i numrul de angajai din
tabelul salariat.
2. S se insereze, s se actualizeze i s se tearg o nregistrare n
view.
CREATE VIEW vederea3 (nr, job, salmed)
AS SELECT
COUNT(*), job, AVG(salariu)
FROM
salariat
GROUP BY
job;
Nu se pot face inserri, actualizri sau tergeri ntr-un view ce
conine funcii grup. Dup oricare din aceste operaii apare acelai mesaj:
ORA-01732: data manipulation operation not legal
on this view
Exemplu:
S se creeze o vizualizare care s conin coloanele
cod_contractant, adresa, telefon din tabelul contractant i coloanele
nr_contract, tip_contract, data_incheiere din tabelul contract. S se
insereze o nregistrare n vizualizare.
CREATE VIEW vederea44
AS SELECT
c.cod_contractant, adresa, telefon,
co.nr_contract, tip_contract,
data_incheiere
FROM
contractant c, contract co
WHERE
c.cod_contractant=co.cod_contractant;
La inserarea unei nregistrri creia i se specific valorile tuturor
cmpurilor din ambele tabele:
78
INSERT INTO
vederea44(cod_contractant, adresa,
nr_contract,
data_incheiere)
VALUES
(200, 'Str. Marmurei, 14', '6235',
TO_DATE('January 03,2002','Month
dd,yyyy'));
se obine eroarea:
ORA-01779: cannot modify a column which maps to a
non key-preserved TABLE
Cele dou tabele de baz, contractant i contract, se afl ntr-o
relaie one-to-many, iar view-ul creat conine cheile primare din ambele
tabele.
Doar tabelul contract este protejat prin cheie i, prin urmare, doar
el poate fi modificat prin intermediul view-ului. Aceasta, deoarece ar
putea exista mai multe nregistrri n view, cu aceeai valoare
corespunztoare cmpului cod_contractant (CP n contractant).
Exact aceeai eroare se obine dac ncercm inserarea unei
nregistrri n vederea44, specificnd fie i numai un cmp provenind din
tabela contractant (indiferent dac el conine sau nu CP).
Singura operaie de inserare permis este aceea efectuat prin
specificarea cheilor provenind doar din tabelul contract. Astfel, prin
executarea comenzii:
INSERT INTO vederea44(nr_contract, tip_contract)
VALUES
('6234', 0);
este creat o nregistrare, dar este modificat i tabelul contract. Dac la
inserie nu se specific cheia primar din contract:
INSERT INTO vederea44(tip_contract)
VALUES
(1);
ORA-01400: mandatory (NOT NULL) column is missing
or NULL during insert
Cererea din definiia vizualizrii poate fi restricionat prin clauzele
WITH READ ONLY i WITH CHECK OPTION. Opiunea WITH READ
ONLY asigur c nu pot fi efectuate operaii LMD asupra vizualizrii.
Constrngerea WITH CHECK OPTION garanteaz faptul c va fi
permis, prin intermediul vizualizrii, numai inserarea sau actualizarea de
linii accesibile acesteia (care sunt selectate de cerere). Prin urmare,
aceast opiune asigur constrngeri de integritate i verificri asupra
validitii datelor inserate sau actualizate.
Opiunea WITH CHECK OPTION nu poate funciona dac:
exist o cerere imbricat n cadrul subcererii vizualizrii sau n
vreuna dintre vizualizrile de baz;
79
UPDATE
SET
WHERE
artist_roman
nationalitate = 'engleza'
cod_artist = 25;
80
opera_artist
(cod_opera,
titlu,
82
83
[ALL | DISTINCT]
{* | list de atribute selectate | expr AS alias}
{ [schema.]tabel [alias_tabel] }
condiie]
list de expresii
condiie]]
{expresie | poziie | c_alias} [ASC | DESC]]
n
exemplul
urmtor
se
selecteaz
coloanele:
COD_GEN_FILM, MPAA_RATING_COD i TITLU_FILM din
tabelul FILM.
SELECT COD_GEN_FILM, COD_ RATING, TITLU_FILM
FROM FILM;
Pseudonime pentru numele coloanelor
In setul de rezultate din interogri numele coloanelor din tabel
apare automat ca titlu de coloane n interogare. Dac se dorete un alt
nume pentru coloanele unei interogri se folosesc pseudonime.
Pseudonimele (aliases) specificate devin numele coloanelor din setul
de rezultate. Pseudonimele nu exist dect dup rularea instruciunii SQL,
aa c nu pot fi folosite n alte pri ale instruciunii SQL. Pseudonimul
unei coloane este specificat prin plasarea cuvntului cheie AS" dup
numele coloanei n lista SELECT (cu cel puin un spaiu nainte i dup),
urmat de numele dorit pentru a fi atribuit coloanei n setul de rezultate.
SELECT COD_GEN_FILM AS GEN, MPAA_RATING_COD AS
RATING, TITLU_FILM AS FILM
FROM FILM;
Sortarea rezultatelor
Rezultatele interogrilor sunt deseori mult mai utile dac se
specific pentru rndurile returnate o ordine care s aib o semnificaie
pentru persoana sau aplicaia care folosete informaiile. n SQL, acest
lucru este fcut prin adugarea n instruciunea SELECT a clauzei ORDER
BY, cu o list de una sau mai multe coloane care vor fi folosite pentru
sortarea rndurilor n ordine ascendent sau descendent, n conformitate cu
valorile datelor din coloane. De asemenea, se ine seama de urmtoarele
aspecte:
Ordinea prestabilit pentru fiecare coloan este ascendent, dar se
poate aduga cuvntul cheie ASC dup numele coloanei pentru obinerea
unei ordonri ascendente sau cuvntul cheie DESC pentru obinerea unei
ordonri 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 gsi cea mai bun cale de ordonare a
coloanelor. n general, sortarea datelor este un proces costisitor din punct
de vedere al resurselor de calcul, aa c majoritatea sistemelor SGBD
folosesc un index pentru accesul la rnduri n ordinea dorit, presupunnd
c exist, i fac o sortare propriu-zis numai ca ultim soluie.
Se poate folosi pseudonimele coloanelor n clauza ORDER BY,
dar dac se face acest lucru se foreaz motorul SQL s sorteze rezultatele
abia dup rularea interogrii.
n locul coloanelor, se poate specifica n lista de ordonare poziia
relativ a coloanelor. De exemplu, clauza ORDER BY 1,2 va sorta
rezultatele n ordine ascendent dup primele dou coloane din setul de
rezultate. Numrul specificat nu are nici o legtur cu poziia coloanei n
tabelul sau vizualizarea surs. Aceast opiune nu este agreat n
programarea SQL formal, deoarece dac ulterior cineva modific
interogarea, este posibil s amestece coloanele din lista SELECT, fr si dea seama c astfel schimb i coloanele folosite pentru sortarea
rezultatelor.
Exemplu:
SELECT MPAA_RATING_COD AS RATING,
COD_GEN_FILM AS GEN, TITLU_FILM AS FILM
FROM FILM
ORDER BY MPAA_RATING_COD, COD_GEN_FILM ;
Dac dorim s ordonm acum cresctor dup rating i descresctor
dup gen, atunci instruciunea de mai sus modificat va fi
SELECT MPAA_RATING_COD AS RATING,
COD_GEN_FILM AS GEN, TITLU_FILM AS FILM
FROM FILM
ORDER BY
MPAA_RATING_COD ASC, COD_GEN_FILM DESC;
Observaie:
Oracle va afia titlu de coloana la dimensiunea maxim a valorilor
din coloana(de ex. dac n coloana RATING val cea mai mare este de 5
caractere, interogarea va afia RATIN). n noua versiune de SQL produs
de Oracle, iSQL*Plus, nu mai prescurteaz.
Exemplu :
SELECT titlu, autor, pret, coded as domeniu
from carte
order by coded, autor;
SELECT titlu, autor, pret, coded as domeniu
from carte
order by coded desc, pret;
Se observa ca domeniu este trunchiat la 5 caractere, DOMEN
Operatori de comparare
Operatori conjuctivi
Operatori logici
Operatori aritmetici
Operatori de comparare
Operator
=
<
<=
>
>=
!=
<>
Descriere
Egal cu
Mai mic dect
Mai mic sau egal
Mai mare dect
Mai mare sau egal
Diferit de
Diferit de (standard ANSI)
Operatori conjunctivi
Uneori sunt necesare condiii multiple pentru a ngusta setul de
rezultate al unei interogri. Atunci cnd sunt folosite mai multe condiii,
ele trebuie s fie combinate din punct de vedere logic n clauza WHERE,
iar aceasta este sarcina operatorilor conjunctivi. Aceti operatori sunt:
AND (I) - Clauza WHERE este evaluat ca adevrat" dac
toate condiiile conectate cu operatorul AND sunt adevrate.
OR (SAU) - Clauza WHERE este evaluat ca adevrat" dac
oricare din condiiile conectate cu operatorul OR este adevrat.
Operatorul AND are prioritate mai mare i, ca urmare, este evaluat
naintea operatorilor OR.
Exemple de folosire a operatorilor conjunctivi:
S se afieze toate filmele pentru care categoria RATING este PG13 i preul de vnzare cu amnuntul pentru formatul DVD este
19.99 sau mai mic, n ordinea cresctoare a preurilor.
SELECT COD_RATING AS RATING,
PRET_VANZARE_DVD AS PRET, TITLU_FILM
FROM FILM
WHERE COD_RATING = 'PG-13'
AND PRET_VANZARE_DVD <= 20.00
ORDER BY PRET_VANZARE_DVD;
S se afieze toate filmele pentru care categoria RATING este PG13 sau preul de vnzare cu amnuntul pentru formatul DVD este
19.99 sau mai mic, n ordinea cresctoare a preurilor.
SELECT COD_RATING AS RATING,
PRET_VANZARE_DVD AS PRET,
TITLU_FILM
FROM FILM
WHERE COD_RATING = 'PG-13' OR
PRET_VANZARE_DVD <= 20
ORDER BY PRET_VANZARE_DVD;
IS NULL
Operatorul IS NULL este folosit pentru a determina dac o valoare
este nul.
Exemple:
S se gseasc toate conturile de clieni active, adic toate conturile
pentru care coloana DATATERMINATA conine 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 afieze toate filmele cu preul de vnzare cu amnuntul pentru
formatul DVD ntre 14.99 i 19.99, ordonate cresctor 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*(pattern), returnnd valoarea logic adevrat dac
valoarea de tip caracter se ncadreaz n tipar i fals" n caz contrar.
Pentru definirea tiparului pot fi folosite dou caractere de nlocuire:
Liniua de subliniere (_) - Caracterul liniu de subliniere poate fi
folosit drept caracter de nlocuire poziional, ceea ce nseamn c se
potrivete cu orice caracter aflat pe poziia respectiv n irul de
caractere evaluat.
Procent (%) - Simbolul procent (%) poate fi folosit drept caracter
de nlocuire nepoziional, ceea ce nseamn c se potrivete cu
orice numr de caractere, indiferent de lungime, reprezentnd orice
secven de zero sau mai multe caractere, i _, reprezentnd un
singur caracter.
Exemple de tipare:
Tipar
Now%
N_w
Interpretare
Se potrivete cu orice ir de caractere care incepe cu
Now".
Se potrivete cu orice ir de caractere format din
exact trei caractere, care ncepe cu N" i se termin
cu w".
10
%N-w%
%Now%
%Now
11
IN
Operatorul IN este folosit pentru a determina dac o valoare face
parte dintr-o list de valori. Lista poate fi specificat ca valori literale,
folosind o list de valori separate prin virgule i ncadrate ntre paranteze,
sau poate fi selectat din baza de date folosind o subselecie (o
subinterogare), care este o interogare n cadrul unei alte interogri.
Exemple de utilizare a operatorului IN:
S se afieze toate filmele pentru care COD_GEN_FILM este
Drama, Forgn.
SELECT COD_GEN_FILM AS GEN, TITLU_FILM
FROM FILM
WHERE COD_GEN_FILM IN ('Drama', 'Forgn')
ORDER BY COD_GEN_FILM, TITLU_FILM;
S se afieze toate filmele pentru care descrierea genului conine
cuvntul and". Avei nevoie de o subinterogare prin care s
gsii toate valorile COD_GEN_FILM care conin cuvntul
and" n descriere. Operatorul IN este apoi folosit pentru a gsi
filmele care au unul dintre codurile selectate de subinterogare.
SELECT COD_GEN_FILM AS GEN, TITLU_FILM
FROM FILM
WHERE COD_GEN_FILM IN
(SELECT COD_GEN_FILM
FROM GEN_FILM
WHERE GEN_FILM DESCRIPTION LIKE '% and %')
ORDER BY COD_GEN_FILM AS GEN, TITLU_FILM;
S se afieze toate cartile din domeniile Isi M.
SELECT TITLU, AUTOR
FROM CARTE
WHERE CODED IN(I,M);
12
EXISTS
Operatorul EXISTS este folosit pentru a detemina dac o
subinterogare conine nregistrri. Dac n setul de rezultate al
subinterogrii nu exist nici un rnd, operatorul returneaz valoarea
false; dac setul de rezultate conine cel puin un rnd, valoarea devine
adevrat.
Exemple de utilizare a operatorului EXIST:
Proprietarul magazinului a auzit c filmul The Last Samurai se
nchiriaz bine att n format DVD, ct i-n format VHS i vrea s
se asigure c n inventarul magazinului exist o copie VHS.
Tabelul FILM_COPIAT conine un rnd pentru fiecare copie a
unui film din inventarul magazinului, aa c putei folosi o
subinterogare pentru a afla dac exist copii VHS ale filmului n
inventar. De cele mai multe ori, operatorul EXISTS este folosit in
conjuncie 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 rndurile 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 inversai logica, folosind operatorul NOT EXISTS, putei
afia 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);
13
Operatori aritmetici
n SQL, operatorii aritmetici sunt folosii 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:
Operator
+
*
/
Descriere
Adunare
Scdere
nmulire
mprire
14
16
17
LENGTH
Funcia LENGTH returneaz lungimea unui ir de caractere.
Microsoft SQL Server i Sybase Adaptive Server folosesc numele LEN
pentru versiunea proprie a acestei funcii.
Exemple:
S se afieze lungimea titlului pentru filmul a crui valoare
ID_FILM este 1. Presupunem c folosii o baz de date oracle,
DB2 sau MySQL.
18
Funcie
ABS
COS
EXP
POWER
SIN
TAN
Descriere
Valoarea absolut a unui numr dat
Cosinusul trigonometric al unui unghi specificat n radiani
Valoarea exponenial a unui numr dat
Ridic un numr la o putere (numrul i puterea sunt fumizate
ca parametri)
Sinusul trigonometric al unui unghi specificat n radiani
Tangenta trigonometric a unui unghi specificat n radiani
Funcii de conversie
Funciile de conversie transform date dintr-un tip de date n altul.
CAST
Funcia CAST transform date dintr-un tip de date n altul. Iat
sintaxa general a funciei CAST, urmat de un exemplu:
CAST (expresie AS tip de date)
Afiati preul pentru formatul DVD al filmului The Last Samurai,
cu un simbol dolar n faa sumei. Valoarea numeric trebuie s fie
convertit ntr-un ir de caractere pentru a putea fi concatenat cu o
valoare literal coninnd simbolul dolar.
SELECT '$' ||
CAST(PRET_VANZARE _DVD
AS
VARCHAR(6)) AS PRET
FROM FILM
WHERE TITLU_FILM = 'The Last Samurai';
19
deptno, MAX(sal)
FROM
GROUP BY
HAVING
emp
deptno
MAX(sal)>5000;
21
Exemplu:
SELECT
MAX(AVG(pret))
FROM
GROUP BY
carte
autor;
Exemplu:
S se afieze numele i salariul celor mai prost pltii angajai
din fiecare departament.
SELECT
FROM
WHERE
ename, sal
emp
(deptno, sal) IN
(SELECT deptno, MIN(sal)
FROM emp
GROUP BY deptno);
Exemplu:
S se obin pentru fiecare carte, codul su i numrul de
exemplare care nu au fost nc restituite.
SELECT
FROM
codel, COUNT(*)
imprumuta
WHERE
dataef IS NULL
GROUP BY codel;
Exemplu:
S se obin numrul crilor mprumutate cel puin o dat.
SELECT COUNT(DISTINCT codel)
FROM
imprumuta;
Exemplu:
S se afieze numrul crilor mprumutate cel puin de dou ori
(pentru fiecare carte mprumutat mai mult dect o dat s se obin
numrul de cte ori a fost mprumutat).
SELECT
FROM
GROUP BY
HAVING
COUNT(COUNT(codel))
imprumuta
codel
COUNT(*)>1;
22
100
110
6
2
8 rows selected.
Se afiseaza numarul departamentelor cu mai mult de un angajat.
1 select count(count(*))
2 from employees
3 group by department_id
4* having count(*)>1
SQL> /
COUNT(COUNT(*))
--------------8
Exemplu:
Sa se afiseze numrul de cri imprumutate din fiecare domeniu.
SELECT d.intdom, COUNT(*)
FROM domeniu d, carte c, imprumuta I
WHERE c.codel = i. codel
AND c.coded = d.coded
GROUP BY intdom;
Exemplu:
Lista codurilor cititorilor care au mai mult de 3 cri nerestituite la
termen.
SELECT
codec
FROM
imprumuta
WHERE
dataef IS NULL AND datares < SYSDATE
GROUP BY codec
HAVING COUNT(*) > 2;
Exemplu:
Pentru fiecare domeniu de carte care conine cel puin o carte i
unde preul oricrei cri nu depete o valoare dat, s se obin: codul
domeniului, numrul crilor din domeniu i numrul mediu de
exemplare.
SELECT coded, COUNT(*), AVG(nrex)
FROM
carte
GROUP BY coded
24
HAVING
AND
COUNT(*) >= 1
MAX(pret) < &pret_dat;
Exemplu:
Codurile domeniilor care nu contin carti.
SELECT
coded
FROM
carte
GROUP BY coded
HAVING COUNT(*) = 0;
Nu este corect, deoarece se iau in considerare NUMAI codurile
domeniilor care apar in tabelul CARTE.
SELECT
intdom
FROM
domeniu d
WHERE 0 = (SELECT COUNT(*)
FROM carte
WHERE coded = d.coded);
Urmatoarea cerere este corecta?
SELECT intdom
FROM
domeniu d,(SELECT coded, COUNT(*) a
FROM carte
GROUP BY coded) b
WHERE b.coded = d.coded)
AND b.a = o;
Exemplu:
n ce interogri este necesar utilizarea cuvntului cheie
HAVING?
A.
B.
C.
D.
25
EXCEPT
EXCEPT este operatorul standard ANSI/ISO care gsete
diferenele dintre dou seturi de rezultate, returnnd, n esen, valorile
26
din prima interogare care nu apar n cea de-a doua interogare. Foarte
puine sisteme DBMS implementeaz acest operator. n unele
implementri, precum Oracle, operatorul se numete MINUS, nu
EXCEPT.
27
n mod implicit, pentru toi operatorii cu excepia lui UNION ALL, rezultatul
este ordonat cresctor dup valorile primei coloane din clauza SELECT.
Pentru o cerere care utilizeaz operatori pe mulimi, cu excepia lui UNION
ALL, server-ul Oracle elimin liniile duplicat.
n instruciunile SELECT asupra crora se aplic operatori pe mulimi,
coloanele selectate trebuie s corespund ca numr i tip de date. Nu este necesar
ca numele coloanelor s fie identice. Numele coloanelor din rezultat sunt
determinate de numele care apar n clauza SELECT a primei cereri.
n cazul n care cererile componente selecteaz date de tip caracter, tipul
de date al valorii returnate poate fi CHAR, dac valorile selectate de ambele
cereri sunt de tip CHAR, sau VARCHAR2, dac valorile selectate de cel puin
una din cele dou cereri sunt de tip VARCHAR2.
Observaii:
Comenzile SELECT, care intervin n cereri ce conin operatori pe mulimi,
trebuie s satisfac anumite condiii:
toate comenzile SELECT trebuie s aib acelai numr de coloane;
opiunea DISTINCT este implicit (excepie UNION ALL);
numele coloanelor sunt cele din prima comand SELECT;
dimensiunea coloanei implicit este cea mai mare dintre cele dou coloane;
sunt admise combinaii de forma:
1.
SELECT1 UNION SELECT2 INTERSECT SELECT3 i ordinea de
execuie este de la stnga la dreapta;
2.
SELECT1 UNION (SELECT2 INTERSECT SELECT3) i ordinea
este dat de paranteze.
UNION
Operatorul UNION adaug rndurile din setul de nregistrri al unei
interogri la cel al unei alte interogri i, n acelai timp, elimin rndurile
duplicate, ntr-un mod similar cu cel al cuvntului cheie DISTINCT.
Operatorul UNION returneaz deci toate liniile selectate de dou cereri,
eliminnd duplicatele. Operaia este permis numai dac interogrile sunt
compatibile din punctul de vedere al uniunii, ceea ce nseamn c au acelai numr
de coloane i c tipurile de date ale coloanelor corespondente sunt compatibile.
Acest operator nu ignor valorile null i are preceden mai mic dect operatorul
IN.
Exemplu:
S se afieze pe o singur coloan toate valorile nenule pentru taxa de
inchiriere i taxa de ntrziere din tabelul FILM_NCHIRIAT.
SELECT taxa_inchiriat AS TAXA
FROM FILM_INCHIRIAT
WHERE taxa_inchiriat IS NOT NULL UNION
SELECT taxa_intarziere AS TAXA
FROM FILM_INCHIRIAT
WHERE taxa_intarziere IS NOT NULL;
Exemplu:
S se afieze codurile operelor de art pentru care a fost ncheiat o poli
de asigurare sau care beneficiaz de un sistem de securitate. Fiecare cod va fi
afiat o singur dat.
SELECT
FROM
UNION
SELECT
FROM
cod_opera
polita_asig
cod_opera
securitate;
UNION ALL
Operatorul UNION ALL funcioneaz la fel ca i operatorul UNION,
exceptnd faptul c rndurile duplicate nu sunt eliminate.
Precizrile fcute asupra operatorului UNION sunt valabile i n cazul
operatorului UNION ALL. n cererile asupra crora se aplic UNION ALL nu poate
fi utilizat cuvntul cheie DISTINCT.
Exemplu:
S se determine codul operelor de art pentru care s-a ncheiat o poli de
asigurare sau pentru care s-a achiziionat un sistem de securitate. S se afieze
firma i data contractrii, respectiv a instalrii sistemului. ntruct o oper poate
avea mai multe polie de asigurare sau mai multe sisteme de securitate
ncheiate, respectiv instalate la aceeai firm i dat, nu se vor suprima liniile
duplicat. Rezultatul va fi ordonat dup codul operelor.
SELECT cod_opera, firma, semnat_contract
FROM polita_asig
UNION ALL
SELECT cod_opera, firma, data_inst
FROM polita_asig
ORDER BY cod_opera;
Clauza ORDER BY poate aprea numai o singur dat ntr-o cerere compus.
Dac se utilizeaz, clauza trebuie plasat la sfritul cererii i accept nume de
coloane, alias-uri sau notaia poziional. Numele de coloane i alias-urile din
clauza ORDER BY trebuie s fie din lista SELECT a primei instruciuni.
INTERSECT
Operatorul INTERSECT gsete valorile selectate dintr-o interogare, care
apar i ntr-o alt interogare. n esen, gsete intersecia valorilor din cele dou
interogri. Acest operator nu ignor valorile null.
Totui, doar un numr mic de sisteme DBMS (cele mai importance fiind
Oracle i DB2) implementeaz acest operator. Nu-1 vei gsi n Microsoft SQL
Server sau MySQL.
Exemplu:
Exist n tabelul FILM filme pentru care preul pentru DVD este egal cu
preul pentru VHS?
SELECT taxa_inchiriat AS TAXA
FROM FILM_INCHIRIAT
WHERE taxa_inchiriat IS NOT NULL
INTERSECT
SELECT taxa_intarziere AS TAXA
FROM FILM_INCHIRIAT
WHERE taxa_intarziere IS NOT NULL;
Exemplu:
S se afieze codul operelor de art, respectiv data la care s-a ncheiat o
poli de asigurare i s-a instalat un sistem de securitate.
SELECT cod_opera, semnat_contract
FROM polita_asig
INTERSECT
SELECT cod_opera, data_inst
FROM securitate;
Exemplu:
S se obin, utiliznd operatorul INTERSECT, codurile crilor din care sunt
mai puin de 15 exemplare i care au fost mprumutate de cel puin trei ori.
SELECT codel
FROM
carte
WHERE
nrex < 15
INTERSECT
SELECT codel
FROM
imprumuta
GROUP BY codel
HAVING COUNT(*) > 3;
MINUS
Operatorul MINUS sau EXCEPT gsete diferenele dintre dou seturi de
rezultate, returnnd, n esen, valorile din prima interogare care nu apar n cea dea doua interogare. Pentru ca operatorul MINUS s funcioneze, este necesar ca
toate coloanele din clauza WHERE s se afle i n clauza SELECT. Foarte puine
sisteme DBMS implementeaz acest operator. n unele implementri, precum
Oracle, operatorul se numete MINUS, nu EXCEPT.
Exemplu:
S se determine codul i valoarea operelor de art al cror pre nu este de
20 de ori mai mare dect valoarea poliei de asigurare.
SELECT cod_opera, valoare
FROM opera
MINUS
SELECT cod_opera, valoare*20
FROM polita_asig;
Exemplu:
S se afieze codurile cititorilor care nu au mprumutat cri.
SELECT codec
FROM
cititor
MINUS
SELECT DISTINCT codec
FROM
imprumuta;
Operatorii pe mulimi pot fi utilizai n subcereri. Coloanele care apar n
clauza WHERE a interogrii trebuie s corespund, ca numr i tip de date, celor
din clauza SELECT a subcererii.
Exemplu:
S se determine codul operelor de art, codul autorilor i titlul pentru
operele a cror valoare este mai mare dect 5000 sau pentru cele avnd valoarea
de 20 de ori mai mare dect cea a poliei de asigurare.
SELECT cod_opera, cod_artist, titlu
FROM opera
WHERE (cod_opera, valoare)
IN (SELECT cod_opera, valoare
FROM opera
WHERE valoare > 5000
UNION
SELECT cod_opera, valoare*20
FROM polita_asig);
Drama
ActAd
Comedie
ActAd
ActAd
ActAd
Drama
ActAd
ActAd
Drama
Rmce
Comedie
Comedie
Drama
Drama
Comedie
Rmce
Drama
ActAd
Forgn
FILM_TITLU
Mystic River
The Last Samurai
Something's Gotta Grve
The Italian
Kill Bill: Voi. 1
Pirates of the Caribbean: Trie Curse of the Black Pearl
Big Fish
Man on Fire
Master and Commander The Far Side of the World
LosI n Translation
Two Weeks Notice
50 First Dates
Matchstick Men
Cold Mountain
Road to Perdition
The School of Rock
13 Going on30
Monster
The Day After Tomorrow
Das Boot
FILM_GEN_DESCRIERE
Actiune
Animatie
Copii i Familie
Clasic
Comedie
Documentar
Drama
Strain
Horror
Independent
Muzical
Romance(Romantic, Idila)
Stiintifico-Fantastic
Sport
Groaza
Uniuni (join)
O uniune (join) este o operaie ntr-o baz de date relaionale care combin
coloane din dou sau mai multe tabele n rezultatele unei singure interogri. O
uniune apare de fiecare dat cnd clauza FROM a unei instruciuni 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;
FILM_ID
GEN
FILM_TITLU
1
Actiune i Aventura
Mystic River
1
Animatie
Mystic River
1
Clasic
Mystic River
1
Documentar
Mystic River
1
Strain
Mystic River
1
Independent
Mystic River
1
Groaza
Mystic River
1
Sport
Mystic River
1
SF
Mystic River
1
Musical
Mystic River
1
Horror
Mystic River
1
Drama
Mystic River
1
Comedie
Mystic River
1
Copii i Familie
Mystic River
1
Actiune i Aventura
The Last Samurai
2
Thriller
The Last Samurai
2
Sport
The Last Samurai
2
SF
The Last Samurai
2
Romantic
The Last Samurai
2
Musical
The Last Samurai
2
Independent
The Last Samurai
2
Horror
The Last Samurai
2
Animatie
The Last Samurai
2
Copii i Familie
The Last Samurai
2
Documentar
The Last Samurai
2
Strain
The Last Samurai
2
Drama
The Last Samurai
2
Comedie
The Last Samurai
2
Clasic
The Last Samurai
..
...
...............
Setul de rezultate al interogrii a fost trunchiat dup primele dou titluri de
filme. Problema este c am cerut bazei de date s uneasc tabelele, dar nu i-am
spus care este corespondena dintre rndurile celor dou tabele. Rezultatul este
cunoscut sub numele de produs cartezian (dup numele filozofului i
matematicianului francez Rene Descartes) i, n bazele de date relaionale, este un
set de rezultate obinut prin uniunea dintre fiecare rnd al unui tabel cu fiecare rnd
dintr-un alt tabel.
FILM_GEN
FILM_TITLU
Drama
Mystic River
Actiune i Aventura
Comedie
Actiune i Aventura
Actiune i Aventura
6
7
8
9
10
11
12
Actiune i Aventura
Drama
Actiune i Aventura
Actiune i Aventura
Drama
Romantic
Comedie
13
14
15
16
17
18
19
20
Comedie
Drama
Drama
Comedie
Romantic
Drama
Actiune i Aventura
Strain
Matchstick Men
Cold Mountain
Road to Perdition
The School of Rock
13 Going on 30
Monster
The Day After Tomorrow
Das Boot
Exemplu:
S se obin codurile i titlurile crilor mprumutate.
SELECT carte.codel, titlu
FROM
carte, imprumuta
WHERE
carte.codel = imprumuta.codel;
Folosirea numelor complete ale tabelelor pentru specificarea coloanelor
poate fi obositoare i consumatoare de timp, mai ales deoarece numele tabelelor
pot avea 30 sau mai multe caractere n sistemele DBMS moderne. Din aceast
cauz, n SQL este permis i folosirea pseudonimelor (aliases) pentru numele
tabelelor. Acestea funcioneaz la fel ca i pseudonimele coloanelor din clauza
SELECT, exceptnd faptul c nu este folosit cuvntul cheie AS" (n cele mai
multe implementri SQL) - doar lsai un spaiu ntre numele tabelului i
pseudonim n lista FROM. Dei unii folosesc mnemonice pentru pseudonimul
tabelelor, este mult mai des ntlnit folosirea secvenelor de majuscule (adic A",
B,C i aa mai departe). Dup ce se asociaz un pseudonim unui nume de tabel
n clauza FROM, trebuie s folosii pseudonimul n locul numelui de tabel n
ntreaga instruciune SQL. Folosirea pseudonimelor n clauza SELECT poate prea
puin ciudat la nceput deoarece folosii un pseudonim nainte de a-l defini (clauza
SELECT precede clauza FROM i s-ar putea s par mai simplu s completai
clauza FROM nainte de a completa lista de coloane din clauza SELECT atunci
cnd scriei instruciunile SQL.
Exemplul urmtor prezint instruciunea anterioar, dup adugarea
pseudonimelor pentru numele tabelelor. Dei nu era necesar, pseudonimele au fost
adugate i n lista de coloane din clauzele SELECT i ORDER BY, pentru a va
arta cum sunt folosite.
Exemplu:
SELECT A.FILM_ID, B.FILM_GEN_DESCRIERE AS GEN, A.FILM_TITLU
FROM
FILM A, FILM_GEN B
WHERE A.FILM_GEN_COD = B.FILM_GEN_COD
ORDER BY A.FILM_ID;
Exemplu:
a) S se afieze informaii despre operele de art achiziionate n 2008 i
galeriile n care au fost expuse.
SELECT cod_opera, titlu, o.cod_galerie, nume_galerie, adresa
FROM opera o, galerie g
WHERE o.cod_galerie = g.cod_galerie
AND TO_CHAR(data_achizitiei, 'yyyy') = '2008';
b) S se afieze informaii referitoare la operele de art, artitii care le-au
creat i galeriile n care sunt expuse.
SELECT cod_opera, titlu, data_crearii,
a.cod_artist, nume, prenume,
g.cod_galerie, nume_galerie, adresa
FROM opera o, galerie g, artist a
WHERE o.cod_artist = a.cod_artist
AND
o.cod_galerie = g.cod_galerie;
S-ar putea ca tabelele legate prin operaia de compunere s nu aib coloane
comune (non-equijoin). n acest caz n clauza WHERE nu apare operatorul
egalitate i sunt folosii operatorii: <=, >=, BETWEEN.
Un self join realizeaz compunerea unui tabel cu el nsui.
Exemplu:
S se obin pentru fiecare salariat numele, salariul i grila de salarizare (
join).
SELECT
FROM
WHERE
Exemplu:
S se obin titlurile i preurile crilor mai scumpe dect cartea avnd titlul
Baze de date, al crui autor este POPA (self join).
SELECT
FROM
WHERE
AND
AND
x.titlu, x.pret
carte x, carte y
x.pret > y.pret
y.titlu = Baze de date
y.autor = POPA;
Exemple:
JOIN cu condiie ON:
SELECT FILM_ID, FILM_GEN_DESCRIERE AS GEN, FILM_TITLU
FROM FILM JOIN FILM_GEN ON
FILM.FILM_GEN_COD = FILM_GEN.FILM_GEN_COD
ORDER BY FILM_ID;
JOIN cu pseudonime n loc de nume de tabele:
SELECT FILM_ID, FILM_GEN_DESCRIERE AS GEN, FILM_TITLU
FROM FILM A JOIN FILM_GEN B ON
A.FILM_GEN_COD = B.FILM_GEN_COD
ORDER BY FILM_ID;
JOIN folosind cuvntul cheie USING (n locul condiiei ON) o scurtatur
elegant atunci cnd coloanele din cele dou tabele au acelai nume (nu e
recunoscut de toate SGBD-urile).
SELECT FILM_ID, FILM_GEN_DESCRIERE AS GEN, FILM_TITLU
FROM FILM JOIN FILM_GEN USING (FILM_GEN_COD)
ORDER BY FILM_ID;
JOIN cu cheie extern pe mai multe coloane.
Aceast interogare afieaz lista cu copiile filmelor din tabelul FILM_COPY
care nu au fost vndute (coloan DATA_VANZARE conine o valoare nul dac
nu a fost vndut) i care au fost nchiriate (uniune cu tabelul FILM_INCHIRIAT)
dar nu au fost nc returnate (coloan RETUR_DATA conine o valoare nul pn
la returnarea filmului).
SELECT FILM_ID, COPY_NUMAR, DATA_RETURNARII
FROM FILM_COPY JOIN FILM__INCHIRIAT
USING (FILM_ID, COPY_NUMAR)
COPY_NUMAR
2
2
1
2
1
1
DATA_RETURNARII
02/27/2009
03/04/2009
02/27/2009
02/19/2009
03/04/2009
03/04/2009
Uniunile pot implica mai mult de dou tabele. Exemplul urmtor prezint o
uniune natural care obine coloana FILM_ID din tabelul FILM, coloana
FILM_GEN_DESCRIERE din tabelul FILM_GEN
i din tabelul
MPAA_RATING, coloana MPAA_RATING_DESCRIERE , pentru primele trei
filme din tabelul FILM. Folosirea clauzei WHERE permte s se elimine din setul
de rezultate rndurile de care nu avem nevoie.
Exemplul folosete dou clauze JOIN. Prima clauz JOIN cere motorului
SQL s lege tabelele FILM i FILM_GEN, iar a dou clauz JOIN i cere s lege
rndurile deja unite (n esen, un set de rezultate intermediar) cu tabelul
MPAA_RATING.
SELECT FILM_ID, FILM_GEN_DESCRIERE AS GEN,
MPAA_RATING_COD AS RATING, MPAA_RATING_DESCRIERE AS
RATING_DESC
FROM FILM NATURAL JOIN FILM_GEN NATURAL JOIN
MPAA_RATING
WHERE
FILM_ID < 4 ORDER BY FILM_ID;
FILM_ID
RATING
RATING_DESC
Aciune si Aventura R
Comedie
GEN
Drama
PG-13
O uniune extern (outer join) - pentru care un nume mai potrivit ar fi uniune
inclusiv - include n setul de rezultate i rndurile pentru care nu exist legturi
din cel puin unul dintre tabele. Atunci cnd exist rnduri fr legturi, datele
selectate din tabelul n care nu a fost gsit o legtur primesc valoarea nul.
Un outer join este utilizat pentru a obine n rezultat i nregistrrile care nu
satisfac condiia de join. Operatorul pentru outer join este semnul plus inclus ntre
paranteze (+), care se plaseaz n acea parte a condiiei de join care este deficient
n informaie. Efectul acestui operator este de a uni liniile tabelului care nu este
deficient n informaie i crora nu le corespunde nici o linie n cellalt tabel cu o
linie cu valori null. Operatorul (+) poate fi plasat n orice parte a condiiei de join,
dar nu n ambele pri.
O condiie care presupune un outer join nu poate utiliza operatorul IN i nu
poate fi legat de alt condiie prin operatorul OR.
Exemplu:
Se presupune c tabelul artist conine i artiti care nu au opere expuse n
muzeu. S se afieze artitii i operele acestora, inclusiv cei care nu au opere
corespunztoare n tabelul opera.
SELECT a.cod_artist, nume, prenume, cod_opera, titlu
FROM artist a, opera o
WHERE a.cod_artist = o.cod_artist (+);
Exist trei tipuri de baz:
Uniune extern ctre stnga (left outer join). Returneaz toate rndurile
din tabelul din stnga (cel specificat primul n clauza JOIN), mpreun cu toate
rndurile din tabelul din dreapta pentru care poate fi gsit o legtur.
(asemnatoare interogrilor din tabele aflate in relaia 1:m)
Uniune extern ctre dreapta (right outer join). Returneaz toate rndurile
din tabelul din dreapta (cel specificat al doilea n clauza JOIN), mpreun cu toate
rndurile din tabelul din stnga pentru care poate fi gsit o legtur, n esen, o
uniune extern ctre stnga poale fi rescris ca o uniune extern ctre dreapta
inversnd ordinea de specificare a tabelelor i nlocuind cuvntul cheie LEFT cu
RIGHT.
Uniune extern complet (full outer join). Returneaz toate rndurile din
ambele tabele. Acest tip de uniune este cel mai puin probabil s fie acceptat de
toate implementari;e SQL. Aceast uniune nu este acelai lucru cu un produs
cartezian, care leag fiecare rnd dintr-un tabel cu fiecare rnd din cellalt tabel. O
uniune extern complet leag fiecare rnd dintr-un tabel cu zero sau mai multe
rnduri corespondente din cellalt tabel.
FILM_TITLU
Actiune i Aventura
Actiune i Aventura
Actiune i Aventura
Actiune i Aventura
Actiune i Aventura
Actiune i Aventura
Actiune i Aventura
Anime
and
Animation
Copii i Familie
Clasic
Comedie
50 First Dates
Comedie
Matchstick Men
Comedie
The School of Rock
USING
Comedie
Documentar
Drama
Drama
Drama
Drama
Drama
Drama
Strain
Horror
Independent
Musical
Romantic
Romantic
Something's Gotta
Give
Big Fiah
Road to Perdition
Mystic River
Monster
Cold Mountain
Lost n Translation
Das Boot
13 Going on 30
Two Weeks Notice
Subinterogri
O caracteristic foarte puternic a limbajului SQL sunt subinterogrile
(numite i selecii), care, aa cum sugereaz i numele, se refer la o instruciune
SELECT care contine o instruciune SELECT subordonat. De obicei,
subinterogrile sunt folosite n clauza WHERE, ca modalitate de limitare a
rndurilor returnate n setul de rezultate al interogrii externe. Aceasta poate fi o
modalitate foarte flexibil de selectare a datelor.
LIMBA_NUME
Japoneza
Coreana
Olandeza
Rusa
Chineza
fr
(Franceza)
deoarece interogarea intern trebuie s fie apelat pentru fiecare rnd gsit de
interogarea extern.
Exemplu:
Proprietarul magazinului vrea s transmit prin pot un cupon valoric
tuturor clienilor care au pltit mai mult de 15$ pentru o singur tranzacie de
nchiriere.
SELECT DISTINCT CLIENT_CONT_ID
FROM CLIENT_TRANZACTIE A
WHERE 15 < (SELECT SUM (INCHIRIAT_TAXA)
FROM FILM_INCHIRIATB
WHERE A.TRANZACTIE _ID = B.TRANZACTIE_ID)
CLIENT_CONT_ID
2
7
9
Observai pseudonimele asociate numelor de tabele din interogrile
intern i extern, precurn i folosirea acestora n clauza WHERE a interogrii
interne. Acesta este elementul de identificare al unei subinterogri corelate.
Interogarea extern selecteaz o lista de valori CLIENT_CONT_ID distincte din
tabelul CLIENT_TRANZACTIE. Fiecare valoare gsit este transmis interogrii
interne, care este rulat pentru a calcula suma taxelor de nchiriere din tranzacia
respectiv. Dac suma taxelor de nchiriere este mai mare sau egal cu 15, atunci
clauza WHERE din interogarea extern ia valoarea logic adevrat", iar rndul
CLIENT_ID este adugat n setul de rezultate.
Vizualizri n linie
Foarte puine implementri, printre care Oracle, permit folosirea unei
subinterogri n clauza FROM a unei interogri, ntr-o construcie numit
vizualizare n linie (inline view). Aceast construcie permite care setul de rezultate
al unei interogri s fie tratat ca i cum ar fi un tabel sau o vizualizare predefinit.
Iat un exemplu:
Aceast interogare afl numrul maxim de nchirieri ale unui singur film;
SELECT MAX(INCHIRIAT_NUMAR) AS MAX_INCHIRIAT_NUMAR
FROM (SELECT FILM_ID, NUMAR(*) AS INCHIRIAT_NUMAR
FROM FILM_INCHIRIAT GROUP BY FILM_ID)
MAX_INCH_NUMAR
5
Interogarea intern calculeaz numrul de nchirieri pentru fiecare valoare
FILM_ID. Interogarea extern selecteaz valoarea maxim INCHIRIAT_NUMAR
din interogarea intern, tratat ca i cum ar fi o vizualizare predefinit. Nu exist
nici o limit n privina modurilor de utilizare a vizualizrilor n linie - putei chiar
s le unii cu alte tabele sau vizualizri.
Subinterogri (Subcereri)
O caracteristic foarte puternic a limbajului SQL sunt subinterogrile
(numite i selecii), care, aa cum sugereaz i numele, se refer la o instruciune
SELECT care conine o instruciune SELECT subordonat.
De cele mai multe ori, pentru a implementa anumite interogri, nu este
suficient o singur cerere SELECT ci sunt necesare subcereri.
Subcererile sunt comenzi SELECT ncapsulate n oricare din clauzele ,
SELECT, WHERE, HAVING, FROM, numit instruciune printe.
Dac subcererea urmeaz clauzei WHERE sau HAVING, ea poate conine
unul dintre operatorii ALL, ANY, IN (=ANY), EXIST, NOT IN (!=ALL) care sunt
specifici cererilor care ntorc mai multe linii (multiple-row subquery) sau unul
dintre operatorii de comparare (=, <, >, >=, <=, <>) care sunt specifici cererilor
care ntorc o singur linie (single-row subquery).
Utiliznd subcereri, se pot construi interogri complexe pe baza unor
instruciuni simple. Subcererile mai sunt numite instruciuni SELECT imbricate
sau interioare.
name, sal
angajati
sal=(SELECT
FROM
MIN(sal)
angajati);
Exemplu:
S se obin job-ul pentru care salariul mediu este minim. Sa se afiseze si
salariul mediu.
SELECT
job, AVG(sal)
FROM
angajati
GROUP BY job
HAVING AVG(sal)=(SELECT MIN(AVG(sal))
FROM
angajati
GROUP BY
job);
Operatorul ANY presupune c este adevrat condiia dac comparaia este
adevrat pentru cel puin una din valorile returnate. Sunt evidente relaiile:
< ANY mai mic ca maximul;
> ANY mai mare ca minimul;
= ANY IN.
Pentru operatorul ALL se presupune c este adevrat condiia, dac
comparaia este adevrat pentru toate elementele listei returnate. Pentru operatorul
ALL sunt evidente relaiile:
< ALL mai mic ca minimul;
> ALL mai mare ca maximul;
! = ALL NOT IN.
Exemplu:
WHERE codec > ALL (C1, C2) este superior tuturor elementelor din list;
WHERE codec > ANY (C1, C2) este superior cel puin unui element din
list.
Exemplu:
S se obin salariaii al cror salariu este mai mare ca salariile medii din
toate departamentele.
SELECT
FROM
WHERE
nume, job
angajati
sal > ALL(SELECT
FROM
GROUP BY
AVG(sal)
angajati
cod_dep);
col,col,
tabel
(col,col,) IN (SELECT
col,col,
FROM
tabel
WHERE
condiie);
Dac una din valorile returnate de subcerere este valoarea null atunci cererea
nu ntoarce nici o linie. Prin urmare, dac valoarea null poate s fac parte din
rezultatul subcererii nu trebuie utilizat operatorul NOT IN. Problema nu mai apare
dac se utilizeaz operatorul IN.
Exemplu:
S se obin salariaii care nu au subordonai.
SELECT
FROM
WHERE
a.nume
angajati a
a.cod_ang NOT IN (SELECT m.mgr
FROM angajati m);
n acest caz, instruciunea SQL nu ntoarce nici o linie deoarece una din
valorile furnizate de subcerere este valoarea null.
lista_select
nume_tabel
expresie operator (SELECT lista_select
FROM
nume_tabel);
LIMBA_NUME
Japoneza
Coreana
Olandeza
Rusa
Chineza
AND
FROM opera
WHERE cod_opera = 180)
cod_galerie IN (SELECT cod_galerie
FROM opera
WHERE cod_opera IN (100, 110));
Exemplu:
Proprietarul magazinului vrea s transmit prin pot un cupon valoric
tuturor clienilor care au pltit mai mult de 15$ pentru o singur tranzacie de
nchiriere.
SELECT DISTINCT CLIENT_CONT_ID
FROM CLIENT_TRANZACTIE A
WHERE 15 < (SELECT SUM (INCHIRIAT_TAXA)
FROM FILM_INCHIRIATB
WHERE A.TRANZACTIE _ID = B.TRANZACTIE_ID)
CLIENT_CONT_ID
2
7
9
Observai pseudonimele asociate numelor de tabele din interogrile intern
i extern, precurn i folosirea acestora n clauza WHERE a interogrii interne.
Acesta este elementul de identificare al unei subinterogri corelate. Interogarea
extern selecteaz o lista de valori CLIENT_CONT_ID distincte din tabelul
CLIENT_TRANZACTIE. Fiecare valoare gsit este transmis interogrii interne,
care este rulat pentru a calcula suma taxelor de nchiriere din tranzacia
respectiv. Dac suma taxelor de nchiriere este mai mare sau egal cu 15, atunci
clauza WHERE din interogarea extern ia valoarea logic adevrat", iar rndul
CLIENT_ID este adugat n setul de rezultate.
Vizualizri n linie
Foarte puine implementri, printre care Oracle, permit folosirea unei subinterogri
n clauza FROM a unei interogri, ntr-o construcie numit vizualizare n linie
(inline view). Aceast construcie permite care setul de rezultate al unei interogri
s fie tratat ca i cum ar fi un tabel sau o vizualizare predefinit. Iat un exemplu:
Aceast interogare afl numrul maxim de nchirieri ale unui singur film;
SELECT MAX(INCHIRIAT_NUMAR) AS MAX_INCHIRIAT_NUMAR
FROM (SELECT FILM_ID, NUMAR(*) AS INCHIRIAT_NUMAR
FROM FILM_INCHIRIAT GROUP BY FILM_ID)
MAX_INCH_NUMAR
5
Interogarea intern calculeaz numrul de nchirieri pentru fiecare valoare
FILM_ID. Interogarea extern selecteaz valoarea maxim INCHIRIAT_NUMAR
din interogarea intern, tratat ca i cum ar fi o vizualizare predefinit. Nu exist
nici o limit n privina modurilor de utilizare a vizualizrilor n linie - putei chiar
s le unii cu alte tabele sau vizualizri.
Exemplu de subcereri corelate pentru galeria de arta):
a) S se afieze informaii despre operele de art a cror valoare depete
valoarea medie a celor expuse n aceeai galerie.
Clauza WITH
Cu ajutorul clauzei WITH se poate defini un bloc de cerere nainte ca acesta
s fie utilizat ntr-o interogare. Clauza permite reutilizarea aceluiai bloc de cerere
ntr-o instruciune SELECT complex. Acest lucru este util atunci cnd o cerere
face referin de mai multe ori la acelai bloc de cerere, care conine operaii join i
funcii agregat. Folosind clauza WITH, server-ul Oracle regsete rezultatele unui
bloc de cerere i le stocheaz n spaiul tabel temporar al utilizatorului, ceea ce
poate determina mbuntirea performanelor.
Exemplu:
Utiliznd clauza WITH, s se scrie o cerere care afieaz numele artitilor i
valoarea total a operelor acestora. Se vor considera artitii a cror valoare total a
operelor este mai mare dect media valorilor totale ale operelor tuturor artitilor.
WITH
val_artist AS (SELECT nume, SUM(valoare) AS total
FROM opera o, artist a
WHERE o.cod_artist = a.cod_artist
GROUP BY nume),
val_medie AS (SELECT SUM(total)/COUNT(*) AS medie
FROM val_artist)
SELECT *
FROM val_artist
WHERE total > (SELECT medie
FROM val_medie)
ORDER BY nume;
Intern, clauza WITH este tratat ca o vizualizare inline (subcerere n clauza
FROM) sau ca un tabel temporar. Optimizorul alege decizia adecvat pe baza
costului sau beneficiului stocrii temporare a rezultatelor clauzei WITH.
Observaii:
Clauza WITH poate fi folosit numai pentru instruciuni SELECT.
Un nume de cerere este vizibil tuturor blocurilor din clauza WITH
definite ulterior (inclusiv subcererilor acestora). De asemenea, un nume
de cerere este vizibil cererii principale i subcererilor acesteia.
Cnd un nume de cerere coincide cu numele unui tabel, numele blocului
de cerere are preceden asupra numelui tabelului.
Clauza WITH poate conine mai mult dect o singur cerere. n acest caz,
cererile sunt separate prin virgule.
conectate prin UNION ALL. Aceasta ar face execuia cererii ineficient deoarece
fiecare instruciune SELECT determin accesarea tabelului. Operatorul ROLLUP
determin rezultatele efectund un singur acces la tabel i este util atunci cnd sunt
implicate multe coloane n producerea subtotalurilor.
Exemplu:
S se afieze codurile de galerii mai mici dect 50, iar pentru fiecare dintre
acestea i pentru fiecare autor care are opere expuse n galerie, s se listeze
valoarea total a lucrrilor sale. De asemenea, se cere valoarea total a operelor
expuse n fiecare galerie. Rezultatul va conine i valoarea total a operelor din
galeriile avnd codul mai mic dect 50, indiferent de codul autorului.
SELECT cod_galerie, cod_artist, SUM(valoare)
FROM opera
WHERE cod_galerie < 50
GROUP BY ROLLUP(cod_galerie, cod_artist);
Instruciunea precedent va avea un rezultat de forma:
COD_GALERIE
COD_ARTIST
10
10
10
40
40
50
60
50
SUM(VALOARE)
14000
10000
24000
8080
8080
32080
cmpului SUM(valoare).
Operatorul CUBE
Operatorul CUBE grupeaz liniile selectate pe baza valorilor tuturor
combinaiilor posibile ale expresiilor specificate i returneaz cte o linie
totalizatoare pentru fiecare grup. Acest operator este folosit pentru a produce
mulimi de rezultate care sunt utilizate n rapoarte. n vreme ce ROLLUP produce
subtotalurile doar pentru o parte dintre combinaiile posibile, operatorul CUBE
produce subtotaluri pentru toate combinaiile posibile de grupri specificate n
clauza GROUP BY, precum i un total general.
Dac exist n coloane sau expresii n clauza GROUP BY, vor exista 2n
combinaii posibile superagregat. Din punct de vedere matematic, aceste
combinaii formeaz un cub n-dimensional, de aici provenind numele operatorului.
Pentru producerea de subtotaluri fr ajutorul operatorului CUBE ar fi necesare 2n
instruciuni SELECT conectate prin UNION ALL.
Exemplu:
S se afieze valoarea total a operelor de art ale unui autor, expuse n
cadrul fiecrei galerii avnd codul mai mic dect 50. De asemenea, s se afieze
valoarea total a operelor din fiecare galerie avnd codul mai mic dect 50,
valoarea total a operelor fiecrui autor indiferent de galerie i valoarea total a
operelor din galeriile avnd codul mai mic dect 50.
SELECT cod_galerie, cod_artist, SUM(valoare)
FROM opera
WHERE cod_galerie < 50
GROUP BY CUBE(cod_galerie, cod_artist);
Instruciunea precedent va genera un rezultat de forma urmtoare:
COD_GALERIE
COD_ARTIST
10
10
10
40
40
50
60
50
50
60
SUM(VALOARE)
14000
10000
24000
8080
8080
22080
10000
32080
n plus fa de rezultatul corespunztor operaiei ROLLUP, operatorul CUBE
a produs linii care reprezint suma valorilor operelor pentru fiecare artist care a
expus n galerii avnd codul mai mic dect 50. Aceste linii se disting prin faptul c
valoarea coloanei cod_galerie este null.
Funcia GROUPING
Funcia GROUPING poate fi utilizat alturi de operatorii CUBE i
ROLLUP pentru a arta modul cum a fost obinut o valoare totalizatoare. Aceast
funcie accept un singur argument, care trebuie s fie una dintre expresiile
specificate n clauza GROUP BY.
O valoare null a expresiei din argumentul funciei GROUPING poate
proveni din tabelul de baz (valoare null stocat) sau poate fi o valoare null creat
de operaia ROLLUP sau CUBE ca rezultat al unei funcii grup asupra expresiei
respective.
Funcia GROUPING returneaz valoarea 0 sau 1. Valoarea 0 returnat de
funcia GROUPING pe baza unei expresii poate indica fie c expresia a fost
utilizat pentru calculul valorii agregat, fie c valoarea null a expresiei este o
valoare null stocat. Valoarea 1 returnat de funcia GROUPING pe baza unei
expresii poate indica fie c expresia nu a fost utilizat pentru calculul valorii
agregat, fie c valoarea null a expresiei este creat de ROLLUP sau CUBE ca
rezultat al gruprii.
Valorile returnate de funcia GROUPING sunt utile pentru:
determinarea nivelului de agregare al unui subtotal dat, adic a grupului
sau grupurilor pe care se bazeaz subtotalul respectiv;
identificarea provenienei unei valori null a unei expresii calculate, dintruna din liniile mulimii rezultat.
Exemplu:
SELECT cod_galerie, cod_artist, SUM(valoare),
GROUPING(cod_galerie), GROUPING(cod_artist)
FROM opera
WHERE cod_galerie < 50
GROUP BY ROLLUP(cod_galerie, cod_artist);
SUM
GROUPING
GROUPING
(VALOARE) (COD_GALERIE) (COD_ARTIST)
50
14000
0
0
COD_GALERIE COD_ARTIST
10
10
10
40
40
60
50
10000
24000
8080
8080
32080
0
0
0
0
1
GROUPING SETS
((a, b, c), (a, b), (a, c), (b, c), (a),
(b), (c), ())
ROLLUP(a, b,
GROUPING SETS
c)
((a, b, c), (a, b), (a), ())
Exemplu:
Considernd galeriile al cror cod este mai mic dect 50, s se calculeze
media valorilor operelor:
0
1
0
1
1
an a
2000
2002
2001
2003
Valoare medie
3500
2500
2020
2380
2300
2000
3000
PROBLEME-SUBCERERI
De cele mai multe ori, pentru a implementa anumite interogri, nu este
suficient o singur cerere SELECT ci sunt necesare subcereri. Subcererile sunt
comenzi SELECT ncapsulate n oricare din clauzele SELECT, WHERE, HAVING,
FROM.
Dac subcererea urmeaz clauzei WHERE sau HAVING, ea poate conine
unul dintre operatorii ALL, ANY, IN (=ANY), EXIST, NOT IN (!=ALL) care sunt
specifici cererilor care ntorc mai multe linii (multiple-row subquery) sau unul
dintre operatorii de comparare (=, <, >, >=, <=, <>) care sunt specifici cererilor
care ntorc o singur linie (single-row subquery).
Subcererile trebuie incluse ntre paranteze i trebuie plasate n partea dreapt
a operatorului de comparare. Subcererea nu poate conine clauza ORDER BY.
Exemplu:
S se obin numele salariailor, salariile, codul departamentului n care
lucreaz i salariul mediu pe departament pentru toi angajaii care au salariul mai
mare ca media salariilor din departamentul n care lucreaz (folosirea subcererii n
clauza FROM).
SELECT a.nume, a.sal, a.cod_dep, b.salavg
FROM angajati a, (SELECT dept ,avg(sal) salavg
FROM angajati
GROUP BY cod_dep) b
WHERE
a. cod_dep =b. cod_dep
AND
a.sal>b.salavg
Exemplu:
S se obin lista celor mai scumpe cri.
SELECT
titlu
FROM
carte
WHERE
pret = (SELECT
FROM carte);
MAX(pret)
Exemplu:
S se obin lista scriitorilor care au n bibliotec un numr de exemplare
mai mare dect numrul mediu al crilor din bibliotec.
SELECT
FROM
DISTINCT autor
carte
WHERE
Exemplu:
S se obin informaii despre crile al cror pre depete media preurilor
crilor ce aparin aceluiai domeniu
SELECT
FROM
WHERE
*
carte c
pret > (SELECT AVG(pret)
FROM
carte
WHERE
coded = c.coded);
Exemplu:
S se obin lista cititorilor care au mprumutat cel puin o carte.
SELECT
FROM
WHERE
nume
cititor
codec IN (SELECT DISTINCT codec
FROM imprumuta);
Exemplu:
S se obin codurile cititorilor care nu au mprumutat niciodat cri.
SELECT
FROM
WHERE
codec
cititor
codec NOT IN
(SELECT
DISTINCT codec
FROM imprumuta);
Exemplu:
S se obin lista cititorilor care sunt n ntrziere cu predarea crilor.
SELECT
FROM
WHERE
nume
cititor
codec IN (SELECT
FROM
WHERE
AND
DISTINCT codec
imprumuta
dataef IS NULL
dares<SYSDATE);
Exemplu:
S se obin numele cititorilor care au mprumutat cel puin o carte scris de
ZOLA.
SELECT
FROM
WHERE
nume
cititor
codec IN
(SELECT
DISTINCT codec
FROM
imprumuta
WHERE codel IN
(SELECT codel
FROM
carte
WHERE autor=ZOLA));
Exemplu:
S se obin numele cititorilor care nu au mprumutat nici o carte scris de
ZOLA.
SELECT
FROM
WHERE
nume
cititor
codec NOT IN
(SELECT DISTINCT codec
FROM imprumuta
WHERE codel IN
(SELECT codel
FROM
carte
WHERE autor=ZOLA));
nume
cititor
codec NOT IN
(SELECT DISTINCT codec
FROM
imprumuta
WHERE codel NOT IN
(SELECT codel
FROM carte
WHERE autor=ZOLA));
Exemplu:
S se obin numele cititorilor care au mprumutat cel puin o carte de
informatic (procedural).
SELECT
nume
FROM
cititor
WHERE
codec IN
(SELECT DISTINCT codec
FROM
imprumuta
WHERE codel IN
(SELECT codel
FROM
carte
WHERE coded=
(SELECT coded
FROM domeniu
WHERE intdom= INFORMATICA)));
Exemplu:
S se obin numele cititorilor i titlurile crilor de informatic mprumutate
de aceti cititori (relational).
SELECT
FROM
WHERE
AND
AND
AND
nume, titlu
cititor, carte, imprumuta, domeniu
imprumuta.codel = carte.codel
carte.coded = domeniu.coded
imprumuta.codec = cititor.codec
intdom = INFORMATICA;
Exemplu:
S se obin, utiliznd sincronizarea subcererii cu cererea principal, titlurile
crilor care au toate exemplarele mprumutate (se selecteaz un titlu din carte i
pentru acest titlu se numr cte exemplare sunt mprumutate).
SELECT
FROM
WHERE
titlu
carte
nrex=(SELECT
FROM
WHERE
AND
COUNT(*)
imprumuta
codel = carte.codel
dataef IS NULL);
Exemplu:
S se obin codurile cititorilor i codul ultimei cri mprumutate.
SELECT
FROM
WHERE
codec, codel
imprumuta i
dataim>=ALL (SELECT dataim
FROM
imprumuta
WHERE codec=i.codec);
dataim=(SELECT MAX(dataim)
FROM
imprumuta
WHERE
codec=i.codec);
Exemplu:
S se obin lista codurilor crilor mprumutate i codul primului cititor care
a mprumutat aceste crti.
SELECT
FROM
WHERE
codel,codec
imprumuta i
dataim<=ALL (SELECT dataim
FROM imprumuta
WHERE i.codel=codel);
Exemplu:
S se obin codurile crilor din care cel puin un exemplar este mprumutat.
SELECT
FROM
WHERE
codel
carte
EXISTS
(SELECT codel
FROM
imprumuta
WHERE
AND
codel = carte.codel
dataef IS NULL);
imprumuta
codel = carte.codel
dataef IS NULL);
codel
imprumuta
codel = carte.codel);
codel
carte
codel NOT IN
(SELECT DISTINCT codel
FROM
imprumuta);
Exemplu:
S se obin lista salariailor avnd salariul minim n departamentul n care
lucreaz.
SELECT
FROM
WHERE
ename,sal
emp e
sal=(SELECT
FROM
WHERE
MIN(sal)
emp
deptno=e.deptno);
Exemplu:
S se obin numele primilor trei salariai avnd retribuia maxim (ideea
rezolvrii este de a verifica dac numrul salariailor care au leafa mai mare dect
leafa salariatului considerat, este mai mic dect 3).
SELECT
FROM
WHERE
ename
emp a
3>(SELECT COUNT(*)
FROM
emp
WHERE
sal > a.sal);
Exemplu:
S se obin numele cititorilor care au mprumutat cel puin aceleai cri ca
i cititorul avnd codul C19 (ideea problemei este de a selecta cititorii pentru care
este vid lista crilor mprumutatede C19 mai puin lista crilor mprumutate de
acei cititori).
SELECT
nume
FROM
cititor
WHERE
NOT EXISTS
(SELECT codel
FROM imprumuta
WHERE codec=C19
MINUS
SELECT codel
FROM imprumuta
WHERE codec= cititor.codec);
Dac problema era modificat n sensul c cel puineste nlocuit prin cel
mult atunci trebuiau inversate interogrile legate prin MINUS.
Exemplu:
S se obin codurile cititorilor care au mprumutat aceleai cri ca i
cititorul avnd un cod specificat.
Rezolvarea problemei se bazeaz pe ideea: A = B A B i B A (AB) = i (B-A) = A-B i B-A nu furnizeaz nici un tuplu rezultat.
SELECT
codec
FROM
imprumuta i
WHERE
NOT EXISTS
(SELECT codel
FROM
imprumuta
WHERE codec=i.codec
MINUS
SELECT codel
FROM
imprumuta
WHERE codec=&ccc)
AND
NOT EXISTS
(SELECT codel
FROM
imprumuta
WHERE codec=&ccc
MINUS
SELECT codel
FROM
imprumuta
WHERE codec=i.codec)
AND
codec!=&ccc);
Ultimul operator (AND), asigur s nu apar n rezultat cititorul specificat.
n cazul formei relaionale de rezolvare a cererii, drumul de acces la
informaie este n sarcina SGBD-lui i prin urmare nu mai apar cereri imbricate.
Exemplu:
S se obin numele cititorilor care au mprumutat cel puin o carte.
Soluia 1 (forma relaional):
SELECT
DISTINCT nume
FROM
cititor,imprumuta
WHERE
cititor.codec=imprumuta.codec;
Soluia 2 (forma procedural):
SELECT
nume
FROM
cititor
WHERE
codec IN
(SELECT DISTINCT codec
FROM
imprumuta);
Exemplu:
S se obin numele cititorilor care au mprumutat cel puin dou cri.
Soluia 1 (forma relaional):
SELECT
nume
FROM
cititor, imprumuta
WHERE
cititor.codec=imprumuta.codec
GROUP BY nume
HAVING COUNT(*)>1;
Soluia 2 (forma procedural):
SELECT
nume
FROM
cititor
WHERE
codec IN
(SELECT codec
FROM
imprumuta
GROUP BY codec
HAVING COUNT(*)>1);
Exemplu:
S se afieze numele, prenumele, salariul lucrtorilor, codurile publicaiilor
la care lucreaz i salariul mediu pe publicaie pentru toi angajaii care au salariul
mai mare dect media salariului pe publicaia respectiv.
SELECT
Subinterogri
O caracteristic foarte puternic a limbajului SQL sunt subinterogrile
(numite i selecii), care, aa cum sugereaz i numele, se refer la o instruciune
SELECT care conine o instruciune SELECT subordonat.
De cele mai multe ori, pentru a implementa anumite interogri, nu este
suficient o singur cerere SELECT ci sunt necesare subcereri.
Subcererile sunt comenzi SELECT ncapsulate n oricare din clauzele ,
SELECT, WHERE, HAVING, FROM, numit instruciune printe.
Dac subcererea urmeaz clauzei WHERE sau HAVING, ea poate conine
unul dintre operatorii ALL, ANY, IN (=ANY), EXIST, NOT IN (!=ALL) care sunt
specifici cererilor care ntorc mai multe linii (multiple-row subquery) sau unul
dintre operatorii de comparare (=, <, >, >=, <=, <>) care sunt specifici cererilor
care ntorc o singur linie (single-row subquery).
Utiliznd subcereri, se pot construi interogri complexe pe baza unor
instruciuni simple. Subcererile mai sunt numite instruciuni SELECT imbricate
sau interioare.
Subcererea returneaz o valoare care este utilizat de ctre instruciunea
printe. Utilizarea unei subcereri este echivalent cu efectuarea a dou cereri
secveniale i utilizarea rezultatului cererii interne ca valoare de cutare n cererea
extern (principal).
Subcererile pot fi utilizate n urmtoarele situaii:
pentru a furniza valori care intervin n condiiile din clauzele WHERE,
HAVING i START WITH ale instruciunilor SELECT;
pentru a defini o mulime de linii care urmeaz s fie inserat n tabelul
destinaie al unei instruciuni INSERT sau CREATE TABLE;
pentru a defini o mulime de linii care urmeaz s fie inserate ntr-o
vizualizare sau vizualizare materializat, prin intermediul unei
instruciuni CREATE VIEW sau CREATE MATERIALIZED VIEW;
pentru a defini una sau mai multe valori care urmeaz s fie atribuite unor
linii existente ntr-o instruciune UPDATE;
pentru a defini un tabel asupra cruia va opera cererea extern (plasarea
subcererii n clauza FROM sau n instruciunile INSERT, UPDATE,
DELETE).
lista_select
nume_tabel
expresie operator (SELECT lista_select
FROM
nume_tabel);
LIMBA_NUME
Japoneza
Coreana
Olandeza
Rusa
Chineza
returneaz operele care nu sunt expuse n galeria 30 i a cror valoare este mai
mic dect a oricrei opere din galeria respectiv.
e) S se afieze cele mai scumpe 3 opere de art din muzeu.
SELECT ROWNUM "Nr.Crt", titlu, valoare
FROM (SELECT titlu, valoare
FROM
opera
ORDER BY valoare DESC)
WHERE ROWNUM <= 3;
Exemplu:
Din punct de vedere logic, urmtoarea cerere ar trebui s returneze titlurile
operelor care nu sunt expuse n galeriile unde se afl lucrrile artistului avnd
codul 60.
SELECT titlu
FROM opera
WHERE cod_galerie NOT IN (SELECT cod_galerie
FROM opera
WHERE cod_artist = 60);
Dac pentru una dintre opere valoarea coloanei cod_galerie este null,
ntreaga cerere nu va returna nici o linie, chiar dac exist nregistrri cu
proprietatea cerut. Justificarea este c toate condiiile n care unul dintre operanzi
este null au, de asemenea, valoarea null. Prin urmare, ori de cte ori este posibil ca
n rezultatul subcererii s apar valori null, nu trebuie folosit operatorul NOT IN.
Operatorul NOT IN este echivalent cu <>ALL. Dac se utilizeaz operatorul IN, nu
mai este nici o problem dac n rezultatul subcererii apar valori null. Operatorul
IN este echivalent cu =ANY.
Exemplu:
S se afieze titlurile operelor care sunt expuse n galeriile unde se afl
lucrrile artistului avnd codul 60.
SELECT titlu
FROM opera
WHERE cod_galerie IN (SELECT cod_galerie
FROM opera
WHERE cod_artist = 60);
Pentru a evita obinerea de valori null n rezultatul unei cereri care utilizeaz
operatorul NOT IN, se poate specifica o condiie n subcerere:
SELECT titlu
FROM opera
Exemplu:
Proprietarul magazinului vrea s transmit prin pot un cupon valoric
tuturor clienilor care au pltit mai mult de 15$ pentru o singur tranzacie de
nchiriere.
SELECT DISTINCT CLIENT_CONT_ID
FROM CLIENT_TRANZACTIE A
WHERE 15 < (SELECT SUM (INCHIRIAT_TAXA)
FROM FILM_INCHIRIATB
WHERE A.TRANZACTIE _ID = B.TRANZACTIE_ID)
CLIENT_CONT_ID
2
7
9
Observai pseudonimele asociate numelor de tabele din interogrile intern
i extern, precurn i folosirea acestora n clauza WHERE a interogrii interne.
Acesta este elementul de identificare al unei subinterogri corelate. Interogarea
extern selecteaz o lista de valori CLIENT_CONT_ID distincte din tabelul
CLIENT_TRANZACTIE. Fiecare valoare gsit este transmis interogrii interne,
care este rulat pentru a calcula suma taxelor de nchiriere din tranzacia
respectiv. Dac suma taxelor de nchiriere este mai mare sau egal cu 15, atunci
clauza WHERE din interogarea extern ia valoarea logic adevrat", iar rndul
CLIENT_ID este adugat n setul de rezultate.
Vizualizri n linie
Foarte puine implementri, printre care Oracle, permit folosirea unei subinterogri
n clauza FROM a unei interogri, ntr-o construcie numit vizualizare n linie
(inline view). Aceast construcie permite care setul de rezultate al unei interogri
s fie tratat ca i cum ar fi un tabel sau o vizualizare predefinit. Iat un exemplu:
Aceast interogare afl numrul maxim de nchirieri ale unui singur film;
SELECT MAX(INCHIRIAT_NUMAR) AS MAX_INCHIRIAT_NUMAR
FROM (SELECT FILM_ID, NUMAR(*) AS INCHIRIAT_NUMAR
FROM FILM_INCHIRIAT GROUP BY FILM_ID)
MAX_INCH_NUMAR
5
Interogarea intern calculeaz numrul de nchirieri pentru fiecare valoare
FILM_ID. Interogarea extern selecteaz valoarea maxim INCHIRIAT_NUMAR
din interogarea intern, tratat ca i cum ar fi o vizualizare predefinit. Nu exist
nici o limit n privina modurilor de utilizare a vizualizrilor n linie - putei chiar
s le unii cu alte tabele sau vizualizri.
Operatorul EXISTS
n instruciunile SELECT imbricate, este permis utilizarea oricrui operator
logic. Pentru a testa dac valoarea recuperat de cererea extern exist n mulimea
valorilor regsite de cererea intern corelat, se poate utiliza operatorul EXISTS.
Dac subcererea returneaz cel puin o linie, operatorul returneaz valoarea TRUE.
n caz contrar, va fi returnat valoarea FALSE.
Operatorul EXISTS asigur c nu mai este continuat cutarea n cererea
intern dup ce aceasta regsete o linie.
Exemplu:
a) S se determine codul, numele i prenumele artitilor care au cel puin o
oper de art expus n muzeu.
SELECT cod_artist, nume, prenume
FROM artist a
WHERE EXISTS (SELECT 'x'
FROM opera
WHERE cod_artist = a.cod_artist);
ntruct nu este necesar ca instruciunea SELECT interioar s returneze o
anumit valoare, se poate selecta o constant. De altfel, din punct de vedere al
performanei, selectarea unei constante asigur mai mult rapiditate dect
selectarea unei coloane.
Ca alternativ a lui EXISTS, poate fi utilizat operatorul IN. Exemplul
precedent poate fi rezolvat prin instruciunea urmtoare:
SELECT cod_artist, nume, prenume
FROM artist
WHERE cod_artist IN (SELECT cod_artist
FROM opera);
b) S se determine operele care nu sunt menionate n nici o surs
bibliografic.
SELECT cod_opera, titlu
FROM opera o
WHERE NOT EXISTS (SELECT 'x'
FROM mentionata_in
WHERE cod_opera = o.cod_opera);
Acest exemplu poate fi rezolvat i printr-o subcerere necorelat, utiliznd
operatorul NOT IN:
SELECT cod_opera, titlu
FROM opera
WHERE
expresie
nume_tabel_2 alias_2
alias_1.nume_coloan =
alias_2.nume_coloan);
THEN 'Brancusi'
ELSE 'Alt artist' END) artist
FROM opera;
2.4.4. Funcii grup i clauza GROUP BY
Clauza GROUP BY este utilizat pentru a diviza liniile unui tabel n grupuri.
Pentru a returna informaia corespunztoare fiecrui astfel de grup, pot fi utilizate
funciile agregat. Ele pot aprea n clauzele SELECT, ORDER BY i HAVING.
Server-ul Oracle aplic aceste funcii fiecrui grup de linii i returneaz un singur
rezultat pentru fiecare mulime.
Dintre funciile grup definite n sistemul Oracle, se pot enumera: AVG,
SUM, MAX, MIN, COUNT, STDDEV, VARIANCE, DENSE_RANK, RANK, FIRST,
LAST, GROUP_ID, GROUPING, GROUPING_ID etc. Tipurile de date ale
argumentelor funciilor grup pot fi CHAR, VARCHAR2, NUMBER sau DATE.
Funciile AVG, SUM, STDDEV i VARIANCE opereaz numai asupra valorilor
numerice. Funciile MAX i MIN pot opera asupra valorilor numerice, caracter sau
de tip dat calendaristic.
Toate funciile grup, cu excepia lui COUNT(*), ignor valorile null.
COUNT(expresie) returneaz numrul de linii pentru care expresia dat nu are
valoarea null. Funcia COUNT returneaz un numr mai mare sau egal cu zero i
nu ntoarce niciodat valoarea null.
Cnd este utilizat clauza GROUP BY, server-ul sorteaz implicit mulimea
rezultat n ordinea cresctoare a valorilor coloanelor dup care se realizeaz
gruparea.
n clauza GROUP BY a unei cereri se pot utiliza operatorii ROLLUP i
CUBE. Acetia sunt disponibili ncepnd cu versiunea Oracle8i.
Operatorul ROLLUP
Operatorul ROLLUP produce o mulime care conine liniile obinute n urma
gruprii obinuite i linii pentru subtotaluri. Acest operator furnizeaz valori
agregat i superagregat corespunztoare expresiilor din clauza GROUP BY.
Operatorul ROLLUP poate fi folosit pentru extragerea de statistici i informaii
totalizatoare din mulimile rezultate. Acest operator poate fi util la generarea de
rapoarte, diagrame i grafice.
Operatorul ROLLUP creeaz grupri prin deplasarea ntr-o singur direcie,
de la dreapta la stnga, de-a lungul listei de coloane specificate n clauza GROUP
BY. Apoi, se aplic funcia agregat acestor grupri. Dac sunt specificate n expresii
COD_ARTIST
10
10
10
40
40
50
60
50
SUM(VALOARE)
14000
10000
24000
8080
8080
32080
cod este 10 sau 40. Valoarea afiat este obinut prin nsumarea valorilor
de pe a treia, respectiv a cincea linie. ntruct aceast linie corespunde
totalului general, ea conine valoarea null pe toate coloanele, cu excepia
cmpului SUM(valoare).
Operatorul CUBE
Operatorul CUBE grupeaz liniile selectate pe baza valorilor tuturor
combinaiilor posibile ale expresiilor specificate i returneaz cte o linie
totalizatoare pentru fiecare grup. Acest operator este folosit pentru a produce
mulimi de rezultate care sunt utilizate n rapoarte. n vreme ce ROLLUP produce
subtotalurile doar pentru o parte dintre combinaiile posibile, operatorul CUBE
produce subtotaluri pentru toate combinaiile posibile de grupri specificate n
clauza GROUP BY, precum i un total general.
Dac exist n coloane sau expresii n clauza GROUP BY, vor exista 2n
combinaii posibile superagregat. Din punct de vedere matematic, aceste
combinaii formeaz un cub n-dimensional, de aici provenind numele operatorului.
Pentru producerea de subtotaluri fr ajutorul operatorului CUBE ar fi necesare 2n
instruciuni SELECT conectate prin UNION ALL.
Exemplu:
S se afieze valoarea total a operelor de art ale unui autor, expuse n
cadrul fiecrei galerii avnd codul mai mic dect 50. De asemenea, s se afieze
valoarea total a operelor din fiecare galerie avnd codul mai mic dect 50,
valoarea total a operelor fiecrui autor indiferent de galerie i valoarea total a
operelor din galeriile avnd codul mai mic dect 50.
SELECT cod_galerie, cod_artist, SUM(valoare)
FROM opera
WHERE cod_galerie < 50
GROUP BY CUBE(cod_galerie, cod_artist);
Instruciunea precedent va genera un rezultat de forma urmtoare:
COD_GALERIE
COD_ARTIST
10
10
10
40
40
50
60
50
50
60
SUM(VALOARE)
14000
10000
24000
8080
8080
22080
10000
32080
n plus fa de rezultatul corespunztor operaiei ROLLUP, operatorul CUBE
a produs linii care reprezint suma valorilor operelor pentru fiecare artist care a
expus n galerii avnd codul mai mic dect 50. Aceste linii se disting prin faptul c
valoarea coloanei cod_galerie este null.
Funcia GROUPING
Funcia GROUPING poate fi utilizat alturi de operatorii CUBE i
ROLLUP pentru a arta modul cum a fost obinut o valoare totalizatoare. Aceast
funcie accept un singur argument, care trebuie s fie una dintre expresiile
specificate n clauza GROUP BY.
O valoare null a expresiei din argumentul funciei GROUPING poate
proveni din tabelul de baz (valoare null stocat) sau poate fi o valoare null creat
de operaia ROLLUP sau CUBE ca rezultat al unei funcii grup asupra expresiei
respective.
Funcia GROUPING returneaz valoarea 0 sau 1. Valoarea 0 returnat de
funcia GROUPING pe baza unei expresii poate indica fie c expresia a fost
utilizat pentru calculul valorii agregat, fie c valoarea null a expresiei este o
valoare null stocat. Valoarea 1 returnat de funcia GROUPING pe baza unei
expresii poate indica fie c expresia nu a fost utilizat pentru calculul valorii
agregat, fie c valoarea null a expresiei este creat de ROLLUP sau CUBE ca
rezultat al gruprii.
Valorile returnate de funcia GROUPING sunt utile pentru:
determinarea nivelului de agregare al unui subtotal dat, adic a grupului
sau grupurilor pe care se bazeaz subtotalul respectiv;
identificarea provenienei unei valori null a unei expresii calculate, dintruna din liniile mulimii rezultat.
Exemplu:
SELECT cod_galerie, cod_artist, SUM(valoare),
GROUPING(cod_galerie), GROUPING(cod_artist)
FROM opera
WHERE cod_galerie < 50
GROUP BY ROLLUP(cod_galerie, cod_artist);
SUM
GROUPING
GROUPING
(VALOARE) (COD_GALERIE) (COD_ARTIST)
50
14000
0
0
COD_GALERIE COD_ARTIST
10
10
10
40
40
60
50
10000
24000
8080
8080
32080
0
0
0
0
1
GROUPING SETS
((a, b, c), (a, b), (a, c), (b, c), (a),
(b), (c), ())
ROLLUP(a, b,
GROUPING SETS
c)
((a, b, c), (a, b), (a), ())
Exemplu:
Considernd galeriile al cror cod este mai mic dect 50, s se calculeze
media valorilor operelor:
0
1
0
1
1
an a
2000
2002
2001
2003
Valoare medie
3500
2500
2020
2380
2300
2000
3000
GROUP BY a, b, c
ALL
GROUP BY a, b
ALL
GROUP BY a
GROUP BY a, b, c
ALL
GROUP BY a, b
UNION
UNION
UNION
UNION
ALL
GROUP BY c UNION ALL
GROUP BY()
GROUP BY GROUPING SETS(a, b, GROUP BY a UNION ALL
c)
GROUP BY b UNION ALL
GROUP BY c
GROUP BY GROUPING SETS
GROUP BY a UNION ALL
(a, b, (b, c) )
GROUP BY b UNION ALL
GROUP BY b, c
GROUP BY GROUPING SETS( (a, b, GROUP BY a, b, c
c) )
GROUP BY GROUPING SETS(a, GROUP BY a UNION ALL
(b), ())
GROUP BY b UNION ALL
GROUP BY ()
GROUP BY GROUPING SETS (a, GROUP BY a UNION ALL
ROLLUP(b, c))
GROUP BY ROLLUP(b, c)
Exemplu:
S se afieze urmtoarele informaii:
valoarea medie a operelor de art din fiecare galerie;
valoarea medie a operelor de art pentru fiecare galerie, iar n cadrul
acesteia pentru fiecare artist i fiecare an de achiziie;
media general a tuturor valorilor operelor de art.
SELECT cod_galerie, cod_artist,
TO_CHAR(data_achizitiei, 'yyyy') "an achizitie",
AVG(valoare) "Valoare medie"
FROM opera
GROUP BY ROLLUP
(cod_galerie,
(cod_artist, TO_CHAR(data_achizitiei, 'yyyy')));
Exemplul precedent poate fi rezolvat utiliznd cererea compus prezentat
mai jos. Folosirea coloanelor compuse este recomandat pentru asigurarea unei
execuii eficiente.
SELECT cod_galerie, cod_artist,
TO_CHAR(data_achizitiei, 'yyyy'),
AVG(valoare) "Valoare medie"
FROM opera
TO_CHAR(data_achizitiei, 'yyyy');
b) S se afieze informaiile solicitate la punctul a), cu deosebirea c prima
linie listat este cea al crei cod este 110. Se vor elimina din rezultat liniile
corespunztoare operelor create sau achizionate n anul 1970.
SELECT cod_opera, titlu, data_crearii, data_achizitiei
FROM
opera
START WITH cod_opera = 110
CONNECT BY PRIOR TO_CHAR(data_crearii, 'yyyy') =
TO_CHAR(data_achizitiei, 'yyyy')
AND TO_CHAR(data_crearii, 'yyyy') != 1970;
Curs6_IP
Subcereri
De cele mai multe ori, pentru a implementa anumite interogri, nu este
suficient o singur cerere SELECT ci sunt necesare subcereri. Subcererile sunt
comenzi SELECT ncapsulate n oricare din clauzele SELECT, WHERE, HAVING,
FROM.
Dac subcererea urmeaz clauzei WHERE sau HAVING, ea poate conine
unul dintre operatorii ALL, ANY, IN (=ANY), EXIST, NOT IN (!=ALL) care sunt
specifici cererilor care ntorc mai multe linii (multiple-row subquery) sau unul
dintre operatorii de comparare (=, <, >, >=, <=, <>) care sunt specifici cererilor
care ntorc o singur linie (single-row subquery).
Subcererile trebuie incluse ntre paranteze i trebuie plasate n partea dreapt
a operatorului de comparare. Subcererea nu poate conine clauza ORDER BY.
Exemplu:
S se obin numele i salariul angajailor, avnd salariul minim.
SELECT
FROM
WHERE
Exemplu:
ename, sal
emp
sal=(SELECT
FROM
MIN(sal)
emp);
MIN(AVG(sal))
emp
job);
ename, job
emp
sal > ALL(SELECT
FROM
GROUP BY
AVG(sal)
emp
deptno);
col,col,
FROM
WHERE
tabel
(col,col,) IN (SELECT col,col,
FROM
WHERE
tabel
condiie);
Exemplu:
S se obin numele, numrul departamentului, salariul i comisionul tuturor
funcionarilor ale cror salarii i comisioane coincid cu salariile i comisioanele
unor salariai din departamentul 7.
SELECT
FROM
WHERE
AND
Dac una din valorile returnate de subcerere este valoarea null atunci cererea
nu ntoarce nici o linie. Prin urmare, dac valoarea null poate s fac parte din
rezultatul subcererii nu trebuie utilizat operatorul NOT IN. Problema nu mai apare
dac se utilizeaz operatorul IN.
Exemplu:
S se obin salariaii care nu au subordonai.
SELECT
FROM
WHERE
e.ename
emp e
e.empno NOT IN (SELECT m.mgr
FROM emp m);
n acest caz, instruciunea SQL nu ntoarce nici o linie deoarece una din
valorile furnizate de subcerere este valoarea null.
Exemplu:
S se obin numele salariailor, salariile, codul departamentului n care
lucreaz i salariul mediu pe departament pentru toi angajaii care au salariul mai
mare ca media salariilor din departamentul n care lucreaz (folosirea subcererii n
clauza FROM).
SELECT a.ename,a.sal,a.deptno,b.salavg
FROM emp a,(SELECT deptno,avg(sal) salavg
FROM emp
GROUP BY deptno) b
WHERE
a.deptno=b.deptno
AND
a.sal>b.salavg
Exemplu:
S se obin lista celor mai scumpe cri.
SELECT
titlu
FROM
carte
WHERE
pret = (SELECT
FROM carte);
MAX(pret)
Exemplu:
S se obin lista scriitorilor care au n bibliotec un numr de exemplare
mai mare dect numrul mediu al crilor din bibliotec.
SELECT
FROM
WHERE
DISTINCT autor
carte
nrex > (SELECT AVG(nrex)
FROM
carte);
Exemplu:
S se obin informaii despre crile al cror pre depete media preurilor
crilor ce aparin aceluiai domeniu
SELECT
FROM
WHERE
*
carte c
pret > (SELECT AVG(pret)
FROM
carte
WHERE
coded = c.coded);
Exemplu:
S se obin lista cititorilor care au mprumutat cel puin o carte.
SELECT
FROM
WHERE
nume
cititor
codec IN (SELECT DISTINCT codec
FROM imprumuta);
Exemplu:
S se obin codurile cititorilor care nu au mprumutat niciodat cri.
SELECT
FROM
WHERE
codec
cititor
codec NOT IN
(SELECT
DISTINCT codec
FROM imprumuta);
Exemplu:
S se obin lista cititorilor care sunt n ntrziere cu predarea crilor.
SELECT
FROM
WHERE
nume
cititor
codec IN (SELECT
FROM
WHERE
AND
DISTINCT codec
imprumuta
dataef IS NULL
dares<SYSDATE);
Exemplu:
S se obin numele cititorilor care au mprumutat cel puin o carte scris de
ZOLA.
SELECT
FROM
WHERE
nume
cititor
codec IN
(SELECT DISTINCT codec
FROM
imprumuta
WHERE codel IN
(SELECT codel
FROM
carte
WHERE autor=ZOLA));
Exemplu:
S se obin numele cititorilor care nu au mprumutat nici o carte scris de
ZOLA.
SELECT
FROM
WHERE
nume
cititor
codec NOT IN
(SELECT DISTINCT codec
FROM imprumuta
WHERE codel IN
(SELECT codel
FROM
carte
WHERE autor=ZOLA));
nume
cititor
codec NOT IN
(SELECT DISTINCT codec
FROM
imprumuta
WHERE codel NOT IN
(SELECT codel
FROM carte
WHERE autor=ZOLA));
Exemplu:
S se obin numele cititorilor care au mprumutat cel puin o carte de
informatic (procedural).
SELECT
nume
FROM
cititor
WHERE
codec IN
(SELECT DISTINCT codec
FROM
imprumuta
WHERE codel IN
(SELECT codel
FROM
carte
WHERE coded=
(SELECT coded
FROM domeniu
WHERE intdom= INFORMATICA)));
Exemplu:
S se obin numele cititorilor i titlurile crilor de informatic mprumutate
de aceti cititori (relational).
SELECT
FROM
WHERE
AND
AND
AND
nume, titlu
cititor, carte, imprumuta, domeniu
imprumuta.codel = carte.codel
carte.coded = domeniu.coded
imprumuta.codec = cititor.codec
intdom = INFORMATICA;
titlu
carte
nrex=(SELECT
FROM
WHERE
AND
COUNT(*)
imprumuta
codel = carte.codel
dataef IS NULL);
Exemplu:
S se obin codurile cititorilor i codul ultimei cri mprumutate.
SELECT
FROM
WHERE
codec, codel
imprumuta i
dataim>=ALL (SELECT dataim
FROM
imprumuta
WHERE codec=i.codec);
dataim=(SELECT MAX(dataim)
FROM
imprumuta
WHERE
codec=i.codec);
Exemplu:
S se obin lista codurilor crilor mprumutate i codul primului cititor care
a mprumutat aceste crti.
SELECT
FROM
WHERE
codel,codec
imprumuta i
dataim<=ALL (SELECT dataim
FROM imprumuta
WHERE i.codel=codel);
Exemplu:
S se obin codurile crilor din care cel puin un exemplar este mprumutat.
SELECT
FROM
WHERE
codel
carte
EXISTS
(SELECT
FROM
WHERE
AND
codel
imprumuta
codel = carte.codel
dataef IS NULL);
imprumuta
codel = carte.codel
dataef IS NULL);
SELECT
FROM
WHERE
titlu
carte
codel IN
(SELECT DISTINCT codel
FROM
imprumuta
WHERE
dataef IS NULL);
Exemplu:
S se obin codurile crilor care nu au fost mprumutate niciodat.
Soluia 1 (cu sincronizare)
SELECT
codel
FROM
carte
WHERE
NOT EXISTS
(SELECT
FROM
WHERE
codel
imprumuta
codel = carte.codel);
codel
carte
codel NOT IN
(SELECT DISTINCT codel
FROM imprumuta);
Exemplu:
S se obin lista salariailor avnd salariul minim n departamentul n care
lucreaz.
SELECT
FROM
WHERE
ename,sal
emp e
sal=(SELECT
FROM
WHERE
MIN(sal)
emp
deptno=e.deptno);
Exemplu:
S se obin numele primilor trei salariai avnd retribuia maxim (ideea
rezolvrii este de a verifica dac numrul salariailor care au leafa mai mare dect
leafa salariatului considerat, este mai mic dect 3).
SELECT
FROM
WHERE
ename
emp a
3>(SELECT COUNT(*)
FROM
emp
WHERE
Exemplu:
S se obin numele cititorilor care au mprumutat cel puin aceleai cri ca
i cititorul avnd codul C19 (ideea problemei este de a selecta cititorii pentru care
este vid lista crilor mprumutatede C19 mai puin lista crilor mprumutate de
acei cititori).
SELECT
nume
FROM
cititor
WHERE
NOT EXISTS
(SELECT codel
FROM imprumuta
WHERE codec=C19
MINUS
SELECT codel
FROM imprumuta
WHERE codec= cititor.codec);
Dac problema era modificat n sensul c cel puineste nlocuit prin cel
mult atunci trebuiau inversate interogrile legate prin MINUS.
Exemplu:
S se obin codurile cititorilor care au mprumutat aceleai cri ca i
cititorul avnd un cod specificat.
Rezolvarea problemei se bazeaz pe ideea: A = B A B i B A (AB) = i (B-A) = A-B i B-A nu furnizeaz nici un tuplu rezultat.
SELECT
codec
FROM
imprumuta i
WHERE
NOT EXISTS
(SELECT codel
FROM
imprumuta
WHERE codec=i.codec
MINUS
SELECT codel
FROM
imprumuta
WHERE codec=&ccc)
AND
NOT EXISTS
(SELECT codel
FROM
imprumuta
WHERE codec=&ccc
AND
MINUS
SELECT codel
FROM
imprumuta
WHERE codec=i.codec)
codec!=&ccc);
SELECT
Operatorul CUBE
Operatorul CUBE grupeaz liniile selectate pe baza valorilor tuturor
combinaiilor posibile ale expresiilor specificate i returneaz cte o linie
totalizatoare pentru fiecare grup. El produce subtotaluri pentru toate combinaiile
posibile de grupri specificate n GROUP BY, precum i un total general.
Daca exista n coloane sau expresii in clauza GROUP BY, vor exista 2 n
combinatii posibile superagregat. Matematic, aceste combinatii formeaza un cub
n-dimensional.
Pentru producerea de subtotaluri fara ajutorul operatorului CUBE ar fi
necesare 2 n instructiuni SELECT legate prin UNION ALL.
Exemplu:
S se afieze valoarea total a operelor de art ale unui autor, expuse n
cadrul fiecrei galerii avnd codul mai mic dect 50. De asemenea, s se afieze
valoarea total a operelor din fiecare galerie avnd codul mai mic dect 50,
valoarea total a operelor fiecrui autor indiferent de galerie i valoarea total a
operelor din galeriile avnd codul mai mic dect 50.
SELECT cod_galerie, cod_artist, SUM(valoare)
FROM opera
WHERE cod_galerie < 50
GROUP BY CUBE(cod_galerie, cod_artist);
COD_GALERIE COD_ARTIST SUM(VALOARE)
10
10
10
40
40
50
60
50
50
60
14000
10000
24000
8080
8080
22080
10000
32080
Funcia GROUPING
Aceasta funcie este util pentru:
determinarea nivelului de agregare al unui subtotal dat, adic a grupului
sau grupurilor pe care se bazeaz subtotalul respectiv;
identificarea provenienei unei valori null a unei expresii calculate, dintruna din liniile mulimii rezultat.
Functia returneaz valoarea 0 sau 1. Valoarea 0 poate indica fie c expresia a
fost utilizat pentru calculul valorii agregat, fie c valoarea null a expresiei este o
valoare null stocat.
Valoarea 1 poate indica fie c expresia nu a fost utilizat pentru calculul
valorii agregat, fie c valoarea null a expresiei este o valoare creat de ROLLUP
sau CUBE ca rezultat al gruprii.
Exemplu:
SELECT cod_galerie, cod_artist, SUM(valoare),
GROUPING(cod_galerie), GROUPING(cod_artist)
FROM opera
WHERE cod_galerie < 50
GROUP BY ROLLUP(cod_galerie, cod_artist);
SUM
GROUPING
GROUPING
(VALOARE) (COD_GALERIE) (COD_ARTIST)
50
14000
0
0
60
10000
0
0
24000
0
1
COD_GALERIE COD_ARTIST
10
10
10
40
40
50
8080
8080
32080
0
0
1
GROUPING SETS
((a, b, c), (a, b), (a, c), (b, c), (a), (b), (c),
())
ROLLUP(a, b,
GROUPING SETS
c)
((a, b, c), (a, b), (a), ())
Exemplu:
Considernd galeriile al cror cod este mai mic dect 50, s se calculeze
0
1
1
An achizitie
2000
2002
2001
2003
Valoare medie
3500
2500
2020
2380
2300
2000
3000
(opera), ceea ce poate fi ineficient. Din acest motiv, este recomandat utilizarea
extensiei GROUPING SETS.
liber, un sir vid sau valoarea zero este o valoare speciala care nu este egala cu
nimic altceva.
n cazul instruciunilor INSERT, trebuie specificate valori pentru toate
coloanele cu restricii NOT NULL.
n cazul instruciunilor UPDATE nu se pot inlocui valorile unei coloane cu
valori nule dac pe coloana respectiv este definit p restricie NOT NULL.
Dac instruciunea DML refer o vizualizare , nu se poate sa o folosim intro instruciune INSERT dac una dintre coloanele tabelului cu o restricie NOT
NULL(obligatorii) lipsete din definirea vizualizrii.
Restricii refereniale
Nu se poate insera sau actualiza valoarea unei chei externe dect dac exist
deja rndul printe corespondent care conine valoarea cheii n coloana cheii
primare. In sens invers, nu se poate terge un rnd printe dac exist rnduri
subordonate care refer valoarea din rndul printe, dect dac restricia a fost
definit cu opiunea ON DELETE CASCADE. In general inserrile n tabele
trebuie fcute ierarhic (mai intai randurile parinte, apoi randurile copii), iar
tergerile trebuie fcute n ordine invers (copiii inaintea prinilor).
Restrictii de verificare (CHECK) O instructiune INSERT sau UPDATE
nu poate stoca ntr-o coloana o valoare care ncalc o restricie CHECK definit
pentru coloana respectiv.
Instruciunea INSERT
Instruciunea INSERT este folosit pentru inserarea noilor rnduri de date n
tabele sau tabele de baz al unei vizualizri. Instruciunea are dou forme de baz:
una n care valorile coloanelor sunt specificate chiar n instruciune i alta n care
valorile sunt selectate dintr-un tabel sau o vizualizare, folosind o subinterogare.
Inserarea unui singur rand de date folosind clauza Values
Instruciunea INSERT care folosete o clauz VALUES poate crea un
singur rnd la fiecare rulare, deoarece valorile pentru rndul de date respective sunt
specificate chiar n instruciune.
FILM
FILM_ID <pk>
MPAA_RATING
MPAA_COD_RATING <pk>
MPAA_DESCRIERE_RATING
FILM_COD_GEN <fk1>
MPAA_COD_RATING <fk2>
FILM_NUME
RETAIL_PRET_VHS
RETAIL_PRET_DVD
AN_PRODUS
FILM_COPII
FILM_ID <pk, fk>>
NUMAR_COPIE <pk>
DATA_CUMPARARE
DATA_VANZARE
FORMAT_MEDIA
FILM_GEN
FILM_COD_GEN <pk>
FILM_DESCRIERE_GEN
GALERIE
cod_galerie#
inclusa_in
M(1)
SALA
cod_sala#
cod_galerie#
1
cuprinsa_in
M(1)
1
ARTIST
cod_artist#
creata_de
M(1)
OPERA
cod_opera#
SECURITATE
cod_opera#
sistem#
1
protejata_prin
asigurata_de
M(0)
M(0)
POLITA_ASIG
cod_polita#
M(1)
M(1)
M(1)
mentionata_in
studiaza
M(0)
M(0)
SURSA_BIBLIO
cod_sursa#
tip
ARTICOL
CARTE
M(1)
editata_de
M(1)
AUTOR
cod_autor#
SPECIALIST
cod_specialist#
figureaza_in
M(0)
EXPOZITIE
cod_expo#
M(1)
organizata_de
M(1)
ORGANIZATOR
cod_organizator#
INSERT
SELECT
FROM
WHERE
NU Inserri multitabel
O inserare multitabel presupune introducerea de linii calculate pe baza
rezultatelor unei subcereri, n unul sau mai multe tabele. Acest tip de inserare,
introdus de Oracle9i, este util n mediul data warehouse. Astfel, datele extrase
dintr-un sistem surs, pot fi transformate utiliznd instruciuni INSERT multitabel,
spre a fi ncrcate n obiectele bazei de date.
Pentru o astfel de inserare, n versiunile anterioare lui Oracle9i erau
necesare n operaii independente INSERT INTOSELECT, unde n reprezint
numrul tabelelor destinaie. Aceasta presupunea n procesri ale aceleiai surse de
date i, prin urmare, creterea de n ori a timpului necesar procesului.
Sintaxa clauzei inserare_multi_tabel este urmtoarea:
{ALL INTO[VALUES] [INTO[VALUES] ]
| inserare_condiionat} subcerere
Clauza inserare_condiionat are forma urmtoare:
[ALL | FIRST]
WHEN condiie THEN INTO[VALUES]
[INTO[VALUES] ]
[WHEN condiie THEN INTO[VALUES]
[INTO[VALUES] ] ]
[ELSE INTO[VALUES]
[INTO[VALUES] ] ]
Pentru a efectua o inserare multitabel necondiionat, sistemul va executa
cte o instruciune INSERTINTO pentru fiecare linie returnat de subcerere.
Utiliznd clauza inserare_condiionat, decizia inserrii unei linii depinde
de condiia specificat prin intermediul opiunii WHEN. Expresiile prezente n
aceste condiii trebuie s fac referin la coloane returnate de subcerere. O
instruciune de inserare multitabel poate conine maxim 127 clauze WHEN.
Specificarea opiunii ALL determin evaluarea tuturor condiiilor din
clauzele WHEN. Pentru cele a cror valoare este TRUE, se insereaz nregistrarea
specificat n opiunea INTO corespunztoare.
Opiunea FIRST determin inserarea corespunztoare primei clauze WHEN a
crei condiie este evaluat TRUE. Toate celelalte clauze WHEN sunt ignorate.
Dac nici o condiie din clauzele WHEN nu este TRUE, atunci sistemul
execut clauza INTO corespunztoare opiunii ELSE, iar dac aceasta nu exist, nu
efectueaz nici o aciune.
Inserrile multitabel pot fi efectuate numai asupra tabelelor, nu i asupra
vizualizrilor sau vizualizrilor materializate. De asemenea, acest tip de inserare nu
se poate efectua asupra tabelelor distante. Subcererea dintr-o instruciune
GROUP BY cod_galerie) x
WHERE g.cod_galerie = x.cod_galerie;
Acelai rezultat se obine prin utilizarea clauzei ELSE, astfel:
INSERT ALL
WHEN nr_opere <= 30 THEN
INTO galerie_mica
WHEN nr_opere > 30 AND nr_opere <= 100 THEN
INTO galerie_medie
ELSE
INTO galerie_mare
SELECT g.cod_galerie, nume_galerie, nr_opere
FROM galerie g, (SELECT cod_galerie, count(*) nr_opere
FROM
opera
GROUP BY cod_galerie) x
WHERE g.cod_galerie = x.cod_galerie;
Exemplu:
Se consider un tabel, galerie_g, avnd aceeai structur ca i cele din
exemplul precedent. n acesta vor fi reinute galeriile al cror nume ncepe cu litera
G. Se presupune c, dac o galerie se ncadreaz n acest tabel, ea nu mai trebuie
s apar i n cele referitoare la numrul de opere gzduite. S se insereze
nregistrri n tabelele galerie_g, galerie_mica, galerie_medie, galerie_mare.
INSERT FIRST
WHEN UPPER(nume_galerie) LIKE 'G%' THEN
INTO galerie_g
WHEN nr_opere <= 30 THEN
INTO galerie_mica
WHEN nr_opere > 30 AND nr_opere <= 100 THEN
INTO galerie_medie
WHEN nr_opere > 100 THEN
INTO galerie_mare
SELECT g.cod_galerie, nume_galerie, nr_opere
FROM galerie g, (SELECT cod_galerie, count(*) nr_opere
FROM
opera
GROUP BY cod_galerie) x
WHERE g.cod_galerie = x.cod_galerie;
Comanda UPDATE
Instruciunea UPDATE este folosit pentru actualizarea datelor din
coloanele unui tabel (sau ale unei vizualizri).
Valorile cmpurilor care trebuie modificate pot fi furnizate explicit sau pot fi
obinute n urma unei cereri SQL.
Sintaxa general a instruciunii UPDATE:
UPDATE nume_tabel_sau_vizualizare
SET nume_coloana = expresie
[,nume_coloana = expresie...]
[ WHERE conditie];
UPDATE nume_tabel_sau_vizualizare
SET
(column1[,column2[,]]) = (subquery) / column = expr /
(query)
[WHERE condition]
Observaii:
Pentru a se putea executa instruciunea UPDATE, utilizatorul
care o lanseaz n execuie trebuie s aib acest privilegiu.
Dac nu este specificat clauza WHERE se vor modifica toate
liniile.
Cererea trebuie s furnizeze un numr de valori corespunztor
numrului de coloane din paranteza care precede caracterul de egalitate.
Se remarc urmtoarele:
Clauza SET conine 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.
Exemple BD CARTE
Preul crilor scrise de Lucian Blaga s fie modificat, astfel nct s fie egal
cu preul celei mai scumpe cri de informatic din bibliotec.
UPDATE carte
SET pret = (SELECT MAX(pret)
FROM carte
WHERE coded = I)
WHERE autor = Lucian Blaga;
Exemplu:
S se modifice preul crilor din bibliotec, care se gsesc ntr-un numr de
exemplare mai mic dect media numrului de exemplare pe bibliotec. Noua
valoare a preului s fie egal cu suma preurilor crilor scrise de Zola.
UPDATE carte
SET pret = (SELECT SUM(pret)
FROM carte
WHERE autor = Zola)
WHERE nrex < (SELECT AVG(nrex)
FROM carte);
Exemplu:
S se reduc cu 10% salariile redactorilor efi care nu sunt asociai
nici unei publicaii.
UPDATE salariat
SET salariu = 0,9*salariu
WHERE cod_salariat IN
(SELECT cod_salariat
FROM redactor_sef
WHERE cod_salariat NOT IN
(SELECT cod_salariat
FROM publicatie));
Exemplu:
S se mreasc cu 5% salariile redactorilor efi ce coordoneaza publicaiile
care au cel mai mare numr de frame-uri.
UPDATE salariat
SET salariu = 1,05*salariu
WHERE cod_salariat IN
(SELECT cod_salariat
FROM publicatie
WHERE nr_publicatie IN
(SELECT nr_publicatie
FROM
frame
GROUP BY nr_publicatie
HAVING COUNT(*) > ALL
(SELECT COUNT(*)
FROM
frame
GROUP BY nr_publicatie)));
FROM opera
WHERE cod_artist =
b.cod_artist)),
(valoare, data_achizitiei) =
(SELECT o.valoare + AVG(o2.valoare)*0.10,
MAX(o2.data_achizitiei)
FROM opera o2
WHERE o.cod_opera = o2.cod_opera)
WHERE cod_artist = (SELECT cod_artist
FROM artist
WHERE INITCAP(nume) = 'Luchian '
AND INITCAP(prenume) = 'Stefan');
Oracle9i introduce o nou funcionalitate, reprezentat de posibilitatea
utilizrii valorilor implicite (DEFAULT) n instruciunile INSERT i UPDATE.
Unei coloane i se atribuie valoarea implicit definit la crearea sau modificarea
structurii tabelului dac:
nu se precizeaz nici o valoare;
se precizeaz cuvntul cheie DEFAULT n comenzile INSERT
sau UPDATE.
Dac nu a fost definit nici o valoare implicit pentru coloana respectiv,
sistemul i atribuie valoarea null. Cuvntul cheie DEFAULT nu poate fi specificat
la actualizarea vizualizrilor.
Exemplu:
S se creeze tabelul test, avnd o coloan creia i se specific o valoare
implicit. Ulterior, s se modifice aceast valoare. S se insereze i s se
actualizeze cte o nregistrare din tabel, utiliznd valoarea implicit.
CREATE TABLE test(
cod NUMBER
PRIMARY KEY,
nume VARCHAR2(30) DEFAULT 'NECUNOSCUT');
ALTER TABLE test MODIFY (nume DEFAULT 'NEDEFINIT');
INSERT INTO test VALUES (1, DEFAULT);
UPDATE test SET nume = DEFAULT WHERE cod = 2;
Exemplu:
S se tearg salariul angajatului avnd codul 1279.
UPDATE salariat
SET salariu=null
WHERE cod_salariat = 1279;
Exemplu:
Urmatoarele doua comenzi sunt echivalente.
DELETE FROM opera
WHERE
cod_opera = 777;
DELETE FROM (SELECT * FROM opera)
WHERE
cod_opera = 777;
Exemplu:
S se tearg cartea cea mai scump
DELETE FROM carte
WHERE pret = (SELECT MAX(pret)
FROM carte);
Exemplu:
Pentru fiecare autor care are mai mult de 10 creaii expuse n muzeu, s se
tearg ultima oper creat de acesta.
DELETE FROM opera o1
WHERE
cod_artist =
(SELECT cod_artist
FROM opera o2
WHERE cod_artist = o1.cod_artist
AND data_crearii =
(SELECT MAX(data_crearii)
FROM opera
WHERE cod_artist = o2.cod_artist)
AND 10 <
(SELECT COUNT(*)
FROM opera
WHERE cod_artist = o2.cod_artist));
c) S se tearg toate operele care se afl expuse ntr-o galerie al crei nume
conine irul de caractere muzeu.
DELETE FROM opera
WHERE cod_galerie = (SELECT cod_galerie
FROM galerie
WHERE UPPER(nume_galerie)
LIKE '%MUZEU%');
Dac se ncearc tergerea unei nregistrri care conine o valoare implicat
ntr-o constrngere de integritate, atunci va fi returnat o eroare.
Exemplu:
DELETE FROM galerie
WHERE cod_galerie = 40;
n urma execuiei acestei instruciuni sistemul genereaz eroarea ORA02292: integrity constraint (STUDENT.SYS_C002773) violated - child record
found, datorat calitii de cheie extern a coloanei cod_galerie n tabelul opera.
Exist opere n galeria avnd codul 40 i de aceea aceasta nu poate fi suprimat.
n cazul n care constrngerea de integritate referenial a fost definit
utiliznd opiunea ON DELETE CASCADE, atunci instruciunea DELETE va
terge att liniile indicate, ct i liniile copil din tabelele corespunztoare.
SELECT
FROM
*
salariat;
(b)
SAVEPOINT
a;
(e)
ROLLBACK TO b;
SELECT
AVG(salariu)
FROM
salariat;
(f)
ROLLBACK TO a;
INSERT INTO salariat
VALUES (18,Ion,Mihai,5,580,redr_sef);
COMMIT;
Consistena la citire
ntr-un sistem multi-user, sistemul Oracle furnizeaz read consistency la
nivel de instruciune SQL, adic o singur comand SQL nu poate da rezultate care
sunt contradictorii sau inconsistente. Read consistency asigur c fiecare utilizator
vede datele aa cum existau la ultimul commit, nainte s nceap o operaie
LMD. Prin urmare, modificrile efectuate asupra unei baze de date nu sunt vizibile
dect dup ce operaia de actualizare a fost validat. Numai utilizatorul care a
executat tranzacia poate vedea modificrile fcute de el n cursul acestei tranzacii.
Modelul multiversiune, furnizat de Oracle, asigur consistena la citire:
garanteaz c setul de date vzut de orice instruciune SQL este
consistent i nu se schimb n timpul execuiei unei instruciuni (Oracle
asigur o consisten la citire la nivel de instruciune);
operaiile de citire (SELECT) nu trebuie s vad datele care sunt
n proces de schimbare;
operaiile de scriere (INSERT, DELETE, UPDATE) nu trebuie
s afecteze consistena datelor i s ntrerup sau s intre n conflict cu alte
operaii de scriere concurente.
Cum se implementeaz modelul multiversiune? Dac asupra bazei este
executat o comand LMD, server-ul Oracle face o copie a datelor dinainte de
modificare i o depune n segmentul rollback (undo).
Toi utilizatorii (cu excepia celor care modific datele) vor vedea datele
cum sunt nainte de modificare (vd coninutul segmentului undo). Dac comanda
LMD este commit, atunci schimbrile din baza de date devin vizibile oricrui
utilizator care folosete instruciunea SELECT. Cnd se termin tranzacia, spaiul
ocupat n segmentul undo de vechea dat este liber pentru reutilizare. Server-ul
Oracle asigur astfel o vizualizare consistent a datelor n orice moment.
Carte
tranzaciei curente. Textul care i urmeaz poate ocupa maxim 255 octei i va fi
stocat n vizualizarea DBA_2PC_PENDING din dicionarul datelor.
ntr-un sistem distribuit, clauza FORCE permite salvarea manual a unei
tranzacii distribuite in-doubt (n care operaia COMMIT a fost ntrerupt de o
cdere a sistemului sau a reelei). Textul care i urmeaz conine identificatorul
local sau global al tranzaciei. Pentru a afla aceti identificatori se poate consulta,
de asemenea, vizualizarea DBA_2PC_PENDING din dicionarul datelor.
Pentru a atribui tranzaciei un system change number (SCN) se specific un
numr ntreg n clauza FORCE. Valoarea unui SCN este mrit ori de cte ori este
salvat o tranzacie. Acest numr are un rol important n asigurarea consistenei la
citire. n general, o cerere citete un bloc de date care are ca atribut un SCN
corespunztor ultimei modificri a blocului respectiv. Dac acest SCN este mai
mare dect cel citit la nceputul interogrii, nseamn c blocul a fost modificat
ulterior lansrii cererii. Prin urmare, trebuie gsit o versiune mai veche a blocului
n segmentele de anulare.
O instruciune COMMIT care conine clauza FORCE permanentizeaz
numai tranzacia specificat i nu o afecteaz pe cea curent. Prezena acestei
clauze nu este permis n PL/SQL.
Exemplu:
S se insereze o nregistrare n tabelul artist i s se permanentizeze
modificarea.
INSERT INTO artist(cod_artist, nume, prenume)
VALUES (189, 'Pallady', 'Theodor');
COMMIT;
nainte de operaia COMMIT, utilizatorul curent poate vizualiza rezultatele
comenzilor LMD prin interogarea tabelelor. Efectele acestor operaii nu sunt
vizibile celorlali utilizatori. Server-ul Oracle asigur consistena la citire, astfel
nct fiecare utilizator vizualizeaz datele n starea corespunztoare ultimei operaii
COMMIT efectuate asupra lor. Liniile afectate de tranzacia curent sunt blocate,
nefiind posibil modificarea lor de ctre ceilali utilizatori.
Dac mai muli utilizatori modific simultan acelai tabel, fiecare dintre
acetia poate consulta numai propriile modificri. Pe msur ce operaia COMMIT
este executat de ctre utilizatori, actualizrile efectuate de acetia devin vizibile.
n urma execuiei instruciunii COMMIT, modificrile asupra datelor sunt
scrise n baza de date, iar starea precedent a datelor este pierdut definitiv. n
acest fel, rezultatele tranzaciei pot fi vizualizate de ctre toi utilizatorii. Blocrile
asupra liniilor afectate sunt eliberate, astfel c nregistrrile devin disponibile
celorlali utilizatori pentru a efectua noi actualizri. Dup operaia COMMIT, toate
punctele intermediare (SAVEPOINT) ale tranzaciei respective sunt terse.
Comanda ROLLBACK
Atunci cnd o linie este modificat, valorile anterioare ale coloanelor
actualizate sunt salvate ntr-un segment de reluare. Dac tranzacia este anulat,
server-ul Oracle va rescrie valorile din acest segment n linia tabelului.
Pentru a renuna la modificrile efectuate se utilizeaz instruciunea
ROLLBACK. n urma execuiei acesteia, se ncheie tranzacia, se anuleaz
modificrile asupra datelor, se restaureaz starea lor precedent i se elibereaz
blocrile asupra liniilor.
O parte a tranzaciei poate fi anulat automat printr-o operaie ROLLBACK
implicit dac a fost detectat o eroare n timpul execuiei unei instruciuni. Dac o
singur instruciune LMD eueaz n timpul execuiei unei tranzacii, efectul su
este anulat de un ROLLBACK la nivel de instruciune, dar schimbrile efectuate de
instruciunile LMD precedente nu sunt anulate. Acestea din urm pot fi salvate sau
anulate explicit de ctre utilizator.
Sintaxa instruciunii ROLLBACK este urmtoarea:
ROLLBACK [WORK]
[TO [SAVEPOINT] pct_intermediar | FORCE 'text'];
Semnificaiile opiunilor WORK i FORCE sunt similare celor prezentate n
cadrul instruciunii COMMIT.
n clauza TO SAVEPOINT se poate specifica punctul intermediar pn la
care se dorete anularea tranzaciei. n absena acestei clauze, ntreaga tranzacie
este anulat. O tranzacie in-doubt nu poate fi anulat manual pn la un punct
intermediar.
Dac a fost definit un punct intermediar prin instruciunea SAVEPOINT
nume, instruciunea ROLLBACK TO SAVEPOINT nume determin ntoarcerea
tranzaciei curente la punctul intermediar specificat.
n felul acesta se revine ntr-o stare anterioar a tranzaciei i se anuleaz
modificrile care au survenit dup definirea punctului intermediar. De asemenea,
sunt terse punctele intermediare ulterioare acestuia i sunt eliberate toate blocrile
asupra tabelelor sau liniilor, efectuate dup punctul intermediar respectiv.
Comanda SAVEPOINT
Instruciunea SAVEPOINT marcheaz un punct intermediar n procesarea
tranzaciei. n acest mod este posibil mprirea tranzaciei n subtranzacii.
Consistena la citire
Utilizatorii pot accesa baza de date prin operaii de citire (instruciuni
SELECT) sau prin operaii de scriere (instruciuni INSERT, UPDATE, DELETE).
Consistena la citire este necesar pentru a asigura c:
datele vizualizate de ctre utilizatorii care scriu i citesc din
baza de date sunt consistente;
utilizatorii care citesc din baza de date nu pot vizualiza starea
datelor care sunt n curs de modificare;
utilizatorii care scriu n baza de date sunt asigurai c
modificrile asupra acesteia se realizeaz n mod consistent;
modificrile pe care le efectueaz un utilizator nu intr n
conflict cu cele ale altui utilizator.
Scopul consistenei la citire este ca fiecare utilizator s vizualizeze datele n
starea existent la ultima operaie COMMIT.
Consistena la citire se implementeaz automat, prin pstrarea unei copii
pariale a bazei de date n segmentele de reluare. Atunci cnd se efectueaz o
operaie INSERT, UPDATE sau DELETE, server-ul Oracle reine o copie a datelor
n starea dinaintea modificrii i o scrie ntr-un segment de reluare.
Pentru toi utilizatorii care citesc din baza de date, cu excepia celui care a
iniiat modificarea, datele sunt vizibile n starea dinaintea nceperii reactualizrii.
Aceti utilizatori vizualizeaz starea datelor din segmentul de reluare. Astfel, se
garanteaz c utilizatorii citesc date consistente care nu sunt n curs de schimbare.
Dup ce se efectueaz operaia COMMIT asupra tranzaciei, modificrile
fcute n baza de date devin vizibile tuturor. Server-ul Oracle creeaz vizualizri
consistente la citire pentru interogrile care au nceput nainte ca tranzacia s fie
salvat. Apoi, spaiul ocupat de datele vechi n segmentul de reluare va fi eliberat
pentru a fi refolosit.
Dac se efectueaz operaia ROLLBACK asupra tranzaciei, modificrile
sunt anulate. Astfel, versiunea datelor salvate n segmentul de reluare este rescris
n tabel, iar baza de date revine n starea de dinaintea nceperii tranzaciei.