Sunteți pe pagina 1din 188

InformaŃii Curs- Baze de date –Anul III-Informatică

Disciplină obligatorie; Anul III, Sem. 5, ore săptămânal, învăŃământ de zi: 2


curs, 2 laborator, total ore semestru 56; 6 credite; examen.

I. CONłINUTUL TEMATIC AL DISCIPLINEI

• Notiuni introductive în domeniul bazelor de date (entitate, relatie, atribut,


limbaje pentru baze de date, componenete şi arhitectura unui sistem de
gestiune a bazelor de date (SGBD), evoluŃia SGBD-urilor)
• Proiectarea bazelor de date simple Proiectarea bazelor de date relaŃionale
(modelarea Entitate-RelaŃie, diagrama E/R, modelul relational, regulile lui
Codd, caracteristicile modelului relational, normalizare, forme normale,
dependenŃe funcŃionale)
• Proiectarea bazelor de date relaŃionale orientate obiect (modelarea orientata
pe obiect cu UML, proiectarea diagramelor de clasă şi de obiecte cu
programul Visio)
• Proiectarea bazelor de date relaŃionale cu programul ACCESS (tabele,
formulare, interogări, rapoarte, comenzi macro, securitate)
• Limbaje de manipulare a datelor relaŃionale
• Concepte de baza ale limbajului SQL
• Limbajul SQL
• ACCESS - SQL

SINTEZE ASUPRA PROGRAMEI ANALITICE


Cursul este structurat în 3 părŃi, astfel:

• Partea I. Concepte ale bazelor de date relaŃionale


• Partea a_II-a. Access
• Partea a_III_a. SQL

Partea I. Concepte ale bazelor de date relaŃionale


În această parte se face o prezentare generală a conceptelor bazelor de date
relaŃionale.
O bază de date este o colecŃie de informaŃii interrelaŃionate gestionate ca o
singură unitate. A ceastă definiŃie este foarte largă, deoarece există mari diferenŃe
între concepŃiile diferiŃilor producători care pun la dispoziŃie sisteme de baze de date.
De exemplu, Oracle Corporation defineşte o bază de date ca fiind o colecŃie de
fişiere fizice gestionate de o singură instanŃă (copie) a produsului software pentru
baze de date, în timp ce Microsoft defineşte o bază de date SQL Server ca fiind o
colecŃie de date şi alte obiecte.
Un obiect al bazei de date este o structură de date denumită, stocată în bază de
date, cum ar fi un tabel, o vizualizare sau un index.
Există mari diferenŃe între implementările furnizorilor de baze de date. În
majoritatea sistemelor de baze de date, datele sunt stocate în mai multe fişiere fizice,
dar în Microsoft Access toate obiectele bazei de date, împreună cu datele care aparŃin
unei baze de date sunt stocate într-un singur fişier fizic.(Un fişier este o colecŃie de
înregistrări înrudite stocate ca o singură untiate de sistemul de operare al
calculatorului.) Totuşi, unul dintre principalele avantaje ale bazelor de date relaŃionale
este faptul că detaliile de implementare fizică sunt separate de definiŃiile logice ale
obiectelor bazei de date, astfel încât majoritatea utilizatorilor bazei de date nu au
nevoie să ştie unde (şi cum) sunt stocate obiectele bazei de date în sistemul de fişiere
al calculatorului. De fapt , pe măsură ce veŃi învăŃa limbajul SQL , veŃi vedea că nu
este nevoie să specificaŃi numele unui fişier fizic într-o instrucŃiune SQL decât atunci
când definiŃi sau modificaŃi chiar obiectele bazei de date.

Sistem de gestionare a bazei de date (DBMS)

Un sistem de gestionare a bazei de date (DBMS database management system)


este un produs software furnizat de producătorul bazei de date. Produse software
precum Microsoft Access, Microsoft SQL Server, Oracle Database,Sybase,
DB2,INGRES, MySQL şi Postgre SQL fac parte din categoria DBMS sau, mai corect,
DBMS relaŃionale (RDBMS).
RDBMS-urile sunt cunoscute şi sub numele de SGBD-uri. Ambele prescurtări
vor fi folosite în acestă expunere.
Bazele de date relaŃionale sunt definite şi prezentate în secŃiunea următoare a
acestu capitol.
Sistemul DBMS pune la dispoziŃie toate serviciile de bază necesare pentru
organizarea şi întreŃinerea bazei de date, inclusiv următoarele:
Transferarea datelor în şi din fişierele fizice de date, în funcŃie de cerinŃe.
Gestionarea accesului concurenŃial la date al mai multor utilizatori , inclusiv
prevenirea conflictelor care ar putea fi cauzate de actualizările simultane.
Gestionarea tranzacŃiilor, astfel încât toate modificările făcute asupra bazei de
date printr-o tranzacŃie să fie executate ca o singură unitate.Cu alte cuvinte, dacă
tranzacŃia reuşeşte, toate modificările efectuate de tranzacŃie sunt înregistrate în bază
de date; dacă tranzacŃia eşuează, nici una dintre modificări nu este înregistrată în bază
de date.Totuşi, reŃineŃi ca unele sisteme RDBMS nu asigură suportul pentru tranzacŃii.
Acceptă un limbaj de interogare, care reprezintă sistemul de comenzi folosit
de utilizator pentru a obŃine date din bază de date.SQL este principalul limbaj folosit
pentru sistemele DBMS relaŃionale şi subiectul principal al aceste cărŃi.
FuncŃii pentru salvarea bazei de date şi pentru refacerea bazei de date în urma
erorilor.
Mecanisme de securitate pentru împiedicarea accesului neautorizat la date şi
modificarea acestora.

Bază de date relaŃională

O bază de date relaŃională este o bază de date care respectă modelul relaŃional,
dezvoltat de Dr.E.F.Codd. Modelul relaŃional prezintă datele sub forma familiarelor
tabele bidimensionale, similar cu o foaie de calcul tabelar. Spre deosebire de o foaie
de calcul tabelar, nu este obligatoriu ca datele să fie stocate într-o formă tabelară, iar
modelul permite şi combinarea tabelelor (crearea uniunilor (joining), în terminologia
relaŃională) pentru formarea vizualizarilor, care sunt prezentate tot ca tabele
bidimensionale. Flexibilitatea extraordinară a bazelor de date relaŃionale este dată de
posibilitatea de a folosi tabelele independent sau în combinaŃii, fără nici o ierarhie sau
secvenŃa predefinita în care trebuie să se facă accesul la date.

Un model este o reprezentare a obiectelor şi evenimentelor lumii reale şi a


asocierilor dintre ele. De fapt, el reprezintă o abstracŃie asupra aspectelor
semnificative ale unei „întreprinderi“, ale unui sistem real, ignorând proprietăŃile
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ă. DiferenŃa 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 funcŃionale ale procesului modelat.
Un model de date reprezintă o colecŃie integrată de concepte necesare
descrierii:
• datelor,
• relaŃiilor dintre ele,
• constrângerilor existente asupra datelor sistemului real analizat.
Modelarea unei baze de date permite trecerea de la percepŃia unor fapte din
lumea reală la reprezentarea lor prin date. Modelul de date trebuie să reflecte fidel
fenomene ale lumii reale, să urmărească evoluŃia 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, fără ambiguităŃi, cunoştinŃele lor privind
funcŃionarea şi organizarea modelului real analizat. Prin urmare, un model de date
trebuie să reprezinte datele şi să le facă înŃelese.
În esenŃă, modelul de date are trei componente:
• mulŃime de reguli conform cărora sunt construite bazele de date (partea
structurală);
• mulŃime de operaŃii permise asupra datelor, care sunt utilizate pentru
reactualizarea sau regăsirea datelor (partea de prelucrare);
• mulŃime de reguli de integritate, care asigură coerenŃa datelor.
• Abordarea generală a problemei modelării semantice a datelor se face în
patru etape.
• Se identifică o mulŃime de concepte semantice care sunt utile în descrierea
lumii reale. Se presupune că lumea reală (modelul real analizat) este
formată din entităŃi care au anumite proprietăŃi, că fiecare entitate are o
identitate, că există legături, corelaŃii între entităŃi. Conceptul de corelaŃie,
ca şi cel de entitate, este util, în mod intuitiv, la descrierea modelului.
• Se caută o mulŃime de obiecte formale, simbolice care sunt utilizate pentru
reprezentarea conceptelor semantice anterioare.
• Se dau reguli de integritate formale şi generale (constrângeri) care să
reflecte restricŃiile la care este supus modelul.
• Se defineşte o mulŃime de operatori formali prin care pot fi prelucrate şi
analizate obiectele formale.
Modelul entitate-relaŃie

Una dintre cele mai cunoscute abordări ale modelării semantice (cu siguranŃă
una dintre cele mai utilizate) este cea bazată pe modelul entitate-relaŃie (E/R).
Acesta a fost introdus de către P.P. Chen în 1976 şi rafinat de atunci în diverse moduri
de către acesta şi de mulŃi alŃi cercetători, ca un model de date conceptual, pentru a
uşura proiectarea bazelor de date. Pentru reprezentarea grafică a modelului sunt
utilizate diagramele E/R, care sunt modele neformalizate pentru reprezentarea unui
model, unui sistem din lumea reală.
Diagramele E/R constituie o tehnică de reprezentare a structurii logice a bazei
de date, într-o manieră grafică. Aceste diagrame oferă un mijloc simplu şi inteligibil
de comunicare a caracteristicilor importante ale designului unei anumite baze de date.
Diagrama E/R este un model de date conceptual de nivel înalt, independent de
platforma hardware utilizată şi de tipul SGBD-ului. Modelul este constituit din
concepte care descriu structura bazei de date şi tranzacŃiile de regăsire sau
reactualzare asociate.
Popularitatea modelului E/R ca modalitate de abordare a proiectării bazelor de
date poate fi atribuită în principal tehnicii de realizare a diagramelor E/R. Această
tehnică, ca şi modelul E/R însuşi, a evoluat de-a lungul timpului datorită noilor
problematici care au apărut în proiectarea bazelor de date.
Baza de date poate fi definită ca o mulŃime de date ce modelează un sistem
real. Acest sistem este format din obiecte legate între ele. Modelul E/R împarte
elementele unui sistem real în două categorii: entităŃi şi relaŃii (legături, asocieri)
între aceste entităŃi. EntităŃiile şi legăturile au anumite caracteristici, numite atribute.
Nu trebuie confundat conceptul de relaŃie, în sensul de asociere, care intervine în
definirea diagramei E/R cu conceptul de relaŃie care este specific modelului relaŃional.

Entitate
Entitatea este un obiect sau un concept, care este semnificativ pentru modelul
real analizat. O entitate poate fi dependentă (slabă), existenŃa sa depinzând de altă
entitate sau independentă (tare), caz în care ea nu depinde de existenŃa altei entităŃi.
Entitatea poate fi persoană, loc, concept, activitate etc. Prin urmare, ea poate fi
un obiect cu existenŃă fizică, reală sau poate fi un obiect cu existenŃă conceptuală,
abstractă.
Cheia primară este un identificator unic în cadrul entităŃii, făcând distincŃie
între valori diferite ale acesteia.

Cheia primară:
• trebuie să fie unică şi cunoscută la orice moment;
• trebuie să fie controlată de administratorul bazei;
• trebuie să nu conŃină informaŃii descriptive, să fie simplă, fără ambiguităŃi;
• să fie stabilă;
• să fie familiară utilizatorului.

ObservaŃii
• EntităŃile devin tabele în modelele relaŃionale.
• În general, entităŃile se scriu cu litere mari.
• EntităŃile sunt substantive, dar nu orice substantiv este o entitate. Trebuie
ignorate substantivele nerelevante.
• Pentru fiecare entitate este obligatoriu să se dea o descriere detaliată.
Nu pot exista, în aceeaşi diagramă, două entităŃi cu acelaşi nume, sau o aceeaşi
entitate cu nume diferite.

DEPARTAMENT
SARCINA

lucreaza_in conduce
apartine_la

atasat_la
SALARIAT PROIECT

RelaŃie
RelaŃia (asocierea) este o comunicare între două sau mai multe entităŃi. O
valoare a unei relaŃii este o comunicare între valorile entităŃilor pe care le leagă.
RelaŃia exprimă un raport care există între aceste entităŃi. Gradul unei relaŃii
este dat de numărul de entităŃi participante într-o relaŃie (de exemplu, relaŃie binară,
ternară, cvadruplă, n-ară).
ExistenŃa unei relaŃii este subordonată existenŃei entităŃilor pe care le leagă.
Între două entităŃi pot exista mai multe relaŃii.
O relaŃie în care aceeaşi entitate participă mai mult decât o dată în diferite
roluri defineşte o relaŃie recursivă. Uneori, aceste relaŃii sunt numite unare.
ObservaŃii:
• În modelul relaŃional, relaŃiile devin tabele speciale sau coloane speciale
care referă chei primare.
• RelaŃiile sunt verbe, dar nu orice verb este o relaŃie.
• Pentru fiecare relaŃie este important să se dea o descriere detaliată.
• În aceeaşi diagramă pot exista relaŃii diferite cu acelaşi nume. În acest caz,
ele sunt diferenŃiate de către entităŃile care sunt asociate prin relaŃia
respectivă.
• Pentru fiecare relaŃie trebuie stabilită cardinalitatea (maximă şi minimă)
relaŃiei, adică numărul de tupluri ce aparŃin relaŃiei.

poate (cardinalitate maximă)  trebuie (cardinalitate minima)

EXEMPLE:
CâŃi salariaŃi pot lucra într-un departament? MulŃi!
În câte departamente poate lucra un salariat? In cel mult unul!

RelaŃia SALARIAT_lucreaza_in_DEPARTAMENT are cardinalitatea
maximă many-one (n:1).
Exemplu:
CâŃi salariaŃi trebuie să conducă un departament? Cel puŃin unul!
Câte departamente trebuie să conducă un salariat? Zero!

RelaŃia SALARIAT_conduce_DEPARTAMENT are cardinalitatea minimă
one-zero (1:0).
Asupra entităŃilor participante într-o relaŃie pot fi impuse constrângeri care
trebuie să reflecte restricŃiile care există în lumea reală asupra relaŃiilor. O clasă de
constrângeri, numite constrângeri de cardinalitate, este definită de numărul de
înregistrări posibile pentru fiecare entitate participantă (raport de cardinalitate). Cel
mai întâlnit tip de relaŃii este cel binar, iar în acest caz rapoartele de cardinalitate sunt,
în general, one-to-one (1:1), one-to-many (1:n) sau many-to-many (m:n).

Atribut
Atributul este o proprietate descriptivă a unei entităŃi sau a unei relaŃii. De
exemplu, numele , genul unei film, sunt atribute al entităŃii FILM.
Atributele pot fi simple (pretul de închiriere a unui film), compuse (de
exemplu, numele filmului), cu valori multiple (de exemplu, limbile în care e tradus un
film), derivate (de exemplu, vârsta unei persoane se obŃine din data naşterii).
ObservaŃii
• Trebuie făcută distincŃia între atribut care uzual devine coloană în modelele
relaŃionale şi valoarea acestuia, care devine valoare în coloane.
• Atributele sunt substantive, dar nu orice substantiv este atribut.
• Fiecărui atribut trebuie să i se dea o descriere completă în specificaŃiile
modelului (exemple, contraexemple, caracteristici).
• Pentru fiecare atribut trebuie specificat numele, tipul fizic (integer, float,
char etc.), valori posibile, valori implicite, reguli de validare, constrângeri,
tipuri compuse.

Diagrama entitate- relaŃie


Pentru proiectarea diagramei entitate-relaŃie au fost stabilite anumite reguli
• entităŃile sunt reprezentate prin dreptunghiuri;
• relaŃiile dintre entităŃi sunt reprezentate prin arce neorientate;
• atributele care reprezintă chei primare trebuie subliniate sau marcate prin
simbolul „#“ sau (pk), plasat la sfârşitul numelui acestor atribute;
• cardinalitatea minimă este indicată în paranteze, iar cardinalitatea maximă
se scrie fără paranteze;
• nu este necesar să fie specificate, în cadrul diagramei, toate atributele.
SALARIAT PROIECT
cod_salariat nr_proiect
nume descriere
prenume atasat_la buget_alocat
sex M(0) M(0)
salariu
data_initiala
functia

1 M(0)
apartine_la
conduce lucreaza_in

1(0)
11 M
DEPARTAMENT SARCINA
cod_departament nr_proiect
nume nr_sarcina
nr_cladire data_inceperii
cod_salariat stare

Diagrama Entitate/relaŃie

Cazuri speciale de entităŃi, relaŃii, atribute şi modul lor de reprezentare în


cadrul diagramei entitate-relaŃie.
1. Entitate dependentă – nu poate exista în mod independent (SARCINA
depinde de PROIECT). Cheia primară a unei entităŃi dependente include cheia
primară a sursei (nr_proiect) şi cel puŃin o descriere a entităŃii (nr_sarcina).
Entitatea dependentă se desenează prin dreptunghiuri cu linii mai subŃiri.
2. Moştenirea atributelor. Subentitate (subclasă) – submulŃime a unei alte
entităŃi, numită superentitate (superclasă) (SALARIAT < –– >
PROGRAMATOR). Subentitatea se desenează prin dreptunghiuri incluse în
superentitate. Există o relaŃie între o subentitate şi o superentitate, numită
ISA, care are cardinalitatea maximă 1:1 şi minimă 1:0. Cheile primare,
atributele şi relaŃiile unei superentităŃi sunt valabile pentru orice subentitate.
AfirmaŃia reciprocă este falsă.
3. Într-o diagramă E/R se pot defini relaŃii recursive.
4. RelaŃie sau atribut? Dacă un atribut al unei entităŃi reprezintă cheia primară a
unei alte entităŃi, atunci el referă o relaŃie (cod_departament în tabelul
SALARIAT).
5. Entitate sau relaŃie? Se cercetează cheia primară. Dacă aceasta combină cheile
primare a două entităŃi, atunci este vorba de o relaŃie. (cheia primară a relaŃiei
asociat_la combină cod_salariat cu nr_proiect, prin urmare,
SALARIAT_asociat la_PROIECT va defini o relaŃie şi nu o entitate).

Probleme
1.Să se creeze modelul E/R pentru gestiunea activităŃilor de împrumut dintr-o
bibliotecă

S-a presupus (restrictiv) că într-o zi un cititor nu poate împrumuta, de


mai multe ori, aceeaşi carte.
EntităŃile şi relaŃiile care intervin în acest model sunt următoarele:
1. CARTE (entitate independentă) – orice carte care se găseşte în inventarul
bibliotecii. Cheia primară este atributul codel.
2. CITITOR (entitate independentă) – orice cititor care poate împrumuta
cărŃi. Cheia primară este atributul codec.
3. DOMENIU (entitate independenta) – domeniul căruia îi aparŃine o carte.
Cheia primară este atributul coded.
4. IMPRUMUTA – relaŃie având cardinalitatea m:m care leagă entităŃile
CITITOR şi CARTE.
5. APARTINE – relaŃie care leagă atributele CARTE şi DOMENIU. RelaŃia
are cardinalitatea maximă m:1, iar cardinalitatea minimă 1:1.

CITITOR
M(1) M(0) codec#
CARTE
nume
codel#
dep
titlu imprumuta
autor
pret
nrex

M(0) 1 DOMENIU
coded#
intdom
apartine

2.EvidenŃa şcolilor de şoferi din Romania. CompletaŃi relaŃiile (lucreaza_la,


conduce, sustine, asista, instruieste) dintre entităŃi şi specificaŃi cardinalitatea!

SCOALA CLIENT
cod_scoala# cod_client#
INSTRUCTOR EXAMEN
cod_instructor# cod_examen#

EXAMINATOR
MASINA
cod_examinator#
cod_masina#

3. Campionatele de fotbal ale diferitelor Ńări

ECHIPA SPONSOR
Cod_echipa# M(1) sustine M(1) M(1)
Cod_sponsor#
Nume
Nume
Oras
2

joaca
M(1)
MECI
Tara#
Nr_etapa#
Cod_meci#

M(1)

apartine_de
1
ETAPA
Tara
Nr_etapa
M(1)
atasata_la
1
CAMPIONAT
Tara#

Modelul relaŃional
Modelul relaŃional a fost conceput şi dezvoltat de E.F. Codd. El este un model
formal de organizare conceptuală a datelor, destinat reprezentării legăturilor dintre
date, bazat pe teoria matematică a relaŃiilor. Modelul relaŃional este alcătuit numai din
relaŃii şi prin urmare, orice interogare asupra bazei de date este tot o relaŃie.
Cercetarea în domeniu  3 mari proiecte (System R, INGRES, PRTV)
CalităŃi:
• este simplu;
• riguros din punct de vedere matematic;
• nu este orientat spre sistemul de calcul.
ModalităŃi pentru definirea unui SGBD relaŃional:

• prezentarea datelor în tabele supuse anumitor operaŃii de tip proiecŃie,


selecŃie, reuniune, compunere, intersecŃie etc.
• un sistem de baze de date ce suportă un limbaj de tip SQL – Structured
Query Language;
• un sistem de baze de date care respectă principiile modelului relaŃional
introdus de E.F. Codd.
Caracteristicile unui model relaŃional:
• structura relaŃională a datelor;
• operatorii modelului relaŃional;
• regulile de integritate care guvernează folosirea cheilor în model.
Aceste trei elemente corespund celor trei componente ale ingineriei software:
informaŃie, proces, integritate.
Structura datelor
Definirea noŃiunilor de domeniu, relaŃie, schemă relaŃională, valoare null şi
tabel vizualizare (view).
Conceptele utilizate pentru a descrie formal, uzual sau fizic elementele de bază
ale organizării datelor sunt date în următorul tabel:
Formal Uzual Fizic
relaŃie tablou fişier
tuplu linie înregistrare
atribut coloană câmp
domeniu tip de dată tip de dată

Reguli de integritate sunt aserŃiuni pe care datele conŃinute în baza de date


trebuie să le satisfacă.
Există trei tipuri de constrângeri structurale (de cheie, de referinŃă, de entitate)
ce constituie mulŃimea minimală de reguli de integritate pe care trebuie să le respecte
un SGBD relaŃional. RestricŃiile de integritate minimale sunt definite în raport cu
noŃiunea de cheie a unei relaŃii.
O mulŃime minimală de atribute ale căror valori identifică unic un tuplu într-o
relaŃie reprezintă o cheie pentru relaŃia respectivă.
Fiecare relaŃie are cel puŃin o cheie. Una dintre cheile candidat va fi
aleasă pentru a identifica efectiv tupluri şi ea va primi numele de cheie primară. Cheia
primară nu poate fi reactualizată. Atributele care reprezintă cheia primară sunt fie
subliniate, fie urmate de semnul #.
O cheie identifică linii şi este diferită de un index care localizează liniile. O
cheie secundară este folosită ca index pentru a accesa tupluri. Un grup de atribute din
cadrul unei relaŃii care conŃine o cheie a relaŃiei poartă numele de supercheie.
Fie schemele relaŃionale 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 străină) pentru R1.
Modelul relaŃional respectă trei reguli de integritate structurală.
 Regula 1 – unicitatea cheii. Cheia primară trebuie să fie unică şi
minimală.
 Regula 2 – integritatea entităŃii. Atributele cheii primare trebuie să fie
diferite de valoarea null.
 Regula 3 – integritatea referirii. O cheie externă trebuie să fie ori null în
întregime, ori să corespundă unei valori a cheii primare asociate.

Transformarea entităŃilor
 EntităŃile independente devin tabele independente. Cheia primară nu
conŃine chei externe.
 EntităŃile dependente devin tabele dependente. Cheia primară a
entităŃilor dependente conŃine cheia primară a entităŃii de care depinde
(cheie externă) plus unul sau mai multe atribute adiŃionale.
 SubentităŃile devin subtabele. Cheia externă se referă la supertabel, iar
cheia primară este această cheie externă (cheia primară a subentităŃii
PROGRAMATOR este cod_salariat care este o cheie externă).

Transformarea relaŃiilor
 RelaŃiile 1:1 şi 1:n devin chei externe. RelaŃia conduce devine coloană în
tabelul DEPARTAMENT, iar relaŃia lucreaza_in devine coloană în tabelul
SALARIAT. Simbolul „ד indică plasamentul cheii externe, iar simbolul
„ד exprimă faptul că această cheie externă este conŃinută în cheia primară.
RelaŃia 1:1 plasează cheia externă în tabelul cu mai puŃine linii.
 RelaŃia m:n devine un tabel special, numit tabel asociativ, care are două
chei externe pentru cele două tabele asociate. Cheia primară este
compunerea acestor două chei externe plus eventuale coloane adiŃionale.
Tabelul se desenează punctat.
 RelaŃiile de tip trei devin tabele asociative. Cheia primară este
compunerea a trei chei externe plus eventuale coloane adiŃionale.

Transformarea atributelor
 Un atribut singular devine o coloană.
 Atributele multiple devin tabele dependendente ce conŃin cheia primară a
entităŃii şi atributul multiplu. Cheia primară este o cheie externă, plus una
sau mai multe coloane adiŃionale.
EntităŃile devin tabele, iar atributele lor devin coloane în aceste tabele. Ce
devin atributele relaŃiilor? Pentru relaŃii 1:1 şi 1:n, atributele relaŃiilor vor aparŃine
tabelului care conŃine cheia externă, iar pentru relaŃii m:n şi de tipul trei, atributele vor
fi plasate în tabelele asociative.

SALARIAT
cod_salariat# PROIECT
salariu nr_proiect#
nume job_cod
descriere
sex
ATASAT_LA buget_alocat
AGENT_TERITORIAL cod_salariat#
zona nr_proiect#
comision functie

PROGRAMATOR
limbaj
nivel

apartine_la

conduce lucreaza_in casatorit SARCINA


nr_proiect#
nr_sarcina#
data_inceperii
stare
DEPARTAMENT TELFON
cod_departament# cod_salariat#
nume nr_telefon#
nr_cladire
cod_salariat

Schemele relaŃionale corespunzătoare acestei diagrame conceptuale sunt


următoarele:
– SALARIAT(cod_salariat#, nume, prenume, sex, job_cod, cod_sot,
forma_plata, nr_depart);
– DEPARTAMENT(cod_departament#, nume, numar_cladire, cod_sal);
– ATASAT_LA(cod_salariat#, nr_proiect#, functia);
– PROIECT(nr_proiect#, descriere, buget_alocat);
– SARCINA(nr_proiect#, nr_sarcina, data_inceperii, stare);
– AGENT_TERITORIAL(cod_salariat#, zona, comision);
– PROGRAMATOR(cod_salariat#, limbaj, nivel);
– TELEFON(cod_salariat#, nr_telefon#).

Regulile lui Codd


Caracteristici ale modelului relaŃional:
• nu există tupluri identice;
• ordinea liniilor şi a coloanelor este arbitrară;
• articolele unui domeniu sunt omogene;
• fiecare coloană defineşte un domeniu distinct şi nu se poate repeta în cadrul
aceleiaşi relaŃii;
• toate valorile unui domeniu corespunzătoare tuturor cazurilor nu mai pot fi
descompuse în alte valori (sunt atomice).
Avantajele modelului relaŃional:
• fundamentare matematică riguroasă;
• independenŃă fizică a datelor;
• posibilitatea filtrărilor;
• existenŃa unor structuri de date simple;
• realizarea unei redundanŃe minime;
• supleŃe în comunicarea cu utilizatorul neinformatician.
Ca limite ale modelului relaŃional putem menŃiona:
• rămâne totuşi redundanŃă,
• ocupă spaŃiu,
• apar fenomene de inconsistenŃă,
• nu există mecanisme pentru tratarea optimă a cererilor recursive,
• nu lucrează cu obiecte complexe,
• nu există mijloace perfecŃionate pentru exprimarea constrângerilor de
integritate,
• nu realizează gestiunea totala a datelor distribuite,
• nu realizează gestiunea cunoştinŃelor.

În anul 1985, E.F. Codd a publicat un set de 13 reguli în raport cu care un


sistem de gestiune a bazelor de date poate fi apreciat ca relaŃional. Nici un sistem de
gestiune a bazelor de date pus în vânzare pe piaŃa comercială nu respectă absolut toate
regulile definite de Codd, dar acest lucru nu împiedică etichetarea acestor sisteme
drept relaŃionale.
Nu trebuie apreciat un SGBD ca fiind relaŃional sau nu, ci măsura în care
acesta este relaŃional, deci numărul regulilor lui Codd pe care le respectă.
Regula 1 – regula gestionării datelor. Un SGBD relaŃional trebuie să fie
capabil să gestioneze o bază de date numai prin posibilităŃile sale relaŃionale.
Regula 2 – regula reprezentării informaŃiei. Într-o bază de date relaŃională,
informaŃia este reprezentată la nivel logic sub forma unor tabele ce poartă numele de
relaŃii.
Regula 3 – regula accesului garantat la date. Fiecare valoare dintr-o bază de
date relaŃională trebuie să poată fi adresată în mod logic printr-o combinaŃie formată
din numele relaŃiei, valoarea cheii primare şi numele atributului.
Regula 4 – regula reprezentării informaŃiei necunoscute. Un sistem relaŃional
trebuie să permită utilizatorului definirea unui tip de date numit „null“ pentru
reprezentarea unei informaŃii necunoscute la momentul respectiv.
Regula 5 – regula dicŃionarelor de date. Asupra descrierii bazelor de date
(informaŃii relative la relaŃii, vizualizări, indecşi etc.) trebuie să se poată aplica
aceleaşi operaŃii ca şi asupra datelor din baza de date.
Regula 6 – regula limbajului de interogare. Trebuie să existe cel puŃin un
limbaj pentru prelucrarea bazei de date.
Regula 7 – regula de actualizare a vizualizării. Un SGBD trebuie să poată
determina dacă o vizualizare poate fi actualizată şi să stocheze rezultatul interogării
într-un dicŃionar de tipul unui catalog de sistem.
Regula 8 – regula limbajului de nivel înalt. Regulile de prelucrare asupra
unei relaŃii luată ca întreg sunt valabile atât pentru operaŃiile de regăsire a datelor,
cât şi asupra operaŃiilor de inserare, actualizare şi ştergere a datelor.
Regula 9 – regula independenŃei fizice a datelor: Programele de aplicaŃie şi
activităŃile utilizatorilor nu depind de modul de depunere a datelor sau de modul de
acces la date.
Regula 10 – regula independenŃei logice a datelor. Programele de aplicaŃie
trebuie să fie transparente la modificările de orice tip efectuate asupra datelor.
Regula 11 – regula independenŃei datelor din punct de vedere al integrităŃii.
Regulile de integritate trebuie să fie definite într-un sublimbaj relaŃional, nu în
programul de aplicaŃie.
Regula 12 – regula independenŃei datelor din punct de vedere al distribuirii.
Distribuirea datelor pe mai multe calculatoare dintr-o reŃea de comunicaŃii de date,
nu trebuie să afecteze programele de aplicaŃie.
Regula 13 – regula versiunii procedurale a unui SGBD. Orice componentă
procedurală a unui SGBD trebuie să respecte aceleaşi restricŃii de integritate ca şi
componenta relaŃională.
Deoarece regulile lui Codd sunt prea severe pentru a fi respectate de un
SGBD operaŃional, s-au formulat criterii minimale de definire a unui sistem de
gestiune relaŃional.
Un SGBD este minimal relaŃional dacă:
• toate datele din cadrul bazei sunt reprezentate prin valori în tabele;
• nu există pointeri observabili de către utilizator;
• sistemul suportă operatorii relaŃionali de proiecŃie, selecŃie şi compunere
naturală, fără limitări impuse din considerente interne.
Un SGBD este complet relaŃional dacă este minimal relaŃional şi satisface în
plus condiŃiile:
• sistemul suportă restricŃiile de integritate de bază (unicitatea cheii primare,
constrângerile referenŃiale, integritatea entităŃii).
• sistemul suportă toate operaŃiile de bază ale algebrei relaŃionale.

Exemplu pentru însuşirea formelor normale şi a instrucŃiunilor SQL

Componentelor fundamentale ale bazelor de date relaŃionale sunt utilizate


pentru a construi obiectele bazelor de dae pe care le vom folosi .
InstrucŃiunile SQL folosite pentru crearea acestor componente ale bazei de
date sunt prezentate în parte.

Tabele
Unitatea primară de stocare a datelor într-o bază de date relaŃională este
tabelul, care este o structură bidimensională compusă din rânduri şi coloane. Fiecare
tabel reprezintă o entitate, ceea ce înseamnă o persoană, un loc sau un lucru care
trebuie să fie reprezentat în baza de date, cum ar fi un client, un cont bancar sau o
tranzacŃie bancară. Fiecare rând al tabelului reprezintă o apariŃie a entităŃii. Figura 1-1
reprezintă listingul parŃial al unui tabel numit FILM(filme).
Tabelul FILM este parte a unei baze de date pentru un magazin de produse
video, folosit ca exemplu în toată aceast curs. Tabelul FILM conŃine date care descriu
filmele disponibile în magazinul de produse video. Fiecare rând din tabel reprezintă
un film, iar fiecare coloană reprezintă o caracteristică a filmului respectiv, cum ar fi
titlul filmului sau categoria MPAA(Motion Picture Associationof America care a fost
fondată în 1972 în America ca asociaŃie a producătorilor de film pe lângă industria
cinematografică)

FILM_I FILM_C MPA FILM_NUME PRET_INCHIR PRET_INCHIR AN_P


D OD_GE A_CO _VHS _DVD RODU
N DRAT S
ING
1 Drama R Mystic River 58.97 19.96 2003
2 ActAv R The Last Samurai 15.95 19.96 2003
3 Comedie PG-13 Something`s Gotta 14.95 29.99 2003
Give
4 ActAv PG-13 The Italian Job 11.95 19.99 2003
5 ActAv R Kill Bill: Vol 1 24.99 29.99 2003
6 ActAv PG-13 Pirates of the 29.99 29.99 2003
Caraibbean: The
Curse of the Black
Pearl
7 Drama PG-13 Big Fish 14.95 19.94 2003
8 ActAv R Man on Fire 50.99 29.98 2004
9 ActAv PG-13 Master and 12.98 39.99 2003
Commander: The Far
Side of the World
10 Drama R Lost in translation 49.99 14.98 2003
11 Romantic PG-13 Two Weeks Notice 6.93 14.97 2002
12 Comedie PG-13 50 First Dates 9.95 19.94 2004
13 Comedie PG-13 Matchstick Men 6.93 19.97 2003
14 Drama R Could Mountain 24.99 29.99 2003
15 Drama R Road to Perdition 9.99 14.99
16 Comedie PG-13 The School of Rock 11.69 29.99 2003
17 Romantic PG-13 13 Going on 30 14.94 28.95 2004
18 Drama R Monster 24.99 29.99 2003
19 ActAv PG-13 The Day After 12.98 29.98 2004
Tomorrow
20 Strain R Das Boot 17.99 19.94 1981
Figura 1-1 Listingul tabelului FILM

Se poate observa asemănarea dintre tabelele bazelor de date relaŃionale şi foile


de calcul tabelar. Totuşi, bazele de date relaŃionale oferă o flexibilitate mult mai mare
în organizarea şi afişarea informaŃiilor.

RelaŃii
RelaŃiile reprezintă asocierile dintre tabelele bazelor de date relaŃionale. Deşi
fiecare tabel relaŃional poate exista independent, esenŃa bazelor de date este tocmai
stocarea informaŃiilor între care există legături. De exemplu, pe lângă filmele propriu-
zise, puteŃi stoca informaŃii despre categoriile folosite de magazin pentru organizarea
inventarelor de filme. În acelaşi timp, puteŃi stoca şi informaŃii despre copiile fiecărui
film, inclusiv data la care a fost primită copia şi formatul acesteia, cum ar fi DVD sau
VHS. Prin folosirea realaŃiilor, puteŃi asocia tabelele înrudite, într-un mod formal,
uşor de folosit astfel încât puteŃi să combinaŃi date din tabele multiple în aceeaşi
interogare a bazei de date, dar păstrând flexibilitatea de a include numai informaŃiile
care vă interesează.Posibilitatea de a selecta din baza de date numai informaŃiile care
vă interesează vă permite să ajustaŃi informaŃiile din bază de date în funcŃie de
cerinŃele specifice ale persoanelor sau aplicaŃiilor care au acces la baza de date.
Figura 1-2 prezinta patru tabele din baza de date a magazinului de produse
video si relaŃiile dintre acestea, într-un format cunoscut sub numele de diagrama de
relatii a entitatilor (ERD – Entity Relationship Diagram). Fiecare dreptunghi din
diagrama reprezintă un tabel relaŃional, cu numele tabelului scris deasupra liniei
orizontale si coloanele tabelului enumerate pe verticala , in portiunea principala a
dreptunghiului.
RelaŃiile sunt implementate folosind coloane corespondente din cele două
tabele participante. În diagrama ERD coloana sau coloanele subliniate din fiecare
tabel. UN tabel poate avea o singură cheie primară. Totuşi , o cheie primară poate fi
compusă din mai multe coloane, dacă aceasta este calea de formare a unei chei unice.
Dacă o cheie primară este folosită într-un alt tabel pentru stabilirea unei relaŃii, poartă
numele de chieie externă. În figură 1-2, observaŃi coloanele cheie externă folosite în
tabelul FILM pentru crearea relaŃiilor cu tabelele FILM_GENRE şi MPAA_RATING
şi marcate cu identificatoarele „<fk1>” şi „<fk2”> în dreapta numelui coloanei cheie
externă. Şi coloana COD_LIMBA este marcată drept cheie externă , dar tabelul
LANGUAGE şi relaŃia acestuia cu tabelul FILM au fost omise din figura de mai sus.

Cheile primare şi cheile externe sunt blocuri de construcŃie fundamentale ale


modelului relaŃional, deoarece stabilesc relaŃii şi permit crearea legăturilor între date,
atunci când este necesar. Trebuie să înŃelegeŃi acest concept pentru a putea înŃelege
cum funcŃionează bazele de date relaŃionale.
FILM
FILM_ID <pk>
MPAA_RATING FILM_COD_GEN <fk1> FILM_GEN
MPAA_COD_RATING <pk> MPAA_COD_RATING <fk2> FILM_COD_GEN <pk>
MPAA_DESCRIERE_RATING FILM_NUME FILM_DESCRIERE_GEN
RETAIL_PRET_VHS
RETAIL_PRET_DVD
AN_PRODUS

FILM_COPII
FILM_ID <pk, fk>>
NUMAR_COPIE <pk>
DATA_CUMPARARE
DATA_VANZARE
FORMAT_MEDIA

Figura 1-2 Diagrama ERD a bazei de date (prezentare parŃială)

RestricŃii
O restricŃie este o regulă specificată pentru un obiect al bazei de date (de
obicei un table sau o coloană), având rolul de a limita într-un mod oarecare domeniul
de valori permise pentru obiectul respectiv al bazei de date.După ce sunt specificate,
restricŃiile sunt impuse automat de sistemul DBMS şi nu pot fi ocolite decât dacă o
persoană autorizata le dezactivează sau le şterge(le elimină).Fiecare restricŃie primeşte
un nume unic, astfel încât să poată fi referită în mesajele de eroare şi în comenzile
folosite ulterior în bază de date.Este recomandabil ca proiectanŃii bazei de date să
denumească restricŃiile, deoarece numele generate automat de bază de date nu sunt
foare descriptive. Totuşi , nu am denumit restricŃiile din baza de date folosită ca
exemplu în această carte, deoarece, din păcate, nu toate produsele RDBMS
disponibile în prezent acceptă restricŃiile denumite.
Există mai multe tipuri de restricŃii pentru baze de date:
RestricŃia NOT NULL Poate fi plasată pe o coloană pentru a împiedica
folosirea valorilor nule.O valoare nulă (null) este o modalitate specială prin care
sistemul RDBMS tratează valoarea unei coloane pentru a indica faptul că valoarea
coloanei respective nu este cunoscută. O valoare nulă nu este acelaşi lucru un un
spaŃiu liber, un şir vid sau valoarea zero şi este o valoare specială care nu este egală cu
nimic altceva.
RestricŃia cheie primară (primary key) Definită pe coloana (coloanele)
cheie primară ale unui tabel pentru a garanta că valorile cheie primară sunt
întotdeauna unice în întreg tabelul.Atunci când cheia primară este definită pe mai
multe coloane, combinaŃia valorilor acelor coloane trebuie să fie unică în tabel - o
coloană care reprezintă doar o parte a valorii cheii primare poate conŃine valori
duplicate în tabel. RestricŃiile cheie primară sunt aproape inttotdeauna implementate
de RDBMS prin folosirea unui index.Indexul este un tip special de obiect al unei baze
dedate care permite efectuarea căutărilor rapide în valorile coloanei.Atunci când în
tabele sunt înserate rânduri noi, sistemul RDBMS verifică automat indexul pentru a se
asigura că cheia primară a noului rând nu este deja folosită în tabel şi , dacă se
întâmplă acest lucru , respinge cererea de inserare. Căutarea în indexuri se face mult
mai repede decât căutarea în tabel;ca urmare, indexarea cheii primare este esenŃială
pentru orice tabel, indiferent de dimensiunea acestuia, astfel încât căutarea cheilor
duplicate la fiecare inserare să nu ducă la o reducere semnificativă a performanŃelor.
O caracteristică suplimentară a cheilor primare este faptul că nu pot fi definite decât
pe coloane pentru care a fost definită şi restricŃia NOT NULL.
RestricŃia de unicitate (unique) Definită pe o coloană sau un set de
coloane care trebuie să conŃină valori unice ale tabelului. Ca şi în cazul cheilor
primare, sistemul RDBMS foloseşte aproape întotdeauna un index ca modalitate de
impunere eficientă a restricŃiei.Totuşi, spre deosebire de cheile primare, un tabel poate
avea definite mai multe restricŃii de unicitate, iar coloanele care participă la o
restricŃie de unicitate pot conŃine ( în cele mai multe sisteme RDBMS ) şi valori nule.
RestricŃia referenŃială (numită uneori restricŃie de integritate
referenŃială) O restricŃie care impune o relaŃie între două tabele dintr-o bază de date
relaŃională. Prin „impunere” se înŃelege că sistemul RDBMS se asigură întotdeauna,
în mod automat, că fiecărei valori a cheii externe îi corespunde o valoarea a cheii
primare în tabelul părinte.În tabelul FILM, sistemul RDBMS nu-mi permite să inserez
o înregistrare cu valoarea „M” în coloana MPAA_COD_RATING, deoarece „M” nu
este o valoarea MPAA_COD_RATING validă şi , ca urmare, nu apare ca valoare a
cheii primare din tabelul MPAA_RATING. În sens invers, sistemul RDBMS nu-mi
permite să şterg din tabelul MPAA_RATING rândul cu cheia primară „PG-13” ,
deoarece valoarea respectivă este folosită ca valoare a cheii externe pentru cel puŃin
una din înregistrările din tabelul FILM. Pe scurt , restricŃia referenŃială garantează că
relaŃia dintre cele două tabele şi valorile corespondente ale cheii primare şi cheii
externe îşi păstrează logica în orice moment.
RestricŃia CHECK Foloseşte o instrucŃiune logică simplă (scrisă în SQL)
pentru a valida valoarea unei coloane.Rezultatul instrucŃiunii trebuie să fie o valoare
logică de adevărat (true) sau fals (false), astfel încât un rezultat adevărat să permită
înserarea în tabel a valorii coloanei, iar un rezultat fals să ducă la rejectarea valorii
coloanei , cu mesajul de eroare corespunzător.

Index
Un index reprezintă o cale rapidă de localizare şi sortare a Inregistrarilor dintr-
o tabelă prin gruparea tuturor înregistrărilor pentru un anumit atribur sau grup de
atribute. Indexarea este utilizată în două scopuri principale:
 accelerarea căutărilor în baya de date
 asigurarea unicităŃii înregistrărilor

De exemplu, dacă ne intereayă anumite nume dintr-o tabelă StudenŃi, putem


crea un index pentru coloana NumeSt, pentru a regăsi mai repede studenŃii cu un
anmit nume de familie..
Putem indexa şi mai multe coloane, de exemplu creem un index cu numele
NUME , pentru coloanele NumeSt şi PrenumeSt.
Deşi accelerează procesul de regăsire a datelor , indecşii îngreunează
actualizarea lor.Dupa fiecare operaŃie de actualiyare)inserare, modificare, ştergere,
trebuie verificaŃi şi actualiyaŃi indecşii.Folosirea lor trebuie bine întemeiată altfel
măresc timpul de răspuns al sistemuluişi ocupă spaŃiul suplimentar pe disc .
In Partea a-II-aAccess , se prezintă modul de creare a indecşilor şi în Partea
III, la DDL, create index.
ObservaŃie:
 Cheia primară a unei tabele este indexaŃa automat.
 Nu pot fi indexate coloane de tipul :Memo, Hyperlinksau OLE
 Când o coloană face parte din cheia primară a unei tabele, proprietatea
Indexed are valoarea Yes(No Duplicates), şi proprietatea Required
primeşte valoarea Yes, deoarece cheia primară nu poate conŃine valoarea
null.

Vizualizări

O vizualizare (view) este o interogare stocată în baza de date şi pune la


dispoziŃia utilizatorului un subset personalizat al datelor din unul sau mai multe tabele
ale bazei de date. Cu alte cuvinte, o vizualizare este un tabel virtual, deoarece arată ca
un tabel şi în cele mai multe privinŃe se comportă că un tabel, dar nu stochează date (
nu este stocată decât interogarea SQL care defineşte vizualizarea).
Vizualizările au mai multe funcŃii utile:
 Maschează radurile pe care utilizatorul nu este nevoie să le vadă (sau nu-i
este permis să le vadă).
 Maschează coloanele pe care utilizatorul nu are nevoie să le vadă (sau nu-i
este permis să le vadă).
 Maschează operaŃiile complexe efectuate în baza de date, cum ar fi
uniunile de tabele (respectiv combinarea coloanelor din tabele multiple
într-o singură interogare a bazei de date).
 ÎmbunătăŃeşte performanŃele interogărilor (în unele sisteme RDBMS,
precum Microsoft SQL Server).
Proiectate bazele de date relaŃionale

Această secŃiune prezintă, foarte pe scurt, procesul general de proiectare a


bazelor de date. Atunci când aŃi văzut pentru prima dată figură 1-2 , mai devreme în
acestă lecŃie probabil v-aŃi întrebat de ce coloanele au fost plasate în tabele multiple şi
de ce o anumită coloană a fost inclusă într-un anumit tabel şi nu în altul. Scopul
acestei secŃiuni este de a vă ajuta să răspundeŃi la întrebările de mai sus şi de a vă oferi
un punct de plecare, dacă decideŃi să proiectaŃi propriile baze de date pe măsură ce
învăŃaŃi limbajul SQL. Totuşi proiectarea bazelor de date este un domeniu mult mai
larg.
În 1972, Dr.E.F.Codd, părintele bazelor de date relaŃionale, a pus la punct
un set de reguli care trebuie respectate (organizate în trei „forme normale”) şi un
poroces numit normalizare, care este o tehinca pentru producerea unui set de relaŃii
(termenul folosit de Dr. Codd pentru tabele) cu proprietăŃile dorite.

Necesitatea normalizării
Normalizarea este procesul reversibil de transformare a unei relaŃii, în relaŃii
de structură mai simplă. Procesul este reversibil în sensul că nici o informaŃie nu este
pierdută în timpul transformării. O relaŃie este într-o formă normală particulară dacă
ea satisface o mulŃime specificată de constrângeri.
Procesul normalizării se realizează plecând de la o relaŃie universală ce
conŃine toate atributele sistemului de modelat, plus o mulŃime de anomalii. Orice
formă normală se obŃine aplicând o schemă de descompunere. Există două tipuri de
descompuneri.
 Descompuneri ce conservă dependenŃele. Această descompunere
presupune desfacerea relaŃiei R în proiecŃiile R1, R2, ..., Rk, astfel încât
dependenŃele lui R sunt echivalente (au închideri pseudo-tranzitive
identice) cu reuniunea dependenŃelor lui R1, R2, ..., Rk.
 Descompuneri fără pierderi de informaŃie. Această descompunere
presupune desfacerea relaŃiei R într-o mulŃime de proiecŃii R1, R2, ..., Rj,
astfel încât pentru orice realizare a lui R este adevărată relaŃia:

O descompunere fără pierdere de informaŃie, utilizată în procesul normalizării,


este dată de regula Casey-Delobel:
Fie R(A) o schemă relaŃională şi fie α, β, γ o partiŃie a lui A. Presupunem că α
determină funcŃional pe β. Atunci:

α∪β  mulŃimea atributelor care intervin în dependenŃele funcŃionale;


α∪γ  reprezintă reuniunea determinantului cu restul atributelor lui A.

Tabelul de mai jos prezintă tabelul FILM fără normalizare, aşa cum ar arăta
dacă toate informaŃiile despre filme ar fi colectate într-un singur tabel.Acest exemplu
va fi folosit pentru ilustrarea procesului de normalizare. În general, numele coloanelor
din tabelele relaŃionale folosesc liniuŃe de subliniere pentru separarea cuvintelor. În
discuŃia despre normalizare am eliminat aceste liniuŃe din figuri, pentru a face textul
mai uşor de citit.
Anomaliile care apar în lucrul cu baza de date se produc datorită
dependenŃelor care există între datele din cadrul relaŃiilor bazei de date.
DependenŃele sunt plasate greşit în tabele!

Există trei probleme care pot apărea în tabelele fără normalizare şi toate trei
există în tabelul de mai jos. Scopul procesului de normalizare este de a elimina aceste
probleme (anomalii) din proiectul bazei de date.

FILM G GE LAN MPAA MPAA_RATIN FILM_NUM AN DATA_CUM DAT MEDIA PRET-


_ID E N_ G_ _COD G_DESC E _P PARARE A_VA _FORM INCHI
N_ DE COD _RATI RO NZA AT RIERE
C SC E NG DU RE
O RIE S
D RE
1 Dr Dra en, fr R Sub 17 ani Mystic River 200 01/01/2005 DVD 19.96
am ma necesita 3
a prezenta
parintilor sau a
unui adult

2 Ac Act en, fr, R Sub 17 ani The Last 200 01/10/2005 DVD 19.96
lA Av es necesita Samurai 3
d si prezenta
ave parintilor sau a
ntur unui adult
a
2 Ac Acti en, fr, R Sub 17 ani The Last 200 01/10/2005 VHS 15.95
tA une es necesita Samurai 3
v si prezenta
ave parintilor sau a
ntur unui adult
a
3 Co Co en PG-13 Parintii sunt Something's 200 01/10/2005 1/30/2 DVD 29.99
me med avertizati Gotta Give 3 005
die ie
3 Co Co en PG-13 Parintii sunt Something's 200 2/15/2005 DVD 29.99
me med avertizati Gotta Give 3
die ie
4 Ac Acti en, fr PG-13 Parintii sunt The Italian 200 2/15/2005 DVD 19.99
tA une avertizati Job 3
v si
ave
ntur
a

Figura 1-3 Tabelul FILM fară normalizare

Anomalia de inserare
Anomalia de inserare se referă la o situaŃie în care nu puteŃi insera date în baza
de date din cauza unei dependenŃe artificiale dintre coloanele unui tabel.
Să presupunem că vreti să adăugaŃi în baza de date a magazinului un nou gen
de film care urmează a fi folosit pentru clasificarea filmelor.Tabelul de mai sus nu
permite acest lucru decât dacă aveŃi un film care să fie plasat în categoria respectivasi
pe care va trebui să-l adăugaŃi în tabelul FILM în acelaşi timp.Ar fi mult mai bine
dacă aŃi putea adauga noile genuri înainte de primirea filmelor în magazin.
Anomalia de ştergere
Anomalia de ştergere este inversul anomaliei de inserare. Se referă la situaŃia
în care ştergerea unor date duce la pierderea neintenŃionată a altor date. De exemplu
dacă primul film din tabel este singurul rând din tabelul FILM pentru care coloana
GEN_COD are valoarea „Drama” , şi este şters, se pierde informaŃia că a existat
vreodată un gen numit „Drama”

Anomalia de actualizare

Anomalia de actualizare se referă la o situaŃie în care actualizarea unei singure


valori necesită actualizarea mai multor rânduri. De exemplu , dacă în tabelul prezentat
mai sus trebuie să modificaŃi descrierea codului MPAA_COD_RATING „R”, trebuie
să modificaŃi şi toate rândurile din tabel pentru filmele cu codul respectiv. Probleme
similare apar şi pentru coloana GEN_DESCRIERERIPTION. Chiar şi coloana
PRET_INCHIR are această problemă, deoarece toate copiile aceluiaşi film (cu aceeaşi
valoare FILM_ID ) pe acelaşi mediu (DVD sau VHS) ar trebui să aibă acelaşi preŃ.
Un alt pericol legat de această anomalie este faptul că stocarea unor date redundante
poate aduce la posibilitatea de actualiza numai o parte a copiilor respectivelor date,
ceea ce ar avea ca rezultat apariŃia inconsecvenŃelor în baza de date.

Aplicarea procesului de normalizare

De obicei, normalizarea începe de la mijloacele de redare a datelor care sunt


(sau vor fi) prezentate utilizatorilor, cum ar fi pagini web, ecrane ale aplicaŃiilor,
rapoarte şi aşa mai departe. Colectiv, acestea sunt numite vizualizări de utilizator
(user views). Poate părea ciudat la prima vedere, dar este ceva obişnuit ca proiectarea
unui sistem de prelucrare a datelor să înceapă de la rezultatele pe care le va vedea
utilizatorul, parcurgând apoi drumul înapoi către mijloacele folosite pentru obŃinerea
rezultatelor dorite. În timpul proiectării bazei de date, procesul de normalizare este
aplicat fiecărei vizualizări , iar rezultatul este un set de relaŃii normalizate care pot fi
apoi direct implementate ca tabele ale bazei de date relaŃionale.
Stăpânirea procesului de normalizare cere timp şi exerciŃiu, în specia deoarece
impune prouectantului să se gândească într-un mod conceptual la datele şi relaŃiile pe
care intenŃionează să le folosească. În timpul normalizării , consideraŃi ca fiecare
vizualizare este o relaŃie.
Cu alte cuvinte, conceptualizaŃi fiecare vizualizare ca şi cum ar fi deja un tabel
bidimensional .
De asemenea , este nevoie de timp pentru a va obişnui cu terminologia folosită
în procesul de normalizare. În timpul acestui proces, majoritatea proiectanŃilor evită
folosirea unor termeni fizici, precum tabel, coloană şi cheie primară.
Deşi relaŃia pe cale de a fi normalizată reprezintă o propunere de tabel , încă
nu există ca tabel fizic, aşa că termenul nu este foarte exact.
Procesul de normalizare este aplicat sistematic fiecărei vizualizări. Cel puŃin
la început este mai uşor să reprezentaŃi fiecare vizualizare ca un tabel bidimensional,
conŃinând date repetitive, aşa cum am făcut în figura 1-3. Pe măsură ce parcurgeŃi
procesul de normalizare, veŃi rescrie relaŃiile existente şi veŃi crea altele. Rescrierea
vizualizărilor în relaŃii (tabele) cu date reprezentative este un proces obositor şi
consumator de timp. Trebuie să fiŃi foarte atent ca exemplele de date folosite pentru
luarea deciziilor în procesul de normalizare să fie cu adevărat reprezentative pentru
tipurile de valori care vor apărea în datele reale. Aşa cum probabil vă aşteptaŃi,
exemple prost alese duc deseori la proiectarea eronată a bazei de date.
Scopul procesului de normalizare este eliminarea anomaliilor de inserare,
actualizare si ştergere. Procesul determină crearea unui număr mai mare de relaŃii
decât aŃi avea într-un model fără normalizare. RelaŃiile suplimentare sunt necesare
pentru eliminarea anomaliilor, dar împărŃirea datelor în mai multe relaŃii face ca
extragerea datelor stocate să fie puŃin mai dificilă.

Alegerea unui identificator unic


Primul pas al procesului de normalizare constă în alegerea unui identificator
unic (unique identifier), care este un atribut (o coloană) sau un set de atribute care
identifică în mod unic fiecare rând de date dintr-o relaŃie.
Identificatorul unic va deveni ulterior cheia primară a tabelului creat din
relaŃia normalizată. Pentru normalizare, este obligatoriu ca fiecare relaŃie să aibă un
identificator unic. In multe cazuri, puteŃi găsi un atribut care identifică în mod unic
datele din fiecare rând al relaŃiei pe care vreŃi să o normalizaŃi. Atunci când nu puteŃi
găsi un singur atribut care să poată fi folosit ca identificator unic, este posibil să găsiŃi
mai multe atribute care pot fi concatenate (combinate) pentru a forma un identificator
unic. Atunci când identificatoarele unice sunt formate din atribute multiple, fiecare
atribut rămâne pe propria lui coloană - nu faceŃi decât să definiŃi un identificator unic
format din mai multe coloane, în foarte puŃine cazuri, într-o relaŃie nu există un set
rezonabil de atribute care să poată fi folosit ca identificator unic. Atunci când se
întâmplă acest lucru, trebuie să inventaŃi un identificator unic, deseori cu valori
atribuite secvenŃial sau aleatoriu pe măsură ce noile rânduri de date sunt adăugate în
tabelul bazei de date. Această tehnică este sursa unor identificatoare unice, precum
numărul de asigurări sociale folosit în Statele Unite, numerele de identificare ale
angajaŃilor sau numerele de înmatriculare ale maşinilor.
RelaŃia FILM din figura 1-3 ne pune o problemă în privinŃa găsirii unui
identificator unic. La prima vedere, ar părea că atributul FILM_ID este cel mai
potrivit în acest scop. Totuşi, observaŃi că valorile FILM_ID „2" şi „3" apar de câte
două ori, aşa că, fără nici un dubiu, această valoare nu este unică. Problema este că
valoarea FILM_ID identifică în mod unic fiecare titlu, dar magazinul urmăreşte
separat fiecare copie a filmelor pe care le are în stoc Cauza este faptul că magazinul se
ocupă şi de închirierea filmelor şi vrea să se asigure că fiecare client returnează exact
copia pe care a închiriat-o. După inspectarea datelor folosite ca exemplu şi o scurtă
discuŃie cu proprietarul magazinului, ajungeŃi la concluzia că în relaŃia FILM nu
există nici o combinaŃie de atribute care să identifice în mod unic fiecare copie a unui
film, aşa că inventaŃi un atribut numit NR_ COPIE şi-1 adăugaŃi în relaŃie. Ori de câte
ori inventaŃi un identificator unic (sau o parte a unui identificator) este foarte
important ca toŃi să înŃeleagă valorile pe care le va lua acest identificator. In acest caz,
proprietarul magazinului decide ca valorile NR_ COPIE să reînceapă de la 1 pentru
fiecare valoare FILM_ID, ceea ce înseamnă că valorile NR_ COPIE sunt unice numai
în combinaŃie cu valorile FILM_ID. RelaŃia rezultată este prezentată în figura 1 –4

Prima formă normală: eliminarea datelor repetate


O relaŃie este în prima formă normală atunci când nu conŃine atribute cu
valori multiple (atribute mulŃi valoare), adică atribute care au mai multe valori
pentru acelaşi rând de date. Într-o relaŃie, orice intersecŃie a unui rând cu o coloană
trebuie să conŃină cel mult o valoare pentru ca relaŃia să fie în prima formă normală.
în figura 1-4, atributul pentru limbă (COD_LIMBA) conŃine mai multe valori pentru
unele dintre filme, aşa că-l puteŃi considera un atribut cu valori multiple. Atributele de
acest tip sunt mai greu de întreŃinut, deoarece valorile din listă trebuie să fie mai întâi
separate, astfel încât valorile individuale să poată fi modificate fară a le afecta pe
celelalte.
Uneori, un atribut multivaloare este deghizat sub forma atributelor multiple.
De exemplu, figura 14 ar putea fi modificată astfel încât să conŃină atribute (coloane)
separate pentru cel mult trei limbi corespunzătoare fiecărui film, numite Language 1,
Language 2 şi Language 3. Totuşi, si acestea ar fi considerate atribute multivaloare,
dar într-o forma specială, numită grup repetitiv, care nu este acceptat în prima formă
normală. Din punct de vedere logic, un grup repetitiv nu este diferit de un atribut
multivaloare. De fapt, grupurile repetitive prezintă deseori chiar mai multe probleme
decât atributele multivaloare, deoarece trebuie să adăugaŃi o nouă coloană în tabel ori
de câte ori vreŃi să adăugaŃi mai multe valori decât a prevăzut iniŃial proiectantul bazei
de date (cum ar fi o a patra limbă pentru un film). Bazele de date relaŃionale cer ca
toate rândurile dintr-un tabel să aibă acelaşi număr de coloane, dar un tabel poate
conŃine orice număr de rânduri

FIL N GEN_ GEN_ CO MPA MPAA_RATING FILM_NU A DATA_ DA MEDI PRET


M_I R COD DESC D_L A_C _DESC ME N_ CUMPA TA_ A _INC
D _ RIERE IMB OD_ PR RARE VA FORM HIR
C A RAT O NZ AT
O ING D AR
PI US E
E
1 1 Dram Drama en, R Sub 17 ani Mystic 20 01/01/20 DVD 19.96
a fr necesita prezenta River 03 05
parintilor sau a
unui adult
2 1 AclA Actiune en, R Sub 17 ani The Last 20 01/10/20 DVD 19.96
d si fr, es necesita prezenta Samurai 03 05
aventur parintilor sau a
a unui adult
2 2 ActA Actiune en, R Sub 17 ani The Last 20 01/10/20 VHS 15.95
v si fr, es necesita prezenta Samurai 03 05
aventur parintilor sau a
a unui adult
3 1 Come Comedi en PG- Parintii sunt Something' 20 01/10/20 1/30 DVD 29.99
die e 13 avertizati s Gotta 03 05 /200
Give 5
3 2 Come Comedi en PG- Parintii sunt Something' 20 2/15/200 DVD 29.99
die e 13 avertizati s Gotta 03 5
Give
4 1 ActA Actiune en, PG- Parintii sunt The Italian 20 2/15/200 DVD 19.99
v si fr 13 avertizati Job 03 5
aventur
a
Figura 1-4 RelaŃia FILM
.
Ca urmare, procesul de normalizare pentru obŃinerea primei forme normale
cere să transformaŃi coloanele repetate şi valorile repetate din coloane în rânduri
repetate într-un tabel separat .
Pentru transformarea relaŃiilor ne-normalizate în prima formă normală, trebuie
să mutaŃi atributele multivaloare şi grupurile repetitive în noi relaŃii. Deoarece
grupurile repetitive reprezintă un set de atribute care se repetă împreună, toate
atributele dintr-un grup repetitiv ar trebui mutate în aceeaşi relaŃie. Pe de altă parte, un
atribut multivaloare (un atribut individual care are valori multiple) ar trebui să fie
mutat într-o nouă relaŃie proprie, nu să fie combinat cu alte atribute multivaloare în
noua relaŃie.
Procedura de mutare a unui atribut multivaloare sau a unui grup repetitiv într-o
nouă relaŃie constă în următoarele etape:
1. CreaŃi o nouă relaŃie, cu un nume sugestiv. Deseori, este bine să includeŃi
numele relaŃiei originale, parŃial sau în întregime, în numele noii relaŃii.
2. CopiaŃi identificatorul unic din prima relaŃie în noua relaŃie. Datele depind
de acest identificator în relaŃia originală, aşa că trebuie să depindă de aceeaşi cheie şi
în noua relaŃie. Identificatorul copiat va deveni cheie externă în noua relaŃie.
3. MutaŃi grupul repetitiv sau atributul multivaloare în noua relaŃie. (Am
folosit aici verbul a muta, deoarece aceste atribute sunt şterse din relaŃia originală.)
4. FormaŃi un identificator unic în noua relaŃie, adăugând atribute la
identificatorul unic copiat din relaŃia originală. Ca întotdeauna, asiguraŃi-vă că
identificatorul unic nou format conŃine numai numărul minim de atribute necesar
pentru a-1 face unic. Dacă mutaŃi un atribut multivaloare, care, în esenŃă, este un grup
repetitiv cu un singur atribut, este adăugat atributul respectiv pentru formarea
identificatorului unic. Poate părea ciudat la prima vedere, dar identificatorul unic
copiat din relaŃia originală nu este doar o cheie externă, ci, de obicei, şi o parte a
identificatorului unic (cheia primară) a noii relaŃii. Acest lucru este absolut normal.
De asemenea, este perfect acceptabil să avem o relaŃie în care toate atributele fac parte
din identificatorul unic (adică nu există atribute care să nu facă parte din cheie).
5. OpŃional, puteŃi să înlocuiŃi cheia primară cu un singur atribut surogat
pentru cheie. Dacă faceŃi acest lucru, trebuie să păstraŃi şi atributele care compun
cheia primară naturală, formată la paşii 2 şi 4.

Figura 1-5 prezintă rezultatul aducerii relaŃiei din figura 1-4 la prima formă
normală. ObservaŃi următoarele:
FIL NR GEN GEN_D MPA MPAA_RATING_ FILM_NUME A DATA DAT MEDIA PRET
M_I _C _CO ESCRIE A_CO DESC N _CUM A_VA FORMAT _INC
D OPI D RE D_RA _ PARA NZAR HIR
E TING P RE E
R
O
D
U
S
1 1 Dram Drama R Sub 17 ani necesita Mystic River 2 01/01/ DVD 19.96
a prezenta parintilor 0 2005
sau a unui adult 0
3
2 1 AclA Actiune R Sub 17 ani necesita The Last 2 01/10/ DVD 19.96
d si prezenta parintilor Samurai 0 2005
aventura sau a unui adult 0
3
2 2 ActA Actiune R Sub 17 ani necesita The Last 2 01/10/ VHS 15.95
v si prezenta parintilor Samurai 0 2005
aventura sau a unui adult 0
3
3 1 Come Comedie PG-13 Parintii sunt Something's 2 01/10/ 1/30/2 DVD 29.99
die avertizati Gotta Give 0 2005 005
0
3
3 2 Come Comedie PG-13 Parintii sunt Something's 2 2/15/2 DVD 29.99
die avertizati Gotta Give 0 005
0
3
4 1 ActA Actiune PG-13 Parintii sunt The Italian Job 2 2/15/2 DVD 19.99
v si avertizati 0 005
aventura 0
3

• Am folosit o mică scurtătură în cazul identificatorului unic în noua relaŃie


FILM Language. Limba în care este disponibil un film se aplică filmului, în general,
nu copiilor individuale. ObservaŃi în figura 1-4 că lista de limbi disponibile nu se
schimbă între rândurile duplicate ale aceluiaşi film. Ca urmare, partea NR_ COPIE a
identificatorului unic din relaŃia FILM nu a fost copiată în noua relaŃie FILM
Language. Dacă aş fi făcut acest lucru, aş fi creat în noua relaŃie o problemă specifică
celei de-a doua forme normale, pe care ar fi trebuit să o rezolv în următoarea etapă a
procesului de normalizare. VeŃi descoperi că, deseori, proiectanŃii experimentaŃi de
baze de date sintetizează cele trei forme normale şi rescriu relaŃiile originale direct în
a treia formă normală. Exersând, veŃi putea şi dumneavoastră să faceŃi acelaşi lucru.
FILM_ID COD_LIMBA
1 en
1 fr
2 en
2 fr
2 es
3 en
4 en
4 fr
Figura 1-5 SoluŃia primei forme normale

• Atributul FILM_ID a fost copiat din relaŃia originală (FILM) în noua relaŃie
(FILM Language).
• Atributul multivaloare COD_LIMBA a fost mutat din relaŃia FILM în relaŃia
FILM Language, cu numele Language Code. (Numele abreviate ale atributelor din
figura 1-4 au fost folosite doar pentru ilustrare - este recomandabil să prescurtaŃi
numele numai dacă este absolut necesar.)
• Identificatorul unic din relaŃia FILM Language este format prin combinarea
atributelor FILM_ID şi Language Code, adică din toate atributele relaŃiei.
• Nici FILM, nici FILM Language din figura 1-5 nu conŃin grupuri repetitive
sau atribute multivaloare, aşa că ambele relaŃii sunt în prima formă normală.

A doua formă normală: eliminarea dependenŃelor parŃiale

Înainte de a explora a doua formă normală, trebuie definit conceptul de


dependenŃă funcŃională. Pentru această definiŃie, voi folosi două atribute arbitrare,
inteligent denumite „A" şi „B". Atributul B este dependent funcŃional de atributul A
dacă în nici un moment nu există mai mult de o valoare a atributului B asociată cu o
valoare dată a atributului A. In primul rând, a spune că atributul B este funcŃional
dependent de atributul A înseamnă şi că atributul A determină atributul B sau că A
este un determinant (identificator unic) pentru atributul B.
În al doilea rând, să ne mai uităm o dată la relaŃiile din figura 1-5.
În relaŃia FILM, puteŃi să vă daŃi seama cu uşurinŃă că atributul FILM_NUME
este dependent funcŃional de atributul FILM_ID, deoarece, în orice moment, poate
exista o singură valoare FILM_NUME pentru o valoare FILM_ID dată. Chiar faptul
că valoarea FILM_ID defineşte în mod unic valoarea FILM_NUME în relaŃie
înseamnă că FILM_NUME este dependent funcŃional de FILM_ID.
Se spune că o relaŃie este în a doua formă normală dacă îndeplineşte
următoarele criterii:
• RelaŃia este în prima formă normală.
• Toate atributele non-cheie sunt dependente funcŃional de identificatorul
unic (cheia primară), luat ca întreg.

Aplicând aceste criterii relaŃiei FILM din figura 1 -5, este clar că avem câteva
probleme. Identificatorul unic este o combinaŃie a atributelor FILM_ID şi NR_
COPIE. Totuşi, numai atributele DATA_CUMPARARE, DATA_VANZARE,
MEDIA FORMAT şi PRET_INCHIR depind de întregul identificator. Şi este logic să
fie aşa. Indiferent câte copii ale unui film avem în baza de date, toate au aceleaşi
valori pentru gen, categorie MPAA, TITLU şi AN_PRODUS.
Unele atribute descriu filmul în sine, în timp ce altele descriu copiile pe care le
deŃine (sau le-a deŃinut) magazinul din filmul respectiv. In esenŃă, am amestecat
atribute care descriu în aceeaşi relaŃie două lucruri (entităŃi) diferite (deşi înrudite) din
lumea reală.
A doua formă normală se aplică numai relaŃiilor care au identificatoare unice
concatenate (adică formate din atribute multiple). într-o relaŃie care are un singur
atribut ca identificator unic, este imposibil ca un alt atribut să depindă de o parte a
identificatorului unic, deoarece acesta, fiind format dintr-un singur atribut, nu are părŃi
componente. Ca urmare, orice relaŃie în prima formă normală care are cheia primară
formată dintr-un singur atribut este automat în a doua formă normală.
După ce descoperiŃi o încălcare a celei de-a doua forme normale, soluŃia este
să se mute atributele parŃial dependente într-o nouă relaŃie, în care să depindă de
întreaga cheie primară. Figura 1-6 prezintă această soluŃie. Toate atributele care
depind numai de FILM_ID sunt acum într-o relaŃie (numită FILM) în care FILM_ID
este identificator unic. Cele care depind de combinaŃia FILM_ID şi NR_ COPIE sunt
într-o relaŃie (numită FILM Copy) în care FILM_ID şi NR_ COPIE formează
identificatorul unic. RelaŃia FILM Language era deja în a doua formă normală,
deoarece nu are atribute non-cheie şi, ca urmare, a rămas nemodificată.
FILM:
MPAA_
FILM GEN_ GEN_DESCRIER MPAA_DESCRIERE AN_PRO
COD_R FILM_NUME
_ID COD E _RATING DUS
ATING
Sub 17 ani necesita Mystic River
1 Drama Drama R prezenta parintilor 2003
sau a unui adult
Sub 17 ani necesita The Last
Actiune si
2 ActAv R prezenta parintilor Samurai 2003
aventura
sau a unui adult
Comed Parintii sunt Something's
3 Comedie PG-13 2003
ie avertizati Gotta Give
Actiune si Parintii sunt The Italian
4 ActAv PG-13 2003
aventura avertizati Job

FILM LANGUAGE:
FILM_ID LANGUAGE_CODE
1 En
1 Fr
2 En
2 Fr
2 Es
3 En
4 En
4 Fr

FILM COPY:
DATA_VAN
FILM ID NR_ COPIE DATA_CUMPARARE MEDIA FORMAT PRET_INCHIR
ZARE
1 1 01/01/2005 DVD 19.96
2 1 01/10/2005 DVD 19.96
2 2 01/10/2005 VHS 15.95
3 1 01/10/2005 1/30/2005 DVD 29.99
3 2 2/15/2005 DVD 29.99
4 1 2/15/2005 DVD 19.99
Figura 1-6. SoluŃia pentru a doua formă normală

A treia formă normală: eliminarea dependenŃelor tranzitive

Pentru a înŃelege a treia formă normală, trebuie să se definescă conceptul de


dependenŃă tranzitivă. Despre un atribut care depinde de un atribut care nu este
identificator unic (cheie primară) a relaŃiei se spune că este dependent tranzitiv.
În relaŃia FILM din figura 1 -6, observăm că atributul
GEN_DESCRIEREription depinde de atributul GEN_COD, iar MPAA Ratifig
Description depinde de MPAA_COD_RATING. Pericolul păstrării acestor descrieri
în relaŃia FILM este faptul că, în final, cele două atribute ajung să depindă de
înregistrarea unui film, ceea ce duce la toate cele trei anomalii de date prezentate mai
devreme în acest capitol.
Se spune că o relaŃie este în a treia formă normală dacă îndeplineşte
următoarele două criterii:
 RelaŃia este în a doua formă normală.
 Nu există dependenŃe tranzitive (cu alte cuvinte, toate atributele non-cheie
depind numai de identificatorul unic).

Pentru a aduce la a treia formă normală o relaŃie aflată în a doua formă


normală, se mută atributele dependente tranzitiv în relaŃii în care depind numai de
cheia primară. Se lasă atributul de care depind acestea în relaŃia originală, cu rolul de
cheie externă.Va trebui apoi să reconstruim vizualizarea originală printr-o uniune.
Ca efect secundar, toate atributele uşor de calculat sunt eliminate ca încălcări
ale criteriilor celei de-a treia forme normale. De exemplu, într-o bază de date pentru
vânzări, Suma Totală este obŃinută înmulŃind Cantitatea Cumpărată cu PreŃul Unitar;
aşa cum se observă cu uşurinŃă, Suma Totală este dependentă de Cantitatea
Cumpărată şi de PreŃul Unitar. Presupunând ci toate cele trei atribute sunt dependente
de identificatorul unic al relaŃiei care le conŃine, este uşor de văzut că Suma Totală
(rezultatul calculat) este, de fapt, dependentă tranzitiv te celelalte două atribute.
Figura 1-7 conŃine soluŃia în a treia formă normală. S-au creat noi relaŃii
pentru MPAA Rating şi FILM Gen, s-a mutat descrierile în noile relaŃii şi am lăsat
atributele pentru coduri (MPAA_COD_RATING şi FILM GEN_COD) în relaŃia
FILM, definite ca fiind chei externe. MulŃi proiectanŃi de baze de date numesc relaŃiile
MPAA Rating şi FILM Genre „tabele de căutare" sau „tabele de coduri” deoarece
sunt utilizate, în principal, pentru căutarea codurilor stocate în coloana cheie primară a
relaŃiei. Totuşi aceste relaŃii au şi alte roluri, cum ar fi controlul codurilor şi furnizarea
unei surse convenabile pentru lista de coduri valide, care poate fi folosită într-o listă
derulantă de pe o pagină web.
FILM:
MPAA_ PRET_ PRET_
FILM GEN_
COD_R FILM_NUME INCHIR VHS INCHIR AN_PRODUS
_ID COD
ATING DVD
Mystic River 58.97 19.96
1 Drama R 2003

The Last 15.95 19.96


2 ActAv R Samurai 2003

Comedi Something's 14.95 29.99


3 PG-13 Gotta Give 2003
e
The Italian Job 11.95 19.99
4 ActAv PG-13 2003

FILM_ COPII:
FILM_ID NR_ COPIE DATA_CUMPAR DATE _ MEDIA_FORMA
ARE VINZARE T
1 1 01/01/2005 DVD
2 1 01/10/2005 DVD
2 2 01/10/2005 VHS
3 1 01/10/2005 1/30/2005 DVD
3 2 2/15/2005 DVD
4 1 2/15/2005 DVD
MPAA Rating :
MPAA_COD_RATING MPAA_DESCRIERE_RATING
PG-13 Parintii sunt avertizati
R Sub 17 ani necesita prezenta parintilor sau a unui adult

FILM GEN :
FILM GEN_COD FILM_GEN_DESCRIERE
ActAv Actiune si aventura
Comedie Comedie
Drama Drama

Figura 1-7. SoluŃia pentru a treia formă normală

O altă modificare făcută pentru a ajunge la a treia formă normală este legată de
atributul PRET_INCHIR (preŃ cu amănuntul) din relaŃia Movie Copy, aşa cum se
poate vedea în figura 1-6. După o discuŃie cu proprietarul magazinului, am stabilit că
preŃul depinde de combinaŃia dintre Movie ID şi Media Format, toate copiile cu
aceleaşi valori pentru FILM_ID şi Media Format având acelaşi preŃ. In mod clar,
aceasta este o dependenŃă tranzitivă şi, ca urmare, o încălcare a celei de-a treia forme
normale.
SoluŃia normală pentru o asemenea problemă ar fi crearea unei relaŃii numite
FILM Price, având ca identificator unic combinaŃia dintre FILM_ID şi Media Format,
şi mutarea atributului PRET_INCHIR din FILM Copy în noua relaŃie. Totuşi, în
timpul discuŃiei s-a aflat că urmează să se renunŃe la furnizarea filmelor în format
VHS, deoarece sunt cerute de un număr foarte mic de clienŃi şi că peste câteva luni
magazinul va avea numai filme pe DVD.
łinând seama de această informaŃie, am decis să mut preŃul în două coloane
din tabelul FILM, una cu preŃul pentru DVD şi una cu preŃul pentru VHS. Deşi se
poate spune că aceasta este o încălcare a primei forme normale (şi, din punct de
vedere tehnic chiar este), mi s-a părut a fi cel mai bun compromis.
Proiectarea bazelor de date nu este întotdeauna o ştiinŃă exactă, aşa că de
multe ori există posibilitatea unor mici ajustări, cu condiŃia ca proiectantul să ia în
calcul consecinŃele potenŃiale (măsurate în termenii anomaliilor de date) ale fiecărui
compromis.

Forma normală Boyce-Codd (BCNF)

Deşi nu ne propunem să discutăm şi alte forme normale avansate, consider


necesar să le amintim.
Dr. E. F. Codd a participat la definirea unei versiuni mai puternice a celei de-a
treia forme normale, numită forma normală Boyce-Codd.
Determinantul este un atribut sau o mulŃime de atribute neredundante, care
constituie un identificator unic pentru alt atribut sau altă mulŃime de atribute ale unei
relaŃii date.
Intuitiv, o relaŃie R este în forma normală Boyce-Codd dacă şi numai dacă
fiecare determinant este o cheie candidat.
Formal, o relaŃie R este în forma normală Boyce-Codd dacă şi numai dacă
pentru orice dependenŃă funcŃională totală X → A, X este o cheie (candidat) a lui R.
Exemplu:
ADRESA(cod_parsoana#, telefon#, adresa)

cod_persoana

adresa

telefon

În dependenŃa adresa  telefon se observă că determinantul nu este o cheie


candidat. RelaŃia ADRESA se desface în:
ADRESA_1(cod_persoana#, adresa);
ADRESA_2(adresa#, telefon).

RelaŃiile sunt în BCNF, se conservă datele, dar nu se conservă dependenŃele


(s-a pierdut cod_persoana, telefon  adresa).
DiferiŃi alŃi autori şi cercetători au oferit propriile extensii, numite a patra
formă normală, a cincea formă normală, forma normală cu cheie de domeniu şi altele.
A patra formă normală(FN4) elimină redudanŃele datorită relaŃiilor de tip m:m.
Este nevoie de ceva exerciŃiu în procesul de normalizare înainte ca aceste extensii să
devină logice.
In plus, a treia formă normală acoperă toate anomaliile pe care este posibil să
le întâlniŃi în lucrul cu baze de date obişnuite.

Prezentarea generală a bazei de date pentru un magazin video

Majoritatea exemplelor din acest curs folosesc ca model o bază de date pentru
un magayin virtual de produse video.
InstrucŃiunile SQL pentru creare obiectelor bazei de date şi pentru popularea
acestora cu date vor fi prezentate în lecŃiile următoare.
În figura 1-8 se prezintă disgrama entitate relaŃie, ERD (Entity Relationship
Diagram) pentru această bază de date.
FILM
FILM_ID PK
MPAA_RATING FILM_COD_GEN FK1 FILM_GEN
MPAA_COD_RATING PK MPAA_COD_RATING FK2 FILM_COD_GEN PK
MPAA_DESCRIERE_VARSTE FILM_NUME FILM_DESCRIERE_GEN
RETAIL_PRET_VHS
RETAIL_PRET_DVD
AN_PRODUS

FILM_COPII FILM_INCHIRIERE
FILM_LIMBA FILM_ID PK,FK1 FILM_ID PK,FK1
FILM_ID PK,FK1 NUMAR_COPIE PK NUMAR_COPIE PK,FK1
COD_LIMBA PK,FK2 DATA_CUMPARARE TRANZACTIE_ID PK,FK2
DATA_VANZARE DATA_INTOARCERE
FORMAT_MEDIA COST_INCHIRIERE
COST_INTARZIERE_SAU_PIERDERE
DATA_RETURNARE

LIMBA
COD_LIMBA PK CLIENT_CONT CLIENT_TRANZACTIE
NUME_LIMBA CLIENT_CONT_ID PK TRANZACTIE_ID PK
CLIENT_HOLD_IND CLIENT_CONT_ID FK1
DATA_INSCRIS ANGAJAT_PERSOANA_ID
DATA_TERMINAT TRANZACTIE_DATA
CLIENT_COD_PERSOANA CLIENT_DEPOZIT_SUMA VANZARI_TAXA
CLIENT_CONT_ID PK,FK1 CARD_CREDIT_LA_DOSAR_INDIC
PERSOANA_ID PK,FK2 COPIL_INCHIRIERE_PERMIS_INDIC

PERSOANA ANGAJAT
PERSOANA_ID PK PERSOANA_ID PK,FK1
PERSOANA_PRENUME SUPERVISOR_PERSOANA_ID
PERSOANA_NUME_MIJLOCIU ANGAJAT_TAXA_ID
PERSOANA_NUME ANGAJAT_JOB_CATEGORIE
PERSOANA_ADRESA_1 ANGAJAT_RATA_PE_ORA
PERSOANA_ADRESA_2 ANGAJARE_DATA
PERSOANA_ADRESA_ORAS INCHIDERE_DATA
PERSOANA_ADRESA_JUDET_PROV
PERSOANA_ADRESA_COD_POSTAL
PERSOANA_ADRESA_TARA
PERSOANA_TELEFON
NASTERE_DATA
MOARTE_DATA

Figura 1_8. Diagrama entitate relaŃie

Probleme:

1. Să se normalizeze tabelul CURS_SUDENT şi PROFESOR

Amintim că o tabelă este în prima formă normală(FN1) dacă valorile tuturor


atributelor care o compun sunt atomice (indivizibile). În plus, nu trebuie să existe
atribute sau grupuri de atribute repetitive.
Această primă formă normală este considerată ca fiind o cerinŃa minimală
pentru majoritatea sistemelor relaŃionale, utilitatea ei fiind evidentă. Astfel , dacă o
coloană ar conŃine o listă de valori , regăsirea şi manipularea informaŃiilor stocate ar fi
foarte anevoioase.
Presupunem că tabela Curs_Student conŃine următoarele date:
CURS_SUDENT
NrMatricol NumeSt PrenumeSt Grupa Cursuri-Nota
458 Predescu Alexandru 114 engleza-7,germana-8
521 Radu George 122 desen-tehnic-10,franceza-7
627 Cristescu Lucian 243 programare-8,engleza-10
746 Irimia Diana 361 analiza numerica-9
782 Tanase Daciela 341 gernana-6,programare-10
982 Bunea Mihaela 114 rezistenta materialelor-8
1204 Dragnea Liviu 412 educatie fizica-10
S1520 Popa Marius 452 analiza numerica-7,engleza-9

Coloana Cursuri conŃine mult prea multa informaŃie.


Să presupunem că am înlocui coloana Cursuri cu două noi coloane:
CURS_SUDENT
NrMatricol NumeSt PrenumeSt Grupa Curs1 Nota1 Curs2 Nota2
458 Predescu Alexandru 114 engleza 7 germana 8
521 Radu George 122 desen tehnic 10 franceza 7
627 Cristescu Lucian 243 programare 8 engleza 10
746 Irimia Diana 361 analiza numerica 9
782 Tanase Daciela 341 germana 6 programare 10
rezistenta
982 Bunea Mihaela 114 materialelor 8
1204 Dragnea Liviu 412 educatie fizica 10
1520 Popa Marius 452 analiza numerica 7 engleza 9

Nici acum nu am rezolvat toate problemele. De exemplu, pentru a afla câŃi


studenti s-au înscris în total la un anumit curs , va trebui să parcurgem toate cele trei
coloane cu cursuri. În plus, ce se întâmplă în cazul în care un student s-a înscris la mai
mult de două cursuri? Să zicem că un student nu se poate inscrie la mai mult de cinci
cursuri şi deci putem introduce zece coloane pentru a stoca informaŃiile curs-nota.
.Evident , aceasta ar presupune o mare risipă de spaŃiu , de vreme ce ar exista şi unii
studenti care au ales doar două cursuri.
Pentru a aduce tabela Curs_Student la FN1 vom introduce o nouă coloană în
cheia primară a tabelei, astfel încât aceasta va fi formată acum din două coloane:
NrMatricol şi IdCurs. Acum putem afla numărul total de studenŃi înscrişi la un
anumit curs.
CURS_SUDENT
NrMatricol NumeSt PrenumeSt Grupa IdCurs Denumire
458 Predescu Alexandru 114 4 germana
521 Radu George 122 3 franceza
521 Radu George 122 5 desen tehnic
627 Cristescu Lucian 243 1 programare
627 Cristescu Lucian 243 2 engleza
746 Irimia Diana 361 8 analiza numerica

A doua formă normală (FN2)

Amintim că o tabelă este în a doua formă normală dacă este în FN1 şi fiecare
atribut care nu face parte din cheia primară este dependent de întreaga cheie primară.
Tabela Curs_Student este în FN1, dar nu îndeplineşte cea de-a doua cerinŃă
pentru a fi în FN2. Coloana Denumire care depinde numai de IdCurs, nu şi de
NrMatricol , care , împreună cu IdCurs, formează cheia primară. Deci avem o
coloană care nu face parte din cheia primară şi nu depinde de toată cheia, în sensul că
, pentru o valoare dată a lui IdCurs, cunoaştem denumirea cursului fără a mai trebui să
ştim şi NrMatricol. Putem aduce tabelaCurs_Student în FN2 descompunând-o în
două tabele, după următoarea regulă: pentru fiecare dependenŃă parŃială se formează o
nouă tabelă (pe care o vom numi Curs) conŃinând coloanele determinate de această
dependenŃa (în acest caz, Denumirea) şi determinantul lor (IdCurs). Coloanele
determinate se elimină din tabela iniŃială.
Cheia primară a noii tabele va fi formată din coloanele ce compun
determinantul dependenŃei (IdCurs), între cele două tabele rezultate există o relaŃie de
tip 1:m asigurată de existenŃa lui IdCurs drept cheie străină în tabela Curs_Student.
Analog, deoarece coloanele NumeSt, PrenumeSt şi grupa depind numai de
NrMatricol, le eliminăm din tabela Curs_Student şi formăm o nouă tabelă, Student,
ce le va conŃine şi va avea drept cheie primară coloana NrMatricol.
De asemenea , între tabelele Student şi Curs_Student există o relaŃie de tip
1:m.
STUDENT
NrMatricol NumeSt PrenumeSt Grupa
458 Predescu Alexandru 114
521 Radu George 122
627 Cristescu Lucian 243
746 Irimia Diana 361
782 Tanase Daciela 341
982 Bunea Mihaela 114
1204 Dragnea Liviu 412
1520 Popa Marius 452

CURS_SUDENT CURS
IdCurs NrMatricol Nota IdCurs Denumire
1 782 5 1 programare
1 982 10 2 engleza
2 458 7 3 franceza
3 521 7 4 germana
4 627 8 5 desen tehnic
4 1520 8 6 Rezistenta materialelor
5 521 10 7 Educatie Fizica
5 1740 6 8 analiza numerica

A treia formă normală (FN3)

O tabelă este în a treia formă normală dacă este în FN2 şi toate coloanele care
nu fac parte din cheia primară sunt mutual independente (depind direct de cheia
primară şi numai de ea)
Un exemplu calasic de dependenŃă tranzitivă este cel al coloanelor calculate.
Astfel , dacă o tabelă de produse ar conŃine Coloanele PretUnitar şi Cantitate şi , în
plus, coloana PretTotal această tabelă nu ar fi în FN3.
Coloanele calculate nu sunt singurul caz de dependenŃa tranzitivă într-o
tabelă. De exemplu în tabela Profesor se poate observă faptul că salariul depinde de
titlul profesorului, coloanele Salariu, Titlu şi IdTitlu nefăcând parte din cheia
primară.
DependenŃele tranzitivă creează probleme la adăugarea, actualizarea şi
ştergerea înregistrărilor. De exemplu, dacă la tabela Profesor se mai adaugă 20 de
înregistrări , fiecare cu titlul de preparator (prep), va trebui să introducem de 20 de ori
valoarea 5 pentru IdTitlu, descrierea „preparaotr” pentru Titlu şi valoarea 800 pentru
Salariu , ceea ce este evident, redundant. De asemenea, dacă salariul unui preparator
se modifică, va trebui să asctualizăm toate înregistrările corespunzătoare.
Pentru a înlătura toate aceste inconvenienŃe, vom aduce tabela Profesor la
FN3 prin crearea unei noi tabele, pe care o vom numi Titlu.Tabela Titlu va avea drept
cheie primară coloana IdTitlu şi va mai conŃine coloanele Titlu şi Salariu, pe care le-
am eliminat din tabela Profesor.
Profesor
IdProf Nume Catedra IdTitlu
1 Popescu Marin Matematici 1
2 Dragnea Ion Limbi straine 4
3 Iosif Irina Educatie fizica 3
4 Ilie Daniel Informatica 2
5 Savu Cristina Limbi straine 5
6 Cristea George Fizica 3
7 Ene Dan Matematici 7
Titlu
IdTitlu Titlu Salariu
: 1 lector dr. 1300
2 asistent 950
3 lector 1100
4 conferentiar dr. 1700
5 prepartor 680
6 profesor dr. 2150

2. Amintim ca regulile de integritate sunt;


- unicitatea cheii primare
- integritatea entităŃii – valorile cheii primare sa fie diferite de valoarea
null(o valoare necunoscuta sau lipseşte)
- integritatea referenŃială ) o cheie secundară trebuie să fie null în întregime
sau să corespundă unei valori a cheii primare asociate.(in tabela
asociată nu trebuie să existe valori fără corespondent).

Tabelele Titlu şi Profesor sunt în relaŃia 1:m (un Titlu corespunde la mai
multe cadre didactice).
Tabele de mai sus păstrează regulile de integritate?
Raspuns Nu, deoarece există cadrul didactic cu IDProf= 7 cu IdTitlu =7 , care
nu există in tabelul Titlu, ca funcŃie didactică.
3. Să se determine anomaliile pentru tabelul
Avion
A# nume capacitate localitate
1 AIRBUS 250 PARIS
2 AIRBUS 250 PARIS
3 AIRBUS 250 LONDRA
4 CAR 100 PARIS
5 B707 150 LONDRA
6 B707 150 LONDRA

Constrângere:
toate avioanele cu acelaşi nume au aceeaşi capacitate.
Datorită dependenŃei introduse pot exista: anomalii la inserare, modificare sau
ştergere, redundanŃă în date, probleme de reconexiune.
1. RedundanŃă logică. Cuplul (AIRBUS, 250) apare de trei ori.
2. Anomalie la inserŃie. S-a cumpărat un B727 cu 150 locuri. El poate fi
inserat în relaŃia AVION doar dacă se defineşte o nouă valoare pentru
cheia primară.
3. Anomalie la ştergere. Dacă este ştearsă înregistrarea pentru care A# este
4, atunci se pierde informaŃia că un avion CAR are capacitatea 100.
4. Anomalie la modificare. Dacă se modifică capacitatea lui B707 de la 150
la 170, atunci costul modificării este mare pentru a modifica toate
înregistrările, iar dacă se modifică doar o înregistrare atunci constrângerea
nu va mai fi verificată.

4. Exemplu: variante pentru a implementa FN1 pentru tabelul


MASINA:

Persoana Vehicul
Eu R25 - W14 - R21
Tu 205
El R5 - 305
noi BX - 305 - R12 - R25

Varianta 1

Persoana Vehicul
Eu R25
Eu W14
Eu R21
Tu 205
El R5
El 305
Noi BX
Noi 305
Noi R12
Noi R25
Varianta 2
Persoana Prima Doi Trei Patru
Eu R25 W14 R21
Tu 205
El R5 305
Noi BX 305 R12 R25
Varianta 3 (4 tabele)
Masina 31 (similar se definesc Masina_32, Masina_33, Masina_34)..

Persoana Vehicul
Eu R25
Tu 205
El R5
Noi BX
Masina_34

Persoana Vehicul
Noi R25

5. Să se aduca la FN2
O relaŃie R este în a doua formă normală dacă şi numai dacă:
 relaŃia R este în FN1;
 fiecare atribut care nu este cheie (nu participă la cheia primară) este
dependent de întreaga cheie primară.

ATASAT_LA

COD_SALARIAT# JOB_COD NR_PROIECT# FUNCTIA SUMA

S1 PROGRAMATOR P1 SUPERVIZOR 60

S1 PROGRAMATOR P2 CERCETATOR 25
S1 PROGRAMATOR P3 AUXILIAR 10

S3 VANZATOR P3 SUPERVIZOR 60
S5 INGINER P3 SUPERVIZOR 60

ATASAT_2A
COD_SALARIAT# NR_PROIECT# FUNCTIA SUMA

S1 P1 SUPERVIZOR 60

S1 P2 CERCETATOR 25

S1 P3 AUXILIAR 10
S3 P3 SUPERVIZOR 60

S5 P3 SUPERVIZOR 60

ATASAT_2B
COD_SALARIAT# JOB_COD

S1 PROGRAMATOR

S3 VANZATOR
S5 INGINER

A doua condiŃie exprimă necesitatea total dependenŃei de cheia


primară. Această formă normală interzice manifestarea unor dependenŃe funcŃionale
parŃiale în cadrul relaŃiei R!
Pentru a obŃine o relaŃie FN2 se poate aplica regula Casey-Delobel.
α∪β  mulŃimea atributelor care intervin în dependenŃele funcŃionale;
α∪γ  reprezintă reuniunea determinantului cu restul atributelor lui A.

7. Tabelul atasat_2a nu este in FN3. De ce?


Forma normală 3 (FN3)
Intuitiv, o relaŃie R este în a treia formă normală dacă şi numai dacă:
 relaŃia R este în FN2;
 fiecare atribut care nu este cheie (nu participă la o cheie) depinde direct de
cheia primară.

atasat_3a
Cod_salariat# Nr_proiect# Functia
S1 P1 Supervizor
S1 P2 Cercetator
S1 P3 Auxiliar
S3 P3 Supervizor
S5 P3 Supervizor
atasat_3b
Functia Suma
Supervizor 60
Cercetator 25
Auxiliar 10
8. Presupunem că un şantier poate executa mai multe lucrări de bază şi că
o lucrare poate fi executată de mai multe şantiere.

LUCRARE(cod_obiectiv#, cod_lucrare#, nume);


SANTIER(nr_santier#, specialitate, sef);
EXECUTA(cod_obiectiv#, cod_lucrare#, nr_santier#, descriere, functie,
conducator, data_inceput, data_sfarsit).
Pentru relaŃia EXECUTA sunt evidente dependenŃele:
{cod_obiectiv#, cod_lucrare#} → {data_inceput, data_sfarsit},
{cod_obiectiv#, cod_lucrare#, nr_santier#} → {descriere, functie,
conducator}.

9. Să se aduca la FN3 tabelel EXECUTA_1 rezultat de la 8

În tabelul EXECUTA_1(cod_obiectiv#, cod_lucrare#, nr_santier#, descriere,


functie, conducator) continuă să existe redundanŃă în date.
Atributul conducator depinde indirect de cheia primară prin intermediul
atributului functie.
Între atributele relaŃiei există dependenŃele:

{cod_obiectiv#, cod_lucrare#, nr_santier#} → {descriere},


{cod_obiectiv#, cod_lucrare#, nr_santier#} → {functie} → {conducator}.
Pentru a aduce relaŃia EXECUTA_1 în FN3 se aplică regula Casey- Delobel.
RelaŃia se desface, prin eliminarea dependenŃelor funcŃionale tranzitive, în
proiecŃiile:

EXECUTA11(cod_obiectiv#, cod_lucrare#, nr_santier#, descriere, functie)


EXECUTA12(functie, conducator).

10 Să se aducă la forma BCNF (Forma normală Boyce-Codd )

(Formal, o relaŃie R este în forma normală Boyce-Codd dacă şi numai dacă


pentru orice dependenŃă funcŃională totală X → A, X este o cheie (candidat) a
lui R.)

RelaŃia INVESTESTE_IN leagă entităŃile INVESTITOR şi


OBIECTIV_INVESTITIE.

Ea are schema relaŃională:


INVESTESTE_IN(cod_contractant#, cod_obiectiv#, nr_contract, cota_parte).
Între atributele relaŃiei există dependenŃele:
{cod_contractant#, cod_obiectiv#} → {nr_contract, cota_parte},
{nr_contract} → {cod_obiectiv}.
Se aplică regula Casey-Delobel şi se aduce relaŃia în BCNF.
INVESTESTE_IN_1(cod_obiectiv, nr_contract#);
INVESTESTE_IN_2(cod_contractant#, nr_contract, cota_parte).
PARTEA a_II_a ACCESS

În acestă parte a cursului de baze de date, se prezintă aplicaŃia Microsoft


Access în 7 lecŃii după cum urmează:

 LECłIA 1. Elemente introductive despre ACCESS


 LECłIA 2. TABELE
 LECłIA 3. Operatori şi FuncŃii
 LECłIA 4. Stabilirea relaŃiilor ître tabele
 LECłIA 5. INTEROGĂRI
 LECłIA 6. FORMULARE
 LECłIA7. RAPOARTE

LECłIA 1. Elemente introductive despre ACCESS


În acestă lecŃie se vor prezenta NOŃIUNILEş
 Conceptul de bază de date
 Componentele unei baze de date
 Crearea, Crearea unei baze de date vidă
 Deschiderea unei baze de date existente
 Închiderea unei baze de date
 Conversii, Compactări, ReparaŃii)

Ce este o bază de date

O bază de date este o colecŃie de informaŃii interrelaŃionate gestionate ca o


singură unitate.Această definiŃie este intenŃionat foarte largă, deoarece există mari
diferenŃe între concepŃiile diferiŃilor producători care pun la dispoziŃie sisteme de baze
de date. De exemplu, Oracle Corporation defineşte o bază de date ca fiind o colecŃie
de fişiere fizice gestionate de o singură instanŃă (copie) a produsului software pentru
baze de date, în timp ce Microsoft defineşte o bază de date ca fiind o colecŃie de date
şi alte obiecte. Un obiect al bazei de date este o structură de date denumită,stocată în
bază de date, cum ar fi un tabel, o vizualizare sau un index.

Conceptul de bază de date ACESS

O bază de date (în acest context) este un document Microsoft Access, folosit
pentru a organiza şi accesa informaŃiile.
O bază de date este organizată în înregistrări (record-uri), elemente
individuale de informaŃie (d.e. datele despre o persoană intr-o agendă) şi câmpuri,
fragmente de informaŃii (d.e. numele unei anumite persoane).
O bază de date este, de asemenea, o colecŃie de informaŃii în legătură cu un
anumit subiect sau scop, de exemplu, urmărirea comenzilor clienŃilor sau întreŃinerea
unei colecŃii de muzică. Dacă baza de date nu este stocată pe un computer, sau numai
părŃi din ea sunt, se va urmări informaŃia dintr-o varietate de surse ce trebuie
coordonate şi organizate chiar de către utilizator.
Componentele unei baze de date ACESS

Folosind aplicaŃia Microsoft Access, se poate administra toata informaŃia într-o


singură bază de date (Database). În interiorul acestui fişier de tip Microsoft Access, se
împart datele în structuri separate numite tabele (Tables); se vizualizează, adaugă şi
actualizează datele dintr-o tabelă folosind formele (Forms); se găsesc şi extrag datele
folosind interogări (Queries); şi se analizează sau se tipăresc datele într-un format
special folosind rapoartele (Reports).
Tables, Queries, Forms şi Reports sunt cele mai importante entităŃi care se
creayă într+o bayă de date Access.
Datele se stochează într-o singură locaŃie (în tabelă), dar se pot vizualiza sub
diferite forme: interogare, raport sau formă. În momentul în care se modifică şi
salvează informaŃia în tabelă atunci aceasta se va vedea şi în celelalte forme.
Pentru stocarea datelor, se creează o tabelă pentru fiecare tip de informaŃie pe
care doriŃi să o urmăriŃi. Pentru utilizarea în diverse forme a informaŃiilor din tabele
diferite se pot defini relaŃii între tabele. Astfel, se defineşte o relaŃie între un
identificator unic din tabela de Furnizori şi comenzile către acest furnizor din tabela
ComenziFurnizori. Prin aceasta pentru fiecare furnizor definit în mod unic în tabela
Furnizori se pot extrage din tabela ComenziFurnizori toate comenzile către acesta.
Pentru a găsi şi extrage numai informaŃiile ce îndeplinesc anumite condiŃii
specificate de utilizator şi care includ informaŃii din mai multe tabele, se poate crea o
interogare. O interogare poate de asemenea să actualizeze sau să şteargă mai multe
înregistrări în acelaşi timp, să execute calcule asupra datelor, etc
Pentru a vizualiza, introduce sau schimba uşor datele direct într-un tabel, se
creează o formă. Atunci când se deschide o formă, Microsoft Access extrage date
dintr-unul sau mai multe tabele şi le afişează pe ecran folosind modalitatea de afişare
aleasă/creată de utilizator (prin forma respectivă).
Pentru analiza datelor sau pentru prezentarea lor într-o anumită structură la
tipărire, este necesar să se creeze un raport. Astfel, se poate tipări un raport care
grupează datele şi calculează sumele totale şi alt raport în care se afişează datele
pentru diferite înregistrări din tabelă, etc.
Pentru a lucra cu toate obiectele dintr-o bază de date se utilizează fereastra
Database, cea care permite selectarea Tab-urilor se apasă Tab-ul dorit şi în fereastra
afişată se pot vizualiza toate obiectele (de acel tip) disponibile în baza de date
accesată.
Folosindu-se butoanele din dreapta acestei liste, se pot deschide (Open),
modifica (Design) şi crea (New) obiecte noi.

CerinŃele sistemului şi posibilităŃile aplicaŃiei

Pentru a folosi Microsoft Access 2003 aveŃi nevoie de un Personal Computer


cu Intel Pentium 233-megahertz (MHz) sau un procesor mai rapid (Pentium III fiind
recomandat)
Memoria trebuie să fie de 128 MB de RAM sau mai mare.
Hard disk-ul: 180 MB de spatiu liber pe disc; fişierele de instalare
optionale(recommendat) necesită 200 MB aditionali de spaŃiu liber pe disc.
Este necesară de asemenea şi o unitate CD-ROM sau DVD.
Monitorul trebuie să fie Super VGA (800 × 600) sau un monitor cu o rezoluŃie
mai mare.
Sistemul de operare trebuie să fie: Microsoft Windows® 2000 cu Service Pack
3 (SP3), Windows XP, sau o versiune ulterioară acestora.
In ceea ce priveşte posibilităŃile aplicaŃiei putem spune că Microsoft Access
poate îmbunătăŃi modalitatea în care se organizează, accesează şi partajează
informatia. Access 2003 este suficient de sofisticat pentru dezvoltatori cât şi suficient
de uşor pentru utilizatorii noi.
Access 2003 este mai uşor de utilizat ca niciodată pentru toata lumea, oricare
ar fi nivelul de pregătire.
Există încorporată o experienŃă a utilizatorului îmbunătăŃită, verificarea
automată a erorilor, updatarea automată a proprietăŃilor şi abilitatea de a vizualiza
interdependenŃele dintre obiecte.
Prin intermediul opŃiunilor Import/Export şi al link-urilor către site-urile
Microsoft Windows® SharePoint™ Services se permite trasferul de date/informaŃii
între membrii unei echipe.
Access 2003 dă posibilitatea unei abilităŃi mărite de a importa, exporta şi de a
lucra cu fişiere de date de tip Extensible Markup Language (XML).
Access 2003 suportă o varietate largă de formate de date incluzând Extensible
Markup Language (XML), OLEDB, Open Database Connectivity (ODBC), şi
Microsoft Windows® SharePoint™ Services.
Se foloseşte informaŃie dintr-o varietate largă de formate într-o interfată
familiară.
Access 2003 foloseşte Access 2000 ca formatul de fişier implicit pentru noile
baze de date. Aceasta permite instalarea şi utilizarea Microsoft Access 2003 prin
reutilizarea solutiilor Access deja existente.
Microsoft Access oferă de asemenea posibilităŃi de a lucra într-o modalitate
sigură cu datele folosite de exemplu prin intermediul parolării bazei de date sau prin
mecanisme de back-up al bazei de date.

Pornirea şi oprirea aplicaŃiei


Pentru a putea utiliza Microsoft Access trebuie ca această aplicaŃie să fie
instalată în cadrul pachetului Microsoft Office.
După ce utilizatorul s-a asigurat că această aplicaŃie este instalată, pentru a o
putea deschide trebuie să intre în meniul Start Programs şi apoi să apese Microsoft
Access din acest meniu.
La apăsarea acestui buton se va deschide aplicaŃia Microsoft Access în care va
apărea o fereastra(Task Pane) în care utilizatorului i se va cere să precizeze acŃiunea
următoare.
Această acŃiune poate fi :
 una din cele două opŃiuni de creare a unei noi baze de date
 deschiderea unei baze de date existente
Pentru oprirea aplicaŃiei există două posibilităŃi:
 fie din meniul aplicaŃiei prin apăsarea butonului Ieşire (Exit)
 fie din butonul Închide (Close) al fiecărei aplicaŃii de tip fereastră.

Crearea unei baze de date


Crearea şi deschiderea unei baze de date se pot face în două feluri:
 fie din fereastra de alegere a următoarei acŃiuni care va apare la pornirea
aplicaŃiei (v. punctul 1.3.),
 fie din meniul File (Fişier – o bază de date este un fişier de tip Microsoft
Access) al aplicaŃiei.
Crearea unei baze de date vidă
Pentru crearea unui fisier nou de tip Microsoft Access se poate selecta opŃiunea
Baza de date Vidă (Blank Database).
La apăsarea butonului Ok se va deschide o fereastră în care se va cere
utilizatorului numele noii baze de date create.
Fereastra nou deschisă prezintă următoarele caracteristici:
 are titlul Fişier Nou de tip Bază de date (File New Database)
 prezintă opŃiunea de a salva într-o locaŃie dorită Salvează în (Save in) –
directorul My Documents. In interiorul directorului selectat se pot vizualiza
celelalte fişiere de acelaşi tip existente (în acest caz nici unul).
De asemenea, tot în această fereastră:
 se poate introduce numele fişierului de tip bază de date în rubrica Numele
fişierului (File name), - în acest caz se poate pune numele implicit db1
 se poate modifica tipul fişierului la rubrica Salvează ca tip (Save as type), tip
bază de date Microsoft Access (Microsoft Access Databases).
 se apasă butonul Crează (Create)
 în cazul unei renunŃări se poate apăsa butonul Anulează (Cancel).
În cazul în care se doreşte o altă locaŃie pentru baza de date pe cale de a fi
creată, se apasă săgeata existentă lângă numele directorului selectat din oficiu şi se va
da posibilitatea selectării unui alt director.
BineînŃeles, în urma selectării unui alt director, informaŃia despre fişierele
conŃinute de acesta se va schimba în conformitate cu directorul selectat.
Fie în continuare un fişier dbCurs, în My Documents, de tip bază de date
Microsoft Access şi se apasă butonul Create.
În urma apăsării acestui buton se deschide o fereastră de tip Database.
Aceasta este o fereastră în care nu există absolut nici un obiect de tip
Database, i.e. este o bază de date vidă. ObŃinerea aceluiaşi rezultat se poate realiza şi
apăsând butonul Nouă bază de date (New Database) din meniul File al aplicaŃiei.
La apăsarea acestui buton se va deschide o nouă fereastră în care utilizatorul
va fi întrebat dacă doreşte o nouă bază de date vidă.
La apăsarea butonului Ok se va deschide fereastra de mai sus.

Deschiderea unei baze de date existente

O asemenea operaŃie se poate face din fereastra de dialog deschisa in urma


alegerii optiunii Open (i.e. se alege fişierul creat la punctul 1.4.1, dbCurs).
La apăsarea butonului Ok se va deschide baza de date selectată (dbCurs) şi
aceasta este o bază de date vidă deoarece nu a fost creat absolut nici un obiect în ea.
ObŃinerea aceluiaşi rezultat se poate realiza şi apăsând butonul Deschide bază
de date (Open Database) din meniul File al aplicaŃiei.
La apăsarea acestui buton se va deschide o nouă fereastră în care utilizatorul
va fi întrebat ce fişier de tip bază de date doreşte a fi deschis.
La apăsarea butonului Deschide (Open) din dreapta ferestrei se ajunge din nou
la fereastra Database.

Închiderea unei baze de date

Pentru închiderea unei baze de date se poate folosi butonul Close din meniul
File al aplicaŃiei sau butonul Close din fiecare aplicaŃie de tip fereastră.
Conversii, Compactări, ReparaŃii)
Pentru realizarea conversiei unei baze de date (dintr-o versiune in alta)
trebuiesc parcurse urmatoarele etape:
1. se salvează (cu un alt nume) o copie a bazei de date ce urmează a fi
convertită (pentru a se păstra originalul până când se va putea lucra cu noua bază de
date).
2. se închide baza de date ce se doreşte convertită
3. dacă baza de date este cu mai mulŃi utilizatori (localizată pe un server sau
într-un director partajat), trebuie să nu fie accesată de niciunul din aceştia.
4. în meniul Unelte (Tools) al ferestrei Access se apasă pe opŃiunea
Database Utilities respectiv Converteşte Baza de date (Convert Database).
5. la apăsarea acestei opŃiuni se deschide o fereastră din care se poate
selecta baza de date ce urmează a fi convertită(modul de lucru este similar cu cel
aferent deschiderii unei baze de date)
6. la apăsarea butonului Convert se deschide o fereastră în cadrul căreia se
poate alege numele bazei de date ce urmează a fi creată prin conversia celei selectate
în fereastra anterioara – şi locaŃia acesteia. Pentru cazul unei locaŃii diferite, se poate
păstra acelaşi nume al bazei de date în cazul în care se doreşte şi păstrarea acestei
versiuni a bazei de date.
După efectuarea acestor paşi, baza de date creată într-o versiune anterioară de
Microsoft Access este convertită la versiunea curentă.
În acelaşi meniu cu Convert Database mai există şi alte opŃiuni: Compact
Database şi Repair Database
OpŃiunea Compact Database copiază şi compactează o bază de date închisă
(i.e. se poate schimba versiunea Microsoft Access şi se poate cripta fişierul).
În majoritatea cazurilor, Microsoft Access va detecta dacă o bază de date s-a
stricat atunci când se încearcă deschiderea, compactarea, criptarea sau decriptarea ei şi
se oferă opŃiunea reparării acestei baze de date. În anumite situaŃii Microsoft Access
poate să nu detecteze dacă o bază de date s-a stricat (d.e. în cazul în care o bază de
date se comportă imprevizibil).
Pentru a repara o bază de date presupusă stricată şi nesesizată de Microsoft
Access se apasă opŃiunea Repair Database. Dacă se doreşte repararea unei alte baze
de date atunci se închide cea curentă şi apoi se apasă opŃiunea Repair Database; în
acest caz se va deschide o fereastră de dialog în care va trebui sa introduceŃi baza de
date necesar a fi reparată.

LECłIA 2. TABELE
În această lecŃie se vor prezenta noŃiuni despre tabele şi anume:
 Nume de câmpuri, Mărimea şi Tipul câmpurilor de date
 ProprietăŃile câmpurilor
 Validarea câmpurilor
 Cheia primară
 Indexarea

Componenta principală a unei baze de date din Microsoft Access este


TABELA – o colecŃie de informaŃii dispuse pe înregistrări (linii) şi câmpuri
(coloane). Pentru a se lucra cu tabelele dintr-o bază de date, din fereastra Database se
poziŃionează utilizatorul pe fereastra corespunzătoare tabelelor (prin apăsarea Tab-
ului Tables)
Pentru crearea unei tabele noi se va apăsa butonul Nou (New).
În acest moment poate fi selectată modalitatea de creare a acestei tabele.
Din variantele existente se va alege Design View şi la apăsarea butonului Ok
va apare fereastra în care se pune la dispozitia utilizatorului o modalitate de definire a
unei tabele noi sub formă tabelară.
În tabelul furnizat liniile reprezintă câmpurile tabelei, iar coloanele –
informaŃiile despre aceste câmpuri :
 Field Name – Numele câmpului
 Data Type – Tipul de date ce va fi introdus în acest câmp
 Description - O scurtă descriere a câmpului respectiv
 Field Properties - ProprietăŃile câmpului respectiv (sunt dependente de
tipul de date şi sunt afişate în partea inferioară a ferestrei deschise).

Nume de câmpuri
Numele câmpului se introduce în coloana cu acelaşi nume (Nume câmp, Field
Name). Această coloană va conŃine numele tuturor câmpurilor din tabelă.
Pentru introducerea numelor de câmpuri se vor respecta regulile Microsoft
Access de denumire a câmpurilor :
 maxim 64 de caractere
 orice combinaŃii de litere, numere, spaŃii şi caractere speciale
 NU pot fi folosite următoarele elemente:
 Punctul (.)
 Semnul de exclamare (!)
 Parantezele dreptunghiulare ([ ])
 Caracterele de control
 NU se pot folosi spaŃii la începutul numelui
Câteva sugestii referitoare la introducerea numelor de câmpuri :
nu vor fi folosite spaŃii în interiorul numelui dacă vor fi utilizate în cadrul
codului de Visual Basic
 nu se vor folosi nume extrem de lungi deoarece sunt dificil de referit
 se recomandă utilizarea unui nume sugestiv pentru valoarea ce va fi
introdusă în acel câmp.
ObservaŃie: După cum s-a putut observa există primul câmp din tabela
agendaPersoane numit NrCrt: acest câmp are semnificaŃia de Numar Curent – Nr Crt:
prin urmare, dacă semnificaŃia câmpului este formată din mai multe cuvinte, atunci
numele câmpului ar trebui sa le conŃină, dacă nu pe toate, măcar pe cele mai
semnificative şi despărŃite NU prin spaŃii ci prin scrierea lor cu literă mare la început
(de cuvânt semnificativ).

Tipuri de câmpuri de date


Tipul de câmp de date (DataType) determină tipul de valori pe care utilizatorii
le pot introduce în interiorul câmpului respectiv. Acest tip poate fi introdus/modificat
în coloana a doua din Design View. Există mai multe tipuri de câmpuri de date.
Această coloană se utilizează în felul următor :
 dacă se introduce doar numele câmpului şi se trece la câmpul următor,
atunci tipul de date Text este introdus în mod implicit.
 la selectarea unui tip de date în partea inferioară a acestei ferestre sunt
puse la dispoziŃie proprietăŃile câmpului (Field Properties) .
La un anume moment, se poate dori schimbarea tipurilor de date pentru
câmpuri ce conŃin deja informaŃii. Aceasta se poate întâmpla de exemplu la
importarea unor date şi Microsoft Access nu a setat tipul de date dorit, sau chiar în
timpul construirii bazei de date, când tipul de date selectat initial se dovedeşte a nu
mai fi potrivit.
Înaintea acestor conversii (dintr-un tip în altul) este bine să se aibă în vedere
consecinŃele unei asemenea schimbări asupra informaŃiilor existente deja în tabelă. De
asemenea, trebuie luate în consideraŃie modificările ce trebuiesc operate în
interogările, rapoartele sau formele ce utilizau acest câmp.
Cele mai comune schimbări de tip de date sunt prezentate în cele ce urmează:
 conversia din orice tip în Text
 conversia din Text în Number, Currency, Date/Time sau Yes/No
 conversiile între Number şi Currency sau între Text şi Memo
 schimbarea proprietăŃii FieldSize la tipul Number.
Fiecare dintre aceste schimbări va fi prezentată separat.

Text, Memo
Microsoft Access furnizează două tipuri de date Text şi Memo pentru a stoca
text sau combinaŃii de text cu numere.
Tipul Text poate fi folosit pentru a stoca nume, adrese, şi orice numere ce nu
necesită calcule (d.e. numere de telefon sau numere de cont). Un astfel de câmp poate
stoca până la 255 de caractere, dar valoarea implicită este de 50 de caractere. Pentru a
controla numărul maxim de caractere introduse într-un câmp atunci trebuie setată
proprietatea Field Size.
Tipul Memo se foloseşte dacă se doreşte stocarea unor texte sau combinaŃii de
text cu numere foarte lungi, de până la 65 535 de caractere, deci mai mult de 255 de
caractere puse la dispoziŃie de tipul Text. Aceste câmpuri nu pot fi indexate sau
sortate. Ambele tipuri stocheaza doar caracterele introduse; nu se memorează spaŃii
pentru caracterele neintroduse.
ProprietăŃile acestor două tipuri de date sunt similare.
După un timp în care se stochează numere ce necesită calcule în câmpuri de
tip Number şi Currency se poate ajunge la concluzia că aceste câmpuri trebuie să mai
conŃină şi litere sau alte caractere nenumerice. Astfel, dacă se foloseşte un câmp de tip
Number pentru numere de cont (acestea conŃinând numai cifre) şi numerele de cont se
modifică şi conŃin de la un anume moment şi litere, atunci acest tip trebuie modificat
la Text. Microsoft Access converteşte valorile numerice la text folosind formatul
General Number, ca şi valorile Date/Time folosind formatul General Date. Valorile
convertite nu vor conŃine simboluri valutare sau alte caractere speciale de formatare
specificate pentru câmp înainte de conversie.
Conversia din Text în orice alt tip de date se face fără pierderi de informaŃie
atât timp cât informaŃiile deja introduse sunt potrivite pentru noul tip de câmp în care
se realizează conversia (d.e. nu se poate face conversia la tipul Number dacă valorile
introdus conŃin şi altceva decât numere).
Number, Currency, AutoNumber
Microsoft Access furnizează şi două tipuri de date pentru câmpuri ce conŃin
valori numerice: Number şi Currency.
Tipul Number se foloseşte atunci când valorile introduse se folosesc în calcule
matematice, cu excepŃia acelor calcule ce implică indici monetari sau care cer un mare
grad de acurateŃe. Tipul şi dimensiunea valorilor numerice dintr-un câmp de tip
Number pot fi controlate prin setarea proprietăŃii FieldSize (d.e. pentru Byte se vor
stoca numai numere de la 0 la 255 şi vor ocupa un spaŃiu de un octet).
Tipul Currency se foloseşte atunci când se doreşte evitarea rotunjirilor în
timpul calculelor. Intr-un astfel de câmp se introduc valori valutare şi date numerice
folosite în calcule implicând valori cu una până la patru cifre după separatorul
zecimal. Se pot introduce valori cu până la 15 cifre în partea stângă a separatorului
zecimal şi 4 cifre în dreapta separatorului zecimal. Valorile stocate în acest fel, vor
ocupa un spaŃiu de 8 octeŃi. Tipul valutar depinde de setările din Regional Settings,
dar la schimbarea acestor setări se modifică doar modul de afişare şi nu se fac şi
conversiile aferente (d.e. 256 $ va fi schimbat în 256 £).
ProprietăŃile acestor două tipuri sunt identice cu excepŃia proprietăŃii FieldSize
care la tipul Currency este fixată la 8 octeŃi.
Tipul numeric AutoNumber este un tip special. Un câmp de acest tip
stochează un număr unic secvenŃial (incrementat cu 1) sau o valoare aleatoare
asignată de Microsoft Access atunci când o nouă înregistrare este adăugată într-o
tabelă. Câmpurile de tip AutoNumber nu pot fi modificate.
Unui câmp de tipul AutoNumber nu i se poate schimba tipul după ce au fost
introduse date în tabelă chiar dacă nu a fost nimic introdus în acel câmp. Deci acest
tip de câmp de date poate fi ales numai înainte de a se introduce date de orice fel în
tabela respectivă. Proprietatea FieldSize este fixată la Long Integer. Valorile noi ale
acestui tip se pot obŃine prin incrementare sau în mod aleatoriu.
Pentru conversiile din tipul Text în tipul Number, separatorul zecimal şi cele
de mie sunt interpretate corect. Simbolurile valutare sunt interpretate în funcŃie de
setările din Regional Settings din Control Panel.
De asemenea, se pot realiza conversii între tipurile Number şi Currency: se
face conversia de la Number la Currency atunci când, cu valorile stocate în câmpul
respectiv, se vor realiza calcule numeroase şi când aceste valori conŃin una până la 4
zecimale. Pentru câmpurile de tip Currency se foloseşte metoda de calcul în virgulă
fixă ce evită erorile de rotunjire.
Date/Time
Acest format se alege pentru un câmp dacă se doreşte stocarea în cadrul lui a
unor informaŃii de tip Dată/Timp. Pentru acest tip de date sunt puse la dispoziŃie în
cadrul proprietăŃii Format diverse formate de dată (d.e. 07/02/2005), în funcŃie de
setările din Regional Settings. Un câmp de tipul Date/Time poate conŃine valori de
dată şi timp cuprinse între anii 100 şi 9999.
La selectarea acestui tip sunt puse la dispoziŃia utilizatorului o serie de
proprietăŃi ce pot restricŃiona valorile introduse în acest tip de câmp de date. În acest
caz nu mai există (ca în cazul câmpului Number) proprietatea Field Size, aceasta fiind
fixată la 8 octeŃi.
Stocarea informaŃiilor de tip date într-un astfel de câmp asigură că datele vor fi
sortate în mod corespunzător. De asemenea, modificările efectuate asupra formatului
de dată în Regional Settings din Control Panel vor fi reflectate şi în aceste câmpuri.
Pentru conversiile din tipul Text în tipul Date/Time majoritatea datelor sunt
convertite în mod corect. Formatele de dată şi timp sunt interpretate în conformitate
cu setările din Regional Settings din Control Panel.
Yes/No
Un câmp de acest tip poate conŃine doar valori Yes/No (Da/Nu) şi poate avea
doar una din două valori (Yes/No, True/False, sau On/Off). Dimensiunea acestui câmp
este de 1 bit, care în funcŃie de valoarea introdusă, poate avea valoarea 0 sau 1.
Pentru conversiile din tipul Text în tipul Yes/No cuvintele Yes, True, sau On
sunt convertite într-o valoare Yes, iar pe de altă parte valorile No, False, sau Off sunt
setate la o valoare No.
De asemenea la tipul Yes/No se pot converti şi date memorate într-un câmp de
tip Number în felul urmator: valorile 0 sau NULL vor fi convertite la valoarea No, iar
valorile diferite de zero la valoarea Yes.
ProprietăŃile câmpurilor
Fiecare câmp are un set de proprietăŃi ce sunt folosite pentru a specifica
modalitatea în care informaŃiile din câmpul respectiv sunt stocate, utilizate sau afişate
(d.e. prin proprietatea FieldSize se poate controla numărul maxim de caractere ce
poate fi introdus într-un câmp de tip Text sau Memo).
ProprietăŃile câmpurilor pot fi setate din fereastra Design View deschisă prin
apăsarea butonului Design pentru o tabelă selectată. Aici se selectează câmpul pentru
care se doreşte setarea proprietăŃilor în partea de sus a ferestrei şi se modifică/setează
proprietăŃile acestui câmp în partea de jos a ferestrei.
ProprietăŃile ce sunt disponibile în partea de jos a ferestrei sunt determinate de
tipul de date selectat pentru câmpul respectiv.
Mărimea câmpurilor
Se poate folosi proprietatea Mărimea câmpurilor (Field Size) pentru a seta
mărimea maximă a datelor depozitate într-un câmp cu tipul setat la unul din
următoarele tipuri de date: Text, Number, sau AutoNumber.
Dacă tipul de date al câmpului este Text, atunci se introduce un număr între 0
şi 255. Setarea implicită este 50.
Dacă tipul de date al câmpului este AutoNumber, proprietatea FieldSize poate
fi setată la LongInteger sau Replication ID.
Dacă tipul de date al câmpului este Number, proprietatea FieldSize poate fi
setată în unul din modurile prezentate în tabelul următor:
ObservaŃii:
1. Se recomandă a fi folosită o valoare cât mai mică posibil a proprietăŃii
FieldSize deoarece date cu dimensiuni mai mici sunt procesate mai rapid şi utilizează
şi o memorie mai mică.

2. Dacă se converteşte o valoare mai mare a proprietăŃii FieldSize la una


mai mică, într-un câmp ce conŃine deja valori, se pot pierde date: d.e. dacă se schimbă
FieldSize pentru un câmp de tip Text de la 255 la 50, atunci datele aflate dincolo de
limita a 50 de caractere vor dispare. Dacă datele dintr-un câmp de tip Number nu
încap în noua setare FieldSize, numerele fracŃionare se pot rotunji sau se poate obŃine
chiar valoarea NULL. Astfel, dacă se schimbă setarea din Single în Integer, valorile
fracŃionare vor fi rotunjite la cea mai apropiată valoare întreagă şi valorile mai mari
decât 32,767 sau mai mici decât –32, 768 vor rezulta în câmpuri nule.
3. Nu se pot reface schimbările ce rezultă dintr-o modificare a proprietăŃii
FieldSize după ce se salvează acele schimbări în Design View.
4. Se poate folosi tipul de date Currency dacă se urmăreşte a se executa
numeroase calcule într-un câmp ce conŃine valori cu una până la 4 zecimale. Tipurile
de date Single şi Double cer calcularea în virgulă mobilă. Tipurile de date Currency
utilizează o modalitate de calcul în virgulă fixă (mai rapidă).
Formatul
Proprietatea Format se foloseşte pentru a stabili modalitatea în care numerele,
datele şi textul sunt afişate şi tipărite.
Pentru un câmp, această proprietate se poate seta în Design View, în Field
Properties; de asemenea, această proprietate se poate seta şi în codul de Visual Basic.
Astfel, dacă în tabela Catalog s-a creat un câmp PreŃ de tipul Currency, se pot
seta proprietăŃile acestuia la Currency (Valută) şi proprietatea de DecimalPlaces
(Numărul de Zecimale) la 2 sau pe Auto. Dacă se stochează valoarea 4321.678 în
câmpul respectiv, atunci numărul se va afişa sub forma: $4,321.68.
De asemenea, se poate folosi unul din formatele predefinite sau se poate crea
un format propriu folosind simbolurile de formatare.
Proprietatea Format foloseşte diferite setări pentru tipuri diferite de date
In exemplul ilustrat sunt prezentate formatele predefinite puse la dispoziŃia
utilizatorului de către Microsoft Access pentru tipul Date/Time.
Sunt prezentate de asemenea si formatele puse la dispoziŃia utilizatorului
pentru tipurile de date Currency şi Number.
ObservaŃii :
1. Proprietatea Format afectează numai modalitatea de afişare a datelor, nu
şi pe cea de stocare.
2. Microsoft Access furnizează formate predefinite pentru tipurile de date
Date/Time, Number şi Currency şi Yes/No. Formatele predefinite depind de Ńara
specificată prin dublu click pe Regional Settings din Control Panel.
Microsoft Access afişează formatele potrivite pentru Ńara selectată. Astfel,
pentru selecŃia English (United States) realizată în Regional Settings, valoarea stocată
în câmpul Pret (din tabela Catalog) de 1234.56 în formatul Currency apare ca
$1,234.56, dar dacă este selectată English(United Kingdom), acelaşi număr apare ca
£1,234.56. Dacă se setează proprietatea Format în Design View, Microsoft Access
foloseşte acest format pentru a afişa datele în tabel.
Dar dacă se setează pentru câmpul Pret tipul Currency, formatul Currency
pentru English (United Kingdom) şi apoi se schimbă această setare din Regional
Settings la English (United States), datele deja introduse nu se modifică ci rămân pe
formatul £1,234.56 ca şi cum acest format ar fi fost definit de utilizator.
3. Dacă se doreşte formatarea de către utilizator fără a se folosi formatele
predefinite atunci se poate folosi unul din simbolurile următoare pentru orice tip de
date:

Se pot amesteca simbolurile de formatare de la tipurile de date Number şi


Currency cu simbolurile de formatare de la Date/Time, Yes/No, sau Text şi Memo.
Proprietatea Format are prioritate faŃă de proprietatea Input Mask la afişarea
informaŃiilor conŃinute de câmpul pentru care sunt definite aceste proprietăŃi, Input
Mask fiind ignorată. Datele sunt afişate conform specificaŃiilor din Format şi nu din
Input Mask.

Valoarea implicită
Proprietatea Valoare Implicită (Default Value) se poate folosi pentru a
specifica o valoare ce va fi în mod automat introdusă atunci când se adaugă o nouă
înregistrare în tabelă. Astfel, dacă majoritatea furnizorilor sunt din Bucureşti, atunci
câmpul Oraş pentru tabela de Furnizori poate fi setat ca având Default Value de
“Bucureşti”. Se poate accepta această valoare sau se poate suprascrie cu o nouă
valoare.
Default Value se poate seta pentru un câmp în Design View sau pentru un
control pe formă/raport. În majoritatea cazurilor se va dori ca această proprietate să fie
setată în Design View în tabela ce conŃine câmpul respectiv, din moment ce aceasta va
fi aplicată controalelor bazate pe acel câmp (atât timp cât controalele au fost create
după setarea acestei proprietăŃi în Design View al tabelei). Dacă un control nu este
legat de un câmp dintr-o tabelă atunci această proprietate trebuie setată în
formă/raport.
ObservaŃii :
1. Setarea proprietăŃii Default Value nu are efect asupra datelor deja
existente. Oricum se poate înlocui valoarea curentă a unui câmp cu valoarea implicită
prin apăsarea CTRL+ALT+SPACEBAR.
Dacă se defineşte o valoare implicită pentru un câmp de tip Yes/No într-o bază
de date care va fi utilizată internaŃional, se recomandă a fi introdus un semn egal
înaintea valorii şi Microsoft Access va afişa valoarea în limba locală (d.e. se introduce
“=Yes” dacă se doreşte ca în Germania să fie afişat “Ja”).
Regula de validare
Regula de Validare (Validation Rule) se poate folosi pentru a specifica
cerinŃele pentru datele introduse într-o înregistrare, câmp sau control (pe o
formă/raport). Este folosită împreună cu Textul de Validare. Atunci când datele
introduse încalcă Regula de Validare, se poate folosi Textul de Validare pentru a
specifica mesajul afişat utilizatorului.
Regulile de validare sunt aplicate :
 pentru câmp atunci când se editează datele după ce focusul părăseşte
câmpul
 pentru înregistrări atunci când vă mişcaŃi pe altă înregistrare.
ObservaŃii :
1. Aceste proprietăŃi nu se aplică în cazul controalelor de tip check box,
buton option sau buton toggle, atunci când ele sunt într-un grup option. Ele se aplică
numai grupului option însuşi [pentru forme].
2. Setarea se realizează introducând o expresie pentru Regula de Validare;
lungimea maximă este de 2048 de caractere.
3. Regula de Validare nu poate conŃine orice expresie.
De asemenea, pentru un câmp sau pentru o înregistrare nu se pot folosi :
 funcŃii definite de utilizator
 funcŃia de CurrentUser sau Eval, sau
 referinŃe la forme, tabele sau interogări. În plus pentru câmpuri Regula de
Validare nu poate conŃine referiri la alte câmpuri din tabelă.
4. Microsoft Acces validează automat datele introduse în funcŃie de tipul de
date al câmpului. Astfel, Microsoft Access nu permite introducerea unui text într-un
câmp numeric in plus, regulile de validare mai specifică şi un mod de validare
suplimentar faŃă de simpla verificare a tipului de date introdus.

Regula de validare
Regula de Validare (Validation Rule) se poate folosi pentru a specifica
cerinŃele pentru datele introduse într-o înregistrare, câmp sau control (pe o
formă/raport). Este folosită împreună cu Textul de Validare. Atunci când datele
introduse încalcă Regula de Validare, se poate folosi Textul de Validare pentru a
specifica mesajul afişat utilizatorului.
Regulile de validare sunt aplicate :
 pentru câmp atunci când se editează datele după ce focusul părăseşte
câmpul
 pentru înregistrări atunci când vă mişcaŃi pe altă înregistrare.
ObservaŃii :
1. Aceste proprietăŃi nu se aplică în cazul controalelor de tip check box,
buton option sau buton toggle, atunci când ele sunt într-un grup option. Ele se aplică
numai grupului option însuşi [pentru forme].
2. Setarea se realizează introducând o expresie pentru Regula de Validare;
lungimea maximă este de 2048 de caractere.
3. Regula de Validare nu poate conŃine orice expresie.
De asemenea, pentru un câmp sau pentru o înregistrare nu se pot folosi :
 funcŃii definite de utilizator
 funcŃia de CurrentUser sau Eval, sau
 referinŃe la forme, tabele sau interogări. În plus pentru câmpuri Regula de
Validare nu poate conŃine referiri la alte câmpuri din tabelă.
4. Microsoft Acces validează automat datele introduse în funcŃie de tipul de
date al câmpului. Astfel, Microsoft Access nu permite introducerea unui text într-un
câmp numeric in plus, regulile de validare mai specifică şi un mod de validare
suplimentar faŃă de simpla verificare a tipului de date introdus .
Textul de validare
Textul de Validare (Validation Text) se foloseşte împreună cu Regula de
Validare, acesta fiind mesajul care va fi afişat utilizatorului în momentul în care
valoarea introdusă în câmpul respectiv nu respectă Regula de Validare.
Lungimea maximă pentru Textul de Validare este de 255 de caractere. Setarea
se realizează introducând o expresie pentru Regula de Validare şi un text pentru
Textul de Validare.

Indexarea

Proprietatea de Indexare (Indexed) se foloseşte pentru a crea pentru a seta un


index într-o tabelă.
Un index este o caracteristică a Microsoft Access care măreşte viteza
interogărilor pe câmpurile indexate ca şi sortările sau operaŃiile de grupare.
Înregistrările dintr-o bază de date nu sunt stocate într-o ordine particulară. Prin setarea
proprietăŃii Indexare se schimbă doar ordinea în care înregistrările sunt scoase din
baza de date, nu este afectată ordinea de stocare (ordinea fizică) a înregistrărilor.
Descrierea setării acestei proprietăŃi:
 No – Valoare implicită – nu este index.
 Yes (Duplicates OK) – este index şi sunt permise duplicatele(aceleaşi
valori pentru un acelaşi câmp pe înregistrări diferite).
 Yes (No Duplicates) – este index şi nu sunt permise duplicatele.
Această proprietate se poate seta numai în modul Design View.
De exemplu, dacă ne interează anumite nume dintr-o tabelă StudenŃi, putem
crea un index pentru coloana NumeSt, pentru a regăsi mai repede studenŃii cu un
anmit nume de familie..
Unui câmp i se setează această proprietate numai dacă îndeplineşte una din
următoarele condiŃii:
 tipul de date al câmpului este Text, Number, Currency sau Date/Time
 se anticipează căutări pentru valorile stocate în acest câmp
 se anticipează sortări după valorile stocate în câmp
 se anticipează stocarea unor multe valori diferite în acest câmp. Dacă multe
din valorile din câmp sunt identice, atunci indexul nu va mări în mod
semnificativ viteza interogărilor.
Un index poate fi creat din mai multe câmpuri şi atunci sortarea se face după
primul câmp din index, în cazul în care pe acest câmp s-au găsit duplicate atunci se
realizează sortarea după cel de-al doilea câmp şi aşa mai departe.
O altă modalitate de a crea un index pentru o tabelă se poate realiza prin
apăsarea butonului aferent din meniul Microsoft Access(aflat linga cheita.).
La apăsarea acestui buton se va deschide o fereastră în care este permisă
introducerea unui index prin numele lui, câmpul şi modalitatea de sortare (Ascending,
Descending), iar în partea de jos a ferestrei se pot seta proprietăŃile indexului.
ObservaŃii
1. Se foloseşte proprietatea Indexare pentru a găsi sau sorta înregistrările
dintr-o tabelă folosind un singur câmp. Valorile conŃinute de câmp pot să fie unice
sau nu, d.e. se poate crea un index pentru câmp ID ale cărui valori trebuie să fie unice
(Yes (No Duplicates)) sau pentru un câmp Nume pentru care pot exista duplicate (Yes
(Duplicates OK)) .
2. Nu se pot indexa câmpuri de tip Memo sau Hyperlink sau OLE.
3. Numărul câmpurilor dintr-un index poate fi oricât de mare. Un index este
creat atunci când se salvează o tabelă şi este în mod automatic modificat atunci când
se modifică sau se adaugă o înregistrare. Un index se poate adăuga sau şterge oricând
în Design View.
4. Dacă o cheie primară pentru o tabelă este formată dintr-un singur câmp,
Microsoft Access va seta automat proprietatea Indexare pentru acel câmp la Yes (No
Duplicates) şi Requiered.
5. Nu este obligatoriu să se seteze neapărat această proprietatea într-o
tabelă, dar atunci când se lucrează cu tabele mari, neindexate, accesarea sau
extragerea datelor din tabelă poate dura foarte mult timp. Pe de altă parte crearea unui
index format din prea multe câmpuri poate încetini destul de mult operaŃii ca
actualizare, adăugare sau ştergere.
De exemplu creem un index cu numele NUME , pentru coloanele NumeSt şi
PrenumeSt. Pentru aceasta
 se deschide tabela Studenti
 se apasă pe butonul Indexes din bara . Apare fereastra Indexes care conŃine
deja cheia primara IdST.
 Se creaza un index cu numele NUME pentru numele si prenumele
studentilor
 Se introduce numeSt in ferestra index in cimpul FieldName iar in cimpul
Index Name se da numele Nume
 In linia urmatoare se lasa libera caseta IndexName si in Field Name se
alege prenumeSt, ca in figura

 ProprietăŃile fiecărui indexse văd în partea de jos a ferestrei Indexes, cand


se face clic în caseta cu numele indexului.(Nume şi respectiv Primary Key).
În Partea a_III_a , SQL, se prezintămodul de crearea a unui index , cu
instrucŃiunea DDL, CREATE INDEX.

Cheia primară
O cheie primară (Primary Key) reprezintă un mod unic de identificare a unei
înregistrari într-o tabelă. O Cheie Primară este un index pentru care proprietatea
Primary este setată pe Yes.
Puterea unui sistem de baze de date aşa cum este Microsoft Access vine din
abilitatea sa de a găsi şi de a aduce rapid informaŃii stocate în tabele diferite folosind
interogările, formele şi rapoartele. Pentru a putea realiza acest lucru, fiecare tabelă ar
trebui să includă un câmp sau o mulŃime de câmpuri care să identifice în mod unic
fiecare înregistrare din tabelă. Acest câmp sau aceste câmpuri poartă denumirea de
Cheia Primară a tabelei. Din momentul în care s-a hotărât care este cheia primară a
unei tabele, Microsoft Access va preveni duplicatele sau valorile de Null introduse în
câmpurile din cheia primară pentru a se asigura unicitatea acesteia.
In Microsoft Access se pot defini trei tipuri de cheie primară: AutoNumber, cu
un singur câmp şi cu mai multe câmpuri.
Cheia Primară de tip AutoNumber
Un câmp de tip AutoNumber poate fi setat să introducă în mod automat un
număr secvenŃial pe măsură ce fiecare înregistrare este adăugată într-o tabelă. Cea mai
uşoară modalitate de creare a unei Chei Primare este de a desemna un astfel de câmp
pe post de Cheie Primară. Posibilitatea acestei acŃiuni este descrisă mai sus.
Cheia Primară cu un singur câmp
Dacă există un câmp ce conŃine valori unice cum ar fi numere de Identificare
(ID) se poate desemna acest câmp pe post de cheie primară. Dacă în câmpul desemnat
pe post de cheie primară sunt valori duplicate sau valori de Null, atunci Microsoft
Access nu va permite aceasta acŃiune. Dacă nu se pot elimina duplicatele din
informaŃia stocată într-un câmp din tabelă atunci se poate alege o cheie primară din
celelalte două tipuri.
Cheie Primară cu mai multe câmpuri
In situaŃiile în care nu este garantată unicitatea valorilor dintr-un câmp anume
(pentru a se putea folosi cheia primară cu un singur câmp) se poate crea o cheie
primară formată din două sau mai multe câmpuri.
Microsoft Access creează în mod automat un index pentru cheia primară dintr-
o tabelă şi o foloseşte pentru a găsi înregistrări. Indexul cheie primară cere să fie
introdusă o valoare în fiecare câmp ce o creează şi nu permite duplicate. Ordinea
câmpurilor dintr-o cheie primară formată din mai multe câmpuri determină ordinea
implicită de sortare a tabelei.
Dacă pentru o tabelă se salvează modificările din Design View fără să posede
o cheie primară atunci o fereastră de dialog este deschisă pentru a întreba dacă se
doreşte sau nu crearea unei chei primare.
Dacă se apasă Yes, atunci Microsoft Access introduce un câmp suplimentarde
tip AutoNumber (setat pe Increment) ce va constitui cheia primară. Dacă apăsaŃi No,
atunci tabela este salvată fără cheie primară. Apăsarea butonului Cancel permite
întoarcerea în fereastra Design View pentru a opera orice alte modificări dorite.
O tabelă fără Cheie Primară nu poate fi folosită pentru a defini relaŃii între
tabele, iar operaŃiile de sortare şi căutare sunt mult încetinite.
O Cheie Primară poate fi setată în trei modalităŃi:
 click-dreapta pe câmpul dorit sa fie cheie primară şi din meniul afişat se
apasă Primary Key, sau
 se selectează câmpul respectiv şi se apasă butonul de Primary Key din
meniul Design View,
 se deschide fereastra de definire a unui index, se creează un index căruia i
se setează proprietatea Primary la Yes.
Gestiunea tabelelor
Se vor prezenta tehnici de:
• Editare a tabelelor(introducere, stergere ,adaugare de înregistrări)]
• Editarea câmpurilor(Modificarea, Căutarea şi înlocuirea conŃinutului
câmpurilor
• Copierea, redenumirea şi ştergerea tabelelor
• Importul
• Exportul
• Legarea

Editare a tabelelor
Pentru a putea accesa informaŃiile stocate într-o tabelă, aceasta trebuie în
primul rând deschisă. Deschiderea unei tabele pentru accesarea informaŃiilor stocate
în ea pentru introducere, modificare şi ştergere de înregistrări se face astfel :
se selectează tabela în care utilizatorul doreşte să efectueze operaŃiile
respective şi apoi se apasă butonul Open.

Introducerea înregistrărilor de date


Se consideră o tabelă goală, respectiv tabela Catalog, în care se doreşte
introducerea de înregistrări.
Se poate observa focusul poziŃionat pe primul câmp al primei înregistrări din
tabelă, respectiv NrCrt.
Inregistrările se pot introduce câmp cu câmp (între câmpuri mişcarea
realizându-se prin apăsarea tastei Tab), iar când s-a completat şi ultimul câmp dintr-o
înregistrare se apasă încă o dată tasta Tab pentru a se poziŃiona pe primul câmp al
următoarei înregistrări.
Pentru introducerea unei noi înregistrări, meniul Microsoft Access pune la
dispoziŃia utilizatorului butonul Inregistrare Nouă (New Record).
Acest buton este disponibil fie în Toolbar-ul din Microsoft Access fie atunci
când se apasă click-dreapta pe o înregistrare existentă deja în tabelă.
La apăsarea acestui buton, focusul se poziŃionează pe primul câmp al primei
înregistrări vide din tabelă.
Stergerea înregistrărilor de date
Stergerea unei înregistrări se poate realiza după selectarea acesteia prin una
din posibilităŃile următoare:
 prin apăsarea butonul Delete (Sterge) disponibil fie în Toolbar-ul din
Microsoft Access, fie în meniul afişat prin click-dreapta pe înregistrarea pe
care dorim să o ştergem.
 prin apăsarea tastei Delete de pe tastatura utilizatorului.
La apăsarea butonului Delete sau a tastei Delete, Microsoft Access deschide o
fereastră de dialog în care utilizatorul este întrebat dacă este sigur de acŃiunea pe care
urmează să o întreprindă deoarece nu există posibilitatea de refacere a informaŃiei.
La apăsarea butonului Yes, ştergerea este operată în tabelă fără posibilitatea
unei refaceri a informaŃiei şterse.
În cazul în care avem definite relaŃii între tabele ce implică şi tabela curentă,
trebuie Ńinut cont de aceasta în momentul în care se operează ştergerea unei
înregistrări. Anumite înregistrări din tabele legate de aceasta pot rămâne fără
corespondent în momentul unei ştergeri necontrolate.
Dacă de exemplu, există o tabelă de Furnizori şi o tabelă Produse în care se
stochează produsele furnizate de aceştia, Intre tabela Furnizori şi tabela Produse se
defineşte o relaŃie pentru a şti ce produse aparŃin unui anumit furnizor. In momentul
în care se şterge un furnizor din tabela Furnizori, trebuie neaparat şterse şi produsele
corespunzatoare acestui furnizor din tabela Produse, pentru a nu avea în această tabelă
înregistrări fără corespondent în tabela Furnizori.
Modificarea conŃinutului câmpurilor
Pentru modificarea conŃinutului unui câmp este necesară poziŃionarea:
 directă, pe câmpul respectiv prin intermediul mouse-ului,
 prin selectarea unei înregistrări şi apoi prin apăsarea succesivă a tastei Tab,
poziŃionarea pe câmpul dorit.
După poziŃionare se introduc datele în câmpul selectat.
Salvarea informaŃiilor în câmpul modificat se realizează la părăsirea câmpului.
Atunci când se încearcă părăsirea unui câmp pentru completarea altuia (prin
tasta Tab sau prin intermediul mouse-ului) după introducerea/modificarea
informaŃiilor existente în câmpul curent, Microsoft Access validează această
informaŃie pentru a fi sigur că valoarea introdusă este permisă în acest câmp. Dacă
valoarea introdusă nu este permisă, Microsoft Access va da un mesaj de alertă/eroare.
Pentru a părăsi câmpul, respectiv a salva informaŃia stocată în interiorul lui, trebuie
modificată informaŃia într-o formă ce poate fi acceptată sau trebuie să se revină la
valoarea de dinainte de modificare.
O valoare poate să nu fie permisă într-un câmp din una din următoarele cauze:
 valoarea nu este compatibilă cu tipul de date al câmpului: dacă se încearcă
introducerea unei valori ce nu corespunde tipului de date al câpului,
Microsoft Access încearcă să realizeze o conversie a informaŃiilor
introduse la tipul de date al câmpului. Oricum anumite informaŃii nu pot fi
convertite la alte tipuri de date (d.e. nu se poate stoca un nume într-un
câmp de tip Number).
 InformaŃia nu respecta proprietatea Regulă de Validare a câmpului
respectiv.
 Dacă proprietatea Required este setată la Yes şi s-a încercat lăsarea unui
câmp necompletat.
Tipurile de mesaje de alertă/eroare date de Microsoft Access sunt prezentate în
figura următoare:
ObservaŃie : dacă proprietatea Textul de Validare ar fi fost completată atunci
în locul mesajului standard dat de Microsoft Access ar fi apărut acest text.
De asemenea, Microsoft Access validează informaŃiile introduse şi la părăsirea
unei înregistrări pentru a se asigura că aceasta nu încalcă Regula de Validare pentru
înregistrare. În plus, dacă tabela are o cheie primară sau un index unic, la părăsirea
unei înregistrări Microsoft Access se asigură ca înregistrarea curentă nu are aceeaşi
valoare pentru câmpul/câmpurile implicate în cheia primară sau în index ca şi o altă
înregistrare existentă în tabelă. Dacă o înregistrare nu poate fi salvată din aceste
cauze, se introduce informaŃia permisă sau se revine la informaŃia anterioară
modificărilor aduse înregistrării.

Căutarea şi înlocuirea conŃinutului câmpurilor


Căutarea unui anume conŃinut al unui câmp se poate face prin intermediul
opŃiunii Find (Găseşte) ce este disponibilă :
 fie în Toolbar-ul din Microsoft Access
 fie în meniul Edit opŃiunea Find din meniul Microsoft Access.

Inlocuirea unui anume conŃinut cu altul se poate face din meniul Edit opŃiunea
Replace (Inlocuieşte) din meniul Microsoft Access.
Dacă se doreşte căutarea/înlocuirea unui anume şir de caractere în toată tabela,
atunci:
 trebuie executat click-stânga în colŃul din stânga sus al tabelei deschise sau
 selectată opŃiunea SelectAllRecords din meniul Edit al meniului Microsoft
Access şi de abia apoi selectată opŃiunea Find sau opŃiunea Replace.
In cazul în care se caută doar la nivelul unui anume câmp, atunci se
poziŃionează cursorul pe coloana din tabelă corespunzătoare acelui câmp sau se
selectează coloana executând click-stânga pe capul de tabel în dreptul numelui
câmpului dorit pentru căutare/înlocuire.
După ce s-a efectuat selecŃia domeniului de căutare, se apasă opŃiunea Find/
Replace şi Microsoft Access deschide una din ferestrele pentru căutare/înlocuire.
Căutarea/înlocuirea se vor efectua în interiorul câmpului NumePiesa pentru
toate înregistrările din tabelă.
Căutarea/înlocuirea propriu-zisă se realizează în cadrul acestor ferestre în felul
următor :
 Textul căutat se introduce în locaŃia Find What (ceea ce trebuie găsit).
 Textul pentru înlocuire (înlocuitor) se introduce în locaŃia Replace With (a
se înlocui cu ).
 Se selectează opŃiunea Search (Caută) în care se stabileşte direcŃia de
căutare : All (Tot), Down (Jos) sau Up (Sus), valoarea implicită pentru
Search este All.
 Se poate alege o căutare în care să se facă sau nu diferenŃă între literele
mici şi mari, i.e. Match Case selectat sau neselectat.
 Se poate face o căutare parŃială sau totală a conŃinutului unui câmp, i.e.
Match Whole Field neselectat sau selectat.
 Dacă se doreşte căutarea în toată tabela se poate deselecta Search Only
Current Field, opŃiune care nu apare dacă înainte de apăsarea opŃiunii
Find/Replace s-ar fi selectat toată tabela pentru căutare/înlocuire.
Butoanele din dreapta ferestrei de căutare/înlocuire au semnificaŃia următoare:
 Find Next (Caută Următorul) dacă nu se doreşte înlocuirea
respectivei instanŃe a textului căutat sau dacă se doreşte găsirea
următoarei instanŃe (în cazul căutării simple)
 Replace (Inlocuieşte) a se înlocui instanŃa găsită cu textul de
înlocuire
 Replace All (Inlocuieşte Toate) a se înlocui toate instanŃele fără a
se mai parcurge una câte una cum s-ar fi întâmplat dacă s-ar fi
apăsat succesiv butonul Replace
 Close (Inchide) se renunŃă la căutare/înlocuire.
Căutarea/înlocuirea continutului câmpurilor dintr-o tabelă este foarte utilă
atunci când se lucrează cu tabele de dimensiuni foarte mari, în care este stocată o
cantitate mare de informaŃie şi conŃinutul anumitor câmpuri necesită o prelucrare
identică sau similară.
Copierea, redenumirea şi ştergerea tabelelor
Copierea unei tabele
Această acŃiune se poate realiza în fereastra Database după apăsarea Tab-ului
Tables. Se selectează tabela ce se doreşte a fi copiată şi se execută click-dreapta. Din
meniul afişat de Microsoft Access se apasă Copiază (Copy).
După ce se apasă acest buton, în aceeaşi fereastră Database, Tab-ul Tables se
apasă click-dreapta şi apoi Paste.
La apăsarea acestui buton, Paste, se deschide fereastra în care sunt cerute
următoarele informaŃii:
Table Name: Numele tabelei în care se va face copierea, poate fi o tabelă nouă
sau una deja existentă
Paste Options: Modalitatea de copiere:
 Structure Only - Numai ca structură.
 Structure and Data - Structură şi informaŃii – reprezintă selecŃia implicită.
 Append Data to Existing Table -Adăugarea informaŃiilor din tabela copiată
la cea / cele deja existente.
După ce informaŃiile cerute în fereastră au fost completate se apasă butonul
Ok, sau pentru renunŃare butonul Cancel.
Redenumirea unei tabele
Pentru redenumirea unei tabele se procedează în felul urmator: se selectează o
tabelă din Tab-ul Tables şi se execută click-dreapta. Din meniu se apasă Rename
(Redenumeşte).
La apăsarea butonului Rename pentru tabela “biblioteca” s-a pus la dispoziŃie
posibilitatea de modificare a numelui.
Stergerea unei tabele
In fereastra Database, în Tab-ul Tables se selectează o tabelă şi se execută
click-dreapta. Din meniul afişat se apasă butonul Sterge (Delete).
La apăsarea acestui buton se va deschide fereastra următoare pentru a se
întreba dacă sigur aceasta este acŃiunea ce se dorea executată.
In această fereastră prin apăsarea butonului corespunzător, pot fi selectate
următoarele opŃiuni:
Yes se efectuează ştergerea,
No se renunŃă la aceasta acŃiune, iar prin Help se dă posibilitatea consultării
sistemului de Help.

Schimbul de date
 Importul
 Exportul
 Legarea

Importul
Importul este o operaŃie de aducere de informaŃii într-un format diferit - în
baza de date curentă. Butonul prin care se demarează această procedură este situat în
meniul File al Microsoft Access, opŃiunea Get External Data, butonul Importă
(Import).
Microsoft Access poate importa tabele de informaŃii din baze de date create în
alte versiuni (mai vechi) de Microsoft Access, ca şi informaŃii din alte programe sau
alte formate de fişier, cum ar fi Microsoft Excel, dBASE, Microsoft FoxPro sau
Paradox. Se pot de asemenea importa tabele şi liste HTML.
Importul de informaŃii creează o copie a acestora într-o tabelă nouă în baza de
date a utilizatorului; tabela sau fişierul sursă nu sunt afectate în timpul acestei operaŃii.
Atunci când se importă informaŃii, acestea nu pot fi adăugate la o bază de date
existentă, cu excepŃia cazului în care se importă foi tabelare sau fişiere text. Oricum
din momentul în care o tabelă s-a importat, se poate crea orice Append Query pentru a
adăuga informaŃiile din aceasta la o altă tabelă.
De asemenea, pot fi importate şi alte obiecte decât tabele, cum ar fi forme sau
rapoarte, dintr-o altă bază de date Microsoft Access.
Pentru automatizarea acestei operaŃii poate fi folosit codul de Visual Basic.
Pentru a importa tabele dintr-o altă bază de date Microsoft Access sunt
necesari următorii paşi :
1. Se deschide o bază de date şi se apasă butonul Import.
2. La apăsarea acestui buton se deschide o fereastră de dialog în care sunt
cerute următoarele informaŃii :
 Look in – directorul din care se ia baza de date căutată
 File name – numele fişierului
 Files of type - tipul fişierului, în acest caz trebuie să fie Microsoft Access
 Text or Property şi Last Modified
 Advanced, Find, New Search – butoane de căutare a fişierelor de tipul
selectat mai sus.
3. Obligatoriu este numele fişierului după care se apasă Import pentru
continuare sau Cancel pentru renunŃare.
4. La apăsarea butonul Import se deschide o fereastră de tip Database cu titlul
“Import Objects”, din care există posibilitatea selectării mai multor obiecte (tabele,
interogări, forme sau rapoarte) pentru o acŃiune de importare.
5. Se selectează obiectele dorite şi se apasă butonul Ok.
6. Dacă se doreşte importarea numai a definiŃiilor unei tabele fără informaŃiilr
stocate în aceasta atunci se merge pe butonul Options din dreapta ferestrei şi se
selectează opŃiunea dorită pentru importare din secŃiunea “Import Tables”.
SecŃiunea “Import Tables” – modalitatea de importare a tabelelor:
 Definiton and Data – definiŃie şi date
 Definition Only - numai definiŃie.
Tot aici există secŃiunea “Import”, obiectele ce se doresc importate în plus:
 Relationshsips – RelaŃii
 Menus and Toolbars – meniuri şi toolbar-uri
 Import/Export Specs – Import/Export specificaŃii
Se pot importa meniuri şi toolbar-uri dintr-o bază de date Access. Microsoft
Access nu le va importa dacă au acelaşi nume ca unul din baza de date în care se face
importul  o redenumire este necesară înainte de a se face importul.
SecŃiunea “Import Queries” prezintă modalitatea de import a interogărilor:
 As Queries – sub formă de interogări
 As Tables – sub formă de tabele
La apăsarea butonului Ok obiectele selectate pentru importare vor apărea în
baza de date curentă, cea din care s-a operat Import.
Exportul
OperaŃia Exportă (Export) a informaŃiilor dintr-o tabelă sau interogare se poate
face în diferite formate.
Această operaŃie se poate realiza din baza de date pe care o folosiŃi într-o altă
bază de date Microsoft Access. Această operaŃie are în mod efectiv semnificaŃia
copierii obiectelor din baza de date curentă în cealaltă.
De asemenea, pot fi exportate tabele, interogări, forme sau rapoarte în fişiere
HTM, se pot interschimba informaŃii între Microsoft Access şi Microsoft Word sau
Excel în câteva modalităŃi.
OperaŃia de export într-o altă bază de date Microsoft Access se realizează în
următorii paşi:
1.Se selectează tabela ce trebuie exportată şi apoi din meniul File se apasă
opŃiunea Save as/Export.
Se selectează opŃiunea To an External File or Database (Intr-un Fişier sau
Bază de Date Externă) şi apoi butonul Ok.
Dacă se doreşte renunŃarea se apasă butonul Cancel.
La apăsarea butonului Ok, se deschide o fereastră de dialog pentru selectarea
bazei de date în care se exportă: este selectată baza de date în care se efectuează
exportul şi se apasă Ok. In acest moment se deschide fereastra pentru stabilirea
condiŃiilor de export.
In această fereastră se cer următoarele :
 Export Numetabela to - Numele sub care se efectuează exportul
 Export Tables – Tipul de export
 Definition and Data – DefiniŃie şi informaŃii
 Definition Only – numai DefiniŃia
Prin apăsarea butonului Ok se execută operaŃia, iar prin Cancel se poate
renunŃa la aceasta.
ObservaŃie: această operaŃie, Export, se poate realiza pentru un singur element
la un moment dat: o tabelă, o interogare etc. Dacă se doreşte exportul mai multor
elemente, o operaŃie mai eficienta consta în intrarea în baza de date în care se doreşte
efectuarea exportului şi efectuarea în acel loc a operaŃiei de Import.

Legarea
OperaŃia de legare (link) se realizează prin apăsarea butonului Leagă tabele
(Link Tables) din acelaşi meniu cu butonul Import.
Se pot lega aceleaşi tipuri de fişiere care sunt posibile şi la operaŃia Import
Tabelele şi listele HTML se pot lega atât timp cât ele rezidă pe calculatorul local, pe
un server de reŃea sau pe un server Internet.
Legarea tabelelor de informaŃii dă posibilitatea citirii şi în majoritatea
cazurilor modificării datelor din sursele externe de informaŃii fără a mai fi nevoie de
operaŃia de importare. Formatul sursei externe nu este alterat ceea ce permite
continuarea utilizării fişierului modificat cu programul care l-a creat , dar se pot
adăuga, şterge sau edita informaŃiile din acest fişier folosind Microsoft Access.
Paşii pentru legarea unei tabele sunt similari celor de la punctul 3.3.1.
Microsoft Access foloseşte icon-uri diferite pentru tabelele legate şi pentru
tabelele existente în baza de date. Dacă o tabelă legată se şterge, atunci se şterge şi
legătura cu sursa sa, nu însă şi fişierul extern care a fost legat.
ObservaŃii:
1. Dacă se importă o tabelă ce a fost deja legată, Microsoft Access nu
realizează importul, în schimb leagă tabela cu sursa sa de informaŃie (i.e. copiază
informaŃia de legare)
2. Dacă baza de date ce se doreşte importată sau legată este protejată prin
intermediul unei parole, atunci această parolă trebuie furnizată pentru a se putea
continua Importul sau Legarea. Legarea de tabele din acest tip de bază de date poate
avea consecinŃe neprevăzute.
3. Dacă se leagă două tabele din aceeaşi bază de date Microsoft Access, orice
relaŃie ce fusese stabilită între acestea rămâne valabilă.

LECłIA 3. Operatori şi FuncŃii


În acestă lecŃie se prezintă utilizarea operatorii şi a funcŃiilor.
Expresiile reprezintă o parte fundamentală din operaŃiile efectuate în Microsoft
Access. Expresie este o combinaŃie de simboluri, identificatori, operatori şi valori ce
pot produce un rezultat.
Există câteva exemple de operaŃii în care se utilizează expresii:
 Setarea unei proprietăŃi ce defineşte un control calculat, stabileşte o regulă
de validare, sau setează valoarea implicită a unui câmp.
 Introducerea unei expresii a criteriului de selecŃie, crearea unui câmp
calculat, sau actualizarea unor înregistrări într-o interogare.
 Specificarea argumentelor unor acŃiuni.
 Specificarea argumentelor multor funcŃii şi metode în codul de Visual
Basic.
 Editarea unei interogări SQL în cadrul ferestrei de interogare.
Se vor prezenta succint :
Operatorii aritmetici, Operatorii de comparare, Operatorii logici,
Concatenări, FuncŃii
Operatorii aritmetici
OPERATORII ARITMETICI (+ - * / )
Operatorul +
Acest operator este folosit pentru efectuarea unei adunări.
Sintaxă :
Rezultat = expresie1+expresie2
ObservaŃie:
Atunci când se foloseşte acest operator, nu se ştie a priori ce operaŃie se
efectuează: de adunare sau de concatenare. Din acest punct de vedere sunt respectate
următoarele reguli :
 Dacă ambii operanzi sunt valori numerice atunci operaŃia efectuata este
adunarea
 Dacă ambii operanzi sunt şiruri de caractere atunci operaŃia efectuată este
concatenarea
 Dacă un operand este valoare numerică şi celalalt un şir de caractere atunci
apare o eroare de tipul Type Mismatch (Nepotrivire de tip).
Operatorul –
Acest operator este folosit pentru a efectua diferenŃa între două valori
numerice sau pentru a indica valoarea negativă a unei expresii numerice.
Sintaxă 1:
Rezultat = număr1 – număr2
Sintaxă 2:
– număr
ObservaŃie:
In sintaxa 1 operatorul este operatorul aritmetic de scădere folosit pentru a
calcula diferenŃa între două numere, iar în sintaxa 2 operatorul este folosit ca un
operator unar de negare pentru a indica valoarea negativă a unei expresii.
Operatorul *
Acest operator este folosit pentru înmulŃirea a două numere.
Sintaxă:
Rezultat=număr1*număr2
Operatorul /
Acest operator este definit pentru a efectua împărŃirea a două numere.
Sintaxă:
Rezultat = număr1/număr2
Tipul de date al rezultatului este de obicei Double.
ObservaŃii:
1. Pentru toŃi operatorii prezentaŃi, dacă unul din operanzi are valoarea Null
atunci şi rezultatul va avea tot valoarea Null.
2. Tipul de date al rezultatului este de obicei acela al expresiei cu tipul cu
precizia cea mai mare. Ordinea tipurilor din punct de vedere al preciziei este
următoarea: Byte, Integer, Long, Single, Double, Currency, şi Decimal.
Calculele cu data şi ora (+ -)
Variabilele de tip dată/oră sunt de tipul Date.
Pentru operatorul + : o valoare de tip Date adunată cu o valoare de orice tip
are ca rezultat întodeauna o valoare de tip Date.
Pentru operatorul –:
 Rezultatul diferenŃei dintre două valori de tip Date este întotdeauna de tip
Double.
 Rezultatul diferenŃei dintre o valoare de tip Date şi o valoare de orice alt
tip este întotdeauna de tip Date.

Operatorii de comparare: = < > <= >= <>


Aceşti operatori sunt folosiŃi pentru a compara expresii.
Sintaxă:
Rezultat = expresie1 opComparatie expresie2

Between ...AND..(Între ... Şi...)


Acest operator determină dacă valoarea unei expresii intră în intervalul dintre
cele două valori specificate.
Sintaxă:
expresie [Not] Between valoare1 And valoare2
Intre – Between
Si – And
Dacă valoarea expresiei este între valoare1 şi valoare2 atunci operatorul
întoarce adevărat, altfel întoarce fals. Se poate include şi operatorul logic Not pentru a
evalua opusul condiŃiei (în acest caz întoarce adevărat dacă expresia este în afara
intervalului celor două valori şi fals dacă este între cele două valori).
Este Null / Nu Este Null
FuncŃia Este Null (IsNull) întoarce o valoare booleană care indică dacă o
expresie nu conŃine date valide (Null).
Sintaxă:
IsNull(expresie)
Argumentul cerut este un Variant ce conŃine o expresie numerică sau o
expresie de tip şir de caractere.
ObservaŃii:
1. IsNull întoarce True dacă expresia este Null, altfel întoarce False. Dacă
expresia constă din mai mult de o singură variabilă, atunci apariŃia lui Null în orice
variabilă constituentă forŃează apariŃia rezultatului True.
2. Atunci Valoarea
Null indică Dacă expresia este: dacă
rezultatul este:
Variantul nu conŃine date
Adeărat Fals
valide. Null nu este
acelaşi lucru Fals Adevărat cu Empty,
care indică Null Null dacă o
variabilă nu a fost încă
iniŃializată. Nu este de asemenea acelaşi lucru cu un şir de lungime zero (“”), la care
se face referinŃă câteodată ca la un şir nul.
3. Se recomandă utilizarea acestei funcŃii pentru a determina dacă expresia
conŃine o valoare Null. Nu se pot realiza comparaŃii de tipul : If Var = Null sau If Var
<> Null deoarece acestea vor avea întotdeauna valoarea False în caz ca Var conŃine
valoarea Null. Aceasta se întâmplă pentru că o expresie conŃinând Null este ea însăşi
Null şi deci False
4. IsNull se foloseşte şi în crearea unei interogări
.
In tabelul de design al unei interogări în celula Criteria, pentru un anume
câmp, se poate introduce isNull sau is Not Null, pentru a selecta numai acele
înregistrări ce au valoarea câmpului Null , respectiv diferită de Null.

Operatorii logici
AND (Si logic)
Acest operator este folosit pentru a efectua o operaŃie de conjuncŃielogică a
două expresii.
Sintaxă:
Rezultat = Expresie1 And Expresie2
In tabelul următor este prezentat rezultatul acestui operator în funcŃie de
valorile expresiilor:
OR(Sau logic)
Acest operator este folosit pentru a efectua o operaŃie de disjuncŃie logică a
două expresii.
Sintaxă:
Rezultat = Expresie1 Or Expresie2
In tabelul următor este prezentat rezultatul acestui operator în funcŃie de
valorile expresiilor:
NOT(Nu logic)
Acest operator realizează negarea logică a unei expresii.
Sintaxă:
Rezultat = Not Expresie
In tabelul următor este prezentat rezultatul acestui operator în funcŃie de
valoarea expresiei:
Concatenările
Operatorii de concatenare sunt & şi +.
Operatorul & se foloseşte pentru forŃarea concatenării sub formă de şiruri de
caractere a două expresii.
Sintaxă:
Rezultat = expresie1 & expresie2
ObservaŃii:
a. Dacă o expresie nu este de tipul String (şir de caractere)atunci aceasta este
convertită la un variant String. Tipul de date al rezultatului este String doar
dacă ambii operanzi sunt de tipul String, altfel rezultatul este un variant
String.
b. Dacă ambele expresii sunt Null atunci şi rezultatul are aceeaşi valoare.
c. Totuşi dacă doar una dintre expresii are valoarea Null atunci aceasta este
tratată ca un şir de caractere de lungime 0 şi se efectuează o concatenare
între expresie şi şirul “”. Orice expresie care este goală este tratată ca un
şir de caractere de lungime 0.

FuncŃii
Date(), Now()
FuncŃia Date() – Dată întoarce un variant de tip Date ce conŃine data
sistemului.
FuncŃia Now() – Acum întoarce un variant de tip Date ce conŃine data şi
timpul exact în conformitate cu data şi ora sistemului calculatorului folosit de
utilizator.
Sum(), Avg()
FunŃia Sum() întoarce suma unei mulŃimi de valori conŃinute într-un câmp
specificat sau într-o interogare.
Sintaxă:
Sum(expr)
unde expr reprezintă un şir de caractere de identificare a câmpului ce conŃine
datele numerice ce vor fi adunate sau o expresie ce efectuează un calcul folosind
informaŃiile stocate în acel câmp. Operanzii în expresie pot include numele unui câmp
de tabelă, o constantă sau o funcŃie.
FuncŃia Avg() calculează media aritmetică a unui set de valori conŃinute într-
un câmp specificat într-o interogare.
Sintaxă:
Avg(expr)
unde expr reprezintă o expresie tip şir de caractere ce identifică acel câmp ce
conŃine valorile numerice ce trebuiesc mediate sau o expresie ce efectuează un calcul
folosind datele din acel câmp.
Operanzii din Expr pot include numele câmpului din tabelă, o constantă sau o
funcŃie (ce poate fi şi definită de utilizator).
ObservaŃii:
1. media calculată cu această funcŃie este o medie aritmetică (suma valorilor
împărŃite la numărul valorilor). S-ar putea folosi Avg de exemplu pentru a calcula
costul mediu.
2. Această funcŃie nu include câmpuri de valoare Null în calcul.
3. FuncŃia se poate folosi într-o interogare.
Min(), Max()
Aceste două funcŃii returnează valoarea minimă şi maximă a valorilor
conŃinute într-un câmp specificat sau într-o interogare.
Sintaxă:
Min(expresie)
Max(expresie)
Expresia reprezintă un şir de caractere de identificare a câmpului ce conŃine
datele ce vor fi evaluate sau o expresie ce efectuează un calcula, sau o funcŃie.
ObservaŃii:
1. Se pot folosi aceste două funcŃii pentru a determina cea mai mică şi cea mai
mare valoare dintr-un câmp calculat sau dintr-o grupare.
2. FuncŃiile se pot folosi de asemenea într-o expresie sau într-o interogare.

Formatarea datelor

. Sunt prezentate unele formatări predefinite, precum şi posibilitatea de creare


de formaŃari definite de utilizator.

Selectarea unor formate predefinite


Formate predefinite pentru tipul Number
Formatele predefinite în acest caz sunt enumerate în cele ce urmează:
General Number
Afişează numărul fără separatorul de mie
Currency
Afişează numărul cu separator de mie, dacă se poate şi două cifre după
separatorul zecimal.
Fixed
Afişează cel puŃin o cifră în stânga şi două cifre în dreapta separatorului
zecimal.
Standard
Afişează numărul cu separator de mie şi cel puŃin o cifă în stânga şi două cifre
în dreapta separatorului zecimal.
Percent
Afişează numărul multiplicat cu 100 cu un semn de procent (%) adăugat în
dreapta întotdeauna se afişează două cifre după separatorul zecimal.
Scientific
Foloseşte notaŃia ştiinŃifică standard
Yes/No
Afişează No dacă numărul este 0 şi Yes altfel.
True/False
Afişează False dacă numărul este 0 şi True altfel.
On/Off
Afişează Off dacă numărul este 0 şi On altfel.
Formate predefinite pentru tipul Date/Time
General Date
Afişează o dată sau un timp. Pentru numere reale, afişează o dată sau un timp.:
 Dacă nu există o parte fracŃionară, atunci se afişează numai o dată.
 Dacă nu există o parte întreagă atunci afişează numai un timp.
Long Date
Afişează o dată în conformitate cu formatul lung de dată al sistemului.
Medium Date
Afişează o dată folosind formatul mediu de dată al versiunii de limbaj al
aplicaŃiei gazdă.
Short Date
Afişează o dată folosind formatul scurt de dată al sistemului.
Long Time
Afişează un timp în conformitate cu formatul lung de timp al sistemului,
include orele, minutele şi secundele.
Medium Time
Afişează timpul în formatul 12 ore folosind orele şi minutele şi AM/PM.
Short Time
Afişează un timp folosind formatul 24 de ore.

Precizarea zecimalelor
Această proprietate se poate folosi pentru a specifica numărul de zecimale
afişate într-un câmp de tip Number sau Currency şi poate fi setată din Design View.
Astfel această proprietate este preluată de câmp atat în cazul unei interogări
cât şi în controalele create într-o formă bazată pe acest câmp, atâta timp cât aceste
controale au fost create după setarea acestei proprietăŃi.
Uneori există posibilitatea să se dorească setarea acestei proprietăŃi diferit
pentru o formă faŃă de
Proprietatea DecimalPlaces (Locurile pentru zecimale) furnizează o setare
implicită Auto, şi opŃiunea de a specifica de la 0 până la 15 zecimale. Atunci când este
setată pe Auto, câmpurile cu format Currency, Fixed, Standard, Percent şi Scientific
afişează două zecimale. Această proprietate nu are efect dacă proprietatea Format nu
este setată.
ObservaŃie:
Proprietatea Locuri pentru zecimale afectează numărul de zecimale ce sunt
afişate şi nu numărul de zecimale ce se stochează. Astfel, dacă se setează această
proprietate pentru un câmp de tip Number care are proprietatea FieldSize setată la
Integer, atunci se va afişa un număr cu două zecimale, dar datorită faptului că
numarul este întreg atunci locurile celor două zecimale vor fi completate cu zerouri.
Pentru a modifica numărul de zecimale care sunt stocate efectiv în câmp trebuie
modificată proprietatea FieldSize.

Crearea formatelor de către utilizator


LocaŃii pentru numere ( 0 # , . )
Pentru crearea formatelor definite de utilizator sunt prezentate în continuare
caracterele ce pot fi folosite în acest scop.
Nici unul
Afişează un număr fără formatare
(0)-Inlocuitor de cifră
Afişează o cifră sau un 0. Dacă expresia are o cifră în poziŃia în care apare (0)
în şirul de formatare o afişează, altfel afişează 0 în acea poziŃie.
(#)
Inlocuitor de cifră. Afişează o cifră sau nimic. Dacă expresia are o cifră în
poziŃia în care acest caracter apare atunci o afişează, altfel, nu afişează nimic. Acest
caracter funcŃionează la fel ca şi (0) cu excepŃia faptului că nu se afişează zerouri la
începutul şi sfârşitul numărului dacă există mai puŃine cifre în număr decât caractere
(#).
(.)
Reprezintă separatorul zecimal. In anumite formate locale este folosită virgula
pe post de separator zecimal.
(%)
Caracterul de procentaj Expresia este multiplicată cu 100. Acest caracter este
inserat în poziŃia în care apare în şirul de formatare.
(,)
Separatorul de mie. In anumite formate locale, se foloseşte punctul pe post de
separator de mie. Acest caracter separă miile de sute într-un număr care are 4 sau mai
multe locuri la stânga separatorului zecimal.
(:)
Acesta este separatorul de timp. In anumite formate locale se pot folosi alte
caratere pentru acest separator. Acest caracter separă orele, minutele şi secundele
atunci când se afişează valori de timp. Caracterul folosit efectiv depinde de setările
sistemului.
(/)
Separatorul de dată. In anumite formate locale, pot fi folosite alte caractere
pentru a reprezenta acest separator. Acest caracter separă ziua, luna şi anul atunci
când se afişează valori de tip dată. Caracterul folosit efectiv depinde de setările
sistemului.
(E- E+ e- e+)
Formatul ştiinŃific. Dacă expresia de formatare conŃine cel puŃin un caracter
pentru cifră (0 sau #) în stânga lui E-, E+, e- sau e+, numărul este afisat într-un format
ştiinŃific şi E sau e sunt inserate între număr şi exponentul său. Numărul de caractere
pentru cifre de la dreapta determină numărul de cifre din exponent. Se folosesc E- sau
e- pentru a plasa un semn – lângă valorile negative ale exponentului şi E+ sau e+ să
afişeze şi semnul+ lângă valorile pozitive ale exponentului.
-+$()
Afişează un caracter literal. Pentru a afişa un carater altul decât cele listate,
atunci trebuie precedat de backslash (\) sau trebuie închis între ghilimele (“.”).
(\)
Afişează următorul caracter în formatul şir de caractere. Pentru a afişa un
caracter literal ce are o semnificaŃie specială pe post de caracter literal atunci trebuie
precedat de un astfel de caracter. (\) nu este afişat. Are acelaşi efect ca şi cum am fi
închis caracterul literal între ghilimele. Pentru a se afişa un backslash se vor introduce
două astfel de semne în expresia de formatare (\\).
(“ABC”)
Afişează şirul de caractere din interiorul ghilimelelor.

Data şi ora
In continuare este prezentată lista caracterelor folosite pentru afişarea tipurilor
Date/Time:
(:)
Acesta este separatorul de timp. In anumite formate locale se pot folosi alte
caratere pentru acest separator. Acest caracter separă orele, minutele şi secundele
atunci când se afişează valori de timp. Caracterul folosit efectiv depinde de setările
sistemului.
(/)
Separatorul de dată. In anumite formate locale, pot fi folosite alte caractere
pentru a reprezenta acest separator. Acest caracter separă ziua, luna şi anul atunci
când se afişează valori de tip dată. Caracterul folosit efectiv depinde de setările
sistemului.
c - Afişează data ca ddddd şi timpul ca ttttt, în această ordine.
d - Afişează ziua ca un număr fără vreun zero la început (între 1 şi 31)
dd- Afişează ziua ca un număr cu un zero la început (între 01 şi 31)
ddd- Afişează ziua ca o abreviere (Sun – Sat)
dddd - Afişează ziua ca un nume întreg (Sunday – Saturday)
ddddd-Afişează data ca o dată completă (incluzând ziua, luna şi anul),
t t t t t-Afişează timpul ca un timp complet (incluzând ora, minutul şi secunda),
formatate folosind separatorul de timp al sistemului. Un zero la îneput este
afişat dacă valoarea afişată este mai mică decât 10:00 AM sau PM.
AM/PM; am/pm; A/P;a/p
Foloseşte ceasul cu 12 ore şi afişează AM/A sau PM/P în funcŃie de valoarea
orei.

Text descriptiv

Pentru formatarea şirurilor de caractere se pot folosi oricare din caracterele


următoare pentru a formata o expresie:
@
Tine locul unui caracter. Afişează un caracter sau un spaŃiu. Dacă şirul are un
caracter în poziŃia în care expresia de formatare are un astfel de caracter atunci
îl afişează, altfel afişează un spaŃiu.
&
Tine locul unui caracter. Afişează un caracter sua nimic.
<
ForŃează folosirea literelor mici. Afişează toate caracterele cu litere mici.
>
ForŃează folosirea literelor mari. Afişează toate caracterele cu litere mari.
!
ForŃează completarea înlouitorilor dela stânga la dreapta; de obicei se
completează de la dreapta la stânga.

LECłIA 4. Stabilirea relaŃiilor intre tabele


Se vor prezenta noŃiunile de:.
• Tipuri de relaŃii (relaŃia 1:1, relaŃia 1:n )
• Integritate referenŃială
• ProprietăŃile de legare

O bază de date relaŃională conŃine mai multe tabele ce pot fi legate prin relaŃii
de tip 1:1,1:m, m:m .
Microsoft Access permite crearea unor astfel de relaŃii logice sub forma unor
legări între tabele.
Legările se pot face la nivelul interogărilor pentru a extrage datele într-o
anumită formă şi corect din punct de vedere logic.
Astfel, pentru extragerea preŃurilor practicate de un anumit furnizor pentru
produsele lui sunt necesare urmatoarele informaŃii:
 numele furnizorului – din tabela Furnizori
 numele produselor – din tabela NomenclatorProduse
 preturile produselor – din tabela PreturiIntrare.
O altă variantă constă în relaŃionarea tabelelor: în acest caz se definesc legături
implicite caz în care adăugarea lor într-o interogare se face împreună cu relaŃiile dintre
ele. In acest caz, nu se pot extrage informaŃii printr-o interogare din mai multe tabele
decât dacă acestea sunt legate între ele. Legarea poate fi făcută prin legături implicite
sau aceasta se poate realiza doar la nivelul interogării.
Crearea unei legături implicite
Pentru crearea unei legături implicite sunt necesari a fi parcurşi următorii paşi:
1. Se poziŃionează utilizatorul pe fereastra Database. Se poate apăsa tasta F11
pentru a se poziŃionaza pe fereastra Database din orice altă fereastră.
2. Se apasă butonul Relationships (RelaŃii) din Toolbar pentru a deschide
fereastra Relationships.
3. La deschiderea acestei ferestre, dacă nu există relaŃii între tabele se va
deschide fereastra Show Table (v. punctul 4.1.). Această fereastră mai poate fi
deschisă şi în cazul în care există deja relaŃii între tabele dar s-a mai adăugat o tabelă
nouă şi se doreşte şi legarea acesteia. Se selectează tabelele/tabela ce se doresc
adăugate în fereastra Relationships, se pasă Add şi apoi Close.
4. După ce tabelele au fost adăugate în fereastra Relationships, se creează o
legătură în aceeaşi modalitate ca cea dintr-o interogare. Atunci când s-a creat legătura,
fereastra de definire a legăturii implicite se deschide.
In această fereastră se afişează :
 Numele câmpurilor implicate în relaŃie (partea de sus a ferestrei) – se pot
modifica dacă nu sunt corecte.
 Tipul relaŃiei Relationship Type, în acest caz One-To-Many.
şi se poate stabili :
 dacă se forŃează sau nu integritatea referenŃială – Enforce Refrential
Integrity şi
 modalitatea de extragere a datelor din aceste tabele – Join Type.
5. Se apasă Create pentru crearea relaŃiei sau Cancel pentru anularea acŃiunii.
ObservaŃii:
1. Butonul Join Type nu va fi activ dacă tabelele sunt legate. Dacă tabelele
sunt de tip Microsoft Access atunci se poate deschide baza de date în care sunt stocate
şi se poate defini acolo Join Type.
2. Definirea unui Join Type pentru o relaŃie în fereastra Relationships nu
afectează relaŃia în sine, ci va stabili modalitatea de extragere a datelor atunci când
aceste tabele sunt inclus într-o interogare. Se poate redefini Join Type întotdeauna
atunci când se creează o interogare.

Tipuri de relaŃii (relaŃia 1:1, relaŃia 1:n )


Intr-o relaŃie 1:1 (one-to-one – una-la-una), fiecare înregistrare din tabela A
are o singură înregistrare corespondentă în tabela B şi invers. Acest tip de relaŃie nu
este comun., deoarece majoritatea informaŃiei într-o astfel de relaŃie ar fi într-o
singură tabelă.
O relaŃie 1:1 s-ar putea folosi la împărŃirea unei tabele cu multe câmpuri în
două tabele cu mai puŃine câmpuri, pentru:
 A se izola o parte din informaŃii din motive de securitate
 A stoca informaŃii care se aplică numai unei submulŃimi din principala
tabelă.
O relaŃie 1:n (one-to many – una-la-mai-multe) este cel mai comun tip de
relaŃie. Intr-o astfel de relaŃie, o înregistrare din tabela A poate avea mai multe
înregistrări corelate în tabela B, dar o înregistrare din tabela B poate avea doar o
singură înregistrare corespondentă în tabela A.
Intr-o relaŃie n:n (many-to-many – mai-multe-la-mai-multe) o înregistrare din
tabela A poate avea mai multe înregistrări corelate în tabela B, iar o înregistrare din
tabela B poate avea mai multe înregsitrări corelate din tabela A. Acest tip de relaŃie
este posibilă prin definirea unei a treia tabele (tabelă de joncŃiune) a cărei cheie
primară constă în două câmpuri, chei din tabelele A şi B. O relaŃie n:n reprezintă de
fapt două relaŃii 1:n.

Integritate referenŃială
Integritatea referinŃială este un sistem de reguli folosit de Microsoft Acces
pentru a se asigura că relaŃiile între tabele sunt valide şi că nu se şterg sau modică
accidental datele în legătură.
Integritatea referenŃială se poate seta atunci când toate condiŃiile următoare
sunt îndeplinite :
 Câmpul în relaŃie din tabela principală este cheie primară sau are un index
unic
 Câmpurile în relaŃie au acelaşi tip de date (cu două excepŃii AutoNumber
 Number, Long Integer şi AutoNumber, replication ID Number,
replication ID).
 Ambele tabele aparŃin aceleiaşi baze de date Microsoft Access (dacă
tabelele sunt legate din altă bază de date de tip Microsoft Access atunci se
deschide acea bază de date pentru forŃarea integrităŃii referenŃiale).
Atunci când integritatea referenŃială este setată sunt valabile următoarele
reguli:
 Nu se poate introduce o valoare în câmpul în legătură fără ca această
valoare să nu existe în tabela principală din relaŃie.
 Nu se poate şterge o înregistrare dintr-o tabelă principală dacă înregistrările
corelate există în tabela secundară.
 Nu se poate schimba valoarea unei chei primare în tabela principală, dacă
acea înregistrare are înregistrări corelate în tabela secundară.
Dacă se încalcă regulile de mai sus, Microsoft Access afişează un mesaj şi nu
permite acea modificare.
Aceste reguli pot fi încălcate dacă se selectează în fereastra Relationships:
 Cascade Update Related Fields o schimbare a cheii primare se va face şi în
înregistrările corelate şi
 Cascade Delete Related Records dacă se şterge o înregistrare din tabela
principală se vor şterge şi cele corelate.

ProprietăŃile de legare
Din meniul afişat pentru o relaŃie, într-o interogare la apăsarea butonului Join
Properties (ProprietăŃi de legare) se deschide o fereastră din care se pot selecta
proprietăŃile unei relaŃii.
In fereastra Relationships, după crearea unei relaŃii, se deschide fereastra din
care, la apăsarea butonului Join Type se poate selecta felul in care vor fi extrase datele
din tabele.
Pentru o relaŃie folosită într-o interogare, sau pentru o relaŃie definită în
fereastra Relationships există următoarele opŃiuni de includere a înregistrărilor în
rezultatul interogării:
 numai acele înregistrări în care câmpurile din legătură coincid (ID şi
IDFurnizor).
 toate înregistrările din Furnizori şi numai acele înregistrări din
PreturiIntrare în care câmpurile din legătură coincid.
 toate înregistrările din PreturiIntrare şi numai acele înregistrări în care
câmpurile din legătură coincid.

Legarea tabelelor în cadrul interogării
Puterea interogărilor constă în capabilitatea de a aduce la un loc sau de a
executa o (anumită) acŃiune asupra informaŃiilor din mai mult decât o tabelă (v.
exemplul de mai sus). Atunci când se adaugă mai mult de o singură tabelă într-o
interogare, trebuie ca între listele de câmpuri să existe o legătură astfel încât
Microsoft Access „să ştie” cum să conecteze informaŃia.
Dacă tabelele dintr-o interogare nu sunt legate una de alta fie direct (în
interogare), fie indirect (prin legătură implicită), Microsoft Access nu ştie care
înregistrări sunt asociate cu care şi astfel afişează toate combinaŃiile de înregistrări
(produs cartezian) dintre câmpurile celor două tabele. De aceea, dacă fiecare tabelă
conŃine cel puŃin 20 înregistrări, rezultatul interogării va conŃine 400 de înregistrări
(20X20). De asemenea, durata de generare a interogării va putea fi mai mare şi va
putea produce rezultate nesemnificative.
Dacă s-au creat înainte relaŃii între tabele în fereastra Relationships, Microsoft
Access va afişa în mod automat liniile de legătură pe măsură ce tabelele sunt adăugate
în fereastra Design View a interogării.
Dacă integritatea referenŃială este setată, Microsoft Access afişează ‚1’ de
partea liniei de legătură “one” şi simbolul ∞ de partea liniei de legătură
corespunzătoare părŃii “many”.
Chiar dacă nu existau relaŃii între tabele, Microsoft Access creează în mod
automat o legătură în momentul adăugării a două tabele, dacă tabelele au fiecare un
câmp cu acelaşi tip de date sau un tip compatibil şi dacă unul din câmpuri este cheie
primară. In acest caz simbolurile pentru “one” şi “many” nu sunt afişate, pentru că
integritatea referenŃială nu este forŃată.
In cazul în care Microsoft Access a adăugat o legătură incorectă din punctul de
vedere al informaŃiei stocate atunci aceste legături se şterg şi se creează cele corecte.
Modalitatea de ştergere a unei relaŃii este următoarea:
 Se selectează relaŃia
 Se apasă click-dreapta şi din meniul apărut se apasă butonul Delete.
Aceste relaŃii sunt create de exemplu prin click pe câmpul ID din Furnizori şi
apoi “tras” acest câmp peste câmpul IDFurnizor din tabela PreturiIntrare.
Câteodată tabelele adăugate în interogare nu includ toate câmpurile care pot fi
de legătură între tabele. In această situaŃie trebuie adăugate une sau mai multe tabele
sau interogări în plus pentru a folosi numai pe post de legătură între tabelele necesare
interogării propriu-zise.
Din momentul în care tabelele şi interogările sunt legate şi s-au adăugat
câmpurile din ambele tabele/interogări în tabelul de design, legătura implicită forŃează
interogarea să verifice valorile care coincid în câmpurile de legătură. Atunci când se
găsesc interogarea combină cele două înregistrări şi le afişează în conformitate cu
tabelul de design într-o singură înregistrare. Dacă nu se gaseşte nici o conicidenŃă a
câmpurilor de legătură atunci interogarea nu va întoarce nici o înregistrare. Dacă se
doreşte ca toate înregistrările dintr-o tabelă să fie afişate indiferent dacă se găseşte
vreo legătură sau nu în cealaltă tabelă atunci aceasta se poate seta din fereastra de
proprietăŃi a legăturii.
LECłIA 5. Interogări
În această lecŃie se prezintă tehnici pentru a crea şi a concepe interogări. . Se
dezvoltă noŃiunile de :
1. Interogarea de selecŃie
2. Interogări parametrizate
3. Interogări de tip funcŃie (interogri de sumar, crosstab)
4. Interogări de acŃiune

O interogare de selecŃie poate fi creată într-una din următoarele


modalităŃi:
 PoziŃionare în fereastra Interogări (Queries) şi apăsare buton New.
 În meniul Microsoft Access, meniul Insert opŃiunea Query
 Din Toolbar-ul din Microsoft Access
După ce s-a executat una din aceste modalităŃi, se va deschide fereastra în care
se va alege varianta de creare a unei interogări. In continuare se va considera
modalitatea Design View: se alege Design View şi se apasă butonul Ok, iar în cazul în
care se doreşte renunŃarea la această acŃiune se apasă butonul Cancel
Rezultatele unei interogări se obtin prin apăsarea unuia din butoanele View sau
Run(!) din Toolbar-ul din Microsoft Access

Interogare de selecŃie - Tehnici de baza


Pentru o interogare de selecŃie se tratează tehnicile: Selectarea şi ascunderea
câmpurilor, Sortare, Filtrare, Realizarea cămpurilor calculte.

Selectarea de câmpuri
Intr-o interogare se adaugă numai acele câmpuri a căror informaŃie trebuie
vizualizată, supusă unor criterii, grupată, actualizată sau sortată. Paşii pentru
adăugarea de câmpuri într-o interogare sunt următorii :
 se deschide o interogare în Design View
 tabela sau interogarea in care trebuie să se adauge câmpurile dorite ar
trebui să apară în partea de sus a ferestrei Design View: dacă nu – atunci
este necesară adăugarea acestor obiecte.
Adăugarea de obiecte
Dacă a fost creată o nouă interogare, care nu are nici o tabelă introdusă, atunci
va apare fereastra Show Table (Arată Tabela) prin intermediul căreia sunt puse la
dispoziŃia utilizatorului obiectele pentru crearea unei interogări: Tabele şi/sau
Interogări.
Dacă interogarea este creată deja şi se doreşte adăugarea de tabele, atunci se
apasă butonul Show Table. La apăsarea acestui buton se deschide fereastra Show
Table.
Din fereastra Show Table se pot selecta tabele şi/sau interogări prin selectarea
unuia sau mai multor obiecte şi apoi se apasă butonului Add (Adaugă), şi apoi Close.
Dacă se doreşte renunŃarea la această acŃiune atunci se apasă oricând butonul Cancel.
ObservaŃii:
1. Se poate adăuga o tabelă într-o interogare şi prin “tragerea” acestora din
fereastra Show Table în partea de sus a ferestrei Design View.
2. Dacă există mai multe obiecte în fereastra Design View atunci este necesară
o operaŃie de join.
Se selectează unul sau mai multe câmpuri din tabela existentă sau adăugată şi
se adaugă în tabelul din partea de jos a ferestrei.
Pentru a selecta un singur câmp se execută click pe numele câmpului
respectiv. Pentru a selecta un bloc de câmpuri se execută click pe primul câmp din
bloc, se Ńine apăsată tasta Shift şi apoi se execută click pe ultimul câmp din blocul
dorit.
Pentru selecŃia mai multor câmpuri dar nesituate într-un bloc atunci se execută
click pe fiecare dintre ele Ńinându-se apăsată tot timpul tasta Ctrl.
Pentru selecŃia tuturor câmpurilor se execută dublu-click pe bara de titlu a
tabelei sau se execută un singur click pe asterix (*).
ObservaŃii:
1. După ce au fost selectate câmpurile dorite în interogare ele trebuiesc “trase”
în tabelul din partea de jos a ferestrei.
2. Dacă se adaugă mai multe câmpuri în tabel, Microsoft Access poziŃionează
fiecare câmp într-o coloană. Dacă se adaugă asterix în tabel atunci Microsoft Access
pune numele tabelei şi îi adaugă un punct şi un asterix (d.e. Catalog.*).
3. In locul selecŃiei şi adăugării se poate selecta direct în tabelul din partea de
jos a ferestrei câmpul dorit în interogare din lista pusă la dispoziŃie de Microsoft
Access pe linia Field.
4. Folosirea asterixului într-o interogare are faŃă de selecŃia manuală a tuturor
câmpurilor avantajul că interogarea include automat toate câmpurile din tabela
respectivă chiar şi cele adăugate după crearea interogării şi le exclude pe cele şterse
după crearea interogării. Dacă se foloseşte asterixul – nu se pot folosi câmpuri din
această tabelă la sortare sau pentru criterii specifice decât dacă aceste câmpuri sunt
specificate explicit în tabel. Dacă se doreşte tastarea asterixului fără a-l mai selecta
din tabela din partea de sus a ferestrei atunci trebuie specificat şi numele tabelei în
faŃa acestuia (d.e. Catalog.*).

Ascunderea câmpurilor
In interogare se pot folosi câmpuri doar pentru calcule sau pentru sortări fără
ca fie necesară afişarea acestora în rezultatul interogării. Câmpurile sunt folosite
pentru rezultatul interogării, dar ele sunt ascunse.
In tabelul din partea de jos a ferestrei Interogare există o linie numită Show
(Arată) al cărui check box poate fi selectat – pentru afişarea câmpului respectiv în
rezultatul interogării sau poate fi neselectat pentru a nu se afişa câmpul (i.e.
ascunderea câmpului).
ObservaŃie:
Atunci când se închide o interogare, Microsoft Access mută toate câmpurile
ascunse în partea cea mai din dreapta a tabelului de design.
Sortarea interogărilor
Inainte de a se efectua o sortare există câteva considerente ce trebuiesc luate în
considerare:
 sortările sunt salvate odată cu tabela, interogarea sau forma. Dacă se
creează o formă sau raport pe baza unei tabele sau a unei interogări ce are
o cerere de sortare salvată atunci forma.raportul moşteneşte această cerere
de sortare.
 Microsoft Access va sorta până la 255 de caractere, într-unul sau mai
multe câmpuri, în rezultatele unei interogări.
 Rezultatul sortării depinde de setarea de limbaj specificată în fereastra de
dialog Options la momentul creării bazei de date. Pentru a verifica sau
modifica această setare se deschide această fereastră din meniul Tools,
butonul Options şi se accesează prin apăsarea Tab-ului General opŃiunea
New Database Sort Order.
 Dacă tabelul de design al interogării conŃine elementul asterix (‘*’) atunci
nu se poate specifica o sortare decât dacă se adaugă explicit acele câmpuri
pentru care se doreşte realizarea sortării.
 Pentru sortarea datelor şi timpului, se utilizează ordinea crescătoare
(Ascending) şi cea descrescătoare (Descending), i.e. „de la mai târziu” la
„mai devreme”.
 Numerele stocate în câmpuri nenumerice sunt sortate ca şirurile de
caractere, nu ca valori numerice. Totuşi pentru a le sorta în ordine
numerică toate şirurile de tip text trebuie să fie de aceeaşi lungime, având
numerele mai mici completate cu zerouri în faŃă: pentru ordonarea
crescătoare a şirului “1”,”2”,”11”, “22” se va obŃine următorul rezultat :
“1”,”11”,”2”,”22”. Pentru a putea avea rezultatul conform unei sortări
numerice şirul acesta trebuie transformat în următorul:
“01”,”02”,”11”,”22”. Cea mai simplă cale pentru obŃinerea unei sortări
corecte din punct de vedere numeric în cazul câmpurilor care stochează
DOAR valori numerice va fi definirea tipului acelui câmp într-un tip de
date numeric (Number sau Currency).
 Atunci când se sortează un câmp în ordine crescătoare, toate înregistrările
în care acel câmp este vid (conŃine valoarea Null) sunt poziŃionate la
începutul listei. Dacă există şi înregistrări ce au câmpul cu şiruri de
lungime zero atunci acestea sunt poziŃionate imediat după cele cu valoarea
Null.
 Nu se pot sorta câmpurile de tip Memo sau Hyperlink.
Paşii pentru realizarea unei sortări sunt următorii :
1. Se deschide o interogare în Design View pentru o tabelă.
2. Pentru o sortare după mai multe câmpuri, în primul rând se aranjează
câmpurile în tabelul de design în ordinea în care se doreşte executarea sortării.
Microsoft Access sortează din partea stânga în primul rând şi apoi înaintează
spre dreapta cu fiecare câmp.
3. In celula Sort a fiecărui câmp de sortare din tabelul de design se alege o
opŃiune din cele prezente : Ascending, Descending sau [not sorted] – aceasta
fiind opŃiunea implicită.
4. Pentru vizualizarea rezultatelor se apasă butonul View sau Run (!)din
Toolbar.

Criteriul de selecŃie

Criteriile de selecŃie (Criteria) sunt restricŃii plasate într-o interogare pentru a


identifica acele înregistrări specifice cu care se doreşte a se lucra. Astfel, în locul
vizualizării tuturor furnizorilor din tabela Furnizori se poate dori doar vizualizarea
acelora din Bucureşti. Pentru a realiza aceasta se specifică un criteriu de selecŃie care
limitează rezultatele numai la înregistrările care au valoarea câmpului Oraş egală cu
“Bucureşti”.
Pentru a specifica un criteriu de selecŃie pentru un anumit câmp în tabelul de
design se introduce o expresie în celula Criteria (Criteriu) a acelui câmp. Expresia în
exemplul de mai sus ar fi “Bucuresti”. Se pot utiliza şi expresii mai complicate cum ar
fi “Between 100 and 200” (Intre 100 şi 200), etc.
Se pot specifica mai multe criterii de selecŃie fie pentru un singur câmp fie
pentru mai multe, Microsoft Access combinându-le folosind fie operatorul And (Si)
fie operatorul Or (Sau).
 Dacă expresiile pentru criteriile de selecŃie sunt pe aceeaşi linie în tabelul
de design atunci Microsoft Access foloseşte operatorul And, adică vor fi
returnate numai înregistrările ce îndeplinesc toate criteriile.
 Dacă expresiile sunt în linii diferite ale tabelului de deisgn atunci
Microsoft Access foloseşte operatorul Or, adică vor fi returnate acele
înregistrări ce îndeplinesc cel puŃin unul dintre criteriile de selecŃie.
Se pot adăuga criterii de selecŃie şi pentru afectarea rezultatelor unor calcule.
Prin adăugarea unui astfel de criteriu se pot limita:
 grupurile pe care se efectuează calculele,
 înregistrările ce participă la calcule sau
 chiar afişarea rezultatelor după efectuarea calculelor.
Paşii pentru introducerea unui criteriu de selecŃie sunt următorii:
1. se deschide o interogare pentru o tabelă în Design View
2. se execută click pe prima celulă Criteria a câmpului pe care se doreşte
aplicarea acelui criteriu (d.e. NumePiesa)
3. se introduce o expresie prin tastare sau utilizând fereastra Expression
Builder (Constructor de expresii). Expression Builder se deschide prin
executarea unui click-dreapta pe celula Criteria şi apoi prin apăsarea opŃiunii
Build (Construieşte).
4. după introducerea unui criteriu se apasă unul din butoanele View sau Run
pentru vizualizarea rezultatelor.

Valoarea maximă sau minimă


O interogare poate afişa numai valoarea maximă a unui câmp dintr-un grup de
înregistrări. Grupul poate fi reprezentat din întreaga tabelă sau numai dintr-un grup
selectat printr-un criteriu de selecŃie.
Valoarea maximă se poate calcula folosind opŃiunea Max (Maxim) din celula
Totals (Totaluri) a câmpului pe care se doreşte găsirea valorii maxime. In mod similar
se poate găsi valoarea minimă prin intermediul opŃiunii Min (Minim) din aceeaşi
celula Totals.
Dacă celula Totals nu este disponibilă în tabelul de design atunci ea poate fi
accesată prin intermediul butonului Totals din Toolbar-ul din Microsoft Access.
ObservaŃii :
1. rezultatul interogării este format dintr-o singură linie, iar capul de tabel
pentru coloana Pret este numit MaxOfPret (Maximul câmpului Pret).
2. criteriul de selecŃie Ascending selectat pentru acelaşi câmp nu mai are nici o
valoare, permite doar calculul maximului pe câmpul respectiv.
3. Deşi în tabelă există valori mai mari pentru câmpul Pret decât cea din
rezultat acesta este rezultatul corect al interogării datorită criteriului de selecŃie impus
pentru câmpul NumePiesa. Se iau valoarea maximă a câmpului Pret din înregistrările
ce îndeplinesc criteriul NumePiesa=”P3”, respectiv 3; nu contează ordinea în care cele
două câmpuri apar în tabelul de design, rezultatul interogării este acelaşi.
Câmpurile calculate
Un câmp calculat (calculated field) este un câmp definit într-o interogare care
afişează rezultatul unei expresii mai degrabă decât informaŃii stocate. Valoarea este
recalculată de fiecare dată când o valoare din expresie se schimbă.
Un câmp calculat se foloseşte atunci când se efectuează un calcul definit de
utilizator, ce nu foloseste funcŃiile de calcul predefinite din celula Totals, calcul care
se efectuează pe fiecare înregistrare folosind unul sau mai multe câmpuri. Un astfel de
câmp trebuie creat direct în tabelul de design pentru a se executa acest tip de operaŃii
de calcul.
Aceste câmpuri se pot folosi nu numai la afişarea unor rezultate, ci şi la
definirea unor criterii de selecŃie sau pentru a determina asupra căror înregistrări să se
execute o acŃiune.
Se poate crea un câmp nou pentru afişarea rezultatelor dintr-un calcul definit
printr-o expresie; în acest scop sunt necesari următorii paşi :
1. Se deschide o interogare pentru o tabelă în Design View.
2. La acest pas se poate realiza una din acŃiunile următoare:
 se introduce o expresie în interiorul unei celule goale în linia Field. Dacă
expresia include un nume de câmp din tabelă atunci acesta trebuie pus
între paranteze pătrate (d.e. [Pret]).
 dacă se doreşte ajutor în crearea unei expresii se poate deschide
Expression Builder. După ce se apasă Enter sau se efectuează o mutare pe
altă celulă, Microsoft Access introduce un nume implicit pentru acest
câmp, respectiv ExprN, unde N este un întreg incrementat pentru fiecare
câmp calculat nou din interogare. Acest nume va fi afişat înaintea expresiei
introduse urmată de semnul “:” şi de expresie (d.e. Expr1: [Pret]+2). La
afişarea rezultatelor interogării acest nume este numele coloanei pe care
sunt afişate valorile câmpului calculat. Se poate selecta acest nume, ExprN
şi se poate introduce unul mai sugestiv (d.e. PretNou).
3. Dacă expresia conŃine una sau mai multe funcŃii agregate (Sum, Avg, Count,
Min, Max, StDev, sau Var), şi dacă în tabelul de design există şi un alt câmp
după care se doreşte gruparea atunci în linia Totals a acelui câmp, iar în
câmpul calculat se schimbă Group by cu Expression.
4. Pentru a completa interogarea, se pot adăuga criterii de selecŃie sau sortări,
sau se pot seta proprietăŃile câmpului (d.e. Format) din moment ce nu este un
câmp luat dintr-o tabelă ale cărui proprietăŃi le-ar fi preluat.
ProprietăŃile unui câmp calculat se accesează prin click-dreapta pe linia Field
şi apoi Properties.

Interogări parametrizate
O interogare parametrizată este o interogare în care una sau mai multe valori
ale criteriilor de selecŃie sunt specificate în mod interactiv.
O interogare parametrizată nu este în mod strict, un alt tip de interogare, ci
mai degrabă extinde flexibilitatea interogărilor de selecŃie.
O interogare parametrizată este o interogare care atunci când este rulată
afişează propria ei fereastră de dialog pentru a cere o informaŃie, cum ar fi un criteriu
de selecŃie pentru extragerea înregistrărilor sau o valoare ce trebuie să fie inserată într-
un câmp.
Se pot crea interogări care sa ceară mai mult de o singură informaŃie, de
exemplu, se pot realiza o interogare care să ceară două date. Microsoft Access poate
atunci să extragă toate acele înregistrări care au un anume câmp între cele două date.
Interogările paramterizate sunt foarte uşor folosite ca bază pentru forme sau
rapoarte. Astfel, dacă se doreşte un raport pentru o activitate lunară, se poate baza
acest raport pe o interogare parametrizată care să ceară luna pentru care se doreşte
acel raport.
Se poate crea şi o fereastră de dialog proprie utilizatorului pentru folosirea în
locul celei afişate de Microsoft Access.
Pentru crearea unei parametrizări simple se fac următorii paşi:
1. Se creează o interogare de selecŃie
2. In fereastra Design View se selectează şi se adaugă în tabelul de design
câmpurile dorite
3. In câmpul Criteria al fiecărui câmp dorit ca paramteru se tastează un mesaj
între paranteze pătrate. Microsoft Access va afişa acest mesaj de fiecare dată când
această interogare este rulată. Textul mesajului trebuie să fie diferit de numele
câmpului, totuşi poate să îl conŃină. Pentru un câmp de tip Date/Time se poate tasta
următorul mesaj [IntroduceŃi data de început], sau în celula Criteria se poate
introduce de exemplu : Between [IntroduceŃi data de început] and [IntroduceŃi data de
sfârşit].
4. Pentru a vizualiza rezultatele acestei interogări se apasă butonul View sau
Run. Pentru întoarcerea în Design View se apasă din nou butonul View.

Interogări de tip funcŃie

Se vor prezenta aşa cum s-a precizat mai sus


 Interogări de tip funcŃie
 Interogări grupate
 Interogări de sumar
Utilizând linia Totals din Design View, se poate calcula suma, media,
numărarea, minimul, maximul, varianŃa sau deviaŃia standard pentru unul sau mai
multe câmpuri dintr-o tabelă, fie pentru toate înregistrările, fie pe unul sau mai multe
grupuri de înregistrări. Prin intermediul liniei Criteria pot fi afectate rezultatele
calculării.

ObservaŃie: Se poate folosi Simple Query Wizard pentru a calcula suma,


media, numărarea, minimul sau maximul valorilor dintr-un câmp, dar dacă se doreşte
adăugarea unui criteriu de selecŃie atunci trebuie folosit tabelul de design al unei
interogări.

Crearea unei interogări de tip funcŃie


Pentru realizarea unei astfel de interogări sunt necesari a fi parcurşi următorii
paşi:
1. se creează o interogare de selecŃie (Select Query). Se adaugă tabelele care se
vor folosi în calcule şi apoi sa adaugă câmpurile asupra cărora se vor efectua calculele
şi se specifică criteriile de selecŃie.
2. Se apasă Totals în Toolbar. Microsoft Access va afişa linia Totals în tabelul
de design.
3. Pentru fiecare câmp din tabelul de design se execută click în celula Totals şi
se alege una dintre funcŃiile următoare : Sum, Avg, Min, Max sau Count.
4. dacă se doreşte, se pot introduce criterii de selecŃie cu efect asupra
rezultatelor sau se poate efectua o sortare.
5. Se apasă View sau Run pentru vizualizarea rezultatelor.
ObservaŃii:
1. Atunci când se foloseşte o funcŃie pentru un câmp Microsoft Access
combină numele acestei funcŃii cu numele câmpului pentru a obŃine numele coloanei
din tabela rezultat al interogării.
2. dacă se adaugă un câmp calculat care conŃine una sau mai multe funcŃii în
care se calculează asupra tuturor înregistrărilor atunci trebuie setată linia Totals la
opŃiunea Expressions.

Interogări grupate
Pentru realizarea unor interogări grupate paşii sunt aceiaşi cu cei de mai sus
ExcepŃie: nu se selectează pentru toate câmpurile o funcŃie în celula Totals, ci
rămân anumite câmpuri cu opŃiunea Group by, i.e. acele câmpuri după care se
realizează gruparea.
De exemplu, se realizează o interogare grupată după câmpul Produs, calculul
efectuându-se pe câmpul Pret, respectiv calculul valorii maxime prin intermediul
selecŃiei funcŃiei Max din celula Totals.

Evaluări statistice
Evaluările statistice se pot realiza prin intermediul următoarelor două funcŃii:
StDev sau Var. Aceste funcŃii sunt disponibile în celula Totals. Astfel, StDev are
semnificaŃia de Standard Deviation (deviaŃia standard), iar Var are semnificaŃia de
Variance (varianŃă).

Interogări de acŃiune

Access ne oferă posibilitatea de a şterge şi de a modifica înregistrări de date,


de a crea tabele noi precum şi de a adăuga înregistrări în tabele existente prin
utilizarea interogărilor cu acŃiuni.
O interogare cu acŃiune este o interogare care realizează modificări asupra mai
multor înregistrări din una sau mai multe tabele într-o singură operaŃie.
Există patru tipuri de astfel de interogări şi anume:
• Interogări cu actualizare
• Interogări cu adăugare
• Interogări cu ştergere
• Interogări cu creare de tabele

Interogări cu actualizare

O interogare cu actualizare (Update Query) realizează modificări asupra unui


grup de înregistrări într-una sau mai multe tabele.
Astfel, prin intermediul unei astfel de interogări se pot mări toate preŃurile
dintr-o tabelă cu 10 %, sau se pot mări comisioanele furnizorilor dintr-un anume oraş
cu 5 %.
Prin intermediul unei interogări cu actualizare se pot modifica informaŃiile
dintr-o tabelă existentă.
Interogările cu actualizare se pot selecta din Toolbar, butonul Query Type.
OpŃiunile din Toolbar sunt aceleaşi cu cele de la interogările de selecŃie,
prezentate la punctul anterior, i.e.: View, Save, Query Type, Run, Show Table,
Properties, Build şi Database window, cu excepŃia butonului Totals, care pentru
interogările cu actualizare nu mai este disponibil.
Paşii pentru realizarea unei interogări cu actualizare sunt următorii :
1. După ce se creează o interogare, se adaugă tabelele şi se selectează
câmpurile ce se doresc actualizate, se stabilesc criteriile de selecŃie pentru acestea;
dacă există atunci se apasă butonul Update Query din meniul Query Type din
Toolbar.
2. In celula Update To (Actualizează cu) se introduce expresia ce va calcula
noua valoare pentru câmpurile afectate de interogare.
3. Pentru a vizualiza înregistrările ce vor fi afectate de actualizare se apasă
butonul View, iar pentru a crea noua tabelă se apasă butonul Run.
ObservaŃie : Pentru a opri o interogare după ce a fost demarată se apasă
Ctrl+break.
Considerăm exemplul următor : tabela Produse şi tabelul de design al
interogării cu actualizare, prin care se intenŃionează mărirea preŃurilor cu 10 %.
Prin apăsarea butonului View se vor vizualiza înregistrările ce vor fi afectate
de această interogare, iar prin Run se vor efectua modificările.

Interogări cu adăugare

Prin intermediul interogărilor cu adăugare (Append Query) se realizează


adăugarea unui grup de înregistrări din una sau mai multe tabele la sfârşitul uneia sau
mai multor tabele. Astfel, în ipoteza că se achiziŃionează mai mulŃi furnizori noi şi o
bază de date ce conŃine o tabelă cu informaŃiile despre aceştia. Pentru a evita
introducerea manuală a unei mari cantităŃi de informaŃie, ar fi de preferat ca aceste
înregistrări corespunzătoare furnizorilor noi sa fie adăugate la tabela Furnizori.
Interogările cu adăugare mai pot realiza şi următoarele acŃiuni :
 Adăugarea de câmpuri bazându-se pe un criteriu.
 Adăugarea de înregistrări atunci când anumite câmpuri dintr-o tabelă nu
există în altă tabelă. O interogare cu adăugare va adăuga informaŃiile din
câmpurile care coincid ingnorându-le pe celelalte.
Paşii necesari pentru realizarea unei interogări cu adăugare sunt următorii :
1. Se creează o interogare ce conŃine tabela ale cărei înregistrări trebuie
adăugate alteia.
2. In Design View se apasă în Toolbar butonul Query Type şi apoi Append
Query, fereastra Append deschizându-se.
 3. In această fereastră sunt cerute următoarele informaŃii :
 Table Name – Numele tabelei la care se adaugă înregistrările
 Current Database - se selectează dacă tabela este în baza de date curentă
 Another Database – se selectează dacă tabela este în altă bază de date
File Name este numele bazei de date externe (dacă e cazul), se
introduce şi calea către acest fişier de tip Microsoft Access. Se pot
folosi şi căi către Microsoft FoxPro, Paradox sau bază de date dBASE.
4. Dacă se doreşte continuarea acŃiunii, se apasă butonul Ok, pentru renunŃare
se apasă Cancel.
5. Se adaugă în tabelul de design câmpurile ce se doresc adăugate sau orice
alte câmpuri ce sunt necesare pentru setarea criteriilor de selecŃie. Se poate adăuga
Cheia Primară dacă este de tipul AutoNumber. Dacă toate câmpurile din ambele
tabele au acelaşi nume, atunci în tabelul de design se adaugă doar elementul asterix
(*)
6. Dacă se selectează câmpuri cu acelaşi nume în ambele tabele Microsoft
Access completează în mod automat numele identic în linia Append To. Dacă se
selectează câmpuri ce au nume diferite în cele două tabele, în linia Append To trebuie
adăugate numele câmpurilor din tabela în care se adaugă.
7. In celula Criteria pentru câmpurile din tabelul de design se introduc
criteriile de selecŃie pentru care se va realiza adăugarea.
8. Pentru vizualizarea înregistrărilor ce vor fi adăugate, se apasă View în
Toolbar.
9. Pentru executarea adăugării se apasă butonul Run. La apăsarea acestui
buton Microsoft Access deschide o fereastră în care este verificat dacă aceasta este
acŃiunea pe care doriŃi să o întreprindeŃi, deoarece nu există posibilitatea refacerii
informaŃiei originale după rularea interogării.
ObservaŃie :
In funcŃie de modalitatea de creare a unei interogări cu adăugare, Microsoft
Access poate în mod automat adăuga noi valori pentru un câmp de tip AutoNumber
sau sa extragă valori din tabela originală.
Pentru ca Microsoft Access să adauge valori ale câmpului AutoNumber, atunci
nu se adaugă acest câmp în tabelul de design atunci când se creează interogarea. Prin
această metodă Microsoft Access adaugă înregistrări şi inserează în mod automat
valori noi pentru AutoNumber. Prima înregistrare inserată are o valoare ce este mai
mare decât cea mai mare valoare ce a fost vreodată introdusă în câmpul de tip
AutoNumber (chiar dacă acel câmp ce a conŃinut această cea mai mare valoare a fost
şters).
Pentru a păstra valorile din tabela originală ale acestui câmp de tip
AutoNumber atunci se adaugă şi acesta în tabelul de design al interogării. Dacă acest
câmp AutoNumber în tabela în care se efectuează adăugarea este Cheie Primară şi
între tabela originală şi cea în care se adaugă există posibilitatea existenŃei unor
duplicate atunci este mai sigur să se folosească prima variantă.
De exemplu, se realizează o interogare de acŃiune unde s-a folosit o tabela
intermediara numită Produse_Append ce contine Produs3, Produs4 si Produs5 cu
preturile lor.
S-a creat o interogare cu adaugare pentru a adauga inregistrarile din aceasta
tabela în tabela Produse.

Interogări cu ştergere
O interogare cu ştergere (Delete Query) realizează ştergerea unui grup de
înregistrări dintr-una sau mai multe tabele, d.e., s-ar putea folosi o astfel de interogare
pentru a elimina cărŃile dintr-o tabelă bibliotecă al căror an de apariŃie este mai mic
decât un anume an.
ObservaŃie:
Nu se pot şterge doar câmpuri izolate, în mod obligatoriu se şterg înregistrări
întregi.
Se foloseşte o singură interogare cu ştergere pentru a realiza ştergerea unor
înregistrări dintr-o singură tabelă, din mai multe tabele într-o relaŃie una-la-una, sau
din mai multe tabele într-o relaŃie una-la-mai-multe, dacă ştergerile în cascadă sunt
active (de exemplu se şterg toŃi furnizorii din Bucureşti şi produsele lor).
InformaŃii asupra consecinŃelor utilizării unei interogări cu ştergere :
 După rularea unei interogări cu ştergere pentru ştergerea unor înregistrări
nu se mai poate reface informaŃia. Stergerea este definitivă şi informaŃia
este pierdută. De aceea înainte de a rula interogarea ar fi de preferat să se
vizualizeze înregistrările ce se vor şterge, prin intermediul butonului View
din Toolbar.
 Ar trebui să existe copii ale informaŃiilor din tabele în orice moment. Dacă
se şterg din greşeală înregistrări ce nu trebuiau şterse, acestea se pot
extrage din copiile executate la un moment anterior de timp.
 In anumite cazuri, rularea unei interogări cu ştergere ar putea să şteargă
înregistrări din tabele relaŃionate, chiar dacă acestea nu sunt incluse în
interogare. Aceasta se poate întâmpla dacă interogarea conŃine numai
tabela ce este de partea «una» a unei relaŃii una-la-mai-multe şi dacă
ştergerile în cascadă sunt activate. Stergerile în cascadă activate au ca efect
faptul că dacă se şterge o singură înregistrare din baza de date principală
(de partea «una») atunci se şterg din tabela relaŃionată cu aceasta de partea
«mai-multe», tabela secundară, toate înregistrările corespunzătoare acelei
unice înregistrări şterse din tabela principală (execuŃia instrucŃiunii are loc
deoarece nu este de preferat să existe în tabela secundară înregistrări fără
corespondent în tabela principală).
 Dacă se startează o interogare cu ştergere pe o tabelă Paradox, dBASE sau
FoxPro ce este legată la baza de date curentă, aceasta nu se poate anula.
Paşii necesari pentru realizarea unei interogări cu ştergere sunt următorii :
1. Se creează o interogare ce conŃine tabelele din care se vor şterge
înregistrări.
2. Se selectează tipul interogării la Delete Query din meniul Query Type din
Toolbar.
3. Din tabelele din care se va executa ştergerea se adaugă în tabelul de design
asterix (*), iar în celula Delete va apărea clauza From.
4. Având în vedere că trebuie să fie şterse doar anumite înregistrări ce
îndeplinesc anumite criterii se adaugă în tabelul de design acele câmpuri asupra cărora
se va stabili criteriul de selecŃie. In celula Delete a acestor câmpuri va apărea clauza
Where.
5. In celula Criteria se introduce criteriul de selecŃie.
6. Pentru vizualizarea înregistrărilor ce vor fi şterse se apasă butonul View din
Toolbar.
7. Pentru rularea interogării se apasă butonul Run din Toolbar.
Prin rularea acestei interogări pentru tabela Produse se anulează efectul rulării
interogării cu adăugare de la punctul precedent, adică vor fi şterse inregistrările
corespunzatoare produselor Produs3, Produs4 si Produs5.

Interogări cu creare de tabele


O interogare cu creare de tabele (Make-tables Query) creează o tabelă nouă
prin selecŃia unor câmpuri dintr-una sau mai multe tabele.
Utilitatea unei astfel de interogări constă în:
 Crearea unei tabele pentru exportul într-o altă bază de date Microsoft
Access.
 Crearea unor rapoarte ce afişează informaŃia de la un anume moment de
timp.
 Realizarea unei copii de siguranŃă a unei tabele
 Crearea unei tabele ce va conŃine numai înregistrări vechi.
ImbunătăŃirea performanŃelor formelor şi rapoartelor bazate pe interogări din
mai multe tabele. In cazul folosirii unei interogări cu creare de tabelă aceasta se
rulează o singură dată, iar formele şi rapoartele se vor baza pe tabela creată în loc să
ruleze interogarea de fiecare dată. Trebuie notat faptul că informaŃiile din tabelă sunt
cele din momentul rulării interogării.
Paşii urmăriŃi pentru realizarea unei interogări cu creare de tabele sunt
următorii :
1. se creează o interogare nouă care să conŃină tabelele din ale căror câmpuri
se va crea noua tabelă.
2. Se selectează tipul interogării la Make-Table Query din meniul Query Type
din Toolbar, deschizându-se ferestra Make-Table.
3. InformaŃiile cerute în această fereastră sunt similare celor cerute în fereastra
Append (v. punctul 5.1.2. Pasul 3).
4. Dacă se doreşte continuarea acŃiunii se apasă butonul Ok, dacă se renunŃă se
apasă butonul Cancel.
5.Se adaugă în tabelul de design câmpurile ce se doresc în noua tabelă.
6. Se adaugă în celula Criteria pentru fiecare din aceste câmpuri criteriul de
selecŃie
7. Pentru vizualizarea înregistrărilor ce vor apărea în noua tabelă creată se
apasă butonul View din Toolbar.
8. Pentru rularea interogării se apasă butonul Run din Toolbar.
După rularea interogării în fereastra Tables apare tabela nou creată.

LECłIA 7. Formulare
Crearea automată a formularelor

Pentru a putea crea o formă se selectează în primul rând Tab-ul Forms


(Forme) din fereastra Database şi apoi se apasă butonul New.
La apăsarea acestui buton se deschide fereastra New Form (Formă Nouă) în
care se poate alege modalitatea de creare a unei forme.
Pentru crearea automată a unei forme, în primul rând este obligatoriu de ales
tabela pe baza căreia va fi creată forma (în combo-box-ul din partea de jos a ferestrei
numit Choose the table or the query where the object’s data comes from (SelectaŃi
tabela sau interogarea din care informaŃiile obiectului vor proveni)).
In acest combo-box există listate toate tabelele şi interogările existente în baza
de date curentă.
ObservaŃie:
Numai interogările de selecŃie sunt adăugate în această listă.
Considerăm pentru exemplificare alegerea tabelei Furnizori.
Pentru creare automată se poate alege una dintre opŃiuni:
AutoForm : Columnar
AutoForm : tabular
AutoForm : Datasheet
Pentru toate tipurile de forme create, toate datele din tabela selectată sunt
aduse în formă, iar mişcarea între înregistrări sau adăugarea uneia noi este realizată
prin intermediul butoanelor din partea de jos a formei.
Toate text-box-urile de pe formă sunt legate direct la tabelă astfel încât orice
modificare adusă valorilor din ele se transmite direct în tabelă. Aceasta se întâmplă
numai dacă modificările aduse nu încalcă vreuna din restricŃiile impuse din Design
View al tabelei, tip cheie primară, indexare (fără duplicate), Regula de validare etc.
Astfel, s-a încercat adăugarea inregistrării cu numarul 5 în care valoarea
câmpului ID indexat fără a permite duplicate este 2, această valoare existând deja în
tabelă.
La încercarea de salvare a acestei înregistrări (prin apăsarea tastei Enter sau
poziŃionare pe altă înregistrare) Microsoft Access a afişat un mesaj de eroare.

Crearea formularelor utilizând generatorul

O formă mai poate fi creată de către utilizator fie direct, fie prin utilizarea
Form Wizard (Generatorul) din Microsoft Access .
Generatorul măreşte viteza procesului de creare a unei forme deoarece el
realizează toată munca de bază în locul utilizatorului, în cazul în care forma ar fi fost
creată exclusiv de acesta. Atunci când se foloseşte generatorul, Microsoft Access cere
utilizatorului anumite informaŃii şi creează forma bazându-se pe răspunsurile acestuia.
Chiar dacă utlizatorul are o experienŃă îndelungată în crearea de forme, acest
generator ar putea fi totuşi folosit pentru a realiza toate acŃiunile de bază după care
utilizatorul poate intra în Design View pentru a particulariza forma în conformitate cu
dorinŃele acestuia.
La apăsarea butonului New pentru crearea unui obiect de tip formă în fereastra
New Form se alege opŃiunea Form Wizard.
Selectarea câmpurilor
După apăsarea butonului Ok din aceasta fereastra se deschide generatorul la
prima pagină a sa care permite utilizatorului selecŃia câmpurilor ce vor apărea pe
formă.
Prima pagină din Form Wizard permite utilizatorului urmatoarele:
 Combo Tables/Queries : selecŃia tabelei/tabelelor, interogării/interogărilor
cu care se va lucra în formă.
 Available Fields : afişarea câmpurilor disponibile în tabela/interogarea
selectată.
 - selecŃia pentru folosire în formă a câmpului selectat în lista câmpurilor
disponibile
 >> - selecŃia tuturor câmpurilor disponibile din lista câmpurilor disponibile
 < - eliminarea unui câmp din câmpurile selectate pentru a fi folosite în
formă
 << - eliminarea tuturor câmpurilor selectate pentru a fi folosite în formă
In partea de jos a ferestrei există următoarele butoane:
 Cancel – anulează întreaga acŃiune.
 Back – permite întoarcerea în pagina anterioară a generatorului (în prima
pagină a acestuia butonul Back nu este disponibil).
 Next – permite înaintarea la pagina următoare a generatorului.
 Finish – termină crearea formei şi realizează ieşirea din generator.

Tipuri de formulare

La apăsarea butonului Next se ajunge în pagina a doua a Generatorului în care


trebuie selectat tipul formei.
In dreapta ferestrei sunt afişate cele 4 tipuri de forme, iar în sub-ferestra din
stânga este prezentată modalitatea de afişare a text-box-urilor pe formă în funcŃie de
tipul selectat.
OpŃiunea implicită este Columnar. Mai sunt disponibile tipurile Tabular,
Datasheet, Justified.
Dacă se selectează una din opŃiuni şi se apasă butonul Finish rezultatul creării
acestei forme prin intermediul generatorului va avea acelaşi rezultat dacă s-ar fi
folosit direct modalităŃile de creare automată a unei forme (v. punctul 9.1.), fără a se
permite alegerea unui stil, stilul folosit la crearea formei fiind cel implicit.
9.2.3. Stilul unei forme
După ce se apasă butonul Next se va deschide pagina următoare a
generatorului care permite alegerea stilului unei forme.
Stilurile unei forme sunt afişate în partea dreaptă a ferestrei, iar la selecŃia
unuia dintre ele în imaginea din partea stângă se va afişa imaginea stilului ales.
Stilul ales este International. La apăsarea butnoului Cancel se anulează
crearea acestei forme, Back permite întoarcerea în paginile anterioare ale
generatorului pentru eventuale modificări, Next permite înaintarea pe pagina
următoare, iar Finish creează forma în conformitate cu informaŃiile introduse de
utilizator până la acest pas.
La apăsarea butonului Next, se intră în ultima pagină a generatorului în care se
vor mai cere utilizatorului câteva informaŃii necesare finalizării creării unei forme.
In această fereastră utilizatorul trebuie să introducă/selecteze următoarele
elemente:
What title do you want for the form? –numele sub care forma va fi salvată
 Open the form to view or enter information –dacă se doreşte deschiderea
formei pentru vizualizarea sau introducerea de informaŃii
 Modify the form’s design –dacă se doreşte deschiderea formei în Design
View pentru eventuale particularizări
 Display Help when working with the form? –dacă se doreşte utlizarea
sistemului de Help
De asemenea, semnificaŃia butoanelor este următoarea:
 Cancel – anularea creării acestei forme
 Back – întoarcerea pe paginile anterioare pentru eventuale modificări,
informaŃiile selectate aici nu se pierd.
 Next – nu este disponibil aceasta fiind ultima pagină din generator
 Finish – creează forma şi realizează ieşirea din generator.
In cazul în care utilizatorul a apăsat Finish în alta fereastra decat in ultima
atunci Microsoft Acces va salva forma sub numele tabelei care a fost selectată pentru a
i se folosi câmpurile pe formă.

LECłIA 8. Rapoarte
În acestă lecŃie se prezintă tehnicinile de realizare a rapoartelor, şi anume:
 Formatarea raportului
 Stilul raportului
 Stabilirea secŃiunilor raportului(antete şi subsoluri de raport,
pagină şigrup , a secŃiunii de etichete şi detaliu)
 Etichete cu adreseşi de cĂmp
 Sortarea
 Listarea raportului

Crearea unui raport de tip tabel utilizând generatorul

Un raport se poate crea (la fel ca şi o formă) direct de către utilizator sau
utilizând un generator (Report Wizard). Un astfel de generator măreşte viteza
procesului de creare a unui raport, iar dacă e cazul, utilizatorul poate intra în Design
View pentru a particulariza această formă finală a raportului.
Pentru a crea un raport utilizând generatorul, trebuie în primul rând să se
meargă în fereastra Reports (Tab-ul Reports) şi să se apese butonul New (similar ca în
cazul creării de forme). La apăsarea butonului New se deschide fereastra din care se
selectează opŃiunea Report Wizard.

ConŃinutul coloanelor
După apăsarea butonului Ok, în fereastra de mai sus se deschide prima pagină
a generatorului cu care se lucrează în mod similar ca în pagina de selecŃie a
câmpurilor din generatorul de forme(v. punctul 9.2.1.).
Gruparea în interiorul raportului
La păsarea butonului Next se intră în pagina a doua a generatorului de rapoarte
care permite gruparea în interiorul raportului.
Această fereastră prezintă în partea stângă câmpurile disponibile în raport şi în
dreapta o listă ce poate fi modificată în funcŃie de preferinŃele utilizatorului.
Lista implicită de grupare este în ordinea introducerii câmpurilor în lista de
coloane de pe raport.
Sortarea raportului
La apăsarea butonului Next din aceasta fereastra se intră în pagina a treia a
generatorului de rapoarte de unde este permisă ordonarea înregistrărilor ce vor fi
extrase în raport.
In partea stângă a acestei ferestre este afişată forma pe care o va avea raportul,
iar în partea dreaptă există posibilitatea selecŃiei de câmpuri pentru sortare.
După ce s-a introdus un câmp pentru sortare, se activează şi al doilea combo
ce conŃine câmpurile selectate în prima pagină a acestui generator. Ordinea de sortare
este stabilită prin butonul existent în dreapta fiecărui combo.
Orientarea tip portret şi tip peisaj
La apăsarea butonului Next se deschide a patra pagină a generatorului de
rapoarte în care este permisă selectarea orientării raportului în format portret
(Portrait) sau peisaj (Landscape).
Orientarea raportului se selectează din partea dreapta a ferestrei, grupul de
opŃiuni Orientation (Orientare). Selectarea implicită este Portrait.
La selectarea opŃiunii Landscape vom avea raportul va fi afisat .

Planul general al raportului


Planul general al raportului se selectează din aceeaşi pagina 4 a generatorului
de rapoarte din grupul de opŃiuni Layout.
OpŃiunile disponibile sunt : Columnar, Tabular şi Justified.
OpŃiunea implicită este Tabular.
Pentru opŃiunea Columnar imaginea din stânga paginii se schimbă conform
noului plan general selectat.
LăŃimea raportului
LăŃimea raportului se selectează din aceeaşi pagina 4 a generatorului de
rapoarte prin check-box-ul Adjust the field width so all the fields fit on the page.
Stilul raportului
La apăsarea butonului Next din pagina a patra a generatorului se deschide
pagina numărul 5 a acestuia din care este permisă selecŃia stilului raportului.
In această fereastră sunt disponibile stilurile din imagine din care poate fi
selectat cel ce îndeplineşte cel mai bine cerinŃele utilizatorului. Stilul implicit este cel
din imagine, respectiv Corporate.
Utilizatorul alege stilul potrivit şi apasă butonul Next pentru a ajunge la ultima
pagină din generatorul de rapoarte în care este cerut numele raportului.
Pentru introducerea numelui se recomandă alegerea unui un nume sugestiv
pentru ceea ce este prezent în raport.
Numele implicit pus de generator este cel al tabelei/interogării selectate în
prima pagină a generatorului, în acest caz Query6.
Se menŃionează faptul că, în oricare din paginile generatorului pot fi utilizate
butoanele:
 Cancel – anulează acŃiunea de generare a unui raport
 Back – permite întoarcerea pe paginile anterioare pentru eventuale
modificări fără ase pierde selecŃiile făcute pe pagina curentă
 Finish – permite închiderea generatorului cu crearea raportului cu selecŃiile
realizate până atunci şi cu selecŃiile implicite dacă nu s-au modificat.

Etichete cu adrese
Pentru crearea unui raport de tip etichete cu adrese trebuie selectată opŃiunea
Label Wizard (generatorul de etichete) şi apoi apăsat butonul New.
Pentru selecŃia acestui tip trebuie introdus din combo-ul prezent în partea de
jos a acestei ferestre tabelul/interogarea pe baza căreia se va genera acest raport.
Mărimea etichetelor
La apăsarea butonului Ok se va afişa prima pagină a acestui generator care va
permite selecŃia mărimii etichetelor.
In afară de dimensiunea etichetelor pe aceasta pagină se vor mai putea seta :
 UnităŃile de măsură (Units of Measure) : English sau Metric.
 Tipul etichetei (Label Type) : Sheet feed sau Continuos.
Dacă tipurile etichetelor nu sunt agreate de utilizator, atunci se poate apăsa
butonul Customize (Particularizează).
La apăsarea butonului Next de pe această pagină, se intră în pagina următoare.
In această fereastră se poate selecta fontul, mărimea acestuia, dimensiunea şi
culoarea textului. De asemenea, se mai poate selecta modul de scriere: Italic sau
Underline.

In pagina următoare a generatorului se pot realiza etichetele de câmp.


In această ferestră sunt disponibile câmpurile tabelei ce a fost selectată ca bază
pentru acest raport şi prin acŃionarea butonului central (>) se pot selecta în lista din
dreapta. Nu există nici o etichetă setată implicit.

Sortarea etichetelor se face în pagina următoare a generatorului de etichete.


In lista din stânga imaginii sunt disponibile câmpurile din tabela selectată ca
bază a acestui raport, iar în lista din stânga imaginii pot fi selectate câmpurile pentru
sortare (prin intermediul butoanelor : >, >>).

In ultima pagină a raportuluis e introduce numele acestuia, valoarea implicită


fiind aceea de Labels + numele tabelei.interogării selectate la începutul generării.
In această fereastră mai pot fi selectate următoarele opŃiuni:
 vizualizarea etichetelor aşa cum vor fi tipărite
 modificarea design-ului etichetelor
 asistarea de către sistemul de Help al sistemului atunci când se lucrează cu
etichetele
De asemenea, pe paginile generatorului sunt prezente tot timpul butoanele :
 Cancel – anulează acŃiunea de generare a unui raport
 Back – permite întoarcerea pe paginile anterioare pentru eventuale
modificări fără a se pierde selecŃiile făcute pe pagina curentă
Finish – permite închiderea generatorului cu crearea raportului cu selecŃiile
realizate până atunci şi cu selecŃiile implicite dacă nu s-au modificat.

Listarea raportului

Pentru listarea unui raport, în primul rând trebuiesc setate marginile, orientarea
şi celelalte condiŃii de structura vizuală.
Astfel, paşii ce trebuiesc executaŃi sunt următorii :
1. Se selectează un raport din fereastra Database, sau se deschide un raport
în Design View, Print Preview sau Layout Preview.
2. In meniul File se apasă butonul Print (Listează).
3. Se intră setările dorite în fereastra de dialog Print:
 se specifică o imprimantă
 se specifică numărul paginilor ce trebuie listate
 se specifică numărul copiilor ce trebuie listate
4. Apoi se apasă butonul Ok.
Domeniul de listare
Pentru domeniul de listare se setează dimensiunea paginii, tipul paginării
(Portrait sau Landscape) şi imprimanta.

Marginile raportului se setează în aşa fel încât datele tipărite să aibă loc în
dimensiunile paginii (mai puŃin dimensiunile marginilor.

Elemente de control pentru forme şi rapoarte


Toată informaŃia din cadrul unei forme sau unui raport este conŃinută
în elemente de control. Elementele de control (Controls) sunt obiecte (în cadrul unei
forme / raport) ce afişează informaŃiile, execută acŃiuni, sau „formalizează”
forma/raportul.
Microsoft Access include următoarele tipuri de element de control :
Câmpul de tip text,Câmpul de tip etichetă, Grupul de opŃiuni, Butonul de selectare a
unei opŃiuni, Câmpul de tip opŃiune (check-box-ul), Linia, Dreptunghiul.
Elementele de control sunt accesibile în Toolbox-ul din Design View în formă
sau raport.
Dacă fereastra Toolbox nu se deschide atunci când se intră în Design View
pentru o formă/raport atunci această fereastră poate deveni disponibilă prin apăsarea
butonului Toolbox din Toolbar.

Câmpul Etichetă
Câmpurile Etichetă (Labels) se folosesc pe o formă sau raport pentru a afişa
un text descriptiv (i.e. titluri, capturi sau scurte instrucŃiuni). Câmpurile Etichetă nu
afişează valori din câmpuri sau expresii; ele sunt întotdeauna „nelegate” şi nu îşi
schimbă valoarea pe măsură ce se realizează deplasarea de la o înregistrare la alta.
In altă ordine de idei, un astfel de câmp poate fi ataşat unui alt element de
control. Atunci când se creează un câmp de tip text, de exemplu, are ataşat un câmp
etichetă care afişează o captură pentru acel câmp de tip text.
Pentru crearea unei etichete ataşată unui element de control nu se face altceva
decât crearea elementului de control, iar Microsoft Access ataşează o etichetă acestuia
cu ocazia creării lui .
O etichetă de sine stătătoare este o etichetă ce nu este ataşată nici unui alt
element de control şi este creată din Toolbox, i.e. elementul Label. Astfel de etichete
se folosesc pentru informaŃii de tipul unui titlu al formei sau al raportului, sau pentru
alte texte descriptive.
Pentru crearea unei etichete de sine stătătoare se parcurg următorii paşi:
1. Se deschide forma sau raportul în Design View.
2. Se apasă Label în Toolbox.
3. Pe formă sau raport, se execută un click acolo unde se doreşte poziŃionarea
etichetei şi apoi se introduce textul ce va fi afişat.
ObservaŃii:
1. Dacă se doreşte afişarea unui text într-o etichetă pe mai mult de o singură
linie, atunci se poate redimensiona eticheta după introducerea întregului text sau se
poate apăsa Ctrl+Enter la sfârşitul primei linii din text pentru a se introduce un CR
(carriage return). LăŃimea maximă a etichetei este determinată de lungimea primei
linii din text.
2. Dacă se doreşte utilizarea ampersantului (&) în etichetă atunci trebuie
introduse două astfel de simboluri, deoarece Microsoft Access utilizează acest simbol
pentru a defini tastele de acces.

Câmpul de tip text


Câmpurile de tip text (Text Box) se folosesc pe o formă sau un raport pentru a
afişa datele dintr-o tabelă sau interogare. Acest tip este numit câmp de tip text legat
deoarece este legat la informaŃiile dintr-un câmp.
Câmpurile de tip text pot fi şi nelegate cum ar fi, cele în care se afişează
rezultatul unui calcul sau un câmp în care se introduce text de către utilizator.
InformaŃia dintr-un câmp nelegat nu este stocată.
Crearea unui câmp de tip text depinde în primul rând de tipul de câmp ce se
doreşte: legat, nelegat sau calculat.
Crearea unui câmp legat:
1. Se deschide o formă sau un raport în Design View.
2. Se apasă Field List (Lista de câmpuri) din Toolbar pentru a afişa lista
câmpurilor. Dacă acest buton nu este valabil, atunci va fi necesar să se lege forma sau
raportul la o sursă de înregistrări folosind proprietatea de RecordSource (Sursa de
Inregistrări).
3. Se selectează unul sau mai multe câmpuri din lista de câmpuri; în acest
scop se parcurg paşii următori:
 Unui câmp – se execută click pe câmp
 Unui bloc de câmpuri – se execută click pe primul câmp din bloc, se Ńine
apăsată tasta Shift şi apoi se execută click pe ultimul câmp din bloc.
 Unor câmpuri neadiacente – se Ńine apăsată tasta Ctrl şi apoi se execută
click pe fiecare câmp dorit pentru selecŃie.
 Toate câmpurile – se execută dublu-click.
4. Se “trage” câmpul (câmpurile) din lista de câmpuri şi se poziŃionează pe
formă sau raport.
ObservaŃii:
1. Trebuie să se execute “tragerea” câmpului din lista de câmpuri pe formă;
dacă s-ar executa click pe câmp şi apoi click pe formă Microsoft Access nu va crea
elementul de control.
2. Microsoft Access va crea câte un element de tip text (pe formă sau raport)
pentru fiecare câmp selectat din lista de câmpuri. Fiecare element de tip text este legat
de unul din câmpurile din sursa de date a formei/raportului. Fiecare element de tip
text are de asemenea ataşată o etichetă implicită.
5. Se dimensionează câmpul de tip text astfel încât să aibă dimensiunea
potrivită informaŃiei ce trebuie afişată.
6. Se schimbă textul etichetei dacă este necesar.
7. Se poate testa elementul de control prin intermediul Form View.
ObservaŃie:
Pentru elementele de tip text pe forme ce au multe linii de text, se poate dori
adăugarea unei bare de navigare verticală.

Câmpul de tip opŃiune (Check box)


Un câmp de tip opŃiune (Check Box) se poate folosi pe o formă sau pe un
raport ca un control de sine stătător pentru a afişa o valoare de tip Yes/No.
Atunci când se selectează / deselectează un câmp de tip opŃiune care este legat
de un câmp Yes/No dintr-o tabelă sau interogare, Microsoft Access afişează valoarea
în tabela/interogarea respectivă în concordanŃă cu setarea proprietăŃii Format a
câmpului respectiv (Yes/No, True/False, sau On/Off).
Aceste tipuri de câmpuri se pot folosi şi în grupuri de opŃiuni ce afişează
valorile din care trebuie făcută o alegere. De asemenea un astfel de câmp se poate
folosi nelegat de nici un câmp din vreo tabelă/interogare în scopul introducerii unei
opŃiuni de către utilizator în cazul unei ferestre de dialog.
Paşii necesari pentru crearea unui astfel de câmp sunt următorii :
1. Se deschide o formă sau un raport în Design View.
Se execută un click în Toolbox pe butonul corespunzător câmpului de tip
opŃiune. Dacă nu se cunoaşte cu exactitate care este acest buton, atunci se
poziŃionează mouse-ul pe fiecare din butoanele disponibile în fereastra Toolbox până
când se găseşte acel buton în dreptul căruia este afişat cuvântul Check Box  Tip
(Indiciu).
2. Pe formă/raport se execută un click acolo unde se doreşte inserarea
elementului de control nelegat. Dacă se doreşte poziŃionarea elementului de control
într-un grup de opŃiuni, atunci Microsoft Access „luminează” grupul de opŃiuni atunci
când mouse-ul este deasupra lui pentru a arăta că acest element de control va face
parte din grupul de opŃiuni.

Listele şi câmpurile combinate

In cele mai multe dintre cazuri, este mult mai repede şi mult mai uşor să se
selecteze o valoare dintr-o listă decât să se amintească valoare ce trebuie introdusă.
O listă a valorilor posibile (un câmp combo) ajută de asemenea pentru a se
asigura că valoarea ce este introdusă într-un câmp este corectă.
In general, o listă constă în linii de date. Liniile pot avea una sau mai multe
coloane, care pot apărea cu sau fără capete de coloană. Dacă o listă cu mai multe
coloane este legată la o tabelă sau interogare, Microsoft Access va stoca valorile din
una din coloane.
Se poate folosi o listă nelegată pentru a depozita o valoare care va fi folosită
într-un alt element de control. De asemenea se poate folosi o listă nelegată pentru a
găsi o înregistrare bazată pe valoarea selectată în listă.
Dacă nu există spaŃiu în formă pentru a afişa conŃinutul listei sau dacă se
doreşte a se tasta valori noi, atunci se poate folosi un câmp combo.
Pentru a decide între o listă sau un câmp combo, trebuie stabilită modalitatea
de apariŃie şi de folosire a acestui element de control deoarece fiecare dintre aceste
tipuri de elemente de control oferă anumite avantaje:
 Avantajele unei liste lista apare în orice moment şi valoarea elementului
de control este limitată la mulŃimea alternativelor din listă. Pentru a se
executa rapid mişcarea pe o valoare care începe cu o anumită literă se poate
apăsa acea literă. Dacă forma se foloseşte la adăugare sau editare atunci în
listă se pot introduce valori.
 Avantajele unui câmp combo  din moment ce lista nu este afişată decât
atunci când este deschisă, acest element de control foloseşte mai puŃin din
spaŃiul formei. Se pot tasta primele carectere dintr-o valoare pentru ca
această valoare să fie găsită mai repede. De asemenea se poate controla
dacă poate fi introdusă orice valoare în listă sau se limitează doar la valorile
existente în listă.

Dreptunghiul, linia
Pentru crearea unui element de control de tipul dreptunghi sau linie sunt
necesari următorii paşi:
1. Se deschide forma/raportul în Design View
2. Se execută click pe unealta Dreptunghi (Rectangle) sau pe Linie (Line) în
Toolbox.
3. Apoi se execută click acolo unde se doreşte poziŃionarea elementului de
control, de dimensiune implicită sau după creare/selectare se “trage” pentru a obŃine
dimesniunea dorită a elementului de control.
ObservaŃii:
1. Pentru a schimba grosimea bordurii dreptunghiului se poate apăsa săgeata
din partea dreaptă a butonului Grosime Linie/Bordură (Line/Border Width) din
Toolbar şi apoi se selectează grosimea dorită.
Pentru a schimba stilul liniei sau bordurii dreptunghiului (punctat, cu liniuŃe
etc), se execută un click pe dreptunghi/linie apoi Properties din Toolbar şi apoi se
selectează un stil de bordură (Border Style).
2. Pentru a realiza mici ajustări ale lungimii sau unghiului liniei, se
selectează linia, se Ńine tasta Shift apăsată, şi apoi se apasă una dintre săgeŃi. Pentru a
face mici ajustări asupra poziŃiei linie se Ńine apăsată tasta Ctrl şi apoi se apasă una
dintre săgeŃi.

Ştergerea elementelor de control


Pentru ştergerea unui element de control trebuie să fie parcurşi paşii următori:
1. Se deschide o formă/raport în Design View.
2. Se selectează elementul de control.
3. Se apasă tasta Del (Delete).
ObservaŃie:
Dacă acest element de control are ataşată o etichetă atunci Microsoft Access va
şterge elementul de control şi eticheta sa. Dacă se doreşte doar ştergerea etichetei
atunci se selectează eticheta şi se apasă tasta Del (Delete).
Editarea proprietăŃilor elementelor de control

Fiece tip de element de control are un set de proprietăŃi implicite care


determină modalitatea generală de afişare şi comportamentul elementului de control.
Astfel, proprietăŃile unui câmp de tip text determină dimensiunea şi fontul acestui
câmp şi dacă acest câmp (de tip text) are ataşată o etichetă. Acest set de proprietăŃi
pentru un element de control se numeşte Stilul implicit al elementului de control
(default control style). Dacă se observă că se realizează de mai multe ori aceleaşi
modificări ale stilului implicit după ce acesta este adăugat pe o formă sau raport,
atunci acest stil implicit poate fi modificat.
Din momentul în care acest stil implicit este modificat, toate
elementele de control create după aceea vor noul stil implicit, care va rămâne
neschimbat până la următoarea schimbare.
Pentru schimbarea proprietăŃilor mai multor elemente de control la un moment
dat sunt necesari următorii paşi:
1. Se deschide forma/raportul în Design View.
2. Se asigură că un element de control este selectat, şî apoi se execută un
click pe Properties în Toolbar.
3. Se selectează celelalte elemente de control prin menŃinerea apăsată a
tastei Shift pe măsură ce se execută click pe fiecare element de control.
4. Apoi în tabelul de proprietăŃi se modifică proprietăŃile respective.
ObservaŃii:
1. Se pot schimba în acest fel proprietăŃile mai multor elemente de control
de acelaşi tip sau de tipuri diferite. Dacă se selectează elemente de control de tipuri
diferite, Microsoft Access afişează doar acele proprietăŃi comune tipurilor respective.
Dacă exista proprietăŃi comune ele vor fi afişate altfel tabelul de proprietăŃi va fi gol.
Dacă se schimbă setarea unei proprietăŃi comune atunci această modificare este
aplicată tuturor elementelor de control din selecŃie.
2. Proprietatea Nume (Name) nu apare de exemplu niciodată atunci când
este selectat mai mult de un element de control, deoarece numele elementelor de
control trebuie să fie unice.

ConŃinutul elementelor de control


Din punctul de vedere al conŃinutului, elementele de control pot fi legate,
nelegate sau calculate.
1. Un element de control legat (Bound Control)
 Este în legătură cu un câmp dintr-o tabelă sau interogare.
 Este folosit pentru a afişa, introduce şi actualiza valorile din
câmpurile din baza de date.
2. Un element de control calculat (Calculated Control)
 Are drept sursa sa de informaŃie o expresie
 Expresia poate folosi informaŃie dintr-un câmp dintr-o
tabelă/interogare sau dintr-un alt element de control de pe formă sau raport.
3. Un element de control nelegat (Unbound Control)
 Nu are nici un fel de sursă de informaŃie
 Este folosit pentru a afişa informaŃii, linii, dreptunghiuri şi imagini.
Stilul, mărimea fontului şi culoarea fontului
ProprietaŃie stilul fontului (FontName) şi mărimea fontului (FontSize) se
folosesc pentru a specifica fontul şi pentru a stabili dimensiunea fontului în
următoarele situaŃii:
Atunci când se afişează sau se tipăresc elementele de control în forme sau
rapoarte.
Atunci când se foloseşte metoda Print (Tipăreşte) pentru un raport.
Proprietatea FontName conŃine numele fontului în care textul va fi afişat.
Proprietatea FontSize are una din următoarele setări:
 8 – este valoarea implicită pentru toate rapoartele şi elementele de control
cu excepŃia butoanelor de comandă.
 10 – valoarea implicită pentru butoanele de comandă.
Alte valori – textul va fi de această dimensiune.
Pentru elementele de control din forme/rapoarte acaste proprietăŃi pot fi setate
în următoarele variante
 din tabelul de proprietăŃi sau din Visual Basic.
 prin butoanele Font sau FontSize din Toolbar-ul de formatare.
 prin alegerea proprietăŃilor implicite.
ObservaŃie:
Disponibilitatea fonturilor depinde de sistem şi de imprimantă. Dacă se
selectează un font ce nu poate fi afişat de sistem sau nu este instalat, atunci Windows
va substitui acest font cu un font similar.
Proprietatea culoarea fontului (ForeColor) specifică în ce culoare va fi afişat
textul într-un element de control. Aceasta se foloseşte pe o formă/raport pentru a le
face mai uşor de citit sau pentru a sublinia o semnificaŃie mai specială. De asemenea,
această proprietate poate fi folosită pentru a crea efecte vizuale speciale pe rapoarte în
cazul în care se utilizează o imprimantă color.
Proprietatea ForeColor conŃine o expresie numerică ce reprezintă valoarea
culorii textului din elementul de control.
Se poate folosi ColorBuilder pentru a seta această proprietate prin apăsarea
butonului Build. In acest fel, utilizatorul îşi poate crea propriile lui culori.
Pentru elementele de control setarea acestei proprietăŃi se poate realiza dintr-
unul din cele două butoane din Toolbar Font/Fore Color, din tabelul de proprietăŃi
sau din Visual Basic.
ObservaŃii:
1. Pentru un câmp de tip text, etichetă sau buton de comandă ce conŃine un
hyperlink, Microsoft Access setează în mod automat ForeColor la culoarea specificată
în hyperlink. Dacă hyperlink-ul se şterge, atunci se revine la setarea din proprietăŃile
implicite.
2. Pentru butoanele de comandă, ForeColor are efect doar dacă acest buton
conŃine o captură mai degrabă decât o imagine.
Mărimea câmpului (lăŃimea, înălŃimea)
ProprietăŃile lăŃime (Width) şi înălŃime (Height) sunt folosite pentru a
dimensiona un obiect. Acest fapt poate fi folositor de exemplu dacă se doreşte creare
unor obiecte de aceeaşi dimensiune sau care au aceeaşi lăŃime sau înălŃime.
ObservaŃii:
1. Proprietatea Height se plică numai secŃiunilor de formă/raport, nu şi
formelor sau raportului.
2. proprietatea Width se aplică numai formelor/rapoartelor nu şi secŃiunilor
de formă/raport.
3. Ambele proprietăŃi se aplica elementelor de control din forma/rapoarte.
Setarea acestor proprietăŃi se realizează prin introducerea unei valori numerice
pentru lătimea/înălŃimea dorită în unităŃile de măsură ale sistemului (v. Regional
Settings).
Setarea pentru lăŃime poate fi între 0 şi 55,87 cm.
ObservaŃii:
1. Microsoft Access setează în mod automat Height şi Width atunci când se
creează un element de control.
2. InălŃimea secŃiunilor şi lăŃimea formelor şi rapoartelor sunt măsurate
de la bordurile lor, pe când lăŃimea şi înălŃimea elementelor de control sunt
masurate din centrul bordurilor lor, astfel încât elemente de control cu grosimi
diferite ale bordurilor să se alinieze corect.

Alinierea textului (stânga, la centru, dreapta)


Proprietatea LabelAlign (Alinierea Etichetei) specifică alinierea textului în
etichetele ataşate noilor elemente de control.
Proprietatea TextAlign (Alinerea textului) specifică alinierea textului în noile
elemente de contro.
LabelAlign foloseşte următoarele setări:
 General  setarea implicită. Textul etichetei va fi aliniat la stânga.
 Left Stânga. Textul etichetei se aliniază la stânga.
 Center Centru. Textul etichetei este centrat.
 RightDreapta. Textul etichetei este aliniat la dreapta.
Pentru setările proprietăŃii TextAlign există o singură diferenŃă faŃă de cele ale
proprietăŃii LabelAlign şi anume: pentru setarea General, textul se aliniază la stânga şî
numerele şi datele la dreapta.
ObservaŃie:
Atunci când se creează un element de control, dacă proprietatea AutoLabel
este setată pe Yes atunci se creează şi o etichetă.

EvidenŃierea (îngroşare, italic, subliniere)


Se poate folosi proprietatea FontBold pentru a specifica dacă un font apare
într-un stil îngroşat în următoarele situaŃii:
 Atunci când se afişează sau se tipăresc elemente de control pe
forma/rapoarte.
 Atunci când se utilizează proprietatea Print pe un raport.
Setarea acestei proprietăŃi se face în felul următor:
 True (-1)Textul este îngroşat
 False (0)Valoarea implicită. Textul nu este îngroşat.
Proprietatea FontBold poate fi setată numai utilizând codul de Visual Basic.
ProprietăŃile FontItalic şi FontUnderline se folosesc pentru a specifica dacă un
text este italic sau subliniat.
Aceste proprietăŃi au următoarele setări posibile:
 Yestextul este italic/subliniat
 NoValoarea implicită.Textul nu este italic/subliniat.

Umplerea / culoarea de fundal

Proprietatea BackColor se foloseşte pentru a menŃiona culoarea din interiorul


unui element de control sau secŃiuni. Această proprietate conŃine o expresie numerică
ce corespunde culorii folosite pentru a umple interiorul unui element de control sau al
unei secŃiuni. De asemenea această proprietatea se poate seta folosind butonul
Fill/Back Color din Toolbar-ul de formatare.
Dacă se foloseşte proprietatea BackColor, atunci proprietatea BackStyle, dacă
există, trebuie setată la Normal.
LăŃimea liniei / bordurii
Proprietatea BorderStyle este utilizată pentru a specifica tipul bordurii şi
elementele de bordură (bara de titlu, meniul de control, butoanele de minimizare şi
maximizare sau butonul de închidere). In cazul elementelor de control, această
proprietatea setează bordura de afişare.

Proprietatea BorderStyle dispune de următoarele setări posibile:


 Transparent Transparent. Valoare implicită numai pentru etichetă sau
subraport.
 SolidSolid. Valoare implicită. O linie solidă.
 Dashes LiniuŃe. Linie întreruptă.
 Short dashesLinuŃe scurte. Linie întreruptă cu liniuŃe scurte.
 DotsPuncte. Linie punctată.
 Sparse dotsPuncte distanŃate. Linie punctată cu puncte spaŃiate mult.
 Dash dotLiniuŃă Punct. Linie cu o combinaŃie linuŃă punct.
 Dash dot dot LiniuŃă Punct Punct. Linie cu o combinaŃie LiniuŃă Punct
Punct

TESTE

-1-

1. Deschideti aplicatia de baze de date.


2. Creati o baza de date noua in directorul1. Salvati-o cu nou 1. mdb.
3. Creati o tabela cu urmatoarele campuri :
CNP Number-Integer
Nume Text de demensiune 75
Data Date/Time-Short Date
4. Salvati tabela cu numele Candidat.
5. Creati un formular nou asupra tabelei Candidat.
6. Salvati formularul cu denumirea Formular Candidat.
7. Introdudceti doua inregistrari in tabela Candidat cu ajutorul formularului
creat.

CNP Nume Data


102 Alina 7/17/94
98 Maria 2/18/02

8. Utilizati instrumental de cautare pentru a gasi inregistrarea cu CNP-ul 102.


9. Modificati numele persoanei in Andreea.
10. Salvati modificarile facute si inchideti aplicatia de baze de date.
1. Deschideti baza de date 1.mdb.
2. Adunati urmatorul atribut Numar_telefon tabelei Autor.
3. Stergeti tabela Campuri din baza de date.
4. Modificati lungimea coloanei Nume in tabela Autor la 100 de caractere.
5. Creeati o interogare asupra tabelei Carte in care sa afisati doar cartile ce au
codurile mai mare de 100.
6. Creati un raport asupra tabelei Autor.
7. Introduceti in antetul raportului o imagine.
8. Mutati imaginea in partea stanga a antetului.
9. Salvati raportul cu denumire Raport autor.
10. Salvati modificarile facute si inchideti aplicatia de baze de date.

-2-

1. Deschideti aplicati de baze de date.


2. Creati o baza de date noua cu numele baza de date in directorul 2.
3. In baza de date nou creeata, construiti o tabela cu urmatoarele atribute :

Oras Text-dimensiune 20
Data examinarii Date/Time-Short Date
Nume Centru Text-de dimensiune 30
Numar Curent Autonumber

4. Stabiliti atributul Nume Centru fiind indexat cu duplicate


5. Mutati atributul Numar Curent astfel incat sa devina primul atribut din
tabela.
6 Creati o regula de validare pentru atributul Numar Curent,astfel incat sa nu
primeasca valori mai mari de 256.
7. Introduceti in tabela creeata 5 inregistrari.
8. Imprmati toate inregistrarile din tabela.
9. Salvati toate datele.
10. Inchideti aplicatia de baze de date.

1. Deschideti baza de date 2.mdb.


2. Creati un filtru de tipul Filter By Form pentru tabela Universitate in modul
urmator :
afişati ecanul corespunzător
3. Sortati datele din tabela Profesor in ordine descrescatoare dupa cimpul
Cod_profesor.
4. Aplicati filtrul creeat asupra tabelei Universitate .
5. Deschideti formularul Profesor.
6. Cu ajutorul formei selectati inregisrtarea si modificati numele profesorului din
Vasile in Marian
7. Stergeti inregistrae cu numarul 2 din tabela.
8. Deschideti raportul Profesor.
9. Modificati dimensiunea pagini din A4 in Letter.
10. salvati modificarile facute si inchideti aplicatia de baze de date.
-3-

1. Deschideti aplicatia de baza de date.


2. Creeati o baza de date noua si salvati-o in directorul 3
3. Utilizati functia Help pentru a cauta informatii despre tabele.
4. Creeati o tabela noua si denumiti-o Informatii .
5. Inytroduceti in tabela 3 atribute.
6. In tabela creata stabiliti primul camp ca fiind cheie primara
7. Creati un raport asupra acestei tabele.
8. Grupati datele din raport in functie de al doilea atribut
9. Salvati raportul cu numele Raport
10. Inchideti baza de date create.

1. Deschideti aplicatia de baze de date.


2. Deschideti baza de date 3.mdb
3. Stergeti tabela Informatii din baza de date
4. Modificati tipul atributului Cantitate din tabela Produs,din Text in Number.
5. Deschideti formularul Produs.
6. Adaugati numele dumneavoastra in antetul formularului Produs.
7. Creati o interogare cu date din tabelele Produs si Comenzi,in care sa afisati
din tabela Produs campurile Nume_produs si Unitate_de_masura,iar din
tabela Comenzi campurile Nume_firma si Cantitate_ceruta,pentru acele
inregistrari pentru care cod_produs din tabela Produs este egal cu cod _produs
din tabela Comenzi.
8. Salvati interogarea cu numele Query.
9. Rulati interogarea creata.
10. Salvati modificarile facute si inchideti aplicatia de baze de date.

-4-

1.Deschideti aplicatia de baze de date.


2.Creati o baza de datenoua cu numele dumneavoastre pe directorul C.
3.Afisati pe ecran bara de instrumente Database.
4.Creati o tabela cu urmatoarele atribute :

Atribut 1 Numeric-Byte
Atribut 2 Text-dimensiune 15 caractere
Atribut 3 Currency-Euro

5.Creati o noua tabela cu urmatoarele attribute:

Atribut 1 Numeric-Byte
Atribut 4 Text-dimensiune 20
Atribut 5 Text-dimensiune 25

6.Stabiliti in prima tabela ca cheie primara Atribut 1.


7.Creati o legatura intre cele 2 tabele dupa campul Atribut 1.
8.Salvati modificarile facute.
9Mutati in tabela 2 campul Atribut 5 inaintea campului Atribut 4.
10.Inchideti aplicatia de baze de date.

1.Deschideti o aplicatie de baze de date.


2.Deschideti baza de date 4.mdb.
3.Modificati lungimea coloanei Marca la 25 in tabela Masini.
4.Cautati inregistrarea cu marca Audi si modificati Tip_masina in tip sport.
5.Creati o interogare, cu date din tabela Masini, in care afisati doar masinile din
arce Mercedes.
6.Sortati datele din tabela Masini dupa campul Marca, in ordine alfabetica.
7.Creati un raport asupra tabelei Masini Disponibile.
8.Modificati orientarea paginii.
9.Imprimati toate datele obtinute in raportul anterior creat.
10.Salvati toate modificarile facute si inchideti baza de date.

-5-

1.Deschideti o aplicatie de baze de date.


2.Creati o baza de date noua in directorul C
3.Creati o tabela in care introduceti 5 campuri.Dintre acestea 2 vor fi de tip Text,
2 vor fi numerice si unul de tip data calendaristic.
4.Creati un formular nou asupra tabelei create anterior.
5.Cu ajutorul noului formular introduceti in tabela 5 inregistrari.
6.Adaugati numele dumneavoastra in antetul formei.
7.Creati o interogare care sa contina numai campurile 1 si 2.
8.Rulati interogarea creata.
9.Imprimati doar inregistrarile selectate din tabela creata.
10.Salvati toate datele si inchideti aplicatia de baze de date.

1.Deschideti baza de date 5.mdb.


2.Deschideti tabela Caseta imprumutate si introduceti atributul
Data_imprumut de tip Date.
3.Stergeti legatura dintre tabelele Casete si Casete imprumutate.
4.Sortati datele din tabela Casete in ordine descrescatoare dupa atributul Actor.
5.Creati un raport asupra tabelei Casete.
6.Introduceti in antetul raportului numele dumneavoastra si data curenta.
7.Grupati datele din raport dupa atributul Tip_film.
8.Modificati tipul paginii din Letter in A4
9.Imprimati raportul la o imprimanta disponibila.
10.Salvati modificarile facute si inchideti aplicatia de baze de date.
TEMA III. LIMBAJUL SQL
În această tema: se prezintă conceptele limbajului SQL în 6 lecŃii, după
cum urmează:
LECłIA 1. Concepte SQL
LECłIA 2. Limbajul de definire a datelor - DDL
LECłIA 3. Limbajul de interogare a datelor - DQL
LECłIA 4. Combinarea datelor din mai multe tabele - Uniuni (Join)
LECłIA 5. Limbajul de manipulare a datelor - DML
LECłIA 6. SQL cu ACCSESS

LECłIA 1. Concepte SQL

În acestă lecŃie se vor prezenta conceptele de bază ale limbajul SQL.


SQL a devenit limbajul universal pentru bazele de date relaŃionale şi este
acceptat de aproape toate sistemele SGBD moderne. Fără îndoială, acceptarea pe
scară largă este rezultatul timpului şi eforturilor depuse pentru dezvoltarea
caracteristicilor limbajului şi a standardelor, crescând nivelul de portabilitate a
codului SQL între diferitele produse RDBMS.
VeŃi avea mai multe succes în învăŃarea limbajului SQL dacă folosiŃi în mod
activ SQL şi o bază de date relaŃională pentru a încerca exemplele prezentate sau dacă
veti încerca variante proprii ale exemplelor.
Ce este SQL?
SQL (Structured Query Language -limbaj structurat de interogare) este un
limbaj standard folosit pentru crearea, actualizarea şi regăsirea informaŃiilor stocate în
baze de date prin intermediul sistemelor de gestionare a bazelor de date ( SGBD-uri).
Numele limbajului poate fi pronunŃat pe litere (es-q-el) sau la fel ca şi
cuvântul englezesc „sequel". O interogare (query) este o simplă cerere transmisă către
baza de date, la care aceasta răspunde într-o anumită formă. SQL este limbajul folosit
cel mai frecvent pentru interogarea bazelor de date. SQL este considerat un limbaj
neprocedural sau declarativ, ceea ce înseamnă că-i spuneŃi calculatorului ce rezultate
vreŃi, fară să-i spuneŃi cum să le obŃină. De exemplu, dacă vreŃi să obŃineŃi media
numerelor de pe o coloană, folosiŃi funcŃia AVG. Nu este nevoie să număraŃi valorile
din coloană şi să împărŃiŃi suma acestora la numărul obŃinut - procesorul limbajului
SQL din SGBDse ocupă de toate aceste lucruri în locul dumneavoastră.
Este important să înŃelegi că SQL nu este un limbaj procedural, ca C, Pascal,
Basic, FORTRAN, COBOL sau Ada. Un limbaj procedural foloseşte o serie de
instrucŃiuni executate secvenŃial. De asemenea, limbajele procedurale includ
instrucŃiuni care pot modifica secvenŃa de execuŃie, prin ramificarea la alte porŃiuni
ale procedurii sau prin parcurgerea ciclică a unui set de instrucŃiuni din procedură.
MulŃi producători de sisteme SGBDoferă extensii procedurale ale limbajului SQL de
bază, cum ar fi Oracle PL/SQL (Procedural Language/SQL) sau Microsoft Transact-
SQL, dar reŃineŃi că acestea sunt extensii SQL care formează noi limbaje - codul SQL
pe care-1 conŃin rămâne neprocedural. De asemenea, SQL nu trebuie confundat cu
limbajele orientate spre obiecte, precum Java şi C++.
Simplu spus, SQL este un limbaj neprocedural pentru gestionarea şi
întreŃinerea bazelor de date relaŃionale, nu un limbaj potrivit pentru programarea
generală a aplicaŃiilor, cum ar fi sistemele de prelucrare a comenzilor sau a plăŃilor.
SQL este deseori folosit în combinaŃie cu limbajele procedurale sau orientate
spre obiecte menŃionate anterior pentru a manipula stocarea şi extragerea datelor,
folosind instrucŃiuni din limbajul de programare cu destinaŃie generală pentru alte
sarcini de programare, precum prezentarea datelor pe o pagină web sau furnizarea
răspunsurilor la informaŃiile introduse de utilizatori de la tastatură sau mouse. Atunci
când este necesară interacŃionarea cu baza de date, instrucŃiunile din limbajul
procedural formează instrucŃiunea SQL, o transmit către SGBDîn vederea prelucrării,
primesc rezultatele returnate de SGBDşi le prelucrează într-un mod corespunzător.
Folosind SQL puteŃi transforma întrebări obişnuite :”Din ce oras sunt studentii
notri?” în instrucŃiuni pe care le înŃelege soft-ul pentru baze de date: “SELECT oras
FROM studenti” . Aceste informaŃii se pot extrage din bazele de date prin utilizarea
unui instrument grafic de interogare, dar pe măsură ce ce intrebrile devin mai
complexe, aceste instrumente devin limitate şi greoaie şi acesta este momentul când
intră în acŃiune limbajul SQL.
SQL se poate folosi nu numai pentru interogare, dar şi pentru a adăuga, a
modifica sau a şterge înregistrări din bazele de date.
Majoritatea SGBD-urilor populare, ca de exemplu Microsoft Accsess, Oracle
şi MySQL , asigură suport pentru SQL, chiar dacă acest nivel de suport diferă de la
produs la produs.

Conectarea la baza de date

Atunci când folosiŃi limbajul SQL pe un calculator personal, cu o copie


personală a unui sistem SGBD, precum Microsoft Access sau Oracle Personal
Edition, toate componentele bazei de date rulează pe acelaşi sistem de calcul. Totuşi,
acest aranjament nu este potrivit pentru bazele de date care trebuie să fie folosite în
comun de mai mulŃi utilizatori. Ca urmare, sunt mult mai frecvent întâlnite situaŃiile
în care baza de date este instalată într-un aranjament client/server.
Într-un aranjament client/server:
• Sistemul rulează pe un server, care este un sistem de calcul partajat. Pentru
scopurile acestei definiŃii, un sistem mainframe poate fi considerat un server de
dimensiuni mari.
• Fişierele care compun baza de date din punct de vedere fizic sunt stocate pe
discuri conectate la serverul de baze de date.
• Utilizatorii care au acces la baza de date folosesc staŃii de lucru, numite
clienŃi. Clientul trebuie să aibă o conexiune de reŃea la baza de date, care poate fi o
reŃea privată, instalată acasă sau la birou, ori o reŃea publică, precum Internet.
• Componentele software furnizate de producătorul SGBD rulează pe staŃiile
de lucru alte clienŃilor pentru a oferi utilizatorilor posibihtatea să introducă
instrucŃiuni SQL, să le transmită sistemului SGBD în vederea prelucrării şi sa vadă
rezultatele returnate de DBMS. în general, acest software se numeşte cbent SQL.
ReŃineŃi că nimic nu vă opreşte să instalaŃi clientul SQL pe acelaşi calculator
cu sistemul DBMS. De fapt, mulŃi dezvoltatori care utilizează sisteme SGBD precum
MySQL, Microsoft SQL Server şi Oracle fac în mod obişnuit acest lucru, deoarece
este foarte convenabil să aibă întregul mediu de dezvoltare pe un singur calculator,
cum ar fi un laptop. Totuşi, în momentul în care este necesar accesul partajat al mai
multor utilizatori, este mult mai convenabil şi mai eficient să aveŃi o singură copie a
sistemului SGBD pe un server partajat şi să aveŃi numai clientul SQL instalat pe staŃia
de lucru a fiecărui client.
În funcŃie de interfaŃa cu utilizatorul de pe staŃia de lucru client, clienŃii SQL
sunt clasificaŃi în trei categorii: în linia de comandă, grafici şi bazaŃi pe web. O
interfaŃă în linia de comandă se bazează exclusiv pe intrări şi ieşiri de tip text, cu
comenzile introduse de la tastatură şi răspunsurile afişate ca mesaje de tip text.
Principalul avantaj al interfeŃelor în linia de comandă este că pot fi rulate pe aproape
orice sistem de operare. O interfaŃă grafică cu utilizatorul (GUI - graphical user
interface) rulează sub un tip oarecare de sistem bazat pe ferestre, cum ar fi X Window
System, Mac OS sau Microsoft Windows, şi afişează datele sau opŃiunile comenzilor
folosind elemente grafice, precum pictograme, butoane şi casete de dialog. O interfaŃă
bazată pe web rulează pe serverul de baze de date, folosind un browser web de pe
staŃia de lucru client pentru a interacŃiona cu utilizatorul bazei de date. Din punct de
vedere tehnic, un client SQL bazat pe web nici nu este o aplicaŃie client, deoarece nu
există nici o componentă software specifică producătorului SGBD rulată pe staŃia de
lucru a clientului. Totuşi, aproape întotdeauna există componente furnizate de
producătorul SGBDcare sunt descărcate în fundal de browser-ul web pentru a asista în
procesul de reprezentare grafică a formularelor web folosite pentru introducerea
instrucŃiunilor SQL şi afişarea rezultatelor.
Tabelul următor prezintă clienŃi SQL oferiŃi de diferiŃi producători SGBD . Nu
avem suficient spaŃiu în această carte pentru a prezenta toate detaliile referitoare la
fiecare client SQL pe care aŃi putea să-1 folosiŃi, aşa că vă rog să consultaŃi
documentaŃia producătorului SGBD pentru informaŃii despre instalarea şi utilizarea
clienŃilor SQL disponibile pentru sistemul SGBD pe care-1 folosiŃi.

Producător DBMS 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 staŃia
de lucru a utilizatorului.
Client SQL care rulează ca aplicaŃie în
Microsoft SQL Server iSQL linia de comandă într-un nucleu de
comenzi Microsoft Windows.
Query Client SQL care rulează ca
Microsoft SQL Server
Analyzer aplicaŃie Microsoft Windows.
Client SQL care rulează ca
aplicaŃie în linia de comandă
sub diferite sisteme de operare,
MySQL MySQL MySQL
inclusiv Microsoft Windows,
Linux, Mac OS X şi diferite
implementări Unix.
Client SQL bazat pe web -
Oracle Oracle iSQL*Plus acceptat în versiunile Oracle 9i
si mai noi.
Client SQL care rulează ca
aplicaŃie Microsoft Windows sau
ca aplicaŃie în linia de comandă
Oracle Oracle SQL*Plus sub diferite sisteme de operare,
inclusiv Microsoft Windows,
Linux, Mac OS X, diferite
implementări Unix şi altele.
Client SQL scris în Java -
SQL disponibil în Oracle 8i şi 9i, dar
Oracle Oracle
Worksheet înlocuit de iSQL*Plus în Oracle
10g.
Clientul SQL care rulează ca
aplicaŃie în linia de comandă
într-un nucleu de comenzi
Microsoft Windows. Asemănările
Sybase Sybase iSQL cu Microsoft SQL Server nu
sunt întâmplătoare - primele
versiuni Microsoft SQL Server
erau bazate pe sistemul
SGBDSybase.

Un scurt istoric al limbajului SQL

Către sfârşitul anilor '70, un grup de cercetători de la IBM au dezvoltat o bază


de date relaŃională, numită System/R, bazată pe lucrările Dr. E. F. Codd. în System/R a
fost inclus un limbaj, numit SEQUEL (Structured English Query Language), pentru
manipularea şi extragerea datelor. Acronimul „SEQUEL" a fost ulterior condensat în
abrevierea „SQL", atunci când s-a descoperit că „SEQUEL" era marcă înregistrată a
companiei Hawker-Siddeley Aircraft din Marea Britanie.
Deşi IBM a creat prima implementare SQL, două alte produse, cu nume
diferite pentru limbajele de interogare, au fost lansate pe piaŃă ca primele produse
pentru baze de date relaŃionale, Oracle, furnizat de Relational Software, şi INGRES,
furnizat de Relational Technology. IBM a lansat în 1982 produsul SQL/DS, cu
limbajul de interogare numit acum SQL (Structured Query Language). Dacă
programarea structurată era expresia la modă în anii '80, cuvântul „structured" din
SQL nu avea nici o legătură cu programarea structurată, deoarece SQL nu este un
limbaj de programare procedural.
Comitetele de standardizare a limbajului SQL au fost formate de ANSI
(American National Standards Institute) în 1986 şi ISO (International Organization
for Standardization) în 1987. Din fericire, comitetele create de cele două organizaŃii
au colaborat pentru dezvoltarea unui standard SQL comun, la nivel mondial. Doi ani
mai târziu, au fost publicate primele specificaŃii ale standardului, numite SQL-89.
După trei ani, specificaŃiile originale au fost extinse, sub forma standardului SQL-92,
care avea aproximativ 600 de pagini. A treia generaŃie a fost numită SQL-99 sau
SQL3. Cele mai multe produse SGBDsunt construite pe baza standardului SQL-92
(numit acum SQL2). SQL3 include multe caracteristici obiectuale, necesare pentru
folosirea limbajului SQL cu o bază de date relaŃională orientată spre obiecte, precum
şi extensii de limbaj care fac din SQL un limbaj de programare complet (adăugând
cicluri, ramificări şi construcŃii de comutare, de tip case). Cea mai recentă generaŃie,
numită SQL:2003, introduce caracteristici legate de XML şi alte îmbunătăŃiri. Aceste
standarde nu sunt gratuite. Standardul SQL:2003 poate fi cumpărat de la ISO
(www.iso.org) sau ANSI (webstore.ansi.org). Pentru cei care au un buget mai
restrâns, este disponibilă o versiune apropiată de cea finală la Whitemarsh
Information Systems Corporation (www.wiscorp.com/SQLStandards.html). Aproape
toŃi furnizorii au adăugat extensii la „dialectul" SQL propriu, în parte deoarece doreau
să diferenŃieze produsele proprii şi în parte deoarece cerinŃele pieŃei îi forŃau să
implementeze caracteristici înainte a apărea standarde pentru acestea.
Un astfel de exemplu este acceptarea tipurilor de date TIMESTAMP şi DATE.
Datele calendaristici sunt foarte importante pentru prelucrarea datelor comerciale, dar
dezvoltatorii produselor SGBD originale erau academicieni şi oameni de ştiinŃă, nu
specialişti în prelucrări comerciale, aşa că această cerinŃă nu a fost anticipată. Ca
rezultat, primele dialecte SQL nu asigurau un suport special pentru datele
calendaristice. Pe măsură ce au apărut produsele comerciale, furnizorii au răspuns
cererilor lansate de clienŃii importanŃi şi au adăugat în grabă suportul pentru date
calendaristice. Din nefericire, din cauza grabei fiecare a făcut-o în felul propriu. Ori
de câte ori migraŃi instrucŃiuni SQL de la produsul unui furnizor la altul, ŃineŃi seama
de diferenŃele dintre dialecte. Codul SQL este foarte compatibil şi portabil între
produsele diferiŃilor furnizori, dar sistemele complete de baze de date pot fi rareori
transferate fară anumite ajustări.

ConvenŃii de sintaxă SQL

Această secŃiune prezintă convenŃiile generale de sintaxă folosite pentru


construia instrucŃiunilor SQL. Totuşi, reŃineŃi că există o mulŃime de extensii şi
variaŃii între diferiŃii producători. Pentru simplitate, termenul implementare este
folosit pentru referirea fiecărei versiuni SQL a fiecărui producător (cu alte cuvinte,
Oracle 9i, Oracle 10g, Microsoft SQL Server 7, Microsoft SQL Server 2000 şi
Microsoft SQL Server 2005 conŃin implementări diferite ale limbajului SQL).
ConvenŃiile de sintaxă SQL sunt mai uşor de înŃeles folosind un exemplu
simplu InstrucŃiunea de mai jos returnează valorile Movie ID şi Movie Title pentru
toate filmele din magazinul de produse video pentru care categoria MPAA este „PG":
SELECT FILM_ID, TITLU_FILM
FROM FILM
WHERE MPAA_RATING_COD = 'PG';
ConvenŃiile de bază sunt următoarele:
• Fiecare instrucŃiune începe cu o comandă, de obicei sub forma unui singur
cuvânt, care aproape întotdeauna este un verb (în limba engleză) care descrie o
acŃiune. în acest exemplu, instrucŃiunea începe cu comanda SELECT, care este
descrisă în detaliu în lecŃia 3.
• Fiecare instrucŃiune se termină cu un delimitator, care este, de obicei, un
caracter punct şi virgulă (;). Unele implementări permit schimbarea delimitatorului cu
un alt caracter. Mai mult, unele implementări, cum ar fi cea din Oracle, nu execută o
instrucŃiune SQL căreia-i lipseşte delimitatorul de sfârşit, în timp ce alte implementări
consideră acest delimitator opŃional.
• InstrucŃiunile sunt construite într-o manieră similară cu propoziŃiile din limba
engleză, cu unul sau mai multe spaŃii pentru separarea elementelor de limbaj. Un
element de limbaj, asemănător cu un cuvânt dintr-o propoziŃie, poate fi un cuvânt
cheie (SELECT, FROM, WHERE), numele unui obiect al bazei de date (FILM,
FILM_ID, TITLU_FILM), un operator (=) sau o constantă ('PG') care apare într-o
instrucŃiune.
• InstrucŃiunile sunt scrise într-o formă liberă, ceea ce înseamnă că nu există
reguli stricte privind poziŃia elementelor de limbaj pe o linie sau locul în care se poate
face trecerea la o linie nouă. Totuşi, în general nu este o idee bună să împărŃiŃi un
element de limbaj pe mai multe linii. Din punct de vedere logic, instrucŃiunea de mai
jos este identică cu cea prezentată la începutul acestei secŃiuni, dar nu este la fel de
uşor de citit şi de înŃeles:
SELECT FILM_ID, TITLU_FILM FROM FILM WHERE
MPAA_RATING_COD ='PG';

• InstrucŃiunile sunt organizate într-o serie de clauze şi, de obicei, clauzele


trebuie să apară într-o anumită ordine atunci când sunt folosite (multe clauze sunt
opŃionale). în exemplul nostru, există trei clauze, fiecare începând cu un cuvânt cheie
(SELECT, FROM, WHERE).
• Elementele de limbaj SQL pot fi scrise cu litere mari, cu litere mici sau în
combinaŃii. Totuşi, în majoritatea implementărilor şi în conformitate cu standardele
ANSI/ISO, toate minusculele sunt transformate în majuscule în vederea prelucrării.
Aceasta nu înseamnă că datele nu pot conŃine litere mici, ci că numele obiectelor din
baza de date (tabele, coloane etc.) şi comenzile trebuie să fie scrise cu litere mari.
ExcepŃii notabile sunt Microsoft SQL Server şi Sybase, care permit modul de lucru cu
diferenŃierea literelor mari de cele mici, caz în care numele de obiecte scrise diferit
sunt tratate ca nume diferite. în MySQL, diferenŃierea literelor mari de cele mici în
numele obiectelor este legată de capacitatea sistemului de operare de a face această
diferenŃiere.
• Virgulele sunt folosite pentru separarea articolelor dintr-o listă. în exemplul
nostru, numele a două coloane sunt specificate într-o listă separată prin virgule
(FILM_ID, TITLU_FILM). SpaŃiile care urmează după virgule sunt opŃionale - puteŃi
adăuga orice număr de spaŃii, inclusiv zero.
• Şirurile de caractere care apar în instrucŃiunile SQL trebuie să fie încadrate
cu apostrofuri (unele implementări SQL permit şi folosirea ghilimelelor). Constantele
numerice nu sunt niciodată încadrate cu apostrofuri. Dacă în şirul de caractere trebuie
să apară un caracter apostrof, sunt inserate două apostrofuri unul lângă celălalt. De
exemplu, dacă vreŃi să găsiŃi în baza de date un film numit Sophie's Choice, veŃi scrie
clauza WHERE astfel:
WHERE TITLU_FILM = 'Sophie''s Choice'
• Numele obiectelor bazei de date sunt formate folosind numai litere, cifre şi
liniuŃe de subliniere. Caracterul underscore (liniuŃa de subliniere) este folosit, de
obicei, ca separator între cuvinte, pentru îmbunătăŃirea lizibilităŃii. Aşa cum am
menŃionat anterior, unele implementări permit folosirea numelor care fac diferenŃa
între literele mari şi cele mici, cum ar fi PersonMiddleName, un stil numit deseori
„scriere de tip cămilă", dar acest stil nu este recomandabil dacă doriŃi ca instrucŃiunile
SQL să fie portabile pe alte implementări. în definitiv, un nume precum
„PERSONMIDDLENAME" nu este foarte uşor de citit.
• In fiecare implementare SQL este definit un set de cuvinte rezervate, care
sunt cuvinte cu o semnificaŃie specifică pentru procesorul SQL al sistemului SGBD şi,
care urmare, nu trebuie folosite într-un alt context - de exemplu ca nume pentru
obiectele bazei de date. Scopul acestei restricŃii este de a evita interpretarea greşită a
instrucŃiunilor SQL de către SGBD. Aşa cum probabil bănuiŃi, lista cuvintelor
rezervate diferă semnificativ de la o implementare SQL la alta, aşa că este bine să
consultaŃi documentaŃia implementării pe care o folosiŃi pentru a vă familiariza cu
aceste cuvinte.
• Un comentariu pe o singură linie începe cu două liniuŃe de despărŃire (--).
Cele două liniuŃe se pot afla la începutul unei linii, ceea ce înseamnă că întreaga linie
este considerată comentariu, sau oriunde în cadrul liniei, caz în care restul liniei, până
la sfârşit, este considerat comentariu. De exemplu:
-- Acesta este un comentariu pe o singură linie în SQL.
• Un comentariu pe mai multe linii începe cu combinaŃia dintre o diagonală la
dreapta (slash) şi un asterisc (/*) şi continuă până la întâlnirea combinaŃiei invers (*/).
AveŃi grijă să terminaŃi corect comentariile, altfel multe linii SQL pe care le-aŃi scris
vor fi tratate de către SGBDca şi cum ar fi comentarii. Iată un exemplu de comentariu
pe mai multe linii:
/* Acesta este un comentariu pe mai multe linii.
Continuă până la întâlnirea combinaŃiei de caractere care marchează sfârşitul
comentariului. */

Categorii de instrucŃiuni SQL


InstrucŃiunile SQL sunt împărŃite în categorii, după funcŃiile pe care le
îndeplinesc. Unii experŃi consideră aceste categorii ca fiind limbaje separate sau
sublimbaje. Totuşi, în SQL acestea au aceeaşi sintaxă de bază şi respectă aceleaşi
reguli, aşa că eu le consider categorii de instrucŃiuni din acelaşi limbaj.
Categoriile de instrucŃiuni, descrise în secŃiunile următoare, sunt:
• Limbajul de definire a datelor (DDL - Data Definition Language)
• Limbajul de interogare a datelor (DQL - Data Query Language)
• Limbajul de manipulare a datelor (DML - Data Manipulation Language)
• Limbajul pentru controlul datelor (DCL - Data Control Language)
• Comenzile pentru controlul tranzacŃiilor (Transaction Control Commands)

Limbajul de definire a datelor (DDL)


Limbajul de definire a datelor (DDL - Data Definition Language) include
instrucŃiuni SQL care permit utilizatorului bazei de date să creeze şi să modifice
structura obiectelor bazei de date, cum ar fi tabele, vizualizări şi indexuri.
InstrucŃiunile SQL care folosesc comenzile CREATE, ALTER şi DROP sunt
considerate parte a DDL. Este important să înŃelegeŃi că instrucŃiunile DDL afectează
containerele care stochează datele în baza de date, nu datele propriu-zise. Ca urmare,
există instrucŃiuni DDL pentru crearea, ştergerea şi modificarea tabelelor, dar nici una
dintre aceste instrucŃiuni nu oferă posibilitatea de a crea sau modifica rânduri de date
din tabelele respective. InstrucŃiunile DDL sunt prezentate în capitolul 3.
Limbajul de interogare a datelor (DQL)

Limbajul de interogare a datelor (DQL - Data Query Language) include


instrucŃiuni SQL care permit obŃinerea datelor din baza de date. Deşi reprezintă o
parte foarte importantă a limbajului SQL, DQL este format din instrucŃiuni care
folosesc o singură comandă: SELECT. Unii furnizori şi autori clasifică instrucŃiunile
DQL şi DML în aceeaşi categorie.

Limbajul de manipulare a datelor (DML)

Limbajul de manipulare a datelor (DML - Data Manipulation Language)


include instrucŃiuni SQL care permit utilizatorului bazei de date să adauge date în
baza de date (sub forma rândurilor din tabele), să şteargă date şi să modifice datele
existente în baza de date. InstrucŃiunile SQL care folosesc comenzile INSERT,
UPDATE şi DELETE sunt considerate parte a DML.

Limbajul pentru controlul datelor (DCL)

Limbajul pentru controlul datelor (DCL – Data Control Language) include


instrucŃiuni SQL care permit administratorilor să controleze accesul la datele din baza
de date şi folosirea diferitelor privilegii ale sistemului DBMS, cum ar fi privilegiul de
oprire şi pornire a bazei de date. InstrucŃiunile SQL care folosesc comenzile GRANT
si ALTER sunt considerate parte a DCL.

Comenzile pentru controlul tranzacŃiilor


O tranzacŃie în baza de date este un set de comenzi pe care utilizatorul bazei
de date vrea sa le trateze ca pe o unitate funcŃionala de tip „totul sau nimic”,
întelegând prin aceasta că intreaga tranzactie trebuie sa reuseasca sau sa esueze.
Comenzile pentru cotrolul tranzacŃiilor (Transaction Control Commands ) nu respectă
cu exactitate sintaxa instrucŃiunilor SQL , dar afecteaza puternic comportamentul
instructiuunilor SQL incluse în tranzacŃii.

Întrebări
AlegeŃi răspunsurile corecte pentru fiecare din următoarele întrebări cu
răspunsuri multiple. Întrebările pot avea mai multe răspunsuri corecte.

1. SQL este
a. Un limbaj orientat spre obiecte
b. Un limbaj procedural
c. Un limbaj nonprocedural
d. Un limbaj declarativ
e. Un limbaj standard

2. Într-un aranjament client/server


a. Componentele software DBMS ruleaza pe server
b. Componentele software DBMS ruleaza pe client
c. Componentele software ale clientului SQL ruleaza pe client
d. Componentele software ale clientului SQL ruleaza pe server
3. Un client SQL in linia de comanda
a. Necesita un sistem bazat pe ferestre
b. Ruleaza pe o mare varietate de platforme client.
c. Necesita un browser web pe client.
d. Afişează datele şi opŃiunile de comandă folosind caracteristici grafice
e. Afişează răspunsurile la comenzi sub formă de mesaje de tip text

4. Un client SQL cu interfata grafica (GUI)


a. Necesita un sistem bazat pe ferestre
b. Ruleaza pe o mare varietate de platforme client.
c. Necesita un browser web pe client.
d. Afişează datele şi opŃiunile de comandă folosind caracteristici grafice
e. Afişează răspunsurile la comenzi sub formă de mesaje de tip text

5. Un client SQL bazat pe web


a. Necesita un sistem bazat pe ferestre
b. Ruleaza pe o mare varietate de platforme client.
c. Necesita un browser web pe client.
d. Afişează datele şi opŃiunile de comandă folosind caracteristici grafice
e. Afişează răspunsurile la comenzi sub formă de mesaje de tip text

6. ClienŃii SQL oferiŃi de Oracle sunt


a. iSQL
b. Query Analyzer
c. iSQL*Plus
d. SQL*Plus
e. SQLWorksheet

7. ClienŃii SQL oferiŃi de Microsoft sunt


a. iSQL
b. Query Analyzer
c. iSQL*Plus
d. SQL*Plus
e. SQLWorksheet

8. Extensiile SQL create de furnizori


a. Cresc portabilitatea codului SQL
b. Scad portabilitatea codului SQL
c. Contribuie la diferenŃierea produselor oferire de diferiŃi producători
d. Au fost bazate pe cererile pieŃei
e. Sunt compatibile între implementările diferiŃilor producători

9. InstrucŃiunile SQL
a. încep cu un cuvânt cheie reprezentând o comandă
b. Se termină cu un cuvânt cheie reprezentând o comandă
c. încep cu un delimitator, cum ar fi caracterul punct şi virgulă
d. Se termină un delimitator, cum ar fi caracterul punct şi virgulă
e. încep cu o paranteză deschisă
10. Elementele limbajului SQL includ
a. Cuvinte cheie
b. Nume ale obiectelor din baza de date
c. Operatori
d. RestricŃii
e. Constante

11. Elementele limbajului SQL sunt separate prin


a. Virgule
b. Exact un spaŃiu
c. Unul sau mai multe spaŃii
d. Linie nouă
e. LiniuŃe de subliniere

12. Numele obiectelor bazei de date pot include


a. Paranteze
b. LiniuŃe de subliniere
c. Numere
d. Litere
e. Virgule
13. InstrucŃiunile SQL pot li împărŃite în următoarele categorii
a. Limbajul dc definire a datelor (DDI, - Data Definition Language)
b. Limbajul dc selectare a datelor (DSL - Dala Selection Language)
c. Limbajul dc replicare a datelor (DRL - Dala Replication Language)
d. Limbajul pentru controlul datelor (DCL - Data Control Language)
e. Limbajul dc manipulare a datelor (DML - Data Manipulation Language)

14. Limbajul de definire a datelor (DDL - Data Definition Language) include


următoarele instrucŃiuni:
a. SELECT
b. INSERT
c. CREATE
d. ALTER
e. DELETE

15. Limbajul de interogare a datelor (DQL - Data Query Language) include


următoarele instrucŃiuni:
a. SELECT
b. INSERT
c. CREATE
d. UPDATE
e. DELETE
16. Limbajul de manipulare a datelor (DML - Data Manipulation Language)
include următoarele instrucŃiuni:
a. SELECT
b. INSERT
c. CREATE
d. UPDATE
e. DELETE
LECłIA 2. Limbajul de definire a datelor - DDL

Se vor prezenta în continuare instrucŃiunile SQL folosite pentru definirea şi


gestionarea obiectelor dintr-o bază de date relaŃională. InstrucŃiunile CREATE,
ALTER şi DROP formează o categorie a limbajului SQL numită limbaj de definire a
datelor (DDL– Data Definition Language).
Se prezintă DDL înaintea DQL, DML deoarece trebuiesc create
obiectele bazei de date înainte de a insera date în baza de date.

ConvenŃii de sintaxă

InstrucŃiunile SQL DDL au mai multe opŃiuni decât alte instrucŃiuni SQL.
Următoarele convenŃii sunt pentru a prezenta sintaxa instrucŃiunilor DDL:
Cuvintele cheie şi cuvintele rezervate din SQL sunt scrise cu majuscule, cum
ar fi CREATE TABLE.
InformaŃiile pe care ar trebui să fie furnizate la scrierea instrucŃiunilor sunt
scrise cu italic, cum ar fi nume_coloană.
Elementele opŃionale sunt încadrate în paranteze pătrate, cum ar fi [WITH
TIME ZONE].
OpŃiunile dintr-o listă de elemente posibile sunt separate de o bară verticală
(simbolul logic pentru „sau"), cum ar fi TABLE | VIEW | INDEX. Se pot întâlni
uneori ca listă de elemente opŃionale, cum ar fi [NULL | NOT NULL].
Elementele de grup care sunt explicate sau analizate ulterior pe componente
(de obicei după descrierea unui tip principal de instrucŃiune) sunt încadrate de
caracterele „mai mic decât" şi „mai mare decât", cum ar fi
<specificaŃii_pentru_coloană>.
Un element care se poate repeta este urmat de trei puncte, cum ar fi.
[,<restricŃie_pentru_tabel>...].
Toate celelalte simboluri, în special virgulele şi parantezele, fac parte din
sintaxa SQL obligatorie şi, ca urmare, trebuie să fie incluse aşa cum sunt scrise aici.

Tipuri de date

O coloană este cea mai mică unitate denumită care poate fi referită într-o bază
de date relaŃională. Fiecare, coloană trebuie să aibă asociate un nume unic şi un tip de
date. Un tip de date este o categorie pentru formatul folosit de o anumită coloană.
Tipurile de date asigură câteva avantaje importante:
RestricŃionarea, datelor din coloana respectivă la caracterele care au sens
pentru tipul de date specificat.
Asigurarea unor comportamente utile pentru utilizatorul datelor. De exemplu,
dacă se scade un număr dintr-un alt număr, se obŃine ca rezultat un număr; dar dacă se
scade o dată dintr-o altă dată, se obŃine ca rezultat diferenŃa în zile dintre cele două
date calendaristice.
Creşterea eficienŃei sistemului SGBD la stocarea datelor din coloane.

SQL acceptă trei categorii de tipuri de date: tipuri predefinite, tipuri construite
şi tipuri definite de utilizator.
Tipurile de date predefinite sunt cele furnizate de către producător ca parte
nativă a sistemului SGBD(vor fi tratate în continuare).
Tipurile de date construite, cunoscute şi ca tipuri de colecŃii, conŃin matrice
sau seturi de tipuri de date predefinite, în scopul reprezentării în SGBD a
construcŃiilor de date orientate spre obiect.
Tipurile de date definite de utilizator permit utilizatorului bazei de date să
definească propriile tipuri de date, adaptate unor scopuri specifice.
Ultimele două tipuri de date nu vor fi tratate , fiind prea complicate
pentru intenŃiile cursului.

Tipuri de date predefinite din standardul SQL:2003


Se vor prezenta fiecare tip de date în secŃiuni separate, pentru evitarea
confuziilor.
Tipuri de date pentru caractere
Tipurile de date pentru caractere conŃin şiruri de caractere, adică litere,
cifre şi alte simboluri permise de sistemul de calcul pe care se află baza de date.
Tipurile de date stardard pentru caractere sunt:
Caracter cu lungime fixă - Un şir de caractere cu lungime finită. Sintaxa
SQL este:
CHARACTER(lungime) | CHAR(lungime)
Exemplu: NUMAR_SECURITATE CHAR(9)
Caracter naŃional - Acest tip de date poate fi folosit pentru traducerea
şirurilor de caractere în diferite limbi. Sintaxa SQL este:
NATIONAL CHARACTER(lungime) | NCHAR(lungime)
Exemplu: TITLU_FILM NCHAR(100)
Caracter variabil - Un şir de caractere cu lungime variabilă, specificând
lungimea maximă a şirurilor de caractere stocate. Sintaxa SQL este:
CHARACTER VARYING(lungime_maximă) |
VARCHAR(lungime_maximă)
Exemplu: NUME_CLIENT VARCHAR(125)
Caracter naŃional variabil – O variantă a tipului de date pentru şiruri de
caractere cu lungime variabilă, stocata într-un set de caractere al unei anumite limbi.
Sintaxa SQL este:
NATIONAL CHARACTER VARYING( l u n g i m e _ m a x i m ă ) |
NVARCHAR (lungime_maximă)
Exemplu: TITLU_FILM NVARCHAR(100)

Tipuri de date numerice

Acestea sunt utile mai ales pentru atributele folosite în calcule. Toate tipurile
numerice au o precizie (un număr de cifre). De asemenea unele tipuri numerice au şi o
scală (numărul de cifre aflate în dreapta punctului zecimal). Tipurile întregi şi tipurile
numerice care include o scală sunt numite numerice exacte, în timp ce numerele reale
care nu include o scală (numerele cu virgulă mobilă) sunt numite numerice
aproximative.
Tipurile numerice standard sunt:
Numeric - Un tip numeric exact care include o precizie şi o scalã.
Sintaxa SQL este:
NUMERIC (precizie, scală)
Exemplu: PLATA_PE_ORA_ANGAJAT NUMERIC(5,2)
Zecima1 - Un tip numeric exact care include o precizie şi o scală.
Sintaxa SQL este:
DECIMAL(precizie, scală)
Exemplu: PLATA_PE_ORA_ANGAJAT DECIMAL(5,2)
Întreg - Un tip numeric exact care include numai precizia, scris INTEGER sau
INT. Numerele întregi nu au cifre zecimale, aşa că scala nu este necesară, deoarece
este întotdeauna zero. Sintaxa SQL este:
INTEGER (precizie) | INT (precizie)
Exemplu: ID_CONT_CLIENT INTEGER
Întreg mic - O variantă a tipului INTEGER, scrisă SMALLINT, care
stochează numere mai mici şi, ca urmare, ocupă mai puŃin spaŃiu.
Sintaxa SQL este:
SMALLINT (precizie)
Exemplu: ID_CONT_CLIENT SMALLINT
Întreg mare - O variantă a tipului INTEGER, scrisă BIGINT, care stocheză
numere mai mari şi ocupă mai mult spaŃiu. Sintaxa SQL este:
BIGINT (precizie)
Exemplu: ID_CONT_CLIENT BIGINT
Număr în virgulă mobilă - Un tip numeric aproximativ, cu precizia mai mare
sau egală cu precizia specificată. Specificarea preciziei este opŃională. Este scrisă
FLOAT. Sintaxa SQL este:
FLOAT (precizie)
Exemple: RATA_DOBANDA FLOAT(16)
RATA_DOBANDA FLOAT
Număr real - Un tip numeric aproximativ, cu precizie definită de
implementare. Sintaxa SQL este:
REAL
Exemplu: RATA_DOBANDA REAL
Număr real cu precizie dublă - Un tip numeric aproximativ, cu precizie
definită de implementare, dar mai mare sau egală cu precizia definită pentru
tipul REAL. Sintaxa SQL este:
DOUBLE PRECISION | DOUBLE
Exemplu: RATA_DOBANDA DOUBLE PRECISION

Tipuri de date temporale


Aceste tipuri (numite şi tipuri pentru date şi ore) stochează date care
măsoară timpul, într-un mod oarecare.
Tipurile de date temporale conŃin următoarele componente, numite de
standard, câmpuri (fields) :
Numele câmpului (cuvânt cheie
DefiniŃie
SQL)
Anul calendaristic, pe două sau
YEAR
patru cifre
MONTH Luna din an
DAY Ziua din lună
HOUR Ora din zi
MINUTE Minutul din oră
SECOND Secunda din minut
Valoarea orei cu diferenŃa de
TIMEZONE_HOUR
fus orar
Valoarea minutului cu diferenŃa
TIMEZONE_MINUTE
de fus orar
Câmpurile TIMEZONE_HOUR şi TIMEZONE_MINUTE sunt incluse în
toate tipurile de date temporale pentru care este specificat cuvântul cheie WITH
TIMEZONE.
Tipurile de date temporale sunt:
Data - O dată calendaristică, incluzând câmpurile YEAR, MONTH şi DAY.
Sintaxa SQL este:
DATE [WITH TIMEZONE]
Exemplu: DATA_INSCRISA DATE
Ora - Un tip de date pentru oră, incluzând câmpurile HOUR, MINUTE şi
SECOND. Sintaxa SQL este:
TIME [WITH TIMEZONE]
Exemplu: TIMPUL_INSCRIS TIME
Marcă temporală - Un tip de date combinat pentru dată şi oră, incluzând
câmpurile YEAR, MONTH, DAY, HOUR, MINUTE şi SECOND. Sintaxa SQL este:
TIMESTAMP [WITH TIMEZONE]
Exemplu: DATA_TIMP_ INSCRIS TIMESTAMP
Interval - Un interval de timp, incluzând câmpurile specificate printr-un
calificator de interval (internal qualifier), care reprezintă precizia intervalului.
Sintaxa SQL este:
INTERVAL câmp_de_start TO câmp_de_sfârşit|INTERVAL câmp
Exemple: TIMP_LUCRU INTERVAL HOUR TO MINUTE
ZILE_INCHIRIERE INTERVAL DAY

Tipuri de date pentru obiecte mari


Obiectele mari permit stocarea unor date care depăşesc cu mult posibilităŃile
de stocare ale tipurilor de date prezentate până acum, ajungând deseori la
dimensiuni de câŃiva megaocteŃi. Deoarece manipularea obiectelor mari este
un subiect avansat, care nu vace obiectul cursului, se vor prezenta aceste tipuri
fără sintaxa lor.
Obiect mare pentru caractere - Un obiect mare pentru caractere, scris în SQL
sub foma CLOB.
Obiect mare pentru caractere, în format naŃional - Un obiect mare pentru
caractere, stocat într-o anumită limbă, scris în SQL sub forma NLOB.
Obiect mare binar - Un obiect mare care conŃine date binare, cum ar fi o
imagine sau o secvenŃă sonoră, scris în SQL sub forma BLOB.

Un alt tip de date


Există un tip standard de date care nu este încadrat în nici una dintre
categoriile prezentate anterior:
Boolean - Stochează o valoare logică adevărat sau fals. Sintaxa SQL este:
BOOLEAN
Exemplu: CLIENT_PREFERAT BOOLEAN

Extensii pentru tipuri de date şi diferenŃe faŃă de standard

Microsoft Access

Microsoft Access este baza de date care respectă în cea mai mică măsură
standardul, din toate sistemelm SGBD frecvent folosite.
Tipurile de date acceptate de Microsoft Access sunt:
Text - Echivalent cu tipul de date standard VARCHAR. Poate stoca până la
255 de caractere.
Memo - ConŃine şiruri cu cel mult 65535 de caractere, dar este definit fără
specificarea unei dimensiuni.
Number - Echivalent cu tipul de date standard NUMERIC, dar precizia şi
scala sunt stabilite folosind meniul derulant Field Size (Mărimea câmpului).
Numerele întregi pot fi definite alegând valoarea zero (0) pentru parametrul Decimal
Places (PoziŃii zecimale).
Date/Time - Aproximativ echivalent cu tipul de date standard TIMESTAMP,
dar poate stoca orice date şi oră valide între anii 100 şi 9999.
Currency - Un tip de date numeric echivalent cu tipul NUMERIC (19,4),
adică un număr cu 15 cifre în stânga punctului zecimal şi cel mult 4 cifre în dreapta
punctului zecimal.
AutoNumber - Un câmp pe 4 sau 16 octeŃi (în funcŃie de valoarea Field Size)
incrementat automat cu o unitate de fiecare dată când în tabel este inserat un nou rând.
Yes/No - Aproximativ echivalent cu tipul de date standard BOOLEAN.
Totuşi, Microsoft Access permite ca acest tip de date să fie formatat ca Yes/No,
On/Off sau True/False.
OLE Object - Similar cu tipul de date standard BLOB, acest tip de date
permite stocarea unui obiect Microsoft OLE cu dimensiunea maximă de 1GB
(gigaoctet).
Hyperlink Un tip de date specializat care poate conŃine o adresă web din
Internet.
Lookup wizard - Un tip de date specializat care creează o legătură între o
coloană din tabelul curent şi conŃinutul unei coloane dintr-un alt tabel. Acest tip de
date poate fi folosit pentru legarea dinamică a tabelelor la crearea formularelor în
Microsoft Access.

Oracle

Oracle SQL acceptă următoarele 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ă, conŃinând cel mult 2000 de
octeŃi.
CLOB - Obiecte de tip caracter mari, cu dimensiunea maximă de (4GB- 1) x
(dimensiunea unui bloc din baza de date).
DATE - FuncŃionează ca tipul standard de date DATE, dar din punct de vedere
tehnic seamănă mai mult cu tipul DATETIME, deoarece poate stoca atât data, cât şi
ora. Acceptă date de la 1 ianuarie 4712 î.e.n. la 31 decembrie 9999 e.n.
OpŃional, poate fi inclusă şi ora, în ore, minute şi secunde. Dacă partea opŃională este
omisă, este stocată cu valoarea zero, echivalentă cu miezul nopŃii.
DECIMAL - Implementat ca NUMBER(precizie,scală).
DOUBLE PRECISION - Implementat ca NUMBER.
FLOAT - Implementat ca NUMBER.
INTEGER - Implementat ca NUMBER(38).
INTERVAL - Un interval de timp, dar sunt acceptate din standard numai
variantele INTERVAL YEAR TO MONTH şi INTERVAL DAY TO SECOND.
NCHAR - Şiruri de caractere cu lungime fixă într-o limbă naŃională, cu
dimensiunea maximă de 2000 de octeŃi.
NCLOB - Şiruri de caractere cu lungime fixă într-o limbă naŃională, cu
dimensiunea maximă de (4GB-1) x (dimensiunea unui bloc din baza de date).
NUMERIC - Implementat NUMBER(precizie,scală).
NVARCHAR - Date de tip caracter cu lungime variabilă într-o limbă
naŃională, cu dimensiunea maximă de 4000 de octeŃi .
REAL - Implementat ca NUMBER.
SMALLINT - Implementat ca NUMBER(38).
TIMESTAMP - Data şi ora în ani, luni, zile, ore, minute şi secunde.
VARCHAR - Date de tip caracter cu lungime variabilă, conŃinând cel mult
4000 de caractere.
Oracle oferă următoarele extensii la tipurile de date standard:
BFILE - O valoare de localizare a unui fişier binar de dimensiuni mari, stocat
în afara bazei de date.
LONG - Date de tip caracter cu lungime variabilă, cu dimensiunea maximă
de 2GB.
LONG RAW - Date binare, cu dimensiunea maximă de 2GB.
NUMBER - Date numerice, cu cel mult 38 de cifre. Poate stoca valori întregi
sau în virgulă mobilă.
NVARCHAR2 - Identic cu NVARCHAR.
RAW - Date binare, cu dimensiunea maximă de 2000 de octeli.
ROWID - Şir de caractere codat Base 64*, reprezentând adresa unică a unui
rând în tabelul din care face parte.
UROWID - Şir de caractere codat Base 64, reprezentând adresa logică a
unui rând într-un tabel indexat.
VARCHAR2 - Identic cu VARCHAR, dar Oracle recomandă folosirea
folosirea acestui tip în loc de VARCHAR, deoarece Oracle e posibil să schimbe la un
moment dat implementarea tipului VARCHAR.

Valori NULL şi logica bazată pe trei valori

La definirea coloanelor din tabelele bazei de date, se află opŃiunea de a


specifica dacă valorile nule (null) sunt permise în coloana respectivă. O valoare nulă
într-o bază de date relaŃională este un cod special care poate fi plasat pe o
coloană pentru a indica faptul că valoarea pentru coloana respectivă nu este
cunoscută. O valoare nulă nu este ace1aşi lucru cu un spaŃiu, un şir vid sau
valoarea zero – este un cod special care nu are nici o altă semnificaŃie în baza de
date.
În Microsoft Access, restricŃia NOT NULL este controlată de opŃiunea
Required din panoul de proiectare a tabelului. În SQL DDL, se specifică cuvintele
cheie NULL sau NOT NULL, în definiŃia coloanei (în dreapta tipului de date al
coloanei). În Oracle, DB2 şi majoritatea celorlalte baze de date relaŃionale, dacă se
omite specificarea acestei restricŃii, valoarea prestabilită este NULL, ceea ce înseamnă
că în coloana respectivă sunt valori nule. Pe de altă parte, în Microsoft SQL Server şi
Sybase Adaptive Server este exact invers: dacă se omite specificarea acestei
restricŃii, valoarea prestabi1ită este NOT NULL, ceea ce înseamnă ca în coloana
respectivă nu pot fi valori nule.
InstrucŃiuni DDL (Data Definition Language)

InstrucŃiunile DDL (Data Definition Language) definesc obiectele bazei de


date, dar nu inserează şi nu actualizează date în obiectele respective. În SQL, există
trei comenzi de bază pentru instrucŃiunile DDL:
CREATE - Creează în baza de date un nou obiect, de tipul specificat în
instrucŃiune : CREATE DATABASE, CREATE TABLE, CREATE INDEX şi
CREATE VIEW.
ALTER - Modifică definiŃia unui obiect existent în baza de date, de tipul
specificat în instrucŃiune : ALTER TABLE, ALTER DATABASE, ALTER
SYSTEM, ALTER USER, ALTER SESSION.
D R O P - Şterge (distruge) un obiect existent în baza de date, de tipul
specificat în instrucŃiune.

InstrucŃiunea CREATE DATABASE

Definirea unei baze de date diferă destul de mult de la o implementare


la alta. Sintaxa generală pentru instrucŃiunea CREATE DATABASE este:
CREATE DATABASE nume bazadedate [opŃiuni_specifice _producătorul]
În Oracle, instrucŃiunea CREATE USERcreazăîn baza de date o schemă, cere
este aproximativ echivalentă cu o bază de date.
Standardul SQL prevede şi o instrucŃiune CREATE SCHEMA, care permite
crearea unor grupuri de obiecte din baza de date, pentru simplificarea administrării.

InstrucŃiunea CREATE TABLE

CREATE TABLE este una din instrucŃiunile fundamentale din SQL.


Modelul relaŃional cere ca toate datele stocate să fie ancorate într-un tabel, aşa că
posibilitatea de a stoca orice într-o bază de date începe întotdeauna cu crearea
unui tabel. Sintaxa de bază pentru instrucŃiunea CREATE TABLE este:

CREATE TABLE nume_tabel


(<definiŃie_coloană>
[,<definiŃie_coloană> ...])
[,<restricŃie—tabel>... ];

Definirea coloanelor în SQL DDL

Sintaxa de bază folosită pentru definirea coloanelor unui tabel este:


<definiŃie_coloană>
nume coloană tip_de_date
[DEFAULT expresie]
[NULL | NOT NULL]
[<restricŃie_coloană>]

De exemplu, instrucŃiune DDL pentru crearea tabelului CONT_CLIENT, din


baza de date a magazinului de produse video.

CREATE TABLE CONT_CLIENT


(
ID_CONT_CLIENT INTEGER NOT NULL,
CLIENT_CONT_STARE CHAR(1) DEFAULT ‘N’ NOT NULL,
CHECK (CLIENT_CONT_STARE IN (‘Y’, ‘N’)),//restr. coloana
DATA_INSCRIERE DATE NOT NULL,
DATA_INCHEIERE DATE NULL, //NULL daca contul e activ
SUMA_DEPOZIT_CLIENT NUMERIC(5,2) NULL,
CREDIT_CARD_IND CHAR(1) NOT NULL,
CHECK (CREDIT_CARD_IND IN (‘Y’, ‘N’)), //restric coloana
IND_PERMIS_INCHIRIERE_COPIL CHAR(1) NOT NULL,
CHECK(IND_PERMIS_INCHIRIERE_COPIL IN(‘Y’,‘N’
PRIMARY KEY (ID_CONT_CLIENTINTEGER ) //restr. tabel
);

Componentele din definiŃia 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

RestricŃiile coloanelor

RestricŃiile unei coloane limitează într-un mod oarecare valorile ce pot fi


stocate într-o coloană a unui tabel. RestricŃiile coloanelor pot avea oricare dintre
următoarele forme:

Clauza DEFAULT - O expresie care este aplicată coloanei atunci când în


tabel este inserat un nou rând, care nu conŃine o valoare explicită pentru coloana
respectivă. Expresia poate fi orice expresie validă. Sintaxa SQL cu o clauză
DEFAULT este:
[DEFAULT expresie]
Exemplu:
STARE_CONT_CLIENT CHAR(1) DEFAULT 'N' NOT NULL
RestricŃia NULL | NOT NULL - Specificarea cuvântului cheie NULL
permite stocarca valorilor nule într-o coloană, în timp ce NOT NULL nu permite
stocarca valorilor nule în coloana respectivă. O restricŃie NOT NULL poate fi
scrisă şi sub forma unei restricŃii CHECK cu condiŃia IS NOT NULL. Sintaxa SQL şi
câteva exemple:
NULL | NOT NULL
Exemple:
DATA_INSCRIERE DATE NOT NULL
DATA_INCHEIERE DATE NULL

RestricŃia CHECK - O restricŃie de verificare (check) poate fl folosită


pentru impunerea unei reguli care poate fi aplicată unei singure coloane a unui tabel.
CondiŃia inclusă în restricŃie trebuie să fie îndeplinită ori de câte ori datele din
coloana respectivă a tabelului sunt modificate – în caz contrar, sistemul SGBD va
respinge modificarea şi va afişa un mesaj de eroare. Sintaxa restricŃiei CHECK şi un
exemplu:
[CONSTRAINT nume restricŃie] CHECK (condiŃie)
Exemplu:
CREDIT_CARD_IND CHAR(1) NOT NULL,
CHECK (CREDIT_CARD_IND IN (‘Y’, ‘N’))

Clauză NOT NULL poate fi rescrisă şi sub forma unei restricŃii CHECK:
ID_CONT_CLIENT INTEGER
CONSTRAINT CK_CUST _ACCT _ID CHECK (ID_CONT IS NOT
NULL)

RestricŃia UNIQUE - O restricŃie UNIQUE impusă asupra unei coloane


garantează unicitatea valorilor din coloana respectivă a tabelului. Sintaxa:
[CONSTRAINT nume_restricŃie] UNIQUE

Exemplu:
ID_CONT_CLIENT INTEGER NOT NULL UNIQUE
RestricŃia PRIMARY KEY - O restricŃie de cheie primară (PRIMARY
KEY) impusă asupra unei coloane declară coloana respectivă ca fiind cheia primară a
tabelului, ceea ce înseamnă că în coloana respectivă nu pot exista valori nule, iar
valorile trebuie să fie unice în cadrul tabelului. Sintaxa :
(CONSTRAINT nume_restricŃie] PRIMARY KEY
EXEMPLU:
ID_CONT_CLIENT INTEGER NOT NULL PRIMARY KEY

RestricŃia referentială (FOREIGN KEY) - O restricŃie referenŃială


impusă asupra unei coloane (numită şi restricŃie de cheie externă) defineşte relaŃia
dintre o cheie externă şi o cheie primară. Sintaxa:
[CONSTRAINT nume_restricŃie]
REFERENCES nume_tabel(nume_coloană)
[ON DELETE CASCADE | ON DELETE SET NULL]
Exemplu:
MPAA_CODE_RATING din tabelul FILME este cheie externă pentru tabelul
MPPA_RATING, care are câmpurile: MPAA_CODE_RATING şi
MPAA__RATING _DESCRIERE
MPAA_COD_RATING CHAR (5) NOT NULL
REFERENCES MPPA_RATING(MPAA_CODE_RATING)

Clauza opŃională ON DELETE spune sistemului SGBD ce să facă atunci când


este şters rândul referit din tabelul părinte cu opŃiunea de a şterge toate rândurile care
conŃin cheia externă (CASCADE) sau de a insera valori nule pentru toate cheile
externe (SET NULL).

RestricŃiile tabelelor

RestricŃia unei coloane poate fi rescrisă şi ca restricŃie a întregului tabel, astfel


încât clauza care defineşte restricŃia să apară în instrucŃiunea CREATE TABLE după
definiŃiile tuturor coloanelor, nu după definiŃia unei coloane. Principalul avantaj al
restricŃiilor la nivelul tabelului este că pot referi mai multe coloane.
RestricŃia CHECK
[CONSTRAINT nume_restricŃie] CHECK (condiŃie)
RestricŃia 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)

RestricŃia UNIQUE

[CONSTRAINT nume_restricŃie) UNIQUE (nume_coloană [,nume


coloană...])
Conform acestei restricŃii , combinaŃia de coloane ID_CONT_CLIENT şi
DATA_INSCRIERE trebuie să fie unică în rândurile din tabel.
Exemplu:
CONSTRAINT UK_DATA_INSCR_CONT_CL
UNIQUE (ID_CONT_CLIENT, DATA_INSCRIERE )
RestricŃia PRIMARY KEY

[CONSTRAINT nume_restricŃie]
PRIMARY KEY (nume_coloană [,nume_coloană...])
RestricŃia de mai jos este chiar definiŃia cheii primare din tabelul
CONT_CLIENT [
Exemplu:
CONSTRAINT PK_CONT_CLIENT
PRIMARY KEY (ID_CONT_CLIENT)

RestricŃia referenŃială (FOREIGN KEY)


Spre deosebire de forma pentru restricŃia referenŃială a coloanei,
aceasta poate referi mai multe coloane.
[CONSTRAINT nume_restricŃie]
FOREIGN KEY (nume_coloană [,nume coloană...])
REFERENCES nume_tabel (nume_coloană [,nume_coloană... [ON DELETE
CASCADE |ON DELETE SET NULL]

InstrucŃiunea CREATE INDEX

Indexurile sunt instrumente puternice, deoarece permit sistemului să


gasescă datele mult mai repede, tot aşa cum indexul unei cărŃi ne permite să gasim
mai rapid ceea ce ne interesează. De asemenea, indxurile pe coloanele cheilor externe
cresc mult peformanŃele la unirea tabelelor. Sistemul SGBD întreŃin automat indexul,
dar activitatea de întreŃinere consumă din resursele calculatorului.
Sintaxa de bază a instrucŃiunii CREATE INDEX este:
CREATE [UNIQUE] INDEX nume_index ON nume_tabel
(nume_coloană [,nume coloană [ASC | DESC] …]);

Cuvântul cheie opŃional UNIQUE defineşte indexul ca unic, însemnând că nu


pot exista două rânduri din tabel cu exact acceaşi combinaŃie de valori în
coloanele specificate.
Cuvântul cheie opŃional ASC creează indexul în ordine crescătoare, în timp ce
DESC creează indexul în ordine descrescătoare. Dacă nu este specificată nici una
dintre cele două opŃiuni, ordinea prestabilită este crescătoare.
Un index trebuie să aibă cel puŃin o coloană, dar, nu există o limită superioară
a numărului de coloane.

InstrucŃiunea CREATE VIEW

O vizualizare este o interogare SQL stocată, care poate fi referită de


instrucŃiuni1e SQL DML şi DQL ca şi cum ar fi un tabel real. Unii consideră că
vizualizările sunt „tabele virtuale", deoarece se comportă la fel ca tabelele, dar
nu există ca tabele fizice. Sintaxa generală a instucŃiunii CREATE VIEW este:

CREATE [OR REPLACE] VIEW nume_vizualizare AS interogare sql;

Cuvântul cheie opŃional OR REPLACE elimină necesitatea de a sterge o


vizualizare existentă înainte de a o crea din nou.
Numele vizualizării trebuie să respecte aceleaşi reguli de denumire ca şi
tabelele şi alte obiecte ale bazei de date.
Interogarea SQL inclusă în definiŃia vizualizării poate fi orice instrucŃiunea
SQL SELECT validă.

InstrucŃiunea ALTER TABLE

InstrucŃiunea ALTER TABLE ajută să se facă asupra tabelelor create.


Utilizarea instrucŃiunii ALTER TABLE este un alt domeniu în care au un
rol important stilul şi preferinŃele personale. MulŃi administratori de baze de date
preferă să folosească instrucŃuni CREATE TABLE cât mai simple, evitând
să definească restricŃii în instrucŃiunile CREATE TABLE. Aceştia adaugă
după instrucŃiunea CREATE TABLE instrucŃiuni ALTER TABLE prin care
specifică toate restricŃiile necesare (cheie primară, cheie externă, unicitate,
verificare). Dezavantajul acestei metode este acela că necesită scrierea unei
cantităŃi mai mari de cod. Pe de altă parte, instrucŃiunea CREATE TABLE este
mult mai uşor de înŃeles fără restricŃii, iar scrierea separată a restricŃiilor
simplifică refolosirea instrucŃiunilor.
Deşi există unele diferenŃe între implementările SGBD, o listă cu tipurile de
modificări acceptate de instrucŃiunea ALTER TABLE, împreună cu sintaxa
generală pentru fiecare tip este:

Adăugarea unei coloane la un tabel. Definirea coloanei se face cu aceeaşi


sintaxă ca şi în cazul instrucŃiunii CREATE TABLE.

ALTER TABLE nume_tabel


ADD ( <definiŃie_co1oană>
[,<definiŃie_co1oană>
Exemplu:
ALTER TABLE CONT_CLIENT
ADD (DATA _CLIENT DATE NULL,
INTRODUSE_DE VARCHAR(50));
Modificarca definiŃiei unei coloane. Majoritatea SGBD-urilor nu permit să
scădeŃi precizia unei coloanedacă tabelul conŃine date şi foarte puŃine permit să se
schimbe tipul de date al unei coloane existente. Sunt acceptate creşterea preciziei unei
coloane, adăugarea sau modificarea valorii prestabilite pentru o coloană, şi trcerea de
la NULL la NOT NULL sau invers.
.
ALTER TABLE nume_tabel
MODIFY [COLUMN] (<definiŃie — coloană>
[,<definiŃie_co1oană> ...]);
Exemplu:
ALTER TABLE CONT_CLIENT
MODIFY (SUMA_DEPOZIT_CLIENT NUMERIC(7,2)
DEFAULT 0 NOT NULL);

Adăugarea unei restricŃii. DefiniŃia restricŃiei este identică cu definiŃia


unei restricŃii care ar putea apărea într-o instrucŃiune CREATE TABLE.
ALTER TABLE nume_tabel
ADD CONSTRAINT <definiŃie_restricŃie>;
Exemplu:
ALTER TABLE CONT_CLIENT
ADD CONSTRAINT CK_SUMA_DEPOZIT_CLIENT CHECK
(SUMA_DEPOZIT_CLIENT >= 0
OR SUMA_DEPOZIT_CLIENT IS NULL);

Ştergerea cheii primare a unui tabel.


Dacă cheia primară este referită de restricŃii referenŃiale, trebuie mai întâi
şterse restricŃiile respective.
ALTER TABLE nume_tabel DROP PRIMARY KEY;

Redenumirea unei coloane.


Dintre bazele de date care acceptă această sintaxă este numai Oracle, începând
cu versiunea 8.0
Microsoft SQL Server are o procedură stocată, numită sp_rename, care vă
pune la dispoziŃie o modalitate de a redenumi coloanele, tabelele şi alte obiecte ale
bazei de date.
ALTER TABLE nume_tabel
RENAME nume_vechi_coloană TO nume _nou_coloană;

InstrucŃiunea DROP

InstrucŃiunea DROP este cea mai simplă dintre instrucŃiunile DDL.


Sintaxa de bază este:
DROP <tip_obiect> nume_obiect [<opŃiuni_de_ştergere>]
Tipul de obiect specifică tipul obiectului care urmează să fie şters, cum ar fi
INDEX, TABLE sau VIEW.
OpŃiunile de ştergere sunt specifice fiecărui SGBD. Sintaxa este diferită de la
un producător la altul — PostgreSQL şi MySQL folosesc în acest scop cuvântul 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 TABLE COD_CLIENT CASCADE; (MySQL / PostgreSQL)
DROP INDEX IX_TITLU_FILM;

Întrebări şi probleme

AlegeŃi răspunsurile corecte pentru fiecare din următoarele întrebări cu


răspunsuri multiple. ReŃineŃi că întrebările pot avea mai multe răspunsuri corecte.
1. Tipurile de date oferă următoarele avantaje
a. Respectă standardele publicate
b. Oferă un set de comportamente utile pentru utilizatorii bazei
c. Asigură independenŃa faŃă de date
d. RestricŃionează datele din coloane la caractere care au sens în context
e. Ajută sistemul DBMS să stocheze mai eficient datele din coloane
2. Tipurile de date pentru caractere
a. Sunt mai flexibile decât tipurile de date numerice
b. Acceptă atât date cu lungime fixă, cât şi date cu lungime variabilă.
c. Necesită întotdeauna specificarea preciziei şi a scalei
d. Determină completarea coloanelor până la lungimea maximă maximă
e. Pot stoca şiruri de caractere în format specific unei limbi naŃionale
3. Tipurile de date numerice
a. Sunt mai flexibile decât tipurile de date pentru caractere
b. RestricŃionează valorile din coloane la numere şi simboluri înrudite, cum
ar fi virgulele şi simbolul dolar
c. Necesită întotdeauna specificarea preciziei şi a scalei
d. Stochează valori exacte sau aproximative
e. Sunt potrivite pentru a fi folosite în calcule
4. Tipurile numerice standard includ
a. INTEGER
b. NUMBER
c. FLOAT
d. BOOLEAN
e. INTERVAL
5. Tipurile de date temporale standard includ
a. DATETIME
b. DATE
c. TIMESTAMP
d. TIMEZONE
e. TIME
6. Valorile NULL
a. Pot fi folosite pentru reprezentarea datelor care lipsesc sau nu sunt
cunoscute
b. Înseamă acelaşi lucru ca şi spaŃiile libere
c. Sunt egale cu alte valori NULL
d. Nu sunt egale cu alte valori NULL
e. Sunt întotdeauna permise în mod prestabilit
7. InstrucŃiunile DDL includ
a. CREATE
b. ALTER
c. DELETE
d. INSERT
e. UPDATE
8. InstrucŃiunea CREATE DATABASE
a. FuncŃionează exact la fel în toate sistemele DBMS relaŃionale
b. Specifieă întotdeauna numele bazei de date
c. Specifieă întotdeauna numele proprietarului bazei de date
d. Poate include parametri specifici producătorului
e. FuncŃionează la fel cu instrucŃiunea CREATE SCHEMA
9. DefiniŃia unei coloane din instrucŃiunea CREATE TABLE poate include
a. Numele tabelului
b. Numele coloanei
c. restricŃie la nivel de tabel
d. clauză DEFAULT
e. O clauză NULL sau NOT NULL
10. Numele unei coloane dintr-un tabel
a. Trebuie să fie specificat în instrucŃiunea CREATE TABLE
b. Trebuie să fie unic în cadrul bazei de date
c. Trebuie să fie unic în cadrul tabelului
d. Poate fi folosit într-un singur index
e. Trebuie să fie specificat în instrucŃiunea ALTER TABLE
11. O restricŃie la nivel de coloană
a. Poate referi una sau mai multe coloane
b. Poate fi inclusă într-o instrucŃiune CREATE TABLE sau ALTER TABLE
c. Foloseşte o sintaxă identică sau aproape identică cu cea a unei restricŃii de
acelaşi tip la nivel de tabel
d. Poate fi folosită oriunde ar putea fi folosită o restricŃie la nivel de tabel
e. Are o sintaxă care diferă de la un tip de restricŃie la altul
12. Sintaxa corectă pentru clauza DEFAULT este
a. DEFAULT (precizie, scală)
b. DEFAULT [NULL | NOT NULL]
c. DEFAULT (expresie)
d. DEFAULT (nume–coloană) REFERENCES name–tabel (nume_coloană.)
e. DEFAULT [UNIQUE | PRIMARY KEY]
13. Sintaxa corectă pentru o restricŃie NOT NULL este
a. nume_coloană tip--de–date IS NOT NULL
b. nume_coloană tip–de–date NOT NULL
c. DEFAULT [NULL | NOT NULL]
d. CREATE NOT NULL INDEX ON nume_coloană
e. nume–coloană REFERENCES NOT NULL
14. Sintaxa corectă pentru o restricŃie UNIQUE este
a. [CONSTRAINT nume—restricŃie] UNIQUE (nume_coloană)
b. [CONSTRAINT nume—restricŃie] UNIQUE (nume_tabel)
c. DEFAULT UNIQUE (nume_coloană)
d. nume_coloană REFERENCES UNIQUE nume_tabel
e. DEFAULT [UNIQUE | PRIMARY KEY]
15. Sintaxa corectă pentru o restricŃie referenŃială este
a. [CONSTRAINT nume—restricŃie] REFERENCES nume_index
b. [CONSTRAINT nume—restricŃie] REFERENCES nume_tabel
c. FOREIGN KEY nume_coloană REFERENCES nume_tabel
(nume_coloană)
d. REFERENCES nume—tabel (nume_coloană)
e. nume_coloană REFERENCES UNIQUE nume_tabel
16. InstrucŃiunea CREATE INDEX
a. Poate fi folosită pentru crearea restricŃiilor de unicitate şi cheie primară
b. Poate include cuvântul cheie UNIQUE
c. Trebuie să refere două sau mai multe nume de coloane
d. Poate include cuvintele cheie ASC sau DESC pentru orice coloană
e. Poate specifica ordinea ascendentă sau descendentă pentru una sau mai
multe coloane
17. Instructiunea CREATE VIEW
a. Stochează o interogare în baza de date
b. Poate include cuvântul cheie opŃional CASCADE
c. Poate include cuvântul cheie opŃional OR REPLACE
d. Trebuie să conŃină o comandă DMI, validă
e. Trebuie să conŃină o instrucŃiune SELECT validă
18. Utilizările valide ale instrucŃiunii ALTER TABLE includ
a. Adăugarea coloanelor
b. Modificarea lungimii sau a preciziei coloanelor
c. Redenumirea unui tabel
d. Eliminarea unei chei primare
e. Adăugarea unei chei primare
19. O instrucŃiune ALTER TABLE nu poate fi folosită pentru
a. Schimbarea tipului de date al unei coloane la un tip numeric dacă în
coloana respectivă există date de alt tip
b. Redenumirea unei coloane
c. Schimbarea unei restricŃii din NULL în NOT NULL pentru o coloană care
conŃine valori nule
d. Eliminarea unei chei exteme care referă o cheie primară
e. Eliminarea unei chei primare dacă există chei exteme care referă cheia
primară
20. InstrucŃiunea DROP poate fi folosită pentru a şterge
a. restricŃie referenŃială
b. Un index
c. Un tabel
d. coloană dintr-un tabel
e. vizualizare
LecŃia 3. Limbajul de interogare a datelor(DQL)
Limbajul SQL de interogare a datelor (DQL – Data Query Language)
include o singură comandă SELECT, care este cea mai folosită pentru a obŃine date
din baza de date, astfel încât acestea să fie prelucrate de o anumită aplicaŃie sau să fie
afişate. Rezultatul unei instrucŃiuni SELECT, numit şi set de rezultate, este
returnat sub forma unui tabel. Deoarece SQL este un limbaj neprocedural, se specifică
rezultatele pe care le doriŃi să le obŃineŃi, nu şi modul lor de obŃinere.

InstrucŃiunea SELECT de bază


Forma elementară a instrucŃiunii SELECT conŃine două clauze:
SELECT [DISTINCT] - Specifică lista de coloane care urmează să
fie returnate în setul de rezultate, separate prin virgule. Se poate folosi simbolul
asterisc (*) în locul listei de coloane pentru a selecta toate coloanele dintr-un tabel sau
dintr-o vizualizare. Cuvântul cheie DISTINCT poate fi adăugat după cuvântul cheie
SELECT pentru a elimina rândurile duplicate din rezultatele interogării.
FROM - Specifică lista tabelelor sau vizualizărilor din care urmează să fie
selectate datele. În locul numelor reale ale tabelelor sau vizualizărilor se poate folosi
sinonime, adică pseudonime pentru tabele sau vizualizări definite în baza de date.

În exemplul următor se selectează coloanele: C OD_ GEN_ FILM ,


M P AA_ 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 interogări numele coloanelor din tabel apare


automat ca titlu de coloane în interogare. Dacă se doreşte un alt nume pentru
coloanele unei interogări se folosesc pseudonime.
Pseudonimele (aliases) specificate devin numele coloanelor din setul de
rezultate. Pseudonimele nu există decât după rularea instrucŃiunii SQL, aşa că nu pot fi
folosite în alte părŃi ale instrucŃiunii SQL. Pseudonimul unei coloane este specificat prin
plasarea cuvântului cheie ”AS" după numele coloanei în lista SELECT (cu cel puŃin un
spaŃiu înainte şi după), urmat de numele dorit pentru a fi atribuit coloanei în setul de
rezultate.
SELECT COD_GEN_FILM AS GEN,
M P AA_ RATING_COD AS RATING, TITLU_FILM
FROM FILM;

Sortarea rezultatelor
Rezultatele interogărilor sunt deseori mult mai utile dacă se specifică pentru
rândurile returnate o ordine care să aibă o semnificaŃie pentru persoana sau aplicaŃia
care foloseşte informaŃiile. În SQL, acest lucru este făcut prin adăugarea în instrucŃiunea
SELECT a clauzei ORDER BY, cu o listă de una sau mai multe coloane care vor fi
folosite pentru sortarea rândurilor în ordine ascendentă sau descendentă, în conformitate
cu valorile datelor din coloane. De asemenea, se Ńine seama de următoarele aspecte:
Ordinea prestabilită pentru fiecare coloană este ascendentă, dar se poate
adăuga cuvântul cheie ASC după numele coloanei pentru obŃinerea unei ordonări
ascendente sau cuvântul cheie DESC pentru obŃinerea unei ordonări descendente.
Nu este obligatoriu ca numele coloanelor din lista ORDER BY să fie incluse şi
în lista de rezultate (adică în lista SELECT).
Motorul SQL din SGBD va găsi cea mai bună cale de ordonare a coloanelor.
În general, sortarea datelor este un proces costisitor din punct de vedere al resurselor
de calcul, aşa că majoritatea sistemelor SGBD folosesc un index pentru accesul la
rânduri în ordinea dorită, presupunând că există, şi fac o sortare propriu-zisă numai ca
ultimă soluŃie.
Se poate folosi pseudonimele coloanelor în clauza ORDER BY, dar dacă se
face acest lucru se forŃează motorul SQL să sorteze rezultatele abia după rularea
interogării.
În locul coloanelor, se poate specifica în lista de ordonare poziŃia relativă a
coloanelor. De exemplu, clauza ORDER BY 1,2 va sorta rezultatele în ordine
ascendentă după primele două coloane din setul de rezultate. Numărul specificat nu
are nici o legătură cu poziŃia coloanei în tabelul sau vizualizarea sursă. Această
opŃiune nu este agreată în programarea SQL formală, deoarece dacă ulterior cineva
modifică interogarea, este posibil să amestece coloanele din lista SELECT, fără să-şi
dea seama că astfel schimbă şi coloanele folosite pentru sortarea rezultatelor.

SELECT M P AA_ RATING_COD AS RATING,


COD_GEN_FILM AS GEN, TITLU_FILM
FROM FILM
ORDERBY MPAA_ RATING_COD, COD_GEN_FILM

Dacă dorim să ordonăm acum crescător după rating şi descrescător după gen,
atunci instrucŃiunea de mai sus odificată va fi

SELECT M P AA_ RATING_COD AS RATING,


COD_GEN_FILM AS GEN, TITLU_FILM
FROM FILM
ORDERBY MPAA_ RATING_COD ASC, COD_GEN_FILM DESC;
ObservaŃie:
Oracle va afişa 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 afişa RATIN). În noua versiune de SQL produs de Oracle, iSQL*Plus,
nu mai prescurtează.

Utilizarea clauzei WHERE pentru filtrarea rezultatelor

SQL foloseşte clauza WHERE pentru a filtra rândurile ce urmează să fie


afişate. O interogare fără o clauză WHERE returnează un set de rezultate care conŃine
toate rândurile din tabelele sau vizualizările referite în clauza FROM. Dacă este
inclusă o clauză WHERE, sunt folosite regulile algebrei booleene, evaluând clauza
WHERE pentru fiecare rând de date. În rezultatele interogării sunt afişate numai
rândurile pentru care clauza WHERE este evaluată la valoarea logică „adevărat".
Operatori de comparare
Operatorii de comparare sunt folosiŃi în clauza WHERE pentru
compararea a două valori, având ca rezultat o valoare logică de „adevărat" sau „fals".
Cele două valori comparare pot fi constante furnizate în clauza WHERE, valori ale
unor coloane din baza de date sau combinaŃii ale celor două. Operatorii de comparare
care pot fi folosiŃi în clauza WHERE sunt prezentaŃi în tabelul următor:

Operator Descriere
= Egal cu
< Mai mic decât
<= Mai mic sau egal
> Mai mare decât
>= Mai mare sau egal
!= Diferit de
<> Diferit de (standard ANSI)

Exemple:
 Să se afişeze toate filmele pentru care RATING are valoarea PG-13.

SELECT M P AA_ RATING_COD AS RATING, TITLU_FILM


FROM FILM
WHERE M P AA_ RATING_COD = 'PG-13'
ORDER BY TITLU_FILM;

 Să se afişeze pentru care RATING are altă valoare decât PG-13.


SELECT COD_RATING AS RATING, FILM
FROM FILM
WHERE COD_RATING <> 'PG-13'
ORDER BY TITLU_FILM;

 Să se afişeze toate filmele cu preŃul de vânzare cu amănuntul pentru


formatul DVD (DVD Retail Price) mai mic de 19.99, în ordinea
descrescătoare a preŃurilor.
SELECT PRET_VANZARE_DVD, TITLU_FILM
FROM FILM
WHERE PRET_VANZARE_DVD < 19.99
ORDER BY PRET_VANZARE_DVD DESC;

 Să se afişeze filmele cu preŃul de vânzare cu amănuntul pentru formatul


DVD (DVD Retail Price) de 19.99 sau mai mic.

SELECT PRET_VANZARE_DVD, TITLU_FILM


FROM FILM
WHERE PRET_VANZARE_DVD <= 19.99
ORDER BY PRET_VANZARE_DVD DESC;
 Să se afişeze toate filmele cu preŃul de vânzare cu amănuntul pentru
formatul DVD (DVD Retail Price) mai mare de 25.00, în ordinea
crescătoare a preŃurilor.

SELECT PRET_VANZARE_DVD, TITLU_FILM


FROM FILM
WHERE PRET_VANZARE_DVD >= 25.00
ORDER BY PRET_VANZARE_DVD DESC;
Operatori conjunctivi

Uneori sunt necesare condiŃii multiple pentru a îngusta setul de


rezultate al unei interogări. Atunci când sunt folosite mai multe condiŃii, ele trebuie să
fie combinate din punct de vedere logic în clauza WHERE, iar aceasta este sarcina
operatorilor conjunctivi. Aceşti operatori sunt:
AND (ŞI) - Clauza WHERE este evaluată ca „adevărată" dacă toate condiŃiile
conectate cu operatorul AND sunt adevărate.
OR (SAU) - Clauza WHERE este evaluată ca „adevărată" dacă oricare din
condiŃiile conectate cu operatorul OR este adevărată.
Lucrurile devin complicate dacă operatorii AND şi OR sunt combinaŃi în aceeaşi
clauză WHERE. Operatorul AND are prioritate mai mare şi, ca urmare, este evaluat
înaintea operatorilor OR.

Exemple de folosire a operatorilor conjunctivi:


 Să se afişeze toate filmele pentru care categoria RATING este PG-13 şi
preŃul de vânzare cu amănuntul pentru formatul DVD este 19.99 sau mai
mic, în ordinea crescătoare a preŃurilor.
SELECT COD_RATING AS RATING,
PRET_VANZARE_DVD AS PRET, TITLU_FILM
FROM FILM
WHERE COD_RATING = 'PG-13'
AND PRET_VANZARE_DVD <= 19.99
ORDER BY PRET_VANZARE_DVD;

 Să se afişeze toate filmele pentru care categoria RATING este PG-13 sau
preŃul de vânzare cu amănuntul pentru formatul DVD este 19.99 sau mai
mic, în ordinea crescătoare a preŃurilor.
SELECT COD_RATING AS RATING,
PRET_VANZARE_DVD AS PRET, TITLU_FILM
FROM FILM
WHERE COD_RATING = 'PG-13'
OR PRET_VANZARE_DVD <= 19.99
ORDER BY PRET_VANZARE_DVD;

 Să se afişeze toate filmele pentru care categoria RATING este PG-13 şi


sunt din genul dramă sau acŃiune/aventură.
SELECT COD_RATING AS RATING,
PRET_VANZARE_DVD AS PRET,
TITLU_FILM
FROM FILM
WHERE COD_GEN_FILM= 'ActAd'
OR COD_GEN_FILM = 'Drama'
AND COD_RATING = 'PG-13'
ORDER BY COD_GEN_FILM, COD_RATING;

 Să se adauge parantezele necesare, astfel încât să obŃinem filmele cu


categoria PG-13 şi genul acŃiune/aventură sau dramă.
SELECT COD_GEN_FILM AS GEN,
COD_RATING AS RATING, TITLU_FILM
FROM FILM
WHERE (COD_GEN_FILM = 'ActAd'
OR COD_GEM_FILM = 'Drama')
AND COD_RATING='PG-13'
ORDER BY COND_GEN_FILM, COD_RATING;

Operatori logici

Operatorii logici folosesc cuvinte cheie în locul simbolurilor la


formarea expresiilor de comparare. La oricare dintre aceşti operatori poate fi adăugat
cuvântul cheie NOT, pentru a inversa valoarea logică a comparaŃiei.

IS NULL
Operatorul IS NULL este folosit pentru a determina dacă o valoare este nulă.
Exemple:
 Să se găsească toate conturile de clienŃi active, adică toate conturile pentru
care coloana DATA–TERMINATA conŃine o valoare nulă:
SELECT ID_CONT_CLIENT
FROM CONT_CLIENT
WHERE DATA_INCHEIERE IS NULL;

 Să se găsească toate conturile inactive, adică toate conturile pentru care


coloana DATA–TERMINATA conŃine o altă valoare decât NULL:
SELECT ID_CONT_CLIENT
FROM CONT_CLIENT
WHERE DATA_INCHEIERE IS NOT NULL;

BETWEEN
Operatorul BETWEEN este folosit pentru a determina dacă o valoare
se încadrează într-un interval special. Intervalul este specificat folosind o valoare
minimă şi o valoare maximă, fiind un interval inclusiv, ceea ce înseamnă că include şi
valori specificate.
Exemple:
 Să se afişeze toate filmele cu preŃul de vânzare cu amănuntul pentru
formatul DVD între 14.99 şi 19.99, ordonate crescător după preŃ.
SELECT TITLU_FILM, PRET_VANZARE_DVD
FORM FILM
WHERE PRER_VANZARE_DVD BETWEEN 14.99 AND 19.99
ORDER BY PRER_VANZARE_DVD;

 Să se afişeze toate filmele pentru care preŃul de vânzare cu amănuntul


pentru formatul DVD nu este în intervalul 14.99-19.99, ordonate crescător
după preŃ.
SELECT TITLU_FILM, PRET_VANZARE_DVD
FROM FILM
WHERE PRET_VANZARE_DVD NOT BETWEEN 14.99 AND 19.99
ORDER BY PRET_VANZARE_DVD;

 Să se afişeze toate conturile de clienŃi în luna ianuarie 2005.


SELECT ID_CONT_CLIENT, DATA_INSCRIERE
CONT_CLIENT
WHERE DATA_INSCRIERE BETWEEN ”2005/01/01” AND „2005/01/31”;

LIKE
Operatorul LIKE este folosit pentru a compara o valoare de tip caracter cu un
tipar*, returnând valoarea logică “adevărat” dacă valoarea de tip caracter se
încadrează în tipar şi “fals" în caz contrar. Pentru definirea tiparului pot fi folosite
două caractere de înlocuire:
LiniuŃa de subliniere (_) - Caracterul liniuŃă de subliniere poate fi folosit
drept caracter de înlocuire poziŃional, ceea ce înseamnă că se potriveşte cu orice
caracter aflat pe poziŃia respectivă în şirul de caractere evaluat.
Procent (%) - Simbolul procent (%) poate fi folosit drept caracter de înlocuire
nepoziŃional, ceea ce înseamnă că se potriveşte cu orice număr de caractere, indiferent
de lungime.

Microsoft Access oferă o caracteristică similară, dar pentru caracterul de


înlocuire poziŃional este folosit semnul de întrebare (?), iar pentru caracterul de
înlocuire nepoziŃional este folosit asteriscul (*) — aceste caractere corespund convenŃiilor
folosite în DOS si Visual Basic.
Exemple de tipare:

Tipar Interpretare
%Now Se potriveşte cu orice şir de caractere care se termină
cu „Now".
Now% Se potriveşte cu orice şir de caractere care incepe cu
„Now".
%Now% Se potriveşte cu orice şir de caractere care confine
„Now" (1a inceput, la sfârşit sau în mijloc).
N_w Se potriveşte cu orice şir de caractere format din exact
trei caractere, care începe cu „N" şi se termină cu „w".
%N-w% Se potriveşte cu orice şir de caractere care conŃine
litera „N", urmată de orice alt caracter, urmat de litera „w"
(1a începutul, la sfârşitul sau undeva în mijlocul şirului de
caractere)

Datele din bazele de date relaŃionale fac întotdeauna diferenŃierea literelor


mari de cele mici. O literă mica din date nit se potriveşte cu o literă mare din tiparul
unei clauze LIKE, şi invers.
Exemplu de utilizare a operatorului LIKE:
Să se afişeze toate titlurile de filme care conŃin şirul de caractere „on":
SELECT TITLU_FILM
FROM FILM
WHERE TITLU_FILM LIKE '%on%';
Dacă se intenŃionează să se găsească titlurile care conŃin cuvântul „on", nu
literele „on" din alte cuvinte, ar fi trebuit să includă în tipar şi spatiile necesare, ca în
exemplul următor:
IN
Operatorul IN este folosit pentru a determine 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 subselecŃie (o subinterogare), care este o interogare în cadrul unei alte
interogări.
Exemple de utilizare a operatorului IN:
 Să se afişeze toate filmele pentru care COD_GEN_FILM este Drama,
Forgn sau Rmce.
SELECT COD_GEN_FILM AS GEN, TITLU_FILM
FROM FILM
WHERE COD_GEN_FILM IN ('Drama','Forgn','Rmce')
ORDER BY COD_GEN_FILM, TITLU_FILM;
 Să se afişeze toate filmele pentru care descrierea genului conŃine cuvântul
„and". AveŃi nevoie de o subinterogare prin care să găsiŃi toate valorile
COD_GEN_FILM care conŃin cuvântul „and" în descriere. Operatorul IN
este apoi folosit pentru a găsi 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;

EXISTS
Operatorul EXISTS este folosit pentru a detemina dacă o subinterogare conŃine
înregistrări. Dacă în setul de rezultate al subinterogării nu există nici un rând,
operatorul returnează valoarea „false”; dacă setul de rezultate conŃine cel puŃin un
rând, valoarea devine „adevărat”.
Exemple de utilizare a operatorului EXIST:
Filmul The Last Samurai se închiriază bine atât în format DVD, cât şi-n
format VHS şi se doreşte să se asigure că în inventarul magazinului există o copie
VHS. Tabelul FILM_COPIAT conŃine un rând pentru fiecare copie a unui film din
inventarul magazinului, aşa că puteŃi folosi o subinterogare pentru a afla dacă există
copii VHS ale filmului în inventar. De cele mai multe ori, operatorul EXISTS este
folosit in conjuncŃie cu o formă mai complexă de subinterogare, numită subinterogare
corelat. (correlated subquery),în care valorile datelor din interogarea externă
(ID_FILM, în acest caz) sunt comparate cu rândurile din interogarea intenă.
SELECT ID_FILM, TITLU_FILM
FROM FILM m
WHERE TITLU_FILM = 'The Last Samurai'
AND EXISTS
(SELECT ID_FILM
FROM FILM_COPIAT c
WHERE m. ID_FILM = c. ID_FILM);
Dacă se inversează logica, folosind operatorul NOT EXISTS, puteŃi afişa titlul
filmului numai dacă nu există o copie VHS în inventar.
SELECT ID_FILM, TITLU_FILM
FROM FILM m
WHERE TITLU_FILM = 'The Last Samurai'
AND NOT EXISTS
(SELECT ID_FILM
FROM FILM_COPIAT c
WHERE m. ID_FILM = c. ID_FILM);

Operatori aritmetici
În SQL, operatorii aritmetici sunt folositi pentru efectuarea calculelor
matematice – la fel ca şi în formulele dintr-o foaie de calcul tabelar sau într-un limbaj
de programare, precum Java sau C. Cei patru operatori aritmetici din SQL sunt:

Operator Descriere
+ Adunare
- Scădere
* ÎnmulŃire
/ ÎmpărŃire
Ca şi în cazul operatorilor conjunctivi, dacă se amestecă operatorii aritmetici
în aceeaşi instrucŃiune SQL fără a folosi paranteze, ordinea în care sunt evaluate
operaŃiile este determinată de prioritatea predefinită. Din fericire, prioritatea
operatorilor din SQL este cea pe care o folosim în operaŃiile matematice obişnuite.
Exemple de utilizare a operatorilor aritmetici:
 Cât v-ar costa să cumpăraŃi copiile VHS şi DVD ale filmului The Last
Samurai?
SELECT PRET_VANZARE_VHS + PRET_VANZARE _DVD AS COST
FROM FILM
WHERE TITLU_FILM = 'The Last Samurai';

 Cât v-ar costa aceeaşi achiziŃie dacă aŃi avea un bon valoric de 5$?
SELECT (PRET_VANZARE _VHS + PRET_VANZARE _DVD) - 5 AS
COST
FROM FILM
WHERE TITLU_FILM = 'The Last Samurai';
 Dacă taxele sunt de 8.25% (0.0825), cât reprezintă taxele de vânzare din
costul achiziŃiei anterioare?
SELECT (PRET_VANZARE _VHS+ PRET_VANZARE _DVD) * 0.0825
AS TAX
FROM FILM
WHERE TITLU_FILM = 'The Last Samurai';
Care este costul mediu pentru o copie a filmului The Last Samurai?
SELECT (PRET_VANZARE_VHS+PRET_VANZARE _DVD) / 2
AS AVG_COST
FROM FILM
WHERE TITLU_FILM = 'The Last Samurai'

FuncŃii SQL elementare

O funcŃie este un tip special de program, care returnează o singură valoare de


fiecare data când este apelată. Termenul provine de la conceptul matematic al unei
funcŃii. În SQL, funcŃiile necesită întotdeauna specificarea unei expresii, care deseori
include numele unei coloane. Cel mai des, funcŃiile sunt folosite în lista de coloane a
unei instrucŃiuni SELECT, sunt apelate pentru fiecare rând prelucrat de interogare şi,
ca urmare, returnează o singură valoare pentru fiecare rand din setul de rezultate.
Uneori este folosit termenul funcŃie de coloană, pentru a indica faptul că funcŃie este
aplicată unei coloane dintr-un tabel sau o vizualizare. Un număr de funcŃii sunt
furnizate de producătorul DBMS şi se pot scrie propriile funcŃii, folosind un limbaj
special livrat împreună cu sistemul DBMS, cum ar fi PL/SQL pentru Oracle sau
Transact SQL pentru Microsoft SQL Server şi Sybase Adaptive Server.
FuncŃiile pot fi clasificate în multe moduri, dar majoritatea specialiştilor le
împart după ceea ce fac.

FuncŃii pentru caractere


FuncŃiile pentru caractere sunt numite astfel deoarece manipulează date de tip
text.
Concatenarea şirurilor de caractere
FuncŃia de concatenare a şirurilor de caractere reuneşte mai multe şiruri de
caractere pentru a forma o singură valoare în rezultatele interogării. FuncŃia standard
de concatenare a şirurilor de caractere din SQL este apelată cu două bare verticale (||),
dar există şi excepŃii, cum ar fi Microsoft SQL Server, care foloseşte semnul plus (+)
pentru concatenarea şirurilor de caractere.

Exemple de concatenare a şirurilor de caractere:


 Magazinul de produse video vrea să trimită fiecărui client o scrisoare care
începe cu formula "Client", plus prenumele şi numele persoanei. Numele
sunt stocate în tabelul PERSON. SoluŃia acestei cerintŃe în Oracle:
SELECT 'Client' || NUME_PERSOANA||
' ' || NUME_FAMILIE_PERSOANA AS SALUT_CLIENT
FROM PERSOANA;
 Aceeaşi soluŃie, modificată pentru a funcŃiona în Microsoft SQL Server
:
SELECT ‚Client' + NUME_PERSOANA +
' ' + NUME_FAMILIE_PERSOANA AS SALUT_CLIENT
FROM PERSOANA;

UPPER
FuncŃia UPPER transformă literele dintr-un şir de caractere în litere mari.
Numerele şi caracterele speciale sunt lăsate ca stare.
Exemple:
Să se afişeze comediile (COD_GEN_FILM = 'Comdy') scriind titlurile cu
majuscule.
SELECT UPPER(TITLU_FILM) AS TITLU_FILM
FROM FILM
WHERE COD_GEN_FILM = 'Comdy';
FuncŃia UPPER este deseori folosită în condiŃiile WHERE. Să presupunem că
nu vă amintiŃi dacă valorile COD_GEN_FILM au fost stocate cu litere mari, litere
mici sau combinaŃii ale acestora. Dacă în condiŃia WHERE transformaŃi valorile în
litere mari, puteŃi obŃine rezultatele corecte indiferent de modul de stocare.
SELECT UPPER(TITLU_FILM) AS TITLU_FILM
FROM FILM
WHERE UPPER(COD_GEN_FILM) = 'COMDY';
AtenŃie la folosirea funcŃiilor SQL în condiŃiile WHERE. În cele mai multe
situaŃii, pentru o coloană căreia îi este aplicată o funcŃie nu poate fi folosită indexarea.
Ca urmare, în cazul tabelelor mari, utilizarea funcŃiilor în condiŃiile WHERE poate
duce la probleme de performanŃă cu adevărat memorabile.

LOWER
FuncŃia LOWER este inversa funcŃiei UPPER — transformă literele dintr-un *
de caractere în litere mici.
Îată câteva exemple de utilizare a funcŃiei LOWER:
Să se afişeze comediile (GEN_COD_FILM = 'Comedy') scriind titlurile cu
minuscule.
SELECT LOWER(TITLU_FILM) AS TITLU_FILM
FROM FILM
WHERE GEN_COD_FILM = 'Comedy';
Se poate folosi funcŃia LOWER într-o clauză WHERE, atunci când nu ştiti
sigur ce tip de litere confine textul pe care vreŃi să-1 comparaŃi. AfişaŃi toate filmele
care au în titlu cuvântul „of ", indiferent dacă este scris cu litere mari sau mici.
SELECT TITLU_FILM
FROM FILM
WHERE LOWER(TITLU_FILM) LIKE ' % of %'
OR LOWER(TITLU_FILM) LIKE 'of % '
OR LOWER(TITLU_FILM) LIKE ' % of ';

SUBSTR

FuncŃia SUBSTR spare în majoritatea implementărilor SQL, dar uneori are un


nume puŃin diferit. De exemplu, funcŃia se numeşte SUBSTRING în Microsoft SQL
Server, Sybase Adaptive Server şi MySQL, dar SUBSTR în Oracle şi D132. FuncŃia
returnează o porŃiune a şirului de caractere, în funcŃie de parametrii furniizaŃi, care
specifică numele coloanei, poziŃia de început a subşirului în datele coloanei şi
lungimea subşirului returnat (numărul de caractere). Deşi este o utilizare mai puŃin
obişnuită, funcŃia SUBSTR acceptă şi un şir de caractere literal în locul numelui unei
coloane. Iată forma generală a funcŃiei, urmată de un exemplu:
SUBSTR (numele coloanei, poziŃia de început, lungimea subşirului
În tabelul PERSON, unele persoane au al doilea nume în întregime, alŃii au
numai initiale. Afişati numele complet al persoanelor al căror nume de familie începe
cu litera „B", sub forma unui singer şir de caractere care conŃine prenumele, iniŃiala şi
numele de familie.
Iată soluŃia, pentru Oracle:
SELECT NUME_PERSOANA || ' ' ||
SUBSTR(PRENUME_PERSOANA, 1, 1) || ' . ' ||
NUME_FAMILIE_PERSOANA AS NUME_INTREG
FROM PERSOANA
WHERE SUBSTR(NUME_FAMILIE_PERSOANA, 1, 1)='B'

ObservaŃi folosirea funcŃiei SUBSTR în clauza WHERE pentru a elimina din


rezultate persoanele al căror nume de familie nu începe cu litera „B". Ar trebui să vă
puteŃi deja gândi la alte moduri de a face acest lucru, prin folosirea operatorului LIKE.
Iată şi versiunea pentru Microsoft SQL Server a exemplului anterior:
SELECT NUME_PERSOANA + ' ' +
SUBSTRING(PRENUME_PERSOANA, 1, 1) +' . '+
NUME_FAMILIE_PERSOANA AS NUME_INTREG
FROM PERSOANA
WHERE SUBSTRING (NUME_FAMILIE_PERSOANA, 1, 1) = 'B'

LENGTH

FuncŃia LENGTH returnează lungimea unui şir de caractere. Microsoft SQL


Server şi Sybase Adaptive Server folosesc numele LEN pentru versiunea proprie a
acestei funcŃii.
Exemple:
Să se afişeze lungimea titlului pentru filmul a cărui valoare ID_FILM este 1.
Presupunem că folosiŃi o bază de date oracle, DB2 sau MzSQL.
SELECT TITLU_FILM, LENGTH (TITLU_FILM) AS LENGTH
FROM FILM
WHERE ID_FILM = 1;
Să se afişeze lungimea titlului pentru filmul a cărui valoare ID_FILM este 1.
Presupunem că folosiŃi o bază de date Microsoft SQL Server.
SELECT TITLU_FILM, LEN (TITLU_FILM) AS LENGTH
FROM FILM
WHERE LEN (TITLU_FILM) < 10;

FunŃii matematice
FuncŃiile matematice manipulează valori numerice, în conformitate cu regulile
matematicii.

ROUND
FuncŃia ROUND rotunjeşte o valoare la un număr specificat de zecimale.
Valoarea numerică este furnizată prin primul parametru, iar numărul de zecimale prin
cel de-al doilea. În continuare este prezentat formatul general al funcŃiei ROUND.
ROUND (expresie numerică, număr de poziŃii zecimale)
Care este costul mediu al unei copii a filmului The Last Samurai, rotunjit la
două zecimale?
SELECT ROUND((PRET_VANZARE_VHS + PRET_VANZARE
_DVD) / 2, 2) AS AVG_COST
FROM FILM
WHERE TITLU_FILM = 'The Last Samurai';

Alte funcŃii matematice


Tabelul care urmează prezintă funcŃiile matematice cel mai des
întâlnite. Pentru toate, sintaxa generală este aceeaşi:
NUME_FUNCTIE (expresie)

FuncŃie Descriere
ABS Valoarea absolută a unui număr dat
COS Cosinusul trigonometric al unui unghi specificat în radiani
EXP Valoarea exponenŃială a unui număr dat
POWER Ridică un număr la o putere (numărul şi puterea sunt
fumizate ca parametri)
SIN Sinusul trigonometric al unui unghi specificat în radiani
TAN Tangenta trigonometrică a unui unghi specificat în radiani

FuncŃii de conversie
FuncŃiile de conversie transformă date dintr-un tip de date în altul.

CAST
FuncŃia CAST transformă date dintr-un tip de date în altul. Iată sintaxa
generală a funcŃiei CAST, urmată de un exemplu:
CAST (expresie AS tip de date)
Afişati preŃul pentru formatul DVD al filmului The Last Samurai, cu un
simbol dolar în faŃa sumei. Valoarea numerică trebuie să fie convertită într-un şir de
caractere pentru a putea fi concatenată cu o valoare literală conŃinând simbolul dolar.
SELECT '$' || CAST(PRET_VANZARE _DVD AS VARCHAR(6)) AS PRET
FROM FILM
WHERE TITLU_FILM = 'The Last Samurai';

CONVERT TO
Multe implementări DBMS pun la dispoziŃie o funcŃie CONVERT sau
CONVERT TO. Totuşi este recomandată folosirea funcŃiei CAST, deoarece este
implementată într-un mod mai unitar de către diferiŃi producători.

FuncŃii de agregare şi gruparea rândurilor


O funcŃie de agregare (aggregate functions) este o funcŃie care combină mai
multe rânduri de date într-un singur rând. Tabelul următor prezintă funcŃiile de
agregare acceptate în majoritatea implementărilor SQL:

FuncŃie Descriere
AVG Calculează valoarea medie pentru o coloană sau o
expresie.
COUNT Numără valorile dintr-o coloană.
MAX Găseşte valoarea maxină dintr-o coloană.
MIN Găseşte valoarea minimă dintr-o coloană.
SUM Însumează valorile dintr-o coloană.
Exemple:
 Care este preŃul mediu al unui DVD?
SELECT ROUND(AVG(PRET_VANZARE _DVD),2) AS AVG_PRET
FROM FILM;
Câte filme există în tabelul FILM?
SELECT COUNT(*) AS NUM_FILM
FROM FILM;
 Câte genuri diferite de filme sunt reprezentate în tabelul FILM?
SELECT COUNT(DISTINCT(COD_GEN_FILM)) AS NUM_GEN
FROM FILM;
 Care sunt lungimea minimă şi maximă a titlurilor filmelor?
SELECT MIN(LENGTH(TITLU_FILM)) AS MIN_LENGTH,
MAX(LENGTH(TITLU_FILM)) AS MAX_LENGTH
FROM FILM;
Clauza GROUP BY
GROUP BY cere sistemului DBMS să grupeze rândurile selectate de
interogare pe baza valorilor din una sau mai multe coloane şi să aplice funcŃia (sau
funcŃiile) de agregare fiecărui grup, returnând un rând pentru fiecare grup din setul de
rezultate.
Sistemul DBMS va ordona rândurile selectate de interogare după coloanele
din clauza GROUP BY, aşa că grupurile vor fi returnate în ordine ascendentă,
exceptând cazul în care se adăugă o clauză ORDER BY care specifică un alt mod de
ordonare.
Exemplu:
Afişati fiecare cod de gen, împreună cu numărul de filme asociate fiecărui cod.
SELECT COD_GEN_FILM AS GEN, COUNT(*) AS COUNT
FROM FILM
GROUP BY COD_GEN_FILM;
Ce se întâmplă dacă scoateŃi clauza GROUP BY din această interogare?
Sistemul DBMS retumează un mesaj de eroare şi, din nefericire, mesajul de eroare
este deseori destul de criptic. Functia COUNT(*) este o functie de agregare şi, în
absenta clauzei GROUP BY, retumează un singur rând de date.

Operatori pentru interogări compuse


Uneori este util să se ruleze interogări multiple şi să se combine rezultatele
într-un singur set de rezultate.
UNION
Operatorul UNION adaugă rândurile din setul de înregistrări al unei interogări
la cel al unei alte inregistrări şi, în acelaşi timp, elimină rândurile duplicate, într-un
mod similar cu cel al cuvântului cheie DISTINCT. OperaŃia este permisă numai dacă
interogările sunt compatibile din punctul de vedere al uniunii, ceea ce înseamnă că au
acelaşi număr de coloane şi că tipurile de date ale coloanelor corespondente sunt
compatibile.
Exemplu:
AfişaŃi pe o singură coloană toate valorile nenule pentru taxa de inchiriere şi
taxa de întârziere din tabelul FILM_ÎNCHIRIAT.
SELECT INCHIRIAT_FEE AS FEE
FROM FILM_INCHIRIAT
WHERE INCHIRIAT _FEE IS NOT NULL UNION
SELECT LATE_OR_LOSS_FEE AS FEE
FROM FILM_INCHIRIAT
WHERE LATE _OR_ LOSS FEE IS NOT NULL;

UNION ALL
UNION ALL funcŃionează la fel ca şi operatorul UNION, exceptând faptul că
rândurile duplicate nu sunt eliminate.

INTERSECT
Operatorul INTERSECT găseşte valorile selectate dintr-o interogare, care apar
şi într-o altă interogare. În esenŃă, găseşte intersecŃia valorilor din cele două
interogări. Totuşi, doar un număr mic de sisteme DBMS (cele mai importance fiind
Oracle şi DB2) implementează acest operator. Nu-1 veŃi găsi în Microsoft SQL Server
sau MySQL.
Exemplu:
Există în tabelul FILM filme pentru care preŃul pentru DVD este egal cu preŃul
pentru VHS?
SELECT INCHIRIAT_FEE AS FEE
FROM FILM_ INCHIRIAT
WHERE INCHIRIAT _FEE IS NOT NULL
INTERSECT
SELECT LATE_OR_LOSS_FEE AS FEE
FROM FILM_ INCHIRIAT
WHERE LATE OR_ LOSS FEE IS NOT NULL

EXCEPT
EXCEPT este operatorul standard ANSI/ISO care găseşte diferenŃele dintre
două seturi de rezultate, returnând, în esenŃă, valorile din prima interogare care nu
apar în cea de-a doua interogare. Foarte puŃine sisteme DBMS implementează acest
operator. În unele implementări, precum Oracle, operatorul se numeşte MINUS, nu
EXCEPT.

Întrebări şi Probleme

AlegeŃi răspunsurile corecte pentru fiecare din următoarele întrebări cu


răspunsuri multiple. ReŃineŃi că întrebările pot avea mai multe răspunsuri corecte.

1. O instrucŃiune SELECT fără o clauză WHERE


a. Selectează toate coloanele din tabel sau vizualizare
b. Returnează un mesaj de eroare
c. Selectează toate rândurile din tabel sau vizualizare
d. Afişează numai definiŃia tabelului sau a vizualizării
e. Scrie întotdeauna rezultatele într-un fişier jurnal

2. În SQL, ordinea rândurilor din rezultatele interogării


a. Este specificată de clauza SORTED BY
b. Poate fi ascendentă sau descendentă pentru orice coloană
c. În mod prestabilit este descendentă, dacă nu se specifică o altă ordine
d. Este imprevizibilă dacă nu este specificată in interogare
e. Poate fi specificată numai pentru coloanele din setul de rezultate al
interogării
3. Operatorul BETWEEN
a. Specifică un domeniu de valori care include şi capetele
b. Poate fi rescris folosind operatorii <= şi NOT <=
c. Poate fi rescris folosind operatorii <= şi >=
d. Selectează rândurile adăugate în tabel într-un anumit interval de timp
e. Nu este inclus în standardul ISO/ANSI
4. Operatorul LIKE standard
a. Foloseşte semne de întrebare drept caractere de înlocuire poziŃionale
b. Foloseşte liniuŃe de subliniere drept caractere de înlocuire poziŃionale
c. Foloseşte liniuŃe de subliniere drept caractere de înlocuire nepoziŃionale
d. Foloseşte simboluri procent drept caractere de înlocuire poziŃionale
e. Foloseşte simboluri procent drept caractere de înlocuire nepoziŃionale
5. O instrucŃiune SQL care confine o funcŃie de agregare
a. Poate conŃine şi coloane calculate
b. Poate conŃine şi coloane obisnuite
c. Trebuie să includă o clauză ORDER BY
d. Trebuie să includă o clauză GROUP BY
e. Nu poate include, în acelaşi timp, o clauză GROUP BY şi o clauză
ORDERBY

6. Când operatorii AND şi OR sunt combinaŃi în aceeaşi clauză WHERE


a. Sistemul SGBD returnează un mesaj de eroare
b. Operatorul AND are prioritate mai mare decât operatorul OR
c. Operatorul AND are prioritate mai mică decât operatorul OR
d. Parantezele, sunt obligatorii
e. Parantezele sunt opŃionale
7. Sintaxa corectă pentru eliminarea valorilor nule din rezultatele interogării
este
a. = NULL
b. NOT = NULL
c. <>NULL
d. IS NULL
e. IS NOT NULL
8. FuncŃiile SQL standard pentru şiruri de caractere includ
a. UPPER
b. MIDDLE
c. LOWER
d. SUBSTR
e. EXISTS
9. FuncŃiile, SQL matematice standard includ
a. LENGTH
b. ROUND
c. CAST
d. MIN
e. ABS
10. Operatorul UNION
a. Elimină rândurile duplicate din setul de rezultate
b. Include rândurile duplicate în setul de rezultate
c. Combină două interogări într-o singură interogare de tip join
d. Combină seturile de rezultate a două interogări într-un singur set de
rezultate
e. Este numit JOIN în unele implementări SQL

ScrieŃi instrucŃiunile SQL pentru următoarele probleme

1. GăsiŃi toate filmele din tabelul FILM pentru care


MPAA_COD_INCHIRIERE are altă valoare decât „R".
2. AfişaŃi titlurile şi preŃurile tuturor filmelor pentru care
PRET_VANZARE_DVD este cel puŃin 19.99, dar nu mai mare de 29.99,
ordonate crescător după preŃ.
3. AfişaŃi toate filmele pentru care genul (COD_GEN_FILM) este Comdy şi
categoria MPAA (MPAA _COD_INCHIRIERE) este PG-13, împreună cu
filmele pentru care genul este Drama şi categoria este R.
4. 14. Câte închirieri (tabelul FILM_INCHIRIAT) nu au nici o valoare în
coloana LATE_OR_LOSS_FEE?
5. Câte persoane au un nume de familie (NUME_FAMILIE_PERSOANA)
care conŃine litera „a", majusculă sau minusculă?
6. AfişaŃi toate titlurile de filme care conŃin cuvântul „the", cu sau fără literă
mare.
7. FolosiŃi funcŃia SUM pentru a afla totalul valorilor din coloana
PLATA_INCHIRIAT din tabelul FILM_INCHIRIAT.
8. AfişaŃi primele cinci caractere din numele de familie
(NUME_FAMILIE_PERSOANA) din tabelul PERSOANA, dar eliminaŃi
toate valorile duplicate din setul de rezultate?
9. Din tabelul FILM, afişaŃi toate genurile (COD_GEN_FILM), împreună cu
media preŃurilor pentru DVD (PRET_VANZARE_DVD) pentru fiecare
gen, rotunjită la două poziŃii zecimale.
10. AfişaŃi toate filmele (ID_FILM) care au fost închiriate (tabelul
FILM_INCHIRIAT), cu suma totală strânsă din taxele de închiriere
(PLATA_INCHIRIAT) sau taxele de întârziere sau pierdere
(PLATA_PENALIZARE) pentru filmul respectiv. Sugestie: adunaŃi
valorile PLATA_INCHIRIAT şi PLATA_PENALIZARE, apoi însumaŃi
(SUM) rezultatul respectiv pentru fiecare valoare ID_FILM. Unele valori
din coloana PLATA_PENALIZARE sunt nule, aşa că, dacă nu aveŃi o
funcŃie care să înlocuiască valorile nule cu o altă valoare (zero, în acest
caz), veŃi obŃine valori nule în rezultate. În Oracle, funcŃia se numeşte
NVL, în Microsoft SQL Server se numeşte ISNULL, iar în MySQL se
numeşte IFNULL. (Se pare că nu există o funcŃie echivalentă în D132).

LecŃia 4. Combinarea datelor din mai multe tabele

S-au prezentat până acum instrucŃiuni SQL care selectează date dintr-un singur
tabel. Deseori, este util să se combine date din tabele multiple într-o singură
interogare . De exemplu, în listingul celor trei coloane ale tabelului FILM din figura
următoare, observaŃi valorile afişate pentru coloană FILM_GEN_COD. Atunci când
s-a proiectat baza de date pentru magazinul de produse video, s-au folosit coduri în
locul descrierilor complete pentru genurile filmelor în tabelul FILM. Din discuŃia
despre procesul de normalizare, s-a evitat anomalia de actualizare – dacă se schimbă
descrierea unui gen, nu este nevoie să actualizăm acea descriere pentru toate filmele
asociate genului respectiv în tabelul FILM. În timpul normalizării, descrierea
genurilor a fost mutată în tabelul, FILM_GEN, iar coloană FILM_GEN_COD a
devenit cheie externă în tabelul FILM, referind coloană cheie primară (cu acelaşi
nume) din tabelul FILM_GEN. S-a optat pentru folosirea unui cod mnemonic pentru
codurile genurilor, deoarece astfel permit celor familiarizaŃi cu datele respective să
înŃeleagă genul asociat filmelor fără să le caute în tabelul FILM_GEN.

FILM_COD FILM_GEN_COD FILM_TITLU


1 Drama Mystic River
2 ActAd The Last Samurai
3 Comedie Something's Gotta Grve
4 ActAd The Italian
5 ActAd Kill Bill: Voi. 1
Pirates of the Caribbean: Trie Curse of the Black
6 ActAd
Pearl
7 Drama Big Fish
8 ActAd Man on Fire
Master and Commander The Far Side of the
9 ActAd
World
10 Drama LosI în Translation
11 Rmce Two Weeks Notice
12 Comedie 50 First Dates
13 Comedie Matchstick Men
14 Drama Cold Mountain
15 Drama Road to Perdition
16 Comedie The School of Rock
17 Rmce 13 Going on30
18 Drama Monster
19 ActAd The Day After Tomorrow
20 Forgn Das Boot
Tabelul FILM (trei coloane)

Evident, nu puteŃi afişa pe pagina web a magazinului de produse video,


tabelul FILM aşa cum este prezentat în figura de mai sus - trebuie să obŃineŃi
descrierea completă a genurilor din tabelul FILM_GEN. Aceasta este ideea
capitolului de faŃă: combinarea datelor din mai multe tabele într-o singură interogare.
Figura următoare prezintă un listing al tabelului FILM_GEN.

FILM_GEN_COD FILM_GEN_DESCRIERE
ActAd Actiune
Anime Animatie
ChFam Copii şi Familie
Class Clasic
Comedie Comedie
Doc Documentar
Drama Drama
Forgn Strain
Hor Horror
Indep Independent
Music Muzical
Rmce Romance(Romantic, Idila)
SciFi Stiintifico-Fantastic
Sport Sport
Thriller Groaza
Tabelul FILM_GEN

Uniuni (join)

O uniune (join) este o operaŃie într-o bază de date relaŃionale care combină
coloane din două sau mai multe tabele în rezultatele unei singure interogări. O uniune
apare de fiecare dată când clauza FROM a unei instrucŃiuni SELECT specifică
numele mai multor tabele.
De exemplu:
SELECT FILM_ID, FILM_GEN_DESCRIERE AS GEN, FILM_TITLU
FROM FILM, FILM_GEN ORDER BY FILM_ID;

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 interogării 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 corespondenŃa dintre rândurile celor două tabele. Rezultatul este cunoscut
sub numele de produs cartezian (după numele filozofului şi matematicianului francez
Rene Descartes) şi, în bazele de date relaŃionale, este un set de rezultate obŃinut prin
uniunea dintre fiecare rând al unui tabel cu fiecare rând dintr-un alt tabel.
SoluŃia este să specificăm cum se va face unirea tabelelor. Trebuie indicat ce
coloane ar trebui să se potrivească pentru a uni două rânduri din cele două tabele, în
mod normal, cele două coloane vor fi cheia primară dintr-un tabel şi cheia externă din
celălalt tabel, dar pot există şi excepŃii. Pentru a realiza acest lucru trebuie să se facă o
o uniune standard relaŃională, cunoscut şi sub numele de uniune de egalitate
(equijoin).
Uniuni de egalitate (equijoin)

Avem o uniune de egalitale (equijoin), numită şi uniune internă (inner join),


atunci când legăm una sau mai multe coloane dintr-un tabel (de obicei, o cheie
externă) cu coloane similare dintr-un alt tabel (de obicei, cheia primară), folosind
condiŃia de egalitale, aceasta fiind cea mai des folosită formă de uniune. Totusi,
termenul uniune de egalitate (equijoin) este rareori folosit în afara mediilor
academice, find preferate denurmirile uniune internă (inner join) sau uniune standard
(standard join ).
Există două modalităŃi de specificare a coloanelor corespondente: folosind
clauza WHERE sau folosind clauza JOIN. Clauza JOIN a fost adaugată relativ recent
în standardul SQL, aşa că programatorii mai vechi sunt obisnuiŃi cu metoda bazată pe
clauza WHERE.

Realizarea uniunilor folosind clauza WHERE

Folosirea clauzei WHERE pentru unirea tabelelor seamănă cu folosirea


acesteia pentru eliminărea rândurilor de care nu aveŃi nevoie din setul de rezultate.
Totuşi, există unele diferenŃe.
În clauza WHERE :
Se compară o coloană cu o altă co1oană, nu o coloană cu o constantă sau o
expresie.
Atunci când coloanele din cele două tabele au acelaşi nume (o soluŃie
recomandată) trebuie să specificati numele complet al coloanelor (adică numele cu
calificator), astfel încât motorul SQL să ştie care dintre cele două coloane este
referită. Motorul SQL cere să se refere toate coloanele specificate într-o instrucŃiune
SQL. Aceasta nu înseamnă numai coloanele din clauza WHERE, ci din orice alt loc al
instrucŃunii, inclusiv în lista SELECT. Cea mai simplă formă de calificator este chiar
numele tabelului, separat cu caracterul punct de numele coloanei. În continuare este
prezentat un exemplu de uniune realizată prin clauza WHERE, cu numele coloanelor
specificate complet, folosind numele tabelelor. ObservaŃi că interogarea selectează
coloanele FILM_ID şi FILM_TITLU din tabelul FILM şi genul corespunzător
(FILM_GEN_DESCRIERE) din tabelul FILM_GEN.

SELECT FILM_ID, FILM_GEN_DESCRIERE AS GEN, FILM_TITLU


FROM FILM, FILM_GEN
WHERE FILM.FILM_GEN_COD= FILM_GEN.FILM_GEN_COD
ORDER BY FILM_ID;

FILM_ID FILM_GEN FILM_TITLU


1 Drama Mystic River
2 Actiune şi Aventura The Last Samurai
3 Comedie Something's Gotta Give
4 Actiune şi Aventura The Italian Job
5 Actiune şi Aventura Kill Bill Vol. 1
6 Actiune şi Aventura Pirates of the
Caribbean
7 Drama Big Fish
8 Actiune şi Aventura Man on Fire
9 Actiune şi Master and Commander
Aventura
10 Drama Lost în Translation
11 Romantic Two Weeks Notice
12 Comedie 50 First Dates
13 Comedie Matchstick Men
14 Drama Cold Mountain
15 Drama Road to Perdition
16 Comedie The School of Rock
17 Romantic 13 Going on 30
18 Drama Monster
19 Actiune şi The Day After Tomorrow
Aventura
20 Strain Das Boot

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
funcŃionează la fel ca şi pseudonimele coloanelor din clauza SELECT, exceptând
faptul că nu este folosit cuvântul cheie „AS" (în cele mai multe implementări SQL) -
doar lăsaŃi un spaŃiu între numele tabelului şi pseudonim în lista FROM. Deşi unii
folosesc mnemonice pentru pseudonimul tabelelor, este mult mai des întâlnită
folosirea secvenŃelor de majuscule (adică „A", „B”,”C” şi aşa mai departe). După ce
asociaŃi un pseudonim unui nume de tabel în clauza FROM, trebuie să folosiŃi
pseudonimul în locul numelui de tabel în întreaga instrucŃiune SQL. Folosirea
pseudonimelor în clauza SELECT poate părea puŃin ciudată la început deoarece
folosiŃi un pseudonim înainte de a-l defini (clauza SELECT precede clauza FROM şi
s-ar putea să vi se para mai simplu să completaŃi clauza FROM înainte de a completa
lista de coloane din clauza SELECT atunci când scrieŃi instrucŃiunile SQL.
Exemplul următor prezintă instrucŃiunea anterioară, după adăugarea
pseudonimelor pentru numele tabelelor. Deşi nu era necesar, pseudonimele au fost
adăugate şi în lista de coloane din clauzele SELECT şi ORDER BY, pentru a va arăta
cum sunt folosite.

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;

Realizarea uniunilor folosind clauza JOIN

Clauza JOIN este scrisă ca o referinŃă de tabel din clauza FROM şi combină
lista de tabele din clauza FROM şi condiŃia de legătură scrisă anterior în clauza
WHERE într-o singură clauză. Sintaxa generală a clauzei JOIN pentru o uniune
internă, urmată de câteva exemple.
nume_tabel [INNER) JOIN nume_tabel
{ ON condiŃie | USING (nume_coloană [ , nume_coloană...]) }

Clauza ON permite specificarea unei condiŃii similare cu cea din clauza


WHERE .
Clauza USING specifică numele coloanelor folosite pentru legarea rândurilor.
Totuşi, clauza USING acŃionează numai atunci când coloanele pe care se face
legătură au nume identice în ambele tabele.

Exemple:
• JOIN cu condiŃie 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 cuvântul cheie USING (în locul condiŃiei ON) o scurtatură
elegantă atunci când coloanele din cele două tabele au acelaşi nume(nu e recunoscută
de toate SGBD-urile).

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 afişează lista cu copiile filmelor din tabelul
FILM_COPY care nu au fost vândute (coloană DATA_VANZARE conŃine o valoare
nulă dacă nu a fost vândută) şi care au fost închiriate (uniune cu tabelul
FILM_INCHIRIAT) dar nu au fost încă returnate (coloană RETUR_DATA conŃine o
valoare nulă până la returnarea filmului). A se revedea prezentarea generală a bazei de
date a magazinului de produse video, pentru a vedea unde se încadrează tabelul în
modelul general.
SELECT FILM_ID, COPY_NUMAR, DATA_RETURNARII
FROM FILM_COPY JOIN FILM__INCHIRIAT
USING (FILM_ID, COPY_NUMAR)
WHERE DATA_VANZARE IS NULL
AND RETUR_DATA IS NULL;

FILM _ID COPY_NUMAR DATA_RETURNARII


2 2 02/27/2005
3 2 03/04/2005
5 1 02/27/2005
5 2 02/19/2005
10 1 03/04/2005
17 1 03/04/2005

InstrucŃiunile care folosesc clauza JOIN sunt mai scurte , iată interogarea
precedentă scrisă folosind condiŃii de legătură în clauza WHERE. RemarcaŃi că în
acest caz trebuie să specificaŃi numele complet al coloanelor FILM_ID şi
COPY_NUMAR, pentru a evita referirea ambiguă a lor. InstrucŃiunea de mai jos
afişează aceleaşi rezultate ca şi instrucŃiunea anterioară.

SELECT A.FILM_ID, A.COPY_NUMAR, DATA_RETURNARII


FROM FILM_COPY A, FILM_INCH B WHERE A.FILM_ID = B.FILM_ID
AND A.COPY_NUMAR = B.COPY_NUMAR
AND DATA_VANZARE IS NULL
AND RETURN_DATA IS NULL;

Uniuni naturale

O uniune naturală (natural join) se bazează pe toate coloanele cu acelaşi


nume din două tabele, în esenŃă, toate uniunile de egalitate sunt uniuni naturale.
Totuşi, sintaxa unei uniuni naturale este mult mai simplă, deoarece nu este necesar să
specificaŃi o condiŃie sau o listă de coloane - se înŃelege de la sine care sunt coloanele
folosite. ReŃineŃi,nu toate SGBD-urile acceptă această sintaxă pentru clauza
JOIN(accepta sigur Oracle şi MySQL )..

Exemplu: uniunea tabelelor FILM şi FILM_GEN, rescrisă sub forma unei


uniuni naturale:
SELECT FILM_ID, FILM_GEN_DESCRIERE AS GEN, FILM_TITLU
FROM FILM NATURAL JOIN FILM_GEN ORDER BY FILM_ID;

Uniunile pot implica mai mult de două tabele. Exemplul următor


prezintă o uniune naturală care obŃine 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 rândurile de care
nu avem nevoie. Am permis textului din coloana RATING_DESC să treacă automat
pe linia următoare în rezultatele interogării, din cauza lungimii. Exemplul foloseşte
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 rândurile 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 GEN RATING RATING_DESC

1 Drama R Sub 17 ani acompaniati de


parinti
2 AcŃiune si Aventura R Sub 17 ani acompaniati de
parinti
3 Comedie PG-13 Cu acordul strict a
parintilor

Dacă se foloseşte o implementare SQL care nu acceptă uniunile naturale,


aceeaşi interogare scrisă folosind cuvintele cheie JOIN şi ON este:

SELECT A.FILM_ID, B.FILM_GEN_DESCRIERE AS GEN,


C.MPAA_RATING__COD AS RATING,
C.MPAA_RATING__DESCRIERE AS
RATING_DESC
FROM FILM A JOIN FILM_GEN B ON
A.FILM_GEN_COD = B.FILM_GEN_COD
JOIN MPAA_RATING C ON
A.MPAA_RATING_COD = C.MPAA_RATING_COD
WHERE FILM_ID < 4 ORDER BY FILM_ID;

Uniuni externe (outer joins)

Toate uniunile pe care le-am descris până acum sunt uniuni exclusiv(uniuni
interne), ceea ce înseamnă că singurele rânduri care apar în setul de rezultate sunt cele
pentru care a fost găsită o legătură în toate tabelele unite. Există situaŃii în care vreŃi
să includeŃi în rezultatele interogării şi rânduri pentru care nu există o legătură.
De exemplu, dacă se doreşte o listă cu toate genurile de filme, împreună cu
toate titlurile asociate cu fiecare gen?
O uniune externă (outer join) - pentru care un nume mai potrivit ar fi uniune
inclusivă - include în setul de rezultate şi rândurile pentru care nu există legături din
cel puŃin unul dintre tabele. Atunci când există rânduri fără legături, datele selectate
din tabelul în care nu a fost găsită o legătură primesc valoarea nulă. Există trei tipuri
de bază:
Uniune externă către stânga (left outer join) . Returnează toate rândurile din
tabelul din stânga (cel specificat primul în clauza JOIN), împreună cu toate rândurile
din tabelul din dreapta pentru care poate fi găsită o legătură.
(asemănatoare interogărilor din tabele aflate in relaŃia 1:m)

Uniune externă către dreapta (right outer join). Returnează toate rândurile
din tabelul din dreapta (cel specificat al doilea în clauza JOIN), împreună cu toate
rândurile din tabelul din stânga pentru care poate fi găsită o legătură, în esenŃă, o
uniune externă către stânga poale fi rescrisă ca o uniune externă către dreapta
inversând ordinea de specificare a tabelelor şi înlocuind cuvântul cheie LEFT cu
RIGHT.
Uniune externă completă (full outer join). Returnează toate rândurile din
ambele tabele. Acest tip de uniune este cel mai puŃin probabil să fie acceptată de toate
implementari;e SQL. Această uniune nu este acelaşi lucru cu un produs cartezian,
care leagă fiecare rând dintr-un tabel cu fiecare rând din celălalt tabel. O uniune
externă completă leagă fiecare rând dintr-un tabel cu zero sau mai multe rânduri
corespondente din celălalt tabel.
Este folosită mai mult pentru tabelele aflate in relaŃia m:m

Sintaxa generală pentru o uniune externă este:

nume_tabel {RIGHT | LEFT | FULL} [OUTER] JOIN nume_tabel {


ON condiŃie | USING (nume_coloană [ ,nume_coIoană. ..]) }

Exemple de uniuni externe:

• Să se afişeze toate descrierile genurilor de filme, împreună cu filmele


asociate fiecărui gen. În setul de rezultate rândurile care nu au nici o valoare în
coloană FILM_TITLU - acestea sunt genurile de filme care nu au filme asociate. Dacă
implementarea DBMS nu acceptă uniuni realizate cu cuvântul cheie USING,
modificaŃi instrucŃiunea astfel încât să utilizeze cuvântul cheie ON, ca în exemplul
care urmează după acesta.

SELECT FILM_GEN_DESCRIERE AS GEN, FILM_TITLU


FROM FILM_GEN LEFT OUTER JOIN FILM USING
(FILM_GEN_COD);
GEN FILM_TITLU
Actiune şi Aventura Kill Bill: Vol. 1
Actiune şi Aventura Man on Fire
Actiune şi Aventura Pirates of the Caribbean
Actiune şi Aventura Master and Commander
Actiune şi Aventura The Day After Tomorrow
Actiune şi Aventura The Last Samurai
Actiune şi Aventura The Italian Job
Anime and Animation
Copii şi Familie
Clasic
Comedie 50 First Dates
Comedie Matchstick Men
Comedie The School of Rock
Comedie Something's Gotta Give
Documentar
Drama Big Fiah
Drama Road to Perdition
Drama Mystic River
Drama Monster
Drama Cold Mountain
Drama Lost în Translation
Strain Das Boot
Horror
Independent
Musical
Romantic 13 Going on 30
Romantic Two Weeks Notice

• Interogarea anterioară, rescrisă ca uniune externă către dreapta,


cu condiŃie ON.

SELECT FILM_GEN_DESCRIERE AS GEN, FILM_TITLU


FROM FILM RIGHT OUTER JOIN FILM_GEN
ON FILM.FILM_GEN_COD =FILM_GEN.FILM_GEN_COD;

• Interogarea anterioară, rescrisă ca uniune externă completă. Deoarece


fiecare film trebuie să aibă asociat un gen, această interogare va produce aceleaşi
rezultate ca şi uniunea externă către dreapta din interogarea anterioară. Totuşi, dacă
genurile filmelor ar fi opŃionale, uniunea externă completă v-ar fi permis să afişaŃi atât
genurile care nu au filme asociate, cât şi filmele care nu au genuri asociate.

SELECT FILM_GEN_DESCRIERE AS GEN, FILM_TITLU


FROM FILM FULL OUTER JOIN FILM_GEN
ON FILM.FILM_GEN_COD = FILM_GEN.FILM_GEN_COD;

• AfişaŃi descrierile genurilor care nu au nume asociate. Există şi alte moduri


de a face acest lucru, dar exemplul de faŃă foloseşte faptul că rândurile pentru care nu
există legături returnează valori nule pentru a selecta numai genurile care nu au nume
asociate.

SELECT FILM_GEN_DESCRIERE AS GEN


FROM FILM RIGHT OUTER JOIN FILM_GEN
ON FILM.FILM_GEN_COD = FILM_GEN.FILM_GEN_COD
WHERE FILM_TITLU IS NULL;
GEN

Animatie
Copii şi Familie
Clasic
Documentar
Horror
Independent
Musical
SF
Special Interes
Sport
Thriller

Ca răspuns la cererile clienŃilor, mai mulŃi producători de baze de date


relaŃionale au introdus uniunile externe inainte de standardizarea clauzei JOIN.
SecŃiunile următoare prezintă câteva implementări specifice ale sintaxei uniunii
externe. Aceste soluŃii particulare sunt prezentate aici numai pentru că s-ar putea să le
intâlniŃi în instrucŃiuni SQL mai vechi

Sintaxa uniunii externe în Oracle

Oracle Corporation a decis să folosească un semn plus încadrat de paranteze


pentru definirea uniunilor externe. Simbolul ,,(+)“ este plasat în clauza WHERE în
partea opusă tabelului din care vreŃi să fie returnate toate rândurile (indiferent dacă
există legături pentru ele în celalalt tabel). Deoarece datele din celălalt tabel (cel din
care sunt returnate numai rândurile pentru care există legături) sunt completate cu
valori nule atunci când nu este găsit un rând corespondent, este mai uşor să reŃineŃi că
simbolul ,,(+)“ este plasat în partea clauzei WHERE unde vreŃi să adăugaŃi valori
nule. Iată exemplul anterior rescris folosind sintaxa Oracle:

SELECT FILM_GEN_DESCRIERE AS GEN


FROM FILM A, FILM_GEN B
WHERE A.FILM_GEN_COD(+) = B.FILM_GEN_COD AND FILM_TITLU
IS NULL;

Sintaxa uniunii externe în Microsoft SQL Server

Microsoft SQL Server foloseşte operatorul „*=" în condiŃia WHERE pentru o


uniune externă către stânga şi operatorul „=*" pentru o uniune externă către dreapta.
În ambele cazuri, este obligatoriu ca asteriscul şi semnul egal să nu fie separate de
spaŃii. Iată exemplul anterior rescris folosind sintaxa Microsoft SQL Server (ca uniune
externă către dreapta):

SELECT FILM_GEN_DESCRIERE AS GEN


FROM FILM A, FILM_GEN B
WHERE A.FILM_GEN_COD =* B.FILM_GEN_COD
AND FILM TITLU IS NULL;

Auto-uniuni (seif joins)

O auto-uniune (selfjoin) este o uniune a unui tabel cu el însuşi. Există relaŃii


în care cheia primară şi cheia externă se află în acelaşi tabel. Acestea se numesc
relaŃii recursive. În baza de date a magazinului de produse video există o relaŃie
recursivă în tabelul angajaŃi.
Tabelul ANGAJAT are o coloană numită SUPERVISOR_PERSOANA_ID,
care este o cheie externă către coloană PERSOANA_ID din acelaşi tabel. Este folosită
pentru a lega fiecare angajat de şeful direct, care, desigur, este un alt angajat, ceea ce
înseamnă că şi şeful respectiv are o coloană în tabelul ANGAJAT. Interogarea
următoare afişează trei coloane din tabelul ANGAJAT, inclusiv PERSOANA_ID şi
SUPERVISOR_PERSOANA_ID:

SELECT PERSOANA_ID, ANGAJAT_PLATA_ORE AS PLATA_ORE,


SUPERVISOR_PERSOANA_ID PROM ANGAJAT;
PERSOANA_ID PLATA_ORE SUPERVISOR_PERSOANA_ID
1 15
2 9.75 1
10 9.75 1

Aceste date arată că angajaŃii 2 şi l0 sunt subordonaŃi angajatului 1, iar


angajatul 1 nu e subordonat nimanui. .

Uniuni încrucişate (cross joins)

O uniune încrucişată (cross join) nu este altceva decât sintaxa standard


pentru un produs cartezian. Interogarea care care unea tabelele FILM şi FILM_GEN
şi obŃinea un produs cartezian poate fi rescrisă ca mai jos, folosind o uniune
încrucişată:

SELECT FILM_ID, FILM_GEN_DESCRIERE AS GEN, FILM_TITLU


FROM FILM CROSS JOIN FILM_GEN ORDER BY FILM_ID;

Subinterogări

O caracteristică foarte puternică a limbajului SQL sunt subinterogările (numite


şi selecŃii), care, aşa cum sugerează şi numele, se referă la o instrucŃiune SELECT
care contine o instrucŃiune SELECT subordonată. De obicei, subinterogările sunt
folosite în clauza WHERE, ca modalitate de limitare a rândurilor returnate în setul de
rezultate al interogării externe. Aceasta poate fi o modalitate foarte flexibilă de
selectare a datelor.
O regulă esenŃială de sintaxă este ca subinterogarea să fie încadrată de
paranteze.
Orice operaŃie efectuată cu o subinterogare poate fi facută şi printr-o uniune.

Subinterogări necorelate
O subinterogare necorelată (noncorrelated subselect) este o subinterogare în
care interogarea internă nu face nici o referire la interogarea externă care o conŃine.
Aceasta înseamnă că poate fi rulată mai intâi interogarea internă, apoi setul de
rezultate obŃinut poate fi folosit în interogarea externă.
Exemple:

• AfişaŃi toate limbile în care nu există nici un film în inventarul magazinului


de produse video.

SELECT LIMBA_COD, LIMBA_NUME


FROM LIMBA
WHERE LIMBA_COD NOT IN
(SELECT DISTINCT LIMBA_COD
FROM FILM_LIMBA)
ORDER BY LIMBA_COD

LIMBA_COD LIMBA_NUME
Ja Japoneza
Ko Coreana
ni Olandeza
ru Rusa
zh Chineza

Interogarea internă returnează o listă cu codurile de limbă asociate


filmelor în tabelul FILM_LIMBA. Cuvântul cheie DISTINCT elimină rândurile
duplicate din setul de rezultate .
Interogarea internă rulată independent, pentru a vă ajuta să înŃelegeŃi
cum funcŃionează:
SELECT DISTINCT LIMBA_COD FROM FILM_LIMBA;
LIMBA_COD
-------------------------------------------
de (Germana)
en (Engleza)
es (Spaniola)
fr (Franceza)

• Proprietarul magazinului vrea să vadă efectul recentei creşteri de preŃuri şi


are nevoie de o listă a tranzacŃiilor (TRANZACTIE_ID) în care clientul a plătit mai
mult decât taxa medie (INCHIRIAT_TAXA) pentru un film. Iată cum arată
interogarea:

SELECT DISTINCT TRANZACTIE_ID


FROM FILM_INCHIRIAT
WHERE INCHIRIAT_TAXA>
(SELECT AVG(INCHIRIAT_TAXA) FROM FILM_INCHIRIAT)

Interogarea internă calculează media taxelor de închiriere, iar interogarea


externă găseşte apoi toate rândurile din tabelul FILM_INCHIRIAT pentru care
valoarea INCHIRIAT_TAXA depăşeşte media.
Cuvântul cheie DISTINCT elimină tranzacŃiile duplicate.

• Rezultatele interogării anterioare ar fi mai utile pentru proprietarul magazinului


dacă ar include şi data tranzacŃiei. O modalitate de a realiza acest lucru este şi
adăugăm o uniune cu tabelul CLIENT_TRANZACTIE în interogarea externă. Totuşi,
deoarece tocmai aŃi învăŃat despre subinterogari, să facem acelaşi lucru folosind încă
o subinterogare. Iată cum arată interogarea:

SELECT TRANZACTIE_ID, TRANZACTIE_DATA AS TRANZ_DATA


FROM CLIENT_TRANZACTIE
WHERE TRANZACTIE_ID IN
(SELECT DISTINCT TRANZACTIE_ID FROM FILM_INCH,
WHERE INCH_TAXA > (SELECT AVG ( INCHIRIAT_TAXA)
FROM FILM_INCHIRIAT)

TRANZACTIE_ID TRANZ_DATA
9 03/01/2005
10 03/01/2005
Subinterogări corelate

O subinterogare corelată (correlated subselect) este o subinterogare în care


interogarea internă referă valorile furnizate de interogarea externă. Aceste
subinterogari sunt mult mai puŃin eficiente decât subinterogările necorelate, deoarece
interogarea internă trebuie să fie apelată pentru fiecare rând găsit de interogarea
externă.
Exemplu:
Proprietarul magazinului vrea să transmită prin poştă un cupon valoric tuturor
clienŃilor care au plătit mai mult de 15$ pentru o singură tranzacŃie 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
ObservaŃi pseudonimele asociate numelor de tabele din interogările
internă şi externă, precurn şi folosirea acestora în clauza WHERE a interogării
interne. Acesta este elementul de identificare al unei subinterogări corelate.
Interogarea externă selectează o lista de valori CLIENT_CONT_ID distincte din
tabelul CLIENT_TRANZACTIE. Fiecare valoare găsită este transmisă interogării
interne, care este rulată pentru a calcula suma taxelor de închiriere din tranzacŃia
respectivă. Dacă suma taxelor de închiriere este mai mare sau egală cu 15, atunci
clauza WHERE din interogarea externă ia valoarea logică „adevărat", iar rândul
CLIENT_ID este adăugat în setul de rezultate.

Vizualizări în linie

Foarte puŃine implementări, printre care Oracle, permit folosirea unei


subinterogări în clauza FROM a unei interogări, într-o construcŃie numită vizualizare
în linie (inline view). Această construcŃie permite care setul de rezultate al unei
interogări să fie tratat ca şi cum ar fi un tabel sau o vizualizare predefinită. Iată un
exemplu:
• Această interogare află numărul 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ă numărul 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 privinŃa modurilor de utilizare a vizualizărilor în linie - puteŃi chiar să le
uniŃi cu alte tabele sau vizualizări.

Întrebări şi probleme
AlegeŃi răspunsurile corecte pentru fiecare din următoarele întrebări cu
răspunsuri multiple, şi reŃineŃi că întrebările pot avea mai multe răspunsuri corecte.

l. O subinterogare
a. Poate fi folosită pentru a selecta valorile care vor fi aplicate condiŃiilor din
clauza WHERE
b. Poate fi corelată sau necorelată
c. Reprezintă o cale puternică de calculare a coloanelor
d. Trebuie să nu fie încadrate în paranteze
e. Permite selectarea flexibilă a rândurilor

2. O uniune (join) fără o clauză WHERE sau o clauză JOIN


a. Are ca rezultat un mesaj de eroare
b. Nu returnează nici un rând din setul de rezultate
c. Reprezintă o uniune externă (outer join)
d. Reprezintă o uniune internă (inner join)
e. Are ca rezultat un produs cartezian

3. O uniune externă (outer join)


a. Poate fi scrisă în Oracle SQL folosind un simbol (+) în clauza FROM
b. Poate fi scrisă în Microsoft SQL Server folosind operatorul = sau =* în
clauza WHERE
c. Returnează toate rândurile doar din unul dintre tabele
d. Returnează toate rândurile din unul sau din ambele tabele
e. Poate fi catre stânga, către dreapta sau completă

4. O auto-uniune (selfjoin)
a. Nu poate avea niciodată ca rezultat un produs cartezian
b. Poate fi o uniune internă sau o uniune externă
c. Rezolvă relaŃiile recursive
d. Poate folosi o subinterogare pentru a limita şi mai mult rândurile selectate
e. Implică două tabele diferite

5. O uniune (Join)
a. Combină coloanele din două sau mai multe tabele în rezultatele unei
singure interogări
b. Combină rânduri din interogari multiple într-un singur set de rezultate
c. Este realizată ori de câte ori în clauza FROM sunt specificate mai multe
tabele
d. Necesită folosirea unei clauze JOIN
e. Necesită o listă de tabele separate prin virgule în clauza FROM

6. O uniune de egalitate (equijoin)


a. Este cunoscută şi sub numele de uniune externă (outerjoin)
b. Este cunoscută şi sub numele de uniune internă (innerjoiti)
c. Este cunoscută şi sub numele de auto-uniune (selfjoin)
d. Realizează întotdeauna legarea rândurilor folosind o condiŃie de egalitate
(=)
e. Realizează întotdeauna legarea rândurilor folosind o condiŃie de inegalitate
(<>)
7. Calificatorii numelor de coloane:
a. Pot fi nume de tabele
b. Pot fi numere care indică poziŃia relativă a tabelelor dîn lista FORM
c. Pot fi pseudonime pentru numele de coloane , definite în clauza FORM
d. Pot fi pseudonime pentru numele

8.O uniune încruşişată este:


a. O uniune Naturală
b. N produs cartezian
c. O uniune externă
d. O uniune Internă

9. O clauză JOIN folosind cuvântul cheie USING


a. Nu poate fi folosită atunci când coloanele prin care se face legarea
tabelelor au nume diferite
b. Nu poate fi folosită atunci când coloanele prin care se face legarea
tabelelor au aceleaşi nume
c. Defineşte o uniune internă
d. Defineşte o uniune externă
e. Defineşte o auto-uniune

10. O subinterogare corelată


a. Rulează mai eficient decât o subinterogare necorelată
b. Rulează mai puin eficient decât o subinterogare necorelată
c. Are o interogare internă care refera coloane din interogarea externă
d. Are o interogare externă care refera coloane din interogarea internă
e. Are o interogare internă care nu face nici o referire la coloanele din
interogarea externă

ScrieŃi instrucŃiunile SQL pentru următoarele probleme:

1. AfişaŃi numele şi identificatorul de client ale tuturor persoanelor decedate


(valoarea DATA_MORTII nu este nulă) care încă au conturi de client.
2. AfişaŃi numele angajatilor care au conturi de clienŃi. FolosiŃi uniuni pentru
a stabili ce clienŃi sunt angajaŃi şi ce angajaŃi au conturi de clienŃi.
3. RescrieŃi interogarea anterioară pentru a folosi subinterogări în loc de
uniuni.
4. AfişaŃi numele de familie al fiecarui angajat, împreună cu numele de
familie al şefu1ui lor.
5. AfişaŃi numărul de închirieri pentru fiecare format (DVD şi VHS).
6. AfişaŃi numărul de identificare (FILM_ID) şi data la care trebuie returnate
(DATA_RETURNARII) pentru toate filmele închiriate şi încă nereturnate
(coloană RETURNAT_DATA din tabelul FILM_INCH conŃine valori
nule), dar care nu au fost cumpărate (coloană DATA_VANZARII din
tabelul FILM_COPY conŃine valori nule).
7. AfişaŃi numarul de identificare şi titlul filmelor care nu au fost închiriate
niciodată.
8. Folosind subinterogări pentru a filtra rândurile. AfişaŃi titlul filmelor
pentru care în inventar există o copie VHS (MEDIA_FORMAT = ‘V’, iar
DATA_VANZARII are valoarea NULL) dar pentru care nu există copii
DVD (MEDIA_FORMAT = ‚D’ ).
9. RescrieŃi interogarea anterioară folosind o uniune în local unei
subinterogări pentru a găsi filmele în format VHS.
10. AfişaŃi toate filmele pentru care în inventar există mai multe copii în
acelaşi format.

Scrierea interogărilor avansate

În această parte se prezintă câteva subiecte avansate, şi anume:


FuncŃii SQL avansate, inclusiv funcŃii pentru caractere, matematice şi pentru
dată sau oră
O descriere a modului în care puteti beneficia de avantajele vizualizărilor
InformaŃii despre expresia SQL CASE şi despre utilizarea acesteia pentru
construirea instrucŃiunilor care includ porŃiuni executate numai în anumite condiŃii
predefinite.
SecŃiunile următoare descriu funcŃii care nu au fost prezentate dar
foarte utile. Pe lângă funcŃiile pentru caractere şi matematice, sunt incluse câteva
funcŃii pentru date şi ore. ReŃineŃi că toate funcŃiile SQL au o trăsătură comună, în
sensul că returnează o singură valoare, aşa că sunt utile în diferite locuri din
instrucŃiunile SQL, inclusiv în lista de coloane a comenzii SELECT şi în clauza
WHERE. Vă reamintim că există un număr mare de funcŃii specifice fiecărei
implementări, furnizate de diferiŃi producători SGBD.

FuncŃii pentru caractere

FuncŃiile pentru caractere operează asupra datelor de tip text. Această secŃiune
prezintă câteva funcŃii frecvent folosite, pe lângă cele discutate în lecŃia 3.

REPLACE

FuncŃia REPLACE caută un şir de caractere şi înlocuieşte caracterele


găsite cu caracterele din şirul de înlocuire.
Sintaxa generală a funcŃiei:
REPLACE (şir_de_caractere, şir_căutat, şir_de_înlocuire}

 şir_de_caractere reprezintă şirul de caractere în care se face căutare şi, în


cele mai multe cazuri, este numele unei coloane dintr-un tabel, dar poate fi
orice expresie care are ca rezultat un şir de caractere.
 şir_cautat este un şir format dintr-un caracter sau mai multe, care trebuie
căutate în sir_de_caractere.
 şir_de_intocuire este şirul de caractere cu care se înlocuieşte orice apariŃie
a şirului_cautat în şir_de_caractere.
Exemplu care înlocuieşte toate liniuŃele de despărŃire din numărul de telefon al
unei persoane cu puncte (sunt prezentate numai primele două rânduri din setul de
rezultate)

SELECT PERSOANA_TELEFON,
REPLACE(PERSOANA_TELEFON, '-', '.') AS DISPLAY_TELEFON
FROM PERSOANA;

PERSOANA_TELEFON DISPLAY_TELEFON
230—229—8976 230.229.8976
401—617—7297 401.617.7297

LTRIM

FuncŃia LTRIM elimină spatiile de la începutul unui şir de caractere. Sunt


eliminate numai spaŃiile de la începutul şirului, cele din mijlocul şi de la sfârşitul
şirului sunt lăsate ca atare.

LTRIM (‘ String cu spaŃii ‘)


Returnează: ‘String cu spaŃii ’

RTRIM

FuncŃia RTRIM este similar cu LTRIM, dar elimin spatiile de la sfârsitul unui
sir de caractere. Daca trebuie sa eliminati atât spatiile de la inceputul sirului, cat şi pe
cele de la sfarsit, puteti imbrica funcŃiile LTRIM şi RTRIM, ca în urmatorul exemplu:

RTRIM(LTRIM (‘ String cu spatii ‘)


Returnează: ‘String cu spatii’

NOTA: Oracle pune la dispoziŃie o funcŃie mai convenabilă, numită TRIM,


care elimină atât spaŃiile de la începutul şirului, cât şi pe cele de la sfârşit. .

FuncŃii pentru valori nule (NVL, ISNULL, IFNULL)

Oracle, Microsoft SQL Server şi My SQL pun la dispoziŃie o funcŃie care


înlocuieşte valorile nule cu o valoare specificată. Din nefericire, fiecare implementare
foloseste propriul nume pentru aceast funcŃie: NVL în Oracle, ISNULL în SQL
Server şi IFNULL în MySQL.
Exemplele următoare selectează din tabelul FILM_INCHIRIAT, coloana
TAXA_INTARZIERE_SAU_PIERDERE(sau redunumită TAXA_PENALIZARE),
înlocuind valorile nule cu zero. A fost selectată tranzacŃia 9 deoarece conŃine două
filme, dintre care unul are o valoare nulă în coloana
TAXA_INTARZIERE_SAU_PIERDERE (un exemplu bun, care ilustreaza faptul că
valorile nule sunt transformate, în timp ce valorile nenule sunt lăsate ca atare.)

Oracle:
SELECT NVL(TAXA_INTARZIERE_SAU_PIERDERE, 0) AS
TAXA_INTARZIERE_SAU_PIERDERE
FROM FILM_INCHIRIAT WHERE TRANSACTIE_ID=9;

TAXA_INTARZIERE_SAU_PIERDERE
0
29.98
2 rows selected.

Microsoft SQL Server:


SELECT ISNULL(TAXA_INTARZIERE_SAU_PIERDERE, 0) AS
TAXA_INTARZIERE_SAU_PIERDERE
FROM FILM_INCHIRIAT WHERE TRANSACTIE_ID=9 ;

TAXA_INTARZIERE_SAU_PIERDERE
29.98
.00
(2 rows affected)

MySQL:
SELECT IFNULL(TAXA_INTARZIERE_SAU_PIERDERE, 0) AS
TAXA_INTARZIERE_SAU_PIERDERE
FROM FILM_INCHIRIAT WHERE TRANZACTIE_ID=9;

TAXA_INTARZIERE_SAU_PIERDERE
29.98
0.00
2 rows în set (0.16 sec)

Se observă diferenŃa de formatare a rezultatelor pentru clientul MySQL


în linia de comandă.

ASCII
FuncŃia ASCII returnează valoarea din setul de caractere ASCII (un numar
între 0 şi 255) pentru un şir format dintr-un singur caracter.
De exemplu:
ASCII(‘ ‘) eturnează valoarea 32(codul ASCII pentru spaŃiu)
ASCII(‘A’) eturnează valoarea 65(codul ASCII pentru caracterul A)
ASCII(‘a ‘) eturnează valoarea 97(codul ASCII pentru caracterul a)
ASCII(‘1‘) eturnează valoarea 49(codul ASCII pentru caracterul 1)

CHAR (CHR)

FuncŃia CHAR (numită CHR în Oracle şi DB2) returnează caracterul


corespunzator unei valori ASCII (un numar între 0 şi 255). Această funcŃie este utilă
în special pentru concatenarea caracterelor care nu pot fi afişate sau sunt greu de
manipulat în SQL.
De exemplu:
CHAR(44) returnează o virgulă
CHAR(50) returneaza 2
Se poate folosi funcŃiile CHAR şi ASCII consultând tabele cu caractere
şi codurile ASCII corespunzătoare uşor de gasit în Internet, de exemplu:

Valoare Caracter
ASCII
9 Tab
10 Linie noua
13 Retur de car
(CR)
39 Apostrof
Amintim că operatorul de concatenare nu este ace1aşi pentru toate
implementările SGBD(‘+‘ pentru Microsoft SQL Server şi ‘||’ pentru majoritatea
celorlalte sisteme).
Exemple cu funcŃiile ASCII şi CHAR:
Să se găsească toate titlurile de filme care conŃin un caracter Tab:

Microsoft SQL Server:


SELECT FILM_ID FROM FILM
WHERE FILM_TITLU LIKE ‘%‘+CHAR(9)+’%’;

FILM_ID
(0 rows affected)

Oracle:
SELECT FILM_ID FROM FILM
WHERE FILM_TITLU LIKE ‘%‘ || CHR(9) || ‘%‘ ;

no rows selected

Să se găsească toate titlurile de filme care conŃin un caracter apostrof:


SELECT FILM_ID FROM FILM
WHERE FILM_TITLU LIKE ‘%‘+CHAR(39)+’%’;

FILM_ID are valoarea 3 (Something's Gotta Give).

FuncŃii matematice

FuncŃiile matematice returnează rezultatul unei operaŃii matematice şi, de


obicei, acceptă ca parametru de intrare o expresie numerică, care poate fi o valoare
literală, o valoare numerică dintr-o coloană a unui tabel sau orice expresie (inclusiv
rezultatul unei alte funcŃii) care produce o valoarea numerică.

SIGN
FuncŃia SIGN primeşte ca argument o expresie numerică şi returnează una
dintre următoarele valori, în funcŃie de semnul numărului de intrare:

Valoare Semnificatie
returnata
-1 Numărul de intrare este
negativ
0 Numărul de intrare este
zero
1 Numărul de intrare este
pozitiv
Null Valoarea de intrare este
nulă

Exemplu:
SELECT TAXA_PENALIZARE,
SIGN(TAXA_PENALIZARE) AS TAXA_SIGN
FROM FILM_INCHIRIERE
WHERE TAXA_PENALIZARE IS NOT NULL;

TAXA_PENALIZARE TAXA_SIGN
29.99 1
4 1
4 1
29.98 1

SQRT

FuncŃia SQRT primeşte ca argument o expresie numerică şi returnează


rădăcina pătrată a acesteia.
Sintaxa generală a funcŃiei este: SQRT (expresie numerică)

Vom extrage radacina patrată din valorile TAXA_PENALIZARE nenule pe


care tocmai le-am vazut:

SELECT TAXA_INTARZIERE_SAU_PIERDERE,
SQRT (TAXA_PENALIZARE) AS TAXA_SQRT
FROM FILM_INCH
WHERE TAXA_INTARZIERE_SAU_PIERDERE IS NOT NULL;

TAXA_PENALIZARE TAXA_SQRT
29.99 5.47631263
4 2
4 2
29.98 5.47539953

CEILING (CEIL)

FuncŃia CEILING returnează cel mai mic întreg mai mare sau egal cu valoarea
expresiei numerice furnizată ca parametru de intrare, adică rotunjeşte numărul prin
adăugire până la următorul număr întreg. Există câteva probleme interesante de
compatibilitate legate de denumire între implementarile SQL: Microsoft SQL Server
foloseşte numele CEILING, Oracle foloseşte numele CEIL, în timp ce DB2 şi
MySQL permite folosirea ambelor nume (CEIL şi CEILING).
Ca exemplu, să aplicăm funcŃia CEILING asupra valorilor din coloana
TAXA_PENALIZARE :
SELECT TAXA_PENALIZARE,
CEILING (PENALIZARE) AS TAXA_CEILING
FROM FILM_INCHIRIERE
WHERE TAXA_PENALIZARE IS NOT NULL;

TAXA_INTARZIERE_SAU_PIERDERE TAXA_CEILING
4.00 4
4.00 4
29.99 30
29.98 30

FLOOR

FuncŃia FLOOR este inversa logică a funcŃiei CEILING — returnează


cel mai mare întreg mai mic sau egal cu valoarea expresiei numerice furnizată ca
parametru de intrare, adică rotunjeşte numărul prin scădere până la următorul număr
întreg(parte întreagă).
Exemplu, în care se aplică funcŃia FLOOR asupra valorilor din coloana
TAXA_PENALIZARE:

SELECT TAXA_PENALIZARE,
FLOOR(TAXA_INTARZIERE_SAU_PIERDERE) AS TAXA_FLOOR
FROM FILM_INCH WHERE TAXA_INTARZIERE_SAU_PIERDERE IS NOT
NULL;

TAXA_PENALIZARE TAXA_FLOOR
4.00 4
4.00 4
29.99 29
29.98 29

FuncŃii pentru dată şi oră

Există foarte puŃină consecvenŃă în privinŃa funcŃiilor pentru dată şi oră


între diferiŃii producători de sisteme SGBD, motivul este faptul ca producătorii au
dezvoltat propriile tipuri de date temporale înainte de stabilirea standardelor. Din
cauza acestei diversităŃi, funcŃiile pentru dată şi oră sunt prezentate pe scurt pentru
Microsoft SQL Server şî Oracle. Termenii scrişi cu caractere italice sunt definiŃi în
notele care urmează după fiecare tabel, în toată această secŃiune, termenul
data_si__ora înseamnă un şir de caractere care conŃine informaŃii despre dată şi oră,
într-un format acceptabil pentru sistemul SGBD –ul respectiv.

FuncŃii pentru dată şi oră în Microsoft SQL Server


NOTA: Valoarea parte_de_dată este un parametru care specifică o parte a datei,
cum ar fi anul, luna, ziua, ora,minutul, secunda şi milisecunda.

FuncŃie Scop Parametri de intrare


Returnează o nouă valoare data_si_ora, adăugând un
DATEADD interval la valoarea parte _de_data furnizata ca parte_de_data, interval, data_si_ora
parametru
Returnează numărul de intervale data_şi_ora trecute parte _de_data, data de început,
DATEDIFF
între două date dată de sfârşit
Returnează un nume sub formă de text, reprezentând
DATENAME partea _de_dată selectată pentru valoarea data_si_ora porte _de_dată, data_si_ora
furnizată ca intrare
Returnează o valoare intreaga, reprezentand
DATEPART partea_de_data selectata pentru valoarea data_si_ora parte_de_data, data_si_ora
furnizata ca intrare
Returnează o valoare intreaga, reprezentand ziua
DAY data_si_ora
conŃinuta în valoarea data_si _ora furnizata ca intrare.
Returnează valoarea curenta data_si_ora furnizata de
GETDATE Nu are
sistem
Nu are
Returnează valoarea curenta data_si_or UTC (Universal
GETUTCDATE
Coordinated Time)

Returnează o valoare intreaga, reprezentand luna data_si_ora


MONTH
conŃinuta în valoarea data_si_ora furnizata ca intrare

FuncŃii pentru data şi orã în Oracle

Oracle are mai multe de 24 de funcŃii pentru data şi ora. RetineŃi că Oracle
numeşte acest tip de date DATE şi toate datele au o componentă pentru orã, care are
valoarea zero (reprezentând miezul noptii) atunci când nu este folosită. FuncŃiile pe
care este cel mai probabil să le folosiŃi sunt prezentate în tabelul următor:

NOTĂ:
• Cuvântul cheie pentru câmpul data_şi__ora este un cuvânt cheie care
specifică unul dintre câmpurile conŃinute de o dată Oracle, respectiv YEAR,
MONTH, DAY, HOUR, MINUTE şi SECOND.
• Şir_pentru_formatare este un şir de simboluri care specifică formatul
folosit pentru dată atunci când aceasta este convertită în sau dintr-un şir de caractere.
Există peste 40 de simboluri diferite care pot fi folosite în şirurile de formatare (puteŃi
găsi lista completă în documentaŃia Oracle). De exemplu, şirul de formatare
'MM/DD/YYYY HH:MI' are ca rezultat o dată, ca şir de caractere, de forma
'12/01/2004 11:58’, iar şirul de formatare 'DD-MON-RR' (formatul Oracle prestabilit)
are ca rezultat o dată de forma '01-Dec-04’.
• FuncŃia TO_CHAR poate fi folosită şi pentru transformarea valorilor
numerice în şiruri de caractere.
• FuncŃia TRUNC poate fi folosita şi pentru trunchierea valorilor numerice,
având ca efect ştergerea cifrelor din dreapta punctului zecimal.
FuncŃie Scop Parametri de intrare
Data, numarul de luni (o
Adauga numarul de luni specificat la data
ADD_MONTHS valoare pozitiva sau
furnizata ca parametru
negativa)
Returnează data curenta în zona orara stabilita
CURRENT_DATE Nu are
pentru sesiunea bazei de date
Extrage campul data_si_ora specificat din data Cuvant cheie pentru
EXTRACT
furnizata ca intrare data_si_ora, data
Returnează data furnizata, cu ziua inlocuita cu
LAST_DAY data
ultima zi a lunii respective
Returnează numarul de luni (inclusiv partea
fractionara) intre doua date furnizate ca intrare;
MONTHS_BETWEEN Prima data, a doua data
rezultatul este negativ daca a doua data este
inaintea primei
Returnează valoarea curenta data_si_ora furnizata
SYSDATE Nu are
de sistem
Atunci cand este folosita pentru o data, funcŃia
TO_CHAR returnează un sir de caractere, în formatul Data, sir_pentru_formatare
specificat de sirul_pentru_formatare
Transforma sirul de caractere furnizat ca intrare
intr-o data formatata intern de Oracle, folosind
TO_DATE Data, sir_pentru_formatare
sirul_pentru_formatare ca tipar pentru a interpreta
conŃinutul sirului de caractere
Trunchiaza o data la unitatea de timp specificata
de cuvantul cheie data_si_ora. Daca acest Data, cuvant cheie pentru
TRUNC
parametru este omis, data este trunchiata la ziua data_si_ora
curenta.

Folosirea avantajelor oferite de vizualizari

Amintim că o vizualizare (view) este o interogare stocată în baza de


date, care pune la dispoziŃia utilizatorului bazei de date un subset particularizat de
date din unul sau mai multe tabele ale bazei de date. Microsoft Access foloseşte
termenul query (interogare) în loc de vizualizare. FrumuseŃea vizualizărilor constă în
faptul că, după ce sunt create, pot fi interogate ca şi cum ar fi tabele reale. De fapt, nu
este nevoie ca utilizatorul să ştie dacă foloseşte o vizualizare sau un tabel real. Pot
exista unele restricŃii la manipularea datelor (la inserare, actualizare şi ştergere) dar
interogările funcŃionează pentru vizualizări la fel ca şi pentru tabele.
Vizualizările oferă şi alte avantaje:

 Maschează coloanele pe care utilizatorul nu este nevoie sau nu trebuie să


le vadă
 Maschează rândurile pe care utilizatorul nu este nevoie sau nu trebuie să le
vadă
 Maschează operatiile complexe, precum uniunile
 Cresc performanŃele interogărilor

Exemplele din această secŃiune prezintă vizualizări care vă oferă avantajele


menŃionate mai sus. Vă amintiŃi din LecŃia 2, că sintaxa generală pentru crearea unei
vizualizări este :
CREATE [OR REPLACE] VIEW nume_vizualizare AS
interogare_sql;
Exemple:
• Reguli evidente de confidenŃialitate obligă administratorul magazinului să
Ńină secrete datele de identificare ale angajaŃilor (numerele de asigurări sociale) şi
salariile. Totuşi, există un număr de aplicaŃii care necesită furnizarea unor informaŃii
despre angajaŃi, cum ar fi numele sau numele şefului lor (dacă există), în asemenea
situaŃii, aveŃi nevoie de o vizualizare care să poată fi folosită în siguranŃă de un
dezvoltator, fără pericolul de a dezvălui în mod accidental informaŃii confidenŃiale.
Interogarea din vizualizare trebuie să realizeze o uniune (join) cu tabelul PERSOANA
pentru a afla numele angajatului şi (folosind o uniune externă) numele şefului
acestuia. InstrucŃiunea SQL folosită pentru crearea vizualizării:

CREATE VIEW ANGAJAT_LISTA AS


SELECT A.PERSOANA_ID AS ID,
B.PERSOANA_PRENUME AS PRENUME,
B.PERSOANA_INITIALA AS INITIALA ,
B.PERSOANA_NUME_FAMILIE AS NUME,
C.PERSOANA_PRENUME AS MANAGER_PRENUME,
C.PERSOANA_NUME_FAMILIE AS MANAGER_NUME
FROM ANGAJAT A JOIN PERSOANA B
ON A.PERSOANA_ID = B.PERSOANA_ID
LEFT OUTER JOIN PERSOANA C
ON A.SUPERVISOR_PERSOANA_ID = C.PERSOANA_ID
View created.
După crearea vizualizării, puteŃi să o interogaŃi ca şi cum ar fi un tabel.
O interogare simplă făcută în vizualizarea pe care tocmai am creat-o:

SELECT NUME, MANAGER_NUME


FROM ANGAJAT_LISTA
ORDER BY NUME;
NUME MANAGER_NUME
Alexandru
Popescu Alexandru
Ionescu Alexandru

• Pentru crearea unui catalog cu filmele disponibile, aveŃi nevoie de o listă cu


descrierile categoriilor MPAA şi cu descrierile genurilor.
InstrucŃiunea SQL folosită pentru crearea vizualizării:

CREATE VIEW FILM_LISTA AS


SELECT A.FILM_ID, B.FILM_GEN_DESCRIERE AS GEN,
C.MPAA_RATING_COD AS RATING,
C.MPAA_RATING_DESCRIERE AS RATING_DESC,
A.FILM_TITLU, A.RETAIL_PRET_VHS,
A.RETAIL_PRET_DVD, A.ANUL_PRODUCERII
FROM FILM A JOIN FILM_GEN B ON
A.FILM_GEN_COD = B.FILM_GEN_COD
JOIN MPAA_RATING C ON
A.MPAA_RATING_COD = C.MPAA_RATING_COD

Exemplu de interogare simplă care foloseşte vizualizarea în locul tabelelor de


bază:

SELECT GEN, RATING, FILM_TITLU


FROM FILM_LISTA
ORDER BY GEN, RATING, FILM_TITLU;

GEN RATING FILM_TITLU


Actiune şi Aventura PG-13 Master and Commander: The Far
Actiune şi Aventura PG-13 Pirates of the Caribbean: The
Actiune şi Aventura PG-13 The Day After Tomorrow
Actiune şi Aventura PG-13 The Italian Job
Actiune şi Aventura R Kill Bill: Vol. 1
Actiune şi Aventura R Man on Fire
Actiune şi Aventura R The Last Samurai
Comedie PG-13 50 First Dates
Comedie PG-13 Matchstick Men
Comedie PG-13 Something's Gotta Give
Comedie PG-13 The School of Rock
Drama PG-13 Big Fish
Drama R Cold Mountain
Drama R Lot în Translation
Drama R Monster
Drama R Mystic River
Drama R Road to Perdiction
Strain R Das Boot
Romantic PG-13 13 Going 30
Romantic PG-13 Two weeks notice

• Magazinul de produse video ar vrea să instaleze un chioşc informatizat în


secŃiunea de filme pentru copii, astfel încât tinerii să poată căuta filmele online.
Dorim ca numai filmele din categoriile MPAA G, PG şi PG-13 să fie disponibile în
acest chioşc. În loc să se repete uniunea din vizualizarea FILM_LISTA dacă MPAA
ar modifica sistemul de clasificare, se poate folosi vizualizarea FILM_LISTA pentru
a crea o nouă vizualizare (adică se poate folosi o vizualizare pentru a crea o altă
vizualizare!
Exemplu:

CREATE VIEW COPII_FILM_LISTA AS


SELECT * FROM FILM__LISTA
WHERE RATING IN ('G', 'PG', 'PG-13')
Rezultatele obŃinute, folosind aceeaşi interogare ca şi pentru vizualizarea
FILM_LISTA:

SELECT GEN, RATING, FILM_TITLU


FROM COPII_FILM_LISTA
ORDER BY GEN, RATING, FILM _TITLU;

GEN RATING FILM TITLU


Actiune şi Aventura PG-13 Master and Commander: The Far
Actiune şi Aventura PG-13 Pirates of the Caribbean: The
Actiune şi Aventura PG-13 The Day After Tomorrow
Actiune şi Aventura PG-13 The Italian Job
Comedie PG-13 50 First Dates
Comedie PG-13 Matchstick Men
Comedie PG-13 Something's Gotta Give
Comedie PG-13 The School of Rock
Drama PG-13 Big Fish
Romantic PG-13 13 Going on 30
Romantic PG-13 Two Weeks Notice

Vizualizarea COPII_FILM_LISTA se bazează pe vizualizarea FILM_LISTA şi


poate să devină invalidă sau să nu mai funcŃioneze corect dacă vizualizarea
FILM_LISTA este modificată. Vizualizările sunt instrumente puternice, care nu pot fi
ignorate.

Expresia CASE

Expresia CASE este o adăugire recentă, dar foarte importantă, la standardul


SQL. Pentru prima dată, părŃi ale instrucŃiunilor SQL pot fi executate condiŃional. De
exemplu, o coloană din rezultatele interogării poate fi formatată în funcŃie de valorile
conŃinute pe o altă coloana.
Expresia CASE admite două forme generale:

Expresia CASE simplă

Sintaxa generală pentru forma simplă a expresiei CASE:

CASE expresie_ de_ intrare


WHEN expresie_de_comparare THEN expresie__rezultat [WHEN expresie
de_comparare THEN expresie_rezultat.. ] ELSE expresie_rezultat
END

notă:
Fiecare condiŃie WHEN este evaluată sub forma expresie_de_intrare =
expresie_comparare şi, dacă rezultatul are valoarea TRUE logic, este returnată
valoarea expresie_rezultata şi nici o altă condiŃie WHEN nu mai este evaluată.
Dacă nici una dintre condiŃiile WHEN nu este evaluată ca adevărată şi exista o
condiŃie ELSE, este returnată valoarea expresie_rezultat asociată condiŃiei ELSE.
Dacă nici una dintre condiŃiile WHEN nu este evaluată ca adevărată şi nu
există o condiŃie ELSE, este returnată o valoare nula.

De exemplu, se poate folosi expresia CASE pentru a transforma


valoarea MPAA_RATING_COD într-un mesaj simplu, care poate fi afişat la
terminalul de vânzare, pentru a aminti personalului magazinului să verifice vârsta
clienŃilor în cazul filmelor cu o categorie MPAA mai mare de PG-13. RemarcaŃi
plasarea cuvântului cheie AS imediat după cuvântul cheie END, pentru a asocia un
nume coloanei generate în setul de rezultate. Iată exemplul:

SELECT FILM_ID, MPAA_RATING_COD AS RATING,


CASE MPAA_RATING_COD
WHEN 'G' THEN ‚Toate varstele'
WHEN 'PG' THEN ‚Acordul parintilor’
WHEN 'PG-13' THEN 'Peste 13 ani'
ELSE 'Peste 17 ani’ END AS RATING_DESC
FROM FILM
ORDER BY FILM _ID;

FILM ID RATING RATING_DESC


1 R Peste 17 ani
2 R Peste 17 ani
3 PG-13 Peste 13 ani
4 PG-13 Peste 13 ani
5 R Peste 17 ani
6 PG-13 Peste 13 ani
7 PG-13 Peste 13 ani
8 R Peste 17 ani
9 PG-13 Peste 13 ani
10 R Peste 17 ani

Expresia CASE cu căutare

Expresie CASE cu căutare (searched CASE) permite folosirea unor condiŃii de


comparare mai flexibile, deoarece fiecare condiŃie este complet specificată, incluzând
şi operatorul de comparare. Sintaxa generală a expresiei:

CASE
WHEN condiŃie THEN expresie_rezultat
[WHEN condiŃie THEN expresie_rezultat. . . ]
ELSE expresie_rezultat
END

notă:
Fiecare condiŃie poate fi orice expresie SQL care este evaluată ca adevărata
sau falsă.
CondiŃiile WHEN sunt evaluate secvenŃial şi, dacă una este evaluată ca
adevărata, este returnata valoarea expresie_rezultat asociată şi nici o altă condiŃie
WHEN nu mai este evaluata.
Dacă nici una dintre condiŃiile WHEN nu este evaluată ca adevărată şi există o
condiŃie ELSE, este returnată valoarea expresie_rezultat asociată condiŃiei ELSE.
Dacă nici una dintre condiŃiile WHEN nu este evaluata ca adevărată şi nu
exişti o condiŃie ELSE, este returnată o valoare nulă.
De exemplu, considerăm o interogare care clasifică filmele în format VHS, în
funcŃie de pret:

SELECT FILM_ID, RETAIL_PRET_VHS,


CASE
WHEN RETAIL_PRET__VHS IS NULL THEN ‚Not Available’ ;
WHEN RETAIL_PRET_VHS < 10 THEN ’Ieftin’
WHEN RETAIL_PRET__VHS < 20 THEN ’Convenabil’
WHEN RETAIL PRET VHS < 40 THEN ’Mediu’
ELSE 'Scump'
END AS PRET_CATEGORIE
FROM FILM
ORDER BY FILM_ID;

FIL RETAIL_PRET_ PRET_CATEGOR


M_ID VHS IE

1 58.97 Scump
2 15.95 Convenabil
3 14.95 Convenabil
4 11.95 Convenabil
5 24.99 Mediu
6 24.99 Mediu
7 14.95 Convenabil
8 50.99 Scump
9 12.98 Convenabil
10 49.99 Scump

Întrebări şi Probleme

AlegeŃi răspunsurile corecte pentru fiecare din următoarele întrebări cu


răspunsuri multiple. ReŃineŃi că întrebările pot avea mai multe răspunsuri corecte.

1. FuncŃiile SQL
a. Returnează un set de valori
b. Returnează o singură valoare
c. Pot fi folosite în clauza WHERE a unei instrucŃiuni SQL
d. Pot fi folosite ca pseudonime pentru numele tabelelor intr-o instr. SQL
e. Pot fi folosite în lista de coloane a unei instrucŃiuni SQL
2. FuncŃia REPLACE
a. Înlocuieşte un nume de tabel cu un nume de vizualizare
b. Înlocuieşte numele unei coloane cu pseudonimul coloanei
c. Înlocuieşte un şir de caractere dintr-o coloană cu un alt şir de caractere
d. Înlocuieşte toate valorile dintr-o coloană cu un alt set de valori
e. Înlocuieşte toate rândurile dintr-o vizualizare cu rânduri conŃinând date
dintr-un alt tabel
3. FuncŃia LTRIM
a. Elimină spaŃiile de la sfârşitul şirurilor de caractere
b. Elimină spaŃiile de la începutul şirurilor de caractere
c. Poate fi imbricată cu alte funcŃii
d. înlocuieşte valorile nule cu alte valori în şirurile de caractere
e. Elimină spaŃiile de la începutul şi de la sfârşitul şirurilor de caractere
4. FuncŃia CHAR
a. Este numită CHR în unele implementări SQL
b. Este identică cu funcŃia ASCII în unele implementări SQL
c. Returnează valoarea corespunzătoare unui caracter din setul de caractere
ASCII
d. Returnează caracterul corespunzător unei valori
e. Transformă o valoare numerică într-un şir de caractere
5. FuncŃia SIGN
a. Returnează -l daca parametrul furnizat are valoare negativa
b. Returnează 0 dacă parametrul furnizat are valoarea zero
c. Returnează +1 dacă parametrul furnizat are o valoare pozitivă
d. Returnează 0 dacă parametrul furnizat are valoarea NULL
e. Returnează o valoare nulă dacă parametrul furnizat nu este un număr
6. FuncŃia CEILING
a. Rotunjeşte un număr prin adăugire până la primul număr întreg
b. Rotunjeşte un număr prin scădere până la primul număr întreg
c. Returnează întotdeauna un număr întreg
d. Returnează un număr întreg sau o valoare nulă
e. Este numită CEIL în unele implementări SQL
7. FuncŃia FLOOR
a. Rotunjeşte un număr prin adăugire până la primul număr întreg
b. Rotunjeşte un număr prin scădere până la primul număr întreg
c. Returnează întotdeauna un număr întreg
d. Returnează un număr întreg sau o valoare nulă
e. Este numită FLR în unele implementări SQL

8. Expresiile CASE
a. Permit executarea condiŃională a clauzelor dintr-o instrucŃiune SQL
b. Există sub două forme, respectiv statice şi dinamice
c. Exista sub două forme, respectiv cu căutare şi fara cautare
d. Există sub două forme, respectiv simple şi cu cautare
e. Există sub două forme, respectiv standard şi cu cautare

ScrieŃi instrucŃiunile SQL pentru următoarele probleme:

1. AfişaŃi valorile MPAA_RATING_COD din tabelul MPAA_RATING, cu


liniuŃele de despărŃire înlocuite cu spaŃii.
2. Folosind funcŃia CHAR (numită CHR în Oracle), afişaŃi valorile FILM_ID
şi FILM_TITLU pentru toate filmele care conŃin apostrofuri (caracterul
ASCII 39) în titlu.
3. AflaŃi valoarea ASCII a semnului de exclamare (!).
4. AflaŃi preŃul mediu al filmelor în format DVD (coloana RETAIL_PRET
_DVD din tabelul FILM), cu media calculată rotunjită prin adăugire la cea
mai apropiată sumă fără zecimale.
5. AflaŃi preŃul mediu al filmelor în format VHS (coloana
RETAIL_PRET_VHS din tabelul FILM), cu media calculată rotunjită prin
scădere la cea mai apropiată sumă fără zecimale.
6. Pentru o bază de date Oracle, generaŃi comenzile SQL pentru eliminarea
tuturor restricŃiilor referenŃiale aflate în proprietatea utilizatorului curent.
Vizualizarea Oracle de tip catalog se numeşte USER_CONSTRAINTS, iar
restricŃiile referenŃiale au valoarea 'R' în coloana CONSTRAINT_TYPE.
Numele tabelului pe care se bazează restricŃia se află în coloana
TABLE_NAME a vizualizării. Nu uitaŃi că trebuie să folosiŃi comanda
ALTER TABLE pentru eliminarea unei restricŃii.
7. Pentru o bază de date Microsoft SQL Server, afişaŃi toate restricŃiile de tip
cheie externă. FolosiŃi tabelul de sistem SYSOBJECTS, în care NAME este
numele restricŃiei, iar coloana XTYPE are valoarea 'F' pentru restricŃiile de
tip cheie externă.
8. ScrieŃi o instrucŃiune SQL care afişează fiecare cont de client
(CLIENT_CONT_ID) cu un şir de caractere bazat pe valoarea coloanei
COPIL_INCH_ALLOWED_INDIC, care să conŃină textul „Poate fi
inchiriat de copii" dacă valoarea coloanei este 'Y' şi textul „Nu poate fi
inchiriat de copii" dacă valoarea este 'N'. Sugestie: Cel mai bine
funcŃionează în acest caz o expresie CASE simplă.
9. ScrieŃi o instrucŃiune SQL care afişează fiecare film (FILM_ID) şi o valoare
pentru deceniu, în funcŃie de valoarea coloanei ANUL_PRODUCERII sau
necunoscut), în acest caz v-ar fi de folos o expresie CASE cu cautare.
10. ScrieŃi o instrucŃiune SQL care afişează fiecare inchiriere a unui film
(tabelul FILM_INCH) cu valoarea TAXA_PENALIZAREclasificaŃa astfel:
None (valoare nulă sau zero), Minor (valoare < 10) sau Major (valoare > 10) .

LecŃia 5. Limbajul de manipulare a datelor – DML

În această lecŃie se prezintă instrucŃiunile DML (Data Manipulation


Language), o parte a limbajului SQL folosită pentru intreŃinerea datelor stocate în
tabele relaŃionale ale bazei de date.
Limbajul DML este format din trei comenzi SQL:

INSERT Adaugă noi rânduri într-un table al bazei de date.


UPDATE Actualizeaza rândurile existente Într-un table al bazei de date.
DELETE Sterge rânduri dintr-un tabel al bazei de date

InstrucŃiunile DML individuale afectează datele dintr-un singur tabel. Este


posibil ca într-o instrucŃiune DML să referiŃi şi o vizualizare care conŃine date din mai
multe tabele (adică o vizualizare care conŃine o uniune de tabele), dar, în acest caz,
instrucŃiunea DML poate referi numai coloane dintr-un singur tabel al vizualizării. Cu
alte cuvinte, atunci cand o instrucŃiune DML foloseşte o vizualizare, toate coloanele
vizualizării referite în instrucŃiunea DML trebuie să corespundă unor coloane dintr-un
singur tabel fizic al bazei de date.
Este foarte probabil ca sistemul SGBD folosit să pună la dispoziŃie o formă
oarecare de tranzacŃii, în care o serie de instrucŃiuni DML sunt tratate unitar, adică un
grup de instructiuni care trebuie să reuşească toate sau sa eşueze toate. Această
caracteristică este foarte utilă atunci când instructiunile SQL sunt folosite în tranzacŃii
comerciale.
SGBD va trata fiecare instrucŃiune DML individuală ca pe o tranzactie.
Aceasta înseamna că, dacă apare o eroare la modificacfrea unui rând identificat de
instrucŃiunea DML, sistemul DML va anula intreaga instrucŃiune, asa că aceasta nu va
afecta nici unul din rândurile tabelului. Cu alte cuvinte, sistemul SGBD nu va permite
niciodată apariŃia inconsecvenŃelor în baza de date. De exemplu , dacă incerc să sterg
toate rândurile din tabelul FILM şi apare o eroare la ştergerea celui de-al treilea rând
(după ce au fost deja şterse primele două rânduri ), întreaga instrucŃiune eşuează şi
sistemul SGBD reface (unii ar spune „ca prin magie”) cele două rânduri şterse.
Instructiunile SQL din acestă lecŃie presupune că sistemul SGBD pe care il
utilizaŃi foloseste formatul AAAA-LL-ZZ pentru datele calendaristice.
Pentru bazele de date Oracle, instrucŃiunea de mai jos modifică formatul
datelor calendaristice pentru sesiunea curenta (baza de date revine la formatul
prestabilit de fiecare dată când va reconectaŃi la baza de date):

ALTER SESSION SET NLS_DATA_FORMAT=’YYYY-MM-DD’;

Un alt aspect de care este important să se Ńină seama, sunt restricŃiile definite
în tabelul referit de instrucŃiunea DML. Sistemul SGBD nu va efectua în baza de date
nici o modificare care încalcă una din restricŃii.
La formarea instructiunilor DML, trebuie să se Ńină seama de urmatoarele
aspecte referitoare la restricŃiile tabelului modificat:
RestricŃii de tip cheie primară
Atunci când inseraŃi un nou rând într-un tabel, cheia primară a noului rând
trebuie sa fie unică în întregul tabel.Cand modificati valoarea unei chei primare (ceea
ce se intampla rareori), noua valoare trebuie să fie unică în întregul tabel.
RestricŃii de unicitate
Ca şi în cazul cheilor primare, coloanele pe care a fost definită o restricŃie de
unicitate trebuie sa aibă valori unice în întregul tabel.
RestricŃii NOT NULL
O valoare nula (null) este o modalitate specială prin care sistemul SGBD
tratează valoarea unei coloane pentru a indica faptul ca valoarea coloanei respective
nu este cunoscută. O valoare nula nu este acelasi lucru un un spatiu liber, un sir vid
sau valoarea zero – este o valoare speciala care nu este egala cu nimic altceva.
În cazul instrucŃiunilor INSERT, trebuie specificate valori pentru toate
coloanele cu restricŃii NOT NULL.
În cazul instrucŃiunilor UPDATE nu se pot inlocui valorile unei coloane cu
valori nule dacă pe coloana respectivă este definită p restricŃie NOT NULL.
Dacă instrucŃiunea DML referă o vizualizare , nu se poate sa o folosim intr-o
instrucŃiune INSERT dacă una dintre coloanele tabelului cu o restricŃie NOT
NULL(obligatorii) lipseşte din definirea vizualizării.

RestricŃii referenŃiale
Nu se poate insera sau actualiza valoarea unei chei externe decât dacă există
deja rândul părinte corespondent care conŃine valoarea cheii în coloana cheii primare.
In sens invers, nu se poate şterge un rând părinte dacă există rânduri subordonate care
referă valoarea din rândul părinte, decât dacă restricŃia a fost definită cu opŃiunea ON
DELETE CASCADE. In general inserările în tabele trebuie făcute ierarhic (mai intai
randurile parinte, apoi randurile copii), iar ştergerile trebuie făcute în ordine inversă
(copiii inaintea părinŃilor).

Restrictii de verificare (CHECK) O instructiune INSERT sau UPDATE nu


poate stoca într-o coloana o valoare care încalcă o restricŃie CHECK definită pentru
coloana respectivă.

InstrucŃiunea INSERT

InstrucŃiunea SQL INSERT este folosită pentru inserarea noilor rânduri de


date în tabele. InstrucŃiunea are două forme de bază: una în care valorile coloanelor
sunt specificate chiar în instrucŃiune şi alta în care valorile sunt selectate dintr-un tabel
sau o vizualizare, folosind o subinterogare.

Inserarea unui singur rand de dete folosind clauza Values

InstrucŃiunea INSERT care foloseşte o clauză VALUES poate crea un singur


rând la fiecare rulare, deoarece valorile pentru rândul de date respective sunt
specificate chiar în instrucŃiune.
Iata sintaxa generală a instrucŃiunii:
INSERT INTO nume_tabel_sau_vizualizare
[(lista_de_coloane)]
VALUES (lista_de_valori);

Se poate remarca următoarele:

• Lista de coloane este opŃională, dar dacă este inclusă trebuie sa fie incadrată în
paranteze.
• Dacă lista de coloane este omisă, trebuie specificată o valoare pentru fiecare
coloană din tabel, în ordinea în care sunt definite coloanele în tabel. Este bine
ca întotdeauna să includeŃi lista de coloane, deoarece opiterea acesteia face ca
instrucŃiunea INSERT să fie dependentă de definiŃia tabelului. Dacă o coloană
este modificată sau în tabel este adăugată o nouă coloană, chiar şi opŃională,
probabil instrucŃiunea INSERT va eşua la următoarea rulare.
• Dacă lista de coloane este specificată, lista de valori trebuie să conŃin o valoare
pentru fiecare coloană din listă, în aceeaşi ordine. Cu alte cuvinte, între lista de
coloane şi lista de valori trbuie să existe o corespondenŃa unu-la-unu. Orice
coloana care lipseşte din listă va primi o valoare nulă, presupunund că valorile
nule sunt acceptate în coloana respectivă.
• Cuvântul cheie NULL poate fi folosit în lista de valori pentru specificarea unei
valori nule pentru o coloană.
• În Microsoft SQL Server şi Sybase Adaptive Server nu puteŃi insera valori într-
o coloană care a fost definită proprietatea IDENTITY. Proprietatea IDENTITY
este o metodă frecven folosită pentru a atribui valori secvenŃiale unei chei
primare, cum ar fi coloana FILM_ID din tabelul FILM. Dacă pentru o coloană
a fost definită proprietatea IDENTITY, puteŃi să omiteŃi coloana respectivă din
instrucŃiunea INSERT, iar sistemul SGBD va atribui cheii primare următoarea
valoare unică disponibilă. O altă soluŃie este să dezactivaŃi restricŃia, folosind
următoarea instrucŃiune:
SET identity_insert nume_tabel ON
Exemplul următor conŃine două instrucŃiuni INSERT, una care creează un nou
rând în tabelul FILM, cu o listă opŃională de coloane, din care este omisă coloana
RETAIL_PRET_VHS, şi alta care creează un rând în tabelul FILM_COPII pentru
acelaşi timp, dar fără lista opŃională de coloane.
INSERT INTO FILM
(FILM_ID, FILM_COD_GEN, MPAA_RATING_COD, FILM_NUME,
PRET_INCHIRIAT_DVD, AN_PRODUCERE)
VALUES (21,’Drama’,’PG-13’,’Ray’, 29.95, ’2004’);
INSERT INTO FILM_COPII
VALUES (21, 1, ’2005-04-01’,NULL,’V’);

Pentru Microsoft SQL Server şi Sybase Adaptive Server, dacă este definită
proprietatea IDENTITY pentru tabelul FILM, se poate folosi următoarea variantă a
primei instrucŃiuni INSERT:

INSERT INTO FILM


(FILM_COD_GEN,MPAA_COD_VARSTE,FILM_NUME,
RETAIL_PRET_DVD,AN_PRODUCERE)
VALUES (’Drama’, ’PG-13’, ’Ray’, 29.95, ’2004’);

Inserări masive folosind instrucŃiunea SELECT internă

Aşa cum se observă, este nevoie de foarte mult cod pentru a insera în tabel un
singur rând de date folosind o instrucŃiune INSERT cu clauza VALUES.
O altă soluŃie, care poate fi folosită pentru a insera rânduri multiple într-un
tabel , este forma care foloseşte o instrucŃiune SELECT internă. Această formă este
utilă şi pentru stabilirea următoarei valori disponibile pentru o cheie primară cu valori
secvenŃiale. De asemenea , poate fi folosită atunci când creaŃi un tabel temporar
pentru testare şi vreŃi să-l populaŃi cu toate datele dintr-un alt tabel.

Sintaxa generală a instrucŃiunii este


INSERT INTO nume_tabel_sau_vizualizare
[(lista_de_coloane)]
SELECT instructiune_select;

Se remarcă următoarele:
• Lista de coloane este opŃională, dar dacă este inclusă trebuie să fie încadrată în
paranteze.
• Dacă lista de coloane este omisă, instrucŃiune SELECT internă trebuie să
furnizeze o valoare pentru fiecare coloană din tabel, în ordinea în care sunt
definite coloanele în tabel. Este bine ca întotdeauna să includeŃi lista de
coloane, deoarece opiterea acesteia face ca instrucŃiunea INSERT să fie
dependentă de definiŃia tabelului. Dacă o coloană este modificată sau în tabel
este adăugată o nouă coloană, chiar şi opŃională, probabil instrucŃiunea
INSERT va eşua la următoarea rulare.
• Dacă lista de coloane este specificată, instrucŃiune SELECT internă să
furnizeze o valoare pentru fiecare coloană din lista de valori, în aceeaşi ordine.
Cu alte cuvinte, între lista de coloane şi setul de rezultate al instrucŃiunii
SELECT trebuie să existe o corespondenŃa unu-la-unu. Orice coloană care
lipseşte din listă va primi o valoare nulă, presupunund că valorile nule sunt
acceptate în coloana respectivă.
• Cuvântul cheie NULL poate fi folosit în instrucŃiunea SELECT pentru
specificarea unei valori nule pentru o coloană.

Ca exemplu, să presupunem că toate filmele sunt acum disponibile şi în limba


franceză. Tabelul FILM_LIMBA conŃine rânduri pentru limba franceză pentru o parte
din filme, aşa că acum vrem să le adăugăm numai pe cele care lipsesc. InstrucŃiunea
INSERT care va rezolva această problemă este:

INSERT INTO FILM_LIMBA


(FILM_ID, COD_LIMBA)
SELECT FILM_ID, ’fr’
FROM FILM FILM
WHERE FILM_ID NOT IN
( SELECT FILM_ID FROM FILM_LIMBA
WHERE COD_LIMBA =’fr’ );

InstrucŃiunea UPDATE

InstrucŃiunea UPDATE este folosită pentru actualizarea datelor din coloanele


unui tabel (sau ale unei vizualizări).
Sintaxa generală a instrucŃiunii UPDATE:
UPDATE nume_tabel_sau_vizualizare
SET nume_coloana = expresie
[,nume_coloana = expresie...]
[ WHERE conditie];

Se remarcă următoarele:
• Clauza SET conŃine o listă cu una sau mai multe coloane, împreună cu o
expresie care specifică noua valoare pentru fiecare coloană. Aceasta este o listă
de perechi nume-valoare, separate prin virgule, cu un operator de egalitate între
fiecare nume şi valoare.
• Expresia poate fi o constantă, un alt nume de coloană sau orice altă expresie pe
care SQL o poate transforma într-o singură valoare, care poate fi apoi atribuită
coloanei respective.
• Clauza WHERE conŃine o expresie care limitează rândurile actualizate. Dacă
această clauză este omisă, motorul SQL va încerca să actualizeze toate
rândurile din tabel sau din vizualizare.

Exemple:
• Un film a fost adăugat cu un preŃ incorect. InstrucŃiunea următoare va actualiya
două coloane din acelaşI rând a tabelului MOVIE.

UPDATE FILM
SET RETAIL_PRET_VHS = 29.95 ,
RETAIL_PRET_DVD = 34.95
WHERE FILM_ID = 21
• Conducerea firmei de produse video a decis să crească salariul tuturor
funcŃionarilor cu 10 procente. Această instrucŃiune va actualiza o singură
coloană de pe mai multe rânduri, rotujind rezultatul la 2 zecimale cu funcŃia
ROUND.
UPDATE ANGAJAT
SET ANGAJAT_PLATA_ORA = ROUND
(ANGAJAT_PLATA_ORA * 1.1, 2)
WHERE ANGAJAT_JOB_CATEGORY =’C’ ;

InstrucŃiunea DELETE

InstrucŃiunea DELETE şterge unul sau mai multe rânduri dintr-un tabel.
InstrucŃiunea poate să folosească şi o vzualizare, dar numai dacă aceasta se bazează pe
un singur tabel (ceea ce înseamnă că instrucŃiunile DELETE nu pot fi folosite pentru
vizualizări care conŃin uniuni). În instrucŃiunile DELETE nu sunt referite niciodată
coloane, doarece instrucŃiunea şterge rânduri întregi de date, inclusiv toate valorile
datelor (toate coloanele) din rândurile afectate. Dacă vreŃi să ştergeŃi o singură valoare
din rândurile existente, folosiŃi instrucŃiunea UPDATE pentru a înlocui valorile
respective cu valori nule (presupunând că valorile nule sunt permise în acele coloane).
Sintaxa generală a instrucŃiunii DELETE este
DELETE FROM nume_tabel_sau_vizualizare
[ WHERE conditie ];

Se remarcă următoarele:

• Clauza WHERE este opŃională. Totuşi, este folosită aproape întotdeauna,


deoarece o instrucŃiune DELETE fără o clauză WHERE încearcă să şteargă
toate rândurile din tabel.
• Atunci când este inclusă, clauza WHERE specifică rândurile care urmează să
fie şterse. Orice rând pentru care condiŃia WHERE este evaluată ca adevărată
este şters din tabel.
• Nu se pot şterge rânduri dacă se încalcă o restricŃie referenŃială. În general,
rândurile subordonate trebuie şterse înaintea rândurilor părinte.

Exemple:
• Să se şteargă filmul adăugat mai devreme (cu FILM_ID = 21 ). Se observă că
trebuie să se ştergă mai întâi rândurile corespondente din tabelele
FILM_COPY şi FILM_LIMBA, deoarece acestea sunt rânduri „copii” ale
rândului din tabelul „FILM”
DELETE FROM FILM_COPY
WHERE FILM_ID = 21;

DELETE FROM FILM_LIMBA


WHERE FILM_ID = 21;

DELETE FROM FILM


WHERE FILM_ID = 21;
• Să se şteargă din tabelul FILM_LIMBA toate rândurile pentru limba spaniolă
(COD_LIMBA='es' ). În multe implementări SQL se face diferenŃierea literelor
mari de cele mici, caz în care valoarea codului de limbă trebuie specificată cu
litere mici pentru a se potrivi cu datele din tabel.

DELETE FROM FILM_LIMBA


WHERE COD_LIMBA =’es’;

Întrebări şi probleme

1. Limbajul DML include următoarele comenzi SQL:


a. INSERT
b. REMOVE
c. UPDATE
d. SELECT
e. DROP

2. O instrucŃiune DML poate referi


a. Coloane din mai multe tabele
b. Coloane dintr-un singur tabel
c. O vizualizare care conŃine coloane dintr-un singur tabel
d. Coloane ale unei vizualizări bazate pe un singur tabel
e. Coloane ale unei vizualizări bazate pe mai multe tabele

3. La formarea unei instrucŃiuni DML, trebuie să tineti seama de următoarele


restricŃii
a. RestricŃii referenŃiale
b. RestricŃii de securitate
c. RestricŃii NOT NULL
d. RestricŃii de unicitate
e. RestricŃii cheie primară

4. O instrucŃiune INSERT cu o clauză VALUES


a. Trebuie să aibă o listă de coloane
b. Trebuie să aibă o listă de valori
c. Poate insera rânduri multiple la o singură rulare
d. Poate folosi cuvântul cheie NULL pentru a atribui valori nule coloanelor
e. Poate include o clauză WHERE

5. O instrucŃiune INSERT cu o comandă SELECT imbricată este utilă pentru


a. Găsirea următoarei valori pentru o cheie primară atribuită secvenŃial
b. Mutarea rândurilor dintr-un tabel în altul
c. Popularea unui tabel de test cu date dintr-un alt tabel
d. Eliminarea rândurilor duplicate dintr-un tabel
e. Inserarea mai multor rânduri într-un tabel cu o singură instrucŃiune

6. O instrucŃiune INSERT cu o comandă SELECT imbricată


a. Trebuie să aibă două liste de coloane, una în clauza INSERT şi una în
b. Trebuie să aibă o instrucŃiune SELECT internă care retumează un singur
rând de date
c. Poate folosi cuvântul cheie NULL pentru a atribui valori nule coloanelor
d. Poate include o clauză WHERE
e. Trebuie să aibă în instrucŃiunea SELECT internă o listă de coloane care
corespunde cu lista de coloane din clauza INSERT sau cu coloanele din
tabelul în care sunt inserate datele

7. O instrucŃiune UPDATE fără o clauză WHERE


a. Actualizează toate rândurile din tabel cu valori nule
b. încearcă să actualizeze toate rândurile din tabel
c. Eşuează şi returnează o eroare
d. Şterge toate rândurile din tabel
e. Are ca rezultat un produs cartezian

8. O instrucŃiune DELETE fără o clauză WHERE


a. Actualizează toate rândurile din tabel cu valori nule
b. Eşuează si returnează o eroare
c. încearcă să şteargă toate rândurile din tabel
d. Are ca rezultat un produs cartezian
e. Trebuie să includă o listă de coloane

9. O instrucŃiune UPDATE
a. Trebuie să includă o clauză SET
b. Trebuie să furnizeze o nouă valoare pentru cel puŃin o coloană
c. Trebuie să includă o clauză WHERE
d. Poate atribui unei coloane valoarea unei alte coloane
e. Poate atribui unei coloane o listă de valori derivate dintr-o expresie

10. O instrucŃiune DELETE


a. Poate include o listă opŃională de coloane
b. Poate include o clauză WHERE opŃională
c. Poate folosi cuvântul cheie FORCE pentru a forŃa ştergerea rândurilor
d. Nu poate încălca restricŃiile referenŃiale ale tabelului
e. Poate avea o instrucŃiune SELECT internă, ca parte a clauzei WHERE

11. Clauza SET dintr-o instrucŃiune UPDATE poate atribui unei coloane o
valoare care este
a. O constantă
b. Numele unei alte coloane
c. O listă de valori
d. Orice expresie din care rezultă o singură valoare
e. Cuvântul cheie NULL

12. InstrucŃiunea SELECT internă a unei instrucŃiuni INSERT poate include


a. O clauză WHERE
b. O clauză GROUP BY
c. Una sau mai multe funcŃii de agregare
d. O uniune a mai multor tabele
e. O clauză UNION

ScrieŃi instrucŃiuni SQL pentru următoarele probleme


13. Folosind o instrucŃiune INSERT cu o clauză VALUES, dar fără listă de
coloane, inseraŃi în tabelul FILM_GENRE un nou rând, cu valorile FILM_COD_GEN
= TRAIN' şi FILM_DESCRIERE_GEN = Training'.

14. Folosind o instrucŃiune INSERT cu o clauză VALUES si o listă de


coloane, inseraŃi în tabelul FILM un nou rând, cu următoarele valori pentru date:

FILM_ID: 99
FILM_COD_GEN: 'TRAIN'
MPAA_COD_RATING: NR
FILM_NUME: ANGAJAT
Training Video

15. Folosind o instrucŃiune INSERT cu o instrucŃiune SELECT internă,


inseraŃi în tabelul FILM_LIMBA un rând pentru limba japoneză
(COD_LIMBA = 'ja'), asociat cu toate filmele din tabelul FILM. (în prezent,
tabelul FILM_LIMBA nu conŃine nici un rând pentru limba japoneză.)

16. CreaŃi un tabel, numit TOTAL_INCHIRIERE, folosind instrucŃiunea


CREATE de mai jos. Folosind o instrucŃiune INSERT cu o instrucŃiune SELECT
internă, inseraŃi în tabelul TOTAL_INCHIRIEREun rând pentru fiecare film din
tabelul FILM INCHIRIERE, conŃinând numărul total de închirieri şi suma totală
obŃinută din închirierea filmului respectiv.
CREATE TABLE TOTAL_INCHIRIERE
(FILM_ID INTEGER NOT NULL,
NUMBER_OF_INCHIRIERES INTEGER NOT NULL,
TOTAL_COST_INCHIRIERES NUMERIC (7, 2) NOT NULL);

17. ŞtergeŃi toate rândurile din tabelul INCHIRIERE TOTAL.

18. ŞtergeŃi rândurile pentru limba japoneză, create la întrebarea 15.

19. Copia 1 a filmului 1 (FILM_ID = 1, NUMAR_COPIE = 1) a fost vândută


pe data de 15 ianuarie 2005. actualizaŃi rândul respectiv din tabelul
FILM_COPII.

20. ActualizaŃi tabelul FILM astfel încât să creşteŃi cu 10 procente toate


preŃurile pentru formatul VHS (RETAIL_PRET_VHS) care nu conŃin valori
nule.
LECłIA 6. SQL cu ACCESS
Access este un instrument util de învăŃare a limbajului SQL. În această
lecŃie vom învăŃa cum să trecem de la ANSI/ISO SQL la implementarea SQL din
Access.
Până acum am prezentat limbajul neprocedural SQL implementat conform
standardelor ANSI/ISO şi s-a amintit legătura limbajului SQL cu sisteme de baze
de date relaŃionale ca: Microsoft SQL Server, MySQL, Oracle, Oracle şi Access.
De asemenea, s-a punctat modul în care Access traduce în instrucŃiuni SQL
interogările proiectate.
Însuşirea limbajului SQL ne ajută să înŃelegem procesul interogării şi să
proiectăm, să creem interogări QBE Access(Query By Exemples), subinterogări
şi interogări UNION mai eficiente.
Access SQL este conceput pentru crearea de interogări, nu pentru crearea
sau modificarea tabelelor. De acceea, în Access SQL nu apar multr din cele
aproximativ 100 de cuvinte cheieincluse în standardele ANSI/ISO pentru SQL.
Cele mai multe cuvinte cheie SQL care lipsesc din Access sunt înlocuite cu
operatorii, cu funcŃiile Access, sau cu funcŃii definite de utilizatori.
Dacă dorim să folosim cuvintele cheie SQL pentru a crea şi modifica tabele
vom scrie instrucŃiunile SQL în fereasra query view SQL.
Comenzile SQL am arătat ca pot fi grupate , aşa cum s-a arătat în lecŃia 1 ,
în:
• Limbajul de definire a datelor (DDL - Data Definition Language)
• Limbajul de interogare a datelor (DQL - Data Query Language)
• Limbajul de manipulare a datelor (DML - Data Manipulation Language)
• Limbajul pentru controlul datelor (DCL - Data Control Language)
• Limbajul pentru procesarea tranzacŃiilor (TPL - Transaction Processing
Language)

Au vost prezentate în lecŃiile precedente primele trei categorii, urmând ca la


cursul din semestrul II, „Baze de date Oracle” să începem cu prezentarea
ultimelor două categorii.
Vocabularul limbajului SQl, am precizat că este format din:
 Comenzi, cum sunt SELECT, CREATE, etc., sunt verbe cAre determină
executarea unei acŃiuni.
 Calificative, cum sunt WHERE, limitează domeniul valorilor entităŃilor
incluse într-o interogare.
 Clauze, cum sunt ORDER BY, modifică acŃiunea unei instrucŃiuni.
 Operatori, cum sunt =, <, >, etc., compară valori şi sunt şi sunt utilizaŃi
la crearea asocierilor când nu este utilizată sintaxa JOIN.
 FuncŃii globale de grup, cum sunt
 Alte cuvinte cheie care pot modifoca acŃiunea unei clauze sau
manipulează cursoarele la selectare anumitor rânduri sau interogari
ConvenŃie. La scrierea cuvintelor cheie s-au folosit majuscule (dar acesta
nu înseamnă că nu se pot folosi şi litere mici.

Cuvinte rezervate SQL în Accsess


Access SQL nu contine cuvinte rezervate identice pentru toate cuvintele cheie
din ANSI SQL(cuvinte rezervate sunt cuvintele cheie din ANSI SQL care se
potrivesc în Accesss SQL ).
Pentru cuvintele rezervate se pot consulta documentaŃia Access sau căutate
tabele de pe internet.
Amintim unele dintre cuvintele rezervate Accesss SQL:
ADD, ALL,LTER, AS, ALIAS, ASC, AVG, BETWEEN, BY,
CONSTRAINT, INDEX, INNER, INSERT, INTO, IS, JOIN, KEY, LEFT, LIKE,
MAX, MIN, NOT, NULL, ON, OR, ORDER, OUTER, PRIMARY, REFERENCES,
RIGHT, SELECT, SET, UNION, UNIQUE, UPDATE, VALUES, WHERE.
Pentru tipurile de date, cuvintele cheie CHAR, INT, INTEGER, REAL nu
sunt trecute , deoarece, aşa cum am arătat în lecŃia 2, Access foloseşte alte tipuri de
date( care au fost specificate acolo)
Operatorii sunt aceiaşi ca în ANSI SQL, numai operatorul !+ devine în
Accessoperatorul diferit,<>.
Pentru caractere de înlocuire , s-a menŃionat la operatorul logic LIKE
(prezentat în lecŃia 2 la operatori) ca acestea sunt diferite de ANSI SQL.
Exempl de diferenŃe:

Access ANSI SQL Scop


? _ înlocuieşte un caracter
* % înlocuieşte zero sau mai multe caractere

# nu un singur numar, 0 - 9
<> != diferit
DISTINCTROW nu Folosit la SELECT
Notă:
Cuvântul rezervat DISTINCTROW din Access este folosit cu cuvântul
cheie SELECT pentru a elimină rândurile duplicat dintr-o interogare. Cuvântul
rezervat DISTINCTROW este asemănător cu cuvântul cheie DISTINCT din
ANSI SQL, dar nu identic.
DISTINCT elimină rândurile duplicat dintr-o interogare Ńinând cont numai
de valoarea datelor înscrise în interogare, de la stânda la dreapta. Nu se pot
actualiza valori din interogările cu mai multe tabele care includ cuvântul cheie
DISTINCT.
Cuvântul rezervat DISTINCTROW (numai în Access) a elimină rândurile
duplicat dintr-o interogare Ńinând cont de întreg conŃinut al tabelei, indiferent
dacă sunt incluse sau nu campuri suplimentare pentru a diferenŃia înregistrările
din tabelă.
DISTINCTROW permite actualizarea valorilor din tipuri speciale de obiecte
din mai multe tabele.
Pentru a clarifica deosebirea dintre cele doua cuvinte, să presupunem că avem o
tabelă de felul următor:
NUME PRENUME
Popescu Ana
Ionescu Dan
Niculescu Ana
Popescu Ion
Dacă creiem o interogare care are inclusă coloana PRENUME, atunci
DISTINCT va returna 3 inregistrri pentru ca apare Ana de 2 ori, iar
DISTINCTROW va returna toate 4 înregistrările.

Pentru a folosi comenzile Access SQL din DDL, DQL, DML prezentate în
lecŃiile precedente, avem mai multe posibilităti:
1. Metoda View în care se urmează paşii:
a. Se execută clic pe eticheta Query din fereastra Database
b. clic pe butonul New pentru a deschide o nouă interogare
c. se trece în modul Design
d. din meniul View se alege SQL
e. se introduc comenzile (create table, Select, etc,
f. se execută interogarea cu Run
g. se salvează
h. dacă a fost o comandă CREATE TABLE se verifică daca a fost creat
tabelul cu numele dat în nterogare
2. Cu ajutorul butonului Query, în care se urmează paşii:
a. Se execută clic pe eticheta Query din fereastra Database
b. clic pe butonul New pentru a deschide o nouă interogare
c. se trece în modul Design
d. se execută clic pe săgeata de lângă butonul Query de pe bara de
instrumente şi se selecteză SQL
e. se execută şi se salvează cu nume In funcŃie de ce s-a creat(interogare
sau tabel)
3. Metoda de personalizare a barei de instrumente, în care se urmează paşii:
a. Se execută clic pe eticheta Query din fereastra Database
b. clic pe butonul New pentru a deschide o nouă interogare
c. se trece în modul Design
d. clic pe meniul Customize şi se alege din Categories, Query Design şi se
trage butonul SQL în bara de instrumente
e. Se execută clic pe butonul creat SQL , se creiază interogarea dorită i
apoi se salvează.
4. Metoda rapidă în care se urmează paşii:
a. Se execută clic pe eticheta Query din fereastra Database
b. clic pe butonul New pentru a deschide o nouă interogare
c. se trece în modul Design
d. Clic dreapta cu indicatorul mous-ului plasat în fereastra interogrii şi se
alege View SQL din meniul popup

Crearea tabelelor cu Access DDL

Se poate crea noi tabele în baza de date curentă cu ajutorul cuvintelor


rezervate Data Definition Language. Utilizarea limbajului SQL la crearea noilor
tabele prezintă un interes deosebit pentru cei care dezvoltă aplicaŃii Access,
deoarece este mult mai uşoară crearea noilor tabele cu interfaŃa de utilizator
Access. Pentru ca informaŃiile să fie complete, iată o scurtă prezentare a
instrucŃiunilor SQL DDL din Access:
• CREATE TABLE table-name ( field_name date_type [field_size][.field_name
data_type... ]) creează o nouă tabelă, cu câmpurile specificate de o listă
separată prin virgule. ProprietăŃile câmpurilor sunt separate de spaŃii;
trebuie să se încadreze cu paranteze drepte ([]) intrările pentru field_names
care conŃin spaŃii. Pentru data_type se poate folosi orice tip de date pentru
câmp din Access SQL, cum este TEXT sau INTEGER. Intrarea field_size este
opŃională doar pentru câmpurile TEXT. (Valoarea prestabilită este de 50 de
caractere.)
• CONSTRAINT index_name (PRIMARYKEY | UNIQUE | REFERENCES
foreign_table [(foreign_field)]} creează un index după numele câmpului care
precede expresia. Se poate specifica indexul ca PRIMARYKEY sau ca
UNIQUE. De asemenea, se poate stabili o relaŃie între câmp şi câmpul unei
tabele externe cu intrarea REFERENCES foreign_table [foreign _field].
(Elementul [foreign_field] este necesar dacă foreign_field nu este un câmp de
cheie principală).
• ALTER TABLE permite să se adăuge noi câmpuri (ADD COLUMN
field_name...) sau să le şteargă pe cele existente (DROP COLUMN
field_name ...)
• DROP INDEX index_name ON table_name şterge indexul dintr-o tabelă
specificată de table_name.
• DROP TABLE table_name şterge o tabelă din baza de date.

Scrierea interogărilor de selecŃie în SQL


Când se crează o interogare de selecŃie în modul de proiectare a interogării,
Access traduce proiectul interogării QBE într-o instrucŃiune Access SQL. Se poate
vedea această instrucŃiune Access SQL executând click pe butonul SQL de pe bara cu
instrumente.
Inima limbajului SQL este instrucŃiunea SELECT, utilizată la crearea unei
interogări de selecŃie. InstrucŃiunea SQL SELECT prezentată mai jos returnează o
tabelă de interogare (care se numeşte set de rezultate şi este de obicei un obiect
Recordset de tip Dynaset) cu toate coloanele (câmpurile) sau numai cu cele selectate
din toate rândurile (înregistrările) sau dintre cele specificate ale unei tabele sursă:
SELECT [ALL | DISTINCT | DISTINCTROW] select_list
FROM table_names
[WHERE search_criteria]
[ORDER BY column_criteria [ASC | DESC]]

Următoarea listă prezintă rolul fiecărui element din această instrucŃiune de


interogare de selecŃie elementară:
• SELECT este comanda de bază care defineşte o interogare. Parametrul
select_list precizează câmpurile (coloanele) care sunt incluse în tabela cu
rezultatele interogării. Când se proiectează o interogare Access QBE,
parametrul select_list este determinat de câmpurile adăugate în rândul Fields
din grila Query. În select_list sunt incluse numai acele câmpuri care au
marcată caseta de validare Show. Când apar mai multe nume de câmpuri,
acestea sunt despărŃite de virgule. Calificativele opŃionale ALL, DISTINCT şi
DISTINCTROW determină modul de manipulare a rândurilor. ALL specifică
includerea tuturor rândurilor cu posibilitatea unei limitări ulterioare.
DISTINCT elimină rândurile cu date duplicate.
• FROM table_names specifică numele tabelei sau ale tabelelor care formează
baza interogării. Parametrul table_names este creat în Access QBE de intrările
efectuate în dialogul Add Table. Dacă în select_list sunt incluse câmpuri din
mai multe tabele, fiecare tabelă trebuie specificată în parametrul table_names.
Cănd există mai multe nume de tabele, sunt utilizate virgule pentru a le separa.
• WHERE search_criteria determină care înregistrări din lista de selecŃie vor fi
afişate. Parametrul search_criteria este o expresie care conŃine un operator de
text (şir), cum este LIKE, pentru câmpurile de tip text sau un operator
numeric, cum este >=, pentru câmpurile cu valori numerice. Clauza WHERE
este opŃională; dacă nu se adăugă clauza WHERE, sunt returnate toate
rândurile care îndeplinesc criteriul SELECT.
• ORDER BY column_criteria specifică ordinea de sortare a unui obiect
Recordset de tip Dynaset sau Snapshot, creat de interogare. Un obiect
Recordset de tip Snapshot este un set de rezultate care nu poate fi actualizat.
Ca şi clauza WHERE, ORDER BY este un element opŃional. Se poate
specifica o sortare ascendentă sau descendentă cu cuvintele cheie ASC sau
DESC. Dacă nu se specifică tipul sortării, este folosită sortarea ascendentă.

Următoarele linii prezintă un exemplu simplu de instrucŃiune SQL de


interogare, folosind baza de date a Access Northwind.mdb:

SELECT [Company Name] , [Customer ID] , [Postal Code]


FROM Customers
WHERE [Postal Code] LIKE "9*"
ORDER BY [Company Name];

Se închide o instrucŃiune Access SQL prin adăugarea semnului punct şi virgulă


(;) imediat după ultimul caracter al ultimei linii.

Interogarea de mai sus produce un obiect Access Recordset cu trei coloane şi


atâtea rănduri câte înregistări cu firme al căror cod poştal începe cu caracterul 9 există
în tabela Customers, sortare în ordine alfabetică după numele firmei. Nu trebuie să se
specifice numele tabelei pentru câmpurile din select_list deoarece în această
interogare este utilizată o singură tabelă. Când Access creează o instrucŃiune SQL,
numele câmpului este precedat întotdeauna de numele tabelei. De obicei, Access
prelucrează interogările indiferent dacă sunt scrise cu sintaxa ANSI SQL sau Access
SQL. Acest exemplu diferă de ANSI SQL doar prin utilizarea caracterului de
înlocuire * (asterisc) din Access SQL în local caracterului % din ANSI SQL.

Utilizarea instrucŃiunilor SQL pentru a crea interogări Access

În modul de proiectare a interogării se poate introduce instrucŃiuni SQL pentru


a crea interogări Access simple, modificările aduse de acestea proiectului fiind
reflectate de grila Query. Dacă intrările conŃin erori de punctuaŃie sau cuvinte scrise
greşit, Access afişează o casetă de mesaj care descrie eroarea şi poziŃia ei apro-
ximativă în cadrul instrucŃiunii. Când se alege OK în dialogul SQL, Access traduce
instrucŃiunea SQL într-un proiect de interogare QBE.
Pentru a crea o interogare de selecŃie Access QBE cu o instrucŃiune SQL, se
execută paşii următori:
1. Se deschide baza de date şi se deschide apoi o nouă interogare.
2. Se închide dialogul Show Table fără să se adauge un nume de tabelă.
3. Se alege View, SQL pentru a deschide fereastra SQL.
4. Se şterge orice text care apare în fereastra SQL, cum ar fi SELECT
DISTINCTROW;.
5. Se introduce în fereastra SQL instrucŃiunea SQL următoare. Se utilizaeză
Ctrl+Enter pentru a crea linii noi.
SELECT CompanyName, CustomerID, PostalCode
FROM Customers
WHERE PostalCode LIKE "9*"
ORDER BY CompanyName;
6. Se alege View, Query Design. Access creează un echivalent grafic QBE
pentru instrucŃiunea SQL.
7. Se execută click pe butonul Run Query de pe bara cu instrumente. Rezultatul
interogării apare în modul Datasheet View.

Pentru a schimba ordinea de sortare a rezultatelor interogării, se execută paşii


următori:
1. Se alege View, SQL pentru a deschide fereastra SQL.
2. Se Schimbă ORDER BY [CompanyName] cu ORDER BY [Postal Code] şi se
alege View, Query Design pentru a deschide fereastra Query Design.
Grila Query în modul de proiectare afişează Ascending în coloana PostalCode,
nu în coloana CompanyName, ceea ce dovedeşte că setul de rezultate al
interogării este sortat după codul ZIP (codul poştal).
3. Se execută clic pe butonul Run de pe bara cu instrumente pentru a afişa setul
de rezultate sortat după codul ZIP.
4. Se închide interogarea fără a se salva.

Utilizarea funcŃiilor globale SQL

Dacă se utilizează funcŃiile globale pentru a obŃine totaluri, medii sau valori
statistice pentru grupuri de înregistrări care au atribute cu aceeaşi valoare, trebuie să
se adauge clauza GROUP BY în instrucŃiunea SQL, se poate limita rezultatul clauzei
GROUP BY cu calificativul opŃional HAVING:
SELECT [ALL | DISTINCT | DISTINCTROW]
aggregate_function (f ield_name) AS alias [, select_list]
FROM table_names
[WHERE search_criteria]
GROUP BY group_criteria
[HAVING aggregate_criteria]
[ORDER BY column_criteria]

Parametrul select_list include aggregate_function, care are argumentul


field_nane. Câmpul utilizat ca argument al unei funcŃii globale trebuie să fie de tip
numeric. Lista următoare prezintă celelalte cuvinte cheie SQL şi parametrii necesari
pentru a crea o interogare GROUP BY:
• AS alias - atribuie un titlu coloanei. Titlul este creat într-o interogare Access
QBE de intrarea alias:aggregate_function(field_name) în rândul Field din
grila Query.
• ID GROUP BY group_criteria - precizează coloana pe care se bazează
gruparea. În această coloană, GROUP BY apare în rândul Totals din grila
Query.
• HAVING aggregate_criteriare - prezintă unul sau mai multe criterii aplicate
coloanei care conŃine parametrul aggregate_function. Criteriul specificat de
parametrul aggregate_criteria din HAVING este aplicat după realizarea
grupării. WHERE search_criteria operează înainte de grupare; în această
etapă nu există nici o valoare globală căreia să îi poată fi aplicat criteriul
aggregate_criteria. Access înlocuieşte WHERE cu HAVING când se adaugă
unei coloane un criteriu cu aggregate_function.

Interogarea GROUP BY este scrisă în ANSI SQL, cu excepŃia simbolurilor #


care delimitează valorile de tip dată sau oră:
SELECT ShipRegion, SUM(Freight) AS [Total Freight] //freight=marfă
FROM Orders
WHERE ShipCountry="USA"
AND OrderDate BETWEEN #07/1/95# AND # 12/31/96#
GROUP BY ShipRegion
HAVING SUM(Freight) >50
ORDER BY SUM(Freight) DESC;

Interogarea returnează un set de rezultate care constă din două coloane: Ship
Region (state) şi totalul transporturilor (Freight) pentru fiecare stat din Statele Unite în
anii 1991-1994. Setul de rezultate este sortat în ordine descrescătoare.
Pentru a crea în Access o interogare SQL GROUP BY, se execută paşii
următori:

1. Se deschide o nouă interogare, se alege View, SQL şi se introduce


codul sursă al interogării precedente în dialogul SQL.
2. Se alege View, Query Design.
3. Se execută clic pe butonul Run Query de pe bara cu instrumente.
Statele cucomenzi care au cheltuieli de transport de 50$ sau mai mari
în perioada cuprinsă între 07/1/95 şi 12/31/96 sunt afişate în ordinea
cheltuielilor totale de transport în modul Datasheet View.
4. Se închide interogarea fără să se salveze.

Crearea asocierilor cu SQL

Pentru asocierea a două sau mai multe tabele cu Access QBE, se utilizează
structura JOIN_ON, care specifică tabela care va fi asociată şi relaŃia dintre câmpurile
pe care se bazează JOIN :

SELECT [ALL|DISTINCT|DISTINCTROW] select_list


FROM table_names
{INNER|LEFT|RIGHT} table_name JOIN join_table ON
join_criteria
[{INNER|LEFT|RIGHT} table_name JOIN join_table ON
join_criteria]
[WHERE search_criteria]
[ORDER BY column_criteria]

Lista următoare prezintă elementele instrucŃiunii JOIN în Access:

- table_name JOIN join_table specifică numele tabelei care este asociată cu


celelalte tabele din lista table_names. Fiecare dintre tabelele care participă la o
asociere trebuie să fie inclus în lista table_names şi înainte şi după JOIN.
Când se specifică o autoasociere prin includerea a două copii ale listei cu
câmpuri pentru o singură tabelă, a doua tabelă este deosebită de prima prin
adăugarea la nume a unei liniuŃe de subliniere urmată de o cifră. Unul dintre cele
trei tipuri de asociere, INNER, LEFT sau RIGHT, trebuie să apară în faŃa
instrucŃiunii JOIN.
INNER specifică o asociere de tip echivalent, LEFT specifică o asociere
externă la stânga, iar RIGHT indică o asociere externă la dreapta. Tipul asocierii
este determinat în Access QBE executând dublu click pe linia care conectează
câmpurile asociate în tabelă şi apoi executând clic pe butonul de opŃiune 1,2 sau 3
în dialogul Join Properties.

- ON join_criteria specifică cele două câmpuri care vor fi asociate şi relaŃia


dintre ele. Unul dintre câmpuri se află în join_table, iar celălalt este într-o
tabelă din table_names. Expresia join_criteria conŃine un operator de
comparaŃie de tip egalitate (=) şi returnează o valoare True sau False. Dacă
valoarea expresiei este True, înregistrarea din tabela asociată este inclusă în
interogare.

Numărul de instrucŃiuni JOIN pe care le puteŃi adăuga într-o interogare este de


obicei egal cu numărul total de tabele minus unu. PuteŃi crea mai multe asocieri între
două tabele, dar rezultatul este greu de prevăzut.

Mai jos este prezentată instrucŃiunea Access SQL pentru o asociere de tip
echivalent între tabelele Order Details si Orders bazată pe valorile ID din fiecare
tabelă, iar Orders apare şi în clauza FROM. Orders este asociată cu instrucŃiunea
JOIN şi este cerută în asocierile Access SQL. Cuvântul rezervat JOIN din Access
SQL creează mai liniile care conectează cîmpurile asociate în Query Design.

În ANSI SQL se pot crea asocieri de tip echivalent cu clauza WHERE


utilizând aceleaşi expresii pentru asocierea câmpurilor ca şi acelea din clauza ON a
comenzii JOIN. Clauza WHERE este mai flexibilă decât structura JOIN...ON
deoarece puteŃi utiliza operatori ca BETWEEN...AND, LIKE, > şi < . Utilizarea
acestor operatori în locul semnului egal (=) din clauza ON a instrucŃiunii JOIN
determină apariŃia mesajelor de eroare. În acest caz nu trebuie să precizaŃi încă o dată
câmpul Orders. InstrucŃiunea ANSI SQL din rândurile următoare duce la un rezultat
identic cu acela al instrucŃiunii Access SQL.
Urmează implementarea Access SQL a unei asocieri de tip echivalent:

SELECT DISTINCTROW Orders.OrdersID, Orders.CustomerID,


[Order Details].ProductID, [Order Details].Quantity
FROM Orders
INNER JOIN [Order Details] ON Orders.OrderID = [Order
Details].OrderID
ORDER BY Orders.OrderID ;

Vom realiza acum asocierea cu ajutorul clauzei WHERE:

SELECT DISTINCTROW Orders.OrdersID, Orders.CustomerID,


[Order Details].ProductID, [Order Details].Quantity
FROM Orders, [Order Details].
WHERE Orders.OrderID = [Order Details].OrderID
ORDER BY Orders.OrderID ;

Pentru a crea mai multe asocieri cu clauze WHERE, se separă fiecare expresie
JOIN cu un operator AND.
.
Utilizarea interogărilor UNION
Interogările UNION ne permit combinarea într-un set de rezultate a două sau
mai multe seturi de rezultate produse de interogări SELECT. Northwind.mdb (baza de
lucru a Access) conŃine un exemplu de interogare UNION, care în fereastra Database
are un simbol special, reprezentat de două cercuri întretăiate.
Interogările UNION pot fi create doar cu instrucŃiuni SQL; dacă adăugaŃi
cuvântul cheie UNION într-o interogare, butonul pentru modul de proiectare a
interogării de pe bara cu instrumente şi opŃiunea Query Design din meniul View sunt
dezactivate. Sintaxa generală a interogării UNION este următoarea:

SELECT select_statement
UNION SELECT select_statement
[GROUP BY group_criteria]
[HAVING aggregate_criteria]
[UNION SELECT select_statement
[GROUP BY group_criteria]
[HAVING aggregate_criteria]]
[UNION…]
[SORT BY sort_criteria]

RestricŃiile impuse instrucŃiunilor care creează interogări UNION sunt


următoarele:
• Numărul de câmpuri în parametrul field_list din fiecare interogare SELECT
şi UNION SELECT trebuie să fie acelaşi. Dacă nu apare acelaşi număr, vi se
afişează un mesaj de eroare.
• SecvenŃa de nume de câmpuri din fiecare parametru field_list trebuie să
corespundă unor intrări identice. Nu apare un mesaj de eroare dacă intrările
sunt diferite, dar probabil că setul de rezultate va fi de neînŃeles. Nu este
necesar ca tipurile de date pentru câmp să fie aceleaşi într-o singură coloană,
dar dacă în setul de rezultate coloana conŃine atât tipul de date Text, cât şi
numerice, tipul de date al coloanei este stabilit la Text.
• Este permisă doar o clauză SORT BY şi aceasta trebuie să apară după ultima
instrucŃiune UNION SELECT. Dacă este necesar, puteŃi adăuga clauze
GROUP BY şi HAVING fiecărei instrucŃiuni SELECT şi UNION SELECT.

Utilizând baza de date Northwind.mdb prezentăm, o instrucŃiuneUNION .


Se observă capacitatea interogărilor UNION de a include valori din 2 câmpuri
cu tipuri de date diferite, de exemplu Customer ID (TEXT) şî Suppliers ID(Long
Integer), într-o singură coloană, denumită simplu ID.
SELECT CompanyName, City, PostalCode, Region, SupplierID AS ID
FROM Suppliers
Where County=”Brazil”
UNION SELECT CompanyName, City, PostalCode, Region, CustomerID AS
ID
FROM Customers
Where County=”Brazil”

Implementarea subinterogărilor
Versiunile care au apărut înainte de Access 2.0 utilizau interogări imbricate
pentru a emula capacitatea de subinterogare din ANSI SQL. (O interogare imbricată
este o interogare care se aplică setului de rezultate al altei interogări). Access 7.0 vă
permite să scrieŃi o interogare SELECT care utilizează o altă interogare SELECT
pentru a preciza criteriul clauzei WHERE. În funcŃie de complexitatea interogării
dvs., utilizarea unei subinterogări în locul interogărilor imbricate duce de multe ori la
îmbunătăŃirea performanŃelor. Sintaxa generală a subinterogărilor este următoarea:
SELECT field_list
FROM table_list
WHERE [table_name.]field_name
IN SELECT select_statement
[GROUP BY group_criteria]
[HAVING aggregate_criteria]
[ORDER BY sort_criteria]

De exemplu, utilizând aceiaşi bază, creiăm o subinterogare care să returneye


numele şi adresa clienŃilor care au trimis comenzi între 1 ianuarie şi 30 iunie.
Interogare care incepe după IN returnează valorile valorile CustomerID din tabela
Orders cu care sunt comparate valorile CustomerID din tabela Customers.
SELECT DISTINCTROW , Customers.ContractName,
Customers.ContractTitle, Customers.Phone
FROM Customers
WHERE Customers.CustomersID
IN(SELECT DISTINCTROW Orders.CustomerID FROM Orders
WHERE Orders.OrderDate Between #1/1/94# And #7/1/94#);

Spre deosebire de interogările UNION, subinterogările pot fi create în modul


de proiectare a interogării. TastaŃi IN şi apoi instrucŃiunea SELECT pentru a crea
criteriul coloanei corespunzătoare.

Sintaxa de specificare a interogării de acŃiune

Interogrile de acŃiune şi cele încrucişate au fost discutate pe larg în Partea aI+a


Access. Crearea acestor interogări este de preferinŃă să se facă cu ajutorul
caracteristicii Access QBE (Query By Exemples). După ce Access a creat astfel de
interogări ele pot fi vizualizate din View SQL.
Comenzile DML (Data Manipulation Language) sunt implementate prin
interogările de acŃiune din ACCESS: de adăugare , de ştergere, de creare a unei tabele
şi de actualizare. Cuvintele rezervate Access SQL care crează interogări încrucişate,
TRANSFORM şi PIVOT, sunt discutate în această secŃiune deoarece interogările
încrucişate sunt înrudite cu interogările DML. Această secŃiune prezintă sintaxa
pentru fiecare tip de interogare de acŃiune din Access.
Interogările de adăugare utilizează următoarea sintaxă:
INSERT INTO dest_table
SELECT [ALL|DISTINCT|DISTINCTROW] select_list
FROM source_table
[WHERE append_criteria]

Dacă nu introduceŃi clauza WHERE, toate înregistrările din source_table sunt


adăugate în dest_table.

Interogările de ştergere au forma următoare:

DELETE FROM table_name


[WHERE delete_criteria]

Dacă nu introduceŃi clauza opŃională WHERE într-o interogare de ştergere,


vor fi şterse toate datele din table_name.
Interogările de creare a unei tabele utilizează sintaxa următoare:
SELECT [ALL| DISTINCT|DISTINCTROW] select_list
INTO new_table
FROM source_table
[WHERE append_criteria]

Pentru a copia tabela originală, înlocuiŃi select_list cu (*) şi nu introduceŃi


clauza WHERE.

Interogările de actualizare utilizează comanda SET pentru a atribui valori


coloanelor individuale:

UPDATE table_name
SET criteria_name=value [. column_name=value]
[WHERE update_criteria]

Dacă vreŃi să actualizaŃi datele din mai multe câmpuri, pentru separarea
coloanelor şi a valorilor corespunzătoare folosiŃi virgule. Access 7.0 SQL permite
utilizarea cuvântului cheie VALUES din ANSI SQL pentru a adăuga înregistrări în
tabele în modul forŃat (specificând VALUE pentru fiecare coloană din fiecare
înregistrare).

Interogările încrucişate utilizează cuvintele cheie Access SQL -


TRANSFORM şi PIVOT pentru a crea diferite tipuri de interogări rezumative cu
ajutorul funcŃiilor globale SQL. Următoarea sintaxă este utilizată de interogările
încrucişate de tip cronologic:

TRANSFORM aggregate_function (field_name) [AS alias]


SELECT [ALL| DISTINCT|DISTINCTROW] select_list
FROM table_name
PIVOT Format(field_name), “format_type”
[IN (column_list)]
TRANSFORM defineşte o interogare încrucişată, iar PIVOT specifică
caracteristicile GROUP BY şi numele coloanelor fixate, introduse de predicatul IN.

II. BIBLIOGRAFIE
1. Ileana Popescu, LetiŃia Vercescu, Proiectarea bazelor de date, Editura
2. Popescu Ileana, Modelarea bazelor de date, Editura Tehnică, 2001
3. Florentina Rodica Niculescu, Modelarea sistemelor software - Visio şi
UML, Editura UniversităŃii din Bucureşti, 2007
4. Mariana Popa, Baze de date Editura FRM, 2006
5. Roger Jennings, Utilizare Access, Editura Teora, 1998
6. Chris Fehily, SQL- ÎnvăŃaŃi SQL rapid şi uşor!, Editura B.I.C. ALL,
2004