UNIVERSITATEA SPIRU HARET FACULTATEA DE MATEMATICĂ - INFORMATICĂ

CURS:

Baze de Date
Anul III, Semestrul I, la toate formele de învăŃământ Semestrul I , 2 curs, 2 laborator Lector Dr. FLORENTINA Rodica Niculescu

TIP CURS : Obligatoriu la SecŃia de matematică Informatică,

DURATA: Titular: E-MAIL:
I.

rodicaniculescu@gmail.com

CONłINUTUL TEMATIC AL DISCIPLINEI

Notiuni introductive în domeniul bazelor de date (entitate, relatie, atribut, limbaje pentru baze de date, componenete şi arhitectura unui sistem de gestiune a bazelor de date (SGBD), evoluŃia SGBD-urilor) Proiectarea bazelor de date simple Proiectarea bazelor de date relaŃionale (modelarea Entitate-RelaŃie, diagrama E/R, modelul relational, regulile lui Codd, caracteristicile modelului relational, normalizare, forme normale, dependenŃe funcŃionale) Limbaje de manipulare a datelor relaŃionale Limbajul SQL

MODUL DE

STABILIRE A NOTEI FINALE:

Nota de la testul grilă (pe calculator).

SINTEZE ASUPRA PROGRAMEI ANALITICE
Materialul este structurat în 2 părŃi, astfel:
Partea I. Concepte ale bazelor de date relaŃionale Partea a_II_a. SQL

Partea I. Concepte ale bazelor de date relaŃionale
În această parte se face o prezentare generală a conceptelor bazelor de date relaŃionale. O bază de date este o colecŃie de informaŃii interrelaŃionate gestionate ca o singură unitate. A ceastă definiŃie este foarte largă, deoarece există mari diferenŃe între concepŃiile diferiŃilor producători care pun la dispoziŃie sisteme de baze de date. De exemplu, Oracle Corporation defineşte o bază de date ca fiind o colecŃie de fişiere fizice gestionate de o singură instanŃă (copie) a produsului software pentru baze de date, în timp ce Microsoft defineşte o bază de date SQL Server ca fiind o colecŃie de date şi alte obiecte. Un obiect al bazei de date este o structură de date denumită, stocată în bază de date, cum ar fi un tabel, o vizualizare sau un index.

Există mari diferenŃe între implementările furnizorilor de baze de date. În majoritatea sistemelor de baze de date, datele sunt stocate în mai multe fişiere fizice, dar în Microsoft Access toate obiectele bazei de date, împreună cu datele care aparŃin unei baze de date sunt stocate într-un singur fişier fizic.(Un fişier este o colecŃie de înregistrări înrudite stocate ca o singură untiate de sistemul de operare al calculatorului.) Totuşi, unul dintre principalele avantaje ale bazelor de date relaŃionale este faptul că detaliile de implementare fizică sunt separate de definiŃiile logice ale obiectelor bazei de date, astfel încât majoritatea utilizatorilor bazei de date nu au nevoie să ştie unde (şi cum) sunt stocate obiectele bazei de date în sistemul de fişiere al calculatorului. De fapt , pe măsură ce veŃi învăŃa limbajul SQL , veŃi vedea că nu este nevoie să specificaŃi numele unui fişier fizic într-o instrucŃiune SQL decât atunci când definiŃi sau modificaŃi chiar obiectele bazei de date.

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

Bază de date relaŃională
O bază de date relaŃională este o bază de date care respectă modelul relaŃional, dezvoltat de Dr.E.F.Codd. Modelul relaŃional prezintă datele sub forma familiarelor tabele bidimensionale, similar cu o foaie de calcul tabelar. Spre deosebire de o foaie de calcul tabelar, nu este obligatoriu ca datele să fie stocate într-o formă tabelară, iar

modelul permite şi combinarea tabelelor (crearea uniunilor (joining), în terminologia relaŃională) pentru formarea vizualizarilor, care sunt prezentate tot ca tabele bidimensionale. Flexibilitatea extraordinară a bazelor de date relaŃionale este dată de posibilitatea de a folosi tabelele independent sau în combinaŃii, fără nici o ierarhie sau secvenŃa predefinita în care trebuie să se facă accesul la date. Un model este o reprezentare a obiectelor şi evenimentelor lumii reale şi a asocierilor dintre ele. De fapt, el reprezintă o abstracŃie asupra aspectelor semnificative ale unei „întreprinderi“, ale unui sistem real, ignorând proprietăŃile accidentale. Modelul este cel pe care utilizatorii trebuie să-l cunoască; implementarea unui model este cea pe care utilizatorii nu este necesar să o cunoască. DiferenŃa dintre model şi implementare este, de fapt, un caz special şi important al deosebirii uzuale dintre logic şi fizic. Modelele se impun prin sintaxa şi prin semantica lor şi, din acest punct de vedere, există trei tipuri fundamentale de modele: • modele care descriu aspectele statice ale procesului modelat; • modele care descriu aspectele dinamice ale procesului modelat; • modele care descriu aspectele funcŃionale ale procesului modelat. Un model de date reprezintă o colecŃie integrată de concepte necesare descrierii: • datelor, • relaŃiilor dintre ele, • constrângerilor existente asupra datelor sistemului real analizat. Modelarea unei baze de date permite trecerea de la percepŃia unor fapte din lumea reală la reprezentarea lor prin date. Modelul de date trebuie să reflecte fidel fenomene ale lumii reale, să urmărească evoluŃia acestei lumi şi comunicarea dintre fenomenele lumii reale. Modelul trebuie să asigure conceptele de bază care permit proiectantului bazei de date şi utilizatorilor să comunice, fără ambiguităŃi, cunoştinŃele lor privind funcŃionarea şi organizarea modelului real analizat. Prin urmare, un model de date trebuie să reprezinte datele şi să le facă înŃelese. În esenŃă, modelul de date are trei componente: • mulŃime de reguli conform cărora sunt construite bazele de date (partea structurală); • mulŃime de operaŃii permise asupra datelor, care sunt utilizate pentru reactualizarea sau regăsirea datelor (partea de prelucrare); • mulŃime de reguli de integritate, care asigură coerenŃa datelor. • Abordarea generală a problemei modelării semantice a datelor se face în patru etape. • Se identifică o mulŃime de concepte semantice care sunt utile în descrierea lumii reale. Se presupune că lumea reală (modelul real analizat) este formată din entităŃi care au anumite proprietăŃi, că fiecare entitate are o identitate, că există legături, corelaŃii între entităŃi. Conceptul de corelaŃie, ca şi cel de entitate, este util, în mod intuitiv, la descrierea modelului. • Se caută o mulŃime de obiecte formale, simbolice care sunt utilizate pentru reprezentarea conceptelor semantice anterioare. • Se dau reguli de integritate formale şi generale (constrângeri) care să reflecte restricŃiile la care este supus modelul.

într-o manieră grafică. făcând distincŃie între valori diferite ale acesteia. ca un model de date conceptual. Nu trebuie confundat conceptul de relaŃie. care intervine în definirea diagramei E/R cu conceptul de relaŃie care este specific modelului relaŃional. Entitatea poate fi persoană.P. ea poate fi un obiect cu existenŃă fizică. EntităŃiile şi legăturile au anumite caracteristici. reală sau poate fi un obiect cu existenŃă conceptuală. să fie stabilă. Aceste diagrame oferă un mijloc simplu şi inteligibil de comunicare a caracteristicilor importante ale designului unei anumite baze de date. Modelul E/R împarte elementele unui sistem real în două categorii: entităŃi şi relaŃii (legături. Chen în 1976 şi rafinat de atunci în diverse moduri de către acesta şi de mulŃi alŃi cercetători. Modelul entitate-relaŃie Una dintre cele mai cunoscute abordări ale modelării semantice (cu siguranŃă una dintre cele mai utilizate) este cea bazată pe modelul entitate-relaŃie (E/R). pentru a uşura proiectarea bazelor de date. care este semnificativ pentru modelul real analizat. să fie familiară utilizatorului. caz în care ea nu depinde de existenŃa altei entităŃi. Această tehnică. Pentru reprezentarea grafică a modelului sunt utilizate diagramele E/R. Entitate Entitatea este un obiect sau un concept. trebuie să fie controlată de administratorul bazei. . Acesta a fost introdus de către P. ca şi modelul E/R însuşi. loc. O entitate poate fi dependentă (slabă). Cheia primară: • • • • • trebuie să fie unică şi cunoscută la orice moment. Modelul este constituit din concepte care descriu structura bazei de date şi tranzacŃiile de regăsire sau reactualzare asociate.• Se defineşte o mulŃime de operatori formali prin care pot fi prelucrate şi analizate obiectele formale. abstractă. numite atribute. să fie simplă. concept. 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. asocieri) între aceste entităŃi. în sensul de asociere. a evoluat de-a lungul timpului datorită noilor problematici care au apărut în proiectarea bazelor de date. fără ambiguităŃi. Prin urmare. Cheia primară este un identificator unic în cadrul entităŃii. unui sistem din lumea reală. Acest sistem este format din obiecte legate între ele. Diagrama E/R este un model de date conceptual de nivel înalt. Diagramele E/R constituie o tehnică de reprezentare a structurii logice a bazei de date. Baza de date poate fi definită ca o mulŃime de date ce modelează un sistem real. activitate etc. existenŃa sa depinzând de altă entitate sau independentă (tare). care sunt modele neformalizate pentru reprezentarea unui model. independent de platforma hardware utilizată şi de tipul SGBD-ului. trebuie să nu conŃină informaŃii descriptive.

Între două entităŃi pot exista mai multe relaŃii. Uneori.ObservaŃii • EntităŃile devin tabele în modelele relaŃionale. • Pentru fiecare relaŃie este important să se dea o descriere detaliată. ele sunt diferenŃiate de către entităŃile care sunt asociate prin relaŃia respectivă. O relaŃie în care aceeaşi entitate participă mai mult decât o dată în diferite roluri defineşte o relaŃie recursivă. cvadruplă. Nu pot exista. entităŃile se scriu cu litere mari. • Pentru fiecare relaŃie trebuie stabilită cardinalitatea (maximă şi minimă) relaŃiei. ObservaŃii: • În modelul relaŃional. în aceeaşi diagramă. ternară. adică numărul de tupluri ce aparŃin relaŃiei. • RelaŃiile sunt verbe. sau o aceeaşi entitate cu nume diferite. relaŃiile devin tabele speciale sau coloane speciale care referă chei primare. relaŃie binară. n-ară). RelaŃia exprimă un raport care există între aceste entităŃi. • EntităŃile sunt substantive. • În aceeaşi diagramă pot exista relaŃii diferite cu acelaşi nume. ExistenŃa unei relaŃii este subordonată existenŃei entităŃilor pe care le leagă. aceste relaŃii sunt numite unare. Gradul unei relaŃii este dat de numărul de entităŃi participante într-o relaŃie (de exemplu. dar nu orice substantiv este o entitate. dar nu orice verb este o relaŃie. O valoare a unei relaŃii este o comunicare între valorile entităŃilor pe care le leagă. DEPARTAMENT SARCINA lucreaza_in conduce apartine_la SALARIAT atasat_la PROIECT RelaŃie RelaŃia (asocierea) este o comunicare între două sau mai multe entităŃi. • În general. În acest caz. • Pentru fiecare entitate este obligatoriu să se dea o descriere detaliată. două entităŃi cu acelaşi nume. poate (cardinalitate maximă) trebuie (cardinalitate minima) EXEMPLE: CâŃi salariaŃi pot lucra într-un departament? MulŃi! În câte departamente poate lucra un salariat? In cel mult unul! . Trebuie ignorate substantivele nerelevante.

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

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

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

M(0)

M(0)

1
apartine_la

M(0) 1

conduce

lucreaza_in

M
11

1(0)

DEPARTAMENT cod_departament nume nr_cladire

SARCINA nr_proiect nr_sarcina data_inceperii

Diagrama Entitate/relaŃie

Cazuri speciale de entităŃi, relaŃii, atribute şi modul lor de reprezentare în cadrul diagramei entitate-relaŃie.
1. Entitate dependentă – nu poate exista în mod independent (SARCINA

depinde de PROIECT). Cheia primară a unei entităŃi dependente include cheia primară a sursei (nr_proiect) şi cel puŃin o descriere a entităŃii (nr_sarcina). Entitatea dependentă se desenează prin dreptunghiuri cu linii mai subŃiri.
2. Moştenirea atributelor. Subentitate (subclasă) – submulŃime a unei alte

entităŃi, numită superentitate (superclasă) (SALARIAT < –– > PROGRAMATOR). Subentitatea se desenează prin dreptunghiuri incluse în superentitate. Există o relaŃie între o subentitate şi o superentitate, numită ISA, care are cardinalitatea maximă 1:1 şi minimă 1:0. Cheile primare, atributele şi relaŃiile unei superentităŃi sunt valabile pentru orice subentitate. AfirmaŃia reciprocă este falsă. 3. Într-o diagramă E/R se pot defini relaŃii recursive.
4. RelaŃie sau atribut? Dacă un atribut al unei entităŃi reprezintă cheia primară a

unei alte entităŃi, atunci el referă o relaŃie (cod_departament în tabelul SALARIAT).
5. Entitate sau relaŃie? Se cercetează cheia primară. Dacă aceasta combină cheile

primare a două entităŃi, atunci este vorba de o relaŃie. (cheia primară a relaŃiei asociat_la combină cod_salariat cu nr_proiect, prin urmare, SALARIAT_asociat la_PROIECT va defini o relaŃie şi nu o entitate).

Probleme
1.Să se creeze modelul E/R pentru gestiunea activităŃilor de împrumut dintr-o bibliotecă S-a presupus (restrictiv) că într-o zi un cititor nu poate împrumuta, de mai multe ori, aceeaşi carte. EntităŃile şi relaŃiile care intervin în acest model sunt următoarele: 1. CARTE (entitate independentă) – orice carte care se găseşte în inventarul bibliotecii. Cheia primară este atributul codel. 2. CITITOR (entitate independentă) – orice cititor care poate împrumuta cărŃi. Cheia primară este atributul codec. 3. DOMENIU (entitate independenta) – domeniul căruia îi aparŃine o carte. Cheia primară este atributul coded.

4. 5.

IMPRUMUTA – relaŃie având cardinalitatea m:m care leagă entităŃile CITITOR şi CARTE. APARTINE – relaŃie care leagă atributele CARTE şi DOMENIU. RelaŃia are cardinalitatea maximă m:1, iar cardinalitatea minimă 1:1.

M(1)

M(0) imprumuta

CIT ITOR
codec# nume dep

CAR TE
codel# titlu autor pret nrex

M(0) apartine

1

DOM ENIU
coded# intdom

2.EvidenŃa şcolilor de şoferi din Romania. CompletaŃi relaŃiile (lucreaza_la, conduce, sustine, asista, instruieste) dintre entităŃi şi specificaŃi cardinalitatea!

SCOALA cod_scoala# INSTRUCTOR cod_instructor#

CLIENT cod_client#

EXAMEN cod_examen#

MASINA cod_masina#

EXAMINATOR cod_examinator#

El este un model formal de organizare conceptuală a datelor. Modelul relaŃional este alcătuit numai din relaŃii şi prin urmare. Campionatele de fotbal ale diferitelor Ńări ECHIPA Cod_echipa# 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# M(1) sustine M(1) SPONSOR M(1) Cod_sponsor# Nume Modelul relaŃional Modelul relaŃional a fost conceput şi dezvoltat de E. .F. Codd.3. PRTV) CalităŃi: • este simplu. INGRES. orice interogare asupra bazei de date este tot o relaŃie. bazat pe teoria matematică a relaŃiilor. destinat reprezentării legăturilor dintre date. Cercetarea în domeniu 3 mari proiecte (System R.

F. structura relaŃională a datelor. regulile de integritate care guvernează folosirea cheilor în model. operatorii modelului relaŃional. Structura datelor Definirea noŃiunilor de domeniu. RestricŃiile de integritate minimale sunt definite în raport cu noŃiunea de cheie a unei relaŃii. Conceptele utilizate pentru a descrie formal. de referinŃă. schemă relaŃională. un sistem de baze de date ce suportă un limbaj de tip SQL – Structured Query Language. compunere. selecŃie. un sistem de baze de date care respectă principiile modelului relaŃional introdus de E. Fiecare relaŃie are cel puŃin o cheie. Caracteristicile unui model relaŃional: • • • Aceste trei elemente corespund celor trei componente ale ingineriei software: informaŃie. de entitate) ce constituie mulŃimea minimală de reguli de integritate pe care trebuie să le respecte un SGBD relaŃional. Există trei tipuri de constrângeri structurale (de cheie. ModalităŃi pentru definirea unui SGBD relaŃional: • • • prezentarea datelor în tabele supuse anumitor operaŃii de tip proiecŃie. intersecŃie etc. Atributele care reprezintă cheia primară sunt fie subliniate. proces. fie urmate de semnul #. valoare null şi tabel vizualizare (view). reuniune. integritate. nu este orientat spre sistemul de calcul. . uzual sau fizic elementele de bază ale organizării datelor sunt date în următorul tabel: Formal relaŃie tuplu atribut domeniu Uzual tablou linie coloană tip de dată Fizic fişier înregistrare câmp tip de dată Reguli de integritate sunt aserŃiuni pe care datele conŃinute în baza de date trebuie să le satisfacă. Cheia primară nu poate fi reactualizată. O mulŃime minimală de atribute ale căror valori identifică unic un tuplu într-o relaŃie reprezintă o cheie pentru relaŃia respectivă.• • riguros din punct de vedere matematic. Una dintre cheile candidat va fi aleasă pentru a identifica efectiv tupluri şi ea va primi numele de cheie primară. relaŃie. Codd.

unde P1 este cheie primară pentru R1. În acest caz. . Cheia primară nu conŃine chei externe. EntităŃile dependente devin tabele dependente. Regula 3 – integritatea referirii. care are două chei externe pentru cele două tabele asociate. Atributele cheii primare trebuie să fie diferite de valoarea null. RelaŃiile de tip trei devin tabele asociative. Fie schemele relaŃionale R1(P1. Cheia externă se referă la supertabel. vom spune că S1 este cheie externă (cheie străină) pentru R1. O cheie secundară este folosită ca index pentru a accesa tupluri. Cheia primară este compunerea a trei chei externe plus eventuale coloane adiŃionale. Un grup de atribute din cadrul unei relaŃii care conŃine o cheie a relaŃiei poartă numele de supercheie. ori să corespundă unei valori a cheii primare asociate. SubentităŃile devin subtabele. 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. Simbolul „ד indică plasamentul cheii externe. RelaŃia m:n devine un tabel special. Modelul relaŃional respectă trei reguli de integritate structurală. S2). Regula 1 – unicitatea cheii. Tabelul se desenează punctat. RelaŃia conduce devine coloană în tabelul DEPARTAMENT. Cheia primară este compunerea acestor două chei externe plus eventuale coloane adiŃionale. Transformarea atributelor Un atribut singular devine o coloană. O cheie externă trebuie să fie ori null în întregime. Transformarea relaŃiilor RelaŃiile 1:1 şi 1:n devin chei externe. Cheia primară trebuie să fie unică şi minimală. RelaŃia 1:1 plasează cheia externă în tabelul cu mai puŃine linii. numit tabel asociativ. iar simbolul „ד exprimă faptul că această cheie externă este conŃinută în cheia primară. S1 este cheie secundară pentru R1. iar cheia primară este această cheie externă (cheia primară a subentităŃii PROGRAMATOR este cod_salariat care este o cheie externă). Regula 2 – integritatea entităŃii.O cheie identifică linii şi este diferită de un index care localizează liniile. iar relaŃia lucreaza_in devine coloană în tabelul SALARIAT. iar S1 este cheie primară pentru R2. Transformarea entităŃilor EntităŃile independente devin tabele independente. S1) şi R2(S1.

nr_proiect#. SALARIAT cod_salariat# salariu nume sex job_cod ATASAT_LA cod_salariat# nr_proiect# functie PROIECT nr_proiect# descriere buget_alocat AGENT_TERITORIAL zona comision PROGRAMATOR limbaj nivel apartine_la conduce lucreaza_in casatorit SARCINA nr_proiect# nr_sarcina# data_inceperii stare DEPARTAMENT cod_departament# nume nr_cladire cod_salariat TELFON cod_salariat# nr_telefon# Schemele relaŃionale corespunzătoare acestei diagrame conceptuale sunt următoarele: – – – – – SALARIAT(cod_salariat#. data_inceperii.Atributele multiple devin tabele dependendente ce conŃin cheia primară a entităŃii şi atributul multiplu. SARCINA(nr_proiect#. atributele relaŃiilor vor aparŃine tabelului care conŃine cheia externă. prenume. nr_depart). iar atributele lor devin coloane în aceste tabele. nume. cod_sal). PROIECT(nr_proiect#. ATASAT_LA(cod_salariat#. EntităŃile devin tabele. numar_cladire. . descriere. plus una sau mai multe coloane adiŃionale. iar pentru relaŃii m:n şi de tipul trei. nr_sarcina. sex. forma_plata. nume. buget_alocat). DEPARTAMENT(cod_departament#. Ce devin atributele relaŃiilor? Pentru relaŃii 1:1 şi 1:n. atributele vor fi plasate în tabelele asociative. Cheia primară este o cheie externă. job_cod. cod_sot. stare). functia).

existenŃa unor structuri de date simple. ci măsura în care acesta este relaŃional. nu realizează gestiunea cunoştinŃelor. limbaj. realizarea unei redundanŃe minime. nu lucrează cu obiecte complexe. nu există mijloace perfecŃionate pentru exprimarea constrângerilor de integritate. nr_telefon#). deci numărul regulilor lui Codd pe care le respectă. supleŃe în comunicarea cu utilizatorul neinformatician. Ca limite ale modelului relaŃional putem menŃiona: rămâne totuşi redundanŃă. Avantajele modelului relaŃional: fundamentare matematică riguroasă. comision).F. TELEFON(cod_salariat#. toate valorile unui domeniu corespunzătoare tuturor cazurilor nu mai pot fi descompuse în alte valori (sunt atomice). Nici un sistem de gestiune a bazelor de date pus în vânzare pe piaŃa comercială nu respectă absolut toate regulile definite de Codd. dar acest lucru nu împiedică etichetarea acestor sisteme drept relaŃionale. independenŃă fizică a datelor. ordinea liniilor şi a coloanelor este arbitrară. ocupă spaŃiu. nu realizează gestiunea totala a datelor distribuite. Nu trebuie apreciat un SGBD ca fiind relaŃional sau nu. Regula 1 – regula gestionării datelor. articolele unui domeniu sunt omogene. • • • • • • • • • • • • • • În anul 1985. posibilitatea filtrărilor. E. apar fenomene de inconsistenŃă. nu există mecanisme pentru tratarea optimă a cererilor recursive. nivel). zona. Codd a publicat un set de 13 reguli în raport cu care un sistem de gestiune a bazelor de date poate fi apreciat ca relaŃional. Regulile lui Codd • • • • • Caracteristici ale modelului relaŃional: nu există tupluri identice. PROGRAMATOR(cod_salariat#. fiecare coloană defineşte un domeniu distinct şi nu se poate repeta în cadrul aceleiaşi relaŃii.– – – AGENT_TERITORIAL(cod_salariat#. Un SGBD relaŃional trebuie să fie capabil să gestioneze o bază de date numai prin posibilităŃile sale relaŃionale. .

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

constrângerile referenŃiale.99 2003 2004 2003 49. un loc sau un lucru care trebuie să fie reprezentat în baza de date.99 19. care este o structură bidimensională compusă din rânduri şi coloane. InstrucŃiunile SQL folosite pentru crearea acestor componente ale bazei de date sunt prezentate în parte. Exemplu pentru însuşirea formelor normale şi a instrucŃiunilor SQL Componentelor fundamentale ale bazelor de date relaŃionale sunt utilizate pentru a construi obiectele bazelor de dae pe care le vom folosi .98 19.99 29. Tabele Unitatea primară de stocare a datelor într-o bază de date relaŃională este tabelul.94 29.93 9. Fiecare tabel reprezintă o entitate.94 2003 2002 2004 .98 14. iar fiecare coloană reprezintă o caracteristică a filmului respectiv.99 29.99 19.95 50.96 29. un cont bancar sau o tranzacŃie bancară.95 14.97 15. Tabelul FILM este parte a unei baze de date pentru un magazin de produse video.95 24. Figura 1-1 reprezintă listingul parŃial al unui tabel numit FILM(filme).• • sistemul suportă restricŃiile de integritate de bază (unicitatea cheii primare. cum ar fi un client. integritatea entităŃii).99 6.98 39.95 14.96 19. ceea ce înseamnă o persoană.97 19.99 12. Tabelul FILM conŃine date care descriu filmele disponibile în magazinul de produse video. cum ar fi titlul filmului sau categoria MPAA(Motion Picture Associationof America care a fost fondată în 1972 în America ca asociaŃie a producătorilor de film pe lângă industria cinematografică) FILM_I D FILM_C OD_GE N Drama ActAv Comedie ActAv ActAv ActAv MPA A_CO DRAT ING R R PG-13 PG-13 R PG-13 FILM_NUME PRET_INCHIR _VHS PRET_INCHIR _DVD AN_P RODU S 2003 2003 2003 2003 2003 2003 1 2 3 4 5 6 7 8 9 Drama ActAv ActAv PG-13 R PG-13 10 11 12 Drama Romantic Comedie R PG-13 PG-13 Mystic River The Last Samurai Something`s Gotta Give The Italian Job Kill Bill: Vol 1 Pirates of the Caraibbean: The Curse of the Black Pearl Big Fish Man on Fire Master and Commander: The Far Side of the World Lost in translation Two Weeks Notice 50 First Dates 58. Fiecare rând al tabelului reprezintă o apariŃie a entităŃii. sistemul suportă toate operaŃiile de bază ale algebrei relaŃionale. Fiecare rând din tabel reprezintă un film.95 11.99 29.99 14. folosit ca exemplu în toată aceast curs.

94 2003 2003 2003 2004 2003 2004 1981 Figura 1-1 Listingul tabelului FILM Se poate observa asemănarea dintre tabelele bazelor de date relaŃionale şi foile de calcul tabelar. dar tabelul LANGUAGE şi relaŃia acestuia cu tabelul FILM au fost omise din figura de mai sus. bazele de date relaŃionale oferă o flexibilitate mult mai mare în organizarea şi afişarea informaŃiilor.99 12.94 24. Trebuie să înŃelegeŃi acest concept pentru a putea înŃelege cum funcŃionează bazele de date relaŃionale. poartă numele de chieie externă. in portiunea principala a dreptunghiului. Şi coloana COD_LIMBA este marcată drept cheie externă . Dacă o cheie primară este folosită într-un alt tabel pentru stabilirea unei relaŃii.99 14. De exemplu. deoarece stabilesc relaŃii şi permit crearea legăturilor între date.99 19. puteŃi asocia tabelele înrudite. puteŃi stoca informaŃii despre categoriile folosite de magazin pentru organizarea inventarelor de filme. esenŃa bazelor de date este tocmai stocarea informaŃiilor între care există legături. UN tabel poate avea o singură cheie primară.95 29. În figură 1-2.99 11.93 24. inclusiv data la care a fost primită copia şi formatul acesteia.99 9. dacă aceasta este calea de formare a unei chei unice.99 28. cu numele tabelului scris deasupra liniei orizontale si coloanele tabelului enumerate pe verticala . 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ă. Deşi fiecare tabel relaŃional poate exista independent. dar păstrând flexibilitatea de a include numai informaŃiile care vă interesează.99 29.98 17. Totuşi. puteŃi stoca şi informaŃii despre copiile fiecărui film. uşor de folosit astfel încât puteŃi să combinaŃi date din tabele multiple în aceeaşi interogare a bazei de date. Cheile primare şi cheile externe sunt blocuri de construcŃie fundamentale ale modelului relaŃional. RelaŃiile sunt implementate folosind coloane corespondente din cele două tabele participante.97 29.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. În diagrama ERD coloana sau coloanele subliniate din fiecare tabel. într-un format cunoscut sub numele de diagrama de relatii a entitatilor (ERD – Entity Relationship Diagram). într-un mod formal. Figura 1-2 prezinta patru tabele din baza de date a magazinului de produse video si relaŃiile dintre acestea.99 29. cum ar fi DVD sau VHS. atunci când este necesar. Prin folosirea realaŃiilor.98 19.13 14 15 16 17 18 19 20 Comedie Drama Drama Comedie Romantic Drama ActAv Strain PG-13 R R PG-13 PG-13 R PG-13 R Matchstick Men Could Mountain Road to Perdition The School of Rock 13 Going on 30 Monster The Day After Tomorrow Das Boot 6. În acelaşi timp.69 14. RelaŃii RelaŃiile reprezintă asocierile dintre tabelele bazelor de date relaŃionale. Fiecare dreptunghi din diagrama reprezintă un tabel relaŃional. o cheie primară poate fi compusă din mai multe coloane. pe lângă filmele propriuzise. Totuşi . .

deoarece.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ă.Fiecare restricŃie primeşte un nume unic. O valoare nulă nu este acelaşi lucru un un spaŃiu liber. 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.Este recomandabil ca proiectanŃii bazei de date să denumească restricŃiile.FILM FILM_ID <pk> MPAA_RATING MPAA_COD_RATING <pk> MPAA_DESCRIERE_RATING FILM_COD_GEN <fk1> MPAA_COD_RATING <fk2> FILM_NUME RETAIL_PRET_VHS RETAIL_PRET_DVD AN_PRODUS FILM_GEN FILM_COD_GEN <pk> FILM_DESCRIERE_GEN FILM_COPII FILM_ID <pk. având rolul de a limita într-un mod oarecare domeniul de valori permise pentru obiectul respectiv al bazei de date. astfel încât să poată fi referită în mesajele de eroare şi în comenzile folosite ulterior în bază de date.Atunci când cheia primară este definită pe mai multe coloane. deoarece numele generate automat de bază de date nu sunt foare descriptive. RestricŃiile cheie primară sunt aproape inttotdeauna implementate de RDBMS prin folosirea unui index. din păcate. nu toate produsele RDBMS disponibile în prezent acceptă restricŃiile denumite. combinaŃia valorilor acelor coloane trebuie să fie unică în tabel .După ce sunt specificate.o coloană care reprezintă doar o parte a valorii cheii primare poate conŃine valori duplicate în tabel.Indexul este un tip special de obiect al unei baze . fk>> NUMAR_COPIE <pk> DATA_CUMPARARE DATA_VANZARE FORMAT_MEDIA Figura 1-2 Diagrama ERD a bazei de date (prezentare parŃială) RestricŃii O restricŃie este o regulă specificată pentru un obiect al bazei de date (de obicei un table sau o coloană). un şir vid sau valoarea zero şi este o valoare specială care nu este egală cu nimic altceva. 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ă). Totuşi . nu am denumit restricŃiile din baza de date folosită ca exemplu în această carte. 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.

dacă se întâmplă acest lucru . în mod automat. 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.Atunci când în tabele sunt înserate rânduri noi. 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.dedate care permite efectuarea căutărilor rapide în valorile coloanei. sistemul RDBMS verifică automat indexul pentru a se asigura că cheia primară a noului rând nu este deja folosită în tabel şi .. sistemul RDBMS foloseşte aproape întotdeauna un index ca modalitate de impunere eficientă a restricŃiei. Index Un index reprezintă o cale rapidă de localizare şi sortare a Inregistrarilor dintro tabelă prin gruparea tuturor înregistrărilor pentru un anumit atribur sau grup de atribute.Rezultatul instrucŃiunii trebuie să fie o valoare logică de adevărat (true) sau fals (false). cu mesajul de eroare corespunzător. Pe scurt . astfel încât un rezultat adevărat să permită înserarea în tabel a valorii coloanei. În sens invers. dacă ne intereayă anumite nume dintr-o tabelă StudenŃi. RestricŃia de unicitate (unique) Definită pe o coloană sau un set de coloane care trebuie să conŃină valori unice ale tabelului.În tabelul FILM. astfel încât căutarea cheilor duplicate la fiecare inserare să nu ducă la o reducere semnificativă a performanŃelor. deoarece „M” nu este o valoarea MPAA_COD_RATING validă şi . că fiecărei valori a cheii externe îi corespunde o valoarea a cheii primare în tabelul părinte. Indexarea este utilizată în două scopuri principale: accelerarea căutărilor în baya de date asigurarea unicităŃii înregistrărilor De exemplu. sistemul RDBMS nu-mi permite să inserez o înregistrare cu valoarea „M” în coloana MPAA_COD_RATING. indiferent de dimensiunea acestuia. un tabel poate avea definite mai multe restricŃii de unicitate. putem crea un index pentru coloana NumeSt. .ca urmare. spre deosebire de cheile primare. ca urmare. sistemul RDBMS nu-mi permite să şterg din tabelul MPAA_RATING rândul cu cheia primară „PG-13” . respinge cererea de inserare. Căutarea în indexuri se face mult mai repede decât căutarea în tabel. iar un rezultat fals să ducă la rejectarea valorii coloanei . pentru a regăsi mai repede studenŃii cu un anmit nume de familie. 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ă. nu apare ca valoare a cheii primare din tabelul MPAA_RATING.Totuşi. iar coloanele care participă la o restricŃie de unicitate pot conŃine ( în cele mai multe sisteme RDBMS ) şi valori nule. RestricŃia CHECK Foloseşte o instrucŃiune logică simplă (scrisă în SQL) pentru a valida valoarea unei coloane. Ca şi în cazul cheilor primare. indexarea cheii primare este esenŃială pentru orice tabel. deoarece valoarea respectivă este folosită ca valoare a cheii externe pentru cel puŃin una din înregistrările din tabelul FILM. Prin „impunere” se înŃelege că sistemul RDBMS se asigură întotdeauna.

se prezintă modul de creare a indecşilor şi în Partea III. indecşii îngreunează actualizarea lor. Maschează coloanele pe care utilizatorul nu are nevoie să le vadă (sau nu-i este permis să le vadă). precum Microsoft SQL Server). create index. . o vizualizare este un tabel virtual.Dupa fiecare operaŃie de actualiyare)inserare. Vizualizările au mai multe funcŃii utile: Maschează radurile pe care utilizatorul nu este nevoie să le vadă (sau nu-i este permis să le vadă).Putem indexa şi mai multe coloane. Deşi accelerează procesul de regăsire a datelor . ÎmbunătăŃeşte performanŃele interogărilor (în unele sisteme RDBMS. Vizualizări O vizualizare (view) este o interogare stocată în baza de date şi pune la dispoziŃia utilizatorului un subset personalizat al datelor din unul sau mai multe tabele ale bazei de date. Cu alte cuvinte. şi proprietatea Required primeşte valoarea Yes. cum ar fi uniunile de tabele (respectiv combinarea coloanelor din tabele multiple într-o singură interogare a bazei de date). ştergere. pentru coloanele NumeSt şi PrenumeSt. modificare. deoarece arată ca un tabel şi în cele mai multe privinŃe se comportă că un tabel. proprietatea Indexed are valoarea Yes(No Duplicates). dar nu stochează date ( nu este stocată decât interogarea SQL care defineşte vizualizarea). In Partea a-II-aAccess . ObservaŃie: Cheia primară a unei tabele este indexaŃa automat.Folosirea lor trebuie bine întemeiată altfel măresc timpul de răspuns al sistemuluişi ocupă spaŃiul suplimentar pe disc . Maschează operaŃiile complexe efectuate în baza de date. la DDL. trebuie verificaŃi şi actualiyaŃi indecşii. Nu pot fi indexate coloane de tipul :Memo. de exemplu creem un index cu numele NUME . Hyperlinksau OLE Când o coloană face parte din cheia primară a unei tabele. deoarece cheia primară nu poate conŃine valoarea null.

R2. β. În discuŃia despre normalizare am eliminat aceste liniuŃe din figuri. O relaŃie este într-o formă normală particulară dacă ea satisface o mulŃime specificată de constrângeri. γ o partiŃie a lui A. foarte pe scurt.Codd. mai devreme în acestă lecŃie probabil v-aŃi întrebat de ce coloanele au fost plasate în tabele multiple şi de ce o anumită coloană a fost inclusă într-un anumit tabel şi nu în altul. Procesul normalizării se realizează plecând de la o relaŃie universală ce conŃine toate atributele sistemului de modelat. Rk.. Dr. procesul general de proiectare a bazelor de date. Procesul este reversibil în sensul că nici o informaŃie nu este pierdută în timpul transformării. Rk. plus o mulŃime de anomalii. reprezintă reuniunea determinantului cu restul atributelor lui A. Această descompunere presupune desfacerea relaŃiei R în proiecŃiile R1. Tabelul de mai jos prezintă tabelul FILM fără normalizare. care este o tehinca pentru producerea unui set de relaŃii (termenul folosit de Dr. . în relaŃii de structură mai simplă.Acest exemplu va fi folosit pentru ilustrarea procesului de normalizare. . Atunci când aŃi văzut pentru prima dată figură 1-2 . pentru a face textul mai uşor de citit. Atunci: α∪β α∪γ mulŃimea atributelor care intervin în dependenŃele funcŃionale. R2. Presupunem că α determină funcŃional pe β. astfel încât dependenŃele lui R sunt echivalente (au închideri pseudo-tranzitive identice) cu reuniunea dependenŃelor lui R1.Proiectate bazele de date relaŃionale Această secŃiune prezintă...E. Scopul acestei secŃiuni este de a vă ajuta să răspundeŃi la întrebările de mai sus şi de a vă oferi un punct de plecare. a pus la punct un set de reguli care trebuie respectate (organizate în trei „forme normale”) şi un poroces numit normalizare. numele coloanelor din tabelele relaŃionale folosesc liniuŃe de subliniere pentru separarea cuvintelor. În general.. Orice formă normală se obŃine aplicând o schemă de descompunere. părintele bazelor de date relaŃionale. Există două tipuri de descompuneri. Rj. .. astfel încât pentru orice realizare a lui R este adevărată relaŃia: O descompunere fără pierdere de informaŃie. În 1972. Codd pentru tabele) cu proprietăŃile dorite. este dată de regula Casey-Delobel: Fie R(A) o schemă relaŃională şi fie α.F.. R2.. Totuşi proiectarea bazelor de date este un domeniu mult mai larg. Descompuneri ce conservă dependenŃele. Această descompunere presupune desfacerea relaŃiei R într-o mulŃime de proiecŃii R1. aşa cum ar arăta dacă toate informaŃiile despre filme ar fi colectate într-un singur tabel... Descompuneri fără pierderi de informaŃie. . Necesitatea normalizării Normalizarea este procesul reversibil de transformare a unei relaŃii. dacă decideŃi să proiectaŃi propriile baze de date pe măsură ce învăŃaŃi limbajul SQL. utilizată în procesul normalizării.

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.99 en PG-13 sunt 2/15/2005 DVD 29.Ar fi mult mai bine dacă aŃi putea adauga noile genuri înainte de primirea filmelor în magazin.95 en PG-13 Something's Gotta Give Something's Gotta Give The Job Italian 200 3 200 3 200 3 01/10/2005 1/30/2 005 DVD 29. 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. 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. fr.99 Figura 1-3 Tabelul FILM fară normalizare Anomalia de inserare Anomalia de inserare se referă la o situaŃie în care nu puteŃi insera date în baza de date din cauza unei dependenŃe artificiale dintre coloanele unui tabel.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.99 en. fr R Sub 17 ani necesita prezenta parintilor sau a unui adult Sub 17 ani necesita prezenta parintilor sau a unui adult Sub 17 ani necesita prezenta parintilor sau a unui adult Parintii avertizati Parintii avertizati Parintii avertizati sunt Mystic River 01/01/2005 DVD 19. fr PG-13 sunt 2/15/2005 DVD 19. es R The Last Samurai 200 3 01/10/2005 DVD 19.96 en. Scopul procesului de normalizare este de a elimina aceste probleme (anomalii) din proiectul bazei de date. .96 2 Ac lA d 2 Ac tA v 3 3 4 Co me die Co me die Ac tA v Act Av si ave ntur a Acti une si ave ntur a Co med ie Co med ie Acti une si ave ntur a en. FILM _ID G E N_ C O D Dr am a GE N_ DE SC RIE RE Dra ma LAN G_ COD E MPAA _COD _RATI NG MPAA_RATIN G_DESC FILM_NUM E AN _P RO DU S 200 3 DATA_CUM PARARE DAT A_VA NZA RE MEDIA _FORM AT PRETINCHI RIERE 1 en. fr. es R The Last Samurai 200 3 01/10/2005 VHS 15.

De asemenea . aşa cum am făcut în figura 1-3. consideraŃi ca fiecare vizualizare este o relaŃie. În timpul acestui proces. încă nu există ca tabel fizic. parcurgând apoi drumul înapoi către mijloacele folosite pentru obŃinerea rezultatelor dorite. ecrane ale aplicaŃiilor. Un alt pericol legat de această anomalie este faptul că stocarea unor date redundante poate aduce la posibilitatea de actualiza numai o parte a copiilor respectivelor date. Poate părea ciudat la prima vedere. În timpul normalizării . normalizarea începe de la mijloacele de redare a datelor care sunt (sau vor fi) prezentate utilizatorilor. în specia deoarece impune prouectantului să se gândească într-un mod conceptual la datele şi relaŃiile pe care intenŃionează să le folosească. Deşi relaŃia pe cale de a fi normalizată reprezintă o propunere de tabel . precum tabel. Se referă la situaŃia în care ştergerea unor date duce la pierderea neintenŃionată a altor date. De exemplu . procesul de normalizare este aplicat fiecărei vizualizări . trebuie să modificaŃi şi toate rândurile din tabel pentru filmele cu codul respectiv. deoarece toate copiile aceluiaşi film (cu aceeaşi valoare FILM_ID ) pe acelaşi mediu (DVD sau VHS) ar trebui să aibă acelaşi preŃ. conceptualizaŃi fiecare vizualizare ca şi cum ar fi deja un tabel bidimensional . Cu alte cuvinte. dar este ceva obişnuit ca proiectarea unui sistem de prelucrare a datelor să înceapă de la rezultatele pe care le va vedea utilizatorul. este nevoie de timp pentru a va obişnui cu terminologia folosită în procesul de normalizare. şi este şters. Chiar şi coloana PRET_INCHIR are această problemă. rapoarte şi aşa mai departe. Aplicarea procesului de normalizare De obicei. ceea ce ar avea ca rezultat apariŃia inconsecvenŃelor în baza de date. Procesul de normalizare este aplicat sistematic fiecărei vizualizări. Colectiv. acestea sunt numite vizualizări de utilizator (user views). iar rezultatul este un set de relaŃii normalizate care pot fi apoi direct implementate ca tabele ale bazei de date relaŃionale.Anomalia de ştergere Anomalia de ştergere este inversul anomaliei de inserare. veŃi rescrie relaŃiile existente şi veŃi crea altele. majoritatea proiectanŃilor evită folosirea unor termeni fizici. aşa că termenul nu este foarte exact. se pierde informaŃia că a existat vreodată un gen numit „Drama” Anomalia de actualizare Anomalia de actualizare se referă la o situaŃie în care actualizarea unei singure valori necesită actualizarea mai multor rânduri. Stăpânirea procesului de normalizare cere timp şi exerciŃiu. De exemplu dacă primul film din tabel este singurul rând din tabelul FILM pentru care coloana GEN_COD are valoarea „Drama” . Pe măsură ce parcurgeŃi procesul de normalizare. Cel puŃin la început este mai uşor să reprezentaŃi fiecare vizualizare ca un tabel bidimensional. dacă în tabelul prezentat mai sus trebuie să modificaŃi descrierea codului MPAA_COD_RATING „R”. cum ar fi pagini web. Rescrierea vizualizărilor în relaŃii (tabele) cu date reprezentative este un proces obositor şi . conŃinând date repetitive. Probleme similare apar şi pentru coloana GEN_DESCRIERERIPTION. În timpul proiectării bazei de date. coloană şi cheie primară.

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

99 DVD 29. De fapt. si acestea ar fi considerate atribute multivaloare. deoarece valorile din listă trebuie să fie mai întâi separate. care nu este acceptat în prima formă normală. procesul de normalizare pentru obŃinerea primei forme normale cere să transformaŃi coloanele repetate şi valorile repetate din coloane în rânduri repetate într-un tabel separat . . Bazele de date relaŃionale cer ca toate rândurile dintr-un tabel să aibă acelaşi număr de coloane. es R en PG13 PG13 PG13 Sub 17 ani necesita prezenta parintilor sau a unui adult Sub 17 ani necesita prezenta parintilor sau a unui adult Sub 17 ani necesita prezenta parintilor sau a unui adult Parintii sunt avertizati Parintii avertizati Parintii avertizati sunt Mystic River 01/01/20 05 DVD 19. adică atribute care au mai multe valori pentru acelaşi rând de date. Din punct de vedere logic.96 The Last Samurai 20 03 01/10/20 05 DVD 19. aşa că-l puteŃi considera un atribut cu valori multiple. dar într-o forma specială. es R en. fr sunt Something' s Gotta Give Something' s Gotta Give The Italian Job 20 03 20 03 20 03 01/10/20 05 2/15/200 5 2/15/200 5 1/30 /200 5 DVD 29. fr. Language 2 şi Language 3.95 3 2 en 4 1 en.96 The Last Samurai 20 03 01/10/20 05 VHS 15. orice intersecŃie a unui rând cu o coloană trebuie să conŃină cel mult o valoare pentru ca relaŃia să fie în prima formă normală. figura 14 ar putea fi modificată astfel încât să conŃină atribute (coloane) separate pentru cel mult trei limbi corespunzătoare fiecărui film. Ca urmare. dar un tabel poate conŃine orice număr de rânduri FIL M_I D N R _ C O PI E 1 GEN_ COD GEN_ DESC RIERE CO D_L IMB A MPA A_C OD_ RAT ING MPAA_RATING _DESC FILM_NU ME A N_ PR O D US 20 03 DATA_ CUMPA RARE DA TA_ VA NZ AR E MEDI A FORM AT PRET _INC HIR 1 Dram a Drama en. deoarece trebuie să adăugaŃi o nouă coloană în tabel ori de câte ori vreŃi să adăugaŃi mai multe valori decât a prevăzut iniŃial proiectantul bazei de date (cum ar fi o a patra limbă pentru un film). astfel încât valorile individuale să poată fi modificate fară a le afecta pe celelalte. De exemplu. atributul pentru limbă (COD_LIMBA) conŃine mai multe valori pentru unele dintre filme. grupurile repetitive prezintă deseori chiar mai multe probleme decât atributele multivaloare. Atributele de acest tip sunt mai greu de întreŃinut. numite Language 1.99 Figura 1-4 RelaŃia FILM .Prima formă normală: eliminarea datelor repetate O relaŃie este în prima formă normală atunci când nu conŃine atribute cu valori multiple (atribute mulŃi valoare). în figura 1-4. Într-o relaŃie. Totuşi. fr R 2 1 AclA d 2 2 ActA v 3 1 Come die Come die ActA v Actiune si aventur a Actiune si aventur a Comedi e Comedi e Actiune si aventur a en. numită grup repetitiv. un grup repetitiv nu este diferit de un atribut multivaloare. un atribut multivaloare este deghizat sub forma atributelor multiple. Uneori.99 DVD 19. fr.

deoarece aceste atribute sunt şterse din relaŃia originală. CopiaŃi identificatorul unic din prima relaŃie în noua relaŃie. de obicei. şi o parte a identificatorului unic (cheia primară) a noii relaŃii. cu un nume sugestiv. este bine să includeŃi numele relaŃiei originale. care. MutaŃi grupul repetitiv sau atributul multivaloare în noua relaŃie. (Am folosit aici verbul a muta. Dacă mutaŃi un atribut multivaloare. 5. Dacă faceŃi acest lucru. ObservaŃi următoarele: . dar identificatorul unic copiat din relaŃia originală nu este doar o cheie externă. în esenŃă. De asemenea. FormaŃi un identificator unic în noua relaŃie. Acest lucru este absolut normal.) 4. Procedura de mutare a unui atribut multivaloare sau a unui grup repetitiv într-o nouă relaŃie constă în următoarele etape: 1. CreaŃi o nouă relaŃie. Identificatorul copiat va deveni cheie externă în noua relaŃie. este adăugat atributul respectiv pentru formarea identificatorului unic. Deseori. toate atributele dintr-un grup repetitiv ar trebui mutate în aceeaşi relaŃie. Datele depind de acest identificator în relaŃia originală. 3. asiguraŃi-vă că identificatorul unic nou format conŃine numai numărul minim de atribute necesar pentru a-1 face unic. nu să fie combinat cu alte atribute multivaloare în noua relaŃie. adăugând atribute la identificatorul unic copiat din relaŃia originală. trebuie să păstraŃi şi atributele care compun cheia primară naturală.Pentru transformarea relaŃiilor ne-normalizate în prima formă normală. Pe de altă parte. 2. trebuie să mutaŃi atributele multivaloare şi grupurile repetitive în noi relaŃii. un atribut multivaloare (un atribut individual care are valori multiple) ar trebui să fie mutat într-o nouă relaŃie proprie. OpŃional. Figura 1-5 prezintă rezultatul aducerii relaŃiei din figura 1-4 la prima formă normală. Ca întotdeauna. în numele noii relaŃii. Deoarece grupurile repetitive reprezintă un set de atribute care se repetă împreună. este perfect acceptabil să avem o relaŃie în care toate atributele fac parte din identificatorul unic (adică nu există atribute care să nu facă parte din cheie). puteŃi să înlocuiŃi cheia primară cu un singur atribut surogat pentru cheie. formată la paşii 2 şi 4. aşa că trebuie să depindă de aceeaşi cheie şi în noua relaŃie. parŃial sau în întregime. Poate părea ciudat la prima vedere. este un grup repetitiv cu un singur atribut. ci.

proiectanŃii experimentaŃi de baze de date sintetizează cele trei forme normale şi rescriu relaŃiile originale direct în a treia formă normală. Exersând.99 2/15/2 005 DVD 29. veŃi putea şi dumneavoastră să faceŃi acelaşi lucru. în general. • Atributul multivaloare COD_LIMBA a fost mutat din relaŃia FILM în relaŃia FILM Language. nu copiilor individuale. (Numele abreviate ale atributelor din .95 01/10/ 2005 1/30/2 005 DVD 29. FILM_ID 1 1 2 2 2 3 4 4 COD_LIMBA en fr en fr es en en fr Figura 1-5 SoluŃia primei forme normale • Atributul FILM_ID a fost copiat din relaŃia originală (FILM) în noua relaŃie (FILM Language).96 01/10/ 2005 VHS 15. VeŃi descoperi că. cu numele Language Code. aş fi creat în noua relaŃie o problemă specifică celei de-a doua forme normale.99 • Am folosit o mică scurtătură în cazul identificatorului unic în noua relaŃie FILM Language. ObservaŃi în figura 1-4 că lista de limbi disponibile nu se schimbă între rândurile duplicate ale aceluiaşi film.96 01/10/ 2005 DVD 19. pe care ar fi trebuit să o rezolv în următoarea etapă a procesului de normalizare.FIL M_I D NR _C OPI E GEN _CO D GEN_D ESCRIE RE MPA A_CO D_RA TING MPAA_RATING_ DESC FILM_NUME 1 1 Dram a Drama R Sub 17 ani necesita prezenta parintilor sau a unui adult Sub 17 ani necesita prezenta parintilor sau a unui adult Sub 17 ani necesita prezenta parintilor sau a unui adult Parintii avertizati sunt Mystic River 2 1 AclA d Actiune si aventura Actiune si aventura Comedie R The Samurai Last 2 2 ActA v R The Samurai Last 3 1 Come die PG-13 Something's Gotta Give 3 2 Come die Comedie PG-13 Parintii avertizati sunt Something's Gotta Give 4 1 ActA v Actiune si aventura PG-13 Parintii avertizati sunt The Italian Job A N _ P R O D U S 2 0 0 3 2 0 0 3 2 0 0 3 2 0 0 3 2 0 0 3 2 0 0 3 DATA _CUM PARA RE DAT A_VA NZAR E MEDIA FORMAT PRET _INC HIR 01/01/ 2005 DVD 19. Ca urmare. partea NR_ COPIE a identificatorului unic din relaŃia FILM nu a fost copiată în noua relaŃie FILM Language. Limba în care este disponibil un film se aplică filmului. Dacă aş fi făcut acest lucru.99 2/15/2 005 DVD 19. deseori.

• Nici FILM. Şi este logic să fie aşa. 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ă . numai atributele DATA_CUMPARARE. este clar că avem câteva probleme. aşa că ambele relaŃii sunt în prima formă normală. să ne mai uităm o dată la relaŃiile din figura 1-5. într-o relaŃie care are un singur atribut ca identificator unic. Se spune că o relaŃie este în a doua formă normală dacă îndeplineşte următoarele criterii: • RelaŃia este în prima formă normală. am amestecat atribute care descriu în aceeaşi relaŃie două lucruri (entităŃi) diferite (deşi înrudite) din lumea reală. poate exista o singură valoare FILM_NUME pentru o valoare FILM_ID dată. Toate atributele care depind numai de FILM_ID sunt acum într-o relaŃie (numită FILM) în care FILM_ID este identificator unic. După ce descoperiŃi o încălcare a celei de-a doua forme normale. trebuie definit conceptul de dependenŃă funcŃională.figura 1-4 au fost folosite doar pentru ilustrare . Unele atribute descriu filmul în sine. puteŃi să vă daŃi seama cu uşurinŃă că atributul FILM_NUME este dependent funcŃional de atributul FILM_ID.este recomandabil să prescurtaŃi numele numai dacă este absolut necesar. În al doilea rând. • Toate atributele non-cheie sunt dependente funcŃional de identificatorul unic (cheia primară). orice relaŃie în prima formă normală care are cheia primară formată dintr-un singur atribut este automat în a doua formă normală. A doua formă normală se aplică numai relaŃiilor care au identificatoare unice concatenate (adică formate din atribute multiple). în timp ce altele descriu copiile pe care le deŃine (sau le-a deŃinut) magazinul din filmul respectiv. nici FILM Language din figura 1-5 nu conŃin grupuri repetitive sau atribute multivaloare. Figura 1-6 prezintă această soluŃie. Identificatorul unic este o combinaŃie a atributelor FILM_ID şi NR_ COPIE. luat ca întreg. soluŃia este să se mute atributele parŃial dependente într-o nouă relaŃie. adică din toate atributele relaŃiei. Atributul B este dependent funcŃional de atributul A dacă în nici un moment nu există mai mult de o valoare a atributului B asociată cu o valoare dată a atributului A. este imposibil ca un alt atribut să depindă de o parte a identificatorului unic. In esenŃă. în care să depindă de întreaga cheie primară. voi folosi două atribute arbitrare. Indiferent câte copii ale unui film avem în baza de date. fiind format dintr-un singur atribut. inteligent denumite „A" şi „B". Chiar faptul că valoarea FILM_ID defineşte în mod unic valoarea FILM_NUME în relaŃie înseamnă că FILM_NUME este dependent funcŃional de FILM_ID. DATA_VANZARE. în orice moment. deoarece acesta. MEDIA FORMAT şi PRET_INCHIR depind de întregul identificator. In primul rând. toate au aceleaşi valori pentru gen. deoarece. nu are părŃi componente. A doua formă normală: eliminarea dependenŃelor parŃiale Înainte de a explora a doua formă normală. Pentru această definiŃie. TITLU şi AN_PRODUS. În relaŃia FILM. Totuşi. categorie MPAA.) • Identificatorul unic din relaŃia FILM Language este format prin combinarea atributelor FILM_ID şi Language Code. Ca urmare. a spune că atributul B este funcŃional dependent de atributul A înseamnă şi că atributul A determină atributul B sau că A este un determinant (identificator unic) pentru atributul B. Aplicând aceste criterii relaŃiei FILM din figura 1 -5.

96 19. Despre un atribut care depinde de un atribut care nu este identificator unic (cheie primară) a relaŃiei se spune că este dependent tranzitiv. deoarece nu are atribute non-cheie şi. .99 19. RelaŃia FILM Language era deja în a doua formă normală. SoluŃia pentru a doua formă normală A treia formă normală: eliminarea dependenŃelor tranzitive Pentru a înŃelege a treia formă normală.99 29. ca urmare.identificatorul unic. a rămas nemodificată.99 1/30/2005 Figura 1-6. trebuie să se definescă conceptul de dependenŃă tranzitivă.95 29.96 15. FILM: FILM _ID GEN_ COD GEN_DESCRIERE MPAA_ COD_R ATING MPAA_DESCRIE RE_RATING FILM_NUME AN_PRO DUS 1 Drama Drama R 2 ActAv Actiune si aventura R 3 4 Comed ie ActAv Comedie Actiune si aventura PG-13 PG-13 Sub 17 ani necesita prezenta parintilor sau a unui adult Sub 17 ani necesita prezenta parintilor sau a unui adult Parintii sunt avertizati Parintii sunt avertizati Mystic River 2003 The Last Samurai 2003 Something's Gotta Give The Italian Job 2003 2003 FILM LANGUAGE: FILM_ID LANGUAGE_CODE 1 En 1 Fr 2 En 2 Fr 2 Es 3 En 4 En 4 Fr FILM COPY: FILM ID 1 2 2 3 3 4 NR_ COPIE 1 1 2 1 2 1 DATA_CUMPARARE 01/01/2005 01/10/2005 01/10/2005 01/10/2005 2/15/2005 2/15/2005 DATA_VAN ZARE MEDIA FORMAT DVD DVD VHS DVD DVD DVD PRET_INCHIR 19.

99 2003 19. de fapt. dependentă tranzitiv te celelalte două atribute. se mută atributele dependente tranzitiv în relaŃii în care depind numai de cheia primară. Nu există dependenŃe tranzitive (cu alte cuvinte. iar MPAA Ratig Description depinde de MPAA_COD_RATING. s-a mutat descrierile în noile relaŃii şi am lăsat atributele pentru coduri (MPAA_COD_RATING şi FILM GEN_COD) în relaŃia FILM. Pericolul păstrării acestor descrieri în relaŃia FILM este faptul că.96 2003 29. într-o bază de date pentru vânzări. cum ar fi controlul codurilor şi furnizarea unei surse convenabile pentru lista de coduri valide. Pentru a aduce la a treia formă normală o relaŃie aflată în a doua formă normală. Suma Totală este dependentă de Cantitatea Cumpărată şi de PreŃul Unitar. S-au creat noi relaŃii pentru MPAA Rating şi FILM Gen. cu rolul de cheie externă. observăm că atributul GEN_DESCRIERE depinde de atributul GEN_COD. FILM: FILM_ ID 1 2 3 4 GEN_ COD Drama ActAv Comedie ActAv MPAA_ COD_RA TING R R PG-13 PG-13 The Last Samurai Something's Gotta Give The Italian Job 15.95 19. Presupunând ci toate cele trei atribute sunt dependente de identificatorul unic al relaŃiei care le conŃine.96 AN_PRODUS 2003 .Va trebui apoi să reconstruim vizualizarea originală printr-o uniune. pentru căutarea codurilor stocate în coloana cheie primară a relaŃiei. definite ca fiind chei externe.În relaŃia FILM din figura 1 -6. este uşor de văzut că Suma Totală (rezultatul calculat) este. Se lasă atributul de care depind acestea în relaŃia originală. ceea ce duce la toate cele trei anomalii de date prezentate mai devreme în acest capitol. care poate fi folosită într-o listă derulantă de pe o pagină web. în final. Figura 1-7 conŃine soluŃia în a treia formă normală. aşa cum se observă cu uşurinŃă.99 2003 FILM_NUME Mystic River PRET_ INCHIR VHS 58. MulŃi proiectanŃi de baze de date numesc relaŃiile MPAA Rating şi FILM Genre „tabele de căutare" sau „tabele de coduri” deoarece sunt utilizate. Se spune că o relaŃie este în a treia formă normală dacă îndeplineşte următoarele două criterii: RelaŃia este în a doua formă normală. toate atributele non-cheie depind numai de identificatorul unic). Ca efect secundar.95 11. De exemplu.97 PRET_ INCHI R DVD 19. în principal. Suma Totală este obŃinută înmulŃind Cantitatea Cumpărată cu PreŃul Unitar. cele două atribute ajung să depindă de înregistrarea unui film.95 14. toate atributele uşor de calculat sunt eliminate ca încălcări ale criteriilor celei de-a treia forme normale. Totuşi aceste relaŃii au şi alte roluri.

cu condiŃia ca proiectantul să ia în calcul consecinŃele potenŃiale (măsurate în termenii anomaliilor de date) ale fiecărui compromis. aşa că de multe ori există posibilitatea unor mici ajustări. SoluŃia normală pentru o asemenea problemă ar fi crearea unei relaŃii numite FILM Price. am decis să mut preŃul în două coloane din tabelul FILM. din punct de vedere tehnic chiar este). . După o discuŃie cu proprietarul magazinului. am stabilit că preŃul depinde de combinaŃia dintre Movie ID şi Media Format. şi mutarea atributului PRET_INCHIR din FILM Copy în noua relaŃie. o încălcare a celei de-a treia forme normale. Proiectarea bazelor de date nu este întotdeauna o ştiinŃă exactă.FILM_ COPII: FILM_ID NR_ COPIE DATA_CUMPAR DATE ARE VINZARE 1 1 01/01/2005 2 1 01/10/2005 2 2 01/10/2005 3 1 01/10/2005 1/30/2005 3 2 2/15/2005 4 1 2/15/2005 _ MEDIA_FORMA T DVD DVD VHS DVD DVD 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 ActAv Comedie Drama FILM_GEN_DESCRIERE Actiune si aventura Comedie Drama Figura 1-7. mi s-a părut a fi cel mai bun compromis. aşa cum se poate vedea în figura 1-6. Deşi se poate spune că aceasta este o încălcare a primei forme normale (şi. SoluŃia pentru a treia formă normală O altă modificare făcută pentru a ajunge la a treia formă normală este legată de atributul PRET_INCHIR (preŃ cu amănuntul) din relaŃia Movie Copy. toate copiile cu aceleaşi valori pentru FILM_ID şi Media Format având acelaşi preŃ. una cu preŃul pentru DVD şi una cu preŃul pentru VHS. łinând seama de această informaŃie. având ca identificator unic combinaŃia dintre FILM_ID şi Media Format. Totuşi. ca urmare. în timpul discuŃiei s-a aflat că urmează să se renunŃe la furnizarea filmelor în format VHS. In mod clar. 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. aceasta este o dependenŃă tranzitivă şi.

ERD (Entity Relationship Diagram) pentru această bază de date. Este nevoie de ceva exerciŃiu în procesul de normalizare înainte ca aceste extensii să devină logice. Dr. X este o cheie (candidat) a lui R. dar nu se conservă dependenŃele (s-a pierdut cod_persoana. a treia formă normală acoperă toate anomaliile pe care este posibil să le întâlniŃi în lucrul cu baze de date obişnuite. In plus. numită forma normală Boyce-Codd. se conservă datele. Prezentarea generală a bazei de date pentru un magazin video Majoritatea exemplelor din acest curs folosesc ca model o bază de date pentru un magayin virtual de produse video. o relaŃie R este în forma normală Boyce-Codd dacă şi numai dacă pentru orice dependenŃă funcŃională totală X → A. Determinantul este un atribut sau o mulŃime de atribute neredundante. adresa) cod_persoana adresa telefon În dependenŃa adresa telefon se observă că determinantul nu este o cheie candidat. a cincea formă normală. consider necesar să le amintim. telefon adresa). o relaŃie R este în forma normală Boyce-Codd dacă şi numai dacă fiecare determinant este o cheie candidat. InstrucŃiunile SQL pentru creare obiectelor bazei de date şi pentru popularea acestora cu date vor fi prezentate în lecŃiile următoare. E. Formal. . forma normală cu cheie de domeniu şi altele. care constituie un identificator unic pentru alt atribut sau altă mulŃime de atribute ale unei relaŃii date. F. Exemplu: ADRESA(cod_parsoana#. În figura 1-8 se prezintă disgrama entitate relaŃie. numite a patra formă normală. ADRESA_2(adresa#. Codd a participat la definirea unei versiuni mai puternice a celei de-a treia forme normale. DiferiŃi alŃi autori şi cercetători au oferit propriile extensii. A patra formă normală(FN4) elimină redudanŃele datorită relaŃiilor de tip m:m. telefon). telefon#. adresa). RelaŃiile sunt în BCNF.Forma normală Boyce-Codd (BCNF) Deşi nu ne propunem să discutăm şi alte forme normale avansate. RelaŃia ADRESA se desface în: ADRESA_1(cod_persoana#. Intuitiv.

F 1 KK N M R O IE U A _C P P .F 1 KK P .MA _R T G P A A IN M A _C D A IN P A O _R T G M A _D S R R _V R T P A E C IE E A S E P K FM IL F M IL _ID F M O _G N IL _C D E M A O _R T G PA _C D A IN FM UE IL _N M R T IL R T H E A _P E _V S R T IL R T V E A _P E _D D A _P O U N RDS P K F1 K F2 K FM E IL _G N F M O _G N IL _C D E F M E C IE E E IL _D S R R _G N P K F M IM A IL _L B F M IL _ID C D IM A O _L B P .F 1 KK P K F M C IR R IL _IN H IE E F M IL _ID P .F 1 KK T A Z C IE R N A T _ID P .F 2 KK D T _IN O R E E AA T A C R C S _IN H IE E O T C IR R C S _IN A Z R _S U IE D R O T T R IE E A _P R E E D T _R T R A E AA E U N R L B IM A C D IM A O _L B N M _L B U E IM A P K C IE T O T L N _C N C IE T O T L N _C N _ID P K C IE T O D D L N _H L _IN D T _IN C IS AA S R D T _T R IN T AA E M A C IE T E O IT U A L N _D P Z _S M C R _C E IT A O A _IN IC A D R D _L _D S R D C P _IN H IE E E M _IN IC O IL C IR R _P R IS D C IE T R N A T L N _T A Z C IE T A Z C IE R N A T _ID C IE T O T L N _C N _ID A G JA _P R O N _ID NA T ES AA T A Z C IE A A R N A T _D T V N A I_T X AZR AA P K F1 K C IE T O _P R O N L N _C D E S A A C IE T O T L N _C N _ID P R O N _ID ES AA P .F 1 KK Figura 1_8. Diagrama entitate relaŃie .F 1 KK P .F 2 KK F M O II IL _C P F M IL _ID N M R O IE U A _C P D T _C M A A E AA U P R R D T _V N A E AA A Z R F R A _M D O M T E IA P .F 2 KK P RO N ES AA P R O N _ID ES AA P R O N _P E U E E S AA RNM P R O N _N M _M O IU E S A A U E IJL C P R O N _N M ES AA U E P R O N _A R S _1 E S A A DEA P R O N _A R S _2 E S A A DEA P R O N _A R S _O A E S A A DEA R S P R O N _A R S _JU E _P O E S A A D EA DT R V P R O N _A R S _C D O T L E S A A D E A O _P S A P R O N _A R S _T R E S A A DEA AA P R O N _T L F N E S A A E EO N S E E AA A T R _D T M A T _D T O R E AA P K A G JA NA T P R O N _ID ES AA S P R IS R E S A A U E V O _P R O N _ID A G JA _T X _ID NA T AA A G JA _JO _C T G R N A T B A E O IE A G JA _R T _P _O A N A T AA E R A G JA E A A N A R _D T IN H E E A A C ID R _D T P .

programare-10 982 Bunea Mihaela 114 rezistenta materialelor-8 1204 Dragnea Liviu 412 educatie fizica-10 S1520 Popa Marius 452 analiza numerica-7. aceasta ar presupune o mare risipă de spaŃiu . .Probleme: 1. Astfel .Evident . va trebui să parcurgem toate cele trei coloane cu cursuri. Să presupunem că am înlocui coloana Cursuri cu două noi coloane: CURS_SUDENT NrMatricol 458 521 627 746 782 982 1204 1520 NumeSt Predescu Radu Cristescu Irimia Tanase Bunea Dragnea Popa PrenumeSt Alexandru George Lucian Diana Daciela Mihaela Liviu Marius Grupa 114 122 243 361 341 114 412 452 Curs1 engleza desen tehnic programare analiza numerica germana rezistenta materialelor educatie fizica analiza numerica Nota1 7 10 8 9 6 8 10 7 engleza 9 Curs2 germana franceza engleza programare Nota2 8 7 10 10 Nici acum nu am rezolvat toate problemele. ce se întâmplă în cazul în care un student s-a înscris la mai mult de două cursuri? Să zicem că un student nu se poate inscrie la mai mult de cinci cursuri şi deci putem introduce zece coloane pentru a stoca informaŃiile curs-nota. Acum putem afla numărul total de studenŃi înscrişi la un anumit curs.engleza-9 Coloana Cursuri conŃine mult prea multa informaŃie. nu trebuie să existe atribute sau grupuri de atribute repetitive.germana-8 521 Radu George 122 desen-tehnic-10. astfel încât aceasta va fi formată acum din două coloane: NrMatricol şi IdCurs. dacă o coloană ar conŃine o listă de valori . pentru a afla câŃi studenti s-au înscris în total la un anumit curs .franceza-7 627 Cristescu Lucian 243 programare-8. . În plus. Presupunem că tabela Curs_Student conŃine următoarele date: CURS_SUDENT NrMatricol NumeSt PrenumeSt Grupa Cursuri-Nota 458 Predescu Alexandru 114 engleza-7. Această primă formă normală este considerată ca fiind o cerinŃa minimală pentru majoritatea sistemelor relaŃionale. de vreme ce ar exista şi unii studenti care au ales doar două cursuri.engleza-10 746 Irimia Diana 361 analiza numerica-9 782 Tanase Daciela 341 gernana-6. utilitatea ei fiind evidentă. regăsirea şi manipularea informaŃiilor stocate ar fi foarte anevoioase. De exemplu. Pentru a aduce tabela Curs_Student la FN1 vom introduce o nouă coloană în cheia primară a tabelei. În plus. Să se normalizeze tabelul CURS_SUDENT şi PROFESOR Amintim că o tabelă este în prima formă normală(FN1) dacă valorile tuturor atributelor care o compun sunt atomice (indivizibile).

Coloana Denumire care depinde numai de IdCurs. Tabela Curs_Student este în FN1. între tabelele Student şi Curs_Student există o relaŃie de tip 1:m. care . ce le va conŃine şi va avea drept cheie primară coloana NrMatricol. Student. în sensul că . Coloanele determinate se elimină din tabela iniŃială. Analog. Putem aduce tabelaCurs_Student în FN2 descompunând-o în două tabele. Denumirea) şi determinantul lor (IdCurs).CURS_SUDENT NrMatricol NumeSt 458 Predescu 521 Radu 521 Radu 627 Cristescu 627 Cristescu 746 Irimia PrenumeSt Alexandru George George Lucian Lucian Diana Grupa 114 122 122 243 243 361 IdCurs 4 3 5 1 2 8 Denumire germana franceza desen tehnic programare engleza analiza numerica A doua formă normală (FN2) Amintim că o tabelă este în a doua formă normală dacă este în FN1 şi fiecare atribut care nu face parte din cheia primară este dependent de întreaga cheie primară. împreună cu IdCurs. nu şi de NrMatricol . deoarece coloanele NumeSt. PrenumeSt şi grupa depind numai de NrMatricol. le eliminăm din tabela Curs_Student şi formăm o nouă tabelă. De asemenea . Cheia primară a noii tabele va fi formată din coloanele ce compun determinantul dependenŃei (IdCurs). STUDENT NrMatricol 458 521 627 746 782 982 1204 1520 NumeSt Predescu Radu Cristescu Irimia Tanase Bunea Dragnea Popa PrenumeSt Alexandru George Lucian Diana Daciela Mihaela Liviu Marius Grupa 114 122 243 361 341 114 412 452 . dar nu îndeplineşte cea de-a doua cerinŃă pentru a fi în FN2. pentru o valoare dată a lui IdCurs. Deci avem o coloană care nu face parte din cheia primară şi nu depinde de toată cheia. cunoaştem denumirea cursului fără a mai trebui să ştim şi NrMatricol. î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. 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. formează cheia primară.

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

Să se determine anomaliile pentru tabelul Avion A# 1 2 3 4 5 6 nume AIRBUS AIRBUS AIRBUS CAR B707 B707 capacitate 250 250 250 100 150 150 localitate PARIS PARIS LONDRA PARIS LONDRA LONDRA Constrângere: toate avioanele cu acelaşi nume au aceeaşi capacitate. 3. ca funcŃie didactică. prepartor profesor dr.o cheie secundară trebuie să fie null în întregime sau să corespundă unei valori a cheii primare asociate. Tabelele Titlu şi Profesor sunt în relaŃia 1:m (un Titlu corespunde la mai multe cadre didactice).(in tabela asociată nu trebuie să existe valori fără corespondent).IdCurs 1 2 3 4 5 6 7 8 Denumire programare engleza franceza germana desen tehnic Rezistenta materialelor Educatie Fizica analiza numerica Titlu IdTitlu 1 2 3 4 5 6 Titlu lector dr. Tabele de mai sus păstrează regulile de integritate? Raspuns Nu.unicitatea cheii primare . asistent lector conferentiar dr.integritatea referenŃială . . deoarece există cadrul didactic cu IDProf= 7 cu IdTitlu =7 . Salariu 1300 950 1100 1700 680 2150 : 2. . care nu există in tabelul Titlu. Amintim ca regulile de integritate sunt.integritatea entităŃii – valorile cheii primare sa fie diferite de valoarea null(o valoare necunoscuta sau lipseşte) .

305 .R21 205 R5 . atunci se pierde informaŃia că un avion CAR are capacitatea 100. Anomalie la ştergere. 4.R12 . 4. iar dacă se modifică doar o înregistrare atunci constrângerea nu va mai fi verificată. Anomalie la modificare.305 BX . 2. RedundanŃă logică. El poate fi inserat în relaŃia AVION doar dacă se defineşte o nouă valoare pentru cheia primară. modificare sau ştergere.R25 . redundanŃă în date. Dacă se modifică capacitatea lui B707 de la 150 la 170. 3.W14 . atunci costul modificării este mare pentru a modifica toate înregistrările. probleme de reconexiune. 250) apare de trei ori. Exemplu: variante pentru a implementa FN1 pentru tabelul MASINA: Persoana Eu Tu El noi Varianta 1 Persoana Eu Eu Eu Tu El El Noi Noi Noi Noi Varianta 2 Persoana Eu Tu El Prima R25 205 R5 305 Doi W14 Trei R21 Patru Vehicul R25 W14 R21 205 R5 305 BX 305 R12 R25 Vehicul R25 . Anomalie la inserŃie. Cuplul (AIRBUS. S-a cumpărat un B727 cu 150 locuri.Datorită dependenŃei introduse pot exista: anomalii la inserare. 1. Dacă este ştearsă înregistrarea pentru care A# este 4.

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. Masina_34).. Masina_33. fiecare atribut care nu este cheie (nu participă la cheia primară) este dependent de întreaga cheie primară. Persoana Eu Tu El Noi Masina_34 Persoana Noi Vehicul R25 Vehicul R25 205 R5 BX 5.Noi BX 305 R12 R25 Varianta 3 (4 tabele) Masina 31 (similar se definesc Masina_32. ATASAT_LA COD_SALARIAT# S1 S1 S1 S3 S5 JOB_COD PROGRAMATOR PROGRAMATOR PROGRAMATOR VANZATOR INGINER NR_PROIECT# P1 P2 P3 P3 P3 FUNCTIA SUPERVIZOR CERCETATOR AUXILIAR SUPERVIZOR SUPERVIZOR SUMA 60 25 10 60 60 ATASAT_2A COD_SALARIAT# S1 S1 S1 S3 S5 NR_PROIECT# P1 P2 P3 P3 P3 FUNCTIA SUPERVIZOR CERCETATOR AUXILIAR SUPERVIZOR SUPERVIZOR SUMA 60 25 10 60 60 ATASAT_2B .

specialitate. De ce? Forma normală 3 (FN3) Intuitiv. SANTIER(nr_santier#. functie. nr_santier#. conducator}. α∪γ reprezintă reuniunea determinantului cu restul atributelor lui A. data_sfarsit). Tabelul atasat_2a nu este in FN3. data_inceput. conducator. cod_lucrare#. Să se aduca la FN3 tabelel EXECUTA_1 rezultat de la 8 . fiecare atribut care nu este cheie (nu participă la o cheie) depinde direct de cheia primară. α∪β mulŃimea atributelor care intervin în dependenŃele funcŃionale. {cod_obiectiv#.COD_SALARIAT# S1 S3 S5 JOB_COD PROGRAMATOR VANZATOR INGINER A doua condiŃie exprimă necesitatea total dependenŃei de cheia primară. nr_santier#} → {descriere. atasat_3a Cod_salariat# Nr_proiect# S1 P1 S1 P2 S1 P3 S3 P3 S5 P3 atasat_3b Functia Suma Supervizor 60 Cercetator 25 Auxiliar 10 Functia Supervizor Cercetator Auxiliar Supervizor Supervizor 8. 7. cod_lucrare#. cod_lucrare#. nume). data_sfarsit}. Presupunem că un şantier poate executa mai multe lucrări de bază şi că o lucrare poate fi executată de mai multe şantiere. Pentru relaŃia EXECUTA sunt evidente dependenŃele: {cod_obiectiv#. o relaŃie R este în a treia formă normală dacă şi numai dacă: relaŃia R este în FN2. Această formă normală interzice manifestarea unor dependenŃe funcŃionale parŃiale în cadrul relaŃiei R! Pentru a obŃine o relaŃie FN2 se poate aplica regula Casey-Delobel. sef). descriere. cod_lucrare#} → {data_inceput. 9. functie. LUCRARE(cod_obiectiv#. EXECUTA(cod_obiectiv#.

conducator). cod_lucrare#. RelaŃia se desface.) RelaŃia INVESTESTE_IN OBIECTIV_INVESTITIE. conducator) continuă să existe redundanŃă în date. cod_lucrare#. cod_obiectiv#. Atributul conducator depinde indirect de cheia primară prin intermediul atributului functie. cota_parte). INVESTESTE_IN_2(cod_contractant#. {nr_contract} → {cod_obiectiv}.Delobel. descriere. cod_lucrare#. Între atributele relaŃiei există dependenŃele: {cod_obiectiv#. nr_contract#). 10 Să se aducă la forma BCNF (Forma normală Boyce-Codd ) (Formal. nr_santier#} → {descriere}. cota_parte}. X este o cheie (candidat) a lui R. Se aplică regula Casey-Delobel şi se aduce relaŃia în BCNF. leagă entităŃile INVESTITOR şi Ea are schema relaŃională: INVESTESTE_IN(cod_contractant#.În tabelul EXECUTA_1(cod_obiectiv#. INVESTESTE_IN_1(cod_obiectiv. descriere. functie. . o relaŃie R este în forma normală Boyce-Codd dacă şi numai dacă pentru orice dependenŃă funcŃională totală X → A. functie) EXECUTA12(functie. cota_parte). Pentru a aduce relaŃia EXECUTA_1 în FN3 se aplică regula Casey. {cod_obiectiv#. în proiecŃiile: EXECUTA11(cod_obiectiv#. Între atributele relaŃiei există dependenŃele: {cod_contractant#. cod_obiectiv#} → {nr_contract. nr_contract. nr_santier#. nr_santier#} → {functie} → {conducator}. nr_santier#. cod_lucrare#. nr_contract. prin eliminarea dependenŃelor funcŃionale tranzitive.

SQL este considerat un limbaj neprocedural sau declarativ. dacă vreŃi să obŃineŃi media numerelor de pe o coloană. De exemplu. dar reŃineŃi că acestea sunt extensii SQL care formează noi limbaje .DML LECłIA 1. limbajele procedurale includ instrucŃiuni care pot modifica secvenŃa de execuŃie. actualizarea şi regăsirea informaŃiilor stocate în baze de date prin intermediul sistemelor de gestionare a bazelor de date ( SGBD-uri).DQL LECłIA 4. SQL este deseori folosit în combinaŃie cu limbajele procedurale sau orientate spre obiecte menŃionate anterior pentru a manipula stocarea şi extragerea datelor. MulŃi producători de sisteme SGBDoferă extensii procedurale ale limbajului SQL de bază. cum ar fi Oracle PL/SQL (Procedural Language/SQL) sau Microsoft TransactSQL. nu un limbaj potrivit pentru programarea generală a aplicaŃiilor. fară să-i spuneŃi cum să le obŃină. prin ramificarea la alte porŃiuni ale procedurii sau prin parcurgerea ciclică a unui set de instrucŃiuni din procedură. după cum urmează: LECłIA 1. Numele limbajului poate fi pronunŃat pe litere (es-q-el) sau la fel ca şi cuvântul englezesc „sequel". Nu este nevoie să număraŃi valorile din coloană şi să împărŃiŃi suma acestora la numărul obŃinut . SQL este un limbaj neprocedural pentru gestionarea şi întreŃinerea bazelor de date relaŃionale. Limbajul de definire a datelor . SQL a devenit limbajul universal pentru bazele de date relaŃionale şi este acceptat de aproape toate sistemele SGBD moderne.Uniuni (Join) LECłIA 5. Combinarea datelor din mai multe tabele . Basic. crescând nivelul de portabilitate a codului SQL între diferitele produse RDBMS. LIMBAJUL SQL În această tema se prezintă conceptele limbajului SQL în 6 lecŃii. SQL este limbajul folosit cel mai frecvent pentru interogarea bazelor de date.Partea a II-a. Limbajul de interogare a datelor . precum Java şi C++. folosind instrucŃiuni din limbajul de programare cu destinaŃie generală pentru alte . Ce este SQL? SQL (Structured Query Language -limbaj structurat de interogare) este un limbaj standard folosit pentru crearea.codul SQL pe care-1 conŃin rămâne neprocedural. Simplu spus. De asemenea. folosiŃi funcŃia AVG. VeŃi avea mai multe succes în învăŃarea limbajului SQL dacă folosiŃi în mod activ SQL şi o bază de date relaŃională pentru a încerca exemplele prezentate sau dacă veti încerca variante proprii ale exemplelor. Pascal.procesorul limbajului SQL din SGBDse ocupă de toate aceste lucruri în locul dumneavoastră. O interogare (query) este o simplă cerere transmisă către baza de date. la care aceasta răspunde într-o anumită formă. cum ar fi sistemele de prelucrare a comenzilor sau a plăŃilor. ca C. Concepte SQL LECłIA 2.DDL LECłIA 3. Fără îndoială. SQL nu trebuie confundat cu limbajele orientate spre obiecte. De asemenea. Este important să înŃelegi că SQL nu este un limbaj procedural. Concepte SQL În acestă lecŃie se vor prezenta conceptele de bază ale limbajul SQL. ceea ce înseamnă că-i spuneŃi calculatorului ce rezultate vreŃi. acceptarea pe scară largă este rezultatul timpului şi eforturilor depuse pentru dezvoltarea caracteristicilor limbajului şi a standardelor. COBOL sau Ada. FORTRAN. Limbajul de manipulare a datelor . Un limbaj procedural foloseşte o serie de instrucŃiuni executate secvenŃial.

instalată acasă sau la birou. chiar dacă acest nivel de suport diferă de la produs la produs. asigură suport pentru SQL. grafici şi bazaŃi pe web. De fapt.sarcini de programare. Clientul trebuie să aibă o conexiune de reŃea la baza de date. cu comenzile introduse de la tastatură şi răspunsurile afişate ca mesaje de tip text. ori o reŃea publică. ReŃineŃi că nimic nu vă opreşte să instalaŃi clientul SQL pe acelaşi calculator cu sistemul DBMS. Oracle şi MySQL . să le transmită sistemului SGBD în vederea prelucrării şi sa vadă rezultatele returnate de DBMS. un sistem mainframe poate fi considerat un server de dimensiuni mari. clienŃii SQL sunt clasificaŃi în trei categorii: în linia de comandă. . În funcŃie de interfaŃa cu utilizatorul de pe staŃia de lucru client. Majoritatea SGBD-urilor populare. precum prezentarea datelor pe o pagină web sau furnizarea răspunsurilor la informaŃiile introduse de utilizatori de la tastatură sau mouse. a modifica sau a şterge înregistrări din bazele de date. Totuşi. este mult mai convenabil şi mai eficient să aveŃi o singură copie a sistemului SGBD pe un server partajat şi să aveŃi numai clientul SQL instalat pe staŃia de lucru a fiecărui client. acest aranjament nu este potrivit pentru bazele de date care trebuie să fie folosite în comun de mai mulŃi utilizatori. deoarece este foarte convenabil să aibă întregul mediu de dezvoltare pe un singur calculator. o transmit către SGBDîn vederea prelucrării. • Utilizatorii care au acces la baza de date folosesc staŃii de lucru. Microsoft SQL Server şi Oracle fac în mod obişnuit acest lucru. care poate fi o reŃea privată. precum Microsoft Access sau Oracle Personal Edition. în momentul în care este necesar accesul partajat al mai multor utilizatori. Folosind SQL puteŃi transforma întrebări obişnuite :”Din ce oras sunt studentii notri?” în instrucŃiuni pe care le înŃelege soft-ul pentru baze de date: “SELECT oras FROM studenti” . numite clienŃi. • Componentele software furnizate de producătorul SGBD rulează pe staŃiile de lucru alte clienŃilor pentru a oferi utilizatorilor posibihtatea să introducă instrucŃiuni SQL. SQL se poate folosi nu numai pentru interogare. cu o copie personală a unui sistem SGBD. Pentru scopurile acestei definiŃii. • Fişierele care compun baza de date din punct de vedere fizic sunt stocate pe discuri conectate la serverul de baze de date. Atunci când este necesară interacŃionarea cu baza de date. dar şi pentru a adăuga. dar pe măsură ce ce intrebrile devin mai complexe. sunt mult mai frecvent întâlnite situaŃiile în care baza de date este instalată într-un aranjament client/server. cum ar fi un laptop. aceste instrumente devin limitate şi greoaie şi acesta este momentul când intră în acŃiune limbajul SQL. precum Internet. instrucŃiunile din limbajul procedural formează instrucŃiunea SQL. Conectarea la baza de date Atunci când folosiŃi limbajul SQL pe un calculator personal. primesc rezultatele returnate de SGBDşi le prelucrează într-un mod corespunzător. Într-un aranjament client/server: • Sistemul rulează pe un server. toate componentele bazei de date rulează pe acelaşi sistem de calcul. ca de exemplu Microsoft Accsess. mulŃi dezvoltatori care utilizează sisteme SGBD precum MySQL. O interfaŃă în linia de comandă se bazează exclusiv pe intrări şi ieşiri de tip text. Totuşi. Ca urmare. în general. care este un sistem de calcul partajat. acest software se numeşte cbent SQL. Aceste informaŃii se pot extrage din bazele de date prin utilizarea unui instrument grafic de interogare.

Client SQL bazat pe web Oracle Oracle iSQL*Plus acceptat în versiunile Oracle 9i si mai noi. Client SQL care rulează ca aplicaŃie în linia de comandă MySQL MySQL MySQL sub diferite sisteme de operare. O interfaŃă bazată pe web rulează pe serverul de baze de date. Client SQL care rulează ca aplicaŃie în Microsoft SQL Server iSQL linia de comandă într-un nucleu de comenzi Microsoft Windows. aşa că vă rog să consultaŃi documentaŃia producătorului SGBD pentru informaŃii despre instalarea şi utilizarea clienŃilor SQL disponibile pentru sistemul SGBD pe care-1 folosiŃi. Linux. toate fiind rulate local pe staŃia de lucru a utilizatorului.graphical user interface) rulează sub un tip oarecare de sistem bazat pe ferestre. Client SQL care rulează ca Oracle Oracle SQL*Plus aplicaŃie Microsoft Windows sau ca aplicaŃie în linia de comandă . Tabelul următor prezintă clienŃi SQL oferiŃi de diferiŃi producători SGBD . cu clientul SQL integrat în Microsoft Access Nu există DBMS. precum pictograme. Din punct de vedere tehnic. Mac OS sau Microsoft Windows. deoarece nu există nici o componentă software specifică producătorului SGBD rulată pe staŃia de lucru a clientului. şi afişează datele sau opŃiunile comenzilor folosind elemente grafice. folosind un browser web de pe staŃia de lucru client pentru a interacŃiona cu utilizatorul bazei de date. aproape întotdeauna există componente furnizate de producătorul SGBDcare sunt descărcate în fundal de browser-ul web pentru a asista în procesul de reprezentare grafică a formularelor web folosite pentru introducerea instrucŃiunilor SQL şi afişarea rezultatelor. Nu avem suficient spaŃiu în această carte pentru a prezenta toate detaliile referitoare la fiecare client SQL pe care aŃi putea să-1 folosiŃi. inclusiv Microsoft Windows. Microsoft SQL Server Query Analyzer Client SQL care rulează ca aplicaŃie Microsoft Windows. Mac OS X şi diferite implementări Unix. cum ar fi X Window System. un client SQL bazat pe web nici nu este o aplicaŃie client. Totuşi. O interfaŃă grafică cu utilizatorul (GUI .Principalul avantaj al interfeŃelor în linia de comandă este că pot fi rulate pe aproape orice sistem de operare. butoane şi casete de dialog. Producător DBMS Client SQL Descriere Microsoft Access este o bază de date de uz personal.

bazată pe lucrările Dr. IBM a lansat în 1982 produsul SQL/DS. atunci când s-a descoperit că „SEQUEL" era marcă înregistrată a companiei Hawker-Siddeley Aircraft din Marea Britanie. care avea aproximativ 600 de pagini. la nivel mondial. Linux. cuvântul „structured" din SQL nu avea nici o legătură cu programarea structurată. şi INGRES. inclusiv Microsoft Windows. Doi ani mai târziu. deoarece SQL nu este un limbaj de programare procedural. specificaŃiile originale au fost extinse. două alte produse. A treia generaŃie a fost numită SQL-99 sau SQL3. pentru manipularea şi extragerea datelor. Din fericire. au fost lansate pe piaŃă ca primele produse pentru baze de date relaŃionale. numite SQL-89. Acronimul „SEQUEL" a fost ulterior condensat în abrevierea „SQL". diferite implementări Unix şi altele. Client SQL scris în Java Oracle Oracle SQL Worksheet disponibil în Oracle 8i şi 9i. comitetele create de cele două organizaŃii au colaborat pentru dezvoltarea unui standard SQL comun. sub forma standardului SQL-92. furnizat de Relational Technology. Deşi IBM a creat prima implementare SQL. Dacă programarea structurată era expresia la modă în anii '80.sub diferite sisteme de operare. Comitetele de standardizare a limbajului SQL au fost formate de ANSI (American National Standards Institute) în 1986 şi ISO (International Organization for Standardization) în 1987. Mac OS X. Cele mai multe produse SGBDsunt construite pe baza standardului SQL-92 . un grup de cercetători de la IBM au dezvoltat o bază de date relaŃională. E. numită System/R. dar înlocuit de iSQL*Plus în Oracle 10g. cu nume diferite pentru limbajele de interogare. Un scurt istoric al limbajului SQL Către sfârşitul anilor '70. au fost publicate primele specificaŃii ale standardului. furnizat de Relational Software. cu limbajul de interogare numit acum SQL (Structured Query Language). Codd. Clientul SQL care rulează ca aplicaŃie în linia de comandă într-un nucleu de comenzi Microsoft Windows. numit SEQUEL (Structured English Query Language). în System/R a fost inclus un limbaj.primele versiuni Microsoft SQL Server erau bazate pe sistemul SGBDSybase. Asemănările Sybase Sybase iSQL cu Microsoft SQL Server nu sunt întâmplătoare . Oracle. După trei ani. F.

ConvenŃiile de bază sunt următoarele: • Fiecare instrucŃiune începe cu o comandă. Ca rezultat. Datele calendaristici sunt foarte importante pentru prelucrarea datelor comerciale. de obicei sub forma unui singur cuvânt. • Fiecare instrucŃiune se termină cu un delimitator. Microsoft SQL Server 7. necesare pentru folosirea limbajului SQL cu o bază de date relaŃională orientată spre obiecte. de obicei. Totuşi. ConvenŃii de sintaxă SQL Această secŃiune prezintă convenŃiile generale de sintaxă folosite pentru construia instrucŃiunilor SQL. din cauza grabei fiecare a făcut-o în felul propriu. Standardul SQL:2003 poate fi cumpărat de la ISO (www. furnizorii au răspuns cererilor lansate de clienŃii importanŃi şi au adăugat în grabă suportul pentru date calendaristice. care este descrisă în detaliu în lecŃia 3. dar dezvoltatorii produselor SGBD originale erau academicieni şi oameni de ştiinŃă. instrucŃiunea începe cu comanda SELECT. un caracter punct şi virgulă (.org).wiscorp. Din nefericire.com/SQLStandards. reŃineŃi că există o mulŃime de extensii şi variaŃii între diferiŃii producători.). Oracle 9i. Un astfel de exemplu este acceptarea tipurilor de date TIMESTAMP şi DATE. Pentru cei care au un buget mai restrâns. Microsoft SQL Server 2000 şi Microsoft SQL Server 2005 conŃin implementări diferite ale limbajului SQL). introduce caracteristici legate de XML şi alte îmbunătăŃiri.html). în parte deoarece doreau să diferenŃieze produsele proprii şi în parte deoarece cerinŃele pieŃei îi forŃau să implementeze caracteristici înainte a apărea standarde pentru acestea. Codul SQL este foarte compatibil şi portabil între produsele diferiŃilor furnizori. dar sistemele complete de baze de date pot fi rareori transferate fară anumite ajustări. Cea mai recentă generaŃie. ConvenŃiile de sintaxă SQL sunt mai uşor de înŃeles folosind un exemplu simplu InstrucŃiunea de mai jos returnează valorile Movie ID şi Movie Title pentru toate filmele din magazinul de produse video pentru care categoria MPAA este „PG": SELECT FILM_ID.org) sau ANSI (webstore. Ori de câte ori migraŃi instrucŃiuni SQL de la produsul unui furnizor la altul. precum şi extensii de limbaj care fac din SQL un limbaj de programare complet (adăugând cicluri. SQL3 include multe caracteristici obiectuale. nu specialişti în prelucrări comerciale. Mai mult.(numit acum SQL2). este disponibilă o versiune apropiată de cea finală la Whitemarsh Information Systems Corporation (www. primele dialecte SQL nu asigurau un suport special pentru datele calendaristice. Aceste standarde nu sunt gratuite. unele implementări. termenul implementare este folosit pentru referirea fiecărei versiuni SQL a fiecărui producător (cu alte cuvinte. nu execută o instrucŃiune SQL căreia-i lipseşte delimitatorul de sfârşit. Pe măsură ce au apărut produsele comerciale. Pentru simplitate. în acest exemplu. . Aproape toŃi furnizorii au adăugat extensii la „dialectul" SQL propriu. aşa că această cerinŃă nu a fost anticipată. care aproape întotdeauna este un verb (în limba engleză) care descrie o acŃiune. în timp ce alte implementări consideră acest delimitator opŃional. Unele implementări permit schimbarea delimitatorului cu un alt caracter. Oracle 10g. numită SQL:2003. ŃineŃi seama de diferenŃele dintre dialecte. de tip case). cum ar fi cea din Oracle. care este. TITLU_FILM FROM FILM WHERE MPAA_RATING_COD = 'PG'. ramificări şi construcŃii de comutare.iso.ansi.

• In fiecare implementare SQL este definit un set de cuvinte rezervate. TITLU_FILM). inclusiv zero. dar acest stil nu este recomandabil dacă doriŃi ca instrucŃiunile SQL să fie portabile pe alte implementări. caz în care numele de obiecte scrise diferit sunt tratate ca nume diferite. Caracterul underscore (liniuŃa de subliniere) este folosit. Aşa cum am menŃionat anterior. FROM. Dacă în şirul de caractere trebuie să apară un caracter apostrof. un nume precum „PERSONMIDDLENAME" nu este foarte uşor de citit. un stil numit deseori „scriere de tip cămilă". ci că numele obiectelor din baza de date (tabele. cum ar fi PersonMiddleName. poate fi un cuvânt cheie (SELECT. Totuşi. TITLU_FILM FROM FILM WHERE MPAA_RATING_COD ='PG'. care permit modul de lucru cu diferenŃierea literelor mari de cele mici. fiecare începând cu un cuvânt cheie (SELECT. dar nu este la fel de uşor de citit şi de înŃeles: SELECT FILM_ID. unele implementări permit folosirea numelor care fac diferenŃa între literele mari şi cele mici. FILM_ID. Constantele numerice nu sunt niciodată încadrate cu apostrofuri. numele unui obiect al bazei de date (FILM. în majoritatea implementărilor şi în conformitate cu standardele ANSI/ISO. în general nu este o idee bună să împărŃiŃi un element de limbaj pe mai multe linii. există trei clauze. numele a două coloane sunt specificate într-o listă separată prin virgule (FILM_ID. • InstrucŃiunile sunt scrise într-o formă liberă. în exemplul nostru. • InstrucŃiunile sunt organizate într-o serie de clauze şi. de obicei. SpaŃiile care urmează după virgule sunt opŃionale . coloane etc. sunt inserate două apostrofuri unul lângă celălalt. veŃi scrie clauza WHERE astfel: WHERE TITLU_FILM = 'Sophie''s Choice' • Numele obiectelor bazei de date sunt formate folosind numai litere. TITLU_FILM). clauzele trebuie să apară într-o anumită ordine atunci când sunt folosite (multe clauze sunt opŃionale). Totuşi. în definitiv. cu litere mici sau în combinaŃii. care sunt cuvinte cu o semnificaŃie specifică pentru procesorul SQL al sistemului SGBD şi. de obicei. instrucŃiunea de mai jos este identică cu cea prezentată la începutul acestei secŃiuni. dacă vreŃi să găsiŃi în baza de date un film numit Sophie's Choice. WHERE).• InstrucŃiunile sunt construite într-o manieră similară cu propoziŃiile din limba engleză. • Şirurile de caractere care apar în instrucŃiunile SQL trebuie să fie încadrate cu apostrofuri (unele implementări SQL permit şi folosirea ghilimelelor). • Elementele de limbaj SQL pot fi scrise cu litere mari. De exemplu. în exemplul nostru. un operator (=) sau o constantă ('PG') care apare într-o instrucŃiune. WHERE). pentru îmbunătăŃirea lizibilităŃii. ExcepŃii notabile sunt Microsoft SQL Server şi Sybase. cu unul sau mai multe spaŃii pentru separarea elementelor de limbaj. Aceasta nu înseamnă că datele nu pot conŃine litere mici. cifre şi liniuŃe de subliniere. Un element de limbaj. ca separator între cuvinte. FROM. Din punct de vedere logic. ceea ce înseamnă că nu există reguli stricte privind poziŃia elementelor de limbaj pe o linie sau locul în care se poate face trecerea la o linie nouă. • Virgulele sunt folosite pentru separarea articolelor dintr-o listă. în MySQL. toate minusculele sunt transformate în majuscule în vederea prelucrării. asemănător cu un cuvânt dintr-o propoziŃie. diferenŃierea literelor mari de cele mici în numele obiectelor este legată de capacitatea sistemului de operare de a face această diferenŃiere.puteŃi adăuga orice număr de spaŃii. .) şi comenzile trebuie să fie scrise cu litere mari.

dar nici una dintre aceste instrucŃiuni nu oferă posibilitatea de a crea sau modifica rânduri de date din tabelele respective. Aşa cum probabil bănuiŃi. altfel multe linii SQL pe care le-aŃi scris vor fi tratate de către SGBDca şi cum ar fi comentarii. ceea ce înseamnă că întreaga linie este considerată comentariu. ALTER şi DROP sunt considerate parte a DDL. DQL este format din instrucŃiuni care . De exemplu: -. după funcŃiile pe care le îndeplinesc. Este important să înŃelegeŃi că instrucŃiunile DDL afectează containerele care stochează datele în baza de date.de exemplu ca nume pentru obiectele bazei de date. • Un comentariu pe mai multe linii începe cu combinaŃia dintre o diagonală la dreapta (slash) şi un asterisc (/*) şi continuă până la întâlnirea combinaŃiei invers (*/). AveŃi grijă să terminaŃi corect comentariile. există instrucŃiuni DDL pentru crearea. Scopul acestei restricŃii este de a evita interpretarea greşită a instrucŃiunilor SQL de către SGBD.Data Control Language) Limbajul de definire a datelor (DDL) Limbajul de definire a datelor (DDL . Deşi reprezintă o parte foarte importantă a limbajului SQL. • Un comentariu pe o singură linie începe cu două liniuŃe de despărŃire (--). nu datele propriu-zise. vizualizări şi indexuri.Acesta este un comentariu pe o singură linie în SQL.Data Query Language) include instrucŃiuni SQL care permit obŃinerea datelor din baza de date. ştergerea şi modificarea tabelelor. Totuşi. nu trebuie folosite într-un alt context .Data Query Language) • Limbajul de manipulare a datelor (DML . Ca urmare. aşa că este bine să consultaŃi documentaŃia implementării pe care o folosiŃi pentru a vă familiariza cu aceste cuvinte.Data Manipulation Language) • Limbajul pentru controlul datelor (DCL . este considerat comentariu. descrise în secŃiunile următoare. Cele două liniuŃe se pot afla la începutul unei linii. sunt: • Limbajul de definire a datelor (DDL . aşa că eu le consider categorii de instrucŃiuni din acelaşi limbaj. Continuă până la întâlnirea combinaŃiei de caractere care marchează sfârşitul comentariului. Unii experŃi consideră aceste categorii ca fiind limbaje separate sau sublimbaje.Data Definition Language) • Limbajul de interogare a datelor (DQL . în SQL acestea au aceeaşi sintaxă de bază şi respectă aceleaşi reguli. sau oriunde în cadrul liniei.care urmare. InstrucŃiunile SQL care folosesc comenzile CREATE. Limbajul de interogare a datelor (DQL) Limbajul de interogare a datelor (DQL . cum ar fi tabele. InstrucŃiunile DDL sunt prezentate în capitolul 3.Data Definition Language) include instrucŃiuni SQL care permit utilizatorului bazei de date să creeze şi să modifice structura obiectelor bazei de date. caz în care restul liniei. Categoriile de instrucŃiuni. lista cuvintelor rezervate diferă semnificativ de la o implementare SQL la alta. Iată un exemplu de comentariu pe mai multe linii: /* Acesta este un comentariu pe mai multe linii. până la sfârşit. */ Categorii de instrucŃiuni SQL InstrucŃiunile SQL sunt împărŃite în categorii.

Întrebări AlegeŃi răspunsurile corecte pentru fiecare din următoarele întrebări cu răspunsuri multiple. Limbajul de manipulare a datelor (DML) Limbajul de manipulare a datelor (DML . Componentele software ale clientului SQL ruleaza pe server 3. dar afecteaza puternic comportamentul instructiuunilor SQL incluse în tranzacŃii. Componentele software DBMS ruleaza pe client c. Componentele software ale clientului SQL ruleaza pe client d. InstrucŃiunile SQL care folosesc comenzile INSERT. Limbajul pentru controlul datelor (DCL) Limbajul pentru controlul datelor (DCL – Data Control Language) include instrucŃiuni SQL care permit administratorilor să controleze accesul la datele din baza de date şi folosirea diferitelor privilegii ale sistemului DBMS. Un limbaj standard 2. Ruleaza pe o mare varietate de platforme client. întelegând prin aceasta că intreaga tranzactie trebuie sa reuseasca sau sa esueze. . Componentele software DBMS ruleaza pe server b. SQL este a. Un limbaj orientat spre obiecte b. InstrucŃiunile SQL care folosesc comenzile GRANT si ALTER sunt considerate parte a DCL.Data Manipulation Language) include instrucŃiuni SQL care permit utilizatorului bazei de date să adauge date în baza de date (sub forma rândurilor din tabele). Necesita un sistem bazat pe ferestre b. Comenzile pentru cotrolul tranzacŃiilor (Transaction Control Commands ) nu respectă cu exactitate sintaxa instrucŃiunilor SQL . Unii furnizori şi autori clasifică instrucŃiunile DQL şi DML în aceeaşi categorie. UPDATE şi DELETE sunt considerate parte a DML. 1. Un client SQL in linia de comanda a. Un limbaj declarativ e. Un limbaj procedural c. cum ar fi privilegiul de oprire şi pornire a bazei de date. Comenzile pentru controlul tranzacŃiilor O tranzacŃie în baza de date este un set de comenzi pe care utilizatorul bazei de date vrea sa le trateze ca pe o unitate funcŃionala de tip „totul sau nimic”. să şteargă date şi să modifice datele existente în baza de date. Întrebările pot avea mai multe răspunsuri corecte.folosesc o singură comandă: SELECT. Într-un aranjament client/server a. Un limbaj nonprocedural d.

Afişează datele şi opŃiunile de comandă folosind caracteristici grafice e. ClienŃii SQL oferiŃi de Microsoft sunt a. Un client SQL cu interfata grafica (GUI) a. Query Analyzer c.c. Nume ale obiectelor din baza de date c. Un client SQL bazat pe web a. Afişează datele şi opŃiunile de comandă folosind caracteristici grafice e. încep cu un cuvânt cheie reprezentând o comandă b. d. InstrucŃiunile SQL a. Elementele limbajului SQL includ a. Operatori . Scad portabilitatea codului SQL c. Query Analyzer c. Se termină cu un cuvânt cheie reprezentând o comandă c. Necesita un sistem bazat pe ferestre b. cum ar fi caracterul punct şi virgulă e. Au fost bazate pe cererile pieŃei e. d. Ruleaza pe o mare varietate de platforme client. Cresc portabilitatea codului SQL b. SQLWorksheet 8. Necesita un sistem bazat pe ferestre b. cum ar fi caracterul punct şi virgulă d. Afişează răspunsurile la comenzi sub formă de mesaje de tip text 6. Se termină un delimitator. Necesita un browser web pe client. Sunt compatibile între implementările diferiŃilor producători 9. încep cu o paranteză deschisă 10. Contribuie la diferenŃierea produselor oferire de diferiŃi producători d. Extensiile SQL create de furnizori a. SQL*Plus e. Necesita un browser web pe client. Afişează răspunsurile la comenzi sub formă de mesaje de tip text 5. c. Cuvinte cheie b. SQLWorksheet 7. Afişează răspunsurile la comenzi sub formă de mesaje de tip text 4. încep cu un delimitator. iSQL b. d. c. ClienŃii SQL oferiŃi de Oracle sunt a. SQL*Plus e. iSQL*Plus d. Necesita un browser web pe client. iSQL b. Ruleaza pe o mare varietate de platforme client. Afişează datele şi opŃiunile de comandă folosind caracteristici grafice e. iSQL*Plus d.

SELECT b. CREATE d. DELETE 15. Constante 11. SELECT b. Limbajul dc selectare a datelor (DSL . Elementele limbajului SQL sunt separate prin a. InstrucŃiunile SQL pot li împărŃite în următoarele categorii a.Data Control Language) e.Dala Replication Language) d. DELETE Limbajul de manipulare a datelor (DML . Paranteze b. Exact un spaŃiu c. LiniuŃe de subliniere 12. Virgule 13. Limbajul de interogare a datelor (DQL .Data Manipulation Language) include următoarele instrucŃiuni: a. DELETE 16.Data Manipulation Language) 14. Limbajul pentru controlul datelor (DCL . Linie nouă e. Virgule b. Litere e. RestricŃii e. Limbajul dc replicare a datelor (DRL . LiniuŃe de subliniere c. Limbajul dc manipulare a datelor (DML . Limbajul de definire a datelor (DDL .d. Numere d. .Dala Selection Language) c. INSERT c. . Limbajul dc definire a datelor (DDI. ALTER e. Unul sau mai multe spaŃii d.Data Definition Language) include următoarele instrucŃiuni: a. UPDATE e. CREATE d. UPDATE e. INSERT c.Data Definition Language) b. INSERT c. CREATE d. SELECT b. Numele obiectelor bazei de date pot include a.Data Query Language) include următoarele instrucŃiuni: a.

Asigurarea unor comportamente utile pentru utilizatorul datelor. cum ar fi TABLE | VIEW | INDEX. fac parte din sintaxa SQL obligatorie şi. Limbajul de definire a datelor . Un element care se poate repeta este urmat de trei puncte. InstrucŃiunile CREATE. 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 <specificaŃii_pentru_coloană>. DML deoarece trebuiesc create obiectele bazei de date înainte de a insera date în baza de date. cum ar fi. se obŃine ca rezultat un număr. Tipuri de date O coloană este cea mai mică unitate denumită care poate fi referită într-o bază de date relaŃională. ca urmare. Elementele opŃionale sunt încadrate în paranteze pătrate.]. ConvenŃii de sintaxă InstrucŃiunile SQL DDL au mai multe opŃiuni decât alte instrucŃiuni SQL. Fiecare..LECłIA 2. tipuri construite şi tipuri definite de utilizator. cum ar fi CREATE TABLE. [.. se obŃine ca rezultat diferenŃa în zile dintre cele două date calendaristice. 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". trebuie să fie incluse aşa cum sunt scrise aici. . dar dacă se scade o dată dintr-o altă dată.DDL Se vor prezenta în continuare instrucŃiunile SQL folosite pentru definirea şi gestionarea obiectelor dintr-o bază de date relaŃională. în special virgulele şi parantezele. SQL acceptă trei categorii de tipuri de date: tipuri predefinite.<restricŃie_pentru_tabel>. Un tip de date este o categorie pentru formatul folosit de o anumită coloană. OpŃiunile dintr-o listă de elemente posibile sunt separate de o bară verticală (simbolul logic pentru „sau"). Tipurile de date asigură câteva avantaje importante: RestricŃionarea. Se prezintă DDL înaintea DQL. dacă se scade un număr dintr-un alt număr. InformaŃiile pe care ar trebui să fie furnizate la scrierea instrucŃiunilor sunt scrise cu italic. cum ar fi [WITH TIME ZONE]. De exemplu. datelor din coloana respectivă la caracterele care au sens pentru tipul de date specificat. cum ar fi nume_coloană. cum ar fi [NULL | NOT NULL]. Toate celelalte simboluri. Se pot întâlni uneori ca listă de elemente opŃionale. Creşterea eficienŃei sistemului SGBD la stocarea datelor din coloane. coloană trebuie să aibă asociate un nume unic şi un tip de date. ALTER şi DROP formează o categorie a limbajului SQL numită limbaj de definire a datelor (DDL– Data Definition Language).

cunoscute şi ca tipuri de colecŃii. pentru evitarea confuziilor.Un şir de caractere cu lungime finită. Sintaxa SQL este: NUMERIC (precizie.Un tip numeric exact care include o precizie şi o scalã. specificând lungimea maximă a şirurilor de caractere stocate. Tipurile de date stardard pentru caractere sunt: Caracter cu lungime fixă . cifre şi alte simboluri permise de sistemul de calcul pe care se află baza de date. adaptate unor scopuri specifice. în scopul reprezentării în SGBD a construcŃiilor de date orientate spre obiect. Sintaxa SQL este: NATIONAL CHARACTER(lungime) | NCHAR(lungime) Exemplu: TITLU_FILM NCHAR(100) Caracter variabil . Tipurile numerice standard sunt: Numeric . conŃin matrice sau seturi de tipuri de date predefinite.Tipurile de date predefinite sunt cele furnizate de către producător ca parte nativă a sistemului SGBD(vor fi tratate în continuare). în timp ce numerele reale care nu include o scală (numerele cu virgulă mobilă) sunt numite numerice aproximative. De asemenea unele tipuri numerice au şi o scală (numărul de cifre aflate în dreapta punctului zecimal). Tipuri de date predefinite din standardul SQL:2003 Se vor prezenta fiecare tip de date în secŃiuni separate.Un şir de caractere cu lungime variabilă. Ultimele două tipuri de date nu vor fi tratate . Tipuri de date pentru caractere Tipurile de date pentru caractere conŃin şiruri de caractere.2) . Tipurile de date construite. Sintaxa SQL este: NATIONAL CHARACTER VARYING( l u n g i m e _ m a x i m ă ) | NVARCHAR (lungime_maximă) Exemplu: TITLU_FILM NVARCHAR(100) Tipuri de date numerice Acestea sunt utile mai ales pentru atributele folosite în calcule.Acest tip de date poate fi folosit pentru traducerea şirurilor de caractere în diferite limbi. Tipurile întregi şi tipurile numerice care include o scală sunt numite numerice exacte. Sintaxa SQL este: CHARACTER(lungime) | CHAR(lungime) Exemplu: NUMAR_SECURITATE CHAR(9) Caracter naŃional . fiind prea complicate pentru intenŃiile cursului. scală) Exemplu: PLATA_PE_ORA_ANGAJAT NUMERIC(5. Sintaxa SQL este: CHARACTER VARYING(lungime_maximă) | VARCHAR(lungime_maximă) Exemplu: NUME_CLIENT VARCHAR(125) Caracter naŃional variabil – O variantă a tipului de date pentru şiruri de caractere cu lungime variabilă. Tipurile de date definite de utilizator permit utilizatorului bazei de date să definească propriile tipuri de date. adică litere. Toate tipurile numerice au o precizie (un număr de cifre). stocata într-un set de caractere al unei anumite limbi.

Un tip numeric aproximativ. Numerele întregi nu au cifre zecimale. cu precizie definită de implementare.O variantă a tipului INTEGER. cu precizie definită de implementare. scrisă SMALLINT. Este scrisă FLOAT.Un tip numeric aproximativ. Sintaxa SQL este: DOUBLE PRECISION | DOUBLE Exemplu: RATA_DOBANDA DOUBLE PRECISION Tipuri de date temporale Aceste tipuri (numite şi tipuri pentru date şi ore) stochează date care măsoară timpul. Sintaxa SQL este: DECIMAL(precizie. Sintaxa SQL este: INTEGER (precizie) | INT (precizie) Exemplu: ID_CONT_CLIENT INTEGER Întreg mic . într-un mod oarecare.Un tip numeric aproximativ. scrisă BIGINT. Tipurile de date temporale conŃin următoarele componente. ca urmare. aşa că scala nu este necesară.2) Întreg . deoarece este întotdeauna zero. Sintaxa SQL este: BIGINT (precizie) Exemplu: ID_CONT_CLIENT BIGINT Număr în virgulă mobilă . pe două sau YEAR patru cifre MONTH Luna din an DAY Ziua din lună HOUR Ora din zi MINUTE Minutul din oră SECOND Secunda din minut Valoarea orei cu diferenŃa de TIMEZONE_HOUR fus orar . cu precizia mai mare sau egală cu precizia specificată. care stochează numere mai mici şi. scală) Exemplu: PLATA_PE_ORA_ANGAJAT DECIMAL(5. scris INTEGER sau INT. ocupă mai puŃin spaŃiu. câmpuri (fields) : Numele câmpului (cuvânt cheie DefiniŃie SQL) Anul calendaristic. Sintaxa SQL este: REAL Exemplu: RATA_DOBANDA REAL Număr real cu precizie dublă . Sintaxa SQL este: SMALLINT (precizie) Exemplu: ID_CONT_CLIENT SMALLINT Întreg mare .Zecima1 .O variantă a tipului INTEGER.Un tip numeric exact care include numai precizia. care stocheză numere mai mari şi ocupă mai mult spaŃiu. numite de standard. Specificarea preciziei este opŃională. Sintaxa SQL este: FLOAT (precizie) Exemple: RATA_DOBANDA FLOAT(16) RATA_DOBANDA FLOAT Număr real . dar mai mare sau egală cu precizia definită pentru tipul REAL.Un tip numeric exact care include o precizie şi o scală.

stocat într-o anumită limbă.Un interval de timp. incluzând câmpurile YEAR.TIMEZONE_MINUTE Valoarea minutului cu diferenŃa de fus orar Câmpurile TIMEZONE_HOUR şi TIMEZONE_MINUTE sunt incluse în toate tipurile de date temporale pentru care este specificat cuvântul cheie WITH TIMEZONE. Sintaxa SQL este: BOOLEAN Exemplu: CLIENT_PREFERAT BOOLEAN . Obiect mare pentru caractere . Tipurile de date temporale sunt: Data . Sintaxa SQL este: INTERVAL câmp_de_start TO câmp_de_sfârşit|INTERVAL câmp Exemple: TIMP_LUCRU INTERVAL HOUR TO MINUTE ZILE_INCHIRIERE INTERVAL DAY Tipuri de date pentru obiecte mari Obiectele mari permit stocarea unor date care depăşesc cu mult posibilităŃile de stocare ale tipurilor de date prezentate până acum. incluzând câmpurile HOUR. MONTH.Un obiect mare pentru caractere.Un obiect mare care conŃine date binare. care reprezintă precizia intervalului. DAY. scris în SQL sub forma BLOB. care nu vace obiectul cursului. incluzând câmpurile YEAR. Obiect mare binar . Sintaxa SQL este: DATE [WITH TIMEZONE] Exemplu: DATA_INSCRISA DATE Ora . MINUTE şi SECOND. Sintaxa SQL este: TIMESTAMP [WITH TIMEZONE] Exemplu: DATA_TIMP_ INSCRIS TIMESTAMP Interval . scris în SQL sub foma CLOB. scris în SQL sub forma NLOB.Un obiect mare pentru caractere.Un tip de date combinat pentru dată şi oră. ajungând deseori la dimensiuni de câŃiva megaocteŃi.O dată calendaristică. Obiect mare pentru caractere. Sintaxa SQL este: TIME [WITH TIMEZONE] Exemplu: TIMPUL_INSCRIS TIME Marcă temporală .Stochează o valoare logică adevărat sau fals. MONTH şi DAY. se vor prezenta aceste tipuri fără sintaxa lor. cum ar fi o imagine sau o secvenŃă sonoră. incluzând câmpurile specificate printr-un calificator de interval (internal qualifier). HOUR. în format naŃional .Un tip de date pentru oră. MINUTE şi SECOND. Un alt tip de date Există un tip standard de date care nu este încadrat în nici una dintre categoriile prezentate anterior: Boolean . Deoarece manipularea obiectelor mari este un subiect avansat.

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

VARCHAR2 . în Microsoft SQL Server şi Sybase Adaptive Server este exact invers: dacă se omite specificarea acestei restricŃii. INTEGER. Exemple Pentru memorarea datelor numerice. durata_1. indiferent dacă se memorează doar timpul. O valoare nulă nu este ace1aşi lucru cu un spaŃiu. restricŃia NOT NULL este controlată de opŃiunea Required din panoul de proiectare a tabelului. minut. minutul. ceea ce înseamnă ca în coloana respectivă nu pot fi valori nule. Pe de altă parte. În Microsoft Access. În SQL DDL. ora. ziua. DACA NU ESTE SPECIFICAT TIMPUL. durata_2. Probleme Să se creeze un tabel cu trei coloane. FLOAT. ÎN GENERAL. luna şi ziua unei date calendaristice. Oracle9i introduce noi tipuri de date pentru timp: • TIMESTAMP(precizie_fracŃiuni_secundă) cuprinde valori pentru anul. NVARCHAR2 şi LONG. luna. NCHAR. O valoare nulă într-o bază de date relaŃională este un cod special care poate fi plasat pe o coloană pentru a indica faptul că valoarea pentru coloana respectivă nu este cunoscută. dar şi valori pentru oră. secundă • INTERVAL YEAR (precizie_an) TO MONTH stochează o perioadă de timp specificată în ani şi luni. FORMATUL IMPLICIT AL DATEI SE DEFINESTE CU AJUTORUL PARAMETRULUI DE INITIALIZARE NLS_DATE_FORMAT. În Oracle. unde precizie_an reprezintă numărul de cifre din câmpul YEAR. sau doar data calendaristică. cele mai frecvent tipuri de date utilizate sunt: CHAR. valoarea prestabilită este NULL. Coloana inceput va cuprinde valori ce reprezintă momente de timp. ceea ce înseamnă că în coloana respectivă sunt valori nule. se află opŃiunea de a specifica dacă valorile nule (null) sunt permise în coloana respectivă. DECIMAL. tipurile cele mai frecvent folosite sunt: NUMBER. ACEST PARAMETRU ESTE SETAT LA FORMA DD-MON-YY. se specifică cuvintele cheie NULL sau NOT NULL. în definiŃia coloanei (în dreapta tipului de date al coloanei).Valori NULL şi logica bazată pe trei valori La definirea coloanelor din tabelele bazei de date. InformaŃii relative la timp sau dată calendaristică se obŃin utilizând tipul DATE. secunda. inceput. un şir vid sau valoarea zero – este un cod special care nu are nici o altă semnificaŃie în baza de date. anul. DB2 şi majoritatea celorlalte baze de date relaŃionale. Pentru o coloană de tip DATE sistemul rezervă 7 bytes. • INTERVAL DAY (zi) TO SECOND (prec_frac_sec) stochează o perioadă de timp reprezentată în zile. TIMPUL IMPLICIT ESTE 12:00:00. minute şi secunde. dacă se omite specificarea acestei restricŃii. Pentru memorarea şirurilor de caractere. Pentru fiecare dată de tip DATE sunt depuse: secolul. ore. valoarea prestabi1ită este NOT NULL. inclusiv fracŃiunile de .

durata_2 INTERVAL YEAR TO MONTH ). iar 200 are 3 digiti Ex. INTERVAL '19-02' YEAR TO MONTH).30'. INSERT INTO timp VALUES (TIMESTAMP '2009-10-31 09:26:50.3 . ore. INTERVAL '200-02' YEAR TO MONTH). INTERVAL '23 7:44:22' DAY TO SECOND. INTERVAL '23 7:44:22' DAY TO SECOND.20'. Exemple date inserate 1. deoarece implicit precizia pentru an este 2. CREATE TABLE TIMP ( inceput TIMESTAMP. durata_1 INTERVAL DAY(2) TO SECOND(3). Valorile coloanei durata_1 vor fi intervale de timp specificate în număr de zile. INTERVAL '200-02' da eroare. Coloana durata_3 va conŃine intervale de timp precizate în număr de ani şi luni. Să se insereze o înregistrare în acest tabel.secundă corespunzătoare. minute şi secunde. 2 INSERT INTO timp VALUES (TIMESTAMP '2010-02-20 09:20:40. Ex.

30'. INTERVAL '20-100' YEAR TO MONTH).INSERT INTO timp VALUES (TIMESTAMP '2010-01-25 09:26:50. INTERVAL '23 7:44:22' DAY TO SECOND. deoarece 100 de luni adauga ani Ex. INTERVAL '23 2:2:2' DAY TO SECOND. INTERVAL '23 2:2:2' DAY TO SECOND. .5 INSERT INTO timp VALUES (TIMESTAMP '2010-01-25 09:26:50.4 INSERT INTO timp VALUES (TIMESTAMP '2010-01-25 09:26:50. INTERVAL '20-100' eroare. Ex.30'. INTERVAL '20-10' YEAR TO MONTH). INTERVAL '20-12' YEAR TO MONTH).30'.

.7 INSERT INTO timp VALUES (TIMESTAMP '2010-01-25 09:26:50.30'. INTERVAL ‘144’ YEAR).INTERVAL '20-12' eroare deoarece 12 luni fac un an si depasesc intervalul de 20 ani Ex.30'. Ca durata_2 are valoarea 10.6 INSERT INTO timp VALUES (TIMESTAMP '2010-01-25 09:26:50. INTERVAL '360' SECOND. Se observă ca executând instructiunea: SELECT * from timp . INTERVAL '23 2:2:2' DAY TO SECOND. Ex. INTERVAL ‘120’ MONTH).

. INTERVAL '20' DAY(2).8 INSERT INTO timp VALUES (TIMESTAMP '2010-01-25 09:00:00.30'. Se observa că inregistrarea introdusa are : • Durata_1 de 20 zile si 0 SECOND) si secunde( fiind un INTERVAL DAY TO • Durata_2 este 10 ani si 0 luni (fiind un INTERVAL YEAR TO MONTH) Exemplu CREATE TABLE exemplu (durata INTERVAL YEAR(3) TO MONTH). INTERVAL ‘10’ YEAR).Se observa că inregistrarea introdusa are : • Durata_1 este de 6 min(360 sec) si • Durata_2 de 12 ani(144 de zile) Ex.

numarul maxim de digiti pentru fractiuni de secunda este 9.26. Pentru informatii de tip TIMESTAMP.00. 'DD-mon.00. SELECT TO_CHAR(SYSDATE+durata.300000 AM 5 08-FEB-12 12.TIMESTAMP '2009-10-31 09:26:50. INSERT INTO noi_carti VALUES (5.30').INSERT INTO exemplu VALUES (INTERVAL '120' MONTH). Exemplu CREATE TABLE noi_carti (codel NUMBER.50. SELECT codel . implicit este 6.start_data FROM noi_carti. INSERT INTO noi_carti VALUES (1. Rezultatele cererii: 1 31-OCT-09 09.YYYY') FROM exemplu.000000 AM . start_data TIMESTAMP). timestamp '12-02-08 0:0:0').

UR vară sau iarnă). iar rezultatul este de tip dată calendaristică. ÎN INSTRUCTIUNILE SQL SE POATE FOLOSI UN MODEL DE FORMAT CA ARGUMENT AL FUNCTIILOR TO_CHAR SI TO_DATE. întreagă. De la 01 la 31 (limitat de valorile câmpurilor MONTH şi YEAR. iar rezultatul este de tip interval. fracŃiunilor de secundă. De la 0 la 23. UN MODEL DE FORMAT NU SCHIMBA REPREZENTAREA INTERNA A VALORII IN BAZA DE DATE.9(n). unde „9(n)“ SECOND unde „9(n)“ este precizia este precizia fracŃiunilor de secundă. O PARTE DINTRE ELEMENTELE CEL MAI FRECVENT . Data – Interval. MONTH De la 01 la 12. Interval + Data.9(n). De la 00 la 59. TIMEZONE_MI De la 00 la 59. ATUNCI CAND SE CONVERTESTE UN SIR DE CARACTERE INTR-O DATA CALENDARISTICA SAU INTR-UN NUMAR. HOUR De la 00 la 23. Interval * Number. OperaŃiile care pot fi utilizate în aceste expresii şi tipul rezultatelor obŃinute sunt următoarele: • Data + Interval. Interval / Number. Orice valoare DAY corespunzător regulilor calendarului întreagă. De la –12 la 13 (prevede TIMEZONE_HO schimbările datorate trecerilor la ora de Nu se aplică. De la 0 la 59.Pentru informatii de tip DATE. De la 0 la 59. MODELE DE FORMAT UN MODEL DE FORMAT ESTE UN LITERAL CARACTER CARE DESCRIE FORMATUL VALORILOR DE TIP DATE SAU NUMBER STOCATE INTR-UN SIR DE CARACTERE. Number * Interval. ÎN FELUL ACESTA SE POATE SPECIFICA FORMATUL FOLOSIT DE SISTEMUL ORACLE PENTRU A RETURNA SAU A STOCA O VALOARE IN/DIN BAZA DE DATE. NUTE Câmp Sistemul Oracle permite construcŃia de expresii folosind valori de tip dată calendaristică şi interval. MINUTE De la 00 la 59. • Data – Data. Interval – Interval. Interval + Interval. curent). MODELUL DE FORMAT INDICA SISTEMULUI CUM SA INTERPRETEZE SIRUL RESPECTIV. Nu se aplică. formatul implicit ar fi fost DD-MON-RR Valori valide pentru date Valori valide pentru calendaristice intervale Orice valoare De la -4712 la 9999 (cu excepŃia YEAR anului 0). De la 0 la 11.

(punct) $ 0 9 99 99 Exemplu 99 Descriere Plasează o virgulă în poziŃia specificată. într-un şir de caractere. Plasează în poziŃia specificată caracterul zecimal.INTALNITE ALE UNUI FORMAT DE TIP NUMERIC SUNT SINTETIZATE IN TABELUL URMATOR. Întoarce în poziŃia specificată simbolul monedei locale (valoarea curentă a parametrului NLS_CURRENCY). 9.9 Returnează o valoare folosind notaŃia ştiinŃifică. .9 format numeric pot fi precizate mai multe virgule. Acest element poate fi specificat numai pe ultima poziŃie a modelului de format numeric. Plasează zerouri în faŃa sau la sfârşitul valorii. respectiv un minus în faŃă dacă este pozitivă. dar o virgulă nu poate apărea în partea dreaptă a punctului zecimal. Plasează un punct zecimal în poziŃia specificată. pentru aflarea datei curente. Într-un format numeric. pentru a converti o valoare de tip DATE. se poate specifica cel mult un punct zecimal. S99 Plasează semnele plus sau minus la începutul sau la sfârşitul valorii. De exemplu SELECT SYSDATE FROM dual. 9S MODELELE DE FORMAT PENTRU DATE CALENDARISTICE POT FI UTILIZATE IN CADRUL URMATOARELOR FUNCTII DE CONVERSIE: • TO_DATE. 9990 999 9 C 9 D 99 E EEE L EEEE 9 Întoarce valoarea cu numărul specificat de cifre. respectiv negativă. Plasează în poziŃia specificată simbolul ISO pentru C99 monede(valoarea curentă a parametrului NLS_ISO_CURRENCY). într-o valoare de tip DATE. 099 9. El ement . • SYSDATE. Se poate specifica cel mult un caracter zecimal într-un model de format numeric. Plasează semnul minus la sfârşitul valorilor negative şi un 999 spaŃiu la sfârşitul celor pozitive. (virgulă) . Valoarea implicită este punctul. pentru a converti o valoare de tip caracter. $99 Include semnul „$“ în faŃa unei valori. care este într-un alt format decât cel implicit. care este valoarea curentă a parametrului 99D NLS_NUMERIC_CHARACTER. Într-un model de 9. Valoarea va avea un spaŃiu. Acest element poate apărea doar pe prima 999 sau ultima poziŃie a modelului de format numeric. 99. • TO_CHAR. care este într-un alt format decât cel implicit. L99 MI 9MI S 99.

respectiv „friday“. până la lungimea de 9 caractere. D DAY DD DDD DY FF HH sau HH12 HH24 MI MM MON MONTH RM RR RRRR SS SSSSS TZH TZM Y. Ora din zi (1-12). Numărul zilei din săptămână (1-7). până la lungimea de 9 litere. Element AD sau A. Anul cel mai apropiat de data curentă. . Toate aceste caractere apar în valoarea returnată pe locul specificat în modelul de format. Numărul zilei din an (1-366). Numele zilei din săptămână. Acceptă intrarea atât cu 2. Luna din an (01-12).Hr. abrevierilor sau a numeralelor romane este respectată în elementul de format corespunzător. Numele lunii. incluse între ghilimele. Secundele trecute de la miezul noptii (0-86399). Dacă anul de intrare se dă cu 2 cifre. Într-un model de format pentru date calendaristice se pot preciza semne de punctuaŃie şi literale caracter. FracŃiunile de secundă. Ora din zi (0-23). Ultimele cifre ale anului. Minutul regiunii. cu semnul minus).D. Numele zilei completat cu spaŃii.YYY YEAR sau SYEAR YYYY sau SYYYY YYY. Anul cu 4 cifre.Un model de format pentru date calendaristice este alcătuit dintr-unul sau mai multe elemente specifice. modelul de format „DAY“ produce cuvinte cu majuscule. Numele lunii completat cu spaŃii. iar „Day“ şi „day“ au ca rezultat „Friday“. printr-o abreviere de 3 litere. cât şi cu 4 cifre. Scrierea cu litere mari sau mici a cuvintelor. Indicatorul BC (Before Christ) cu sau fără puncte. Luna în cifre romane (I-XII). Minutele din oră (0-59). De exemplu. cum ar fi „FRIDAY“. Secundele din minut (0-59). YY sau Y ExplicaŃie Indicatorul AD (Anno Domini) cu sau fără puncte. Duminica este considerată prima zi a săptămânii. furnizează acelaşi lucru ca şi formatul RR. Anul în litere („S“ prefixează anii i. Numărul zilei din lună (1-31). printr-o abreviere de 3 litere. Anul scris cu virgulă după prima cifră. BC sau B.C. Ora regiunii.

Two Thousand Nine Exemplu 21st of January 2009 10TH of October 2009 January 21.’ DDTH ”of” Month YYYY’) angajare FROM angajati WHERE TO_CHAR(data_ang. TO_CHAR(data_ang.YYYY’) angajare FROM angajati WHERE TO_CHAR(data_ang. Angajare Twenty_NineTH July. Nume Angajare Pop Ene Exemplu SELECT nume. Nume Angajare Pop Ene Exemplu SELECT TO_CHAR(data_ang.a. Exemplu: SELECT nume.m. iar FX (Format eXact) impune corespondenŃa exactă dintre argumentul de tip caracter şi modelul de format precizat pentru data calendaristică respectivă. ’YYYY’)=’2009’. TO_CHAR(data_ang. În acest caz.2009 . controlând completarea cu spaŃii şi verificarea exactă a formatelor. efectele sale sunt active pentru porŃiunea din model care începe la prima apariŃie şi apoi dezactivate pentru porŃiunea din model care urmează celei de-a doua apariŃii ş. ’YYYY’)=’2009’.Modificatorii FM şi FX pot fi utilizaŃi în modelele de format din cadrul funcŃiei TO_CHAR.’ fmDDspth Month.’Month FMDD.2009 October 10.d. Modificatorul FM (Fill Mode) suprimă completarea cu spaŃii în valoarea returnată de funcŃia TO_CHAR.Year’) angajare FROM angajati WHERE id_ang=100. Un modificator poate să apară într-un model de format de mai multe ori.

<restricŃie—tabel>. dar nu inserează şi nu actualizează date în obiectele respective. aşa că posibilitatea de a stoca orice într-o bază de date începe întotdeauna cu crearea unui tabel. există două situaŃii în care sistemul Oracle consideră două valori null ca fiind egale: la evaluarea funcŃiei DECODE şi dacă valorile null apar în chei compuse. ALTER SYSTEM. inclusiv null. ALTER . Sesiunea incepe pe 20-09-2010 (Afişează formatul standard pentru dată) Valoarea null.SELECT ’sesiune incepe pe ’|| TO_DATE(’20-09-2010’..’DD-MM-YYYY’) from dual. de tipul specificat în instrucŃiune. nu este egală sau diferită de nici o altă valoare.Modifică definiŃia unui obiect existent în baza de date. InstrucŃiuni DDL (Data Definition Language) InstrucŃiunile DDL (Data Definition Language) definesc obiectele bazei de date. de tipul specificat în instrucŃiune : CREATE DATABASE. ALTER DATABASE.Creează în baza de date un nou obiect.. Totuşi.<definiŃie_coloană> . D R O P .. Modelul relaŃional cere ca toate datele stocate să fie ancorate într-un tabel. CREATE INDEX şi CREATE VIEW. reprezentând lipsa datelor. ALTER USER.. Definirea coloanelor în SQL DDL Sintaxa de bază folosită pentru definirea coloanelor unui tabel este: <definiŃie_coloană> nume coloană tip_de_date [DEFAULT expresie] [NULL | NOT NULL] [<restricŃie_coloană>] . InstrucŃiunea CREATE TABLE CREATE TABLE este una din instrucŃiunile fundamentale din SQL. ALTER SESSION. CREATE TABLE. există trei comenzi de bază pentru instrucŃiunile DDL: CREATE . În SQL.Şterge (distruge) un obiect existent în baza de date.]) [. Două chei compuse care conŃin valori null sunt considerate identice dacă toate componentele diferite de null sunt egale. de tipul specificat în instrucŃiune : ALTER TABLE. ]. Sintaxa de bază pentru instrucŃiunea CREATE TABLE este: CREATE TABLE nume_tabel (<definiŃie_coloană> [.

Numele coloanei trebuie să fie unic în cadrul tabelului. Tipul de date . titlu VARCHAR2(30). NUMBER(3). NUMBER(8. Crearea structurii unui tabel fără a indica cheile: CREATE TABLE (codel titlu autor pret nrex coded carte CHAR(5). coded CHAR(5) NOT NULL REFERENCES domeniu(coded)). CHAR(5)). VARCHAR2(30). Crearea structurii unui tabel indicând cheile la nivel coloană: CREATE TABLE carte (codel CHAR(5) PRIMARY KEY. VARCHAR2(30).Tipul de date trebuie să fie un tip de date valid pentru implementarea SGBD Restrictiile coloanei care sunt prezentate în continuare STRUCTURA UNUI TABEL POATE FI CREATĂ ÎN URMĂTOARELE PATRU MODURI: • fără a indica cheile.2).2). imprumut CITI TOR codec# nume dep DOME NIU coded# intdom 2. • indicând cheile la nivel de coloană. pret NUMBER(8. • prin copiere din alt tabel. autor VARCHAR2(30). nrex NUMBER(3). .Componentele din definiŃia unei coloane sunt: Numele coloanei . • indicând cheile la nivel de tabel. Exemplu : Gestiunea activităŃilor de împrumut dintr-o bibliotecă CAR TE codel# titlu autor pret nrex apartine 1.

titlu VARCHAR2(30). FOREIGN KEY (codec) REFERENCES cititor(codec)).2). CREATE TABLE domeniu (coded CHAR(5) PRIMARY KEY. CREATE TABLE imprumuta (codel CHAR(5). den_cititor VARCHAR2(30)). . codec CHAR(5). FOREIGN KEY (coded) REFERENCES domeniu (coded)). titlu VARCHAR2(30). den_dom VARCHAR2(30)).2). datares DATE. PRIMARY KEY (codel). codec. CREATE TABLE cititor (codec CHAR(5) PRIMARY KEY. dataim DATE DEFAULT SYSDATE. nrex NUMBER(3). autor VARCHAR2(30). coded CHAR(5) NOT NULL REFERENCES domeniu(coded) ON DELETE CASCADE). nrex NUMBER(3). 3. pret NUMBER(8. FOREIGN KEY (codel) REFERENCES carte(codel). dataim).CONSTRANGEREA DE CHEIE PRIMARA SAU EXTERNA CE PRESUPUNE? CREATE TABLE carte (codel CHAR(5) PRIMARY KEY. Dacă cheia primară are mai mult de o coloană atunci cheile trebuie indicate la nivel de tabel. PRIMARY KEY (codel. OpŃiunea ON DELETE CASCADE specifică că suprimarea oricărui domeniu de carte din tabelul domeniu este autorizată şi implică suprimarea automată a tuturor cărŃilor din domeniul respectiv care se găsesc în tabelul carte. dataef DATE. Crearea structurii unui tabel indicând cheile la nivel de tabel: CREATE TABLE carte (codel CHAR(5). autor VARCHAR2(30). pret NUMBER(8. coded CHAR(5) NOT NULL.

. ‘N’)). CREDIT_CARD_IND CHAR(1) NOT NULL. utilizând instrucŃiune DDL şi incluzând restricții CREATE TABLE CONT_CLIENT ( ID_CONT_CLIENT INTEGER NOT NULL.2) NULL. ’Baza_de_Date’. din baza de date a magazinului de produse video. 300. CHECK (CREDIT_CARD_IND IN (‘Y’. ’Popescu_Ioana’.//restr. CLIENT_CONT_STARE CHAR(1) DEFAULT ‘N’ NOT NULL. ’Informatica’). //NULL daca contul e activ SUMA_DEPOZIT_CLIENT NUMERIC(5.’I’). ‘N’)). 4. autor FROM carte WHERE coded = ’I’. //restric coloana IND_PERMIS_INCHIRIERE_COPIL CHAR(1) NOT NULL. CHECK(IND_PERMIS_INCHIRIERE_COPIL IN(‘Y’. DATA_INCHEIERE DATE NULL. Un exemplu complet pentru crearea tabelului CONT_CLIENT. coloana DATA_INSCRIERE DATE NOT NULL. titlu.‘N’ PRIMARY KEY (ID_CONT_CLIENTINTEGER ) //restr.INSERT INTO domeniu VALUES(’I’. CHECK (CLIENT_CONT_STARE IN (‘Y’. Crearea structurii unui tabel prin copiere din alt tabel: CREATE TABLE carte_info AS SELECT codel. 100. INSERT INTO carte VALUES(’bnat1’. tabel ).50.

în timp ce NOT NULL nu permite stocarca valorilor nule în coloana respectivă. care nu conŃine o valoare explicită pentru coloana respectivă. Expresia poate fi orice expresie validă. O restricŃie NOT NULL poate fi scrisă şi sub forma unei restricŃii CHECK cu condiŃia IS NOT NULL. Sintaxa SQL şi câteva exemple: NULL | NOT NULL Exemple: DATA_INSCRIERE DATE NOT NULL DATA_INCHEIERE DATE NULL RestricŃia CHECK . Tipul de date . Sintaxa SQL cu o clauză DEFAULT este: [DEFAULT expresie] Exemplu: STARE_CONT_CLIENT CHAR(1) DEFAULT 'N' NOT NULL RestricŃia NULL | NOT NULL . RestricŃiile coloanelor pot avea oricare dintre următoarele forme: Clauza DEFAULT .O restricŃie de verificare (check) poate fl folosită pentru impunerea unei reguli care poate fi aplicată unei singure coloane a unui tabel.Numele coloanei trebuie să fie unic în cadrul tabelului. ‘N’)) Clauză NOT NULL poate fi rescrisă şi sub forma unei restricŃii CHECK: ID_CONT_CLIENT INTEGER CONSTRAINT CK_CUST _ACCT _ID CHECK (ID_CONT IS NOT NULL) RestricŃia UNIQUE . CHECK (CREDIT_CARD_IND IN (‘Y’.Tipul de date trebuie să fie un tip de date valid pentru implementarea SGBD Restrictiile coloanei care sunt prezentate în continuare RestricŃiile coloanelor RestricŃiile unei coloane limitează într-un mod oarecare valorile ce pot fi stocate într-o coloană a unui tabel.O expresie care este aplicată coloanei atunci când în tabel este inserat un nou rând.Componentele din definiŃia unei coloane sunt: Numele coloanei . sistemul SGBD va respinge modificarea şi va afişa un mesaj de eroare. CondiŃia inclusă în restricŃie trebuie să fie îndeplinită ori de câte ori datele din coloana respectivă a tabelului sunt modificate – în caz contrar. Sintaxa: [CONSTRAINT nume_restricŃie] UNIQUE Exemplu: .Specificarea cuvântului cheie NULL permite stocarca valorilor nule într-o coloană.O restricŃie UNIQUE impusă asupra unei coloane garantează unicitatea valorilor din coloana respectivă a tabelului. Sintaxa restricŃiei CHECK şi un exemplu: [CONSTRAINT nume restricŃie] CHECK (condiŃie) Exemplu: CREDIT_CARD_IND CHAR(1) NOT NULL.

Principalul avantaj al restricŃiilor la nivelul tabelului este că pot referi mai multe coloane.]) Conform acestei restricŃii . Sintaxa: [CONSTRAINT nume_restricŃie] REFERENCES nume_tabel(nume_coloană) [ON DELETE CASCADE | ON DELETE SET NULL] Exemplu: MPAA_CODE_RATING din tabelul FILME este cheie externă pentru tabelul MPPA_RATING.nume coloană.O restricŃie de cheie primară (PRIMARY KEY) impusă asupra unei coloane declară coloana respectivă ca fiind cheia primară a tabelului. iar valorile trebuie să fie unice în cadrul tabelului. Exemplu: CONSTRAINT CK_SUMA_DEPOZITE_CLIENT CHECK (SUMA_DEPOZITE_CLIENT >= 0 OR SUMA_DEPOZITE_CLIENT IS NULL) RestricŃia UNIQUE [CONSTRAINT nume_restricŃie) UNIQUE (nume_coloană [. Sintaxa : (CONSTRAINT nume_restricŃie] PRIMARY KEY EXEMPLU: ID_CONT_CLIENT INTEGER NOT NULL PRIMARY KEY RestricŃia referentială (FOREIGN KEY) . Operatorul OR permite stocarea valorilor nule . combinaŃia de coloane ID_CONT_CLIENT şi DATA_INSCRIERE trebuie să fie unică în rândurile din tabel. deoarece o valoare nulA nu este mai mare sau egală cu zero.ID_CONT_CLIENT INTEGER NOT NULL UNIQUE RestricŃia PRIMARY KEY . astfel încât clauza care defineşte restricŃia să apară în instrucŃiunea CREATE TABLE după definiŃiile tuturor coloanelor... RestricŃiile tabelelor RestricŃia unei coloane poate fi rescrisă şi ca restricŃie a întregului tabel.O restricŃie referenŃială impusă asupra unei coloane (numită şi restricŃie de cheie externă) defineşte relaŃia dintre o cheie externă şi o cheie primară. nu după definiŃia unei coloane. ceea ce înseamnă că în coloana respectivă nu pot exista valori nule. care are câmpurile: MPAA_CODE_RATING şi MPAA__RATING _DESCRIERE MPAA_COD_RATING CHAR (5) NOT NULL REFERENCES MPPA_RATING(MPAA_CODE_RATING) Clauza opŃională ON DELETE spune sistemului SGBD ce să facă atunci când este şters rândul referit din tabelul părinte cu opŃiunea de a şterge toate rândurile care conŃin cheia externă (CASCADE) sau de a insera valori nule pentru toate cheile externe (SET NULL). RestricŃia CHECK [CONSTRAINT nume_restricŃie] CHECK (condiŃie) RestricŃia de mai jos împiedică stocarea unei valori negative în coloana SUMA_DEPOZITE_CLIENT . Exemplu: .

DATA_INSCRIERE ) RestricŃia PRIMARY KEY [CONSTRAINT nume_restricŃie] PRIMARY KEY (nume_coloană [. VARCHAR2(30).. NUMBER(3). SA SE DEFINEASCA O CONSTRANGERE LA NIVEL DE COLOANA PRIN CARE SA SE SPECIFICE CHEIA PRIMARA SI CHEIA EXTERNA. CHAR(5) NOT NULL.nume coloană.]) REFERENCES nume_tabel (nume_coloană [.nume_coloană. NUMBER(8.. aceasta poate referi mai multe coloane. 2.CONSTRAINT UK_DATA_INSCR_CONT_CL UNIQUE (ID_CONT_CLIENT. CREATE TABLE (codel CHAR(5) CONSTRAINT cp_carte PRIMARY KEY. [CONSTRAINT nume_restricŃie] FOREIGN KEY (nume_coloană [. Titlu VARCHAR2(30). nrex NUMBER(3).. SA SE DEFINEASCA O CONSTRANGERE LA NIVEL DE TABEL PRIN CARE SA SE SPECIFICE CHEIA PRIMARA SI CHEIA EXTERNA..2). VARCHAR2(30). autor VARCHAR2(30).. coded CHAR(5) CONSTRAINT nn_coded NOT NULL CONSTRAINT ce_coded REFERENCES domeniu(coded)).]) RestricŃia de mai jos este chiar definiŃia cheii primare din tabelul CONT_CLIENT [ Exemplu: CONSTRAINT PK_CONT_CLIENT PRIMARY KEY (ID_CONT_CLIENT) RestricŃia referenŃială (FOREIGN KEY) Spre deosebire de forma pentru restricŃia referenŃială a coloanei. pret NUMBER(8..nume_coloană. [ON DELETE CASCADE |ON DELETE SET NULL] EXEMPLE: 1.2). CREATE TABLE (codel titlu autor pret nrex coded carte carte CHAR(5). .

ObservaŃii: • Liniile ce nu respectă constângerea sunt depuse automat într-un tabel special. • • constrângerea (coloană) DEFAULT . NOT NULL). constrângerea (coloană sau tabel) CHECK . indxurile pe coloanele cheilor externe cresc mult peformanŃele la unirea tabelelor. Dacă după NUMBER(8. dar nu poate conŃine subcereri. Sistemul SGBD întreŃin automat indexul. • • • Constrângerile previn ştergerea unui tabel dacă există dependenŃe. CONSTRANGERI DECLARATIVE POT FI: CONSTRANGERI DE DOMENIU. CONSTRANGEREA DE INTEGRITATE A ENTITATII. InstrucŃiunea CREATE INDEX Indexurile sunt instrumente puternice. Constrângerile pot fi create o dată cu tabelul sau după ce acesta a fost creat. tot aşa cum indexul unei cărŃi ne permite să gasim mai rapid ceea ce ne interesează. Constrângerile de domeniu definesc valori luate de un atribut (DEFAULT. dar activitatea de întreŃinere consumă din resursele calculatorului. deoarece permit sistemului să gasescă datele mult mai repede. . Constrângerea la nivel de coloană nu poate referi alte coloane ale aceluiaşi tabel.CONSTRAINT cp_carte PRIMARY KEY (codel). UNIQUE. CHECK. Constrângerile pot fi activate sau dezactivate în funcŃie de necesităŃi.2) se adaugă o virgulă. CONSTRAINT ce_coded FOREIGN KEY (coded) REFERENCES domeniu(coded)). atunci constrângerea va fi la nivel de tabel. poate face referinŃă la una sau mai multe coloane.… nrex NUMBER(3). Sintaxa de bază a instrucŃiunii CREATE INDEX este: CREATE [UNIQUE] INDEX nume_index ON nume_tabel (nume_coloană [. CONSTRANGEREA DE INTEGRITATE REFERENTIALA. CREATE TABLE carte (codel CHAR(5).nume coloană [ASC | DESC] …]). La execuŃia acestei comenzi apare mesajul: ORA – 02438: Column check constraint cannot reference other columns.…). De asemenea. iar în aceste caz este permisă referirea altei coloane.2) CONSTRAINT alfa CHECK (pret < nrex). pret NUMBER(8. constrângerea CHECK la nivel de tabel poate compara coloane între ele.

Numele vizualizării trebuie să respecte aceleaşi reguli de denumire ca şi tabelele şi alte obiecte ale bazei de date.Cuvântul cheie opŃional UNIQUE defineşte indexul ca unic. dar nu există ca tabele fizice. deoarece se comportă la fel ca tabelele. Aceştia adaugă după instrucŃiunea CREATE TABLE instrucŃiuni ALTER TABLE prin care specifică toate restricŃiile necesare (cheie primară. cheie externă. nu există o limită superioară a numărului de coloane. instrucŃiunea CREATE TABLE este mult mai uşor de înŃeles fără restricŃii. Deşi există unele diferenŃe între implementările SGBD. verificare). MulŃi administratori de baze de date preferă să folosească instrucŃuni CREATE TABLE cât mai simple. Dezavantajul acestei metode este acela că necesită scrierea unei cantităŃi mai mari de cod. Sintaxa generală a instucŃiunii CREATE VIEW este: CREATE [OR REPLACE] VIEW nume_vizualizare AS interogare sql. Pe de altă parte. Dacă nu este specificată nici una dintre cele două opŃiuni. dar. evitând să definească restricŃii în instrucŃiunile CREATE TABLE. o listă cu tipurile de modificări acceptate de instrucŃiunea ALTER TABLE. Definirea coloanei se face cu aceeaşi sintaxă ca şi în cazul instrucŃiunii CREATE TABLE. însemnând că nu pot exista două rânduri din tabel cu exact acceaşi combinaŃie de valori în coloanele specificate. Cuvântul cheie opŃional OR REPLACE elimină necesitatea de a sterge o vizualizare existentă înainte de a o crea din nou. InstrucŃiunea ALTER TABLE InstrucŃiunea ALTER TABLE ajută să se facă asupra tabelelor create. Cuvântul cheie opŃional ASC creează indexul în ordine crescătoare. iar scrierea separată a restricŃiilor simplifică refolosirea instrucŃiunilor. InstrucŃiunea CREATE VIEW O vizualizare este o interogare SQL stocată. care poate fi referită de instrucŃiuni1e SQL DML şi DQL ca şi cum ar fi un tabel real. Utilizarea instrucŃiunii ALTER TABLE este un alt domeniu în care au un rol important stilul şi preferinŃele personale. Unii consideră că vizualizările sunt „tabele virtuale". Interogarea SQL inclusă în definiŃia vizualizării poate fi orice instrucŃiunea SQL SELECT validă. împreună cu sintaxa generală pentru fiecare tip este: Adăugarea unei coloane la un tabel.<definiŃie_co1oană> . Un index trebuie să aibă cel puŃin o coloană. în timp ce DESC creează indexul în ordine descrescătoare. unicitate. ordinea prestabilită este crescătoare. ALTER TABLE nume_tabel ADD ( <definiŃie_co1oană> [.

TABLE sau VIEW. tabelele şi alte obiecte ale bazei de date.0 Microsoft SQL Server are o procedură stocată. Dintre bazele de date care acceptă această sintaxă este numai Oracle. INTRODUSE_DE VARCHAR(50)). ALTER TABLE nume_tabel DROP PRIMARY KEY. Adăugarea unei restricŃii. InstrucŃiunea DROP InstrucŃiunea DROP este cea mai simplă dintre instrucŃiunile DDL.. trebuie mai întâi şterse restricŃiile respective. Modificarca definiŃiei unei coloane. Exemplu: ALTER TABLE CONT_CLIENT ADD CONSTRAINT CK_SUMA_DEPOZIT_CLIENT CHECK (SUMA_DEPOZIT_CLIENT >= 0 OR SUMA_DEPOZIT_CLIENT IS NULL). Redenumirea unei coloane. Sunt acceptate creşterea preciziei unei coloane. . începând cu versiunea 8. ALTER TABLE nume_tabel RENAME nume_vechi_coloană TO nume _nou_coloană. Dacă cheia primară este referită de restricŃii referenŃiale. cum ar fi INDEX. ALTER TABLE nume_tabel MODIFY [COLUMN] (<definiŃie — coloană> [. adăugarea sau modificarea valorii prestabilite pentru o coloană. şi trcerea de la NULL la NOT NULL sau invers. Majoritatea SGBD-urilor nu permit să scădeŃi precizia unei coloanedacă tabelul conŃine date şi foarte puŃine permit să se schimbe tipul de date al unei coloane existente.]). Ştergerea cheii primare a unui tabel. Exemplu: ALTER TABLE CONT_CLIENT MODIFY (SUMA_DEPOZIT_CLIENT NUMERIC(7. .<definiŃie_co1oană> . numită sp_rename..2) DEFAULT 0 NOT NULL).Exemplu: ALTER TABLE CONT_CLIENT ADD (DATA _CLIENT DATE NULL. Sintaxa de bază este: DROP <tip_obiect> nume_obiect [<opŃiuni_de_ştergere>] Tipul de obiect specifică tipul obiectului care urmează să fie şters. ALTER TABLE nume_tabel ADD CONSTRAINT <definiŃie_restricŃie>. DefiniŃia restricŃiei este identică cu definiŃia unei restricŃii care ar putea apărea într-o instrucŃiune CREATE TABLE. care vă pune la dispoziŃie o modalitate de a redenumi coloanele.

DISABLE) unor constrângeri. ea devenind ultima coloană a tabelului. a cheii externe sau a unor constrângeri. ALTER TABLE nume_tabel ADD ( <definiŃie_co1oană> [. ALTER TABLE carte ADD(rezumat LONG). Sintaxa este diferită de la un producător la altul — PostgreSQL şi MySQL folosesc în acest scop cuvântul cheie CASCADE.<definiŃie_co1oană> Exemplu: ALTER TABLE CONT_CLIENT ADD (DATA_CLIENT DATE. (Oracle) DROP TABLE COD_CLIENT CASCADE. chei (primare sau externe). DROP TABLE COD_CLIENT CASCADE CONSTRAINTS. Exemple : Comanda ALTER TABLE permite: • • • • • • adăugarea (ADD) de coloane.OpŃiunile de ştergere sunt specifice fiecărui SGBD. modificarea (MODIFY) coloanelor unui tabel. Definirea coloanei se face cu aceeaşi sintaxă ca şi în cazul instrucŃiunii CREATE TABLE. Comanda ALTER TABLE are următoarea sintaxă simplificată: • Adăugarea unei coloane la un tabel. constrângeri întrun tabel existent. Exemplu: DROP TABLE COD_CLIENT. activarea şi dezactivarea (ENABLE. Nu se poate specifica unde să apară coloana. . (MySQL / PostgreSQL) DROP INDEX IX_TITLU_FILM. suprimarea unei coloane. ALTER TABLE CITITOR ADD (ADRESA VARCHAR(50)). INTRODUSE_DE VARCHAR(50)). specificarea unei valori implicite pentru o coloană existentă. în timp ce în Oracle trebuie să se folosească CASCADE CONSTRAINTS. suprimarea (DROP) cheii primare.

• Modificarca definiŃiei unei coloane. Majoritatea SGBD-urilor nu permit să scădeŃi precizia unei coloane dacă tabelul conŃine date şi foarte puŃine permit să se schimbe tipul de date al unei coloane existente. Sunt acceptate creşterea preciziei unei coloane, adăugarea sau modificarea valorii prestabilite pentru o coloană, şi trcerea de la NULL la NOT NULL sau invers. ALTER TABLE nume_tabel MODIFY [COLUMN] (<definiŃie — coloană> [,<definiŃie_co1oană> ...]); Exemplu: ALTER TABLE CONT_CLIENT MODIFY (SUMA_DEPOZIT_CLIENT NUMERIC(7,2) DEFAULT 0 NOT NULL); • Adăugarea unei restricŃii. DefiniŃia restricŃiei este identică cu definiŃia unei restricŃii care ar putea apărea într-o instrucŃiune CREATE TABLE. ALTER TABLE nume_tabel ADD CONSTRAINT <definiŃie_restricŃie>; Exemplu: ALTER TABLE CONT_CLIENT ADD CONSTRAINT CK_SUMA_DEPOZIT_CLIENT CHECK (SUMA_DEPOZIT_CLIENT >= 0 OR SUMA_DEPOZIT_CLIENT IS NULL);

Dacă pun o valoare negativă la suma, atunci apare eroare .

CREATE TABLE carte (CODEL char(5), …); ALTER TABLE carte ADD CONSTRAINT cheie_prim PRIMARY KEY (codel); • Ştergerea cheii primare a unui tabel. Dacă cheia primară este referită de restricŃii referenŃiale, trebuie întâi şterse restricŃiile respective. ALTER TABLE nume_tabel DROP PRIMARY KEY;

mai

Dacă există o CE care referă o CP şi dacă se încearcă ştergerea cheii primare, această ştergere nu se poate realiza (tabelele sunt legate prin declaraŃia de cheie externă). Ştergerea este totuşi permisă dacă în comanda ALTER apare opŃiunea CASCADE, care determină şi ştergerea cheilor externe ce referă cheia primară. ALTER TABLE domeniu DROP PRIMARY KEY CASCADE; • Ştergerea cheii externe se face ca si pentru ştergerea cheii primare ALTER TABLE carte ADD CONSTRAINT beta FOREIGN KEY (coded) REFERENCES domeniu; • Schimbarea cheii primare. Este destul de complicat procesul schimbării cheii primare fără a afecta modul de proiectare a bazei de date. Schimbarea se face în două etape: se şterge cheia primară şi apoi se recreează. ALTER TABLE carte ADD (PRIMARY KEY(codel)); ALTER TABLE DROP PRIMARY KEY; carte

ALTER TABLE carte ADD PRIMARY KEY(titlu, autor)); • Redenumirea unei coloane. Dintre bazele de date care acceptă această sintaxă este numai Oracle, începând cu versiunea 8.0 ALTER TABLE nume_tabel RENAME COLUMN nume_vechi_coloană TO nume _nou_coloană; ALTER TABLE timp RENAME COLUMN durata_1 TO dur_1;

ALTER TABLE timp RENAME COLUMN durata_2 TO dur_2;

• Pentru a activa (ENABLE) sau dezactiva (DISABLE) constrângeri: ALTER TABLE ENABLE nume_tabel nume_constrangere; carte

ALTER TABLE DROP CONSTRAINT beta; ALTER TABLE ADD CONSTRAINT

ALTER TABLE ENABLE CONSTRAINT

cititor cp_cititor PRIMARY KEY (codec) DISABLE; cititor cp_cititor;

Stergerea unei coloane se face ca şi a unei constringeri; ALTER TABLE nume_tabel DROP nume_coloana; ALTER TABLE CONT_CLIENT DROP (DATA_CLIENT ,INTRODUSE_DE );

ObservaŃii • • Nu se poate specifica poziŃia unei coloane noi în structura tabelului. O coloană nouă devine automat ultima în cadrul structurii tabelului. Modificarea unei coloane presupune schimbarea tipului de date, a dimensiunii sau a valorii implicite a acesteia. O schimbare a valorii implicite

0suprimarea indecşilor asociaŃi. 0recuperarea spaŃiului ocupat de tabel. 0permanentizarea tranzactiilor in asteptare. Dimensiunea unei coloane numerice sau de tip caracter poate fi mărită. Coloanele nefolosite sunt tratate ca şi cum ar fi fost suprimate. vor fi suprimate şi coloanele din tabel care sunt marcate cu opŃiunea SET UNUSED. utilizatorul nu mai are acces la aceasta prin intermediul cererilor. Suprimarea unui tabel Pentru ştergerea unui tabel este utilizată comanda DROP TABLE: DROP TABLE [nume_schema. După ce o coloană a fost marcată UNUSED. instrucŃiunea nu întoarce o eroare şi nu are nici un efect. DROP UNUSED COLUMNS şterge din tabel toate coloanele marcate ca fiind nefolosite. SUNT SET UNUSED ŞI DROP UNUSED COLUMNS: ALTER TABLE NUME_TABEL ET UNUSED [ ( ] NUME_COLOANĂ [ ) ].• • • afectează numai inserările care succed modificării. Clauza CASCADE CONSTRAINTS permite suprimarea tuturor constrângerilor de integritate referenŃială corespunzătoare cheilor primare şi unice din tabelul supus ştergerii. 0suprimarea privilegiilor conferite în legătură cu tabelul. În plus. Dacă tabelul nu conŃine nici o coloană nefolosită. Tipul de date al unei coloane poate fi modificat doar dacă valorile coloanei respective sunt null. ALTER TABLE NUME_TABEL DROP UNUSED COLUMNS. deşi datele acestora rămân în liniile tabelului. Alte opŃiuni ale comenzii ALTER TABLE. dar nu poate fi micşorată decât dacă acea coloană conŃine numai valori null sau dacă tabelul nu conŃine nici o linie. numele şi tipurile de date ale coloanelor nefolosite nu vor fi afişate cu comanda DESCRIBE din SQL*Plus.]nume_tabel [CASCADE CONSTRAINTS]. cu scopul de a fi şterse atunci când necesităŃile sistemului impun acest lucru. Atunci când se elimină o coloană dintr-un tabel folosind opŃiunea DROP a comenzii ALTER TABLE. Dacă se omite această clauză şi există constrângeri de integritate referenŃială. care au apărut începând CU VERSIUNEA ORACLE8I. Utilizatorul poate să adauge tabelului o nouă coloană având acelaşi nume cu cel al unei coloane nefolosite. Acest lucru se poate utiliza pentru eliberarea spaŃiului de pe disc corespunzător coloanelor nefolosite din tabel. OpŃiunea SET UNUSED permite marcarea uneia sau mai multor coloane ca fiind nefolosite. Suprimarea unui tabel presupune: 0suprimarea definiŃiei sale în dicŃionarul datelor. sistemul returnează o eroare şi nu suprimă tabelul. .

In DDL. el nu poate fi trunchiat. sinonimelor referitoare la tabel. Dintre cele mai importante coloane ale acesteia. procedurilor. Ea reprezintă o alternativă a comenzii DELETE din limbajul de prelucrare a datelor(DML). sistemul Oracle oferă instrucŃiunea: TRUNCATE TABLE NUME_TABEL. secventelor. constrângerea trebuie să fie mai întâi dezactivată. (Oracle) Pentru ştergerea întregului conŃinut al unui tabel şi eliberarea spaŃiului de memorie ocupat de acesta. instrucŃiunea DROP TABLE este ireversibilă. aceasta nu poate fi anulată ulterior (printr-o operaŃie ROLLBACK). se remarca le obtinem cu instructiunea: DESCRIBE USER_TABLES. Dacă tabelul este „părintele“ unei constrângeri de integritate referenŃială. Fiind o instrucŃiune DDL. Comanda TRUNCATE este mai rapidă deoarece nu generează informaŃie ROLLBACK şi nu activează declanşatorii asociaŃi operaŃiei de ştergere. De remarcat că instrucŃiunea DELETE nu eliberează spaŃiul de memorie. vizualizărilor. TABLE_NAME TABLESPACE _NAME Numele tabelului SpaŃiul tabel în care se află tabelul .0invalidarea (dar nu suprimarea) funcŃiilor. InstrucŃiunea DROP Exemplu: DROP TABLE DEPARTAMENT . Pentru a putea fi aplicată instrucŃiunea TRUNCATE. informaŃiile despre tabele se găsesc în vizualizarea USER_TABLES. Odată executată. Ca şi în cazul celorlalte instrucŃiuni ale limbajului de definire a datelor. DROP TABLE COD_CLIENT CASCADE CONSTRAINTS. această comandă nu poate fi anulată (ROLLBACK).

indică dacă tabelul este temporar (sau nu) YES sau NO. în octeŃi. după cum tabelului i-a fost făcută o copie de siguranŃă de la ultima modificare Numărul de înregistrări din tabel Numărul de blocuri utilizate de tabel Numărul de blocuri ce nu conŃin date SpaŃiul mediu liber din tabel Lungimea medie.' FROM USER_OBJECTS WHERE OBJECT_TYPE = 'TABLE'. NUM_ROWS. NESTED FROM USER_TABLES. indică dacă tabelul este imbricat (sau nu) EXEMPLU: SELECT TABLE_NAME. . indică dacă tabelul este partiŃionat (sau nu) Y sau N. a unei linii ENABLED (activat) sau DISABLED (dezactivat): este activată sau nu blocarea tabelului YES sau NO.CLUSTER_NAME PCT_FREE PCT_USED INI_TRANS NITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE BACKED_UP NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE AVG_ROW_LEN TABLE_LOCK PARTITIONED TEMPORARY NESTED Numele cluster-ului din care face parte tabelul Procentul de spaŃiu păstrat liber în interiorul fiecărui bloc Procentul de spaŃiu ce poate fi utilizat în fiecare bloc Numărul iniŃial de tranzacŃii concurente în interiorul unui bloc Dimensiunea spaŃiului alocat pentru prima extensie Dimensiunea spaŃiului alocat pentru următoarea extensie Numărul minim de extensii ce se alocă la crearea unui tabel Numărul maxim de extensii ce se alocă la crearea unui tabel Procentul cu care creşte dimensiunea unei extensii Y sau N. EXEMPLU: SELECT 'DROP TABLE' || OBJECT_NAME || '.

de server-ul Oracle (PRIMARY KEY. Cuvântul cheie opŃional ASC creează indexul în ordine crescătoare. Server-ul Oracle utilizează identificatorul ROWID pentru regăsirea liniilor în structura fizică a bazei de date. Cuvântul cheie opŃional UNIQUE defineşte indexul ca unic. <nume_col> [ASC | DESC]. Un index este un obiect al schemei unei baze de date care: • • creşte viteza de execuŃie a cererilor. în timp ce DESC creează indexul în ordine descrescătoare. nu există o limită superioară a numărului de coloane. deoarece permit sistemului să găsescă datele mult mai repede. de către utilizator (CREATE INDEX). Odată creat indexul. Indecşii sunt utilizaŃi şi întreŃinuŃi automat de către server-ul Oracle. Dacă nu este specificată nici una dintre cele două opŃiuni. . garantează că o coloană conŃine valori unice.InstrucŃiunea CREATE INDEX Indexurile sunt instrumente puternice. Server-ul Oracle creează automat un index unic atunci când se defineşte o constrângere PRIMARY KEY sau UNIQUE asupra unei coloane sau unui grup de coloane. • manual. Indecşii. dar. Numele indexului va fi acelaşi cu numele constrângerii. Cheia indexului poate fi coloana unui tabel sau concatenarea mai multor coloane (numărul maxim de coloane care pot defini cheia indexului este 32). el nu necesită o acŃiune directă din partea utilizatorului. din punct de vedere logic. Coloanele care apar în cheia indexului trebuie declarate NOT NULL în tabel.] <nume_tabel> (<nume_col> [ASC | DESC]. Crearea unui index (care nu este obligatoriu unic) pe una sau mai multe coloane ale unui tabel se face prin comanda: CREATE [UNIQUE] INDEX <nume_index> ON [<nume_schema>. este compus dintro valoare cheie şi din identificatorul adresă ROWID. Un index trebuie să aibă cel puŃin o coloană. Sistemul SGBD întreŃine automat indexul. De asemenea. ordinea prestabilită este crescătoare. …). tot aşa cum indexul unei cărŃi ne permite să găsim mai rapid ceea ce ne interesează. UNIQUE). însemnând că nu pot exista două rânduri din tabel cu exact acceaşi combinaŃie de valori în coloanele specificate. indexurile pe coloanele cheilor externe cresc mult peformanŃele la unirea tabelelor. dar activitatea de întreŃinere consumă din resursele calculatorului. fiind obiecte ale schemei bazei. Indecşii pot fi creaŃi în două moduri: • automat. beneficiază de procesul de definire a unui obiect. Indexul.

este recomandată crearea de indecşi numai în anumite situaŃii: • coloana conŃine o varietate mare de valori. TABLE_TYPE FROM USER_INDEXES. numele indexului si daca a fost sau nu generat) SELECT TABLE_NAME. care pot să apară în comanda CREATE INDEX. Exemplu: 1) Să se creeze un index descrescător relativ la coloana adresa din tabelul cititor. NEXT. PCTINCREASE. Alocarea de memorie este controlată prin clauzele INITIAL. Mai mulŃi indecşi asupra unui tabel nu implică întotdeuna interogări mai rapide. • coloanele indexate sunt referite în expresii. ce tabele sau ce coloane trebuie (sau nu) indexate? . un segment de date este rezervat automat în spaŃiul tabel. • majoritatea interogărilor regăsesc mai mult de 2-4% din liniile tabelului. In concluzie.Când este creat un index. CREATE INDEX cititor_id ON cititor (adresa DESC). 3) Să se afişeze toate indexurile(numele tabelelor. • una sau mai multe coloane sunt utilizate frecvent împreună într-o clauză WHERE sau într-o condiŃie de join. CREATE TABLE exem ( cod_id NUMBER(6) PRIMARY KEY USING INDEX (CREATE INDEX cod_id_idx ON exem (cod_id)). • tabelul este mare şi este de aşteptat ca majoritatea interogărilor asupra acestuia să regăsească mai puŃin de 2-4% din linii. 4)Să se creeze un index explicit. 2) Să se afişeze informaŃiile referitoare la indexul cititor_idx. nume VARCHAR2(20)). Fiecare operaŃie LMD care este permanentizată asupra unui tabel cu indecşi asociaŃi presupune actualizarea indecşilor respectivi. • coloana conŃine un număr mare de valori null. SELECT TABLE_NAME FROM USER_INDEXES WHERE INDEX_NAME=’CITITOR_IDX’. Prin urmare. referitor la cheia primara a unui tabel. • tabelul este actualizat frecvent. PCTFREE. • coloanele nu sunt utilizate des în cadrul unei condiŃii dintr-o cerere. Crearea unui index nu este recomandată în următoarele cazuri: • tabelul este mic. INDEX_NAME.

Indexul creat prin instrucŃiunea precedentă facilitează prelucrarea unor interogări precum: SELECT * FROM artist WHERE UPPER(nume) = 'GRIGORESCU'.’Dan’). inserările şi modificările sunt îngreunate de indecşi. Ştergerea unui index se face prin comanda: DROP INDEX nume_index [ON [nume_schema. INSERT INTO ARTIST VALUES(2. CREATE INDEX upper_nume_idx ON artist (UPPER(nume)). nu indexaŃi tabelele care sunt frecvent actualizate. Exemplu: Pentru a asigura că server-ul Oracle utilizează indexul şi nu efectuează o căutare asupra întregului tabel.’Grigorescu’. nu indexaŃi tabelele ce conŃin puŃine înregistrări (accesul secvenŃial este mai simplu). prenume VARCHAR2(30)). specificându-se indexul asociat cheii primare. Următoarea instrucŃiune garantează utilizarea indexului dar. deoarece ştergerile. INSERT INTO ARTIST VALUES(1. Exemplu: Să se creeze tabelul artist. indexaŃi coloanele folosite frecvent în clauza WHERE sau în clauza ORDER BY. în absenŃa clauzei WHERE. server-ul Oracle ar putea cerceta întreg tabelul. nume VARCHAR2(30) NOT NULL. indexaŃi tabelele care sunt interogate folosind clauze SQL simple. valoarea funcŃiei corespunzătoare expresiei indexate trebuie să nu fie null în interogările ulterioare creării indexului. nu indexaŃi coloanele ce conŃin date asemănătoare (puŃine valori distincte).’ene’. SELECT * FROM artist WHERE UPPER(nume) IS NOT NULL ORDER BY UPPER(nume). CREATE TABLE artist( cod_artist NUMBER PRIMARY KEY USING INDEX (CREATE INDEX artist_cod_idx ON artist(cod_artist)).• • • • • • indexaŃi tabelele pentru care interogările selectează un număr redus de rânduri (sub 5%). .’ana’).] nume_tabel] Pentru a suprima indexul trebuie ca acesta să se găsească în schema personală sau să ai privilegiul de sistem DROP ANY INDEX.

CLUSTER etc. se utilizează comanda ALTER INDEX cu opŃiunea REBUILD. În acest caz. ea conŃine întreg rândul. Modificarea parametrilor de stocare a indecşilor (STORAGE). dar care stochează datele în mod invers. toate operaŃiile sunt efectuate numai asupra indexului. CLUSTER etc. InformaŃii referitoare la indecşi şi la coloanele care îi definesc pot fi regăsite în vizualizările USER_INDEXES. respectiv USER_IND_COLUMNS din dicŃionarul datelor. index de cluster – bazat pe coloanele comune ale unui cluster. este posibilă modificarea structurii indecşilor prin comanda ALTER INDEX. adică verificarea integrităŃii indexului specificat pentru un tabel.) Proprietarul tabelului indexat Numele tabelului indexat Tipul tabelului indexat (TABLE. Coloana sau coloanele după care se face indexarea sunt cele care constituie cheia primară a tabelului. DiferenŃa constă în faptul că în cazul tabelului organizat pe bază de index. datele sunt stocate în indexul asociat. alocarea (ALLOCATE EXTENT) şi dealocarea (DEALLOCATE UNUSED) manuală a spaŃiului utilizat de un index se pot realiza cu ajutorul comenzii ALTER INDEX. LOB. index partiŃionat – folosit în cazul tabelelor mari pentru a stoca valorile coloanei indexate în mai multe segmente. index cu cheie inversă – sunt B* arbori.• • Pentru a reconstrui un index se pot folosi două metode: se şterge indexul (DROP INDEX) şi se recreează (CREATE INDEX). Dintre coloanele tabelului USER_INDEXES se remarcă: INDEX_NAME INDEX_TYPE TABLE_OWNER TABLE_NAME TABEL_TYPE UNIQUENESS TABLESPACE_NAME INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE BLEVEL Numele indexului Tipul indexului (NORMAL.) Starea de unicitate (UNIQUE. ci un bitmap format pe baza acestor valori. Acesta arată adâncimea indexului de . folosind comenzi SQL. În loc ca fiecare intrare a indexului să conŃină valoarea coloanei sau coloanelor indexate şi valoarea ROWID (care identifică unic un rând) pentru rândul corespunzător. index de tip bitmap – nu se stochează valorile efective ale coloanei indexate. Un astfel de tabel poate fi manipulat de către aplicaŃii la fel ca un tabel obişnuit. Versiunea Oracle8 permite construirea de tabele organizate pe bază de index. Începând cu Oracle9i. se face prin comanda: VALIDATE INDEX nume_index [ON nume_tabel] [WITH LIST] • • • • • Oracle8 foloseşte următoarele tipuri de indecşi: index de tip arbore B* – creat la executarea unei comenzi standard CREATE INDEX. Validarea unui index. NONUNIQUE) SpaŃiul tabel în care este stocat indexul SpaŃiul alocat pentru prima extensie SpaŃiul alocat pentru următoarea extensie Numărul minim de extensii alocate Numărul maxim de extensii Procentul cu care cresc extensiile Nivelul din B-arbore.

a. SELECT a. O secvenŃă este referită într-o comandă SQL cu ajutorul pseudo-coloanelor: • • • • • • • • • NEXTVAL – referă valoarea următoare a secvenŃei.]<nume_secventa> [INCREMENT BY n] [START WITH m] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CACHE k | NOCACHE}] CACHE k | NOCACHE specifică numărul de valori alocate de server-ul Oracle pe care le va păstra în memoria cache pentru a oferi utilizatorilor un acces rapid (implicit sunt alocate 20 de valori). . Acesta nu trebuie să includă valorile NULL din tabelul de bază Determină dacă indexul este partiŃionat (YES sau NO) Determină dacă sistemul a generat numele indexului (Y) sau utilizatorul (N) Exemplu: Să se obŃină informaŃii referitoare la indecşii tabelului carte. user_ind_columns a WHERE a. lista unei comenzi SELECT. b.index_name. lista SELECT a unei subcereri dintr-o comanda INSERT.index_name = b. NEXTVAL şi CURRVAL nu pot fi folosite în: subinterogare in SELECT. Crearea unei secvenŃe se face cu ajutorul comenzii: CREATE SEQUENCE [<nume_schema>.uniqueness FROM user_indexes b. DELETE sau UPDATE.LEAF_BLOCKS DISTINCT_KEYS STATUS NUM_ROWS PARTITIONED GENERATED la ramuri la frunze Numărul de blocuri frunză din index Numărul de chei distincte în index Starea indexului (VALID. clauza SET a unei comenzi UPDATE. INVALID.column_position poz. CURRVAL – referă valoarea curentă a secvenŃei.column_name. a. NEXTVAL şi CURRVAL pot fi folosite în: clauza VALUES a unei comenzi INSERT. interogarea unei vizualizări. DIRECT_LOAD) Numărul de linii utilizate. evitând apariŃia conflictelor şi a blocării.index_name AND a. O secvenŃă poate fi creată de un utilizator şi poate fi partajată de mai mulŃi utilizatori. comandă SELECT cu operatorul DISTINCT. SecvenŃe O secvenŃă este un obiect în baza de date care serveşte pentru a genera întregi unici în sistemele multi-utilizator.table_name = ’carte’. SecvenŃele sunt memorate şi generate indiferent de tabele aceeaşi secvenŃă poate fi utilizată pentru mai multe tabele.

nume_coloana}IS ’text comentariu’ . comandă SELECT care este combinată cu altă comandă SELECT printr-un operator mulŃime (UNION. Comentarii Sistemul Oracle oferă posibilitatea de a comenta obiectele create. printr-un text care este inserat în dicŃionarul datelor. Pentru a putea şterge sau modifica secvenŃa trebuie fie să fi proprietarul acesteia. DROP SEQUENCE domeniuseq.]<nume_secventa>.MAX_VALUE. MINUS). fie să ai privilegiul de sistem DROP ANY SEQUENCE. respectiv privilegiul ALTER SEQUENCE. COMMENT ON {TABLE nume_obiect | COLUMN nume_obiect. • opŃiunea START WITH nu poate fi modificată de comandă. secvenŃa nu mai poate fi referită. condiŃia unei constrângeri CHECK.• • • • • comandă SELECT cu clauza GROUP BY. Comentariul se poate referi la tabele. După ce a fost ştearsă. INTERSECT. Modificarea unei secvenŃe se face prin comanda ALTER SEQUENCE. CREATE SEQUENCE domeniuseq START WITH 1 INCREMENT BY 1. Sintaxa comenzii este similară instrucŃiunii CREATE SEQUENCE .’Informatica’). Să se afişeze informaŃiile referitoare la secvenŃa domeniuseq. INSERT INTO domeniu VALUES (domeniuseq. HAVING sau ORDER BY. clauza WHERE a unei comenzi SELECT. Suprimarea unei secvenŃe se face cu ajutorul comenzii: DROP SEQUENCE [<nume_schema>.NEXTVAL. MIN_VALUE FROM USER_SEQUENCES WHERE SEQUENCE_NAME = 'domeniuseq'. vizualizări. clişee sau coloane. SELECT INCREMENT_BY. Din dicŃionarul datelor pot fi obŃinute informaŃii despre secvenŃe folosind vizualizarea USER_SEQUENCES. valoarea DEFAULT a unei coloane într-o comandă CREATE TABLE sau ALTER TABLE. dar: • noua valoare maximă pentru MAXVALUE nu poate fi mai mică decât valoarea curentă. 1) 2) Să se creeze o secvenŃă domeniuseq care să fie utilizată pentru a insera noi domenii în tabelul domeniu şi să se insereze un nou domeniu.

funcŃie. Sintaxa generală a instucŃiunii CREATE VIEW este: CREATE [OR REPLACE] VIEW nume_vizualizare AS interogare sql.]obiect Exemplu: CREATE SYNONYM artist1 FOR artist. SELECT * from user_objects. iar utilizatorii pot genera sau suprima doar sinonime private. Cuvântul cheie opŃional OR REPLACE elimină necesitatea de a sterge o vizualizare existentă înainte de a o crea din nou. fără a fi nevoie să se specifice proprietarii obiectelor sau localizarea acestora. clişeu. Administratorul bazei poate produce şi poate suprima sinonime publice sau private. Aceste nume adiŃionale sunt numite sinonime (synonymes). deoarece se comportă la fel ca tabelele. Ele sunt utile deoarece permit simplificarea formulării cererii şi referirea la obiecte.Sinonime Oracle oferă posibilitatea de a atribui mai multe nume aceluiaşi obiect. pachet. sinonim. Pentru suprimarea unui sinonim din baza de date se utilizează comanda: DROP [PUBLIC] SYNONYM [schema. dar nu există ca tabele fizice. Interogarea SQL inclusă în definiŃia vizualizării poate fi orice instrucŃiunea SQL SELECT validă. secvenŃă. Numele vizualizării trebuie să respecte aceleaşi reguli de denumire ca şi tabelele şi alte obiecte ale bazei de date. Unii consideră că vizualizările sunt „tabele virtuale".]nume_sinonim InstrucŃiunea CREATE VIEW O vizualizare este o interogare SQL stocată. . SELECT * from artist1. Sistemul Oracle permite crearea de sinonime pentru obiecte de tipul: tabel. vizualizare. procedură. care poate fi referită de instrucŃiuni1e SQL DML şi DQL ca şi cum ar fi un tabel real.]nume_sinonim FOR [schema. CREATE [PUBLIC] SYNONYM [schema. Spre deosebire de alias a cărui durată de viaŃă este limitată la cererea ce conŃine alias-ul. sinonimele sunt salvate în dicŃionarul datelor şi pot fi reutilizate.

O vizualizare simplă extrage date dintr-un singur tabel. GROUP BY şi CONNECT BY. Pentru a obŃine informaŃii referitoare la vizualizările definite. clauza GROUP BY. O vizualizare este considerată complexă dacă extrage date din mai multe tabele. Vizualizarea. Nucleul Oracle determină fuzionarea cererii relative la vizualizare cu comanda de definire a vizualizării. moştenind caracteristicile obiectelor la care se referă. Oracle transformă cererea referitoare la o vizualizare într-o cerere relativă la tabelele de bază. nu conŃine funcŃii sau grupări de date şi asupra ei pot fi efectuate operaŃii LMD. fiind virtuală. • nu se poate adăuga sau modifica o linie dintr-o vizualizare. O vizualizare reflectă la orice moment conŃinutul exact al tabelelor de bază.Vizualizări Vizualizarea (view) este un tabel logic (virtual) relativ la date din una sau mai multe tabele sau vizualizări. • mascarea complexităŃii datelor. atunci Oracle nu determină fuzionarea. conŃine funcŃii sau grupări de date şi nu permite întotdeauna (prin intermediul său) operaŃii LMD asupra tabelelor de bază. Vizualizarea este definită plecând de la o cerere a limbajului de interogare a datelor. Orice modificare efectuată asupra tabelelor se repercutează instantaneu asupra vizualizării. • asigurarea confidenŃialităŃii anumitor informaŃii. se pot interoga vizualizările USER_VIEWS şi ALL_VIEWS din dicŃionarul datelor. Ea este definită în DD cu aceleaşi caracteristici ca şi un tabel. . nu solicită o alocare de memorie pentru date. • nu pot fi adăugate linii printr-o vizualizare. Vizualizările pot fi simple şi complexe. Textul cererii care defineşte vizualizarea este salvat în DD. dacă tabelul de bază conŃine coloane care au constrângerea NOT NULL şi nu apar în lista SELECT a vizualizării. • definirea constrângerilor de integritate. cuvântul cheie DISTINCT sau pseudocoloana ROWNUM. • restricŃionarea acesului la date. dacă aceasta conŃine coloane definite prin expresii. • simplificarea formulării unei cereri. OperaŃiile LMD asupra vizualizărilor complexe sunt restricŃionate de următoarele reguli: • nu se poate insera. Dacă sunt utilizate clauzele UNION. Vizualizările sunt definite pentru: • furnizarea unui nivel mai înalt de securizare a bazei. el va rezolva vizualizarea şi apoi va aplica cererea rezultatului obŃinut. actualiza sau şterge o linie dintr-o vizualizare dacă aceasta conŃine funcŃii grup. • asigurarea independenŃei datelor. analizează rezultatul fuziunii în zona partajată şi execută cererea. • afişarea datelor într-o altă reprezentare decât cea a tabelelor de bază. Ştergerea unui tabel implică invalidarea vizualizărilor asociate tabelului şi nu ştergerea acestora. Vizualizarea este memorata in DD sub forma unui SELECT.

Numărul coloanelor specificate în definiŃia vizualizării trebuie să fie egal cu cel din lista asociată comenzii – – – – – . această clauză poate fi specificată la interogarea vizualizării. WITH CHECK OPTION specifică faptul că reactualizarea datelor din tabele (inserare sau modificare) se poate face numai asupra datelor selectate de vizualizare (care apar în clauza WHERE).]<nume_view> [(<alias>[. WITH READ ONLY asigură că nici o operaŃie LMD nu poate fi executată asupra vizualizării. Cererea care defineşte vizualizarea poate fi complexă. Deşi vizualizarea va fi creată.dataim < 15 WITH CHECK OPTION. • verifică privilegiile de acces la tabelele ei de bază. NO FORCE este implicită şi se referă la faptul că vizualizarea este creată numai dacă tabelele de bază există. serverul Oracle efectuează următoarele operaŃii: • recuperează definiŃia acesteia din USER_VIEWS. poate fi împrumutată maximum 15 zile. numită TEXT. incluzând join-uri. Interogarea unei vizualizări este similară celei unui tabel. grupări şi subcereri. CREATE VIEW imprumutare AS SELECT * FROM imprumuta WHERE codel NOT IN (SELECT codel FROM carte WHERE nrex = 1) OR datares .Textul instrucŃiunii SELECT care defineşte o vizualizare este stocat într-o coloană de tip LONG. Atunci când datele sunt accesate prin intermediul unei vizualizări. FORCE creează vizualizarea chiar dacă tabelul de bază nu există sau chiar dacă vizualizarea face referinŃă la obiecte care încă nu sunt create. Cererea este o comandă SELECT care poate să conŃină alias pentru coloane. Dacă este necesar. Crearea unei vizualizări se realizează cu ajutorul comenzii: CREATE [OR REPLACE][FORCE | NOFORCE] VIEW [<nume_schema>. • converteşte cererea într-o operaŃie echivalentă asupra tabelelor de bază. Exemplu: Să se genereze o vizualizare care conŃine informaŃii referitoare la împrumutul cărŃilor şi în care să fie implementată constrîngerea că orice carte. însă nu poate conŃine clauza ORDER BY. – – OR REPLACE recreează vizualizarea dacă aceasta deja există. care există într-un singur exemplar.<alias>]…)] AS <cerere_SELECT> [WITH {CHECK OPTION [CONSTRAINT <nume_constrangere>] | READ ONLY }]. utilizatorul nu poate să o folosească.

AVG(o. stil) AS SELECT cod_opera.nume || ' ' || a . codul artistului şi stilul operelor al căror tip este „sculptura“. COUNT(o. vizualizarea nu va conŃine acele coloane până la recrearea sa printr-o instrucŃiune CREATE OR REPLACE VIEW. dar cu clauza OR REPLACE. Modificarea unei vizualizări presupune modificarea definiŃiei acesteia.cod_artist = a. Atunci când este distrusă. • Vizualizarea poate fi recreată prin redefinire cu instrucŃiunea CREATE VIEW. val_medie) AS SELECT a. numar_opere. • dacă cererea selectează toate coloanele unui tabel. a. . Înlocuirea se poate face în două moduri. acestora trebuie să li se specifice alias-uri. • definirii de constrângeri asupra vizualizărilor. cod_opera) numar.nume. numărul operelor sale şi valoarea medie a acestora. Exemplu: a) Să se creeze o vizualizare care conŃine numele şi prenumele artistului. stil FROM opera WHERE tip = 'sculptura'. informatii. cod_sculptor. Pentru a înlocui o vizualizare trebuie avut privilegiul de sistem necesar pentru distrugerea şi crearea acesteia. iar ulterior se adaugă coloane noi tabelului. artist a WHERE o. numărul şi tipul elementelor selectate de cerere trebuie să coincidă cu cel al atributelor de pe primul nivel al tipului obiect. Această metodă conservă toate privilegiile curente. 'Sculptura ' || titlu || ' a fost achizitionata la data ' || data_achizitiei.cod_artist. • Vizualizarea poate fi distrusă (DROP VIEW) şi apoi recreată (CREATE) cu noua definiŃie. a. • pentru vizualizările obiect. Asupra cererii care defineşte vizualizarea se impun următoarele restricŃii: • nu pot fi selectate pseudocoloanele CURRVAL şi NEXTVAL ale unei secvenŃe. data achiziŃiei.cod_artist GROUP BY o. • dacă sunt selectate pseudocoloanele ROWID.prenume. ROWNUM sau LEVEL. CREATE OR REPLACE VIEW sculptura (cod_sculptura. Aceste privilegii trebuie să fie create pentru noua vizualizare. b) Să se creeze vizualizarea sculptura ce va conŃine codul operei. CREATE VIEW artist_nr_val(nume.prenume "Nume si prenume". Aportul versiunii Oracle9i în ceea ce priveşte instrucŃiunea CREATE VIEW constă în posibilitatea: • creării de subvizualizări ale vizualizărilor obiect.SELECT. toate privilegiile sunt retrase. utilizând simbolul „*“.valoare) medie FROM opera o. cod_artist.

Nu se pot face operaŃii LMD asupra coloanelor calculate cu DECODE. şterse sau actualizate date din vizualizări ce conŃin: operatorul DISTINCT. clauza CASCADE CONSTRAINTS permite suprimarea tuturor constrângerilor de integritate referenŃială corespunzătoare cheilor primare şi unice din vizualizarea supusă ştergerii. CONNECT BY.In Oracle9i este posibila adaugarea de constrangeri unei vizualizari prin comanda ALTER VIEW. operatori de mulŃimi. Nu pot fi înserate. In care??? . Modificarea unui vizualizări are următoarele efecte: • • • • definiŃia vizualizării din DD este actualizată. DROP VIEW <nume_view> [CASCADE CONSTRAINT]. daca aceasta contine coloane definite prin expresii. • • • Alături de restricŃiile prezentate anterior. toate vizualizările şi programele PL/SQL dependente de vizualizarea înlocuită devin invalide. UPDATE sau DELETE pe o vizualizare bazată pe mai multe tabele poate modifica datele doar din unul din tabelele de bază. clauzele GROUP BY. Similar opŃiunii corespunzătoare din comanda DROP TABLE. pseudo-coloana ROWNUM. După fiecare modificare a tabelelor de bază este recomandabil ca vizualizarea să se recompileze: ALTER VIEW <nume_view> COMPILE. Ştergerea vizualizării nu va afecta tabelele relativ la care a fost definită vizualizarea. utilizatorul trebuie să aibă privilegiul DROP ANY VIEW sau să fie creatorul vizualizării respective. instrucŃiunea DROP VIEW va eşua. Nu pot fi inserate sau actualizate valorile coloanelor care rezultă prin calcul. Reactualizarea tabelelor implică reactualizarea corespunzătoare a vizualizărilor!!! Reactualizarea vizualizărilor implică reactualizarea tabelelor de bază? NU! Există restricŃii care trebuie respectate!!! • • Nu pot fi modificate date din vizualizare sau adaugate date prin vizualizare. există restricŃii specifice. nici unul din obiectele de bază nu este afectat de înlocuire. AplicaŃiile şi vizualizările care se bazează pe vizualizarea suprimată devin invalide. aplicabile vizualizărilor bazate pe mai multe tabele. aplicabile tuturor vizualizărilor. Dacă se omite această clauză şi există astfel de constrângeri. Recompilarea unei vizualizări permite detectarea eventualelor erori referitoare la vizualizare. toate restricŃiile care existau în vizualizarea originală sunt distruse. Suprimarea unei vizualizări se realizează prin comanda DROP VIEW care şterge definiŃia vizualizării din baza de date. Regula fundamentală este că orice operaŃie INSERT. înaintea executării vizualizării. funcŃii grup. START WITH. HAVING. Pentru a suprima o vizualizare. Nu pot fi inserate sau actualizate date care ar încălca constrângerile din tabelele de bază.

job din tabelul salariat. toate coloanele în care sunt inserate valori trebuie să provină dintr-un tabel protejat prin cheie. job salariat.Un tabel de bază al unei vizualizări este protejat prin cheie (key preserved table) dacă orice cheie selectată a tabelului este de asemenea şi cheie a vizualizării. salariat. Ştergerea înregistrării referitoare la salariatul având numele "Popescu": DELETE WHERE . prenume. • • şi ALL_UPDATABLE_COLUMNS. nume. Deci. Exmplu: Să se creeze un view ce conŃine câmpurile nume. DBA_UPDATABLE_COLUMNS USER_UPDATABLE_COLUMNS sunt vizualizări din DD ce conŃin informaŃii referitoare la coloanele vizualizărilor existente. 2. în cazul instrucŃiunii DELETE. job FROM vederea2 nume = 'Popescu'. prenume. rândurile unei vizualizări pot fi şterse numai dacă există un tabel în join protejat prin cheie şi numai unul (în caz contrar. UPDATE sau DELETE. Asupra unui join view pot fi aplicate instrucŃiunile INSERT. Este suficient ca. 1. Oracle nu va putea identifica unic înregistrarea care trebuie reactualizată). atunci când cheia tabelului este selectată. Ce efect vor avea aceste acŃiuni asupra tabelului de bază? CREATE VIEW vederea2 AS SELECT FROM INSERT INTO VALUES va genera eroarea: ORA-01400: cannot insert NULL into ("SCOTT". prenume. Nu se pot face inserari deoarece view-ul nu conŃine cheia primară! UPDATE SET WHERE SELECT vederea2 job = 'programator' nume = 'Popescu'. toate coloanele care pot fi reactualizate trebuie să corespundă coloanelor dintr-un tabel protejat prin cheie (în caz contrar. vederea2 ('Popescu'.'Valentin'.'grafician'). un tabel protejat prin cheie este un tabel ale cărui chei se păstrează şi la nivel de vizualizare. care pot fi reactualizate. să se actualizeze şi să se şteargă o înregistrare în acest view. în cazul instrucŃiunii UPDATE."SALARIAT". în cazul instrucŃiunii INSERT. aceasta să fie şi cheie a vizualizării. Oracle nu ar şti din care tabel să şteargă). doar dacă sunt îndeplinite următoarele condiŃii: • • instrucŃiunea LMD afectează numai unul dintre tabelele de bază."COD_SALARIAT") Actualizarea job-ului salariatului având numele "Popescu": nume. Pentru ca un tabel să fie protejat prin cheie nu este necesar ca tabelul să aibă toate cheile selectate în vizualizare. Să se insereze.

prenume. astfel: INSERT INTO VALUES DELETE WHERE vederea4 (cod_salariat. Exemplu: Să se creeze un view care conŃine câmpurile nume.'Popescu'. Să se creeze o vizualizare care să conŃină cod_salariat. Toate actualizările care se fac în view se fac şi în tabelele de bază.nume. Comanda pentru ştergerea unei înregistrări: va genera următoarea eroare: ORA-01752: cannot delete from view without exactly one key-preserved TABLE. updatable user_updatable_columns .OperaŃiile care se realizează asupra view-ului se realizează şi în tabelul salariat. nume. UPDATE SET WHERE vederea4 tip = 'designer' cod_salariat = 3. În cazul inserării unei înregistrări pentru care se specifică toate câmpurile: INSERT INTO vederea4 VALUES (30. 'Popescu').prenume. Apoi să se insereze. să se actualizeze şi să se şteargă o înregistrare din acest view (vizualizarea conŃine cheia primară cod_salariat din tabelele salariat şi grafician).'artist plastic'). job din tabelul salariat. prenume din tabelul salariat şi coloana tip din tabelul grafician. CREATE VIEW vederea21 AS SELECT nume. Pentru un caz mai general. Exemplu: Care dintre coloanele unei vizualizări sunt actualizabile? SELECT FROM column_name. când view-ul conŃine cheia externă a tabelului de bază. nume) (30.cod_salariat=g.cod_salariat. dacă acestea nu afectează cheia externă. job FROM salariat WHERE job = 'grafician' WITH CHECK OPTION. sunt permise modificări ale view-ului. vederea4 cod_salariat = 3. prenume. va apare următoarea eroare: ORA-01776: cannot modify more than one base TABLE through a join view Pot fi inserate date doar într-un tabel de bază (în oricare.cod_salariat. dar în unul singur) prin intermediul view-ului. CREATE VIEW vederea4 AS SELECT s. grafician g WHERE s.tip FROM salariat s.'Valentin'. Să se introducă în view doar persoanele care sunt graficieni. Modificarea unei înregistrări se face prin secvenŃa care urmează.

CREATE VIEW vederea3 (nr. actualizări sau ştergeri într-un view ce conŃine funcŃii grup. adresa.cod_contractant. Nu se pot face inserări. salariile medii şi numărul de angajaŃi din tabelul salariat. . Marmurei. Să se insereze.'Month dd. data_incheiere FROM contractant c. co.cod_contractant=co. După oricare din aceste operaŃii apare acelaşi mesaj: ORA-01732: data manipulation operation not legal on this view Exemplu: Să se creeze o vizualizare care să conŃină coloanele cod_contractant. pentru fiecare categorie de salariat. doar el poate fi modificat prin intermediul view-ului. 'Str. Singura operaŃie de inserare permisă este aceea efectuată prin specificarea cheilor provenind doar din tabelul contract. Aceasta. iar view-ul creat conŃine cheile primare din ambele tabele. AVG(salariu) FROM salariat GROUP BY job. Să se insereze o înregistrare în vizualizare. salmed) AS SELECT COUNT(*). data_incheiere din tabelul contract.yyyy')). se obŃine eroarea: ORA-01779: cannot modify a column which maps to a non key-preserved TABLE Cele două tabele de bază. cu aceeaşi valoare corespunzătoare câmpului cod_contractant (CP în contractant).2002'. prin executarea comenzii: INSERT INTO VALUES vederea44(nr_contract. job. adresa. contractant şi contract. table_name = 'vederea4'. se află într-o relaŃie “one-tomany”. 14'. Astfel. Să se creeze un view (vederea3) care să conŃină.WHERE Exemplu: 1. La inserarea unei înregistrări căreia i se specifică valorile tuturor câmpurilor din ambele tabele: INSERT INTO vederea44(cod_contractant. 2. Exact aceeaşi eroare se obŃine dacă încercăm inserarea unei înregistrări în vederea44. deoarece ar putea exista mai multe înregistrări în view. specificând fie şi numai un câmp provenind din tabela contractant (indiferent dacă el conŃine sau nu CP). tip_contract. nr_contract. TO_DATE('January 03. telefon. Doar tabelul contract este protejat prin cheie şi. tip_contract. tip_contract) ('6234'. telefon din tabelul contractant şi coloanele nr_contract. job. contract co WHERE c. data_incheiere) VALUES (200.cod_contractant. adresa. să se actualizeze şi să se şteargă o înregistrare în view. CREATE VIEW vederea44 AS SELECT c.nr_contract. '6235'. 0). prin urmare.

este creată o înregistrare. dar este modificat şi tabelul contract. OpŃiunea WITH READ ONLY asigură că nu pot fi efectuate operaŃii LMD asupra vizualizării. CREATE VIEW artist_roman AS SELECT * FROM artist WHERE nationalitate = 'romana' WITH CHECK OPTION CONSTRAINT artist_roman_ck. constrângerea va avea un nume implicit de forma SYS_Cn. OpŃiunea WITH CHECK OPTION nu poate funcŃiona dacă: • există o cerere imbricată în cadrul subcererii vizualizării sau în vreuna dintre vizualizările de bază. Prin urmare. numai inserarea sau actualizarea de linii accesibile acesteia (care sunt selectate de cerere). Dacă la inserŃie nu se specifică cheia primară din contract: INSERT INTO VALUES vederea44(tip_contract) (1). ORA-01400: mandatory (NOT NULL) column is missing or NULL during insert Cererea din definiŃia vizualizării poate fi restricŃionată prin clauzele WITH READ ONLY şi WITH CHECK OPTION. DELETE FROM viz_galerie WHERE cod_galerie = 10. Constrângerea WITH CHECK OPTION garantează faptul că va fi permisă. Încercarea de actualizare a unei linii prin instrucŃiunea anterioară va genera eroarea „ORA-01402: view WITH CHECK OPTION where-clause violation“. UPDATE artist_roman SET nationalitate = 'engleza' WHERE cod_artist = 25. CREATE VIEW viz_galerie AS SELECT cod_galerie. Exemplu: Să se creeze o vizualizare ce conŃine artiştii de naŃionalitate română. care au opere expuse în muzeu. prin intermediul vizualizării. nume_galerie FROM galerie WITH READ ONLY. Încercarea de ştergere a unei linii din vizualizarea viz_galerie determină . unde n este un număr întreg unic. În absenŃa acestei clauze. ştergere şi modificare se fac prin intermediul declanşatorilor INSTEAD OF. • operaŃiile de inserare. această opŃiune asigură constrângeri de integritate şi verificări asupra validităŃii datelor inserate sau actualizate. DefiniŃia vizualizării nu va permite modificarea naŃionalităŃii unui artist sau inserarea unui artist având altă naŃionalitate decât cea română. Exemplu: Să se creeze o vizualizare asupra tabelului galerie care să nu permită efectuarea nici unei operaŃii LMD. Cuvântul cheie CONSTRAINT permite numirea constrângerii WITH CHECK OPTION.

cod_artist. CREATE VIEW opera_artist AS SELECT o. PRIMARY KEY şi FOREIGN KEY. 'Janmot'). Se pot defini constrângeri la nivel de vizualizare. INSERT INTO opera_artist VALUES (200. SELECT COLUMN_NAME. Să se afle dacă este posibilă adăugarea unei noi înregistrări prin intermediul acestei vizualizări. a. UPDATABLE FROM USER_UPDATABLE_COLUMNS WHERE TABLE_NAME = 'OPERA_ARTIST'. .nume FROM opera o. InstrucŃiunea următoare afişează numele coloanelor şi valorile YES/NO. tabelul artist nu este key-preserved. nefiind permisă precizarea altor stări. după cum aceste coloane sunt. Dacă se încearcă modificarea sau inserarea unei linii prin intermediul unei vizualizări asupra căreia a fost definită o constrângere WITH READ ONLY. ale cărui coloane sunt modificabile. INSERT INTO opera_artist (cod_opera. Constrângerile asupra vizualizărilor pot fi definite numai în modul DISABLE NOVALIDATE. InstrucŃiunea următoare va genera eroarea „ORA-01776: cannot modify more than one base table through a join view“. Pot fi specificate explicit numai constrângerile UNIQUE. respectiv la nivel de coloană sau atribut. Constrângerea de tip CHECK poate fi realizată prin precizarea clauzei WITH CHECK OPTION în comanda care defineşte vizualizarea.cod_artist.cod_artist = a. 20). titlu. o. cod_galerie) VALUES (200.cod_opera. Aceste cuvinte cheie trebuie specificate la declararea constrângerii. precum şi codul galeriilor unde sunt expuse.apariŃia erorii „ORA-01752: cannot delete from view without exactly one keypreserved table“. artist a WHERE o.titlu. iar coloanele sale nu sunt modificabile. 'Poeme de l''ame'. 'Poeme de l''ame'. modificabile. Constrângeri asupra vizualizărilor Începând cu versiunea Oracle9i pot fi specificate constrângeri pentru vizualizări. Indexul primar al coloanei cod_artist din tabelul artist nu este unic în vizualizarea opera_artist. a. În schimb. 147. codul şi numele artiştilor care le-au creat. Exemplu: Să se creeze o vizualizare care conŃine codul şi titlul operelor de artă. server-ul Oracle generează eroarea „ORA-01733: virtual column not allowed here“. o. întrucât adaugă o înregistrare în tabelul de bază opera. sau nu. instrucŃiunea următoare va fi executată cu succes. 20.cod_galerie. Se va obŃine că doar primele trei coloane ale vizualizării sunt modificabile. Prin urmare. Constrângerile asupra vizualizărilor constituie o submulŃime a constrângerilor specifice tabelelor.

numele şi adresele galeriilor. O vizualizare materializată poate fi partiŃionată. nume_galerie. Definirea vizualizărilor materializate O vizualizare materializată. sunt transparente aplicaŃiilor SQL şi utilizatorilor. Optimizorul pe bază de costuri poate utiliza vizualizările materializate pentru a îmbunătăŃi execuŃia cererilor. cuvintele cheie SNAPSHOT şi MATERIALIZED VIEW sunt echivalente. UNIQUE şi FOREIGN KEY. Acesta recunoaşte automat situaŃiile în care o astfel de vizualizare poate şi trebuie să fie utilizată pentru rezolvarea unei cereri. calcula. Asupra unei vizualizări materializate se pot defini unul sau mai mulŃi indecşi. vizualizările materializate sunt utile pentru a calcula şi stoca date agregat. vizualizările materializate sunt utilizate pentru replicarea datelor la site-uri distribuite şi sincronizarea modificărilor efectuate pe diferite siteuri. optimizorul rescrie cererea utilizând vizualizarea materializată. Similar vizualizărilor obişnuite. De asemenea. Se va impune unicitatea valorilor coloanei adresa şi constrângerea de cheie primară pentru coloana corespunzătoare codului galeriei. acest tip de vizualizare este utilizat pentru a efectua cereri în care intervin operaŃii de compunere şi în care pot apărea agregări. se pot defini vizualizări materializate asupra unui tabel partiŃionat. Pentru compatibilitate cu versiunile anterioare.Exemplu: Să se creeze o vizualizare care conŃine codurile. Singura stare validă a unei constrângeri este DISABLE NOVALIDATE. precum totaluri sau medii aritmetice. DELETE. este un obiect al schemei ce stochează rezultatele unei cereri şi care este folosit pentru a rezuma. asupra celor materializate se pot defini constrângerile PRIMARY KEY. vizualizările materializate permit accesul local la date care. vizualizări sau alte vizualizări materializate. ar fi trebuit să fie accesate de la locaŃii distante. Astfel. cunoscută în versiunile anterioare sub numele de clişeu (snapshot). aceste obiecte sunt referite prin tabele master (în temeni de replicare) sau prin tabele detaliu (în termeni de data warehouse). . vizualizările materializate sunt similare indecşilor: • consumă spaŃiu de stocare. Spre deosebire de indecşi. îmbunătăŃesc performanŃa execuŃiei instrucŃiunilor SQL dacă sunt folosite pentru rescrierea cererilor. nume. CREATE VIEW viz_galerie( cod_gal. Din anumite puncte de vedere. adresa FROM galerie. Clauza FROM a cererii poate referi tabele. În mediile distribuite. UPDATE. altfel. În data warehouse. În urma unui asemenea demers. CONSTRAINT cp_viz PRIMARY KEY (cod_gal) DISABLE NOVALIDATE) AS SELECT cod_galerie. • • • trebuie reactualizate dacă datele din tabelele de bază sunt modificate. vizualizările materializate pot fi accesate utilizând instrucŃiuni SELECT şi pot fi actualizate prin instrucŃiunile INSERT. replica şi distribui date. Luate în ansamblu. adresa UNIQUE DISABLE NOVALIDATE. De asemenea.

Clauza OF permite crearea unei vizualizări materializate obiect. Clauza proprietăŃi_vm este utilă pentru descrierea vizualizărilor materializate care nu se bazează pe un tabel existent (nu sunt construite cu opŃiunea ON PREBUILT TABLE). Dacă este omisă clauza. SCOPE FOR ( {ref_coloana | ref_atribut} ) IS [schema. coloanelor din tabel. tabelul revine la statutul său iniŃial. sistemul va utiliza indexul implicit pentru ameliorarea vitezei de reactualizare incrementală a vizualizării materializate. MAXTRANS şi STORAGE ai indexului implicit care este utilizat de sistemul Oracle pentru a întreŃine datele vizualizării materializate.]tip_obiect] [ (constr_ref_domeniu) ] [ORGANIZATION INDEX clauza_tabel_org_index] [ {proprietăŃi_vm | ON PREBUILT TABLE [{WITH | WITHOUT} REDUCED PRECISION] } ] [ {USING INDEX [ {clauza_atribute_fizice | TABLESPACE nume_sp_tabel} [ {clauza_atribute_fizice | TABLESPACE nume_sp_tabel} ] …] | USING NO INDEX} ] [refresh_vm] [FOR UPDATE] [ {DISABLE | ENABLE} QUERY REWRITE] AS subcerere.]nume_tabel_scope] … Clauza poate fi utilizată pentru restricŃionarea domeniului referinŃelor la tabelul nume_tabel_scope. Pentru o vizualizare materializată de acest tip. Pentru a impune respectarea întocmai a preciziei. Clauza WITH REDUCED PRECISION permite ca precizia coloanelor tabelului sau vizualizării materializate să nu coincidă cu precizia coloanelor returnate de subcerere. În acest tabel sunt stocate instanŃe de obiecte care au acelaşi tip ca şi coloana REF. La ştergerea acestei vizualizări. Tabelul trebuie să aibă acelaşi nume şi să se afle în aceeaşi schemă ca vizualizarea materializată rezultată. pentru o vizualizare materializată nu poate fi specificată opŃiunea ORGANIZATION EXTERNAL. Clauza TABLESPACE specifică spaŃiul tabel în care urmează să fie creată vizualizarea materializată. Spre deosebire de tabele. OpŃiunea ON PREBUILT TABLE permite considerarea unui tabel existent ca fiind o vizualizare materializată predefinită. Valorile dintr-o coloană de tip REF vor adresa obiecte din tabelul identificat prin nume_tabel_scope.CREATE MATERIALIZED VIEW [schema. sintaxa dispune de opŃiunea WITHOUT REDUCED PRECISION. vizualizarea va fi creată în spaŃiul tabel implicit al schemei care o conŃine. Clauza USING INDEX permite stabilirea de valori ale parametrilor INITRANS. Sintaxa clauzei constr_ref_domeniu este următoarea: SCOPE FOR ( {ref_coloana | ref_atribut} ) IS [schema. care este implicită. Atributele fizice au o semantică asemănătoare celei descrise de clauza_proprietăŃi_fizice din cadrul comenzii CREATE TABLE.]nume_tabel_scope [.]nume_viz_materializată [OF [schema. ca număr şi tip de date. . alias-urile de coloană din clauza subcerere trebuie să corespundă. În absenŃa acesteia.

OpŃiunea IMMEDIATE este implicită. care se realizează prin reexecutarea completă a cererii din definiŃia vizualizării materializate. În acest ultim caz. REFRESH_ALL_MVIEWS. prin intermediul procedurilor specifice din pachetul DBMS_MVIEW (REFRESH. Prin refresh_vm se specifică metodele. Tabelul master trebuie să conŃină o constrângere PRIMARY KEY. clauza_paralelism. vizualizarea nu va putea fi utilizată în rescrierea cererilor. {REFRESH [ {FAST | COMPLETE | FORCE} ] [ON {DEMAND | COMMIT} ] [START WITH data] [NEXT data] [ WITH {PRIMARY KEY | ROWID} ] | USING {DEFAULT [ {MASTER | LOCAL} ] ROLLBACK SEGMENT | [ {MASTER | LOCAL} ] ROLLBACK SEGMENT nume_segm_anulare } [ {DEFAULT [ {MASTER | LOCAL} ] ROLLBACK SEGMENT | [ {MASTER | LOCAL} ] ROLLBACK SEGMENT nume_segm_anulare}…] } | NEVER REFRESH} OpŃiunea FAST indică metoda de reactualizare incrementală. Pe lângă acestea. Clauza FORCE este implicită şi presupune reactualizarea de tip FAST. Clauza WITH PRIMARY KEY este implicită şi permite ca tabelele master să fie reorganizate fără a afecta eligibilitatea vizualizării materializate pentru reactualizarea de tip FAST. care se efectuează corespunzător modificărilor survenite în tabelele master. Clauza COMPLETE implică reactualizarea completă. OpŃiunea nu poate fi specificată pentru vizualizări materializate obiect. poate fi menŃionată opŃiunea BUILD IMMEDIATE | DEFERRED care determină introducerea de linii în vizualizarea materializată imediat. se menŃionează: clauza_partiŃionare_tabel. REFRESH_DEPENDENT). Clauza nu este permisă pentru vizualizările materializate ce conŃin tipuri obiect. Modificările sunt stocate într-un fişier log asociat tabelului master. Clauza USING ROLLBACK SEGMENT specifică segmentul de anulare distant . până la prima operaŃie de reactualizare. Expresiile de tip dată calendaristică indicate în cadrul acestor opŃiuni specifică momentul primei reactualizări automate şi determină intervalul dintre două reactualizări automate consecutive. modurile şi momentele la care sistemul va reactualiza vizualizarea materializată. Clauza ON DEMAND este implicită şi indică efectuarea reactualizării vizualizării materializate la cererea utilizatorului. reactualizarea va fi de tip COMPLETE.Dintre proprietăŃile care pot fi specificate în această clauză. OpŃiunile START WITH şi NEXT nu pot fi specificate dacă s-au precizat clauzele ON COMMIT sau ON DEMAND. Clauza ON COMMIT indică declanşarea unei operaŃii de reactualizare de tip FAST ori de câte ori sistemul permanentizează o tranzacŃie care operează asupra unui tabel master al vizualizării materializate. În caz contrar. CACHE sau NOCACHE. OpŃiunea WITH ROWID asigură compatibilitatea cu tabelele master din versiunile precedente lui Oracle8. dacă este posibil. respectiv la prima operaŃie de reactualizare (refresh).

artist a.titlu. Acesta va fi utilizat ca tabel sumar preexistent în crearea unei vizualizări materializate ce va permite diferenŃe de precizie şi rescrierea cererilor. Dacă în clauza FROM a cererii din definiŃia vizualizării materializate se face referinŃă la o altă vizualizare materializată. Reactualizările ulterioare ale acestei vizualizări se vor realiza prin reexecutarea cererii din definiŃie. CREATE MATERIALIZED VIEW opera_artist_polite BUILD IMMEDIATE REFRESH COMPLETE ENABLE QUERY REWRITE AS SELECT o. nume VARCHAR2(15). Clauza FOR UPDATE permite actualizarea unei vizualizări materializate. numele artistului şi suma valorilor poliŃelor de asigurare încheiate. OpŃiunea LOCAL este implicită.titlu.valoare) suma_polite FROM opera o. a. suma_polite NUMBER). SUM(p. trebuie efectuată o operaŃie ALTER MATERIALIZED VIEW…REFRESH. QUERY REWRITE permite specificarea faptului că vizualizarea materializată este eligibilă pentru operaŃia de rescriere a cererilor.cod_opera = p.care urmează să fie utilizat pentru reactualizarea vizualizării materializate. artist a.cod_opera. CREATE TABLE opera_artist_polite( titlu VARCHAR2(25). a. polita_asig p WHERE o. b) Să se creeze tabelul opera_artist_polite. o. polita_asig p .titlu. a. atunci aceasta va trebui reactualizată întotdeauna înaintea celei create în instrucŃiunea curentă. OpŃiunile MASTER şi LOCAL specifică segmentul de anulare distant care urmează să fie utilizat pe site-ul distant pentru vizualizarea materializată individuală.cod_artist AND o. Vizualizarea creată va putea fi aleasă pentru rescrierea cererilor. Clauza NEVER REFRESH previne reactualizarea vizualizării materializate prin mecanisme Oracle sau prin proceduri.nume. OpŃiunea AS specifică cererea care defineşte vizualizarea materializată.cod_opera GROUP BY o. Pentru a permite reactualizarea. SUM(p. respectiv pentru grupul local de reactualizare care conŃine vizualizarea materializată.nume. Cuvântul cheie DEFAULT determină ca sistemul să aleagă acest segment în mod automat.cod_artist = a.valoare) suma_polite FROM opera o.nume. CREATE MATERIALIZED VIEW opera_artist_polite ON PREBUILT TABLE WITH REDUCED PRECISION ENABLE QUERY REWRITE AS SELECT o. Exemplu: a) Să se creeze şi să se completeze cu înregistrări o vizualizare materializată care va conŃine titlul operelor de artă.

Pentru reactualizarea de tip FAST.WHERE o. permite reorganizarea acestuia şi este reactualizată la momentul creării. • activarea sau dezactivarea funcŃiei de rescriere a cererilor. În cazul modificării conŃinutului tabelelor master ale vizualizării materializate. eligibilă pentru rescrierea cererilor. modului sau timpului de reactualizare (refresh). prin opŃiunile ENABLE şi DISABLE. înainte de crearea vizualizării se va lansa următoarea comandă: CREATE MATERIALIZED VIEW LOG ON artist. modurilor şi timpului implicit de reactualizare automată.cod_opera. Clauza QUERY REWRITE. într-unul din următoarele sensuri: • modificarea caracteristicilor de stocare. Clauza alter_vm_refresh permite modificarea metodelor.nume. ALTER MATERIALIZED VIEW [ schema. OpŃiunea USING INDEX modifică parametrii de stocare asociaŃi indexului folosit de sistem pentru a întreŃine datele vizualizării materializate. sau nu. datele din vizualizare trebuie reactualizate astfel încât să reflecte datele existente.]nume_viz_materializată [atribute_fizice] [USING INDEX atribute_fizice] [ {REBUILD | alter_vm_refresh} ] [ { {ENABLE | DISABLE} QUERY REWRITE | COMPILE | CONSIDER FRESH} ]. Clauza REBUILD permite regenerarea operaŃiilor de reactualizare atunci când se modifică un tip care este referit în vizualizarea materializată. • modificarea metodei. Comanda ALTER MATERIALIZED VIEW permite intervenŃia asupra unei vizualizări materializate. iar apoi la fiecare 5 minute. dar nu este eligibilă pentru rescrierea cererilor. Clauza este utilă pentru revalidarea explicită a vizualizării materializate. o.cod_opera = p.cod_opera GROUP BY o. determină ca vizualizarea materializată să fie. CREATE MATERIALIZED VIEW artist_vm REFRESH FAST START WITH SYSDATE NEXT SYSDATE + 1/288 WITH PRIMARY KEY AS SELECT * FROM artist.cod_artist AND o. Dacă un obiect de care depinde vizualizarea materializată este suprimat sau modificat. vizualizarea rămâne accesibilă. InstrucŃiunea precedentă generează eroarea „ORA-23413: table “artist” does not have a materialized view log“. a. OpŃiunea CONSIDER FRESH indică sistemului să considere vizualizarea . astfel încât aceasta să devină eligibilă în operaŃia de rescriere a cererilor. astfel încât să devină un alt tip de vizualizare materializată. Pentru remedierea acestei situaŃii. • modificarea structurii. Specificarea acestei opŃiuni interzice utilizarea altor clauze în aceeaşi instrucŃiune ALTER MATERIALIZED VIEW.cod_artist = a. Clauza COMPILE permite revalidarea explicită a vizualizării materializate. este necesar un fişier log în care să fie stocate modificările. c) Să se creeze o vizualizare materializată care conŃine informaŃiile din tabelul artist.titlu.

relativ la una sau mai multe coloane. Grupări Cluster-ul este o regrupare fizică a două sau mai multe tabele. Crearea unui cluster presupune: • • • crearea structurii cluster-ului. absenŃa indexului afectează utilizatorul – datele cluster-ului nu sunt accesibile).materializată ca fiind reactualizată şi deci eligibilă pentru rescrierea cererilor. iar intervalul de timp la care se realizează reactualizarea să fie de 7 zile. Exemplu: Să se modifice vizualizarea materializată opera_artist_polite creată anterior. specificare a coloanelor care compun cheia cluster-ului. crearea indexului cluster-ului. atunci blocurile sunt înlănŃuite. Un index al cluster-ului se deosebeşte de un index al tabelului (de exemplu. specificare a spaŃiului de stocare (opŃional). Dacă liniile asociate unei aceiaşi valori a cheii cluster-ului necesită un spaŃiu de mai multe blocuri. Coloanele comune definite pentru cluster. reprezintă cheia cluster-ului şi criteriul de regrupare. Coloanele comune definesc cheia cluster-ului. astfel încât metoda de reactualizare implicită să fie de tip FAST. ALTER MATERIALIZED VIEW opera_artist_polite REFRESH FAST NEXT SYSDATE + 7 DISABLE REWRITE. cu scopul măririi performanŃelor.nume_coloana tip_data] …) [SIZE n] . Nu va fi permisă utilizarea acestei vizualizări pentru rescrierea cererilor. QUERY Pentru că nu se specifică valoarea corespunzătoare opŃiunii START WITH în clauza REFRESH.]nume_viz_materializată. crearea tabelelor care vor compune cluster-ul. Sistemul va reactualiza vizualizarea evaluând expresia din clauza NEXT. Un cluster este un obiect al bazei care necesită: • • • • un nume unic la nivelul schemei. iar apoi va executa această operaŃie o dată pe săptămână. Un cluster trebuie să aibă cel puŃin un index. următoarea reactualizare va avea loc la momentul stabilit prin comanda de creare a vizualizării materializate sau prin ultima comandă de modificare a acesteia. Acest index trebuie creat înaintea oricărei comenzi LMD care va acŃiona asupra tabelelor cluster-ului. Liniile diferitelor tabele sunt regrupate în interiorul aceluiaşi bloc urmărind cheia cluster-ului. Crearea unui cluster se realizeaza prin comanda: CREATE CLUSTER nume_cluster (nume_coloana tip_data [. un index (relativ la cheia cluster-ului). DROP MATERIALIZED VIEW [schema.

DROP TABLE carte.Există două modalităŃi pentru introducerea unui tabel într-un cluster. În acest caz. în afara cluster-ului. CREATE TABEL domino CLUSTER cdoml(coded) AS SELECT * FROM domeniu. CREATE TABEL carticica CLUSTER cdoml(coded) AS SELECT * FROM carte. nu se poate asocia un cluster unui tabel care există! A doua variantă presupune că introducerea tabelului în cluster se face în momentul creării structurii tabelului (comanda CREATE TABLE). CREATE TABLE carte (codel CHAR(5) NOT NULL.crearea spatiului CREATE TABLE domeniu (coded CHAR(1) NOT NULL. Un alt tip de cluster oferit de Oracle este cluster-ul hash. CREATE TABLE alfa AS SELECT * FROM domeniu. se suprimă cluster-ul. CREATE TABLE beta AS SELECT * FROM carte.. prin duplicarea celui vechi. se distruge tabelul din cluster. ALTER TABLE carte MODIFY coded NOT NULL. RENAME carticica TO carte. pentru a accesa o înregistrare. CREATE INDEX indcom ON CLUSTER cdoml. RENAME alfa TO domeniu. . DROP CLUSTER cdoml. cluster-ul hash nu foloseşte un index. Varianta 1 CREATE CLUSTER cdoml(cdom CHAR(1)). • • O primă variantă presupune că cluster-ul este creat pentru un tabel care deja există. DROP TABLE carte. DROP TABLE domeniu. Pentru a scoate un tabel dintr-un cluster sunt parcurse următoarele etape: se creează un nou tabel. De fapt. RENAME beta TO carte. CREATE INDEX indcom ON CLUSTER cdoml. DROP TABEL domeniu. RENAME domino TO domeniu. … coded CHAR(1) NOT NULL) CLUSTER cdoml(coded). Varianta 2 CREATE CLUSTER cdoml(cdom CHAR(1)). ) CLUSTER cdoml(coded). -. intdom CHAR() . ci o funcŃie numerică.. ExerciŃiu: Să se obŃină un cluster referitor la lista cărŃilor din fiecare domeniu.

alte informaŃii generale despre baza de date. apelurile telefonice efectuate de un client într-o lună vor fi facturate împreună. status) Vizualizările cele mai importante ale dicŃionarului datelor conŃin: • • • • descrierea tabelelor definite de utilizatori (USER_ALL_TABLES). informaŃii despre constrângerile definite de utilizator(USER_CONSTRAINTS). DROP CLUSTER nume_cluster INCLUDING TABLES CASCADE CONSTRAINTS. spaŃiul alocat şi spaŃiul utilizat în prezent de obiectele schemei.numită funcŃia hash. Modificarea unui cluster permite redefinirea condiŃiilor. last_ddl_time. timestamp. numele utilizatorilor bazei. Tabelul USER_OBJECTS conŃine informaŃii despre toate obiectele definite de utilizatorul curent. Suprimarea unui cluster din baza de date se face prin comanda: DROP CLUSTER nume_cluster În urma ştergerii unui cluster. modificarea parametriilor de stocare şi a caracteristicelor de stare (ALTER CLUSTER). created. • • • • • • Tabelul USER_CATALOG conŃine informaŃii despre tabelele şi vizualizările definite de un utilizator particular. Apelurile pot fi depozitate într-un cluster hash a cărui cheie este formată din coloanele ce conŃin numărul telefonului. SecvenŃa următoare suprimă: cluster-ul. erorile curente ale obiectelor depozitate (USER_ERRORS). Tabelul are următoarea schemă relaŃională: USER_OBJECTS (object_name. object_id. privilegiile şi rolurile acordate fiecărui rol. . Dintre ele se remarcă: definiŃiile tuturor obiectelor din baza de date. object_type. De exemplu. informaŃii despre legăturile bazei de date (USER_DB_LINKS). InformaŃii despre obiectele bazei de date Pot fi obŃinute consultând DD(Dicționarul de Date). FuncŃia are ca parametru cheia cluster-ului şi returnează o anumită valoare (valoare hash). Această valoare corespunde blocului de date din cluster pe care Oracle îl va citi sau scrie pe baza comenzii executate. Acest tabel poate fi referit şi prin sinonimul său public CAT. anul şi luna în care a avut loc convorbirea. tabelele pe care acesta le conŃine nu mai sunt grupate. constrângerile de integritate. toate tabelele definite relativ la acest cluster şi constrângerile lor de integritate.

b. c. INTEGER b. Tipurile de date pentru caractere a. Oferă un set de comportamente utile pentru utilizatorii bazei c. Determină completarea coloanelor până la lungimea maximă maximă e. Stochează valori exacte sau aproximative e. FLOAT d. USER_CONS_COLUMNS – informaŃii despre constrângeri la nivel coloană. Tipurile numerice standard includ a. informaŃii despre tabelele utilizatorului (USER_TABLES) etc. BOOLEAN e. Tipurile de date temporale standard includ a.• • • • • • • informaŃii despre indecşii creaŃi de utilizator (USER_INDEXES). Acceptă atât date cu lungime fixă. 1. USER_TAB_COMMENTS – informaŃii despre comentarii la nivel tabel. Sunt mai flexibile decât tipurile de date numerice b. Sunt potrivite pentru a fi folosite în calcule 4. Întrebări AlegeŃi răspunsurile corecte pentru fiecare din următoarele întrebări cu răspunsuri multiple. USER_TAB_PARTITIONS – informaŃii despre partiŃiile tabelelor. Ajută sistemul DBMS să stocheze mai eficient datele din coloane 2. cât şi date cu lungime variabilă. Tipurile de date oferă următoarele avantaje a. b. c. NUMBER c. DATETIME DATE TIMESTAMP a. cum ar fi virgulele şi simbolul dolar c. Necesită întotdeauna specificarea preciziei şi a scalei d. Vizualizările din dicŃionarul datelor referitoare la tabele conŃin: USER_TAB_COLUMNS|COLS – informaŃii despre coloanele tabelelor. USER_COL_COMMENTS – informaŃii despre comentarii la nivel coloană. INTERVAL 5. . Necesită întotdeauna specificarea preciziei şi a scalei d. Pot stoca şiruri de caractere în format specific unei limbi naŃionale 3. RestricŃionează datele din coloane la caractere care au sens în context e. Asigură independenŃa faŃă de date d. ReŃineŃi că întrebările pot avea mai multe răspunsuri corecte. Respectă standardele publicate b. Tipurile de date numerice Sunt mai flexibile decât tipurile de date pentru caractere RestricŃionează valorile din coloane la numere şi simboluri înrudite.

Trebuie să fie specificat în instrucŃiunea CREATE TABLE b. Poate referi una sau mai multe coloane b. Numele tabelului b. Poate fi folosit într-un singur index e. DEFAULT (precizie. restricŃie la nivel de tabel d. Valorile NULL a. Specifieă întotdeauna numele proprietarului bazei de date d. Foloseşte o sintaxă identică sau aproape identică cu cea a unei restricŃii de acelaşi tip la nivel de tabel d. Trebuie să fie unic în cadrul tabelului d. Poate fi inclusă într-o instrucŃiune CREATE TABLE sau ALTER TABLE c. FuncŃionează la fel cu instrucŃiunea CREATE SCHEMA 9. INSERT e.) e. UPDATE 8. Sunt egale cu alte valori NULL d. Are o sintaxă care diferă de la un tip de restricŃie la altul 12. FuncŃionează exact la fel în toate sistemele DBMS relaŃionale b. InstrucŃiunile DDL includ a. Sintaxa corectă pentru o restricŃie NOT NULL este a. TIMEZONE e. Numele coloanei c. DEFAULT (expresie) d. CREATE b. Numele unei coloane dintr-un tabel a. Pot fi folosite pentru reprezentarea datelor care lipsesc sau nu sunt cunoscute b. nume_coloană tip--de–date IS NOT NULL b. Poate include parametri specifici producătorului e. Înseamă acelaşi lucru ca şi spaŃiile libere c. Sintaxa corectă pentru clauza DEFAULT este a. scală) b. Poate fi folosită oriunde ar putea fi folosită o restricŃie la nivel de tabel e. InstrucŃiunea CREATE DATABASE a. Trebuie să fie unic în cadrul bazei de date c. DEFAULT [NULL | NOT NULL] c. clauză DEFAULT e. DEFAULT [UNIQUE | PRIMARY KEY] 13. Specifieă întotdeauna numele bazei de date c.d. Trebuie să fie specificat în instrucŃiunea ALTER TABLE 11. TIME 6. Nu sunt egale cu alte valori NULL e. DefiniŃia unei coloane din instrucŃiunea CREATE TABLE poate include a. nume_coloană tip–de–date NOT NULL . DEFAULT (nume–coloană) REFERENCES name–tabel (nume_coloană. Sunt întotdeauna permise în mod prestabilit 7. ALTER c. DELETE d. O restricŃie la nivel de coloană a. O clauză NULL sau NOT NULL 10.

O instrucŃiune ALTER TABLE nu poate fi folosită pentru a. Poate include cuvintele cheie ASC sau DESC pentru orice coloană e. DEFAULT UNIQUE (nume_coloană) d. Schimbarea unei restricŃii din NULL în NOT NULL pentru o coloană care conŃine valori nule d. Poate include cuvântul cheie opŃional CASCADE c. coloană dintr-un tabel e. DEFAULT [UNIQUE | PRIMARY KEY] 15. nume–coloană REFERENCES NOT NULL 14. vizualizare c. Eliminarea unei chei primare dacă există chei exteme care referă cheia primară 20. Instructiunea CREATE VIEW a. nume_coloană REFERENCES UNIQUE nume_tabel 16. nume_coloană REFERENCES UNIQUE nume_tabel e. Adăugarea unei chei primare 19. Redenumirea unui tabel d. FOREIGN KEY nume_coloană REFERENCES nume_tabel (nume_coloană) d. Trebuie să conŃină o instrucŃiune SELECT validă 18. InstrucŃiunea CREATE INDEX a. Un index c. REFERENCES nume—tabel (nume_coloană) e. InstrucŃiunea DROP poate fi folosită pentru a şterge a. [CONSTRAINT nume—restricŃie] UNIQUE (nume_coloană) b. Poate include cuvântul cheie UNIQUE c. Trebuie să refere două sau mai multe nume de coloane d. Poate specifica ordinea ascendentă sau descendentă pentru una sau mai multe coloane 17. Trebuie să conŃină o comandă DMI. Eliminarea unei chei exteme care referă o cheie primară e. Eliminarea unei chei primare e.DEFAULT [NULL | NOT NULL] d. Sintaxa corectă pentru o restricŃie referenŃială este a. Schimbarea tipului de date al unei coloane la un tip numeric dacă în coloana respectivă există date de alt tip b. CREATE NOT NULL INDEX ON nume_coloană e. Modificarea lungimii sau a preciziei coloanelor c. Redenumirea unei coloane c. Sintaxa corectă pentru o restricŃie UNIQUE este a. Poate fi folosită pentru crearea restricŃiilor de unicitate şi cheie primară b. Poate include cuvântul cheie opŃional OR REPLACE d. Un tabel d. Stochează o interogare în baza de date b. [CONSTRAINT nume—restricŃie] REFERENCES nume_tabel c. restricŃie referenŃială b. Adăugarea coloanelor b. [CONSTRAINT nume—restricŃie] REFERENCES nume_index b. [CONSTRAINT nume—restricŃie] UNIQUE (nume_tabel) c. validă e. Utilizările valide ale instrucŃiunii ALTER TABLE includ a. .

este returnat sub forma unui tabel. Dacă se doreşte un alt nume pentru coloanele unei interogări se folosesc pseudonime. Pseudonimele nu există decât după rularea instrucŃiunii SQL. astfel încât acestea să fie prelucrate de o anumită aplicaŃie sau să fie afişate. În SQL. M P A A_ RATING_COD AS RATING. adică pseudonime pentru tabele sau vizualizări definite în baza de date. aşa că nu pot fi folosite în alte părŃi ale instrucŃiunii SQL. SELECT COD_GEN_FILM. cu o listă de una sau mai multe coloane care vor fi folosite pentru sortarea rândurilor în ordine ascendentă sau descendentă. M P A A_ RATING_COD şi TITLU_FILM din tabelul FILM. SELECT COD_GEN_FILM AS GEN. nu şi modul lor de obŃinere. urmat de numele dorit pentru a fi atribuit coloanei în setul de rezultate. Pseudonimele (aliases) specificate devin numele coloanelor din setul de rezultate. Cuvântul cheie DISTINCT poate fi adăugat după cuvântul cheie SELECT pentru a elimina rândurile duplicate din rezultatele interogării. numit şi set de rezultate. care este cea mai folosită pentru a obŃine date din baza de date.Specifică lista de coloane care urmează să fie returnate în setul de rezultate. se specifică rezultatele pe care le doriŃi să le obŃineŃi. Pseudonime pentru numele coloanelor In setul de rezultate din interogări numele coloanelor din tabel apare automat ca titlu de coloane în interogare. Limbajul de interogare a datelor(DQL) Limbajul SQL de interogare a datelor (DQL – Data Query Language) include o singură comandă SELECT. acest lucru este făcut prin adăugarea în instrucŃiunea SELECT a clauzei ORDER BY. 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. Deoarece SQL este un limbaj neprocedural. Rezultatul unei instrucŃiuni SELECT. În exemplul următor se selectează coloanele: C O D_ GE N_ F ILM . FROM . Pseudonimul unei coloane este specificat prin plasarea cuvântului cheie ”AS" după numele coloanei în lista SELECT (cu cel puŃin un spaŃiu înainte şi după). De asemenea. în conformitate cu valorile datelor din coloane. COD_ RATING. În locul numelor reale ale tabelelor sau vizualizărilor se poate folosi sinonime. TITLU_FILM FROM FILM.Specifică lista tabelelor sau vizualizărilor din care urmează să fie selectate datele.LecŃia 3. separate prin virgule. se Ńine seama de următoarele aspecte: . Se poate folosi simbolul asterisc (*) în locul listei de coloane pentru a selecta toate coloanele dintr-un tabel sau dintr-o vizualizare. TITLU_FILM FROM FILM. InstrucŃiunea SELECT de bază Forma elementară a instrucŃiunii SELECT conŃine două clauze: SELECT [DISTINCT] .

aşa că majoritatea sistemelor SGBD folosesc un index pentru accesul la rânduri în ordinea dorită. În locul coloanelor. COD_GEN_FILM AS GEN. 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. În rezultatele interogării sunt afişate numai rândurile pentru care clauza WHERE este evaluată la valoarea logică „adevărat". Se poate folosi pseudonimele coloanelor în clauza ORDER BY. fără să-şi dea seama că astfel schimbă şi coloanele folosite pentru sortarea rezultatelor.2 va sorta rezultatele în ordine ascendentă după primele două coloane din setul de rezultate. evaluând clauza WHERE pentru fiecare rând de date. şi fac o sortare propriu-zisă numai ca ultimă soluŃie. Motorul SQL din SGBD va găsi cea mai bună cale de ordonare a coloanelor. De exemplu. nu mai prescurtează. O interogare fără o clauză WHERE returnează un set de rezultate care conŃine toate rândurile din tabelele sau vizualizările referite în clauza FROM. În noua versiune de SQL produs de Oracle. dar dacă se face acest lucru se forŃează motorul SQL să sorteze rezultatele abia după rularea interogării. clauza ORDER BY 1. Nu este obligatoriu ca numele coloanelor din lista ORDER BY să fie incluse şi în lista de rezultate (adică în lista SELECT). COD_GEN_FILM DESC. COD_GEN_FILM AS GEN. TITLU_FILM FROM FILM ORDERBY MPAA_ RATING_COD ASC. . Dacă este inclusă o clauză WHERE. Numărul specificat nu are nici o legătură cu poziŃia coloanei în tabelul sau vizualizarea sursă. se poate specifica în lista de ordonare poziŃia relativă a coloanelor.Ordinea prestabilită pentru fiecare coloană este ascendentă. Utilizarea clauzei WHERE pentru filtrarea rezultatelor SQL foloseşte clauza WHERE pentru a filtra rândurile ce urmează să fie afişate. deoarece dacă ulterior cineva modifică interogarea. COD_GEN_FILM Dacă dorim să ordonăm acum crescător după rating şi descrescător după gen. SELECT M P AA _ RATING_COD AS RATING. Operatori de comparare Operatorii de comparare sunt folosiŃi în clauza WHERE pentru compararea a două valori. ObservaŃie: Oracle va afişa titlu de coloana la dimensiunea maximă a valorilor din coloana(de ex. sortarea datelor este un proces costisitor din punct de vedere al resurselor de calcul. atunci instrucŃiunea de mai sus odificată va fi SELECT M P AA _ RATING_COD AS RATING. este posibil să amestece coloanele din lista SELECT. interogarea va afişa RATIN). presupunând că există. iSQL*Plus. sunt folosite regulile algebrei booleene. având ca rezultat o valoare logică de „adevărat" sau „fals". dacă în coloana RATING val cea mai mare este de 5 caractere. Această opŃiune nu este agreată în programarea SQL formală. În general. TITLU_FILM FROM FILM ORDERBY MPAA_ RATING_COD.

TITLU_FILM FROM FILM WHERE M P AA _ RATING_COD = 'PG-13' ORDER BY TITLU_FILM. în ordinea crescătoare a preŃurilor. Să se afişeze toate filmele cu preŃul de vânzare cu amănuntul pentru formatul DVD (DVD Retail Price) mai mic de 19. valori ale unor coloane din baza de date sau combinaŃii ale celor două.00. SELECT PRET_VANZARE_DVD. TITLU_FILM FROM FILM WHERE PRET_VANZARE_DVD <= 19. SELECT PRET_VANZARE_DVD.99 ORDER BY PRET_VANZARE_DVD DESC.99 ORDER BY PRET_VANZARE_DVD DESC.00 ORDER BY PRET_VANZARE_DVD DESC. TITLU_FILM FROM FILM WHERE PRET_VANZARE_DVD < 19.99. Să se afişeze toate filmele cu preŃul de vânzare cu amănuntul pentru formatul DVD (DVD Retail Price) mai mare de 25. SELECT M P AA _ RATING_COD AS RATING. Să se afişeze filmele cu preŃul de vânzare cu amănuntul pentru formatul DVD (DVD Retail Price) de 19. 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) . SELECT COD_RATING AS RATING. Operatorii de comparare care pot fi folosiŃi în clauza WHERE sunt prezentaŃi în tabelul următor: Operator = < <= > >= != <> Exemple: Să se afişeze toate filmele pentru care RATING are valoarea PG-13. TITLU_FILM FROM FILM WHERE PRET_VANZARE_DVD >= 25. în ordinea descrescătoare a preŃurilor. Să se afişeze pentru care RATING are altă valoare decât PG-13.99 sau mai mic. FILM FROM FILM WHERE COD_RATING <> 'PG-13' ORDER BY TITLU_FILM.Cele două valori comparare pot fi constante furnizate în clauza WHERE. SELECT PRET_VANZARE_DVD.

SELECT COD_RATING AS RATING. Atunci când sunt folosite mai multe condiŃii.Operatori conjunctivi Uneori sunt necesare condiŃii multiple pentru a îngusta setul de rezultate al unei interogări. Lucrurile devin complicate dacă operatorii AND şi OR sunt combinaŃi în aceeaşi clauză WHERE. este evaluat înaintea operatorilor OR. PRET_VANZARE_DVD AS PRET. TITLU_FILM FROM FILM WHERE COD_GEN_FILM= 'ActAd' OR COD_GEN_FILM = 'Drama' AND COD_RATING = 'PG-13' ORDER BY COD_GEN_FILM. 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.99 ORDER BY PRET_VANZARE_DVD. OR (SAU) . ele trebuie să fie combinate din punct de vedere logic în clauza WHERE. COD_RATING. SELECT COD_GEN_FILM AS GEN. SELECT COD_RATING AS RATING.Clauza WHERE este evaluată ca „adevărată" dacă toate condiŃiile conectate cu operatorul AND sunt adevărate. în ordinea crescătoare a preŃurilor. TITLU_FILM FROM FILM WHERE COD_RATING = 'PG-13' AND PRET_VANZARE_DVD <= 19. . Să se adauge parantezele necesare. Operatorul AND are prioritate mai mare şi. Aceşti operatori sunt: AND (ŞI) .Clauza WHERE este evaluată ca „adevărată" dacă oricare din condiŃiile conectate cu operatorul OR este adevărată. ca urmare. Să se afişeze toate filmele pentru care categoria RATING este PG-13 şi sunt din genul dramă sau acŃiune/aventură.99 sau mai mic. PRET_VANZARE_DVD AS PRET. Exemple de folosire a operatorilor conjunctivi: Să se afişeze toate filmele pentru care categoria RATING este PG-13 şi preŃul de vânzare cu amănuntul pentru formatul DVD este 19. în ordinea crescătoare a preŃurilor. SELECT COD_RATING AS RATING.99 sau mai mic. astfel încât să obŃinem filmele cu categoria PG-13 şi genul acŃiune/aventură sau dramă. 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. iar aceasta este sarcina operatorilor conjunctivi.

ordonate crescător după preŃ.99 ORDER BY PRER_VANZARE_DVD. . pentru a inversa valoarea logică a comparaŃiei.99. PRET_VANZARE_DVD FORM FILM WHERE PRER_VANZARE_DVD BETWEEN 14. SELECT TITLU_FILM.99. PRET_VANZARE_DVD FROM FILM WHERE PRET_VANZARE_DVD NOT BETWEEN 14. SELECT TITLU_FILM.99 AND 19. ordonate crescător după preŃ.99 ORDER BY PRET_VANZARE_DVD. La oricare dintre aceşti operatori poate fi adăugat cuvântul cheie NOT. Să se afişeze toate filmele pentru care preŃul de vânzare cu amănuntul pentru formatul DVD nu este în intervalul 14. COD_RATING.99 şi 19. IS NULL Operatorul IS NULL este folosit pentru a determina dacă o valoare este nulă.99-19. ceea ce înseamnă că include şi valori specificate. fiind un interval inclusiv. Să se găsească toate conturile inactive. TITLU_FILM FROM FILM WHERE (COD_GEN_FILM = 'ActAd' OR COD_GEM_FILM = 'Drama') AND COD_RATING='PG-13' ORDER BY COND_GEN_FILM. Exemple: Să se afişeze toate filmele cu preŃul de vânzare cu amănuntul pentru formatul DVD între 14. Intervalul este specificat folosind o valoare minimă şi o valoare maximă. adică toate conturile pentru care coloana DATA–TERMINATA conŃine o altă valoare decât NULL: SELECT ID_CONT_CLIENT FROM CONT_CLIENT WHERE DATA_INCHEIERE IS NOT NULL. BETWEEN Operatorul BETWEEN este folosit pentru a determina dacă o valoare se încadrează într-un interval special.99 AND 19. Să se afişeze toate conturile de clienŃi în luna ianuarie 2005.COD_RATING AS RATING. Exemple: Să se găsească toate conturile de clienŃi active. Operatori logici Operatorii logici folosesc cuvinte cheie în locul simbolurilor la formarea expresiilor de comparare. 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.

ca în exemplul următor: .Caracterul liniuŃă de subliniere poate fi folosit drept caracter de înlocuire poziŃional. Pentru definirea tiparului pot fi folosite două caractere de înlocuire: LiniuŃa de subliniere (_) . urmat de litera „w" (1a începutul. DATA_INSCRIERE CONT_CLIENT WHERE DATA_INSCRIERE BETWEEN ”2005/01/01” AND „2005/01/31”. şi invers. Se potriveşte cu orice şir de caractere care incepe cu „Now". dar pentru caracterul de înlocuire poziŃional este folosit semnul de întrebare (?).SELECT ID_CONT_CLIENT. iar pentru caracterul de înlocuire nepoziŃional este folosit asteriscul (*) — aceste caractere corespund convenŃiilor folosite în DOS si Visual Basic. ar fi trebuit să includă în tipar şi spatiile necesare. indiferent de lungime. LIKE Operatorul LIKE este folosit pentru a compara o valoare de tip caracter cu un tipar*. urmată de orice alt caracter. Se potriveşte cu orice şir de caractere format din exact trei caractere. Exemplu de utilizare a operatorului LIKE: Să se afişeze toate titlurile de filme care conŃin şirul de caractere „on": SELECT TITLU_FILM FROM FILM WHERE TITLU_FILM LIKE '%on%'.Simbolul procent (%) poate fi folosit drept caracter de înlocuire nepoziŃional. Dacă se intenŃionează să se găsească titlurile care conŃin cuvântul „on". care începe cu „N" şi se termină cu „w". ceea ce înseamnă că se potriveşte cu orice număr de caractere. O literă mica din date nit se potriveşte cu o literă mare din tiparul unei clauze LIKE. ceea ce înseamnă că se potriveşte cu orice caracter aflat pe poziŃia respectivă în şirul de caractere evaluat. Se potriveşte cu orice şir de caractere care confine „Now" (1a inceput. la sfârşitul sau undeva în mijlocul şirului de caractere) Datele din bazele de date relaŃionale fac întotdeauna diferenŃierea literelor mari de cele mici. Exemple de tipare: Tipar %Now Now% %Now% N_w %N-w% Interpretare Se potriveşte cu orice şir de caractere care se termină cu „Now". Procent (%) . la sfârşit sau în mijloc). returnând valoarea logică “adevărat” dacă valoarea de tip caracter se încadrează în tipar şi “fals" în caz contrar. nu literele „on" din alte cuvinte. Se potriveşte cu orice şir de caractere care conŃine litera „N". Microsoft Access oferă o caracteristică similară.

IN Operatorul IN este folosit pentru a determine dacă o valoare face parte dintr-o listă de valori. Lista poate fi specificată ca valori literale, folosind o listă de valori separate prin virgule şi încadrate între paranteze, sau poate fi selectată din baza de date folosind o subselecŃie (o subinterogare), care este o interogare în cadrul unei alte interogări. Exemple de utilizare a operatorului IN: Să se afişeze toate filmele pentru care COD_GEN_FILM este Drama, Forgn sau Rmce. SELECT COD_GEN_FILM AS GEN, TITLU_FILM FROM FILM WHERE COD_GEN_FILM IN ('Drama','Forgn','Rmce') ORDER BY COD_GEN_FILM, TITLU_FILM; Să se afişeze toate filmele pentru care descrierea genului conŃine cuvântul „and". AveŃi nevoie de o subinterogare prin care să găsiŃi toate valorile COD_GEN_FILM care conŃin cuvântul „and" în descriere. Operatorul IN este apoi folosit pentru a găsi filmele care au unul dintre codurile selectate de subinterogare. SELECT COD_GEN_FILM AS GEN, TITLU_FILM FROM FILM WHERE COD_GEN_FILM IN (SELECT COD_GEN_FILM FROM GEN_FILM WHERE GEN_FILM DESCRIPTION LIKE '% and %') ORDER BY COD_GEN_FILM AS GEN, TITLU_FILM; EXISTS Operatorul EXISTS este folosit pentru a detemina dacă o subinterogare conŃine înregistrări. Dacă în setul de rezultate al subinterogării nu există nici un rând, operatorul returnează valoarea „false”; dacă setul de rezultate conŃine cel puŃin un rând, valoarea devine „adevărat”. Exemple de utilizare a operatorului EXIST: Filmul The Last Samurai se închiriază bine atât în format DVD, cât şi-n format VHS şi se doreşte să se asigure că în inventarul magazinului există o copie VHS. Tabelul FILM_COPIAT conŃine un rând pentru fiecare copie a unui film din inventarul magazinului, aşa că puteŃi folosi o subinterogare pentru a afla dacă există copii VHS ale filmului în inventar. De cele mai multe ori, operatorul EXISTS este folosit in conjuncŃie cu o formă mai complexă de subinterogare, numită subinterogare corelat. (correlated subquery),în care valorile datelor din interogarea externă (ID_FILM, în acest caz) sunt comparate cu rândurile din interogarea intenă. SELECT ID_FILM, TITLU_FILM FROM FILM m WHERE TITLU_FILM = 'The Last Samurai' AND EXISTS (SELECT ID_FILM FROM FILM_COPIAT c WHERE m. ID_FILM = c. ID_FILM); Dacă se inversează logica, folosind operatorul NOT EXISTS, puteŃi afişa titlul filmului numai dacă nu există o copie VHS în inventar. SELECT ID_FILM, TITLU_FILM

FROM FILM m WHERE TITLU_FILM = 'The Last Samurai' AND NOT EXISTS (SELECT ID_FILM FROM FILM_COPIAT c WHERE m. ID_FILM = c. ID_FILM); Operatori aritmetici În SQL, operatorii aritmetici sunt folositi pentru efectuarea calculelor matematice – la fel ca şi în formulele dintr-o foaie de calcul tabelar sau într-un limbaj de programare, precum Java sau C. Cei patru operatori aritmetici din SQL sunt: Operator Descriere + Adunare Scădere * ÎnmulŃire / ÎmpărŃire Ca şi în cazul operatorilor conjunctivi, dacă se amestecă operatorii aritmetici în aceeaşi instrucŃiune SQL fără a folosi paranteze, ordinea în care sunt evaluate operaŃiile este determinată de prioritatea predefinită. Din fericire, prioritatea operatorilor din SQL este cea pe care o folosim în operaŃiile matematice obişnuite. Exemple de utilizare a operatorilor aritmetici: Cât v-ar costa să cumpăraŃi copiile VHS şi DVD ale filmului The Last Samurai? SELECT PRET_VANZARE_VHS + PRET_VANZARE _DVD AS COST FROM FILM WHERE TITLU_FILM = 'The Last Samurai'; Cât v-ar costa aceeaşi achiziŃie dacă aŃi avea un bon valoric de 5$? SELECT (PRET_VANZARE _VHS + PRET_VANZARE _DVD) - 5 AS COST FROM FILM WHERE TITLU_FILM = 'The Last Samurai'; Dacă taxele sunt de 8.25% (0.0825), cât reprezintă taxele de vânzare din costul achiziŃiei anterioare? SELECT (PRET_VANZARE _VHS+ PRET_VANZARE _DVD) * 0.0825 AS TAX FROM FILM WHERE TITLU_FILM = 'The Last Samurai'; Care este costul mediu pentru o copie a filmului The Last Samurai? SELECT (PRET_VANZARE_VHS+PRET_VANZARE _DVD) / 2 AVG_COST FROM FILM WHERE TITLU_FILM = 'The Last Samurai' FuncŃii SQL elementare O funcŃie este un tip special de program, care returnează o singură valoare de fiecare data când este apelată. Termenul provine de la conceptul matematic al unei funcŃii. În SQL, funcŃiile necesită întotdeauna specificarea unei expresii, care deseori

AS

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

FuncŃii pentru caractere
FuncŃiile pentru caractere sunt numite astfel deoarece manipulează date de tip text. Concatenarea şirurilor de caractere FuncŃia de concatenare a şirurilor de caractere reuneşte mai multe şiruri de caractere pentru a forma o singură valoare în rezultatele interogării. FuncŃia standard de concatenare a şirurilor de caractere din SQL este apelată cu două bare verticale (||), dar există şi excepŃii, cum ar fi Microsoft SQL Server, care foloseşte semnul plus (+) pentru concatenarea şirurilor de caractere. Exemple de concatenare a şirurilor de caractere: Magazinul de produse video vrea să trimită fiecărui client o scrisoare care începe cu formula "Client", plus prenumele şi numele persoanei. Numele sunt stocate în tabelul PERSON. SoluŃia acestei cerintŃe în Oracle: SELECT 'Client' || NUME_PERSOANA|| ' ' || NUME_FAMILIE_PERSOANA AS SALUT_CLIENT FROM PERSOANA; Aceeaşi soluŃie, modificată pentru a funcŃiona în Microsoft SQL Server : SELECT ‚Client' + NUME_PERSOANA + ' ' + NUME_FAMILIE_PERSOANA AS SALUT_CLIENT FROM PERSOANA; UPPER FuncŃia UPPER transformă literele dintr-un şir de caractere în litere mari. Numerele şi caracterele speciale sunt lăsate ca stare. Exemple: Să se afişeze comediile (COD_GEN_FILM = 'Comdy') scriind titlurile cu majuscule. SELECT UPPER(TITLU_FILM) AS TITLU_FILM FROM FILM WHERE COD_GEN_FILM = 'Comdy'; FuncŃia UPPER este deseori folosită în condiŃiile WHERE. Să presupunem că nu vă amintiŃi dacă valorile COD_GEN_FILM au fost stocate cu litere mari, litere mici sau combinaŃii ale acestora. Dacă în condiŃia WHERE transformaŃi valorile în litere mari, puteŃi obŃine rezultatele corecte indiferent de modul de stocare. SELECT UPPER(TITLU_FILM) AS TITLU_FILM FROM FILM WHERE UPPER(COD_GEN_FILM) = 'COMDY';

dar uneori are un nume puŃin diferit. Iată forma generală a funcŃiei. SELECT LOWER(TITLU_FILM) AS TITLU_FILM FROM FILM WHERE GEN_COD_FILM = 'Comedy'. funcŃia se numeşte SUBSTRING în Microsoft SQL Server. AfişaŃi toate filmele care au în titlu cuvântul „of ". dar SUBSTR în Oracle şi D132. SELECT TITLU_FILM FROM FILM WHERE LOWER(TITLU_FILM) LIKE ' % of %' OR LOWER(TITLU_FILM) LIKE 'of % ' OR LOWER(TITLU_FILM) LIKE ' % of '. Se poate folosi funcŃia LOWER într-o clauză WHERE. LOWER FuncŃia LOWER este inversa funcŃiei UPPER — transformă literele dintr-un * de caractere în litere mici. Afişati numele complet al persoanelor al căror nume de familie începe cu litera „B". Iată şi versiunea pentru Microsoft SQL Server a exemplului anterior: . prin folosirea operatorului LIKE. Ca urmare. SUBSTR FuncŃia SUBSTR spare în majoritatea implementărilor SQL. În cele mai multe situaŃii. în cazul tabelelor mari. pentru o coloană căreia îi este aplicată o funcŃie nu poate fi folosită indexarea. Sybase Adaptive Server şi MySQL. Deşi este o utilizare mai puŃin obişnuită. 1. care specifică numele coloanei. în funcŃie de parametrii furniizaŃi. poziŃia de început. Ar trebui să vă puteŃi deja gândi la alte moduri de a face acest lucru. utilizarea funcŃiilor în condiŃiile WHERE poate duce la probleme de performanŃă cu adevărat memorabile. funcŃia SUBSTR acceptă şi un şir de caractere literal în locul numelui unei coloane. Iată soluŃia. Îată câteva exemple de utilizare a funcŃiei LOWER: Să se afişeze comediile (GEN_COD_FILM = 'Comedy') scriind titlurile cu minuscule. ' || NUME_FAMILIE_PERSOANA AS NUME_INTREG FROM PERSOANA WHERE SUBSTR(NUME_FAMILIE_PERSOANA. urmată de un exemplu: SUBSTR (numele coloanei. sub forma unui singer şir de caractere care conŃine prenumele. 1) || ' . lungimea subşirului În tabelul PERSON. pentru Oracle: SELECT NUME_PERSOANA || ' ' || SUBSTR(PRENUME_PERSOANA. indiferent dacă este scris cu litere mari sau mici. atunci când nu ştiti sigur ce tip de litere confine textul pe care vreŃi să-1 comparaŃi. poziŃia de început a subşirului în datele coloanei şi lungimea subşirului returnat (numărul de caractere). alŃii au numai initiale. De exemplu. FuncŃia returnează o porŃiune a şirului de caractere. 1.AtenŃie la folosirea funcŃiilor SQL în condiŃiile WHERE. unele persoane au al doilea nume în întregime. 1)='B' ObservaŃi folosirea funcŃiei SUBSTR în clauza WHERE pentru a elimina din rezultate persoanele al căror nume de familie nu începe cu litera „B". iniŃiala şi numele de familie.

Presupunem că folosiŃi o bază de date oracle. LENGTH (TITLU_FILM) AS LENGTH FROM FILM WHERE ID_FILM = 1. FunŃii matematice FuncŃiile matematice manipulează valori numerice. Valoarea numerică este furnizată prin primul parametru. rotunjit la două zecimale? SELECT ROUND((PRET_VANZARE_VHS + PRET_VANZARE _DVD) / 2. '+ NUME_FAMILIE_PERSOANA AS NUME_INTREG FROM PERSOANA WHERE SUBSTRING (NUME_FAMILIE_PERSOANA. SELECT TITLU_FILM. număr de poziŃii zecimale) Care este costul mediu al unei copii a filmului The Last Samurai. LEN (TITLU_FILM) AS LENGTH FROM FILM WHERE LEN (TITLU_FILM) < 10. în conformitate cu regulile matematicii. Presupunem că folosiŃi o bază de date Microsoft SQL Server. 1) = 'B' LENGTH FuncŃia LENGTH returnează lungimea unui şir de caractere. 2) AS AVG_COST FROM FILM WHERE TITLU_FILM = 'The Last Samurai'. Microsoft SQL Server şi Sybase Adaptive Server folosesc numele LEN pentru versiunea proprie a acestei funcŃii. În continuare este prezentat formatul general al funcŃiei ROUND. ROUND FuncŃia ROUND rotunjeşte o valoare la un număr specificat de zecimale. DB2 sau MzSQL. Alte funcŃii matematice Tabelul care urmează prezintă funcŃiile matematice cel mai des întâlnite. Exemple: Să se afişeze lungimea titlului pentru filmul a cărui valoare ID_FILM este 1. Să se afişeze lungimea titlului pentru filmul a cărui valoare ID_FILM este 1. SELECT TITLU_FILM. sintaxa generală este aceeaşi: NUME_FUNCTIE (expresie) FuncŃie ABS COS EXP POWER Descriere Valoarea absolută a unui număr dat Cosinusul trigonometric al unui unghi specificat în radiani Valoarea exponenŃială a unui număr dat Ridică un număr la o putere (numărul şi puterea sunt fumizate ca parametri) . iar numărul de zecimale prin cel de-al doilea. 1.SELECT NUME_PERSOANA + ' ' + SUBSTRING(PRENUME_PERSOANA. 1) +' . 1. Pentru toate. ROUND (expresie numerică.

Câte genuri diferite de filme sunt reprezentate în tabelul FILM? SELECT COUNT(DISTINCT(COD_GEN_FILM)) AS NUM_GEN FROM FILM. Iată sintaxa generală a funcŃiei CAST. Tabelul următor prezintă funcŃiile de agregare acceptate în majoritatea implementărilor SQL: Descriere Calculează valoarea medie pentru o coloană sau o expresie.2) AS AVG_PRET FROM FILM. CONVERT TO Multe implementări DBMS pun la dispoziŃie o funcŃie CONVERT sau CONVERT TO. COUNT Numără valorile dintr-o coloană. Exemple: Care este preŃul mediu al unui DVD? SELECT ROUND(AVG(PRET_VANZARE _DVD). deoarece este implementată într-un mod mai unitar de către diferiŃi producători. MIN Găseşte valoarea minimă dintr-o coloană. MAX(LENGTH(TITLU_FILM)) AS MAX_LENGTH FROM FILM. urmată de un exemplu: CAST (expresie AS tip de date) Afişati preŃul pentru formatul DVD al filmului The Last Samurai. Care sunt lungimea minimă şi maximă a titlurilor filmelor? SELECT MIN(LENGTH(TITLU_FILM)) AS MIN_LENGTH. Totuşi este recomandată folosirea funcŃiei CAST. SUM Însumează valorile dintr-o coloană. cu un simbol dolar în faŃa sumei. MAX Găseşte valoarea maxină dintr-o coloană. Câte filme există în tabelul FILM? SELECT COUNT(*) AS NUM_FILM FROM FILM.SIN TAN Sinusul trigonometric al unui unghi specificat în radiani 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. FuncŃie AVG . 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. CAST FuncŃia CAST transformă date dintr-un tip de date în altul. FuncŃii de agregare şi gruparea rândurilor O funcŃie de agregare (aggregate functions) este o funcŃie care combină mai multe rânduri de date într-un singur rând. SELECT '$' || CAST(PRET_VANZARE _DVD AS VARCHAR(6)) AS PRET FROM FILM WHERE TITLU_FILM = 'The Last Samurai'.

Totuşi. elimină rândurile duplicate. Nu-1 veŃi găsi în Microsoft SQL Server sau MySQL. Exemplu: AfişaŃi pe o singură coloană toate valorile nenule pentru taxa de inchiriere şi taxa de întârziere din tabelul FILM_ÎNCHIRIAT. . returnând un rând pentru fiecare grup din setul de rezultate. doar un număr mic de sisteme DBMS (cele mai importance fiind Oracle şi DB2) implementează acest operator. retumează un singur rând de date. Sistemul DBMS va ordona rândurile selectate de interogare după coloanele din clauza GROUP BY. UNION Operatorul UNION adaugă rândurile din setul de înregistrări al unei interogări la cel al unei alte inregistrări şi. COUNT(*) AS COUNT FROM FILM GROUP BY COD_GEN_FILM. în absenta clauzei GROUP BY. Functia COUNT(*) este o functie de agregare şi. ceea ce înseamnă că au acelaşi număr de coloane şi că tipurile de date ale coloanelor corespondente sunt compatibile. exceptând cazul în care se adăugă o clauză ORDER BY care specifică un alt mod de ordonare.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. Exemplu: Afişati fiecare cod de gen. SELECT INCHIRIAT_FEE AS FEE FROM FILM_INCHIRIAT WHERE INCHIRIAT _FEE IS NOT NULL UNION SELECT LATE_OR_LOSS_FEE AS FEE FROM FILM_INCHIRIAT WHERE LATE _OR_ LOSS FEE IS NOT NULL. împreună cu numărul de filme asociate fiecărui cod. SELECT COD_GEN_FILM AS GEN. mesajul de eroare este deseori destul de criptic. aşa că grupurile vor fi returnate în ordine ascendentă. Ce se întâmplă dacă scoateŃi clauza GROUP BY din această interogare? Sistemul DBMS retumează un mesaj de eroare şi. OperaŃia este permisă numai dacă interogările sunt compatibile din punctul de vedere al uniunii. Operatori pentru interogări compuse Uneori este util să se ruleze interogări multiple şi să se combine rezultatele într-un singur set de rezultate. într-un mod similar cu cel al cuvântului cheie DISTINCT. În esenŃă. în acelaşi timp. INTERSECT Operatorul INTERSECT găseşte valorile selectate dintr-o interogare. exceptând faptul că rândurile duplicate nu sunt eliminate. găseşte intersecŃia valorilor din cele două interogări. din nefericire. care apar şi într-o altă interogare. UNION ALL UNION ALL funcŃionează la fel ca şi operatorul UNION.

1. Poate fi specificată numai pentru coloanele din setul de rezultate al interogării 3. în esenŃă. Foloseşte simboluri procent drept caractere de înlocuire nepoziŃionale 5. Nu este inclus în standardul ISO/ANSI 4. Întrebări şi Probleme AlegeŃi răspunsurile corecte pentru fiecare din următoarele întrebări cu răspunsuri multiple. Selectează rândurile adăugate în tabel într-un anumit interval de timp e. ordinea rândurilor din rezultatele interogării a. Poate fi ascendentă sau descendentă pentru orice coloană c. Foloseşte simboluri procent drept caractere de înlocuire poziŃionale e. În mod prestabilit este descendentă. precum Oracle. valorile din prima interogare care nu apar în cea de-a doua interogare. Este specificată de clauza SORTED BY b. dacă nu se specifică o altă ordine d. Poate fi rescris folosind operatorii <= şi >= d. În SQL. Foloseşte liniuŃe de subliniere drept caractere de înlocuire nepoziŃionale d. Operatorul BETWEEN a. nu EXCEPT. Poate fi rescris folosind operatorii <= şi NOT <= c. Foloseşte semne de întrebare drept caractere de înlocuire poziŃionale b. Foarte puŃine sisteme DBMS implementează acest operator. Selectează toate rândurile din tabel sau vizualizare d. O instrucŃiune SQL care confine o funcŃie de agregare . Returnează un mesaj de eroare c. operatorul se numeşte MINUS. Operatorul LIKE standard a. Foloseşte liniuŃe de subliniere drept caractere de înlocuire poziŃionale c. Afişează numai definiŃia tabelului sau a vizualizării e. Specifică un domeniu de valori care include şi capetele b. returnând. O instrucŃiune SELECT fără o clauză WHERE a. Scrie întotdeauna rezultatele într-un fişier jurnal 2. Este imprevizibilă dacă nu este specificată in interogare e.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. ReŃineŃi că întrebările pot avea mai multe răspunsuri corecte. Selectează toate coloanele din tabel sau vizualizare b. În unele implementări.

a. b. c. d. e.

Poate conŃine şi coloane calculate Poate conŃine şi coloane obisnuite Trebuie să includă o clauză ORDER BY Trebuie să includă o clauză GROUP BY Nu poate include, în acelaşi timp, o clauză GROUP BY şi o clauză ORDERBY

6. Când operatorii AND şi OR sunt combinaŃi în aceeaşi clauză WHERE a. Sistemul SGBD returnează un mesaj de eroare b. Operatorul AND are prioritate mai mare decât operatorul OR c. Operatorul AND are prioritate mai mică decât operatorul OR d. Parantezele, sunt obligatorii e. Parantezele sunt opŃionale 7. Sintaxa corectă pentru eliminarea valorilor nule din rezultatele interogării este a. = NULL b. NOT = NULL c. <>NULL d. IS NULL e. IS NOT NULL 8. FuncŃiile SQL standard pentru şiruri de caractere includ a. UPPER b. MIDDLE c. LOWER d. SUBSTR e. EXISTS 9. FuncŃiile, SQL matematice standard includ a. LENGTH b. ROUND c. CAST d. MIN e. ABS 10. Operatorul UNION a. Elimină rândurile duplicate din setul de rezultate b. Include rândurile duplicate în setul de rezultate c. Combină două interogări într-o singură interogare de tip join d. Combină seturile de rezultate a două interogări într-un singur set de rezultate e. Este numit JOIN în unele implementări SQL ScrieŃi instrucŃiunile SQL pentru următoarele probleme 1. GăsiŃi toate filmele din tabelul FILM pentru care MPAA_COD_INCHIRIERE are altă valoare decât „R". 2. AfişaŃi titlurile şi preŃurile tuturor filmelor pentru care PRET_VANZARE_DVD este cel puŃin 19.99, dar nu mai mare de 29.99, ordonate crescător după preŃ. 3. AfişaŃi toate filmele pentru care genul (COD_GEN_FILM) este Comdy şi categoria MPAA (MPAA _COD_INCHIRIERE) este PG-13, împreună cu filmele pentru care genul este Drama şi categoria este R.

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

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

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

ActAd Drama ActAd ActAd Drama Rmce Comedie Comedie Drama Drama Comedie Rmce Drama ActAd Forgn Tabelul FILM (trei coloane)

Pirates of the Caribbean: Trie Curse of the Black Pearl Big Fish Man on Fire Master and Commander The Far Side of the World LosI în Translation Two Weeks Notice 50 First Dates Matchstick Men Cold Mountain Road to Perdition The School of Rock 13 Going on30 Monster The Day After Tomorrow Das Boot

Evident, nu puteŃi afişa pe pagina web a magazinului de produse video, tabelul FILM aşa cum este prezentat în figura de mai sus - trebuie să obŃineŃi descrierea completă a genurilor din tabelul FILM_GEN. Aceasta este ideea capitolului de faŃă: combinarea datelor din mai multe tabele într-o singură interogare. Figura următoare prezintă un listing al tabelului FILM_GEN. FILM_GEN_COD ActAd Anime ChFam Class Comedie Doc Drama Forgn Hor Indep Music Rmce SciFi Sport Thriller FILM_GEN_DESCRIERE Actiune Animatie Copii şi Familie Clasic Comedie Documentar Drama Strain Horror Independent Muzical Romance(Romantic, Idila) Stiintifico-Fantastic Sport Groaza

Tabelul FILM_GEN

. Trebuie indicat ce coloane ar trebui să se potrivească pentru a uni două rânduri din cele două tabele.. FILM_ID GEN FILM_TITLU 1 Actiune şi Aventura Mystic River 1 Animatie Mystic River 1 Clasic Mystic River 1 Documentar Mystic River 1 Strain Mystic River 1 Independent Mystic River 1 Groaza Mystic River 1 Sport Mystic River 1 SF Mystic River 1 Musical Mystic River 1 Horror Mystic River 1 Drama Mystic River 1 Comedie Mystic River 1 Copii şi Familie Mystic River 1 Actiune şi Aventura The Last Samurai 2 Thriller The Last Samurai 2 Sport The Last Samurai 2 SF The Last Samurai 2 Romantic The Last Samurai 2 Musical The Last Samurai 2 Independent The Last Samurai 2 Horror The Last Samurai 2 Animatie The Last Samurai 2 Copii şi Familie The Last Samurai 2 Documentar The Last Samurai 2 Strain The Last Samurai 2 Drama The Last Samurai 2 Comedie The Last Samurai 2 Clasic The Last Samurai ..... în bazele de date relaŃionale... O uniune apare de fiecare dată când clauza FROM a unei instrucŃiuni SELECT specifică numele mai multor tabele.. Problema este că am cerut bazei de date să unească tabelele. . este un set de rezultate obŃinut prin uniunea dintre fiecare rând al unui tabel cu fiecare rând dintr-un alt tabel...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. De exemplu: SELECT FILM_ID. dar nu i-am spus care este corespondenŃa dintre rândurile celor două tabele.. FILM_GEN ORDER BY FILM_ID. SoluŃia este să specificăm cum se va face unirea tabelelor.. Rezultatul este cunoscut sub numele de produs cartezian (după numele filozofului şi matematicianului francez Rene Descartes) şi.. . Setul de rezultate al interogării a fost trunchiat după primele două titluri de filme .. în ... FILM_TITLU FROM FILM. FILM_GEN_DESCRIERE AS GEN.

ci din orice alt loc al instrucŃunii. cunoscut şi sub numele de uniune de egalitate (equijoin). cu numele coloanelor specificate complet. cele două coloane vor fi cheia primară dintr-un tabel şi cheia externă din celălalt tabel. există unele diferenŃe. numită şi uniune internă (inner join). Motorul SQL cere să se refere toate coloanele specificate într-o instrucŃiune SQL. aceasta fiind cea mai des folosită formă de uniune. Clauza JOIN a fost adaugată relativ recent în standardul SQL. atunci când legăm una sau mai multe coloane dintr-un tabel (de obicei. Aceasta nu înseamnă numai coloanele din clauza WHERE. În clauza WHERE : Se compară o coloană cu o altă co1oană. În continuare este prezentat un exemplu de uniune realizată prin clauza WHERE. Pentru a realiza acest lucru trebuie să se facă o o uniune standard relaŃională. FILM_GEN WHERE FILM. Cea mai simplă formă de calificator este chiar numele tabelului. find preferate denurmirile uniune internă (inner join) sau uniune standard (standard join ). aşa că programatorii mai vechi sunt obisnuiŃi cu metoda bazată pe clauza WHERE. Totusi. Realizarea uniunilor folosind clauza WHERE Folosirea clauzei WHERE pentru unirea tabelelor seamănă cu folosirea acesteia pentru eliminărea rândurilor de care nu aveŃi nevoie din setul de rezultate. Atunci când coloanele din cele două tabele au acelaşi nume (o soluŃie recomandată) trebuie să specificati numele complet al coloanelor (adică numele cu calificator). cheia primară). o cheie externă) cu coloane similare dintr-un alt tabel (de obicei. Totuşi. folosind numele tabelelor.FILM_GEN_COD= FILM_GEN. FILM_GEN_DESCRIERE AS GEN. nu o coloană cu o constantă sau o expresie.mod normal. SELECT FILM_ID.FILM_GEN_COD ORDER BY FILM_ID. separat cu caracterul punct de numele coloanei. dar pot există şi excepŃii. Există două modalităŃi de specificare a coloanelor corespondente: folosind clauza WHERE sau folosind clauza JOIN. Uniuni de egalitate (equijoin) Avem o uniune de egalitale (equijoin). termenul uniune de egalitate (equijoin) este rareori folosit în afara mediilor academice. folosind condiŃia de egalitale. FILM_TITLU FROM FILM. ObservaŃi că interogarea selectează coloanele FILM_ID şi FILM_TITLU din tabelul FILM şi genul corespunzător (FILM_GEN_DESCRIERE) din tabelul FILM_GEN. astfel încât motorul SQL să ştie care dintre cele două coloane este referită. inclusiv în lista SELECT. FILM_ID FILM_GEN 1 Drama 2 Actiune şi Aventura 3 Comedie FILM_TITLU Mystic River The Last Samurai Something's Gotta Give .

exceptând faptul că nu este folosit cuvântul cheie „AS" (în cele mai multe implementări SQL) doar lăsaŃi un spaŃiu între numele tabelului şi pseudonim în lista FROM. Din această cauză. în SQL este permisă şi folosirea pseudonimelor (aliases) pentru numele tabelelor. A. Acestea funcŃionează la fel ca şi pseudonimele coloanelor din clauza SELECT.FILM_GEN_COD = B.FILM_GEN_DESCRIERE AS GEN.FILM_TITLU FROM FILM A. Folosirea pseudonimelor în clauza SELECT poate părea puŃin ciudată la început deoarece folosiŃi un pseudonim înainte de a-l defini (clauza SELECT precede clauza FROM şi s-ar putea să vi se para mai simplu să completaŃi clauza FROM înainte de a completa lista de coloane din clauza SELECT atunci când scrieŃi instrucŃiunile SQL. pentru a va arăta cum sunt folosite. Deşi nu era necesar.”C” şi aşa mai departe). „B”.FILM_GEN_COD ORDER BY A. SELECT A.4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Actiune şi Aventura Actiune şi Aventura Actiune şi Aventura Drama Actiune şi Aventura Actiune şi Aventura Drama Romantic Comedie Comedie Drama Drama Comedie Romantic Drama Actiune şi Aventura Strain The Italian Job Kill Bill Vol. Deşi unii folosesc mnemonice pentru pseudonimul tabelelor.FILM_ID. mai ales deoarece numele tabelelor pot avea 30 sau mai multe caractere în sistemele DBMS moderne. . după adăugarea pseudonimelor pentru numele tabelelor. pseudonimele au fost adăugate şi în lista de coloane din clauzele SELECT şi ORDER BY. este mult mai des întâlnită folosirea secvenŃelor de majuscule (adică „A". 1 Pirates of the Caribbean Big Fish Man on Fire Master and Commander Lost în Translation Two Weeks Notice 50 First Dates Matchstick Men Cold Mountain Road to Perdition The School of Rock 13 Going on 30 Monster The Day After Tomorrow Das Boot Folosirea numelor complete ale tabelelor pentru specificarea coloanelor poate fi obositoare şi consumatoare de timp.FILM_ID. FILM_GEN B WHERE A. Exemplul următor prezintă instrucŃiunea anterioară. B. După ce asociaŃi un pseudonim unui nume de tabel în clauza FROM. trebuie să folosiŃi pseudonimul în locul numelui de tabel în întreaga instrucŃiune SQL.

FILM_GEN_DESCRIERE AS GEN.FILM_GEN_COD = B. FILM_GEN_DESCRIERE AS GEN. FILM_TITLU FROM FILM JOIN FILM_GEN ON FILM..FILM_GEN_COD ORDER BY FILM_ID. • JOIN cu cheie externă pe mai multe coloane.Realizarea uniunilor folosind clauza JOIN Clauza JOIN este scrisă ca o referinŃă de tabel din clauza FROM şi combină lista de tabele din clauza FROM şi condiŃia de legătură scrisă anterior în clauza WHERE într-o singură clauză.. urmată de câteva exemple. COPY_NUMAR. nume_tabel [INNER) JOIN nume_tabel { ON condiŃie | USING (nume_coloană [ . Această interogare afişează lista cu copiile filmelor din tabelul FILM_COPY care nu au fost vândute (coloană DATA_VANZARE conŃine o valoare nulă dacă nu a fost vândută) şi care au fost închiriate (uniune cu tabelul FILM_INCHIRIAT) dar nu au fost încă returnate (coloană RETUR_DATA conŃine o valoare nulă până la returnarea filmului). pentru a vedea unde se încadrează tabelul în modelul general.FILM_GEN_COD ORDER BY FILM_ID. DATA_RETURNARII . SELECT FILM_ID.. clauza USING acŃionează numai atunci când coloanele pe care se face legătură au nume identice în ambele tabele.]) } Clauza ON permite specificarea unei condiŃii similare cu cea din clauza WHERE . FILM_TITLU FROM FILM A JOIN FILM_GEN B ON A. A se revedea prezentarea generală a bazei de date a magazinului de produse video. • 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). Sintaxa generală a clauzei JOIN pentru o uniune internă. Totuşi. FILM_GEN_DESCRIERE AS GEN. SELECT FILM_ID. nume_coloană.FILM_GEN_COD = FILM_GEN. FILM_TITLU FROM FILM JOIN FILM_GEN USING (FILM_GEN_COD) ORDER BY FILM_ID. Clauza USING specifică numele coloanelor folosite pentru legarea rândurilor. Exemple: • JOIN cu condiŃie ON: SELECT FILM_ID. • JOIN cu pseudonime în loc de nume de tabele: SELECT FILM_ID.

toate uniunile de egalitate sunt uniuni naturale. pentru primele trei filme din tabelul FILM. din cauza lungimii. Uniuni naturale O uniune naturală (natural join) se bazează pe toate coloanele cu acelaşi nume din două tabele. SELECT A. FILM _ID 2 3 5 5 10 17 COPY_NUMAR 2 2 1 2 1 1 DATA_RETURNARII 02/27/2005 03/04/2005 02/27/2005 02/19/2005 03/04/2005 03/04/2005 InstrucŃiunile care folosesc clauza JOIN sunt mai scurte . sintaxa unei uniuni naturale este mult mai simplă.COPY_NUMAR.. deoarece nu este necesar să specificaŃi o condiŃie sau o listă de coloane .FROM FILM_COPY JOIN FILM__INCHIRIAT USING (FILM_ID.FILM_ID AND A. Am permis textului din coloana RATING_DESC să treacă automat pe linia următoare în rezultatele interogării. ReŃineŃi. Totuşi. DATA_RETURNARII FROM FILM_COPY A. Exemplul următor prezintă o uniune naturală care obŃine coloana FILM_ID din tabelul FILM. coloana MPAA_RATING_DESCRIERE . Exemplu: uniunea tabelelor FILM şi FILM_GEN. în esenŃă.FILM_ID. rescrisă sub forma unei uniuni naturale: SELECT FILM_ID. Uniunile pot implica mai mult de două tabele.FILM_ID = B. FILM_INCH B WHERE A. coloana FILM_GEN_DESCRIERE din tabelul FILM_GEN şi din tabelul MPAA_RATING. un set de rezultate intermediar) cu tabelul MPAA_RATING.COPY_NUMAR AND DATA_VANZARE IS NULL AND RETURN_DATA IS NULL.se înŃelege de la sine care sunt coloanele folosite. Exemplul foloseşte două clauze JOIN. Prima clauză JOIN cere motorului SQL să lege tabelele FILM şi FILM_GEN. 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. FILM_TITLU FROM FILM NATURAL JOIN FILM_GEN ORDER BY FILM_ID. InstrucŃiunea de mai jos afişează aceleaşi rezultate ca şi instrucŃiunea anterioară. Folosirea clauzei WHERE permte să se elimine din setul de rezultate rândurile de care nu avem nevoie. iar a două clauză JOIN îi cere să lege rândurile deja unite (în esenŃă. COPY_NUMAR) WHERE DATA_VANZARE IS NULL AND RETUR_DATA IS NULL. A. FILM_GEN_DESCRIERE AS GEN. . pentru a evita referirea ambiguă a lor.nu toate SGBD-urile acceptă această sintaxă pentru clauza JOIN(accepta sigur Oracle şi MySQL ).COPY_NUMAR = B.

Atunci când există rânduri fără legături. FILM_ID 1 2 3 GEN Drama RATING R RATING_DESC Sub 17 ani acompaniati de parinti Sub 17 ani acompaniati de parinti Cu acordul strict a parintilor AcŃiune si Aventura R Comedie PG-13 Dacă se foloseşte o implementare SQL care nu acceptă uniunile naturale.MPAA_RATING_COD = C. B. dacă se doreşte o listă cu toate genurile de filme.FILM_GEN_COD = B. (asemănatoare interogărilor din tabele aflate in relaŃia 1:m) .FILM_ID.FILM_GEN_DESCRIERE AS GEN. FILM_GEN_DESCRIERE AS GEN. împreună cu toate rândurile din tabelul din dreapta pentru care poate fi găsită o legătură. Uniuni externe (outer joins) Toate uniunile pe care le-am descris până acum sunt uniuni exclusiv(uniuni interne). Există trei tipuri de bază: Uniune externă către stânga (left outer join) .FILM_GEN_COD JOIN MPAA_RATING C ON A. MPAA_RATING_DESCRIERE AS RATING_DESC FROM FILM NATURAL JOIN FILM_GEN NATURAL JOIN MPAA_RATING WHERE FILM_ID < 4 ORDER BY FILM_ID.MPAA_RATING_COD WHERE FILM_ID < 4 ORDER BY FILM_ID. MPAA_RATING_COD AS RATING.pentru care un nume mai potrivit ar fi uniune inclusivă . datele selectate din tabelul în care nu a fost găsită o legătură primesc valoarea nulă. aceeaşi interogare scrisă folosind cuvintele cheie JOIN şi ON este: SELECT A.SELECT FILM_ID. Returnează toate rândurile din tabelul din stânga (cel specificat primul în clauza JOIN). Există situaŃii în care vreŃi să includeŃi în rezultatele interogării şi rânduri pentru care nu există o legătură. C.MPAA_RATING__COD AS RATING. C.MPAA_RATING__DESCRIERE AS RATING_DESC FROM FILM A JOIN FILM_GEN B ON A. împreună cu toate titlurile asociate cu fiecare gen? O uniune externă (outer join) . 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. De exemplu.include în setul de rezultate şi rândurile pentru care nu există legături din cel puŃin unul dintre tabele.

.. Acest tip de uniune este cel mai puŃin probabil să fie acceptată de toate implementari. 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.e SQL. Uniune externă completă (full outer join). În setul de rezultate rândurile care nu au nici o valoare în coloană FILM_TITLU . Returnează toate rândurile din ambele tabele. GEN Actiune şi Aventura Actiune şi Aventura Actiune şi Aventura Actiune şi Aventura Actiune şi Aventura Actiune şi Aventura Actiune şi Aventura Anime and Animation Copii şi Familie Clasic Comedie Comedie Comedie Comedie Documentar FILM_TITLU Kill Bill: Vol. Este folosită mai mult pentru tabelele aflate in relaŃia m:m Sintaxa generală pentru o uniune externă este: nume_tabel {RIGHT | LEFT | FULL} [OUTER] JOIN nume_tabel { ON condiŃie | USING (nume_coloană [ .]) } Exemple de uniuni externe: • Să se afişeze toate descrierile genurilor de filme. Această uniune nu este acelaşi lucru cu un produs cartezian. SELECT FILM_GEN_DESCRIERE AS GEN. Dacă implementarea DBMS nu acceptă uniuni realizate cu cuvântul cheie USING. 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. 1 Man on Fire Pirates of the Caribbean Master and Commander The Day After Tomorrow The Last Samurai The Italian Job USING 50 First Dates Matchstick Men The School of Rock Something's Gotta Give . Returnează toate rândurile din tabelul din dreapta (cel specificat al doilea în clauza JOIN). împreună cu filmele asociate fiecărui gen. modificaŃi instrucŃiunea astfel încât să utilizeze cuvântul cheie ON. în esenŃă.acestea sunt genurile de filme care nu au filme asociate.Uniune externă către dreapta (right outer join). împreună cu toate rândurile din tabelul din stânga pentru care poate fi găsită o legătură. ca în exemplul care urmează după acesta. FILM_TITLU FROM FILM_GEN LEFT OUTER JOIN FILM (FILM_GEN_COD).nume_coIoană.

• Interogarea anterioară. SELECT FILM_GEN_DESCRIERE AS GEN. dacă genurile filmelor ar fi opŃionale.FILM_GEN_COD. rescrisă ca uniune externă completă. SELECT FILM_GEN_DESCRIERE AS GEN. Deoarece fiecare film trebuie să aibă asociat un gen. cu condiŃie ON. GEN .FILM_GEN_COD. cât şi filmele care nu au genuri asociate. SELECT FILM_GEN_DESCRIERE AS GEN FROM FILM RIGHT OUTER JOIN FILM_GEN ON FILM. Totuşi.FILM_GEN_COD =FILM_GEN. Există şi alte moduri de a face acest lucru.FILM_GEN_COD WHERE FILM_TITLU IS NULL.FILM_GEN_COD = FILM_GEN. această interogare va produce aceleaşi rezultate ca şi uniunea externă către dreapta din interogarea anterioară. FILM_TITLU FROM FILM FULL OUTER JOIN FILM_GEN ON FILM. dar exemplul de faŃă foloseşte faptul că rândurile pentru care nu există legături returnează valori nule pentru a selecta numai genurile care nu au nume asociate. FILM_TITLU FROM FILM RIGHT OUTER JOIN FILM_GEN ON FILM. rescrisă ca uniune externă către dreapta.Drama Drama Drama Drama Drama Drama Strain Horror Independent Musical Romantic Romantic • Big Fiah Road to Perdition Mystic River Monster Cold Mountain Lost în Translation Das Boot 13 Going on 30 Two Weeks Notice Interogarea anterioară. uniunea externă completă v-ar fi permis să afişaŃi atât genurile care nu au filme asociate.FILM_GEN_COD = FILM_GEN. • AfişaŃi descrierile genurilor care nu au nume asociate.

. mai mulŃi producători de baze de date relaŃionale au introdus uniunile externe inainte de standardizarea clauzei JOIN.Animatie Copii şi Familie Clasic Documentar Horror Independent Musical SF Special Interes Sport Thriller Ca răspuns la cererile clienŃilor.(+)“ este plasat în partea clauzei WHERE unde vreŃi să adăugaŃi valori nule.(+)“ este plasat în clauza WHERE în partea opusă tabelului din care vreŃi să fie returnate toate rândurile (indiferent dacă există legături pentru ele în celalalt tabel). Aceste soluŃii particulare sunt prezentate aici numai pentru că s-ar putea să le intâlniŃi în instrucŃiuni SQL mai vechi Sintaxa uniunii externe în Oracle Oracle Corporation a decis să folosească un semn plus încadrat de paranteze pentru definirea uniunilor externe. FILM_GEN B WHERE A.. este mai uşor să reŃineŃi că simbolul .. Iată exemplul anterior rescris folosind sintaxa Oracle: SELECT FILM_GEN_DESCRIERE AS GEN FROM FILM A. Deoarece datele din celălalt tabel (cel din care sunt returnate numai rândurile pentru care există legături) sunt completate cu valori nule atunci când nu este găsit un rând corespondent. În ambele cazuri. Simbolul . Iată exemplul anterior rescris folosind sintaxa Microsoft SQL Server (ca uniune externă către dreapta): SELECT FILM_GEN_DESCRIERE AS GEN FROM FILM A.FILM_GEN_COD AND FILM_TITLU IS NULL. Sintaxa uniunii externe în Microsoft SQL Server Microsoft SQL Server foloseşte operatorul „*=" în condiŃia WHERE pentru o uniune externă către stânga şi operatorul „=*" pentru o uniune externă către dreapta. SecŃiunile următoare prezintă câteva implementări specifice ale sintaxei uniunii externe.FILM_GEN_COD(+) = B. este obligatoriu ca asteriscul şi semnul egal să nu fie separate de spaŃii. FILM_GEN B WHERE A.FILM_GEN_COD AND FILM TITLU IS NULL.FILM_GEN_COD =* B.

SUPERVISOR_PERSOANA_ID PROM ANGAJAT. Subinterogări O caracteristică foarte puternică a limbajului SQL sunt subinterogările (numite şi selecŃii). . se referă la o instrucŃiune SELECT care contine o instrucŃiune SELECT subordonată. folosind o uniune încrucişată: SELECT FILM_ID. O regulă esenŃială de sintaxă este ca subinterogarea să fie încadrată de paranteze. Există relaŃii în care cheia primară şi cheia externă se află în acelaşi tabel. Interogarea care care unea tabelele FILM şi FILM_GEN şi obŃinea un produs cartezian poate fi rescrisă ca mai jos. Este folosită pentru a lega fiecare angajat de şeful direct. care. FILM_GEN_DESCRIERE AS GEN. Interogarea următoare afişează trei coloane din tabelul ANGAJAT. aşa cum sugerează şi numele. ceea ce înseamnă că şi şeful respectiv are o coloană în tabelul ANGAJAT.75 SUPERVISOR_PERSOANA_ID 1 1 Aceste date arată că angajaŃii 2 şi l0 sunt subordonaŃi angajatului 1. FILM_TITLU FROM FILM CROSS JOIN FILM_GEN ORDER BY FILM_ID. De obicei. este un alt angajat. desigur. Acestea se numesc relaŃii recursive. Aceasta poate fi o modalitate foarte flexibilă de selectare a datelor. Uniuni încrucişate (cross joins) O uniune încrucişată (cross join) nu este altceva decât sintaxa standard pentru un produs cartezian. PERSOANA_ID 1 2 10 PLATA_ORE 15 9.Auto-uniuni (seif joins) O auto-uniune (selfjoin) este o uniune a unui tabel cu el însuşi. . Tabelul ANGAJAT are o coloană numită SUPERVISOR_PERSOANA_ID. care este o cheie externă către coloană PERSOANA_ID din acelaşi tabel.75 9. care. iar angajatul 1 nu e subordonat nimanui. ANGAJAT_PLATA_ORE AS PLATA_ORE. subinterogările sunt folosite în clauza WHERE. ca modalitate de limitare a rândurilor returnate în setul de rezultate al interogării externe. În baza de date a magazinului de produse video există o relaŃie recursivă în tabelul angajaŃi. inclusiv PERSOANA_ID şi SUPERVISOR_PERSOANA_ID: SELECT PERSOANA_ID. Orice operaŃie efectuată cu o subinterogare poate fi facută şi printr-o uniune.

pentru a vă ajuta să înŃelegeŃi cum funcŃionează: SELECT DISTINCT LIMBA_COD FROM FILM_LIMBA. Cuvântul cheie DISTINCT elimină rândurile duplicate din setul de rezultate . Iată cum arată interogarea: SELECT DISTINCT TRANZACTIE_ID FROM FILM_INCHIRIAT WHERE INCHIRIAT_TAXA> (SELECT AVG(INCHIRIAT_TAXA) FROM FILM_INCHIRIAT) . Interogarea internă rulată independent. Exemple: • AfişaŃi toate limbile în care nu există nici un film în inventarul magazinului de produse video.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ă. LIMBA_NUME FROM LIMBA WHERE LIMBA_COD NOT IN (SELECT DISTINCT LIMBA_COD FROM FILM_LIMBA) ORDER BY LIMBA_COD LIMBA_COD Ja Ko ni ru zh LIMBA_NUME Japoneza Coreana Olandeza Rusa Chineza Interogarea internă returnează o listă cu codurile de limbă asociate filmelor în tabelul FILM_LIMBA. LIMBA_COD ------------------------------------------de (Germana) en (Engleza) es (Spaniola) fr (Franceza) • Proprietarul magazinului vrea să vadă efectul recentei creşteri de preŃuri şi are nevoie de o listă a tranzacŃiilor (TRANZACTIE_ID) în care clientul a plătit mai mult decât taxa medie (INCHIRIAT_TAXA) pentru un film. apoi setul de rezultate obŃinut poate fi folosit în interogarea externă. SELECT LIMBA_COD.

atunci . deoarece interogarea internă trebuie să fie apelată pentru fiecare rând găsit de interogarea externă. deoarece tocmai aŃi învăŃat despre subinterogari. Aceste subinterogari sunt mult mai puŃin eficiente decât subinterogările necorelate.Interogarea internă calculează media taxelor de închiriere. 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.TRANZACTIE _ID = B. WHERE INCH_TAXA > (SELECT AVG ( INCHIRIAT_TAXA) FROM FILM_INCHIRIAT) TRANZACTIE_ID TRANZ_DATA 9 03/01/2005 10 03/01/2005 Subinterogări corelate O subinterogare corelată (correlated subselect) este o subinterogare în care interogarea internă referă valorile furnizate de interogarea externă. TRANZACTIE_DATA AS TRANZ_DATA FROM CLIENT_TRANZACTIE WHERE TRANZACTIE_ID IN (SELECT DISTINCT TRANZACTIE_ID FROM FILM_INCH.TRANZACTIE_ID) CLIENT_CONT_ID 2 7 9 ObservaŃi pseudonimele asociate numelor de tabele din interogările internă şi externă. să facem acelaşi lucru folosind încă o subinterogare. SELECT DISTINCT CLIENT_CONT_ID FROM CLIENT_TRANZACTIE A WHERE 15 < (SELECT SUM (INCHIRIAT_TAXA) FROM FILM_INCHIRIATB WHERE A. • Rezultatele interogării anterioare ar fi mai utile pentru proprietarul magazinului dacă ar include şi data tranzacŃiei. care este rulată pentru a calcula suma taxelor de închiriere din tranzacŃia respectivă. Cuvântul cheie DISTINCT elimină tranzacŃiile duplicate. Dacă suma taxelor de închiriere este mai mare sau egală cu 15. Iată cum arată interogarea: SELECT TRANZACTIE_ID. O modalitate de a realiza acest lucru este şi adăugăm o uniune cu tabelul CLIENT_TRANZACTIE în interogarea externă. precurn şi folosirea acestora în clauza WHERE a interogării interne. iar interogarea externă găseşte apoi toate rândurile din tabelul FILM_INCHIRIAT pentru care valoarea INCHIRIAT_TAXA depăşeşte media. Fiecare valoare găsită este transmisă interogării interne. Exemplu: Proprietarul magazinului vrea să transmită prin poştă un cupon valoric tuturor clienŃilor care au plătit mai mult de 15$ pentru o singură tranzacŃie de închiriere. Totuşi.

puteŃi chiar să le uniŃi cu alte tabele sau vizualizări. Întrebări şi probleme AlegeŃi răspunsurile corecte pentru fiecare din următoarele întrebări cu răspunsuri multiple. Are ca rezultat un produs cartezian 3. Reprezintă o cale puternică de calculare a coloanelor d. SELECT MAX(INCHIRIAT_NUMAR) AS MAX_INCHIRIAT_NUMAR FROM (SELECT FILM_ID. Nu există nici o limită în privinŃa modurilor de utilizare a vizualizărilor în linie . O subinterogare a. Reprezintă o uniune internă (inner join) e. Trebuie să nu fie încadrate în paranteze e. Are ca rezultat un mesaj de eroare b.clauza WHERE din interogarea externă ia valoarea logică „adevărat". Nu returnează nici un rând din setul de rezultate c. Interogarea externă selectează valoarea maximă INCHIRIAT_NUMAR din interogarea internă. Permite selectarea flexibilă a rândurilor 2. Iată un exemplu: • Această interogare află numărul maxim de închirieri ale unui singur film. Poate fi scrisă în Microsoft SQL Server folosind operatorul = sau =* în clauza WHERE . Reprezintă o uniune externă (outer join) d. iar rândul CLIENT_ID este adăugat în setul de rezultate. Vizualizări în linie Foarte puŃine implementări. O uniune externă (outer join) a. tratată ca şi cum ar fi o vizualizare predefinită. Poate fi folosită pentru a selecta valorile care vor fi aplicate condiŃiilor din clauza WHERE b. l. O uniune (join) fără o clauză WHERE sau o clauză JOIN a. şi reŃineŃi că întrebările pot avea mai multe răspunsuri corecte. printre care Oracle. permit folosirea unei subinterogări în clauza FROM a unei interogări. Poate fi scrisă în Oracle SQL folosind un simbol (+) în clauza FROM b. Această construcŃie permite care setul de rezultate al unei interogări să fie tratat ca şi cum ar fi un tabel sau o vizualizare predefinită. Poate fi corelată sau necorelată c. NUMAR(*) AS INCHIRIAT_NUMAR FROM FILM_INCHIRIAT GROUP BY FILM_ID) MAX_INCH_NUMAR 5 Interogarea internă calculează numărul de închirieri pentru fiecare valoare FILM_ID. într-o construcŃie numită vizualizare în linie (inline view).

Pot fi numere care indică poziŃia relativă a tabelelor dîn lista FORM c. Pot fi nume de tabele b. Pot fi pseudonime pentru numele 8.O uniune încruşişată este: a. Nu poate avea niciodată ca rezultat un produs cartezian b. O uniune externă d. Pot fi pseudonime pentru numele de coloane . Poate fi o uniune internă sau o uniune externă c. Defineşte o uniune externă e. Calificatorii numelor de coloane: a. O uniune Internă 9. O uniune Naturală b. O subinterogare corelată . Necesită folosirea unei clauze JOIN e. Rezolvă relaŃiile recursive d. Poate fi catre stânga. N produs cartezian c. Implică două tabele diferite 5. Realizează întotdeauna legarea rândurilor folosind o condiŃie de inegalitate (<>) 7. c. Poate folosi o subinterogare pentru a limita şi mai mult rândurile selectate e. a. Este realizată ori de câte ori în clauza FROM sunt specificate mai multe tabele d. Returnează toate rândurile din unul sau din ambele tabele e. Combină coloanele din două sau mai multe tabele în rezultatele unei singure interogări b. Nu poate fi folosită atunci când coloanele prin care se face legarea tabelelor au aceleaşi nume c. Necesită o listă de tabele separate prin virgule în clauza FROM 6. Nu poate fi folosită atunci când coloanele prin care se face legarea tabelelor au nume diferite b. b. definite în clauza FORM d. către dreapta sau completă 4. O clauză JOIN folosind cuvântul cheie USING a. Defineşte o auto-uniune 10. O uniune (Join) a. O uniune de egalitate (equijoin) Este cunoscută şi sub numele de uniune externă (outerjoin) Este cunoscută şi sub numele de uniune internă (innerjoiti) Este cunoscută şi sub numele de auto-uniune (selfjoin) Realizează întotdeauna legarea rândurilor folosind o condiŃie de egalitate (=) e. Combină rânduri din interogari multiple într-un singur set de rezultate c. Defineşte o uniune internă d. d. Returnează toate rândurile doar din unul dintre tabele d. O auto-uniune (selfjoin) a.c.

AfişaŃi numărul de închirieri pentru fiecare format (DVD şi VHS). Folosind subinterogări pentru a filtra rândurile. 8. FolosiŃi uniuni pentru a stabili ce clienŃi sunt angajaŃi şi ce angajaŃi au conturi de clienŃi. împreună cu numele de familie al şefu1ui lor. 3. 6. d.a. Scrierea interogărilor avansate În această parte se prezintă câteva subiecte avansate. ReŃineŃi că toate funcŃiile SQL au o trăsătură comună. sunt incluse câteva funcŃii pentru date şi ore. 1. şi anume: FuncŃii SQL avansate. Rulează mai eficient decât o subinterogare necorelată Rulează mai puin eficient decât o subinterogare necorelată Are o interogare internă care refera coloane din interogarea externă Are o interogare externă care refera coloane din interogarea internă Are o interogare internă care nu face nici o referire la coloanele din interogarea externă ScrieŃi instrucŃiunile SQL pentru următoarele probleme: AfişaŃi numele şi identificatorul de client ale tuturor persoanelor decedate (valoarea DATA_MORTII nu este nulă) care încă au conturi de client. RescrieŃi interogarea anterioară folosind o uniune în local unei subinterogări pentru a găsi filmele în format VHS. 10. 5. AfişaŃi toate filmele pentru care în inventar există mai multe copii în acelaşi format. 7. în sensul că returnează o singură valoare. 4. aşa că sunt utile în diferite locuri din instrucŃiunile SQL. AfişaŃi numele angajatilor care au conturi de clienŃi. inclusiv funcŃii pentru caractere. AfişaŃi titlul filmelor pentru care în inventar există o copie VHS (MEDIA_FORMAT = ‘V’. iar DATA_VANZARII are valoarea NULL) dar pentru care nu există copii DVD (MEDIA_FORMAT = ‚D’ ). AfişaŃi numele de familie al fiecarui angajat. 9. SecŃiunile următoare descriu funcŃii care nu au fost prezentate dar foarte utile. c. AfişaŃi numărul de identificare (FILM_ID) şi data la care trebuie returnate (DATA_RETURNARII) pentru toate filmele închiriate şi încă nereturnate (coloană RETURNAT_DATA din tabelul FILM_INCH conŃine valori nule). inclusiv în lista de coloane a comenzii SELECT şi în clauza . e. matematice şi pentru dată sau oră O descriere a modului în care puteti beneficia de avantajele vizualizărilor InformaŃii despre expresia SQL CASE şi despre utilizarea acesteia pentru construirea instrucŃiunilor care includ porŃiuni executate numai în anumite condiŃii predefinite. AfişaŃi numarul de identificare şi titlul filmelor care nu au fost închiriate niciodată. dar care nu au fost cumpărate (coloană DATA_VANZARII din tabelul FILM_COPY conŃine valori nule). b. Pe lângă funcŃiile pentru caractere şi matematice. 2. RescrieŃi interogarea anterioară pentru a folosi subinterogări în loc de uniuni.

8976 401. Daca trebuie sa eliminati atât spatiile de la inceputul sirului. Exemplu care înlocuieşte toate liniuŃele de despărŃire din numărul de telefon al unei persoane cu puncte (sunt prezentate numai primele două rânduri din setul de rezultate) SELECT PERSOANA_TELEFON. cat şi pe cele de la sfarsit. cele din mijlocul şi de la sfârşitul şirului sunt lăsate ca atare. Sintaxa generală a funcŃiei: REPLACE (şir_de_caractere. FuncŃii pentru caractere FuncŃiile pentru caractere operează asupra datelor de tip text. pe lângă cele discutate în lecŃia 3. ca în urmatorul exemplu: . şir_cautat este un şir format dintr-un caracter sau mai multe. '.7297 LTRIM FuncŃia LTRIM elimină spatiile de la începutul unui şir de caractere. dar poate fi orice expresie care are ca rezultat un şir de caractere. PERSOANA_TELEFON 230—229—8976 401—617—7297 DISPLAY_TELEFON 230. care trebuie căutate în sir_de_caractere. LTRIM (‘ String cu spaŃii ‘) Returnează: ‘String cu spaŃii ’ RTRIM FuncŃia RTRIM este similar cu LTRIM. în cele mai multe cazuri. şir_de_intocuire este şirul de caractere cu care se înlocuieşte orice apariŃie a şirului_cautat în şir_de_caractere.617. furnizate de diferiŃi producători SGBD. puteti imbrica funcŃiile LTRIM şi RTRIM. REPLACE FuncŃia REPLACE caută un şir de caractere şi înlocuieşte caracterele găsite cu caracterele din şirul de înlocuire. şir_de_înlocuire} şir_de_caractere reprezintă şirul de caractere în care se face căutare şi.WHERE. este numele unei coloane dintr-un tabel. Această secŃiune prezintă câteva funcŃii frecvent folosite. Vă reamintim că există un număr mare de funcŃii specifice fiecărei implementări.') AS DISPLAY_TELEFON FROM PERSOANA. REPLACE(PERSOANA_TELEFON. Sunt eliminate numai spaŃiile de la începutul şirului. dar elimin spatiile de la sfârsitul unui sir de caractere. '-'. şir_căutat.229.

Exemplele următoare selectează din tabelul FILM_INCHIRIAT. ISNULL. în timp ce valorile nenule sunt lăsate ca atare. . TAXA_INTARZIERE_SAU_PIERDERE 29. TAXA_INTARZIERE_SAU_PIERDERE FROM FILM_INCHIRIAT WHERE TRANSACTIE_ID=9 . A fost selectată tranzacŃia 9 deoarece conŃine două filme.98 2 rows selected. numită TRIM. Din nefericire.) Oracle: SELECT NVL(TAXA_INTARZIERE_SAU_PIERDERE. IFNULL) Oracle. fiecare implementare foloseste propriul nume pentru aceast funcŃie: NVL în Oracle. cât şi pe cele de la sfârşit. TAXA_INTARZIERE_SAU_PIERDERE 0 29.98 0. FuncŃii pentru valori nule (NVL.RTRIM(LTRIM (‘ String cu spatii ‘) Returnează: ‘String cu spatii’ NOTA: Oracle pune la dispoziŃie o funcŃie mai convenabilă.00 (2 rows affected) MySQL: SELECT IFNULL(TAXA_INTARZIERE_SAU_PIERDERE.98 . Microsoft SQL Server şi My SQL pun la dispoziŃie o funcŃie care înlocuieşte valorile nule cu o valoare specificată. coloana TAXA_INTARZIERE_SAU_PIERDERE(sau redunumită TAXA_PENALIZARE). TAXA_INTARZIERE_SAU_PIERDERE FROM FILM_INCHIRIAT WHERE TRANZACTIE_ID=9. TAXA_INTARZIERE_SAU_PIERDERE 29.00 0) AS 0) AS 0) AS . dintre care unul are o valoare nulă în coloana TAXA_INTARZIERE_SAU_PIERDERE (un exemplu bun. care elimină atât spaŃiile de la începutul şirului. înlocuind valorile nule cu zero. TAXA_INTARZIERE_SAU_PIERDERE FROM FILM_INCHIRIAT WHERE TRANSACTIE_ID=9. ISNULL în SQL Server şi IFNULL în MySQL. Microsoft SQL Server: SELECT ISNULL(TAXA_INTARZIERE_SAU_PIERDERE. care ilustreaza faptul că valorile nule sunt transformate.

De exemplu: CHAR(44) returnează o virgulă CHAR(50) returneaza 2 Se poate folosi funcŃiile CHAR şi ASCII consultând tabele cu caractere şi codurile ASCII corespunzătoare uşor de gasit în Internet. Exemple cu funcŃiile ASCII şi CHAR: Să se găsească toate titlurile de filme care conŃin un caracter Tab: Microsoft SQL Server: SELECT FILM_ID FROM FILM WHERE FILM_TITLU LIKE ‘%‘+CHAR(9)+’%’. 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.2 rows în set (0. De exemplu: ASCII(‘ ‘) eturnează valoarea 32(codul ASCII pentru spaŃiu) ASCII(‘A’) eturnează valoarea 65(codul ASCII pentru caracterul A) ASCII(‘a ‘) eturnează valoarea 97(codul ASCII pentru caracterul a) ASCII(‘1‘) eturnează valoarea 49(codul ASCII pentru caracterul 1) CHAR (CHR) FuncŃia CHAR (numită CHR în Oracle şi DB2) returnează caracterul corespunzator unei valori ASCII (un numar între 0 şi 255). Această funcŃie este utilă în special pentru concatenarea caracterelor care nu pot fi afişate sau sunt greu de manipulat în SQL. de exemplu: Valoare ASCII 9 10 13 (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). Tab Linie noua Retur de car Caracter .16 sec) Se observă diferenŃa de formatare a rezultatelor pentru clientul MySQL în linia de comandă. FILM_ID (0 rows affected) Oracle: SELECT FILM_ID FROM FILM WHERE FILM_TITLU LIKE ‘%‘ || CHR(9) || ‘%‘ .

99 4 4 29.no rows selected Să se găsească toate titlurile de filme care conŃin un caracter apostrof: SELECT FILM_ID FROM FILM WHERE FILM_TITLU LIKE ‘%‘+CHAR(39)+’%’. acceptă ca parametru de intrare o expresie numerică. SIGN FuncŃia SIGN primeşte ca argument o expresie numerică şi returnează una dintre următoarele valori. Sintaxa generală a funcŃiei este: SQRT (expresie numerică) TAXA_SIGN 1 1 1 1 Valoarea de intrare este Numărul de intrare este Numărul de intrare este Semnificatie Numărul de intrare este . o valoare numerică dintr-o coloană a unui tabel sau orice expresie (inclusiv rezultatul unei alte funcŃii) care produce o valoarea numerică.98 SQRT FuncŃia SQRT primeşte ca argument o expresie numerică şi returnează rădăcina pătrată a acesteia. TAXA_PENALIZARE 29. FILM_ID are valoarea 3 (Something's Gotta Give). care poate fi o valoare literală. SIGN(TAXA_PENALIZARE) AS TAXA_SIGN FROM FILM_INCHIRIERE WHERE TAXA_PENALIZARE IS NOT NULL. în funcŃie de semnul numărului de intrare: Valoare returnata -1 negativ 0 zero 1 pozitiv Null nulă Exemplu: SELECT TAXA_PENALIZARE. de obicei. FuncŃii matematice FuncŃiile matematice returnează rezultatul unei operaŃii matematice şi.

47631263 2 2 5. în timp ce DB2 şi MySQL permite folosirea ambelor nume (CEIL şi CEILING).Vom extrage radacina patrată din valorile TAXA_PENALIZARE nenule pe care tocmai le-am vazut: SELECT TAXA_INTARZIERE_SAU_PIERDERE. TAXA_PENALIZARE 29. Oracle foloseşte numele CEIL. în care se aplică funcŃia FLOOR asupra valorilor din coloana TAXA_PENALIZARE: SELECT TAXA_PENALIZARE. FLOOR(TAXA_INTARZIERE_SAU_PIERDERE) AS TAXA_FLOOR FROM FILM_INCH WHERE TAXA_INTARZIERE_SAU_PIERDERE IS NOT NULL. Ca exemplu. Exemplu.99 29.00 29. să aplicăm funcŃia CEILING asupra valorilor din coloana TAXA_PENALIZARE : SELECT TAXA_PENALIZARE. SQRT (TAXA_PENALIZARE) AS TAXA_SQRT FROM FILM_INCH WHERE TAXA_INTARZIERE_SAU_PIERDERE IS NOT NULL.98 TAXA_CEILING 4 4 30 30 TAXA_SQRT 5.98 CEILING (CEIL) FuncŃia CEILING returnează cel mai mic întreg mai mare sau egal cu valoarea expresiei numerice furnizată ca parametru de intrare. Există câteva probleme interesante de compatibilitate legate de denumire între implementarile SQL: Microsoft SQL Server foloseşte numele CEILING. TAXA_INTARZIERE_SAU_PIERDERE 4. adică rotunjeşte numărul prin adăugire până la următorul număr întreg.99 4 4 29. adică rotunjeşte numărul prin scădere până la următorul număr întreg(parte întreagă). .47539953 FLOOR FuncŃia FLOOR este inversa logică a funcŃiei CEILING — returnează cel mai mare întreg mai mic sau egal cu valoarea expresiei numerice furnizată ca parametru de intrare. CEILING (PENALIZARE) AS TAXA_CEILING FROM FILM_INCHIRIERE WHERE TAXA_PENALIZARE IS NOT NULL.00 4.

reprezentand ziua conŃinuta în valoarea data_si _ora furnizata ca intrare. Termenii scrişi cu caractere italice sunt definiŃi în notele care urmează după fiecare tabel. data_si_ora DATEPART DAY GETDATE parte_de_data. ora.99 29. motivul este faptul ca producătorii au dezvoltat propriile tipuri de date temporale înainte de stabilirea standardelor. cum ar fi anul. ziua.minutul. dată de sfârşit porte _de_dată. într-un format acceptabil pentru sistemul SGBD –ul respectiv. FuncŃie DATEADD DATEDIFF DATENAME Scop Returnează o nouă valoare data_si_ora.98 TAXA_FLOOR 4 4 29 29 FuncŃii pentru dată şi oră Există foarte puŃină consecvenŃă în privinŃa funcŃiilor pentru dată şi oră între diferiŃii producători de sisteme SGBD. RetineŃi că Oracle numeşte acest tip de date DATE şi toate datele au o componentă pentru orã.00 4. în toată această secŃiune. Din cauza acestei diversităŃi. reprezentand luna data_si_ora conŃinuta în valoarea data_si_ora furnizata ca intrare FuncŃii pentru data şi orã în Oracle Oracle are mai multe de 24 de funcŃii pentru data şi ora. data_si_ora parte _de_data.TAXA_PENALIZARE 4. FuncŃii pentru dată şi oră în Microsoft SQL Server NOTA: Valoarea parte_de_dată este un parametru care specifică o parte a datei. Returnează valoarea curenta data_si_ora furnizata de sistem Returnează valoarea curenta data_si_or UTC (Universal Coordinated Time) Parametri de intrare parte_de_data. reprezentând partea _de_dată selectată pentru valoarea data_si_ora furnizată ca intrare Returnează o valoare intreaga. interval. data_si_ora data_si_ora Nu are Nu are GETUTCDATE MONTH Returnează o valoare intreaga. secunda şi milisecunda. funcŃiile pentru dată şi oră sunt prezentate pe scurt pentru Microsoft SQL Server şî Oracle. data de început.00 29. termenul data_si__ora înseamnă un şir de caractere care conŃine informaŃii despre dată şi oră. reprezentand partea_de_data selectata pentru valoarea data_si_ora furnizata ca intrare Returnează o valoare intreaga. adăugând un interval la valoarea parte _de_data furnizata ca parametru Returnează numărul de intervale data_şi_ora trecute între două date Returnează un nume sub formă de text. luna. care are .

respectiv YEAR. ca şir de caractere. • FuncŃia TRUNC poate fi folosita şi pentru trunchierea valorilor numerice. având ca efect ştergerea cifrelor din dreapta punctului zecimal. funcŃia returnează un sir de caractere. Daca acest parametru este omis. folosind 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. în formatul specificat de sirul_pentru_formatare Transforma sirul de caractere furnizat ca intrare intr-o data formatata intern de Oracle. numarul de luni (o Adauga numarul de luni specificat la data 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. DAY. FuncŃie ADD_MONTHS Scop Parametri de intrare Data. • FuncŃia TO_CHAR poate fi folosită şi pentru transformarea valorilor numerice în şiruri de caractere.valoarea zero (reprezentând miezul noptii) atunci când nu este folosită. data Returnează data furnizata. MONTHS_BETWEEN Prima data. • Ş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. cuvant cheie pentru data_si_ora . De exemplu. iar şirul de formatare 'DD-MON-RR' (formatul Oracle prestabilit) are ca rezultat o dată de forma '01-Dec-04’. sir_pentru_formatare TO_DATE Data. de forma '12/01/2004 11:58’. Data. sir_pentru_formatare TRUNC Data. 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. MONTH. şirul de formatare 'MM/DD/YYYY HH:MI' are ca rezultat o dată. HOUR. Există peste 40 de simboluri diferite care pot fi folosite în şirurile de formatare (puteŃi găsi lista completă în documentaŃia Oracle). FuncŃiile pe care este cel mai probabil să le folosiŃi sunt prezentate în tabelul următor: NOTA: • Cuvântul cheie pentru câmpul data_şi__ora este un cuvânt cheie care specifică unul dintre câmpurile conŃinute de o dată Oracle. MINUTE şi SECOND. a doua data rezultatul este negativ daca a doua data este inaintea primei SYSDATE TO_CHAR Returnează valoarea curenta data_si_ora furnizata Nu are de sistem Atunci cand este folosita pentru o data. data este trunchiata la ziua curenta.

PERSOANA_NUME_FAMILIE AS MANAGER_NUME FROM ANGAJAT A JOIN PERSOANA B ON A.Folosirea avantajelor oferite de vizualizari Amintim că o vizualizare (view) este o interogare stocată în baza de date. Vă amintiŃi din LecŃia 2. actualizare şi ştergere) dar interogările funcŃionează pentru vizualizări la fel ca şi pentru tabele.PERSOANA_ID LEFT OUTER JOIN PERSOANA C ON A. pot fi interogate ca şi cum ar fi tabele reale. C. De fapt.PERSOANA_ID View created.PERSOANA_ID = B. că sintaxa generală pentru crearea unei vizualizări este : CREATE [OR REPLACE] VIEW nume_vizualizare AS interogare_sql. Totuşi. B. Microsoft Access foloseşte termenul query (interogare) în loc de vizualizare. B. C. în asemenea situaŃii.PERSOANA_PRENUME AS MANAGER_PRENUME. după ce sunt create. Pot exista unele restricŃii la manipularea datelor (la inserare. După crearea vizualizării. precum uniunile Cresc performanŃele interogărilor Exemplele din această secŃiune prezintă vizualizări care vă oferă avantajele menŃionate mai sus. aveŃi nevoie de o vizualizare care să poată fi folosită în siguranŃă de un dezvoltator.PERSOANA_INITIALA AS INITIALA . O interogare simplă făcută în vizualizarea pe care tocmai am creat-o: . care pune la dispoziŃia utilizatorului bazei de date un subset particularizat de date din unul sau mai multe tabele ale bazei de date. există un număr de aplicaŃii care necesită furnizarea unor informaŃii despre angajaŃi. InstrucŃiunea SQL folosită pentru crearea vizualizării: CREATE VIEW ANGAJAT_LISTA AS SELECT A.PERSOANA_NUME_FAMILIE AS NUME. B. nu este nevoie ca utilizatorul să ştie dacă foloseşte o vizualizare sau un tabel real.PERSOANA_ID AS ID. cum ar fi numele sau numele şefului lor (dacă există). FrumuseŃea vizualizărilor constă în faptul că. Interogarea din vizualizare trebuie să realizeze o uniune (join) cu tabelul PERSOANA pentru a afla numele angajatului şi (folosind o uniune externă) numele şefului acestuia. puteŃi să o interogaŃi ca şi cum ar fi un tabel.SUPERVISOR_PERSOANA_ID = C.PERSOANA_PRENUME AS PRENUME. fără pericolul de a dezvălui în mod accidental informaŃii confidenŃiale. Exemple: • Reguli evidente de confidenŃialitate obligă administratorul magazinului să Ńină secrete datele de identificare ale angajaŃilor (numerele de asigurări sociale) şi salariile. Vizualizările oferă şi alte avantaje: Maschează coloanele pe care utilizatorul nu este nevoie sau nu trebuie să le vadă Maschează rândurile pe care utilizatorul nu este nevoie sau nu trebuie să le vadă Maschează operatiile complexe.

FILM_TITLU. A.FILM_GEN_DESCRIERE AS GEN. A. InstrucŃiunea SQL folosită pentru crearea vizualizării: CREATE VIEW FILM_LISTA AS SELECT A. C. aveŃi nevoie de o listă cu descrierile categoriilor MPAA şi cu descrierile genurilor.ANUL_PRODUCERII FROM FILM A JOIN FILM_GEN B ON A.RETAIL_PRET_DVD.MPAA_RATING_COD AS RATING. B. A. 1 Man on Fire The Last Samurai 50 First Dates Matchstick Men Something's Gotta Give The School of Rock Big Fish Cold Mountain Lot în Translation Monster Mystic River Road to Perdiction .FILM_GEN_COD = B.SELECT NUME.MPAA_RATING_COD Exemplu de interogare simplă care foloseşte vizualizarea în locul tabelelor de bază: SELECT GEN. FILM_TITLU FROM FILM_LISTA ORDER BY GEN.FILM_GEN_COD JOIN MPAA_RATING C ON A. RATING. MANAGER_NUME FROM ANGAJAT_LISTA ORDER BY NUME.MPAA_RATING_DESCRIERE AS RATING_DESC. A. C.MPAA_RATING_COD = C.FILM_ID. RATING. GEN Actiune şi Aventura Actiune şi Aventura Actiune şi Aventura Actiune şi Aventura Actiune şi Aventura Actiune şi Aventura Actiune şi Aventura Comedie Comedie Comedie Comedie Drama Drama Drama Drama Drama Drama RATING PG-13 PG-13 PG-13 PG-13 R R R PG-13 PG-13 PG-13 PG-13 PG-13 R R R R R FILM_TITLU Master and Commander: The Far Pirates of the Caribbean: The The Day After Tomorrow The Italian Job Kill Bill: Vol. NUME MANAGER_NUME Alexandru Popescu Alexandru Ionescu Alexandru • Pentru crearea unui catalog cu filmele disponibile.RETAIL_PRET_VHS. FILM_TITLU.

'PG'. PG şi PG-13 să fie disponibile în acest chioşc. 'PG-13') Rezultatele obŃinute. Dorim ca numai filmele din categoriile MPAA G. GEN Actiune şi Aventura Actiune şi Aventura Actiune şi Aventura Actiune şi Aventura Comedie Comedie Comedie Comedie Drama Romantic Romantic RATING PG-13 PG-13 PG-13 PG-13 PG-13 PG-13 PG-13 PG-13 PG-13 PG-13 PG-13 FILM TITLU Master and Commander: The Far Pirates of the Caribbean: The The Day After Tomorrow The Italian Job 50 First Dates Matchstick Men Something's Gotta Give The School of Rock Big Fish 13 Going on 30 Two Weeks Notice Vizualizarea COPII_FILM_LISTA se bazează pe vizualizarea FILM_LISTA şi poate să devină invalidă sau să nu mai funcŃioneze corect dacă vizualizarea FILM_LISTA este modificată. FILM_TITLU FROM COPII_FILM_LISTA ORDER BY GEN. Pentru prima dată. FILM _TITLU. se poate folosi vizualizarea FILM_LISTA pentru a crea o nouă vizualizare (adică se poate folosi o vizualizare pentru a crea o altă vizualizare! Exemplu: CREATE VIEW COPII_FILM_LISTA AS SELECT * FROM FILM__LISTA WHERE RATING IN ('G'. o coloană din rezultatele interogării poate fi formatată în funcŃie de valorile conŃinute pe o altă coloana. RATING. . Expresia CASE Expresia CASE este o adăugire recentă. În loc să se repete uniunea din vizualizarea FILM_LISTA dacă MPAA ar modifica sistemul de clasificare. părŃi ale instrucŃiunilor SQL pot fi executate condiŃional. care nu pot fi ignorate. astfel încât tinerii să poată căuta filmele online. dar foarte importantă.Strain Romantic Romantic R PG-13 PG-13 Das Boot 13 Going 30 Two weeks notice • Magazinul de produse video ar vrea să instaleze un chioşc informatizat în secŃiunea de filme pentru copii. folosind aceeaşi interogare ca şi pentru vizualizarea FILM_LISTA: SELECT GEN. RATING. Vizualizările sunt instrumente puternice. la standardul SQL. De exemplu.

este returnată valoarea expresie_rezultata şi nici o altă condiŃie WHEN nu mai este evaluată. Iată exemplul: SELECT FILM_ID. 1 2 3 4 5 6 7 8 9 10 FILM ID RATING RATING_DESC R Peste 17 ani R Peste 17 ani PG-13 Peste 13 ani PG-13 Peste 13 ani R Peste 17 ani PG-13 Peste 13 ani PG-13 Peste 13 ani R Peste 17 ani PG-13 Peste 13 ani R Peste 17 ani . dacă rezultatul are valoarea TRUE logic. care poate fi afişat la terminalul de vânzare.Expresia CASE admite două forme generale: Expresia CASE simplă Sintaxa generală pentru forma simplă a expresiei CASE: CASE expresie_ de_ intrare WHEN expresie_de_comparare THEN expresie__rezultat [WHEN expresie de_comparare THEN expresie_rezultat. De exemplu. se poate folosi expresia CASE pentru a transforma valoarea MPAA_RATING_COD într-un mesaj simplu. RemarcaŃi plasarea cuvântului cheie AS imediat după cuvântul cheie END. pentru a aminti personalului magazinului să verifice vârsta clienŃilor în cazul filmelor cu o categorie MPAA mai mare de PG-13. Dacă nici una dintre condiŃiile WHEN nu este evaluată ca adevărată şi exista o condiŃie ELSE. pentru a asocia un nume coloanei generate în setul de rezultate. 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. este returnată valoarea expresie_rezultat asociată condiŃiei ELSE. ] ELSE expresie_rezultat END notă: Fiecare condiŃie WHEN este evaluată sub forma expresie_de_intrare = expresie_comparare şi. MPAA_RATING_COD AS RATING. CASE MPAA_RATING_COD WHEN 'G' THEN ‚Toate varstele' WHEN 'PG' THEN ‚Acordul parintilor’ WHEN 'PG-13' THEN 'Peste 13 ani' ELSE 'Peste 17 ani’ END AS RATING_DESC FROM FILM ORDER BY FILM _ID..

WHEN RETAIL_PRET_VHS < 10 THEN ’Ieftin’ WHEN RETAIL_PRET__VHS < 20 THEN ’Convenabil’ WHEN RETAIL PRET VHS < 40 THEN ’Mediu’ ELSE 'Scump' END AS PRET_CATEGORIE FROM FILM ORDER BY FILM_ID. Sintaxa generală a expresiei: CASE WHEN condiŃie THEN expresie_rezultat [WHEN condiŃie THEN expresie_rezultat. . .99 12. deoarece fiecare condiŃie este complet specificată.99 RETAIL_PRET_ IE Scump Convenabil Convenabil Convenabil Mediu Mediu Convenabil Scump Convenabil Scump PRET_CATEGOR . ] ELSE expresie_rezultat END notă: Fiecare condiŃie poate fi orice expresie SQL care este evaluată ca adevărata sau falsă.95 11. Dacă nici una dintre condiŃiile WHEN nu este evaluata ca adevărată şi nu exişti o condiŃie ELSE. Dacă nici una dintre condiŃiile WHEN nu este evaluată ca adevărată şi există o condiŃie ELSE.99 14. CondiŃiile WHEN sunt evaluate secvenŃial şi. este returnata valoarea expresie_rezultat asociată şi nici o altă condiŃie WHEN nu mai este evaluata.99 24.95 24. RETAIL_PRET_VHS. De exemplu. este returnată valoarea expresie_rezultat asociată condiŃiei ELSE. CASE WHEN RETAIL_PRET__VHS IS NULL THEN ‚Not Available’ .Expresia CASE cu căutare Expresie CASE cu căutare (searched CASE) permite folosirea unor condiŃii de comparare mai flexibile. dacă una este evaluată ca adevărata. în funcŃie de pret: SELECT FILM_ID.95 50. FIL M_ID 1 2 3 4 5 6 7 8 9 10 VHS 58. incluzând şi operatorul de comparare. este returnată o valoare nulă. considerăm o interogare care clasifică filmele în format VHS.98 49.97 15.95 14.

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

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

Este posibil ca într-o instrucŃiune DML să referiŃi şi o vizualizare care conŃine date din mai multe tabele (adică o vizualizare care conŃine o uniune de tabele). adică un grup de instructiuni care trebuie să reuşească toate sau sa eşueze toate. o parte a limbajului SQL folosită pentru intreŃinerea datelor stocate în tabele relaŃionale ale bazei de date. trebuie să se Ńină seama de urmatoarele aspecte referitoare la restricŃiile tabelului modificat: . SGBD va trata fiecare instrucŃiune DML individuală ca pe o tranzactie. Limbajul de manipulare a datelor – DML În această lecŃie se prezintă instrucŃiunile DML (Data Manipulation Language). întreaga instrucŃiune eşuează şi sistemul SGBD reface (unii ar spune „ca prin magie”) cele două rânduri şterse. Sterge rânduri dintr-un tabel al bazei de date InstrucŃiunile DML individuale afectează datele dintr-un singur tabel. toate coloanele vizualizării referite în instrucŃiunea DML trebuie să corespundă unor coloane dintr-un singur tabel fizic al bazei de date. De exemplu . Această caracteristică este foarte utilă atunci când instructiunile SQL sunt folosite în tranzacŃii comerciale. dar. asa că aceasta nu va afecta nici unul din rândurile tabelului. sunt restricŃiile definite în tabelul referit de instrucŃiunea DML.LecŃia 5. Limbajul DML este format din trei comenzi SQL: INSERT UPDATE DELETE Adaugă noi rânduri într-un table al bazei de date. Actualizeaza rândurile existente Într-un table al bazei de date. La formarea instructiunilor DML. dacă incerc să sterg toate rândurile din tabelul FILM şi apare o eroare la ştergerea celui de-al treilea rând (după ce au fost deja şterse primele două rânduri ). Cu alte cuvinte. Un alt aspect de care este important să se Ńină seama. instrucŃiunea DML poate referi numai coloane dintr-un singur tabel al vizualizării. Instructiunile SQL din acestă lecŃie presupune că sistemul SGBD pe care il utilizaŃi foloseste formatul AAAA-LL-ZZ pentru datele calendaristice. în care o serie de instrucŃiuni DML sunt tratate unitar. instrucŃiunea de mai jos modifică formatul datelor calendaristice pentru sesiunea curenta (baza de date revine la formatul prestabilit de fiecare dată când va reconectaŃi la baza de date): ALTER SESSION SET NLS_DATA_FORMAT=’YYYY-MM-DD’. sistemul SGBD nu va permite niciodată apariŃia inconsecvenŃelor în baza de date. Sistemul SGBD nu va efectua în baza de date nici o modificare care încalcă una din restricŃii. atunci cand o instrucŃiune DML foloseşte o vizualizare. sistemul DML va anula intreaga instrucŃiune. Aceasta înseamna că. Pentru bazele de date Oracle. în acest caz. Cu alte cuvinte. dacă apare o eroare la modificacfrea unui rând identificat de instrucŃiunea DML. Este foarte probabil ca sistemul SGBD folosit să pună la dispoziŃie o formă oarecare de tranzacŃii.

nu se poate şterge un rând părinte dacă există rânduri subordonate care referă valoarea din rândul părinte. 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. . decât dacă restricŃia a fost definită cu opŃiunea ON DELETE CASCADE. InstrucŃiunea INSERT InstrucŃiunea SQL INSERT este folosită pentru inserarea noilor rânduri de date în tabele. coloanele pe care a fost definită o restricŃie de unicitate trebuie sa aibă valori unice în întregul tabel.RestricŃii de tip cheie primară Atunci când inseraŃi un nou rând într-un 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ă. În cazul instrucŃiunilor INSERT. Î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. apoi randurile copii). Restrictii de verificare (CHECK) O instructiune INSERT sau UPDATE nu poate stoca într-o coloana o valoare care încalcă o restricŃie CHECK definită pentru coloana respectivă. InstrucŃiunea are două forme de bază: una în care valorile coloanelor sunt specificate chiar în instrucŃiune şi alta în care valorile sunt selectate dintr-un tabel sau o vizualizare. In sens invers.Cand modificati valoarea unei chei primare (ceea ce se intampla rareori). O valoare nula nu este acelasi lucru un un spatiu liber. folosind o subinterogare. iar ştergerile trebuie făcute în ordine inversă (copiii inaintea părinŃilor). In general inserările în tabele trebuie făcute ierarhic (mai intai randurile parinte. Iata sintaxa generală a instrucŃiunii: INSERT INTO nume_tabel_sau_vizualizare [(lista_de_coloane)] VALUES (lista_de_valori). 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 de unicitate Ca şi în cazul cheilor primare. Dacă instrucŃiunea DML referă o vizualizare . deoarece valorile pentru rândul de date respective sunt specificate chiar în instrucŃiune. noua valoare trebuie să fie unică în întregul tabel. Inserarea unui singur rand de dete folosind clauza Values InstrucŃiunea INSERT care foloseşte o clauză VALUES poate crea un singur rând la fiecare rulare. un sir vid sau valoarea zero – este o valoare speciala care nu este egala cu nimic altceva. trebuie specificate valori pentru toate coloanele cu restricŃii NOT NULL. cheia primară a noului rând trebuie sa fie unică în întregul tabel.

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

în aceeaşi ordine. Dacă lista de coloane este specificată. deoarece opiterea acesteia face ca instrucŃiunea INSERT să fie dependentă de definiŃia tabelului. Tabelul FILM_LIMBA conŃine rânduri pentru limba franceză pentru o parte din filme. ’fr’ FROM FILM FILM WHERE FILM_ID NOT IN ( SELECT FILM_ID FROM FILM_LIMBA WHERE COD_LIMBA =’fr’ ). COD_LIMBA) SELECT FILM_ID. Dacă o coloană este modificată sau în tabel este adăugată o nouă coloană. probabil instrucŃiunea INSERT va eşua la următoarea rulare. • • Se remarcă următoarele: Lista de coloane este opŃională. Această formă este utilă şi pentru stabilirea următoarei valori disponibile pentru o cheie primară cu valori secvenŃiale. dar dacă este inclusă trebuie să fie încadrată în paranteze.Inserări masive folosind instrucŃiunea SELECT internă Aşa cum se observă. chiar şi opŃională. InstrucŃiunea INSERT care va rezolva această problemă este: INSERT INTO FILM_LIMBA (FILM_ID. în ordinea în care sunt definite coloanele în tabel. aşa că acum vrem să le adăugăm numai pe cele care lipsesc. Cu alte cuvinte. Sintaxa generală a instrucŃiunii este INSERT INTO nume_tabel_sau_vizualizare [(lista_de_coloane)] SELECT instructiune_select. Dacă lista de coloane este omisă. instrucŃiune SELECT internă să furnizeze o valoare pentru fiecare coloană din lista de valori. este forma care foloseşte o instrucŃiune SELECT internă. care poate fi folosită pentru a insera rânduri multiple într-un tabel . . instrucŃiune SELECT internă trebuie să furnizeze o valoare pentru fiecare coloană din tabel. 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. între lista de coloane şi setul de rezultate al instrucŃiunii SELECT trebuie să existe o corespondenŃa unu-la-unu. 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. O altă soluŃie. să presupunem că toate filmele sunt acum disponibile şi în limba franceză. • • Ca exemplu. Cuvântul cheie NULL poate fi folosit în instrucŃiunea SELECT pentru specificarea unei valori nule pentru o coloană. De asemenea . Este bine ca întotdeauna să includeŃi lista de coloane. Orice coloană care lipseşte din listă va primi o valoare nulă. presupunund că valorile nule sunt acceptate în coloana respectivă.

Dacă această clauză este omisă. cu un operator de egalitate între fiecare nume şi valoare.nume_coloana = expresie. InstrucŃiunea următoare va actualiya două coloane din acelaşI rând a tabelului MOVIE. InstrucŃiunea poate să folosească şi o vzualizare.95 .] [ WHERE conditie]. motorul SQL va încerca să actualizeze toate rândurile din tabel sau din vizualizare.. Dacă vreŃi să ştergeŃi o singură valoare din rândurile existente. Sintaxa generală a instrucŃiunii UPDATE: UPDATE nume_tabel_sau_vizualizare SET nume_coloana = expresie [. În instrucŃiunile DELETE nu sunt referite niciodată coloane. folosiŃi instrucŃiunea UPDATE pentru a înlocui valorile . 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). 2) WHERE ANGAJAT_JOB_CATEGORY =’C’ . Expresia poate fi o constantă. un alt nume de coloană sau orice altă expresie pe care SQL o poate transforma într-o singură valoare. împreună cu o expresie care specifică noua valoare pentru fiecare coloană. Această instrucŃiune va actualiza o singură coloană de pe mai multe rânduri. separate prin virgule. UPDATE FILM SET RETAIL_PRET_VHS = 29. • • • InstrucŃiunea DELETE InstrucŃiunea DELETE şterge unul sau mai multe rânduri dintr-un tabel.1. Aceasta este o listă de perechi nume-valoare. doarece instrucŃiunea şterge rânduri întregi de date.95 WHERE FILM_ID = 21 • Conducerea firmei de produse video a decis să crească salariul tuturor funcŃionarilor cu 10 procente. • Se remarcă următoarele: Clauza SET conŃine o listă cu una sau mai multe coloane.InstrucŃiunea UPDATE InstrucŃiunea UPDATE este folosită pentru actualizarea datelor din coloanele unui tabel (sau ale unei vizualizări).. UPDATE ANGAJAT SET ANGAJAT_PLATA_ORA = ROUND (ANGAJAT_PLATA_ORA * 1. care poate fi apoi atribuită coloanei respective. inclusiv toate valorile datelor (toate coloanele) din rândurile afectate. Exemple: Un film a fost adăugat cu un preŃ incorect. rotujind rezultatul la 2 zecimale cu funcŃia ROUND. RETAIL_PRET_DVD = 34. Clauza WHERE conŃine o expresie care limitează rândurile actualizate.

REMOVE c. Coloane dintr-un singur tabel c. deoarece o instrucŃiune DELETE fără o clauză WHERE încearcă să şteargă toate rândurile din tabel. rândurile subordonate trebuie şterse înaintea rândurilor părinte. deoarece acestea sunt rânduri „copii” ale rândului din tabelul „FILM” DELETE FROM FILM_COPY WHERE FILM_ID = 21.respective cu valori nule (presupunând că valorile nule sunt permise în acele coloane). În multe implementări SQL se face diferenŃierea literelor mari de cele mici. clauza WHERE specifică rândurile care urmează să fie şterse. Sintaxa generală a instrucŃiunii DELETE este DELETE FROM nume_tabel_sau_vizualizare [ WHERE conditie ]. În general. Totuşi. caz în care valoarea codului de limbă trebuie specificată cu litere mici pentru a se potrivi cu datele din tabel. DROP 2. Limbajul DML include următoarele comenzi SQL: a. DELETE FROM FILM WHERE FILM_ID = 21. Orice rând pentru care condiŃia WHERE este evaluată ca adevărată este şters din tabel. Atunci când este inclusă. Nu se pot şterge rânduri dacă se încalcă o restricŃie referenŃială. DELETE FROM FILM_LIMBA WHERE COD_LIMBA =’es’. SELECT e. • • Întrebări şi probleme 1. Exemple: Să se şteargă filmul adăugat mai devreme (cu FILM_ID = 21 ). Să se şteargă din tabelul FILM_LIMBA toate rândurile pentru limba spaniolă (COD_LIMBA='es' ). Se observă că trebuie să se ştergă mai întâi rândurile corespondente din tabelele FILM_COPY şi FILM_LIMBA. O vizualizare care conŃine coloane dintr-un singur tabel . INSERT b. DELETE FROM FILM_LIMBA WHERE FILM_ID = 21. Coloane din mai multe tabele b. UPDATE d. Se remarcă următoarele: • • • Clauza WHERE este opŃională. O instrucŃiune DML poate referi a. este folosită aproape întotdeauna.

O instrucŃiune DELETE fără o clauză WHERE a. O instrucŃiune INSERT cu o comandă SELECT imbricată este utilă pentru a. trebuie să tineti seama de următoarele restricŃii a. Inserarea mai multor rânduri într-un tabel cu o singură instrucŃiune 6. Trebuie să aibă o listă de coloane b. Eliminarea rândurilor duplicate dintr-un tabel e. Poate include o clauză WHERE e. Eşuează şi returnează o eroare d. O instrucŃiune UPDATE fără o clauză WHERE a. Poate folosi cuvântul cheie NULL pentru a atribui valori nule coloanelor d. Are ca rezultat un produs cartezian 8. RestricŃii cheie primară 4. încearcă să actualizeze toate rândurile din tabel c. La formarea unei instrucŃiuni DML. Popularea unui tabel de test cu date dintr-un alt tabel d. Poate folosi cuvântul cheie NULL pentru a atribui valori nule coloanelor e. RestricŃii NOT NULL d. Găsirea următoarei valori pentru o cheie primară atribuită secvenŃial b. Are ca rezultat un produs cartezian e. Trebuie să aibă două liste de coloane. Trebuie să includă o listă de coloane 9. una în clauza INSERT şi una în b. Poate insera rânduri multiple la o singură rulare d. O instrucŃiune INSERT cu o comandă SELECT imbricată a.d. RestricŃii referenŃiale b. O instrucŃiune INSERT cu o clauză VALUES a. Coloane ale unei vizualizări bazate pe mai multe tabele 3. Poate include o clauză WHERE 5. Mutarea rândurilor dintr-un tabel în altul c. O instrucŃiune UPDATE . Eşuează si returnează o eroare c. Coloane ale unei vizualizări bazate pe un singur tabel e. RestricŃii de securitate c. încearcă să şteargă toate rândurile din tabel d. Şterge toate rândurile din tabel e. Actualizează toate rândurile din tabel cu valori nule b. Trebuie să aibă o listă de valori c. Trebuie să aibă o instrucŃiune SELECT internă care retumează un singur rând de date c. Trebuie să aibă în instrucŃiunea SELECT internă o listă de coloane care corespunde cu lista de coloane din clauza INSERT sau cu coloanele din tabelul în care sunt inserate datele 7. Actualizează toate rândurile din tabel cu valori nule b. RestricŃii de unicitate e.

(în prezent. O clauză WHERE b. Folosind o instrucŃiune INSERT cu o instrucŃiune SELECT internă. 14. inseraŃi în tabelul FILM un nou rând. O clauză UNION ScrieŃi instrucŃiuni SQL pentru următoarele probleme 13.a. cu valorile FILM_COD_GEN = TRAIN' şi FILM_DESCRIERE_GEN = Training'. Trebuie să includă o clauză WHERE d. InstrucŃiunea SELECT internă a unei instrucŃiuni INSERT poate include a. O uniune a mai multor tabele e. Poate include o listă opŃională de coloane b. cu următoarele valori pentru date: FILM_ID: FILM_COD_GEN: MPAA_COD_RATING: FILM_NUME: 99 'TRAIN' NR ANGAJAT Training Video 15. inseraŃi în tabelul FILM_GENRE un nou rând. O listă de valori d. O instrucŃiune DELETE a. Poate atribui unei coloane valoarea unei alte coloane e. O clauză GROUP BY c. tabelul FILM_LIMBA nu conŃine nici un rând pentru limba japoneză. Una sau mai multe funcŃii de agregare d. Trebuie să includă o clauză SET b. Orice expresie din care rezultă o singură valoare e. Poate folosi cuvântul cheie FORCE pentru a forŃa ştergerea rândurilor d. dar fără listă de coloane. Folosind o instrucŃiune INSERT cu o clauză VALUES si o listă de coloane. Trebuie să furnizeze o nouă valoare pentru cel puŃin o coloană c. ca parte a clauzei WHERE 11. Poate include o clauză WHERE opŃională c. Cuvântul cheie NULL 12. Nu poate încălca restricŃiile referenŃiale ale tabelului e. Poate atribui unei coloane o listă de valori derivate dintr-o expresie 10. Poate avea o instrucŃiune SELECT internă. Numele unei alte coloane c. asociat cu toate filmele din tabelul FILM. Folosind o instrucŃiune INSERT cu o clauză VALUES. Clauza SET dintr-o instrucŃiune UPDATE poate atribui unei coloane o valoare care este a. O constantă b.) . inseraŃi în tabelul FILM_LIMBA un rând pentru limba japoneză (COD_LIMBA = 'ja').

create la întrebarea 15. Folosind o instrucŃiune INSERT cu o instrucŃiune SELECT internă. 18. inseraŃi în tabelul TOTAL_INCHIRIEREun rând pentru fiecare film din tabelul FILM INCHIRIERE. TOTAL_COST_INCHIRIERES NUMERIC (7. ALL. CreaŃi un tabel. actualizaŃi rândul respectiv din tabelul FILM_COPII. 2001 Mariana Popa. Editura Tehnică. NUMBER_OF_INCHIRIERES INTEGER NOT NULL. NUMAR_COPIE = 1) a fost vândută pe data de 15 ianuarie 2005. 17.ÎnvăŃaŃi SQL rapid şi uşor!. 2. Editura Popescu Ileana. CREATE TABLE TOTAL_INCHIRIERE (FILM_ID INTEGER NOT NULL. BIBLIOGRAFIE 1.C. Modelarea bazelor de date. Proiectarea bazelor de date. 2006 Roger Jennings. 2) NOT NULL).I. SQL. Editura Teora. Utilizare Access. ŞtergeŃi rândurile pentru limba japoneză. Editura B. ŞtergeŃi toate rândurile din tabelul INCHIRIERE TOTAL. Ileana Popescu. 2004 . . conŃinând numărul total de închirieri şi suma totală obŃinută din închirierea filmului respectiv. 4. 5. numit TOTAL_INCHIRIERE. Copia 1 a filmului 1 (FILM_ID = 1. 20. 1998 Chris Fehily. 19. LetiŃia Vercescu. ActualizaŃi tabelul FILM astfel încât să creşteŃi cu 10 procente toate preŃurile pentru formatul VHS (RETAIL_PRET_VHS) care nu conŃin valori nule. 3.16. Baze de date Editura FRM. folosind instrucŃiunea CREATE de mai jos.

Sign up to vote on this title
UsefulNot useful