Documente Academic
Documente Profesional
Documente Cultură
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.
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.
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.
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
Probleme
1.Să se creeze modelul E/R pentru gestiunea activităŃilor de împrumut dintr-o
bibliotecă
CITITOR
M(1) M(0) codec#
CARTE
nume
codel#
dep
titlu imprumuta
autor
pret
nrex
M(0) 1 DOMENIU
coded#
intdom
apartine
SCOALA CLIENT
cod_scoala# cod_client#
INSTRUCTOR EXAMEN
cod_instructor# cod_examen#
EXAMINATOR
MASINA
cod_examinator#
cod_masina#
ECHIPA SPONSOR
Cod_echipa# M(1) sustine M(1) M(1)
Cod_sponsor#
Nume
Nume
Oras
2
joaca
M(1)
MECI
Tara#
Nr_etapa#
Cod_meci#
M(1)
apartine_de
1
ETAPA
Tara
Nr_etapa
M(1)
atasata_la
1
CAMPIONAT
Tara#
Modelul relaŃional
Modelul relaŃional a fost conceput şi dezvoltat de E.F. Codd. El este un model
formal de organizare conceptuală a datelor, destinat reprezentării legăturilor dintre
date, bazat pe teoria matematică a relaŃiilor. Modelul relaŃional este alcătuit numai din
relaŃii şi prin urmare, orice interogare asupra bazei de date este tot o relaŃie.
Cercetarea în domeniu 3 mari proiecte (System R, INGRES, PRTV)
CalităŃi:
• este simplu;
• riguros din punct de vedere matematic;
• nu este orientat spre sistemul de calcul.
ModalităŃi pentru definirea unui SGBD relaŃional:
Transformarea entităŃilor
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
Tabele
Unitatea primară de stocare a datelor într-o bază de date relaŃională este
tabelul, care este o structură bidimensională compusă din rânduri şi coloane. Fiecare
tabel reprezintă o entitate, ceea ce înseamnă o persoană, un loc sau un lucru care
trebuie să fie reprezentat în baza de date, cum ar fi un client, un cont bancar sau o
tranzacŃie bancară. Fiecare rând al tabelului reprezintă o apariŃie a entităŃii. Figura 1-1
reprezintă listingul parŃial al unui tabel numit FILM(filme).
Tabelul FILM este parte a unei baze de date pentru un magazin de produse
video, folosit ca exemplu în toată aceast curs. Tabelul FILM conŃine date care descriu
filmele disponibile în magazinul de produse video. Fiecare rând din tabel reprezintă
un film, iar fiecare coloană reprezintă o caracteristică a filmului respectiv, cum ar fi
titlul filmului sau categoria MPAA(Motion Picture Associationof America care a fost
fondată în 1972 în America ca asociaŃie a producătorilor de film pe lângă industria
cinematografică)
RelaŃii
RelaŃiile reprezintă asocierile dintre tabelele bazelor de date relaŃionale. Deşi
fiecare tabel relaŃional poate exista independent, esenŃa bazelor de date este tocmai
stocarea informaŃiilor între care există legături. De exemplu, pe lângă filmele propriu-
zise, puteŃi stoca informaŃii despre categoriile folosite de magazin pentru organizarea
inventarelor de filme. În acelaşi timp, puteŃi stoca şi informaŃii despre copiile fiecărui
film, inclusiv data la care a fost primită copia şi formatul acesteia, cum ar fi DVD sau
VHS. Prin folosirea realaŃiilor, puteŃi asocia tabelele înrudite, într-un mod formal,
uşor de folosit astfel încât puteŃi să combinaŃi date din tabele multiple în aceeaşi
interogare a bazei de date, dar păstrând flexibilitatea de a include numai informaŃiile
care vă interesează.Posibilitatea de a selecta din baza de date numai informaŃiile care
vă interesează vă permite să ajustaŃi informaŃiile din bază de date în funcŃie de
cerinŃele specifice ale persoanelor sau aplicaŃiilor care au acces la baza de date.
Figura 1-2 prezinta patru tabele din baza de date a magazinului de produse
video si relaŃiile dintre acestea, într-un format cunoscut sub numele de diagrama de
relatii a entitatilor (ERD – Entity Relationship Diagram). Fiecare dreptunghi din
diagrama reprezintă un tabel relaŃional, cu numele tabelului scris deasupra liniei
orizontale si coloanele tabelului enumerate pe verticala , in portiunea principala a
dreptunghiului.
RelaŃiile sunt implementate folosind coloane corespondente din cele două
tabele participante. În diagrama ERD coloana sau coloanele subliniate din fiecare
tabel. UN tabel poate avea o singură cheie primară. Totuşi , o cheie primară poate fi
compusă din mai multe coloane, dacă aceasta este calea de formare a unei chei unice.
Dacă o cheie primară este folosită într-un alt tabel pentru stabilirea unei relaŃii, poartă
numele de chieie externă. În figură 1-2, observaŃi coloanele cheie externă folosite în
tabelul FILM pentru crearea relaŃiilor cu tabelele FILM_GENRE şi MPAA_RATING
şi marcate cu identificatoarele „<fk1>” şi „<fk2”> în dreapta numelui coloanei cheie
externă. Şi coloana COD_LIMBA este marcată drept cheie externă , dar tabelul
LANGUAGE şi relaŃia acestuia cu tabelul FILM au fost omise din figura de mai sus.
FILM_COPII
FILM_ID <pk, fk>>
NUMAR_COPIE <pk>
DATA_CUMPARARE
DATA_VANZARE
FORMAT_MEDIA
RestricŃii
O restricŃie este o regulă specificată pentru un obiect al bazei de date (de
obicei un table sau o coloană), având rolul de a limita într-un mod oarecare domeniul
de valori permise pentru obiectul respectiv al bazei de date.După ce sunt specificate,
restricŃiile sunt impuse automat de sistemul DBMS şi nu pot fi ocolite decât dacă o
persoană autorizata le dezactivează sau le şterge(le elimină).Fiecare restricŃie primeşte
un nume unic, astfel încât să poată fi referită în mesajele de eroare şi în comenzile
folosite ulterior în bază de date.Este recomandabil ca proiectanŃii bazei de date să
denumească restricŃiile, deoarece numele generate automat de bază de date nu sunt
foare descriptive. Totuşi , nu am denumit restricŃiile din baza de date folosită ca
exemplu în această carte, deoarece, din păcate, nu toate produsele RDBMS
disponibile în prezent acceptă restricŃiile denumite.
Există mai multe tipuri de restricŃii pentru baze de date:
RestricŃia NOT NULL Poate fi plasată pe o coloană pentru a împiedica
folosirea valorilor nule.O valoare nulă (null) este o modalitate specială prin care
sistemul RDBMS tratează valoarea unei coloane pentru a indica faptul că valoarea
coloanei respective nu este cunoscută. O valoare nulă nu este acelaşi lucru un un
spaŃiu liber, un şir vid sau valoarea zero şi este o valoare specială care nu este egală cu
nimic altceva.
RestricŃia cheie primară (primary key) Definită pe coloana (coloanele)
cheie primară ale unui tabel pentru a garanta că valorile cheie primară sunt
întotdeauna unice în întreg tabelul.Atunci când cheia primară este definită pe mai
multe coloane, combinaŃia valorilor acelor coloane trebuie să fie unică în tabel - o
coloană care reprezintă doar o parte a valorii cheii primare poate conŃine valori
duplicate în tabel. RestricŃiile cheie primară sunt aproape inttotdeauna implementate
de RDBMS prin folosirea unui index.Indexul este un tip special de obiect al unei baze
dedate care permite efectuarea căutărilor rapide în valorile coloanei.Atunci când în
tabele sunt înserate rânduri noi, sistemul RDBMS verifică automat indexul pentru a se
asigura că cheia primară a noului rând nu este deja folosită în tabel şi , dacă se
întâmplă acest lucru , respinge cererea de inserare. Căutarea în indexuri se face mult
mai repede decât căutarea în tabel;ca urmare, indexarea cheii primare este esenŃială
pentru orice tabel, indiferent de dimensiunea acestuia, astfel încât căutarea cheilor
duplicate la fiecare inserare să nu ducă la o reducere semnificativă a performanŃelor.
O caracteristică suplimentară a cheilor primare este faptul că nu pot fi definite decât
pe coloane pentru care a fost definită şi restricŃia NOT NULL.
RestricŃia de unicitate (unique) Definită pe o coloană sau un set de
coloane care trebuie să conŃină valori unice ale tabelului. Ca şi în cazul cheilor
primare, sistemul RDBMS foloseşte aproape întotdeauna un index ca modalitate de
impunere eficientă a restricŃiei.Totuşi, spre deosebire de cheile primare, un tabel poate
avea definite mai multe restricŃii de unicitate, iar coloanele care participă la o
restricŃie de unicitate pot conŃine ( în cele mai multe sisteme RDBMS ) şi valori nule.
RestricŃia referenŃială (numită uneori restricŃie de integritate
referenŃială) O restricŃie care impune o relaŃie între două tabele dintr-o bază de date
relaŃională. Prin „impunere” se înŃelege că sistemul RDBMS se asigură întotdeauna,
în mod automat, că fiecărei valori a cheii externe îi corespunde o valoarea a cheii
primare în tabelul părinte.În tabelul FILM, sistemul RDBMS nu-mi permite să inserez
o înregistrare cu valoarea „M” în coloana MPAA_COD_RATING, deoarece „M” nu
este o valoarea MPAA_COD_RATING validă şi , ca urmare, nu apare ca valoare a
cheii primare din tabelul MPAA_RATING. În sens invers, sistemul RDBMS nu-mi
permite să şterg din tabelul MPAA_RATING rândul cu cheia primară „PG-13” ,
deoarece valoarea respectivă este folosită ca valoare a cheii externe pentru cel puŃin
una din înregistrările din tabelul FILM. Pe scurt , restricŃia referenŃială garantează că
relaŃia dintre cele două tabele şi valorile corespondente ale cheii primare şi cheii
externe îşi păstrează logica în orice moment.
RestricŃia CHECK Foloseşte o instrucŃiune logică simplă (scrisă în SQL)
pentru a valida valoarea unei coloane.Rezultatul instrucŃiunii trebuie să fie o valoare
logică de adevărat (true) sau fals (false), astfel încât un rezultat adevărat să permită
înserarea în tabel a valorii coloanei, iar un rezultat fals să ducă la rejectarea valorii
coloanei , cu mesajul de eroare corespunzător.
Index
Un index reprezintă o cale rapidă de localizare şi sortare a Inregistrarilor dintr-
o tabelă prin gruparea tuturor înregistrărilor pentru un anumit atribur sau grup de
atribute. Indexarea este utilizată în două scopuri principale:
accelerarea căutărilor în baya de date
asigurarea unicităŃii înregistrărilor
Vizualizări
Necesitatea normalizării
Normalizarea este procesul reversibil de transformare a unei relaŃii, în relaŃii
de structură mai simplă. Procesul este reversibil în sensul că nici o informaŃie nu este
pierdută în timpul transformării. O relaŃie este într-o formă normală particulară dacă
ea satisface o mulŃime specificată de constrângeri.
Procesul normalizării se realizează plecând de la o relaŃie universală ce
conŃine toate atributele sistemului de modelat, plus o mulŃime de anomalii. Orice
formă normală se obŃine aplicând o schemă de descompunere. Există două tipuri de
descompuneri.
Descompuneri ce conservă dependenŃele. Această descompunere
presupune desfacerea relaŃiei R în proiecŃiile R1, R2, ..., Rk, astfel încât
dependenŃele lui R sunt echivalente (au închideri pseudo-tranzitive
identice) cu reuniunea dependenŃelor lui R1, R2, ..., Rk.
Descompuneri fără pierderi de informaŃie. Această descompunere
presupune desfacerea relaŃiei R într-o mulŃime de proiecŃii R1, R2, ..., Rj,
astfel încât pentru orice realizare a lui R este adevărată relaŃia:
Tabelul de mai jos prezintă tabelul FILM fără normalizare, aşa cum ar arăta
dacă toate informaŃiile despre filme ar fi colectate într-un singur tabel.Acest exemplu
va fi folosit pentru ilustrarea procesului de normalizare. În general, numele coloanelor
din tabelele relaŃionale folosesc liniuŃe de subliniere pentru separarea cuvintelor. În
discuŃia despre normalizare am eliminat aceste liniuŃe din figuri, pentru a face textul
mai uşor de citit.
Anomaliile care apar în lucrul cu baza de date se produc datorită
dependenŃelor care există între datele din cadrul relaŃiilor bazei de date.
DependenŃele sunt plasate greşit în tabele!
Există trei probleme care pot apărea în tabelele fără normalizare şi toate trei
există în tabelul de mai jos. Scopul procesului de normalizare este de a elimina aceste
probleme (anomalii) din proiectul bazei de date.
2 Ac Act en, fr, R Sub 17 ani The Last 200 01/10/2005 DVD 19.96
lA Av es necesita Samurai 3
d si prezenta
ave parintilor sau a
ntur unui adult
a
2 Ac Acti en, fr, R Sub 17 ani The Last 200 01/10/2005 VHS 15.95
tA une es necesita Samurai 3
v si prezenta
ave parintilor sau a
ntur unui adult
a
3 Co Co en PG-13 Parintii sunt Something's 200 01/10/2005 1/30/2 DVD 29.99
me med avertizati Gotta Give 3 005
die ie
3 Co Co en PG-13 Parintii sunt Something's 200 2/15/2005 DVD 29.99
me med avertizati Gotta Give 3
die ie
4 Ac Acti en, fr PG-13 Parintii sunt The Italian 200 2/15/2005 DVD 19.99
tA une avertizati Job 3
v si
ave
ntur
a
Anomalia de inserare
Anomalia de inserare se referă la o situaŃie în care nu puteŃi insera date în baza
de date din cauza unei dependenŃe artificiale dintre coloanele unui tabel.
Să presupunem că vreti să adăugaŃi în baza de date a magazinului un nou gen
de film care urmează a fi folosit pentru clasificarea filmelor.Tabelul de mai sus nu
permite acest lucru decât dacă aveŃi un film care să fie plasat în categoria respectivasi
pe care va trebui să-l adăugaŃi în tabelul FILM în acelaşi timp.Ar fi mult mai bine
dacă aŃi putea adauga noile genuri înainte de primirea filmelor în magazin.
Anomalia de ştergere
Anomalia de ştergere este inversul anomaliei de inserare. Se referă la situaŃia
în care ştergerea unor date duce la pierderea neintenŃionată a altor date. De exemplu
dacă primul film din tabel este singurul rând din tabelul FILM pentru care coloana
GEN_COD are valoarea „Drama” , şi este şters, se pierde informaŃia că a existat
vreodată un gen numit „Drama”
Anomalia de actualizare
Figura 1-5 prezintă rezultatul aducerii relaŃiei din figura 1-4 la prima formă
normală. ObservaŃi următoarele:
FIL NR GEN GEN_D MPA MPAA_RATING_ FILM_NUME A DATA DAT MEDIA PRET
M_I _C _CO ESCRIE A_CO DESC N _CUM A_VA FORMAT _INC
D OPI D RE D_RA _ PARA NZAR HIR
E TING P RE E
R
O
D
U
S
1 1 Dram Drama R Sub 17 ani necesita Mystic River 2 01/01/ DVD 19.96
a prezenta parintilor 0 2005
sau a unui adult 0
3
2 1 AclA Actiune R Sub 17 ani necesita The Last 2 01/10/ DVD 19.96
d si prezenta parintilor Samurai 0 2005
aventura sau a unui adult 0
3
2 2 ActA Actiune R Sub 17 ani necesita The Last 2 01/10/ VHS 15.95
v si prezenta parintilor Samurai 0 2005
aventura sau a unui adult 0
3
3 1 Come Comedie PG-13 Parintii sunt Something's 2 01/10/ 1/30/2 DVD 29.99
die avertizati Gotta Give 0 2005 005
0
3
3 2 Come Comedie PG-13 Parintii sunt Something's 2 2/15/2 DVD 29.99
die avertizati Gotta Give 0 005
0
3
4 1 ActA Actiune PG-13 Parintii sunt The Italian Job 2 2/15/2 DVD 19.99
v si avertizati 0 005
aventura 0
3
• Atributul FILM_ID a fost copiat din relaŃia originală (FILM) în noua relaŃie
(FILM Language).
• Atributul multivaloare COD_LIMBA a fost mutat din relaŃia FILM în relaŃia
FILM Language, cu numele Language Code. (Numele abreviate ale atributelor din
figura 1-4 au fost folosite doar pentru ilustrare - este recomandabil să prescurtaŃi
numele numai dacă este absolut necesar.)
• Identificatorul unic din relaŃia FILM Language este format prin combinarea
atributelor FILM_ID şi Language Code, adică din toate atributele relaŃiei.
• Nici FILM, nici FILM Language din figura 1-5 nu conŃin grupuri repetitive
sau atribute multivaloare, aşa că ambele relaŃii sunt în prima formă normală.
Aplicând aceste criterii relaŃiei FILM din figura 1 -5, este clar că avem câteva
probleme. Identificatorul unic este o combinaŃie a atributelor FILM_ID şi NR_
COPIE. Totuşi, numai atributele DATA_CUMPARARE, DATA_VANZARE,
MEDIA FORMAT şi PRET_INCHIR depind de întregul identificator. Şi este logic să
fie aşa. Indiferent câte copii ale unui film avem în baza de date, toate au aceleaşi
valori pentru gen, categorie MPAA, TITLU şi AN_PRODUS.
Unele atribute descriu filmul în sine, în timp ce altele descriu copiile pe care le
deŃine (sau le-a deŃinut) magazinul din filmul respectiv. In esenŃă, am amestecat
atribute care descriu în aceeaşi relaŃie două lucruri (entităŃi) diferite (deşi înrudite) din
lumea reală.
A doua formă normală se aplică numai relaŃiilor care au identificatoare unice
concatenate (adică formate din atribute multiple). într-o relaŃie care are un singur
atribut ca identificator unic, este imposibil ca un alt atribut să depindă de o parte a
identificatorului unic, deoarece acesta, fiind format dintr-un singur atribut, nu are părŃi
componente. Ca urmare, orice relaŃie în prima formă normală care are cheia primară
formată dintr-un singur atribut este automat în a doua formă normală.
După ce descoperiŃi o încălcare a celei de-a doua forme normale, soluŃia este
să se mute atributele parŃial dependente într-o nouă relaŃie, în care să depindă de
întreaga cheie primară. Figura 1-6 prezintă această soluŃie. Toate atributele care
depind numai de FILM_ID sunt acum într-o relaŃie (numită FILM) în care FILM_ID
este identificator unic. Cele care depind de combinaŃia FILM_ID şi NR_ COPIE sunt
într-o relaŃie (numită FILM Copy) în care FILM_ID şi NR_ COPIE formează
identificatorul unic. RelaŃia FILM Language era deja în a doua formă normală,
deoarece nu are atribute non-cheie şi, ca urmare, a rămas nemodificată.
FILM:
MPAA_
FILM GEN_ 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ă
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
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.
cod_persoana
adresa
telefon
Majoritatea exemplelor din acest curs folosesc ca model o bază de date pentru
un magayin virtual de produse video.
InstrucŃiunile SQL pentru creare obiectelor bazei de date şi pentru popularea
acestora cu date vor fi prezentate în lecŃiile următoare.
În figura 1-8 se prezintă disgrama entitate relaŃie, ERD (Entity Relationship
Diagram) pentru această bază de date.
FILM
FILM_ID PK
MPAA_RATING FILM_COD_GEN FK1 FILM_GEN
MPAA_COD_RATING PK MPAA_COD_RATING FK2 FILM_COD_GEN PK
MPAA_DESCRIERE_VARSTE FILM_NUME FILM_DESCRIERE_GEN
RETAIL_PRET_VHS
RETAIL_PRET_DVD
AN_PRODUS
FILM_COPII FILM_INCHIRIERE
FILM_LIMBA FILM_ID PK,FK1 FILM_ID PK,FK1
FILM_ID PK,FK1 NUMAR_COPIE PK NUMAR_COPIE PK,FK1
COD_LIMBA PK,FK2 DATA_CUMPARARE TRANZACTIE_ID PK,FK2
DATA_VANZARE DATA_INTOARCERE
FORMAT_MEDIA COST_INCHIRIERE
COST_INTARZIERE_SAU_PIERDERE
DATA_RETURNARE
LIMBA
COD_LIMBA PK CLIENT_CONT CLIENT_TRANZACTIE
NUME_LIMBA CLIENT_CONT_ID PK TRANZACTIE_ID PK
CLIENT_HOLD_IND CLIENT_CONT_ID FK1
DATA_INSCRIS ANGAJAT_PERSOANA_ID
DATA_TERMINAT TRANZACTIE_DATA
CLIENT_COD_PERSOANA CLIENT_DEPOZIT_SUMA VANZARI_TAXA
CLIENT_CONT_ID PK,FK1 CARD_CREDIT_LA_DOSAR_INDIC
PERSOANA_ID PK,FK2 COPIL_INCHIRIERE_PERMIS_INDIC
PERSOANA ANGAJAT
PERSOANA_ID PK PERSOANA_ID PK,FK1
PERSOANA_PRENUME SUPERVISOR_PERSOANA_ID
PERSOANA_NUME_MIJLOCIU ANGAJAT_TAXA_ID
PERSOANA_NUME ANGAJAT_JOB_CATEGORIE
PERSOANA_ADRESA_1 ANGAJAT_RATA_PE_ORA
PERSOANA_ADRESA_2 ANGAJARE_DATA
PERSOANA_ADRESA_ORAS INCHIDERE_DATA
PERSOANA_ADRESA_JUDET_PROV
PERSOANA_ADRESA_COD_POSTAL
PERSOANA_ADRESA_TARA
PERSOANA_TELEFON
NASTERE_DATA
MOARTE_DATA
Probleme:
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
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
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ă.
Persoana Vehicul
Eu R25 - W14 - R21
Tu 205
El R5 - 305
noi BX - 305 - R12 - R25
Varianta 1
Persoana Vehicul
Eu R25
Eu W14
Eu R21
Tu 205
El R5
El 305
Noi BX
Noi 305
Noi R12
Noi R25
Varianta 2
Persoana Prima Doi Trei Patru
Eu R25 W14 R21
Tu 205
El R5 305
Noi BX 305 R12 R25
Varianta 3 (4 tabele)
Masina 31 (similar se definesc Masina_32, Masina_33, Masina_34)..
Persoana Vehicul
Eu R25
Tu 205
El R5
Noi BX
Masina_34
Persoana Vehicul
Noi R25
5. Să se aduca la FN2
O relaŃie R este în a doua formă normală dacă şi numai dacă:
relaŃia R este în FN1;
fiecare atribut care nu este cheie (nu participă la cheia primară) este
dependent de întreaga cheie primară.
ATASAT_LA
S1 PROGRAMATOR P1 SUPERVIZOR 60
S1 PROGRAMATOR P2 CERCETATOR 25
S1 PROGRAMATOR P3 AUXILIAR 10
S3 VANZATOR P3 SUPERVIZOR 60
S5 INGINER P3 SUPERVIZOR 60
ATASAT_2A
COD_SALARIAT# NR_PROIECT# FUNCTIA SUMA
S1 P1 SUPERVIZOR 60
S1 P2 CERCETATOR 25
S1 P3 AUXILIAR 10
S3 P3 SUPERVIZOR 60
S5 P3 SUPERVIZOR 60
ATASAT_2B
COD_SALARIAT# JOB_COD
S1 PROGRAMATOR
S3 VANZATOR
S5 INGINER
atasat_3a
Cod_salariat# Nr_proiect# Functia
S1 P1 Supervizor
S1 P2 Cercetator
S1 P3 Auxiliar
S3 P3 Supervizor
S5 P3 Supervizor
atasat_3b
Functia Suma
Supervizor 60
Cercetator 25
Auxiliar 10
8. Presupunem că un şantier poate executa mai multe lucrări de bază şi că
o lucrare poate fi executată de mai multe şantiere.
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
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
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).
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ă.
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
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.
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ă.
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
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.
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
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.
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
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
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 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
Interogări cu actualizare
Interogări cu adăugare
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.
LECłIA 7. Formulare
Crearea automată a formularelor
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
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
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 .
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.
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.
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.
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.
TESTE
-1-
-2-
Oras Text-dimensiune 20
Data examinarii Date/Time-Short Date
Nume Centru Text-de dimensiune 30
Numar Curent Autonumber
-4-
Atribut 1 Numeric-Byte
Atribut 2 Text-dimensiune 15 caractere
Atribut 3 Currency-Euro
Atribut 1 Numeric-Byte
Atribut 4 Text-dimensiune 20
Atribut 5 Text-dimensiune 25
-5-
Întrebări
AlegeŃi răspunsurile corecte pentru fiecare din următoarele întrebări cu
răspunsuri multiple. Întrebările pot avea mai multe răspunsuri corecte.
1. SQL este
a. Un limbaj orientat spre obiecte
b. Un limbaj procedural
c. Un limbaj nonprocedural
d. Un limbaj declarativ
e. Un limbaj standard
9. InstrucŃiunile SQL
a. încep cu un cuvânt cheie reprezentând o comandă
b. Se termină cu un cuvânt cheie reprezentând o comandă
c. încep cu un delimitator, cum ar fi caracterul punct şi virgulă
d. Se termină un delimitator, cum ar fi caracterul punct şi virgulă
e. încep cu o paranteză deschisă
10. Elementele limbajului SQL includ
a. Cuvinte cheie
b. Nume ale obiectelor din baza de date
c. Operatori
d. RestricŃii
e. Constante
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.
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
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
RestricŃiile coloanelor
Clauză NOT NULL poate fi rescrisă şi sub forma unei restricŃii CHECK:
ID_CONT_CLIENT INTEGER
CONSTRAINT CK_CUST _ACCT _ID CHECK (ID_CONT IS NOT
NULL)
Exemplu:
ID_CONT_CLIENT INTEGER NOT NULL UNIQUE
RestricŃia PRIMARY KEY - O restricŃie de cheie primară (PRIMARY
KEY) impusă asupra unei coloane declară coloana respectivă ca fiind cheia primară a
tabelului, ceea ce înseamnă că în coloana respectivă nu pot exista valori nule, iar
valorile trebuie să fie unice în cadrul tabelului. Sintaxa :
(CONSTRAINT nume_restricŃie] PRIMARY KEY
EXEMPLU:
ID_CONT_CLIENT INTEGER NOT NULL PRIMARY KEY
RestricŃiile tabelelor
RestricŃia UNIQUE
[CONSTRAINT nume_restricŃie]
PRIMARY KEY (nume_coloană [,nume_coloană...])
RestricŃia de mai jos este chiar definiŃia cheii primare din tabelul
CONT_CLIENT [
Exemplu:
CONSTRAINT PK_CONT_CLIENT
PRIMARY KEY (ID_CONT_CLIENT)
InstrucŃiunea DROP
Întrebări şi probleme
Sortarea rezultatelor
Rezultatele interogărilor sunt deseori mult mai utile dacă se specifică pentru
rândurile returnate o ordine care să aibă o semnificaŃie pentru persoana sau aplicaŃia
care foloseşte informaŃiile. În SQL, acest lucru este făcut prin adăugarea în instrucŃiunea
SELECT a clauzei ORDER BY, cu o listă de una sau mai multe coloane care vor fi
folosite pentru sortarea rândurilor în ordine ascendentă sau descendentă, în conformitate
cu valorile datelor din coloane. De asemenea, se Ńine seama de următoarele aspecte:
Ordinea prestabilită pentru fiecare coloană este ascendentă, dar se poate
adăuga cuvântul cheie ASC după numele coloanei pentru obŃinerea unei ordonări
ascendente sau cuvântul cheie DESC pentru obŃinerea unei ordonări descendente.
Nu este obligatoriu ca numele coloanelor din lista ORDER BY să fie incluse şi
în lista de rezultate (adică în lista SELECT).
Motorul SQL din SGBD va găsi cea mai bună cale de ordonare a coloanelor.
În general, sortarea datelor este un proces costisitor din punct de vedere al resurselor
de calcul, aşa că majoritatea sistemelor SGBD folosesc un index pentru accesul la
rânduri în ordinea dorită, presupunând că există, şi fac o sortare propriu-zisă numai ca
ultimă soluŃie.
Se poate folosi pseudonimele coloanelor în clauza ORDER BY, dar dacă se
face acest lucru se forŃează motorul SQL să sorteze rezultatele abia după rularea
interogării.
În locul coloanelor, se poate specifica în lista de ordonare poziŃia relativă a
coloanelor. De exemplu, clauza ORDER BY 1,2 va sorta rezultatele în ordine
ascendentă după primele două coloane din setul de rezultate. Numărul specificat nu
are nici o legătură cu poziŃia coloanei în tabelul sau vizualizarea sursă. Această
opŃiune nu este agreată în programarea SQL formală, deoarece dacă ulterior cineva
modifică interogarea, este posibil să amestece coloanele din lista SELECT, fără să-şi
dea seama că astfel schimbă şi coloanele folosite pentru sortarea rezultatelor.
Dacă dorim să ordonăm acum crescător după rating şi descrescător după gen,
atunci instrucŃiunea de mai sus odificată va fi
Operator Descriere
= Egal cu
< Mai mic decât
<= Mai mic sau egal
> Mai mare decât
>= Mai mare sau egal
!= Diferit de
<> Diferit de (standard ANSI)
Exemple:
Să se afişeze toate filmele pentru care RATING are valoarea PG-13.
Să se afişeze toate filmele pentru care categoria RATING este PG-13 sau
preŃul de vânzare cu amănuntul pentru formatul DVD este 19.99 sau mai
mic, în ordinea crescătoare a preŃurilor.
SELECT COD_RATING AS RATING,
PRET_VANZARE_DVD AS PRET, TITLU_FILM
FROM FILM
WHERE COD_RATING = 'PG-13'
OR PRET_VANZARE_DVD <= 19.99
ORDER BY PRET_VANZARE_DVD;
Operatori logici
IS NULL
Operatorul IS NULL este folosit pentru a determina dacă o valoare este nulă.
Exemple:
Să se găsească toate conturile de clienŃi active, adică toate conturile pentru
care coloana DATA–TERMINATA conŃine o valoare nulă:
SELECT ID_CONT_CLIENT
FROM CONT_CLIENT
WHERE DATA_INCHEIERE IS NULL;
BETWEEN
Operatorul BETWEEN este folosit pentru a determina dacă o valoare
se încadrează într-un interval special. Intervalul este specificat folosind o valoare
minimă şi o valoare maximă, fiind un interval inclusiv, ceea ce înseamnă că include şi
valori specificate.
Exemple:
Să se afişeze toate filmele cu preŃul de vânzare cu amănuntul pentru
formatul DVD între 14.99 şi 19.99, ordonate crescător după preŃ.
SELECT TITLU_FILM, PRET_VANZARE_DVD
FORM FILM
WHERE PRER_VANZARE_DVD BETWEEN 14.99 AND 19.99
ORDER BY PRER_VANZARE_DVD;
LIKE
Operatorul LIKE este folosit pentru a compara o valoare de tip caracter cu un
tipar*, returnând valoarea logică “adevărat” dacă valoarea de tip caracter se
încadrează în tipar şi “fals" în caz contrar. Pentru definirea tiparului pot fi folosite
două caractere de înlocuire:
LiniuŃa de subliniere (_) - Caracterul liniuŃă de subliniere poate fi folosit
drept caracter de înlocuire poziŃional, ceea ce înseamnă că se potriveşte cu orice
caracter aflat pe poziŃia respectivă în şirul de caractere evaluat.
Procent (%) - Simbolul procent (%) poate fi folosit drept caracter de înlocuire
nepoziŃional, ceea ce înseamnă că se potriveşte cu orice număr de caractere, indiferent
de lungime.
Tipar Interpretare
%Now Se potriveşte cu orice şir de caractere care se termină
cu „Now".
Now% Se potriveşte cu orice şir de caractere care incepe cu
„Now".
%Now% Se potriveşte cu orice şir de caractere care confine
„Now" (1a inceput, la sfârşit sau în mijloc).
N_w Se potriveşte cu orice şir de caractere format din exact
trei caractere, care începe cu „N" şi se termină cu „w".
%N-w% Se potriveşte cu orice şir de caractere care conŃine
litera „N", urmată de orice alt caracter, urmat de litera „w"
(1a începutul, la sfârşitul sau undeva în mijlocul şirului de
caractere)
EXISTS
Operatorul EXISTS este folosit pentru a detemina dacă o subinterogare conŃine
înregistrări. Dacă în setul de rezultate al subinterogării nu există nici un rând,
operatorul returnează valoarea „false”; dacă setul de rezultate conŃine cel puŃin un
rând, valoarea devine „adevărat”.
Exemple de utilizare a operatorului EXIST:
Filmul The Last Samurai se închiriază bine atât în format DVD, cât şi-n
format VHS şi se doreşte să se asigure că în inventarul magazinului există o copie
VHS. Tabelul FILM_COPIAT conŃine un rând pentru fiecare copie a unui film din
inventarul magazinului, aşa că puteŃi folosi o subinterogare pentru a afla dacă există
copii VHS ale filmului în inventar. De cele mai multe ori, operatorul EXISTS este
folosit in conjuncŃie cu o formă mai complexă de subinterogare, numită subinterogare
corelat. (correlated subquery),în care valorile datelor din interogarea externă
(ID_FILM, în acest caz) sunt comparate cu rândurile din interogarea intenă.
SELECT ID_FILM, TITLU_FILM
FROM FILM m
WHERE TITLU_FILM = 'The Last Samurai'
AND EXISTS
(SELECT ID_FILM
FROM FILM_COPIAT c
WHERE m. ID_FILM = c. ID_FILM);
Dacă se inversează logica, folosind operatorul NOT EXISTS, puteŃi afişa titlul
filmului numai dacă nu există o copie VHS în inventar.
SELECT ID_FILM, TITLU_FILM
FROM FILM m
WHERE TITLU_FILM = 'The Last Samurai'
AND NOT EXISTS
(SELECT ID_FILM
FROM FILM_COPIAT c
WHERE m. ID_FILM = c. ID_FILM);
Operatori aritmetici
În SQL, operatorii aritmetici sunt folositi pentru efectuarea calculelor
matematice – la fel ca şi în formulele dintr-o foaie de calcul tabelar sau într-un limbaj
de programare, precum Java sau C. Cei patru operatori aritmetici din SQL sunt:
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'
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
LENGTH
FunŃii matematice
FuncŃiile matematice manipulează valori numerice, în conformitate cu regulile
matematicii.
ROUND
FuncŃia ROUND rotunjeşte o valoare la un număr specificat de zecimale.
Valoarea numerică este furnizată prin primul parametru, iar numărul de zecimale prin
cel de-al doilea. În continuare este prezentat formatul general al funcŃiei ROUND.
ROUND (expresie numerică, număr de poziŃii zecimale)
Care este costul mediu al unei copii a filmului The Last Samurai, rotunjit la
două zecimale?
SELECT ROUND((PRET_VANZARE_VHS + PRET_VANZARE
_DVD) / 2, 2) AS AVG_COST
FROM FILM
WHERE TITLU_FILM = 'The Last Samurai';
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Ń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.
UNION ALL
UNION ALL funcŃionează la fel ca şi operatorul UNION, exceptând faptul că
rândurile duplicate nu sunt eliminate.
INTERSECT
Operatorul INTERSECT găseşte valorile selectate dintr-o interogare, care apar
şi într-o altă interogare. În esenŃă, găseşte intersecŃia valorilor din cele două
interogări. Totuşi, doar un număr mic de sisteme DBMS (cele mai importance fiind
Oracle şi DB2) implementează acest operator. Nu-1 veŃi găsi în Microsoft SQL Server
sau MySQL.
Exemplu:
Există în tabelul FILM filme pentru care preŃul pentru DVD este egal cu preŃul
pentru VHS?
SELECT INCHIRIAT_FEE AS FEE
FROM FILM_ INCHIRIAT
WHERE INCHIRIAT _FEE IS NOT NULL
INTERSECT
SELECT LATE_OR_LOSS_FEE AS FEE
FROM FILM_ INCHIRIAT
WHERE LATE OR_ LOSS FEE IS NOT NULL
EXCEPT
EXCEPT este operatorul standard ANSI/ISO care găseşte diferenŃele dintre
două seturi de rezultate, returnând, în esenŃă, valorile din prima interogare care nu
apar în cea de-a doua interogare. Foarte puŃine sisteme DBMS implementează acest
operator. În unele implementări, precum Oracle, operatorul se numeşte MINUS, nu
EXCEPT.
Întrebări şi Probleme
S-au prezentat până acum instrucŃiuni SQL care selectează date dintr-un singur
tabel. Deseori, este util să se combine date din tabele multiple într-o singură
interogare . De exemplu, în listingul celor trei coloane ale tabelului FILM din figura
următoare, observaŃi valorile afişate pentru coloană FILM_GEN_COD. Atunci când
s-a proiectat baza de date pentru magazinul de produse video, s-au folosit coduri în
locul descrierilor complete pentru genurile filmelor în tabelul FILM. Din discuŃia
despre procesul de normalizare, s-a evitat anomalia de actualizare – dacă se schimbă
descrierea unui gen, nu este nevoie să actualizăm acea descriere pentru toate filmele
asociate genului respectiv în tabelul FILM. În timpul normalizării, descrierea
genurilor a fost mutată în tabelul, FILM_GEN, iar coloană FILM_GEN_COD a
devenit cheie externă în tabelul FILM, referind coloană cheie primară (cu acelaşi
nume) din tabelul FILM_GEN. S-a optat pentru folosirea unui cod mnemonic pentru
codurile genurilor, deoarece astfel permit celor familiarizaŃi cu datele respective să
înŃeleagă genul asociat filmelor fără să le caute în tabelul FILM_GEN.
FILM_GEN_COD FILM_GEN_DESCRIERE
ActAd Actiune
Anime Animatie
ChFam Copii şi Familie
Class Clasic
Comedie Comedie
Doc Documentar
Drama Drama
Forgn Strain
Hor Horror
Indep Independent
Music Muzical
Rmce Romance(Romantic, Idila)
SciFi Stiintifico-Fantastic
Sport Sport
Thriller Groaza
Tabelul FILM_GEN
Uniuni (join)
O uniune (join) este o operaŃie într-o bază de date relaŃionale care combină
coloane din două sau mai multe tabele în rezultatele unei singure interogări. O uniune
apare de fiecare dată când clauza FROM a unei instrucŃiuni SELECT specifică
numele mai multor tabele.
De exemplu:
SELECT FILM_ID, FILM_GEN_DESCRIERE AS GEN, FILM_TITLU
FROM FILM, FILM_GEN ORDER BY FILM_ID;
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ă...]) }
Exemple:
• JOIN cu condiŃie ON:
• JOIN folosind cuvântul cheie USING (în locul condiŃiei ON) o scurtatură
elegantă atunci când coloanele din cele două tabele au acelaşi nume(nu e recunoscută
de toate SGBD-urile).
InstrucŃiunile care folosesc clauza JOIN sunt mai scurte , iată interogarea
precedentă scrisă folosind condiŃii de legătură în clauza WHERE. RemarcaŃi că în
acest caz trebuie să specificaŃi numele complet al coloanelor FILM_ID şi
COPY_NUMAR, pentru a evita referirea ambiguă a lor. InstrucŃiunea de mai jos
afişează aceleaşi rezultate ca şi instrucŃiunea anterioară.
Uniuni naturale
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
Animatie
Copii şi Familie
Clasic
Documentar
Horror
Independent
Musical
SF
Special Interes
Sport
Thriller
Subinterogări
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:
LIMBA_COD LIMBA_NUME
Ja Japoneza
Ko Coreana
ni Olandeza
ru Rusa
zh Chineza
TRANZACTIE_ID TRANZ_DATA
9 03/01/2005
10 03/01/2005
Subinterogări corelate
CLIENT_CONT_ID
2
7
9
ObservaŃi pseudonimele asociate numelor de tabele din interogările
internă şi externă, precurn şi folosirea acestora în clauza WHERE a interogării
interne. Acesta este elementul de identificare al unei subinterogări corelate.
Interogarea externă selectează o lista de valori CLIENT_CONT_ID distincte din
tabelul CLIENT_TRANZACTIE. Fiecare valoare găsită este transmisă interogării
interne, care este rulată pentru a calcula suma taxelor de închiriere din tranzacŃia
respectivă. Dacă suma taxelor de închiriere este mai mare sau egală cu 15, atunci
clauza WHERE din interogarea externă ia valoarea logică „adevărat", iar rândul
CLIENT_ID este adăugat în setul de rezultate.
Vizualizări în linie
MAX_INCH_NUMAR
5
Întrebări şi probleme
AlegeŃi răspunsurile corecte pentru fiecare din următoarele întrebări cu
răspunsuri multiple, şi reŃineŃi că întrebările pot avea mai multe răspunsuri corecte.
l. O subinterogare
a. Poate fi folosită pentru a selecta valorile care vor fi aplicate condiŃiilor din
clauza WHERE
b. Poate fi corelată sau necorelată
c. Reprezintă o cale puternică de calculare a coloanelor
d. Trebuie să nu fie încadrate în paranteze
e. Permite selectarea flexibilă a rândurilor
4. O auto-uniune (selfjoin)
a. Nu poate avea niciodată ca rezultat un produs cartezian
b. Poate fi o uniune internă sau o uniune externă
c. Rezolvă relaŃiile recursive
d. Poate folosi o subinterogare pentru a limita şi mai mult rândurile selectate
e. Implică două tabele diferite
5. O uniune (Join)
a. Combină coloanele din două sau mai multe tabele în rezultatele unei
singure interogări
b. Combină rânduri din interogari multiple într-un singur set de rezultate
c. Este realizată ori de câte ori în clauza FROM sunt specificate mai multe
tabele
d. Necesită folosirea unei clauze JOIN
e. Necesită o listă de tabele separate prin virgule în clauza FROM
FuncŃiile pentru caractere operează asupra datelor de tip text. Această secŃiune
prezintă câteva funcŃii frecvent folosite, pe lângă cele discutate în lecŃia 3.
REPLACE
SELECT PERSOANA_TELEFON,
REPLACE(PERSOANA_TELEFON, '-', '.') AS DISPLAY_TELEFON
FROM PERSOANA;
PERSOANA_TELEFON DISPLAY_TELEFON
230—229—8976 230.229.8976
401—617—7297 401.617.7297
LTRIM
RTRIM
FuncŃia RTRIM este similar cu LTRIM, dar elimin spatiile de la sfârsitul unui
sir de caractere. Daca trebuie sa eliminati atât spatiile de la inceputul sirului, cat şi pe
cele de la sfarsit, puteti imbrica funcŃiile LTRIM şi RTRIM, ca în urmatorul exemplu:
Oracle:
SELECT NVL(TAXA_INTARZIERE_SAU_PIERDERE, 0) AS
TAXA_INTARZIERE_SAU_PIERDERE
FROM FILM_INCHIRIAT WHERE TRANSACTIE_ID=9;
TAXA_INTARZIERE_SAU_PIERDERE
0
29.98
2 rows selected.
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)
ASCII
FuncŃia ASCII returnează valoarea din setul de caractere ASCII (un numar
între 0 şi 255) pentru un şir format dintr-un singur caracter.
De exemplu:
ASCII(‘ ‘) eturnează valoarea 32(codul ASCII pentru spaŃiu)
ASCII(‘A’) eturnează valoarea 65(codul ASCII pentru caracterul A)
ASCII(‘a ‘) eturnează valoarea 97(codul ASCII pentru caracterul a)
ASCII(‘1‘) eturnează valoarea 49(codul ASCII pentru caracterul 1)
CHAR (CHR)
Valoare Caracter
ASCII
9 Tab
10 Linie noua
13 Retur de car
(CR)
39 Apostrof
Amintim că operatorul de concatenare nu este ace1aşi pentru toate
implementările SGBD(‘+‘ pentru Microsoft SQL Server şi ‘||’ pentru majoritatea
celorlalte sisteme).
Exemple cu funcŃiile ASCII şi CHAR:
Să se găsească toate titlurile de filme care conŃin un caracter Tab:
FILM_ID
(0 rows affected)
Oracle:
SELECT FILM_ID FROM FILM
WHERE FILM_TITLU LIKE ‘%‘ || CHR(9) || ‘%‘ ;
no rows selected
FuncŃii matematice
SIGN
FuncŃia SIGN primeşte ca argument o expresie numerică şi returnează una
dintre următoarele valori, în funcŃie de semnul numărului de intrare:
Valoare Semnificatie
returnata
-1 Numărul de intrare este
negativ
0 Numărul de intrare este
zero
1 Numărul de intrare este
pozitiv
Null Valoarea de intrare este
nulă
Exemplu:
SELECT TAXA_PENALIZARE,
SIGN(TAXA_PENALIZARE) AS TAXA_SIGN
FROM FILM_INCHIRIERE
WHERE TAXA_PENALIZARE IS NOT NULL;
TAXA_PENALIZARE TAXA_SIGN
29.99 1
4 1
4 1
29.98 1
SQRT
SELECT TAXA_INTARZIERE_SAU_PIERDERE,
SQRT (TAXA_PENALIZARE) AS TAXA_SQRT
FROM FILM_INCH
WHERE TAXA_INTARZIERE_SAU_PIERDERE IS NOT NULL;
TAXA_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
SELECT TAXA_PENALIZARE,
FLOOR(TAXA_INTARZIERE_SAU_PIERDERE) AS TAXA_FLOOR
FROM FILM_INCH WHERE TAXA_INTARZIERE_SAU_PIERDERE IS NOT
NULL;
TAXA_PENALIZARE TAXA_FLOOR
4.00 4
4.00 4
29.99 29
29.98 29
Oracle are mai multe de 24 de funcŃii pentru data şi ora. RetineŃi că Oracle
numeşte acest tip de date DATE şi toate datele au o componentă pentru orã, care are
valoarea zero (reprezentând miezul noptii) atunci când nu este folosită. FuncŃiile pe
care este cel mai probabil să le folosiŃi sunt prezentate în tabelul următor:
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.
Expresia CASE
notă:
Fiecare condiŃie WHEN este evaluată sub forma expresie_de_intrare =
expresie_comparare şi, dacă rezultatul are valoarea TRUE logic, este returnată
valoarea expresie_rezultata şi nici o altă condiŃie WHEN nu mai este evaluată.
Dacă nici una dintre condiŃiile WHEN nu este evaluată ca adevărată şi exista o
condiŃie ELSE, este returnată valoarea expresie_rezultat asociată condiŃiei ELSE.
Dacă nici una dintre condiŃiile WHEN nu este evaluată ca adevărată şi nu
există o condiŃie ELSE, este returnată o valoare nula.
CASE
WHEN condiŃie THEN expresie_rezultat
[WHEN condiŃie THEN expresie_rezultat. . . ]
ELSE expresie_rezultat
END
notă:
Fiecare condiŃie poate fi orice expresie SQL care este evaluată ca adevărata
sau falsă.
CondiŃiile WHEN sunt evaluate secvenŃial şi, dacă una este evaluată ca
adevărata, este returnata valoarea expresie_rezultat asociată şi nici o altă condiŃie
WHEN nu mai este evaluata.
Dacă nici una dintre condiŃiile WHEN nu este evaluată ca adevărată şi există o
condiŃie ELSE, este returnată valoarea expresie_rezultat asociată condiŃiei ELSE.
Dacă nici una dintre condiŃiile WHEN nu este evaluata ca adevărată şi nu
exişti o condiŃie ELSE, este returnată o valoare nulă.
De exemplu, considerăm o interogare care clasifică filmele în format VHS, în
funcŃie de pret:
1 58.97 Scump
2 15.95 Convenabil
3 14.95 Convenabil
4 11.95 Convenabil
5 24.99 Mediu
6 24.99 Mediu
7 14.95 Convenabil
8 50.99 Scump
9 12.98 Convenabil
10 49.99 Scump
Întrebări şi Probleme
1. FuncŃiile SQL
a. Returnează un set de valori
b. Returnează o singură valoare
c. Pot fi folosite în clauza WHERE a unei instrucŃiuni SQL
d. Pot fi folosite ca pseudonime pentru numele tabelelor intr-o instr. SQL
e. Pot fi folosite în lista de coloane a unei instrucŃiuni SQL
2. FuncŃia REPLACE
a. Înlocuieşte un nume de tabel cu un nume de vizualizare
b. Înlocuieşte numele unei coloane cu pseudonimul coloanei
c. Înlocuieşte un şir de caractere dintr-o coloană cu un alt şir de caractere
d. Înlocuieşte toate valorile dintr-o coloană cu un alt set de valori
e. Înlocuieşte toate rândurile dintr-o vizualizare cu rânduri conŃinând date
dintr-un alt tabel
3. FuncŃia LTRIM
a. Elimină spaŃiile de la sfârşitul şirurilor de caractere
b. Elimină spaŃiile de la începutul şirurilor de caractere
c. Poate fi imbricată cu alte funcŃii
d. înlocuieşte valorile nule cu alte valori în şirurile de caractere
e. Elimină spaŃiile de la începutul şi de la sfârşitul şirurilor de caractere
4. FuncŃia CHAR
a. Este numită CHR în unele implementări SQL
b. Este identică cu funcŃia ASCII în unele implementări SQL
c. Returnează valoarea corespunzătoare unui caracter din setul de caractere
ASCII
d. Returnează caracterul corespunzător unei valori
e. Transformă o valoare numerică într-un şir de caractere
5. FuncŃia SIGN
a. Returnează -l daca parametrul furnizat are valoare negativa
b. Returnează 0 dacă parametrul furnizat are valoarea zero
c. Returnează +1 dacă parametrul furnizat are o valoare pozitivă
d. Returnează 0 dacă parametrul furnizat are valoarea NULL
e. Returnează o valoare nulă dacă parametrul furnizat nu este un număr
6. FuncŃia CEILING
a. Rotunjeşte un număr prin adăugire până la primul număr întreg
b. Rotunjeşte un număr prin scădere până la primul număr întreg
c. Returnează întotdeauna un număr întreg
d. Returnează un număr întreg sau o valoare nulă
e. Este numită CEIL în unele implementări SQL
7. FuncŃia FLOOR
a. Rotunjeşte un număr prin adăugire până la primul număr întreg
b. Rotunjeşte un număr prin scădere până la primul număr întreg
c. Returnează întotdeauna un număr întreg
d. Returnează un număr întreg sau o valoare nulă
e. Este numită FLR în unele implementări SQL
8. Expresiile CASE
a. Permit executarea condiŃională a clauzelor dintr-o instrucŃiune SQL
b. Există sub două forme, respectiv statice şi dinamice
c. Exista sub două forme, respectiv cu căutare şi fara cautare
d. Există sub două forme, respectiv simple şi cu cautare
e. Există sub două forme, respectiv standard şi cu cautare
Un alt aspect de care este important să se Ńină seama, sunt restricŃiile definite
în tabelul referit de instrucŃiunea DML. Sistemul SGBD nu va efectua în baza de date
nici o modificare care încalcă una din restricŃii.
La formarea instructiunilor DML, trebuie să se Ńină seama de urmatoarele
aspecte referitoare la restricŃiile tabelului modificat:
RestricŃii de tip cheie primară
Atunci când inseraŃi un nou rând într-un tabel, cheia primară a noului rând
trebuie sa fie unică în întregul tabel.Cand modificati valoarea unei chei primare (ceea
ce se intampla rareori), noua valoare trebuie să fie unică în întregul tabel.
RestricŃii de unicitate
Ca şi în cazul cheilor primare, coloanele pe care a fost definită o restricŃie de
unicitate trebuie sa aibă valori unice în întregul tabel.
RestricŃii NOT NULL
O valoare nula (null) este o modalitate specială prin care sistemul SGBD
tratează valoarea unei coloane pentru a indica faptul ca valoarea coloanei respective
nu este cunoscută. O valoare nula nu este acelasi lucru un un spatiu liber, un sir vid
sau valoarea zero – este o valoare speciala care nu este egala cu nimic altceva.
În cazul instrucŃiunilor INSERT, trebuie specificate valori pentru toate
coloanele cu restricŃii NOT NULL.
În cazul instrucŃiunilor UPDATE nu se pot inlocui valorile unei coloane cu
valori nule dacă pe coloana respectivă este definită p restricŃie NOT NULL.
Dacă instrucŃiunea DML referă o vizualizare , nu se poate sa o folosim intr-o
instrucŃiune INSERT dacă una dintre coloanele tabelului cu o restricŃie NOT
NULL(obligatorii) lipseşte din definirea vizualizării.
RestricŃii referenŃiale
Nu se poate insera sau actualiza valoarea unei chei externe decât dacă există
deja rândul părinte corespondent care conŃine valoarea cheii în coloana cheii primare.
In sens invers, nu se poate şterge un rând părinte dacă există rânduri subordonate care
referă valoarea din rândul părinte, decât dacă restricŃia a fost definită cu opŃiunea ON
DELETE CASCADE. In general inserările în tabele trebuie făcute ierarhic (mai intai
randurile parinte, apoi randurile copii), iar ştergerile trebuie făcute în ordine inversă
(copiii inaintea părinŃilor).
InstrucŃiunea INSERT
• 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:
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.
Se remarcă următoarele:
• Lista de coloane este opŃională, dar dacă este inclusă trebuie să fie încadrată în
paranteze.
• Dacă lista de coloane este omisă, instrucŃiune SELECT internă trebuie să
furnizeze o valoare pentru fiecare coloană din tabel, în ordinea în care sunt
definite coloanele în tabel. Este bine ca întotdeauna să includeŃi lista de
coloane, deoarece opiterea acesteia face ca instrucŃiunea INSERT să fie
dependentă de definiŃia tabelului. Dacă o coloană este modificată sau în tabel
este adăugată o nouă coloană, chiar şi opŃională, probabil instrucŃiunea
INSERT va eşua la următoarea rulare.
• Dacă lista de coloane este specificată, instrucŃiune SELECT internă să
furnizeze o valoare pentru fiecare coloană din lista de valori, în aceeaşi ordine.
Cu alte cuvinte, între lista de coloane şi setul de rezultate al instrucŃiunii
SELECT trebuie să existe o corespondenŃa unu-la-unu. Orice coloană care
lipseşte din listă va primi o valoare nulă, presupunund că valorile nule sunt
acceptate în coloana respectivă.
• Cuvântul cheie NULL poate fi folosit în instrucŃiunea SELECT pentru
specificarea unei valori nule pentru o coloană.
InstrucŃiunea UPDATE
Se remarcă următoarele:
• Clauza SET conŃine o listă cu una sau mai multe coloane, împreună cu o
expresie care specifică noua valoare pentru fiecare coloană. Aceasta este o listă
de perechi nume-valoare, separate prin virgule, cu un operator de egalitate între
fiecare nume şi valoare.
• Expresia poate fi o constantă, un alt nume de coloană sau orice altă expresie pe
care SQL o poate transforma într-o singură valoare, care poate fi apoi atribuită
coloanei respective.
• Clauza WHERE conŃine o expresie care limitează rândurile actualizate. Dacă
această clauză este omisă, motorul SQL va încerca să actualizeze toate
rândurile din tabel sau din vizualizare.
Exemple:
• Un film a fost adăugat cu un preŃ incorect. InstrucŃiunea următoare va actualiya
două coloane din acelaşI rând a tabelului MOVIE.
UPDATE FILM
SET RETAIL_PRET_VHS = 29.95 ,
RETAIL_PRET_DVD = 34.95
WHERE FILM_ID = 21
• 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:
Exemple:
• Să se şteargă filmul adăugat mai devreme (cu FILM_ID = 21 ). Se observă că
trebuie să se ştergă mai întâi rândurile corespondente din tabelele
FILM_COPY şi FILM_LIMBA, deoarece acestea sunt rânduri „copii” ale
rândului din tabelul „FILM”
DELETE FROM FILM_COPY
WHERE FILM_ID = 21;
Întrebări şi probleme
9. O instrucŃiune UPDATE
a. Trebuie să includă o clauză SET
b. Trebuie să furnizeze o nouă valoare pentru cel puŃin o coloană
c. Trebuie să includă o clauză WHERE
d. Poate atribui unei coloane valoarea unei alte coloane
e. Poate atribui unei coloane o listă de valori derivate dintr-o expresie
11. Clauza SET dintr-o instrucŃiune UPDATE poate atribui unei coloane o
valoare care este
a. O constantă
b. Numele unei alte coloane
c. O listă de valori
d. Orice expresie din care rezultă o singură valoare
e. Cuvântul cheie NULL
FILM_ID: 99
FILM_COD_GEN: 'TRAIN'
MPAA_COD_RATING: NR
FILM_NUME: ANGAJAT
Training Video
# 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
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]
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:
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 :
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.
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]
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]
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).
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