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) mărită cu două puncte pentru studenţii care au fost prezenţi la orele de laborator şi care au rezolvat temele de laborator.

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.

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

ternară. Observaţii Entităţile devin tabele în modelele relaţionale. Existenţa unei relaţii este subordonată existenţei entităţilor pe care le leagă. dar nu orice verb este o relaţie. dar nu orice substantiv este o entitate. 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. relaţie binară. Pentru fiecare relaţie este important să se dea o descriere detaliată. O valoare a unei relaţii este o comunicare între valorile entităţilor pe care le leagă. relaţiile devin tabele speciale sau coloane speciale care referă chei primare. Gradul unei relaţii este dat de numărul de entităţi participante într-o relaţie (de exemplu. ele sunt diferenţiate de către entităţile care sunt asociate prin relaţia respectivă. cvadruplă. Relaţiile sunt verbe. în aceeaşi diagramă. două entităţi cu acelaşi nume. entităţile se scriu cu litere mari. Nu pot exista. Pentru fiecare entitate este obligatoriu să se dea o descriere detaliată. n-ară). Relaţia exprimă un raport care există între aceste entităţi. să fie familiară utilizatorului. Observaţii: În modelul relaţional. În acest caz.să fie stabilă. O relaţie în care aceeaşi entitate participă mai mult decât o dată în diferite roluri defineşte o relaţie recursivă. În general. Pentru fiecare relaţie trebuie stabilită cardinalitatea (maximă şi minimă) relaţiei. adică numărul de tupluri ce aparţin relaţiei. Uneori. Trebuie ignorate substantivele nerelevante. Între două entităţi pot exista mai multe relaţii. În aceeaşi diagramă pot exista relaţii diferite 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! . Entităţile sunt substantive. sau o aceeaşi entitate cu nume diferite. aceste relaţii sunt numite unare.

Atribut Atributul este o proprietate descriptivă a unei entităţi sau a unei relaţii. valori posibile. tipul fizic (integer.). atributele care reprezintă chei primare trebuie subliniate sau marcate prin simbolul „#― sau (pk). genul unei film. numite constrângeri de cardinalitate. vârsta unei persoane se obţine din data naşterii). care devine valoare în coloane. în general. nu este necesar să fie specificate. Diagrama entitate. iar cardinalitatea maximă se scrie fără paranteze. Atributele sunt substantive. iar în acest caz rapoartele de cardinalitate sunt. în cadrul diagramei. Observaţii Trebuie făcută distincţia între atribut care uzual devine coloană în modelele relaţionale şi valoarea acestuia. Relaţia SALARIAT_lucreaza_in_DEPARTAMENT are cardinalitatea maximă many-one (n:1). O clasă de constrângeri.relaţie Pentru proiectarea diagramei entitate-relaţie au fost stabilite anumite reguli entităţile sunt reprezentate prin dreptunghiuri. valori implicite. contraexemple. 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. este definită de numărul de înregistrări posibile pentru fiecare entitate participantă (raport de cardinalitate). relaţiile dintre entităţi sunt reprezentate prin arce neorientate. reguli de validare. compuse (de exemplu. numele . sunt atribute al entităţii FILM. constrângeri. dar nu orice substantiv este atribut. float. derivate (de exemplu. plasat la sfârşitul numelui acestor atribute. char etc. Fiecărui atribut trebuie să i se dea o descriere completă în specificaţiile modelului (exemple. one-to-many (1:n) sau many-to-many (m:n). limbile în care e tradus un film). 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). Pentru fiecare atribut trebuie specificat numele. numele filmului). De exemplu. Cel mai întâlnit tip de relaţii este cel binar. caracteristici). Atributele pot fi simple (pretul de închiriere a unui film). one-to-one (1:1). tipuri compuse. SALARIAT cod_salariat nume prenume sex salariu M M(0) atasat_la data_initiala functia M(0) PROIECT nr_proiect M descriere buget_alocat 1 1 M 1 1 M(0) apartine_la lucreaza_in M 1 1(0) 11 M DEPARTAMENT cod_departament nume SARCINA nr_proiect nr_sarcina . toate atributele. cu valori multiple (de exemplu. cardinalitatea minimă este indicată în paranteze.

2. 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). Dacă aceasta combină cheile primare a două entităţi.conduce Diagrama Entitate/relaţie 1 Cazuri speciale de entităţi. Cheia primară este atributul codec. Afirmaţia reciprocă este falsă. 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). atunci este vorba de o relaţie. SALARIAT_asociat la_PROIECT va defini o relaţie şi nu o entitate). Subentitatea se desenează prin dreptunghiuri incluse în superentitate. . atribute şi modul lor de reprezentare în cadrul diagramei entitate-relaţie. Moştenirea atributelor. 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. de mai multe ori. 2. atributele şi relaţiile unei superentităţi sunt valabile pentru orice subentitate. Cheile primare. 3. (cheia primară a relaţiei asociat_la combină cod_salariat cu nr_proiect. care are cardinalitatea maximă 1:1 şi minimă 1:0. aceeaşi carte. Probleme 1. Entitate sau relaţie? Se cercetează cheia primară. Cheia primară este atributul codel. numită superentitate (superclasă) (SALARIAT < –– > PROGRAMATOR). Subentitate (subclasă) – submulţime a unei alte entităţi. numită ISA.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. 4. relaţii. Entitate dependentă – nu poate exista în mod independent (SARCINA 1 depinde de PROIECT). prin urmare. Într-o diagramă E/R se pot defini relaţii recursive. CITITOR (entitate independentă) – orice cititor care poate împrumuta cărţi. (0) 1. Entitatea dependentă se desenează prin dreptunghiuri cu linii mai subţiri. 5. Există o relaţie între o subentitate şi o superentitate.

Completaţi relaţiile (lucreaza_la.Evidenţa şcolilor de şoferi din Romania. 4. asista. DOMENIU (entitate independenta) – domeniul căruia îi aparţine o carte. iar cardinalitatea minimă 1:1. 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# . sustine. 5. conduce. Cheia primară este atributul coded. IMPRUMUTA – relaţie având cardinalitatea m:m care leagă entităţile CITITOR şi CARTE. 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.3. APARTINE – relaţie care leagă atributele CARTE şi DOMENIU. Relaţia are cardinalitatea maximă m:1.

3. 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. El este un model formal de organizare conceptuală a datelor, destinat reprezentării legăturilor dintre date, bazat pe teoria matematică a relaţiilor. Modelul relaţional este alcătuit numai din relaţii şi prin urmare, orice interogare asupra bazei de date este tot o relaţie. Cercetarea în domeniu  3 mari proiecte (System R, INGRES, PRTV)

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

O cheie identifică linii şi este diferită de un index care localizează liniile. O cheie secundară este folosită ca index pentru a accesa tupluri. Un grup de atribute din cadrul unei relaţii care conţine o cheie a relaţiei poartă numele de supercheie. Fie schemele relaţionale R1(P1, S1) şi R2(S1, S2), unde P1 este cheie primară pentru R1, S1 este cheie secundară pentru R1, iar S1 este cheie primară pentru R2. În acest caz, vom spune că S1 este cheie externă (cheie străină) pentru R1. Modelul relaţional respectă trei reguli de integritate structurală.
 Regula 1 – unicitatea cheii. Cheia primară trebuie să fie unică şi

minimală.
 Regula 2 – integritatea entităţii. Atributele cheii primare trebuie să fie

diferite de valoarea null.
 Regula 3 – integritatea referirii. O cheie externă trebuie să fie ori null în

întregime, ori să corespundă unei valori a cheii primare asociate. Transformarea entităţilor
 Entităţile independente devin tabele independente. Cheia primară nu

conţine chei externe.
 Entităţile dependente devin tabele dependente. Cheia primară a

entităţilor dependente conţine cheia primară a entităţii de care depinde (cheie externă) plus unul sau mai multe atribute adiţionale.
 Subentităţile devin subtabele. Cheia externă se referă la supertabel, iar

cheia primară este această cheie externă (cheia primară a subentităţii PROGRAMATOR este cod_salariat care este o cheie externă). Transformarea relaţiilor
 Relaţiile 1:1 şi 1:n devin chei externe. Relaţia conduce devine coloană în

tabelul DEPARTAMENT, iar relaţia lucreaza_in devine coloană în tabelul SALARIAT. Simbolul „ ― indică plasamentul cheii externe, iar simbolul „ ― exprimă faptul că această cheie externă este conţinută în cheia primară. Relaţia 1:1 plasează cheia externă în tabelul cu mai puţine linii.
 Relaţia m:n devine un tabel special, numit tabel asociativ, care are două

chei externe pentru cele două tabele asociate. Cheia primară este compunerea acestor două chei externe plus eventuale coloane adiţionale. Tabelul se desenează punctat.
 Relaţiile de tip trei devin tabele asociative. Cheia primară este

compunerea a trei chei externe plus eventuale coloane adiţionale.

Transformarea atributelor

 Un atribut singular devine o coloană.

nr_depart). plus una sau mai multe coloane adiţionale. 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#. Atributele multiple devin tabele dependendente ce conţin cheia primară a entităţii şi atributul multiplu. descriere. numar_cladire. atributele relaţiilor vor aparţine tabelului care conţine cheia externă. ATASAT_LA(cod_salariat#. iar atributele lor devin coloane în aceste tabele. nume. Cheia primară este o cheie externă. functia). stare). prenume. cod_sot. forma_plata. sex. SARCINA(nr_proiect#. cod_sal). data_inceperii. nr_sarcina. DEPARTAMENT(cod_departament#. nume. . iar pentru relaţii m:n şi de tipul trei. PROIECT(nr_proiect#. Ce devin atributele relaţiilor? Pentru relaţii 1:1 şi 1:n. atributele vor fi plasate în tabelele asociative. buget_alocat). job_cod. nr_proiect#. Entităţile devin tabele.

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

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

Fiecare tabel reprezintă o entitate. un cont bancar sau o tranzacţie bancară.95 14.sistemul suportă restricţiile de integritate de bază (unicitatea cheii primare.99 14.94 2003 2002 2004 .99 19.99 2003 2004 2003 49. constrângerile referenţiale. Fiecare rând din tabel reprezintă un film.95 11. iar fiecare coloană reprezintă o caracteristică a filmului respectiv.95 24.98 14.99 12. sistemul suportă toate operaţiile de bază ale algebrei relaţionale.96 29.99 29. 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 . ceea ce înseamnă o persoană. Tabelul FILM este parte a unei baze de date pentru un magazin de produse video. Fiecare rând al tabelului reprezintă o apariţie a entităţii. 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. integritatea entităţii).97 19.94 29.93 9. Figura 1-1 reprezintă listingul parţial al unui tabel numit FILM(filme).99 29. Tabele Unitatea primară de stocare a datelor într-o bază de date relaţională este tabelul.99 19. care este o structură bidimensională compusă din rânduri şi coloane. cum ar fi un client.98 19.97 15.95 50.99 29. un loc sau un lucru care trebuie să fie reprezentat în baza de date.98 39.96 19.95 14. Tabelul FILM conţine date care descriu filmele disponibile în magazinul de produse video. folosit ca exemplu în toată aceast curs.99 6.

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

nu am denumit restricţiile din baza de date folosită ca exemplu în această carte.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 . 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. Totuşi . 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ă). combinaţia valorilor acelor coloane trebuie să fie unică în tabel . din păcate. deoarece. Există mai multe tipuri de restricţii pentru baze de date: Restricţia NOT NULL Poate fi plasată pe o coloană pentru a împiedica folosirea valorilor nule. O valoare nulă nu este acelaşi lucru un un spaţiu liber.După ce sunt specificate. deoarece numele generate automat de bază de date nu sunt foare descriptive. 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ă).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ă. astfel încât să poată fi referită în mesajele de eroare şi în comenzile folosite ulterior în bază de date.Este recomandabil ca proiectanţii bazei de date să denumească restricţiile. Restricţiile cheie primară sunt aproape inttotdeauna implementate de RDBMS prin folosirea unui index.Atunci când cheia primară este definită pe mai multe coloane.Fiecare restricţie primeşte un nume unic. un şir vid sau valoarea zero şi este o valoare specială care nu este egală cu nimic altceva. nu toate produsele RDBMS disponibile în prezent acceptă restricţiile denumite. având rolul de a limita într-un mod oarecare domeniul de valori permise pentru obiectul respectiv al bazei de date.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.

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

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

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

99 en PG-13 sunt 2/15/2005 DVD 29.99 en. 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. fr.96 en.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. 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 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. Scopul procesului de normalizare este de a elimina aceste probleme (anomalii) din proiectul bazei de date.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. fr PG-13 sunt 2/15/2005 DVD 19.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. es R The Last Samurai 200 3 01/10/2005 DVD 19.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. . es R The Last Samurai 200 3 01/10/2005 VHS 15. 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.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.

De exemplu dacă primul film din tabel este singurul rând din tabelul FILM pentru care coloana GEN_COD are valoarea „Drama‖ . 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. parcurgând apoi drumul înapoi către mijloacele folosite pentru obţinerea rezultatelor dorite. este nevoie de timp pentru a va obişnui cu terminologia folosită în procesul de normalizare. ecrane ale aplicaţiilor. î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ă. Rescrierea vizualizărilor în relaţii (tabele) cu date reprezentative este un proces obositor şi . consideraţi ca fiecare vizualizare este o relaţie. ceea ce ar avea ca rezultat apariţia inconsecvenţelor în baza de date. 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ţ. precum tabel. dacă în tabelul prezentat mai sus trebuie să modificaţi descrierea codului MPAA_COD_RATING „R‖. Cel puţin la început este mai uşor să reprezentaţi fiecare vizualizare ca un tabel bidimensional. Stăpânirea procesului de normalizare cere timp şi exerciţiu. dar este ceva obişnuit ca proiectarea unui sistem de prelucrare a datelor să înceapă de la rezultatele pe care le va vedea utilizatorul.Anomalia de ştergere Anomalia de ştergere este inversul anomaliei de inserare. iar rezultatul este un set de relaţii normalizate care pot fi apoi direct implementate ca tabele ale bazei de date relaţionale. şi este şters. Deşi relaţia pe cale de a fi normalizată reprezintă o propunere de tabel . procesul de normalizare este aplicat fiecărei vizualizări . De asemenea . Chiar şi coloana PRET_INCHIR are această problemă. încă nu există ca tabel fizic. majoritatea proiectanţilor evită folosirea unor termeni fizici. conţinând date repetitive. Se referă la situaţia în care ştergerea unor date duce la pierderea neintenţionată a altor date. De exemplu . rapoarte şi aşa mai departe. În timpul normalizării . aşa cum am făcut în figura 1-3. cum ar fi pagini web. 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. Cu alte cuvinte. Colectiv. Poate părea ciudat la prima vedere. În timpul acestui proces. Probleme similare apar şi pentru coloana GEN_DESCRIERERIPTION. Pe măsură ce parcurgeţi procesul de normalizare. conceptualizaţi fiecare vizualizare ca şi cum ar fi deja un tabel bidimensional . aşa că termenul nu este foarte exact. veţi rescrie relaţiile existente şi veţi crea altele. coloană şi cheie primară. În timpul proiectării bazei de date. normalizarea începe de la mijloacele de redare a datelor care sunt (sau vor fi) prezentate utilizatorilor. Aplicarea procesului de normalizare De obicei. acestea sunt numite vizualizări de utilizator (user views). Procesul de normalizare este aplicat sistematic fiecărei vizualizări. trebuie să modificaţi şi toate rândurile din tabel pentru filmele cu codul respectiv.

precum numărul de asigurări sociale folosit în Statele Unite. Atunci când se întâmplă acest lucru. 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. Această tehnică este sursa unor identificatoare unice. ceea ce înseamnă că valorile NR_ COPIE sunt unice numai în combinaţie cu valorile FILM_ID. dar împărţirea datelor în mai multe relaţii face ca extragerea datelor stocate să fie puţin mai dificilă. Relaţia FILM din figura 1-3 ne pune o problemă în privinţa găsirii unui identificator unic. proprietarul magazinului decide ca valorile NR_ COPIE să reînceapă de la 1 pentru fiecare valoare FILM_ID. este posibil să găsiţi mai multe atribute care pot fi concatenate (combinate) pentru a forma un identificator unic. 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. în foarte puţine cazuri. Totuşi. observaţi că valorile FILM_ID „2" şi „3" apar de câte două ori. Problema este că valoarea FILM_ID identifică în mod unic fiecare titlu. Relaţia rezultată este prezentată în figura 1 –4 . Pentru normalizare. ar părea că atributul FILM_ID este cel mai potrivit în acest scop. Alegerea unui identificator unic Primul pas al procesului de normalizare constă în alegerea unui identificator unic (unique identifier).consumator de timp. 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. este obligatoriu ca fiecare relaţie să aibă un identificator unic. 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. 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. într-o relaţie nu există un set rezonabil de atribute care să poată fi folosit ca identificator unic. Atunci când nu puteţi găsi un singur atribut care să poată fi folosit ca identificator unic. 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. fără nici un dubiu. In acest caz. Identificatorul unic va deveni ulterior cheia primară a tabelului creat din relaţia normalizată. trebuie să inventaţi un identificator unic. actualizare si ştergere. această valoare nu este unică. La prima vedere.nu faceţi decât să definiţi un identificator unic format din mai multe coloane. exemple prost alese duc deseori la proiectarea eronată a bazei de date. Procesul determină crearea unui număr mai mare de relaţii decât aţi avea într-un model fără normalizare. aşa că. 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. Atunci când identificatoarele unice sunt formate din atribute multiple. aşa că inventaţi un atribut numit NR_ COPIE şi-1 adăugaţi în relaţie. Relaţiile suplimentare sunt necesare pentru eliminarea anomaliilor. Aşa cum probabil vă aşteptaţi. fiecare atribut rămâne pe propria lui coloană . In multe cazuri.

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 . 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. Bazele de date relaţionale cer ca toate rândurile dintr-un tabel să aibă acelaşi număr de coloane.96 The Last Samurai 20 03 01/10/20 05 DVD 19.96 The Last Samurai 20 03 01/10/20 05 VHS 15. aşa că-l puteţi considera un atribut cu valori multiple.99 DVD 29. Într-o relaţie.99 DVD 19. numită grup repetitiv. un atribut multivaloare este deghizat sub forma atributelor multiple. care nu este acceptat în prima formă normală. Din punct de vedere logic. astfel încât valorile individuale să poată fi modificate fară a le afecta pe celelalte. 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ă. si acestea ar fi considerate atribute multivaloare. Uneori. Language 2 şi Language 3. 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. . numite Language 1. în figura 1-4. 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. Atributele de acest tip sunt mai greu de întreţinut. atributul pentru limbă (COD_LIMBA) conţine mai multe valori pentru unele dintre filme. De exemplu. dar într-o forma specială. 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. fr. fr. De fapt.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). grupurile repetitive prezintă deseori chiar mai multe probleme decât atributele multivaloare. un grup repetitiv nu este diferit de un atribut multivaloare. adică atribute care au mai multe valori pentru acelaşi rând de date.99 Figura 1-4 Relaţia FILM . 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. Totuşi. 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). Ca urmare. deoarece valorile din listă trebuie să fie mai întâi separate. es R en.95 3 2 en 4 1 en.

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

partea NR_ COPIE a identificatorului unic din relaţia FILM nu a fost copiată în noua relaţie FILM Language.96 01/10/ 2005 VHS 15. deseori. (Numele abreviate ale atributelor din . Observaţi în figura 1-4 că lista de limbi disponibile nu se schimbă între rândurile duplicate ale aceluiaşi film. proiectanţii experimentaţi de baze de date sintetizează cele trei forme normale şi rescriu relaţiile originale direct în a treia formă normală. nu copiilor individuale.96 01/10/ 2005 DVD 19. 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). Exersând. Ca urmare. • Atributul multivaloare COD_LIMBA a fost mutat din relaţia FILM în relaţia FILM Language.99 • Am folosit o mică scurtătură în cazul identificatorului unic în noua relaţie FILM Language. aş fi creat în noua relaţie o problemă specifică celei de-a doua forme normale.95 01/10/ 2005 1/30/2 005 DVD 29. pe care ar fi trebuit să o rezolv în următoarea etapă a procesului de normalizare. Veţi descoperi că.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. Limba în care este disponibil un film se aplică filmului. veţi putea şi dumneavoastră să faceţi acelaşi lucru. Dacă aş fi făcut acest lucru. cu numele Language Code.99 2/15/2 005 DVD 29.99 2/15/2 005 DVD 19. în general.

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

99 29.96 19. trebuie să se definescă conceptul de dependenţă tranzitivă. 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. Relaţia FILM Language era deja în a doua formă normală. a rămas nemodificată.identificatorul unic.96 15. Despre un atribut care depinde de un atribut care nu este identificator unic (cheie primară) a relaţiei se spune că este dependent tranzitiv. ca urmare.99 1/30/2005 Figura 1-6. .99 19. deoarece nu are atribute non-cheie şi. Soluţia pentru a doua formă normală A treia formă normală: eliminarea dependenţelor tranzitive Pentru a înţelege a treia formă normală.95 29.

În relaţia FILM din figura 1 -6. toate atributele non-cheie depind numai de identificatorul unic). Pentru a aduce la a treia formă normală o relaţie aflată în a doua formă normală. se mută atributele dependente tranzitiv în relaţii în care depind numai de cheia primară. de fapt. cele două atribute ajung să depindă de înregistrarea unui film. 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.96 AN_PRODUS 2003 .99 2003 19.97 PRET_ INCHI R DVD 19. ceea ce duce la toate cele trei anomalii de date prezentate mai devreme în acest capitol. într-o bază de date pentru vânzări. care poate fi folosită într-o listă derulantă de pe o pagină web.95 11. De exemplu. pentru căutarea codurilor stocate în coloana cheie primară a relaţiei. aşa cum se observă cu uşurinţă. 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ă. definite ca fiind chei externe. în principal.95 19. Totuşi aceste relaţii au şi alte roluri. observăm că atributul GEN_DESCRIERE depinde de atributul GEN_COD. 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.  Nu există dependenţe tranzitive (cu alte cuvinte.99 2003 FILM_NUME Mystic River PRET_ INCHIR VHS 58. Figura 1-7 conţine soluţia în a treia formă normală. iar MPAA Ratig Description depinde de MPAA_COD_RATING.96 2003 29. cu rolul de cheie externă. 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. toate atributele uşor de calculat sunt eliminate ca încălcări ale criteriilor celei de-a treia forme normale. este uşor de văzut că Suma Totală (rezultatul calculat) este. Suma Totală este obţinută înmulţind Cantitatea Cumpărată cu Preţul Unitar. 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.Va trebui apoi să reconstruim vizualizarea originală printr-o uniune. Se lasă atributul de care depind acestea în relaţia originală. dependentă tranzitiv te celelalte două atribute. Pericolul păstrării acestor descrieri în relaţia FILM este faptul că.95 14. în final. Presupunând ci toate cele trei atribute sunt dependente de identificatorul unic al relaţiei care le conţine. Ca efect secundar. cum ar fi controlul codurilor şi furnizarea unei surse convenabile pentru lista de coduri valide.

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

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

FK1 PK.FK1 PK.FK1 Figura 1_8.FK1 PK.FK1 PK FILM_INCHIRIERE FILM_ID NUMAR_COPIE TRANZACTIE_ID DATA_INTOARCERE COST_INCHIRIERE COST_INTARZIERE_SAU_PIERDERE DATA_RETURNARE PK.FK2 LIMBA COD_LIMBA NUME_LIMBA PK CLIENT_CONT CLIENT_CONT_ID PK CLIENT_HOLD_IND DATA_INSCRIS DATA_TERMINAT CLIENT_DEPOZIT_SUMA CARD_CREDIT_LA_DOSAR_INDIC COPIL_INCHIRIERE_PERMIS_INDIC CLIENT_TRANZACTIE TRANZACTIE_ID CLIENT_CONT_ID ANGAJAT_PERSOANA_ID TRANZACTIE_DATA VANZARI_TAXA PK FK1 CLIENT_COD_PERSOANA CLIENT_CONT_ID PERSOANA_ID PK. Diagrama entitate relaţie .FILM MPAA_RATING MPAA_COD_RATING MPAA_DESCRIERE_VARSTE FILM_ID FILM_COD_GEN MPAA_COD_RATING FILM_NUME RETAIL_PRET_VHS RETAIL_PRET_DVD AN_PRODUS PK FK1 FK2 FILM_GEN FILM_COD_GEN FILM_DESCRIERE_GEN PK PK FILM_LIMBA FILM_ID COD_LIMBA PK.FK1 PK.FK2 FILM_COPII FILM_ID NUMAR_COPIE DATA_CUMPARARE DATA_VANZARE FORMAT_MEDIA PK.FK2 PERSOANA PERSOANA_ID PERSOANA_PRENUME PERSOANA_NUME_MIJLOCIU PERSOANA_NUME PERSOANA_ADRESA_1 PERSOANA_ADRESA_2 PERSOANA_ADRESA_ORAS PERSOANA_ADRESA_JUDET_PROV PERSOANA_ADRESA_COD_POSTAL PERSOANA_ADRESA_TARA PERSOANA_TELEFON NASTERE_DATA MOARTE_DATA PK ANGAJAT PERSOANA_ID SUPERVISOR_PERSOANA_ID ANGAJAT_TAXA_ID ANGAJAT_JOB_CATEGORIE ANGAJAT_RATA_PE_ORA ANGAJARE_DATA INCHIDERE_DATA PK.

germana-8 521 Radu George 122 desen-tehnic-10. . Astfel . aceasta ar presupune o mare risipă de spaţiu . 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. Presupunem că tabela Curs_Student conţine următoarele date: CURS_SUDENT NrMatricol NumeSt PrenumeSt Grupa Cursuri-Nota 458 Predescu Alexandru 114 engleza-7. În plus.programare-10 982 Bunea Mihaela 114 rezistenta materialelor-8 1204 Dragnea Liviu 412 educatie fizica-10 S1520 Popa Marius 452 analiza numerica-7. Î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).franceza-7 627 Cristescu Lucian 243 programare-8. Acum putem afla numărul total de studenţi înscrişi la un anumit curs.engleza-10 746 Irimia Diana 361 analiza numerica-9 782 Tanase Daciela 341 gernana-6.Evident .engleza-9 Coloana Cursuri conţine mult prea multa informaţie.Probleme: 1. dacă o coloană ar conţine o listă de valori . 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. nu trebuie să existe atribute sau grupuri de atribute repetitive. regăsirea şi manipularea informaţiilor stocate ar fi foarte anevoioase. va trebui să parcurgem toate cele trei coloane cu cursuri. Această primă formă normală este considerată ca fiind o cerinţa minimală pentru majoritatea sistemelor relaţionale. utilitatea ei fiind evidentă. De exemplu. pentru a afla câţi studenti s-au înscris în total la un anumit curs . astfel încât aceasta va fi formată acum din două coloane: NrMatricol şi IdCurs. de vreme ce ar exista şi unii studenti care au ales doar două cursuri. . Pentru a aduce tabela Curs_Student la FN1 vom introduce o nouă coloană în cheia primară a tabelei.

pentru o valoare dată a lui IdCurs. formează cheia primară. Putem aduce tabelaCurs_Student în FN2 descompunând-o în două tabele. după următoarea regulă: pentru fiecare dependenţă parţială se formează o nouă tabelă (pe care o vom numi Curs) conţinând coloanele determinate de această dependenţa (în acest caz. Analog. le eliminăm din tabela Curs_Student şi formăm o nouă tabelă. dar nu îndeplineşte cea de-a doua cerinţă pentru a fi în FN2.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ă. nu şi de NrMatricol . cunoaştem denumirea cursului fără a mai trebui să ştim şi NrMatricol. Coloana Denumire care depinde numai de IdCurs. Cheia primară a noii tabele va fi formată din coloanele ce compun determinantul dependenţei (IdCurs). deoarece coloanele NumeSt. î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. între tabelele Student şi Curs_Student există o relaţie de tip 1:m. Deci avem o coloană care nu face parte din cheia primară şi nu depinde de toată cheia. Denumirea) şi determinantul lor (IdCurs). care . Coloanele determinate se elimină din tabela iniţială. împreună cu IdCurs. ce le va conţine şi va avea drept cheie primară coloana NrMatricol. 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 . De asemenea . Student. PrenumeSt şi grupa depind numai de NrMatricol. în sensul că . Tabela Curs_Student este în FN1.

Pentru a înlătura toate aceste inconvenienţe. Titlu şi IdTitlu nefăcând parte din cheia primară. pe care leam eliminat din tabela Profesor. coloana PretTotal această tabelă nu ar fi în FN3. pe care o vom numi Titlu. 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 . De asemenea. De exemplu în tabela Profesor se poate observă faptul că salariul depinde de titlul profesorului. va trebui să asctualizăm toate înregistrările corespunzătoare. va trebui să introducem de 20 de ori valoarea 5 pentru IdTitlu. actualizarea şi ştergerea înregistrărilor.Tabela Titlu va avea drept cheie primară coloana IdTitlu şi va mai conţine coloanele Titlu şi Salariu. Coloanele calculate nu sunt singurul caz de dependenţa tranzitivă într-o tabelă. descrierea „preparaotr‖ pentru Titlu şi valoarea 800 pentru Salariu . în plus. redundant. ceea ce este evident. dacă o tabelă de produse ar conţine Coloanele PretUnitar şi Cantitate şi . Dependenţele tranzitivă creează probleme la adăugarea. De exemplu. dacă salariul unui preparator se modifică. coloanele Salariu. fiecare cu titlul de preparator (prep). Astfel .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. vom aduce tabela Profesor la FN3 prin crearea unei noi tabele. dacă la tabela Profesor se mai adaugă 20 de înregistrări .

unicitatea cheii primare . asistent lector conferentiar dr.o cheie secundară trebuie să fie null în întregime sau să corespundă unei valori a cheii primare asociate.(in tabela asociată nu trebuie să existe valori fără corespondent). 3. Tabelele Titlu şi Profesor sunt în relaţia 1:m (un Titlu corespunde la mai multe cadre didactice). Tabele de mai sus păstrează regulile de integritate? Raspuns Nu. prepartor profesor dr. . 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. Salariu 1300 950 1100 1700 680 2150 : 2. ca funcţie didactică. Amintim ca regulile de integritate sunt.integritatea referenţială . care nu există in tabelul Titlu. deoarece există cadrul didactic cu IDProf= 7 cu IdTitlu =7 . .integritatea entităţii – valorile cheii primare sa fie diferite de valoarea null(o valoare necunoscuta sau lipseşte) .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.

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

.  fiecare atribut care nu este cheie (nu participă la cheia primară) este dependent de întreaga cheie primară. 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 . Persoana Eu Tu El Noi Masina_34 Persoana Noi Vehicul R25 Vehicul R25 205 R5 BX 5. Masina_33. 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).Noi BX 305 R12 R25 Varianta 3 (4 tabele) Masina 31 (similar se definesc Masina_32.

cod_lucrare#. functie. specialitate. data_sfarsit}. α β  mulţimea atributelor care intervin în dependenţele funcţionale. nume). nr_santier#. descriere. EXECUTA(cod_obiectiv#. 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.COD_SALARIAT# S1 S3 S5 JOB_COD PROGRAMATOR VANZATOR INGINER A doua condiţie exprimă necesitatea total dependenţei de cheia primară. LUCRARE(cod_obiectiv#. nr_santier#} {descriere. data_inceput. conducator. SANTIER(nr_santier#. α γ  reprezintă reuniunea determinantului cu restul atributelor lui A. data_sfarsit). Tabelul atasat_2a nu este in FN3. De ce? Forma normală 3 (FN3) Intuitiv. cod_lucrare#. o relaţie R este în a treia formă normală dacă şi numai dacă:  relaţia R este în FN2. sef). 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. 9. cod_lucrare#} {data_inceput. cod_lucrare#.  fiecare atribut care nu este cheie (nu participă la o cheie) depinde direct de cheia primară. conducator}. 7. Pentru relaţia EXECUTA sunt evidente dependenţele: {cod_obiectiv#. functie. Să se aduca la FN3 tabelel EXECUTA_1 rezultat de la 8 . {cod_obiectiv#. Presupunem că un şantier poate executa mai multe lucrări de bază şi că o lucrare poate fi executată de mai multe şantiere.

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

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

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

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

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

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

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

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

Componentele software DBMS ruleaza pe client c. dar afecteaza puternic comportamentul instructiuunilor SQL incluse în tranzacţii. Un limbaj orientat spre obiecte b. 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‖.folosesc o singură comandă: SELECT. . Ruleaza pe o mare varietate de platforme client. Instrucţiunile SQL care folosesc comenzile GRANT si ALTER sunt considerate parte a DCL. Componentele software ale clientului SQL ruleaza pe client d. Un client SQL in linia de comanda a.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). Comenzile pentru cotrolul tranzacţiilor (Transaction Control Commands ) nu respectă cu exactitate sintaxa instrucţiunilor SQL . întelegând prin aceasta că intreaga tranzactie trebuie sa reuseasca sau sa esueze. Instrucţiunile SQL care folosesc comenzile INSERT. Într-un aranjament client/server a. Un limbaj procedural c. 1. SQL este a. Componentele software ale clientului SQL ruleaza pe server 3. 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. să şteargă date şi să modifice datele existente în baza de date. Unii furnizori şi autori clasifică instrucţiunile DQL şi DML în aceeaşi categorie. Întrebările pot avea mai multe răspunsuri corecte. Un limbaj nonprocedural d. Componentele software DBMS ruleaza pe server b. Un limbaj standard 2. Un limbaj declarativ e. UPDATE şi DELETE sunt considerate parte a DML. Necesita un sistem bazat pe ferestre b. Limbajul de manipulare a datelor (DML) Limbajul de manipulare a datelor (DML . Întrebări Alegeţi răspunsurile corecte pentru fiecare din următoarele întrebări cu răspunsuri multiple.

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

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

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

Tipurile de date construite.2) . Ultimele două tipuri de date nu vor fi tratate . Tipurile de date stardard pentru caractere sunt: Caracter cu lungime fixă . Tipurile de date definite de utilizator permit utilizatorului bazei de date să definească propriile tipuri de date. stocata într-un set de caractere al unei anumite limbi. cifre şi alte simboluri permise de sistemul de calcul pe care se află baza de date. adaptate unor scopuri specifice. Tipurile întregi şi tipurile numerice care include o scală sunt numite numerice exacte.Tipurile de date predefinite sunt cele furnizate de către producător ca parte nativă a sistemului SGBD(vor fi tratate în continuare). adică litere. Sintaxa SQL este: CHARACTER(lungime) | CHAR(lungime) Exemplu: NUMAR_SECURITATE CHAR(9) Caracter naţional . 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ă. fiind prea complicate pentru intenţiile cursului.Un tip numeric exact care include o precizie şi o scalã. conţin matrice sau seturi de tipuri de date predefinite. pentru evitarea confuziilor. Toate tipurile numerice au o precizie (un număr de cifre).Acest tip de date poate fi folosit pentru t raducerea şirur ilor de caract ere în difer it e limbi. cunoscute şi ca tipuri de colecţii. în scopul reprezentării în SGBD a construcţiilor de date orientate spre obiect. în timp ce numerele reale care nu include o scală (numerele cu virgulă mobilă) sunt numite numerice aproximative. specificând lungimea maximă a şirurilor de caractere stocate. S int axa SQL est e : NATIONAL CHARACTER(lungime) | NCHAR(lungime) Exemplu: TITLU_FILM NCHAR(100) Caracter variabil . Sintaxa SQL este: NUMERIC (precizie. 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. 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ă. scală) Exemplu: PLATA_PE_ORA_ANGAJAT NUMERIC(5. Tipurile numerice standard sunt: Numeric . Tipuri de date pentru caractere Tipurile de date pentru caractere conţin şiruri de caractere.Un şir de caractere cu lungime finită.

2) Întreg . câmpuri (fields) : Numele câmpului (cuvânt cheie Definiţie SQL) Anul calendaristic. Numerele întregi nu au cifre zecimale.Un tip numeric aproximativ. Sintaxa SQL este: BIGINT (precizie) Exemplu: ID_CONT_CLIENT BIGINT Număr în virgulă mobilă . deoarece este întotdeauna zero. scris INTEGER sau INT. ca urmare. dar mai mare sau egală cu precizia definită pentru tipul REAL. scrisă SMALLINT.Un tip numeric aproximativ. Este scrisă FLOAT.O variantă a tipului INTEGER. Sintaxa SQL este: DECIMAL(precizie. 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 . Sintaxa SQL este: REAL Exemplu: RATA_DOBANDA REAL Număr real cu precizie dublă . ocupă mai puţin spaţiu. Sintaxa SQL este: INTEGER (precizie) | INT (precizie) Exemplu: ID_CONT_CLIENT INTEGER Întreg mic . Specificarea preciziei este opţională. cu precizia mai mare sau egală cu precizia specificată.Zecima1 . cu precizie definită de implementare. Sintaxa SQL este: SMALLINT (precizie) Exemplu: ID_CONT_CLIENT SMALLINT Întreg mare . care stocheză numere mai mari şi ocupă mai mult spaţiu. Tipurile de date temporale conţin următoarele componente. scală) Exemplu: PLATA_PE_ORA_ANGAJAT DECIMAL(5. numite de standard.Un tip numeric exact care include o precizie şi o scală.Un tip numeric exact care include numai precizia.Un tip numeric aproximativ. aşa că scala nu este necesară. care stochează numere mai mici şi. Sintaxa SQL este: FLOAT (precizie) Exemple: RATA_DOBANDA FLOAT(16) RATA_DOBANDA FLOAT Număr real . într-un mod oarecare. scrisă BIGINT. 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.O variantă a tipului INTEGER. cu precizie definită de implementare.

scris în SQL sub foma CLOB.Un tip de date combinat pentru dată şi oră. MINUTE şi SECOND. cum ar fi o imagine sau o secvenţă sonoră.O dată calendaristică. Sintaxa SQL este: DATE [WITH TIMEZONE] Exemplu: DATA_INSCRISA DATE Ora . Sintaxa SQL este: TIMESTAMP [WITH TIMEZONE] Exemplu: DATA_TIMP_ INSCRIS TIMESTAMP Interval .Un obiect mare pentru caractere. Obiect mare binar . HOUR. ajungând deseori la dimensiuni de câţiva megaocteţi. scris în SQL sub forma BLOB. MINUTE şi SECOND. MONTH şi DAY. stocat într-o anumită limbă. incluzând câmpurile YEAR.Un tip de date pentru oră.Un obiect mare care conţine date binare.Stochează o valoare logică adevărat sau fals. DAY. care reprezintă precizia intervalului. care nu vace obiectul cursului. Deoarece manipularea obiectelor mari este un subiect avansat.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: 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.Un obiect mare pentru caractere. Obiect mare pentru caractere. MONTH. incluzând câmpurile specificate printr-un calificator de interval (internal qualifier). în format naţional .Un interval de timp. scris în SQL sub forma NLOB. incluzând câmpurile YEAR. se vor prezenta aceste tipuri fără sintaxa lor. Tipurile de date temporale sunt: Data . incluzând câmpurile HOUR. Sintaxa SQL este: BOOLEAN Exemplu: CLIENT_PREFERAT BOOLEAN . Sintaxa SQL este: TIME [WITH TIMEZONE] Exemplu: TIMPUL_INSCRIS TIME Marcă temporală . Obiect mare pentru caractere . Un alt tip de date Există un tip standard de date care nu este încadrat în nici una dintre categoriile prezentate anterior: Boolean .

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

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

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

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

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

. 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).8 INSERT INTO timp VALUES (TIMESTAMP '2010-01-25 09:00:00. 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.30'. INTERVAL '20' DAY(2).

INSERT INTO exemplu VALUES (INTERVAL '120' MONTH); SELECT TO_CHAR(SYSDATE+durata, 'DD-mon- YYYY') FROM exemplu;

Exemplu CREATE TABLE noi_carti (codel NUMBER, start_data TIMESTAMP); INSERT INTO noi_carti VALUES (1,TIMESTAMP '2009-10-31 09:26:50.30'); SELECT codel ,start_data FROM noi_carti;

INSERT INTO noi_carti VALUES (5, timestamp '12-02-08 0:0:0'); Pentru informatii de tip TIMESTAMP, numarul maxim de digiti pentru fractiuni de secunda este 9, implicit este 6. Rezultatele cererii: 1 31-OCT-09 09.26.50.300000 AM 5 08-FEB-12 12.00.00.000000 AM

Pentru informatii de tip DATE, formatul implicit ar fi fost Câmp

DD-MON-RR

Valori valide pentru date Valori valide pentru calendaristice intervale De la -4712 la 9999 (cu excepţia Orice valoare YEAR anului 0). întreagă. MONTH De la 01 la 12. De la 0 la 11. De la 01 la 31 (limitat de valorile câmpurilor MONTH şi YEAR, Orice valoare DAY corespunzător regulilor calendarului întreagă. curent). HOUR De la 00 la 23. De la 0 la 23. MINUTE De la 00 la 59. De la 0 la 59. De la 0 la 59.9(n), De la 00 la 59.9(n), unde „9(n)― SECOND unde „9(n)― este precizia este precizia fracţiunilor de secundă. fracţiunilor de secundă. De la –12 la 13 (prevede TIMEZONE_HO schimbările datorate trecerilor la ora de Nu se aplică. UR vară sau iarnă). TIMEZONE_MI De la 00 la 59. Nu se aplică. NUTE Sistemul Oracle permite construcţia de expresii folosind valori de tip dată calendaristică şi interval. Operaţiile care pot fi utilizate în aceste expresii şi tipul rezultatelor obţinute sunt următoarele: Data + Interval, Data – Interval, Interval + Data, iar rezultatul este de tip dată calendaristică; Data – Data, Interval + Interval, Interval – Interval, Interval * Number, Number * Interval, Interval / Number, iar rezultatul este de tip interval.

MODELE DE FORMAT UN MODEL DE FORMAT ESTE UN LITERAL CARACTER CARE DESCRIE FORMATUL VALORILOR DE TIP DATE SAU NUMBER STOCATE INTR-UN SIR DE CARACTERE. ATUNCI CAND SE CONVERTESTE UN SIR DE CARACTERE INTR-O DATA CALENDARISTICA SAU INTR-UN NUMAR, MODELUL DE FORMAT INDICA SISTEMULUI CUM SA INTERPRETEZE SIRUL RESPECTIV. ÎN INSTRUCTIUNILE SQL SE POATE FOLOSI UN MODEL DE FORMAT CA ARGUMENT AL FUNCTIILOR TO_CHAR SI TO_DATE. ÎN FELUL ACESTA SE POATE SPECIFICA FORMATUL FOLOSIT DE SISTEMUL ORACLE PENTRU A RETURNA SAU A STOCA O VALOARE IN/DIN BAZA DE DATE. UN MODEL DE FORMAT NU SCHIMBA REPREZENTAREA INTERNA A VALORII IN BAZA DE DATE. O PARTE DINTRE ELEMENTELE CEL MAI FRECVENT

INTALNITE ALE UNUI FORMAT DE TIP NUMERIC SUNT SINTETIZATE IN TABELUL URMATOR. El ement , (virgulă) . (punct) $ 0 9 99 99 Exemplu

99

Descriere Plasează o virgulă în poziţia specificată. Într-un model de 9,9 format numeric pot fi precizate mai multe virgule, dar o virgulă nu poate apărea în partea dreaptă a punctului zecimal. Plasează un punct zecimal în poziţia specificată. 99. Într-un format numeric, se poate specifica cel mult un punct zecimal. $99 Include semnul „$― în faţa unei valori. Plasează zerouri în faţa sau la sfârşitul valorii.

099 9; 9990 999

C

D

E EEE L

MI

S

Întoarce valoarea cu numărul specificat de cifre. Valoarea va avea un spaţiu, respectiv un minus în faţă dacă 9 este pozitivă, respectiv negativă. Plasează în poziţia specificată simbolul ISO pentru C99 monede(valoarea curentă a parametrului 9 NLS_ISO_CURRENCY). Plasează în poziţia specificată caracterul zecimal, care este valoarea curentă a parametrului 99D NLS_NUMERIC_CHARACTER. Valoarea implicită este 99 punctul. Se poate specifica cel mult un caracter zecimal într-un model de format numeric. 9.9 Returnează o valoare folosind notaţia ştiinţifică. EEEE L99 Întoarce în poziţia specificată simbolul monedei 9 locale (valoarea curentă a parametrului NLS_CURRENCY). Plasează semnul minus la sfârşitul valorilor negative şi un 999 spaţiu la sfârşitul celor pozitive. Acest element poate fi 9MI specificat numai pe ultima poziţie a modelului de format numeric. S99 Plasează semnele plus sau minus la începutul sau la 99; sfârşitul valorii. Acest element poate apărea doar pe prima 999 sau ultima poziţie a modelului de format numeric. 9S

MODELELE DE FORMAT PENTRU DATE CALENDARISTICE POT FI UTILIZATE IN CADRUL URMATOARELOR FUNCTII DE CONVERSIE: TO_DATE, pentru a converti o valoare de tip caracter, care este într-un alt format decât cel implicit, într-o valoare de tip DATE; TO_CHAR, pentru a converti o valoare de tip DATE, care este într-un alt format decât cel implicit, într-un şir de caractere. SYSDATE, pentru aflarea datei curente. De exemplu SELECT SYSDATE FROM dual;

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

iar FX (Format eXact) impune corespondenţa exactă dintre argumentul de tip caracter şi modelul de format precizat pentru data calendaristică respectivă. Exemplu: SELECT nume. TO_CHAR(data_ang.‘ DDTH ‖of‖ Month YYYY‘) angajare FROM angajati WHERE TO_CHAR(data_ang. Nume Angajare Pop Ene Exemplu SELECT TO_CHAR(data_ang.m. TO_CHAR(data_ang. Two Thousand Nine Exemplu 21st of January 2009 10TH of October 2009 January 21.‘Month FMDD. Un modificator poate să apară într-un model de format de mai multe ori. Nume Angajare Pop Ene Exemplu SELECT nume. Modificatorul FM (Fill Mode) suprimă completarea cu spaţii în valoarea returnată de funcţia TO_CHAR.‘ fmDDspth Month.Modificatorii FM şi FX pot fi utilizaţi în modelele de format din cadrul funcţiei TO_CHAR. În acest caz.2009 .d. Angajare Twenty_NineTH July.a.YYYY‘) angajare FROM angajati WHERE TO_CHAR(data_ang. controlând completarea cu spaţii şi verificarea exactă a formatelor. ‘YYYY‘)=‘2009‘.2009 October 10. 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‘.Year‘) angajare FROM angajati WHERE id_ang=100.

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

indicând cheile la nivel de coloană. NUMBER(3). VARCHAR2(30).Numele coloanei trebuie să fie unic în cadrul tabelului. Tipul de date . CHAR(5)). indicând cheile la nivel de tabel. . nrex NUMBER(3). autor VARCHAR2(30). 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. prin copiere din alt tabel. 2. pret NUMBER(8. NUMBER(8. Crearea structurii unui tabel indicând cheile la nivel coloană: CREATE TABLE carte (codel CHAR(5) PRIMARY KEY. titlu VARCHAR2(30).2). coded CHAR(5) NOT NULL REFERENCES domeniu(coded)).Componentele din definiţia unei coloane sunt: Numele coloanei . Exemplu : Gestiunea activităţilor de împrumut dintr-o bibliotecă CAR TE codel# titlu autor pret nrex coded M (1) imprumut a (0) M CITI codec# nume dep TOR M (0) apartine 1 DOME coded# intdom NIU 1.2). Crearea structurii unui tabel fără a indica cheile: CREATE TABLE (codel titlu autor pret nrex coded carte CHAR(5).

FOREIGN KEY (coded) REFERENCES domeniu (coded)). CREATE TABLE imprumuta (codel CHAR(5).2). 3. Crearea structurii unui tabel indicând cheile la nivel de tabel: CREATE TABLE carte (codel CHAR(5).CONSTRANGEREA DE CHEIE PRIMARA SAU EXTERNA CE PRESUPUNE? CREATE TABLE carte (codel CHAR(5) PRIMARY KEY. CREATE TABLE cititor (codec CHAR(5) PRIMARY KEY. codec. den_cititor VARCHAR2(30)). pret NUMBER(8. coded CHAR(5) NOT NULL. dataim DATE DEFAULT SYSDATE. FOREIGN KEY (codel) REFERENCES carte(codel). dataef DATE. PRIMARY KEY (codel). nrex NUMBER(3). den_dom VARCHAR2(30)). PRIMARY KEY (codel.2). titlu VARCHAR2(30). titlu VARCHAR2(30). codec CHAR(5). coded CHAR(5) NOT NULL REFERENCES domeniu(coded) ON DELETE CASCADE). autor VARCHAR2(30). . FOREIGN KEY (codec) REFERENCES cititor(codec)). pret NUMBER(8. Dacă cheia primară are mai mult de o coloană atunci cheile trebuie indicate la nivel de tabel. 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. dataim). nrex NUMBER(3). datares DATE. autor VARCHAR2(30). CREATE TABLE domeniu (coded CHAR(5) PRIMARY KEY.

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

Componentele din definiţia unei coloane sunt: Numele coloanei . Sintaxa: [CONSTRAINT nume_restricţie] UNIQUE Exemplu: .O restricţie UNIQUE impusă asupra unei coloane garantează unicitatea valorilor din coloana respectivă a tabelului.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. Expresia poate fi orice expresie validă.Specificarea cuvântului cheie NULL permite stocarca valorilor nule într-o coloană. Sintaxa SQL şi câteva exemple: NULL | NOT NULL Exemple: DATA_INSCRIERE DATE NOT NULL DATA_INCHEIERE DATE NULL Restricţia CHECK . 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. ‗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 . Tipul de date . sistemul SGBD va respinge modificarea şi va afişa un mesaj de eroare. care nu conţine o valoare explicită pentru coloana respectivă. în timp ce NOT NULL nu permite stocarca valorilor nule în coloana respectivă.O expresie care este aplicată coloanei atunci când în tabel este inserat un nou rând.O restricţie de verificare (check) poate fl folosită pentru impunerea unei reguli care poate fi aplicată unei singure coloane a unui tabel. O restricţie NOT NULL poate fi scrisă şi sub forma unei restricţii CHECK cu condiţia IS NOT NULL.Numele coloanei trebuie să fie unic în cadrul tabelului. Restricţiile coloanelor pot avea oricare dintre următoarele forme: Clauza DEFAULT . CHECK (CREDIT_CARD_IND IN (‗Y‘. Sintaxa restricţiei CHECK şi un exemplu: [CONSTRAINT nume restricţie] CHECK (condiţie) Exemplu: CREDIT_CARD_IND CHAR(1) NOT NULL. Sintaxa SQL cu o clauză DEFAULT este: [DEFAULT expresie] Exemplu: STARE_CONT_CLIENT CHAR(1) DEFAULT 'N' NOT NULL Restricţia NULL | NOT NULL .

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

nrex NUMBER(3).. Titlu VARCHAR2(30).nume coloană. 2.]) REFERENCES nume_tabel (nume_coloană [.nume_coloană. CREATE TABLE (codel CHAR(5) CONSTRAINT cp_carte PRIMARY KEY.2). autor VARCHAR2(30). CHAR(5) NOT NULL.]) 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. [CONSTRAINT nume_restricţie] FOREIGN KEY (nume_coloană [. [ON DELETE CASCADE |ON DELETE SET NULL] EXEMPLE: 1.. NUMBER(3). NUMBER(8. aceasta poate referi mai multe coloane. VARCHAR2(30).nume_coloană.. coded CHAR(5) CONSTRAINT nn_coded NOT NULL CONSTRAINT ce_coded REFERENCES domeniu(coded)).CONSTRAINT UK_DATA_INSCR_CONT_CL UNIQUE (ID_CONT_CLIENT. CREATE TABLE (codel titlu autor pret nrex coded carte carte CHAR(5).2). VARCHAR2(30).. SA SE DEFINEASCA O CONSTRANGERE LA NIVEL DE TABEL PRIN CARE SA SE SPECIFICE CHEIA PRIMARA SI CHEIA EXTERNA. SA SE DEFINEASCA O CONSTRANGERE LA NIVEL DE COLOANA PRIN CARE SA SE SPECIFICE CHEIA PRIMARA SI CHEIA EXTERNA.. .. pret NUMBER(8. DATA_INSCRIERE ) Restricţia PRIMARY KEY [CONSTRAINT nume_restricţie] PRIMARY KEY (nume_coloană [.

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

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

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

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

adăugarea sau modificarea valorii prestabilite pentru o coloană. şi trcerea de la NULL la NOT NULL sau invers. Adăugarea unei restricţii.Modificarca definiţiei unei coloane. Definiţia restricţiei este identică cu definiţia unei restricţii care ar putea apărea într-o instrucţiune CREATE TABLE.. Exemplu: ALTER TABLE CONT_CLIENT MODIFY (SUMA_DEPOZIT_CLIENT NUMERIC(7.<definiţie_co1oană> . ALTER TABLE nume_tabel MODIFY [COLUMN] (<definiţie — coloană> [. Sunt acceptate creşterea preciziei unei coloane. Dacă pun o valoare negativă la suma.]). Exemplu: ALTER TABLE CONT_CLIENT ADD CONSTRAINT CK_SUMA_DEPOZIT_CLIENT CHECK (SUMA_DEPOZIT_CLIENT >= 0 OR SUMA_DEPOZIT_CLIENT IS NULL).. 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. atunci apare eroare . . ALTER TABLE nume_tabel ADD CONSTRAINT <definiţie_restricţie>.2) DEFAULT 0 NOT NULL).

ALTER TABLE domeniu DROP PRIMARY KEY CASCADE. autor)). care determină şi ştergerea cheilor externe ce referă cheia primară. Redenumirea unei coloane. ALTER TABLE carte ADD (PRIMARY KEY(codel)). mai Dacă există o CE care referă o CP şi dacă se încearcă ştergerea cheii primare. Dintre bazele de date care acceptă această sintaxă este numai Oracle. Ştergerea cheii externe se face ca si pentru ştergerea cheii primare ALTER TABLE carte ADD CONSTRAINT beta FOREIGN KEY (coded) REFERENCES domeniu.0 ALTER TABLE nume_tabel RENAME COLUMN nume_vechi_coloană TO nume _nou_coloană. Ştergerea este totuşi permisă dacă în comanda ALTER apare opţiunea CASCADE.CREATE TABLE carte (CODEL char(5). trebuie întâi şterse restricţiile respective. Schimbarea cheii primare. Dacă cheia primară este referită de restricţii referenţiale. ALTER TABLE carte ADD CONSTRAINT cheie_prim PRIMARY KEY (codel). începând cu versiunea 8. ALTER TABLE nume_tabel DROP PRIMARY KEY. Ştergerea cheii primare a unui tabel. Este destul de complicat procesul schimbării cheii primare fără a afecta modul de proiectare a bazei de date. carte ALTER TABLE carte ADD PRIMARY KEY(titlu. . …). ALTER TABLE timp RENAME COLUMN durata_1 TO dur_1. această ştergere nu se poate realiza (tabelele sunt legate prin declaraţia de cheie externă). Schimbarea se face în două etape: se şterge cheia primară şi apoi se recreează. ALTER TABLE DROP PRIMARY KEY.

Observaţii Nu se poate specifica poziţia unei coloane noi în structura tabelului.ALTER TABLE timp RENAME COLUMN durata_2 TO dur_2. ALTER TABLE nume_tabel DROP nume_coloana.INTRODUSE_DE ). ALTER TABLE CONT_CLIENT DROP (DATA_CLIENT . cititor cp_cititor. O schimbare a valorii implicite . Stergerea unei coloane se face ca şi a unei constringeri. Modificarea unei coloane presupune schimbarea tipului de date. a dimensiunii sau a valorii implicite a acesteia. Pentru a activa (ENABLE) sau dezactiva (DISABLE) constrângeri: ALTER TABLE ENABLE nume_tabel nume_constrangere. ALTER TABLE ADD CONSTRAINT ALTER TABLE ENABLE CONSTRAINT cititor cp_cititor PRIMARY KEY (codec) DISABLE. carte ALTER TABLE DROP CONSTRAINT beta. O coloană nouă devine automat ultima în cadrul structurii tabelului.

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

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

indică dacă tabelul este imbricat (sau nu) EXEMPLU: SELECT TABLE_NAME. în octeţi. a unei linii ENABLED (activat) sau DISABLED (dezactivat): este activată sau nu blocarea tabelului YES sau NO. . NESTED FROM USER_TABLES.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. NUM_ROWS. indică dacă tabelul este temporar (sau nu) YES sau NO. EXEMPLU: SELECT 'DROP TABLE' || OBJECT_NAME || '. indică dacă tabelul este partiţionat (sau nu) Y sau N.' FROM USER_OBJECTS WHERE OBJECT_TYPE = 'TABLE'. 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.

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

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

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

respectiv USER_IND_COLUMNS din dicţionarul datelor. adică verificarea integrităţii indexului specificat pentru un tabel. datele sunt stocate în indexul asociat. Versiunea Oracle8 permite construirea de tabele organizate pe bază de index. Î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. Coloana sau coloanele după care se face indexarea sunt cele care constituie cheia primară a tabelului. În acest caz. alocarea (ALLOCATE EXTENT) şi dealocarea (DEALLOCATE UNUSED) manuală a spaţiului utilizat de un index se pot realiza cu ajutorul comenzii ALTER INDEX. dar care stochează datele în mod invers. Modificarea parametrilor de stocare a indecşilor (STORAGE). index partiţionat – folosit în cazul tabelelor mari pentru a stoca valorile coloanei indexate în mai multe segmente. ea conţine întreg rândul. Validarea unui index. Acesta arată adâncimea indexului de .) Starea de unicitate (UNIQUE. 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. index de cluster – bazat pe coloanele comune ale unui cluster. toate operaţiile sunt efectuate numai asupra indexului. LOB. Informaţii referitoare la indecşi şi la coloanele care îi definesc pot fi regăsite în vizualizările USER_INDEXES. CLUSTER etc.Pentru a reconstrui un index se pot folosi două metode: se şterge indexul (DROP INDEX) şi se recreează (CREATE INDEX). folosind comenzi SQL. se utilizează comanda ALTER INDEX cu opţiunea REBUILD. CLUSTER etc. Începând cu Oracle9i. index cu cheie inversă – sunt B* arbori. index de tip bitmap – nu se stochează valorile efective ale coloanei indexate. 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. 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. este posibilă modificarea structurii indecşilor prin comanda ALTER INDEX. ci un bitmap format pe baza acestor valori. Diferenţa constă în faptul că în cazul tabelului organizat pe bază de index.) Proprietarul tabelului indexat Numele tabelului indexat Tipul tabelului indexat (TABLE. Un astfel de tabel poate fi manipulat de către aplicaţii la fel ca un tabel obişnuit.

column_name.index_name. interogarea unei vizualizări. lista unei comenzi SELECT.uniqueness FROM user_indexes b. CURRVAL – referă valoarea curentă a secvenţei. Crearea unei secvenţe se face cu ajutorul comenzii: CREATE SEQUENCE [<nume_schema>. Secvenţe O secvenţă este un obiect în baza de date care serveşte pentru a genera întregi unici în sistemele multi-utilizator. evitând apariţia conflictelor şi a blocării.index_name AND a. a. DELETE sau UPDATE.index_name = b. NEXTVAL şi CURRVAL nu pot fi folosite în: subinterogare in SELECT. lista SELECT a unei subcereri dintr-o comanda INSERT. SELECT a.table_name = ’carte’. 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. a.column_position poz. comandă SELECT cu operatorul DISTINCT. clauza SET a unei comenzi 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. 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). NEXTVAL şi CURRVAL pot fi folosite în: clauza VALUES a unei comenzi INSERT. user_ind_columns a WHERE a. DIRECT_LOAD) Numărul de linii utilizate. b. INVALID. Secvenţele sunt memorate şi generate indiferent de tabele  aceeaşi secvenţă poate fi utilizată pentru mai multe tabele. O secvenţă poate fi creată de un utilizator şi poate fi partajată de mai mulţi utilizatori.

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

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

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

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

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

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

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

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

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

este creată o înregistrare, dar este modificat şi tabelul contract. 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. Opţiunea WITH READ ONLY asigură că nu pot fi efectuate operaţii LMD asupra vizualizării. Constrângerea WITH CHECK OPTION garantează faptul că va fi permisă, prin intermediul vizualizării, numai inserarea sau actualizarea de linii accesibile acesteia (care sunt selectate de cerere). Prin urmare, această opţiune asigură constrângeri de integritate şi verificări asupra validităţii datelor inserate sau actualizate. 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ă; operaţiile de inserare, ştergere şi modificare se fac prin intermediul declanşatorilor INSTEAD OF. Cuvântul cheie CONSTRAINT permite numirea constrângerii WITH CHECK OPTION. În absenţa acestei clauze, constrângerea va avea un nume implicit de forma SYS_Cn, unde n este un număr întreg unic. Exemplu: Să se creeze o vizualizare ce conţine artiştii de naţionalitate română, care au opere expuse în muzeu. 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ă. CREATE VIEW artist_roman AS SELECT * FROM artist WHERE nationalitate = 'romana' WITH CHECK OPTION CONSTRAINT artist_roman_ck; UPDATE artist_roman SET nationalitate = 'engleza' WHERE cod_artist = 25; Încercarea de actualizare a unei linii prin instrucţiunea anterioară va genera eroarea „ORA-01402: view WITH CHECK OPTION where-clause violation“. Exemplu: Să se creeze o vizualizare asupra tabelului galerie care să nu permită efectuarea nici unei operaţii LMD. CREATE VIEW viz_galerie AS SELECT cod_galerie, nume_galerie FROM galerie WITH READ ONLY; DELETE FROM viz_galerie WHERE cod_galerie = 10; Încercarea de ştergere a unei linii din vizualizarea viz_galerie determină

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

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

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

care se realizează prin reexecutarea completă a cererii din definiţia vizualizării materializate. Clauza COMPLETE implică reactualizarea completă. reactualizarea va fi de tip COMPLETE. vizualizarea nu va putea fi utilizată în rescrierea cererilor. Opţiunea IMMEDIATE este implicită. Modificările sunt stocate într-un fişier log asociat tabelului master. În caz contrar. poate fi menţionată opţiunea BUILD IMMEDIATE | DEFERRED care determină introducerea de linii în vizualizarea materializată imediat. 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. 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. Opţiunea WITH ROWID asigură compatibilitatea cu tabelele master din versiunile precedente lui Oracle8. Clauza nu este permisă pentru vizualizările materializate ce conţin tipuri obiect. Opţiunile START WITH şi NEXT nu pot fi specificate dacă s-au precizat clauzele ON COMMIT sau ON DEMAND. Prin refresh_vm se specifică metodele. CACHE sau NOCACHE. modurile şi momentele la care sistemul va reactualiza vizualizarea materializată. se menţionează: clauza_partiţionare_tabel. Tabelul master trebuie să conţină o constrângere PRIMARY KEY. {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ă. până la prima operaţie de reactualizare. Opţiunea nu poate fi specificată pentru vizualizări materializate obiect. În acest ultim caz. care se efectuează corespunzător modificărilor survenite în tabelele master. Clauza USING ROLLBACK SEGMENT specifică segmentul de anulare distant . 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. prin intermediul procedurilor specifice din pachetul DBMS_MVIEW (REFRESH. REFRESH_DEPENDENT). Pe lângă acestea.Dintre proprietăţile care pot fi specificate în această clauză. Clauza ON DEMAND este implicită şi indică efectuarea reactualizării vizualizării materializate la cererea utilizatorului. respectiv la prima operaţie de reactualizare (refresh). clauza_paralelism. REFRESH_ALL_MVIEWS. Clauza FORCE este implicită şi presupune reactualizarea de tip FAST. dacă este posibil.

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

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

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 [. Acest index trebuie creat înaintea oricărei comenzi LMD care va acţiona asupra tabelelor cluster-ului. Sistemul va reactualiza vizualizarea evaluând expresia din clauza NEXT. astfel încât metoda de reactualizare implicită să fie de tip FAST. Exemplu: Să se modifice vizualizarea materializată opera_artist_polite creată anterior. 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. specificare a coloanelor care compun cheia cluster-ului. Coloanele comune definite pentru cluster. Coloanele comune definesc cheia cluster-ului. relativ la una sau mai multe coloane. reprezintă cheia cluster-ului şi criteriul de regrupare.materializată ca fiind reactualizată şi deci eligibilă pentru rescrierea cererilor. Nu va fi permisă utilizarea acestei vizualizări pentru rescrierea cererilor. Grupări Cluster-ul este o regrupare fizică a două sau mai multe tabele. absenţa indexului afectează utilizatorul – datele cluster-ului nu sunt accesibile).]nume_viz_materializată. un index (relativ la cheia cluster-ului). iar apoi va executa această operaţie o dată pe săptămână. crearea tabelelor care vor compune cluster-ul. iar intervalul de timp la care se realizează reactualizarea să fie de 7 zile. 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. Crearea unui cluster presupune: crearea structurii cluster-ului. Un index al cluster-ului se deosebeşte de un index al tabelului (de exemplu. DROP MATERIALIZED VIEW [schema. QUERY Pentru că nu se specifică valoarea corespunzătoare opţiunii START WITH în clauza REFRESH. atunci blocurile sunt înlănţuite. Un cluster este un obiect al bazei care necesită: un nume unic la nivelul schemei. cu scopul măririi performanţelor.nume_coloana tip_data] …) [SIZE n] . Un cluster trebuie să aibă cel puţin un index. crearea indexului cluster-ului. ALTER MATERIALIZED VIEW opera_artist_polite REFRESH FAST NEXT SYSDATE + 7 DISABLE REWRITE.

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

numită funcţia hash. Funcţia are ca parametru cheia cluster-ului şi returnează o anumită valoare (valoare hash). Această valoare corespunde blocului de date din cluster pe care Oracle îl va citi sau scrie pe baza comenzii executate. De exemplu, apelurile telefonice efectuate de un client într-o lună vor fi facturate împreună. Apelurile pot fi depozitate într-un cluster hash a cărui cheie este formată din coloanele ce conţin numărul telefonului, anul şi luna în care a avut loc convorbirea. Suprimarea unui cluster din baza de date se face prin comanda: DROP CLUSTER nume_cluster În urma ştergerii unui cluster, tabelele pe care acesta le conţine nu mai sunt grupate. Secvenţa următoare suprimă: cluster-ul, toate tabelele definite relativ la acest cluster şi constrângerile lor de integritate. DROP CLUSTER nume_cluster INCLUDING TABLES CASCADE CONSTRAINTS; Modificarea unui cluster permite redefinirea condiţiilor, modificarea parametriilor de stocare şi a caracteristicelor de stare (ALTER CLUSTER).

Informaţii despre obiectele bazei de date Pot fi obţinute consultând DD(Dicț ionarul de Date). Dintre ele se remarcă: definiţiile tuturor obiectelor din baza de date; spaţiul alocat şi spaţiul utilizat în prezent de obiectele schemei; constrângerile de integritate; numele utilizatorilor bazei; privilegiile şi rolurile acordate fiecărui rol; alte informaţii generale despre baza de date. Tabelul USER_CATALOG conţine informaţii despre tabelele şi vizualizările definite de un utilizator particular. Acest tabel poate fi referit şi prin sinonimul său public CAT. Tabelul USER_OBJECTS conţine informaţii despre toate obiectele definite de utilizatorul curent. Tabelul are următoarea schemă relaţională: USER_OBJECTS (object_name, object_id, object_type, created, last_ddl_time, timestamp, 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), informaţii despre legăturile bazei de date (USER_DB_LINKS), erorile curente ale obiectelor depozitate (USER_ERRORS),

informaţii despre indecşii creaţi de utilizator (USER_INDEXES), informaţii despre tabelele utilizatorului (USER_TABLES) etc. Vizualizările din dicţionarul datelor referitoare la tabele conţin: USER_TAB_COLUMNS|COLS – informaţii despre coloanele tabelelor, USER_CONS_COLUMNS – informaţii despre constrângeri la nivel coloană, USER_TAB_COMMENTS – informaţii despre comentarii la nivel tabel, USER_COL_COMMENTS – informaţii despre comentarii la nivel coloană, USER_TAB_PARTITIONS – informaţii despre partiţiile tabelelor.

Întrebări
Alegeţi răspunsurile corecte pentru fiecare din următoarele întrebări cu răspunsuri multiple. Reţineţi că întrebările pot avea mai multe răspunsuri corecte. 1. Tipurile de date oferă următoarele avantaje a. Respectă standardele publicate b. Oferă un set de comportamente utile pentru utilizatorii bazei c. Asigură independenţa faţă de date d. Restricţionează datele din coloane la caractere care au sens în context e. Ajută sistemul DBMS să stocheze mai eficient datele din coloane 2. Tipurile de date pentru caractere a. Sunt mai flexibile decât tipurile de date numerice b. Acceptă atât date cu lungime fixă, cât şi date cu lungime variabilă. c. Necesită întotdeauna specificarea preciziei şi a scalei d. Determină completarea coloanelor până la lungimea maximă maximă e. Pot stoca şiruri de caractere în format specific unei limbi naţionale 3. Tipurile de date numerice a. Sunt mai flexibile decât tipurile de date pentru caractere b. Restricţionează valorile din coloane la numere şi simboluri înrudite, cum ar fi virgulele şi simbolul dolar c. Necesită întotdeauna specificarea preciziei şi a scalei d. Stochează valori exacte sau aproximative e. Sunt potrivite pentru a fi folosite în calcule 4. Tipurile numerice standard includ a. INTEGER b. NUMBER c. FLOAT d. BOOLEAN e. INTERVAL 5. Tipurile de date temporale standard includ a. DATETIME b. DATE c. TIMESTAMP

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

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

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

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

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

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

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

şi invers. care începe cu „N" şi se termină cu „w". Microsoft Access oferă o caracteristică similară. Procent (%) . urmată de orice alt caracter. 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". 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%'. iar pentru caracterul de înlocuire nepoziţional este folosit asteriscul (*) — aceste caractere corespund convenţiilor folosite în DOS si Visual Basic. nu literele „on" din alte cuvinte. ca în exemplul următor: .Caracterul liniuţă de subliniere poate fi folosit drept caracter de înlocuire poziţional. LIKE Operatorul LIKE este folosit pentru a compara o valoare de tip caracter cu un tipar*. ceea ce înseamnă că se potriveşte cu orice caracter aflat pe poziţia respectivă în şirul de caractere evaluat. DATA_INSCRIERE CONT_CLIENT WHERE DATA_INSCRIERE BETWEEN ‖2005/01/01‖ AND „2005/01/31‖. indiferent de lungime. dar pentru caracterul de înlocuire poziţional este folosit semnul de întrebare (?). Se potriveşte cu orice şir de caractere care confine „Now" (1a inceput. urmat de litera „w" (1a începutul. returnând valoarea logică ―adevărat‖ dacă valoarea de tip caracter se încadrează în tipar şi ―fals" în caz contrar. ceea ce înseamnă că se potriveşte cu orice număr de caractere.SELECT ID_CONT_CLIENT. Se potriveşte cu orice şir de caractere care conţine litera „N". Se potriveşte cu orice şir de caractere format din exact trei caractere. Pentru definirea tiparului pot fi folosite două caractere de înlocuire: Liniuţa de subliniere (_) . ar fi trebuit să includă în tipar şi spatiile necesare. O literă mica din date nit se potriveşte cu o literă mare din tiparul unei clauze LIKE.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". la sfârşit sau în mijloc). Se potriveşte cu orice şir de caractere care incepe cu „Now".

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

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' Înmul Scăde ere Adun Descri AS . /  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'. Operatori aritmetici În SQL. precum Java sau C. prioritatea operatorilor din SQL este cea pe care o folosim în operaţiile matematice obişnuite.  Dacă taxele sunt de 8. Din fericire. ID_FILM = c. dacă se amestecă operatorii aritmetici în aceeaşi instrucţiune SQL fără a folosi paranteze.0825).0825 AS TAX FROM FILM WHERE TITLU_FILM = 'The Last Samurai'.FROM FILM m WHERE TITLU_FILM = 'The Last Samurai' AND NOT EXISTS (SELECT ID_FILM FROM FILM_COPIAT c WHERE m. ID_FILM).25% (0. 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. 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'. ordinea în care sunt evaluate operaţiile este determinată de prioritatea predefinită. Cei patru operatori aritmetici din SQL sunt: Op erator + are re * ţire Împăr ţire Ca şi în cazul operatorilor conjunctivi. cât reprezintă taxele de vânzare din costul achiziţiei anterioare? SELECT (PRET_VANZARE _VHS+ PRET_VANZARE _DVD) * 0.

Un număr de funcţii sunt furnizate de producătorul DBMS şi se pot scrie propriile funcţii. funcţiile sunt folosite în lista de coloane a unei instrucţiuni SELECT. dar există şi excepţii. sunt apelate pentru fiecare rând prelucrat de interogare şi. plus prenumele şi numele persoanei. SELECT UPPER(TITLU_FILM) AS TITLU_FILM FROM FILM WHERE COD_GEN_FILM = 'Comdy'. Cel mai des. Funcţia UPPER este deseori folosită în condiţiile WHERE.  Aceeaşi soluţie. ca urmare. pentru a indica faptul că funcţie este aplicată unei coloane dintr-un tabel sau o vizualizare. Exemple de concatenare a şirurilor de caractere:  Magazinul de produse video vrea să trimită fiecărui client o scrisoare care începe cu formula "Client". Funcţiile pot fi clasificate în multe moduri. modificată pentru a funcţiona în Microsoft SQL Server : SELECT ‚Client' + NUME_PERSOANA + ' ' + NUME_FAMILIE_PERSOANA AS SALUT_CLIENT FROM PERSOANA. Soluţia acestei cerintţe în Oracle: SELECT 'Client' || NUME_PERSOANA|| ' ' || NUME_FAMILIE_PERSOANA AS SALUT_CLIENT FROM PERSOANA. cum ar fi Microsoft SQL Server. Uneori este folosit termenul funcţie de coloană.Funcţii SQL elementare O funcţie este un tip special de program. În SQL. Să presupunem că nu vă amintiţi dacă valorile COD_GEN_FILM au fost stocate cu litere mari. Exemple: Să se afişeze comediile (COD_GEN_FILM = 'Comdy') scriind titlurile cu majuscule. cum ar fi PL/SQL pentru Oracle sau Transact SQL pentru Microsoft SQL Server şi Sybase Adaptive Server. Numele sunt stocate în tabelul PERSON. funcţiile necesită întotdeauna specificarea unei expresii. dar majoritatea specialiştilor le împart după ceea ce fac. litere . returnează o singură valoare pentru fiecare rand din setul de rezultate. care returnează o singură valoare de fiecare data când este apelată. Funcţia standard de concatenare a şirurilor de caractere din SQL este apelată cu două bare verticale (||). folosind un limbaj special livrat împreună cu sistemul DBMS. Numerele şi caracterele speciale sunt lăsate ca stare. 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. care foloseşte semnul plus (+) pentru concatenarea şirurilor de caractere. Funcţii pentru caractere Funcţiile pentru caractere sunt numite astfel deoarece manipulează date de tip text. Termenul provine de la conceptul matematic al unei funcţii. UPPER Funcţia UPPER transformă literele dintr-un şir de caractere în litere mari. care deseori include numele unei coloane.

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

1) = 'B' LENGTH Funcţia LENGTH returnează lungimea unui şir de caractere.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". Să se afişeze lungimea titlului pentru filmul a cărui valoare ID_FILM este 1. ROUND (expresie numerică. 1. în conformitate cu regulile matematicii. iar numărul de zecimale prin cel de-al doilea. ROUND Funcţia ROUND rotunjeşte o valoare la un număr specificat de zecimale. Pentru toate. Alte funcţii matematice Tabelul care urmează prezintă funcţiile matematice cel mai des întâlnite. DB2 sau MzSQL. SELECT TITLU_FILM. 1. Valoarea numerică este furnizată prin primul parametru. LENGTH (TITLU_FILM) AS LENGTH FROM FILM WHERE ID_FILM = 1. sintaxa generală este aceeaşi: NUME_FUNCTIE (expresie) F Descriere . Microsoft SQL Server şi Sybase Adaptive Server folosesc numele LEN pentru versiunea proprie a acestei funcţii. '+ NUME_FAMILIE_PERSOANA AS NUME_INTREG FROM PERSOANA WHERE SUBSTRING (NUME_FAMILIE_PERSOANA. SELECT TITLU_FILM. Ar trebui să vă puteţi deja gândi la alte moduri de a face acest lucru. Iată şi versiunea pentru Microsoft SQL Server a exemplului anterior: SELECT NUME_PERSOANA + ' ' + SUBSTRING(PRENUME_PERSOANA. Presupunem că folosiţi o bază de date oracle. În continuare este prezentat formatul general al funcţiei ROUND. Presupunem că folosiţi o bază de date Microsoft SQL Server. prin folosirea operatorului LIKE. rotunjit la două zecimale? SELECT ROUND((PRET_VANZARE_VHS + PRET_VANZARE _DVD) / 2. 2) AS AVG_COST FROM FILM WHERE TITLU_FILM = 'The Last Samurai'. LEN (TITLU_FILM) AS LENGTH FROM FILM WHERE LEN (TITLU_FILM) < 10. număr de poziţii zecimale) Care este costul mediu al unei copii a filmului The Last Samurai. Exemple: Să se afişeze lungimea titlului pentru filmul a cărui valoare ID_FILM este 1. 1) +' . Funţii matematice Funcţiile matematice manipulează valori numerice.

Găseşte valoarea minimă dintr-o coloană. Descriere Tangenta trigonometrică a unui unghi specificat în radiani Ridică un număr la o putere (numărul şi puterea sunt fumizate ca parametri) SI Sinusul trigonometric al unui unghi specificat în radiani P Valoarea exponenţială a unui număr dat Cosinusul trigonometric al unui unghi specificat în radiani Valoarea absolută a unui număr dat . 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. Totuşi este recomandată folosirea funcţiei CAST. Numără valorile dintr-o coloană. Valoarea numerică trebuie să fie convertită într-un şir de caractere pentru a putea fi concatenată cu o valoare literală conţinând simbolul dolar. SELECT '$' || CAST(PRET_VANZARE _DVD AS VARCHAR(6)) AS PRET FROM FILM WHERE TITLU_FILM = 'The Last Samurai'. Tabelul următor prezintă funcţiile de agregare acceptate în majoritatea implementărilor SQL: F uncţie A VG C OUNT M AX M IN S UM Însumează valorile dintr-o coloană.uncţie A BS C OS E XP OWER N T AN Funcţii de conversie Funcţiile de conversie transformă date dintr-un tip de date în altul. Calculează valoarea medie pentru o coloană sau o expresie. CONVERT TO Multe implementări DBMS pun la dispoziţie o funcţie CONVERT sau CONVERT TO. CAST Funcţia CAST transformă date dintr-un tip de date în altul. urmată de un exemplu: CAST (expresie AS tip de date) Afişati preţul pentru formatul DVD al filmului The Last Samurai. Iată sintaxa generală a funcţiei CAST. Găseşte valoarea maxină dintr-o coloană. deoarece este implementată într-un mod mai unitar de către diferiţi producători. cu un simbol dolar în faţa sumei.

exceptând cazul în care se adăugă o clauză ORDER BY care specifică un alt mod de ordonare. în acelaşi timp. Operaţia este permisă numai dacă interogările sunt compatibile din punctul de vedere al uniunii. retumează un singur rând de date. 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.  Care sunt lungimea minimă şi maximă a titlurilor filmelor? SELECT MIN(LENGTH(TITLU_FILM)) AS MIN_LENGTH. SELECT INCHIRIAT_FEE AS FEE FROM FILM_INCHIRIAT WHERE INCHIRIAT _FEE IS NOT NULL UNION . Functia COUNT(*) este o functie de agregare şi. Ce se întâmplă dacă scoateţi clauza GROUP BY din această interogare? Sistemul DBMS retumează un mesaj de eroare şi. împreună cu numărul de filme asociate fiecărui cod. Câte filme există în tabelul FILM? SELECT COUNT(*) AS NUM_FILM FROM FILM. COUNT(*) AS COUNT FROM FILM GROUP BY COD_GEN_FILM. Sistemul DBMS va ordona rândurile selectate de interogare după coloanele din clauza GROUP BY. aşa că grupurile vor fi returnate în ordine ascendentă.Exemple:  Care este preţul mediu al unui DVD? SELECT ROUND(AVG(PRET_VANZARE _DVD). într-un mod similar cu cel al cuvântului cheie DISTINCT. returnând un rând pentru fiecare grup din setul de rezultate. UNION Operatorul UNION adaugă rândurile din setul de înregistrări al unei interogări la cel al unei alte inregistrări şi. în absenta clauzei GROUP BY. MAX(LENGTH(TITLU_FILM)) AS MAX_LENGTH FROM FILM. ceea ce înseamnă că au acelaşi număr de coloane şi că tipurile de date ale coloanelor corespondente sunt compatibile. din nefericire. Exemplu: Afişati fiecare cod de gen. 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.2) AS AVG_PRET FROM FILM.  Câte genuri diferite de filme sunt reprezentate în tabelul FILM? SELECT COUNT(DISTINCT(COD_GEN_FILM)) AS NUM_GEN FROM FILM. Exemplu: Afişaţi pe o singură coloană toate valorile nenule pentru taxa de inchiriere şi taxa de întârziere din tabelul FILM_ÎNCHIRIAT. elimină rândurile duplicate. SELECT COD_GEN_FILM AS GEN. mesajul de eroare este deseori destul de criptic.

Reţineţi că întrebările pot avea mai multe răspunsuri corecte. În unele implementări. găseşte intersecţia valorilor din cele două interogări. Selectează toate coloanele din tabel sau vizualizare b. Totuşi. operatorul se numeşte MINUS. doar un număr mic de sisteme DBMS (cele mai importance fiind Oracle şi DB2) implementează acest operator. Returnează un mesaj de eroare c. Este specificată de clauza SORTED BY b. INTERSECT Operatorul INTERSECT găseşte valorile selectate dintr-o interogare. valorile din prima interogare care nu apar în cea de-a doua interogare. O instrucţiune SELECT fără o clauză WHERE a. Poate fi ascendentă sau descendentă pentru orice coloană c. nu EXCEPT. Afişează numai definiţia tabelului sau a vizualizării 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. Este imprevizibilă dacă nu este specificată in interogare . ordinea rândurilor din rezultatele interogării a.SELECT LATE_OR_LOSS_FEE AS FEE FROM FILM_INCHIRIAT WHERE LATE _OR_ LOSS FEE IS NOT NULL. Întrebări şi Probleme Alegeţi răspunsurile corecte pentru fiecare din următoarele întrebări cu răspunsuri multiple. 1. În mod prestabilit este descendentă. UNION ALL UNION ALL funcţionează la fel ca şi operatorul UNION. exceptând faptul că rândurile duplicate nu sunt eliminate. Foarte puţine sisteme DBMS implementează acest operator. în esenţă. În SQL. care apar şi într-o altă interogare. Nu-1 veţi găsi în Microsoft SQL Server sau MySQL. În esenţă. precum Oracle. Selectează toate rândurile din tabel sau vizualizare d. dacă nu se specifică o altă ordine d. returnând. Scrie întotdeauna rezultatele într-un fişier jurnal 2.

Trebuie să includă o clauză ORDER BY d. <>NULL d. în acelaşi timp. IS NULL e. UPPER b. ABS 10. o clauză GROUP BY şi o clauză ORDERBY e. LENGTH b. Poate fi rescris folosind operatorii <= şi NOT <= c. Trebuie să includă o clauză GROUP BY e. Parantezele sunt opţionale 7. Elimină rândurile duplicate din setul de rezultate b. Foloseşte liniuţe de subliniere drept caractere de înlocuire nepoziţionale d. Când operatorii AND şi OR sunt combinaţi în aceeaşi clauză WHERE a. Foloseşte semne de întrebare drept caractere de înlocuire poziţionale b. LOWER d. Operatorul AND are prioritate mai mică decât operatorul OR d. Nu poate include. ROUND c. Foloseşte simboluri procent drept caractere de înlocuire poziţionale e. Specifică un domeniu de valori care include şi capetele b. O instrucţiune SQL care confine o funcţie de agregare a. SUBSTR e. Sistemul SGBD returnează un mesaj de eroare b. Funcţiile SQL standard pentru şiruri de caractere includ a. Parantezele. IS NOT NULL 8. EXISTS 9. NOT = NULL c. Poate fi rescris folosind operatorii <= şi >= d. 6. Poate conţine şi coloane calculate b. = NULL b. SQL matematice standard includ a. CAST d. sunt obligatorii e. MIDDLE c. Poate conţine şi coloane obisnuite c.Poate fi specificată numai pentru coloanele din setul de rezultate al interogării 3. Foloseşte liniuţe de subliniere drept caractere de înlocuire poziţionale c. Operatorul AND are prioritate mai mare decât operatorul OR c. Selectează rândurile adăugate în tabel într-un anumit interval de timp e. Include rândurile duplicate în setul de rezultate . Operatorul UNION a. Operatorul BETWEEN a. Funcţiile. Sintaxa corectă pentru eliminarea valorilor nule din rezultatele interogării este a. MIN e. Nu este inclus în standardul ISO/ANSI 4. Operatorul LIKE standard a. Foloseşte simboluri procent drept caractere de înlocuire nepoziţionale 5.

cu suma totală strânsă din taxele de închiriere (PLATA_INCHIRIAT) sau taxele de întârziere sau pierdere (PLATA_PENALIZARE) pentru filmul respectiv.99. Deseori. Afişaţi toate titlurile de filme care conţin cuvântul „the". veţi obţine valori nule în rezultate. Folosiţi funcţia SUM pentru a afla totalul valorilor din coloana PLATA_INCHIRIAT din tabelul FILM_INCHIRIAT. Lecţia 4. De exemplu. Afişaţi primele cinci caractere din numele de familie (NUME_FAMILIE_PERSOANA) din tabelul PERSOANA. 10. În Oracle. s-au folosit coduri în locul descrierilor complete pentru genurile filmelor în tabelul FILM. (Se pare că nu există o funcţie echivalentă în D132). Unele valori din coloana PLATA_PENALIZARE sunt nule. dacă nu aveţi o funcţie care să înlocuiască valorile nule cu o altă valoare (zero. majusculă sau minusculă? 6. Afişaţi titlurile şi preţurile tuturor filmelor pentru care PRET_VANZARE_DVD este cel puţin 19. Combină două interogări într-o singură interogare de tip join Combină seturile de rezultate a două interogări într-un singur set de rezultate Este numit JOIN în unele implementări SQL Scrieţi instrucţiunile SQL pentru următoarele probleme 1. 2. 3.99. este util să se combine date din tabele multiple într-o singură interogare . dar eliminaţi toate valorile duplicate din setul de rezultate? 9. Afişaţi toate filmele pentru care genul (COD_GEN_FILM) este Comdy şi categoria MPAA (MPAA _COD_INCHIRIERE) este PG-13. d. e. Din tabelul FILM. cu sau fără literă mare. Găsiţi toate filmele din tabelul FILM pentru care MPAA_COD_INCHIRIERE are altă valoare decât „R". ordonate crescător după preţ. funcţia se numeşte NVL. în listingul celor trei coloane ale tabelului FILM din figura următoare. observaţi valorile afişate pentru coloană FILM_GEN_COD. Câte închirieri (tabelul FILM_INCHIRIAT) nu au nici o valoare în coloana LATE_OR_LOSS_FEE? 5. Afişaţi toate filmele (ID_FILM) care au fost închiriate (tabelul FILM_INCHIRIAT). Sugestie: adunaţi valorile PLATA_INCHIRIAT şi PLATA_PENALIZARE. 7. iar în MySQL se numeşte IFNULL. dar nu mai mare de 29. împreună cu media preţurilor pentru DVD (PRET_VANZARE_DVD) pentru fiecare gen. 4. 14. apoi însumaţi (SUM) rezultatul respectiv pentru fiecare valoare ID_FILM. în acest caz).c. Combinarea datelor din mai multe tabele S-au prezentat până acum instrucţiuni SQL care selectează date dintr-un singur tabel. 8. Din discuţia . Câte persoane au un nume de familie (NUME_FAMILIE_PERSOANA) care conţine litera „a". aşa că. Atunci când s-a proiectat baza de date pentru magazinul de produse video. afişaţi toate genurile (COD_GEN_FILM). în Microsoft SQL Server se numeşte ISNULL. împreună cu filmele pentru care genul este Drama şi categoria este R. rotunjită la două poziţii zecimale.

despre procesul de normalizare. referind coloană cheie primară (cu acelaşi nume) din tabelul FILM_GEN. iar coloană FILM_GEN_COD a devenit cheie externă în tabelul FILM. nu puteţi afişa pe pagina web a magazinului de produse video. FILM_GEN. FILM_GEN_COD ActAd Anime ChFam Class Comedie Doc Drama Forgn FILM_GEN_DESCRIERE Actiune Animatie Copii şi Familie Clasic Comedie Documentar Drama Strain . Figura următoare prezintă un listing al tabelului FILM_GEN. 1 Pirates of the Caribbean: Trie Curse of the Black Pearl Big Fish Man on Fire Master and Commander The Far Side of the World LosI în Translation Two Weeks Notice 50 First Dates Matchstick Men Cold Mountain Road to Perdition The School of Rock 13 Going on30 Monster The Day After Tomorrow Das Boot Evident. Aceasta este ideea capitolului de faţă: combinarea datelor din mai multe tabele într-o singură interogare.trebuie să obţineţi descrierea completă a genurilor 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. s-a evitat anomalia de actualizare – dacă se schimbă descrierea unui gen. În timpul normalizării. tabelul FILM aşa cum este prezentat în figura de mai sus . descrierea genurilor a fost mutată în tabelul. nu este nevoie să actualizăm acea descriere pentru toate filmele asociate genului respectiv în tabelul FILM. FILM_COD 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 FILM_GEN_COD Drama ActAd Comedie ActAd ActAd ActAd Drama ActAd ActAd Drama Rmce Comedie Comedie Drama Drama Comedie Rmce Drama ActAd Forgn Tabelul FILM (trei coloane) FILM_TITLU Mystic River The Last Samurai Something's Gotta Grve The Italian Kill Bill: Voi.

Idila) Stiintifico-Fantastic Sport Groaza Tabelul FILM_GEN .Hor Indep Music Rmce SciFi Sport Thriller Horror Independent Muzical Romance(Romantic.

. Setul de rezultate al interogării a fost trunchiat după primele două titluri de filme . este un set de rezultate obţinut prin uniunea dintre fiecare rând al unui tabel cu fiecare rând dintr-un alt tabel... ... FILM_TITLU FROM FILM. FILM_GEN_DESCRIERE AS GEN.. O uniune apare de fiecare dată când clauza FROM a unei instrucţiuni SELECT specifică numele mai multor tabele. GEN FILM_TITLU ....... Rezultatul este cunoscut sub numele de produs cartezian (după numele filozofului şi matematicianului francez Rene Descartes) şi.. în bazele de date relaţionale.. De exemplu: SELECT FILM_ID... . dar nu i-am spus care este corespondenţa dintre rândurile celor două tabele. Problema este că am cerut bazei de date să unească tabelele.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.. FILM_GEN ORDER BY FILM_ID. FIL M_ID 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 .

FILM_TITLU FROM FILM. Cea mai simplă formă de calificator este chiar numele tabelului. Totusi.FILM_GEN_COD= FILM_GEN.FILM_GEN_COD ORDER BY FILM_ID. separat cu caracterul punct de numele coloanei. Totuşi. Aceasta nu înseamnă numai coloanele din clauza WHERE. astfel încât motorul SQL să ştie care dintre cele două coloane este referită. folosind numele tabelelor. ci din orice alt loc al instrucţunii. FILM_GEN_DESCRIERE AS GEN. cu numele coloanelor specificate complet. Pentru a realiza acest lucru trebuie să se facă o o uniune standard relaţională. find preferate denurmirile uniune internă (inner join) sau uniune standard (standard join ). termenul uniune de egalitate (equijoin) este rareori folosit în afara mediilor academice. dar pot există şi excepţii. atunci când legăm una sau mai multe coloane dintr-un tabel (de obicei. Trebuie indicat ce coloane ar trebui să se potrivească pentru a uni două rânduri din cele două tabele. SELECT FILM_ID. cunoscut şi sub numele de uniune de egalitate (equijoin). inclusiv în lista SELECT. o cheie externă) cu coloane similare dintr-un alt tabel (de obicei. există unele diferenţe. aşa că programatorii mai vechi sunt obisnuiţi cu metoda bazată pe clauza WHERE. FILM_ID 1 Drama FILM_GEN FILM_TITLU Mystic River . cheia primară).Soluţia este să specificăm cum se va face unirea tabelelor. Observaţi că interogarea selectează coloanele FILM_ID şi FILM_TITLU din tabelul FILM şi genul corespunzător (FILM_GEN_DESCRIERE) din tabelul FILM_GEN. Există două modalităţi de specificare a coloanelor corespondente: folosind clauza WHERE sau folosind clauza JOIN. FILM_GEN WHERE FILM. aceasta fiind cea mai des folosită formă de uniune. numită şi uniune internă (inner join). nu o coloană cu o constantă sau o expresie. Motorul SQL cere să se refere toate coloanele specificate într-o instrucţiune SQL. Uniuni de egalitate (equijoin) Avem o uniune de egalitale (equijoin). În clauza WHERE : Se compară o coloană cu o altă co1oană. cele două coloane vor fi cheia primară dintr-un tabel şi cheia externă din celălalt tabel. Clauza JOIN a fost adaugată relativ recent în standardul SQL. 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). În continuare este prezentat un exemplu de uniune realizată prin clauza WHERE. folosind condiţia de egalitale. în mod normal. 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.

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. Acestea funcţionează la fel ca şi pseudonimele coloanelor din clauza SELECT. A. Deşi nu era necesar. pentru a va arăta cum sunt folosite. SELECT A. după adăugarea pseudonimelor pentru numele tabelelor.2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Actiune şi Aventura Comedie 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 Last Samurai Something's Gotta Give The Italian Job Kill Bill Vol.FILM_ID. Exemplul următor prezintă instrucţiunea anterioară. „B‖. După ce asociaţi un pseudonim unui nume de tabel în clauza FROM. 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.FILM_TITLU FROM FILM A. Din această cauză.‖C‖ şi aşa mai departe). FILM_GEN B WHERE A. . trebuie să folosiţi pseudonimul în locul numelui de tabel în întreaga instrucţiune SQL. pseudonimele au fost adăugate şi în lista de coloane din clauzele SELECT şi ORDER BY.FILM_GEN_DESCRIERE AS GEN. Deşi unii folosesc mnemonice pentru pseudonimul tabelelor. mai ales deoarece numele tabelelor pot avea 30 sau mai multe caractere în sistemele DBMS moderne.FILM_ID.FILM_GEN_COD ORDER BY A. în SQL este permisă şi folosirea pseudonimelor (aliases) pentru numele tabelelor.FILM_GEN_COD = B. este mult mai des întâlnită folosirea secvenţelor de majuscule (adică „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. B.

FILM_GEN_DESCRIERE AS GEN. Exemple: • JOIN cu condiţie ON: SELECT FILM_ID.. DATA_RETURNARII . 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). • JOIN cu cheie externă pe mai multe coloane.FILM_GEN_COD ORDER BY FILM_ID. SELECT FILM_ID. Clauza USING specifică numele coloanelor folosite pentru legarea rândurilor.FILM_GEN_COD = B. A se revedea prezentarea generală a bazei de date a magazinului de produse video. nume_tabel [INNER) JOIN nume_tabel { ON condiţie | USING (nume_coloană [ . Sintaxa generală a clauzei JOIN pentru o uniune internă. FILM_TITLU FROM FILM A JOIN FILM_GEN B ON A.. clauza USING acţionează numai atunci când coloanele pe care se face legătură au nume identice în ambele tabele.FILM_GEN_COD ORDER BY FILM_ID. FILM_GEN_DESCRIERE AS GEN. FILM_TITLU FROM FILM JOIN FILM_GEN ON FILM. • 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). COPY_NUMAR. Totuşi. pentru a vedea unde se încadrează tabelul în modelul general. nume_coloană. urmată de câteva exemple.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ă. SELECT FILM_ID.. FILM_TITLU FROM FILM JOIN FILM_GEN USING (FILM_GEN_COD) ORDER BY FILM_ID.FILM_GEN_COD = FILM_GEN. • JOIN cu pseudonime în loc de nume de tabele: SELECT FILM_ID. FILM_GEN_DESCRIERE AS GEN.]) } Clauza ON permite specificarea unei condiţii similare cu cea din clauza WHERE .

FILM_INCH B WHERE A. pentru a evita referirea ambiguă a lor. rescrisă sub forma unei uniuni naturale: SELECT FILM_ID.COPY_NUMAR. FILM_TITLU FROM FILM NATURAL JOIN FILM_GEN ORDER BY FILM_ID.FROM FILM_COPY JOIN FILM__INCHIRIAT USING (FILM_ID. sintaxa unei uniuni naturale este mult mai simplă. Uniunile pot implica mai mult de două tabele.FILM_ID = B.FILM_ID AND 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 . toate uniunile de egalitate sunt uniuni naturale. Uniuni naturale O uniune naturală (natural join) se bazează pe toate coloanele cu acelaşi nume din două tabele. din cauza lungimii.FILM_ID. SELECT A. . iată interogarea precedentă scrisă folosind condiţii de legătură în clauza WHERE. în esenţă.se înţelege de la sine care sunt coloanele folosite. A. un set de rezultate intermediar) cu tabelul MPAA_RATING. coloana FILM_GEN_DESCRIERE din tabelul FILM_GEN şi din tabelul MPAA_RATING. Remarcaţi că în acest caz trebuie să specificaţi numele complet al coloanelor FILM_ID şi COPY_NUMAR. pentru primele trei filme din tabelul FILM. Totuşi. Exemplul foloseşte două clauze JOIN. deoarece nu este necesar să specificaţi o condiţie sau o listă de coloane . 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ţă.nu toate SGBD-urile acceptă această sintaxă pentru clauza JOIN(accepta sigur Oracle şi MySQL ). Exemplul următor prezintă o uniune naturală care obţine coloana FILM_ID din tabelul FILM. Prima clauză JOIN cere motorului SQL să lege tabelele FILM şi FILM_GEN.. Am permis textului din coloana RATING_DESC să treacă automat pe linia următoare în rezultatele interogării. FILM_GEN_DESCRIERE AS GEN. DATA_RETURNARII FROM FILM_COPY A.COPY_NUMAR = B.COPY_NUMAR AND DATA_VANZARE IS NULL AND RETURN_DATA IS NULL. Exemplu: uniunea tabelelor FILM şi FILM_GEN. COPY_NUMAR) WHERE DATA_VANZARE IS NULL AND RETUR_DATA IS NULL. Instrucţiunea de mai jos afişează aceleaşi rezultate ca şi instrucţiunea anterioară. Reţineţi. coloana MPAA_RATING_DESCRIERE .

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

Acest tip de uniune este cel mai puţin probabil să fie acceptată de toate implementari.]) } Exemple de uniuni externe: • Să se afişeze toate descrierile genurilor de filme. împreună cu toate rândurile din tabelul din stânga pentru care poate fi găsită o legătură. SELECT FILM_GEN_DESCRIERE AS GEN. O uniune externă completă leagă fiecare rând dintr-un tabel cu zero sau mai multe rânduri corespondente din celălalt tabel.e SQL. modificaţi instrucţiunea astfel încât să utilizeze cuvântul cheie ON.acestea sunt genurile de filme care nu au filme asociate. 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. 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. .. FILM_TITLU FROM FILM_GEN LEFT OUTER JOIN FILM (FILM_GEN_COD). împreună cu filmele asociate fiecărui gen. Returnează toate rândurile din ambele tabele. în esenţă. 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 . Uniune externă completă (full outer join). care leagă fiecare rând dintr-un tabel cu fiecare rând din celălalt tabel. ca în exemplul care urmează după acesta. 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ă [ . Această uniune nu este acelaşi lucru cu un produs cartezian.Uniune externă către dreapta (right outer join).nume_coIoană. Dacă implementarea DBMS nu acceptă uniuni realizate cu cuvântul cheie USING. În setul de rezultate rândurile care nu au nici o valoare în coloană FILM_TITLU . Returnează toate rândurile din tabelul din dreapta (cel specificat al doilea în clauza JOIN).

uniunea externă completă v-ar fi permis să afişaţi atât genurile care nu au filme asociate.FILM_GEN_COD.FILM_GEN_COD =FILM_GEN. • Interogarea anterioară. GEN . • Afişaţi descrierile genurilor care nu au nume asociate. Totuşi. cu condiţie ON.FILM_GEN_COD WHERE FILM_TITLU IS NULL.FILM_GEN_COD. rescrisă ca uniune externă completă. rescrisă ca uniune externă către dreapta. FILM_GEN_COD = FILM_GEN. SELECT FILM_GEN_DESCRIERE AS GEN FROM FILM RIGHT OUTER JOIN FILM_GEN ON FILM. dacă genurile filmelor ar fi opţionale. dar exemplul de faţă foloseşte faptul că rândurile pentru care nu există legături returnează valori nule pentru a selecta numai genurile care nu au nume asociate. SELECT FILM_GEN_DESCRIERE AS GEN.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ă. FILM_GEN_COD = FILM_GEN. Există şi alte moduri de a face acest lucru. Deoarece fiecare film trebuie să aibă asociat un gen. SELECT FILM_GEN_DESCRIERE AS GEN. FILM_TITLU FROM FILM FULL OUTER JOIN FILM_GEN ON FILM. această interogare va produce aceleaşi rezultate ca şi uniunea externă către dreapta din interogarea anterioară. FILM_TITLU FROM FILM RIGHT OUTER JOIN FILM_GEN ON FILM. cât şi filmele care nu au genuri asociate.

.FILM_GEN_COD(+) = B..FILM_GEN_COD =* B. Simbolul .FILM_GEN_COD AND FILM_TITLU IS NULL. În ambele cazuri. Secţiunile următoare prezintă câteva implementări specifice ale sintaxei uniunii externe. Aceste soluţii particulare sunt prezentate aici numai pentru că s-ar putea să le intâlniţi în instrucţiuni SQL mai vechi Sintaxa uniunii externe în Oracle Oracle Corporation a decis să folosească un semn plus încadrat de paranteze pentru definirea uniunilor externe. FILM_GEN B WHERE A. .Animatie Copii şi Familie Clasic Documentar Horror Independent Musical SF Special Interes Sport Thriller Ca răspuns la cererile clienţilor. Iată exemplul anterior rescris folosind sintaxa Oracle: SELECT FILM_GEN_DESCRIERE AS GEN FROM FILM A.FILM_GEN_COD AND FILM TITLU IS NULL. FILM_GEN B WHERE A. este mai uşor să reţineţi că simbolul . 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. Iată exemplul anterior rescris folosind sintaxa Microsoft SQL Server (ca uniune externă către dreapta): SELECT FILM_GEN_DESCRIERE AS GEN FROM FILM A. mai mulţi producători de baze de date relaţionale au introdus uniunile externe inainte de standardizarea clauzei JOIN.(+)― 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). 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. este obligatoriu ca asteriscul şi semnul egal să nu fie separate de spaţii.(+)― este plasat în partea clauzei WHERE unde vreţi să adăugaţi valori nule.

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

Iată cum arată interogarea: SELECT DISTINCT TRANZACTIE_ID FROM FILM_INCHIRIAT WHERE INCHIRIAT_TAXA> (SELECT AVG(INCHIRIAT_TAXA) FROM FILM_INCHIRIAT) . 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. pentru a vă ajuta să înţelegeţi cum funcţionează: SELECT DISTINCT LIMBA_COD FROM FILM_LIMBA. Exemple: • Afişaţi toate limbile în care nu există nici un film în inventarul magazinului de produse video. apoi setul de rezultate obţinut poate fi folosit în interogarea externă. Cuvântul cheie DISTINCT elimină rândurile duplicate din setul de rezultate . 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. SELECT LIMBA_COD.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ă. Interogarea internă rulată independent.

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

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

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

inclusiv funcţii pentru caractere. iar DATA_VANZARII are valoarea NULL) dar pentru care nu există copii DVD (MEDIA_FORMAT = ‚D‘ ). c. Secţiunile următoare descriu funcţii care nu au fost prezentate dar foarte utile. Afişaţi toate filmele pentru care în inventar există mai multe copii în acelaşi format. 5. în sensul că returnează o singură valoare. 8. Afişaţi numarul de identificare şi titlul filmelor care nu au fost închiriate niciodată. 10. 2. 3. 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. 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ă. 7. aşa că sunt utile în diferite locuri din instrucţiunile SQL. 9. 6. b. şi anume: Funcţii SQL avansate. 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). d. Pe lângă funcţiile pentru caractere şi matematice. Rescrieţi interogarea anterioară pentru a folosi subinterogări în loc de uniuni. Rescrieţi interogarea anterioară folosind o uniune în local unei subinterogări pentru a găsi filmele în format VHS. Afişaţi numele de familie al fiecarui angajat. împreună cu numele de familie al şefu1ui lor.a. dar care nu au fost cumpărate (coloană DATA_VANZARII din tabelul FILM_COPY conţine valori nule). Afişaţi numărul de închirieri pentru fiecare format (DVD şi VHS). 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. 4. inclusiv în lista de coloane a comenzii SELECT şi în clauza . Folosind subinterogări pentru a filtra rândurile. Afişaţi titlul filmelor pentru care în inventar există o copie VHS (MEDIA_FORMAT = ‗V‘. sunt incluse câteva funcţii pentru date şi ore. Afişaţi numele angajatilor care au conturi de clienţi. e. 1. Folosiţi uniuni pentru a stabili ce clienţi sunt angajaţi şi ce angajaţi au conturi de clienţi.

dar poate fi orice expresie care are ca rezultat un şir de caractere. este numele unei coloane dintr-un tabel.7297 LTRIM Funcţia LTRIM elimină spatiile de la începutul unui şir de caractere. Funcţii pentru caractere Funcţiile pentru caractere operează asupra datelor de tip text. Această secţiune prezintă câteva funcţii frecvent folosite.WHERE. Sunt eliminate numai spaţiile de la începutul şirului. şir_cautat este un şir format dintr-un caracter sau mai multe. pe lângă cele discutate în lecţia 3. şir_de_intocuire este şirul de caractere cu care se înlocuieşte orice apariţie a şirului_cautat în şir_de_caractere. LTRIM (‗ String cu spaţii ‗) Returnează: ‗String cu spaţii ‘ RTRIM .8976 401. care trebuie căutate în sir_de_caractere. cele din mijlocul şi de la sfârşitul şirului sunt lăsate ca atare. '.617. furnizate de diferiţi producători SGBD. REPLACE(PERSOANA_TELEFON. şir_de_înlocuire}    şir_de_caractere reprezintă şirul de caractere în care se face căutare şi. 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. '-'. Sintaxa generală a funcţiei: REPLACE (şir_de_caractere. Vă reamintim că există un număr mare de funcţii specifice fiecărei implementări.') AS DISPLAY_TELEFON FROM PERSOANA. şir_căutat. în cele mai multe cazuri. REPLACE Funcţia REPLACE caută un şir de caractere şi înlocuieşte caracterele găsite cu caracterele din şirul de înlocuire. PERSOANA_TE LEFON 230—229—8976 401—617—7297 DISPLAY_TE LEFON 230.229.

Funcţia RTRIM este similar cu LTRIM. 0) AS 0) AS 0) AS . care ilustreaza faptul că valorile nule sunt transformate.00 (2 rows affected) MySQL: SELECT IFNULL(TAXA_INTARZIERE_SAU_PIERDERE. în timp ce valorile nenule sunt lăsate ca atare. TAXA_INTARZIERE_SAU_PIE RDERE 29. ca în urmatorul exemplu: RTRIM(LTRIM (‗ String cu spatii ‗) Returnează: ‗String cu spatii‘ NOTA: Oracle pune la dispoziţie o funcţie mai convenabilă. dar elimin spatiile de la sfârsitul unui sir de caractere. ISNULL în SQL Server şi IFNULL în MySQL. A fost selectată tranzacţia 9 deoarece conţine două filme. numită TRIM.98 2 rows selected. IFNULL) Oracle.98 . Funcţii pentru valori nule (NVL. ISNULL. care elimină atât spaţiile de la începutul şirului. cat şi pe cele de la sfarsit. Daca trebuie sa eliminati atât spatiile de la inceputul sirului. Din nefericire. TAXA_INTARZIERE_SAU_PIERDERE FROM FILM_INCHIRIAT WHERE TRANSACTIE_ID=9 . Microsoft SQL Server: SELECT ISNULL(TAXA_INTARZIERE_SAU_PIERDERE. TAXA_INTARZIERE_SAU_PIERDERE FROM FILM_INCHIRIAT WHERE TRANZACTIE_ID=9. puteti imbrica funcţiile LTRIM şi RTRIM. cât şi pe cele de la sfârşit. TAXA_INTARZIERE_SAU_PIE RDERE 0 29. 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). fiecare implementare foloseste propriul nume pentru aceast funcţie: NVL în Oracle. TAXA_INTARZIERE_SAU_PIERDERE FROM FILM_INCHIRIAT WHERE TRANSACTIE_ID=9. dintre care unul are o valoare nulă în coloana TAXA_INTARZIERE_SAU_PIERDERE (un exemplu bun. Exemplele următoare selectează din tabelul FILM_INCHIRIAT. . înlocuind valorile nule cu zero.) Oracle: SELECT NVL(TAXA_INTARZIERE_SAU_PIERDERE.

98 0. 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)+‘%‘. 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. FILM_ID .16 sec) Se observă diferenţa de formatare a rezultatelor pentru clientul MySQL în linia de comandă. de exemplu: Valoare ASCII 9 10 13 Tab Linie noua Retur de car Caracter (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). 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. 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.00 2 rows în set (0.TAXA_INTARZIERE_SAU_PIE RDERE 29.

(0 rows affected) Oracle: SELECT FILM_ID FROM FILM WHERE FILM_TITLU LIKE ‗%‗ || CHR(9) || ‗%‗ . SIGN(TAXA_PENALIZARE) AS TAXA_SIGN FROM FILM_INCHIRIERE WHERE TAXA_PENALIZARE IS NOT NULL. o valoare numerică dintr-o coloană a unui tabel sau orice expresie (inclusiv rezultatul unei alte funcţii) care produce o valoarea numerică. de obicei.98 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 . FILM_ID are valoarea 3 (Something's Gotta Give).99 4 4 29. SIGN Funcţia SIGN primeşte ca argument o expresie numerică şi returnează una dintre următoarele valori. 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)+‘%‘. care poate fi o valoare literală. Funcţii matematice Funcţiile matematice returnează rezultatul unei operaţii matematice şi. TAXA_PENALIZARE 29. în funcţie de semnul numărului de intrare: Valoare returnata -1 negativ 0 zero 1 pozitiv Null nulă Exemplu: SELECT TAXA_PENALIZARE. acceptă ca parametru de intrare o expresie numerică.

00 29. să aplicăm funcţia CEILING asupra valorilor din coloana TAXA_PENALIZARE : SELECT TAXA_PENALIZARE. Ca exemplu. Oracle foloseşte numele CEIL.98 TAXA _SQRT 5. adică rotunjeşte numărul prin adăugire până la următorul număr întreg.98 TAXA_C EILING 4 4 30 30 FLOOR Funcţia FLOOR este inversa logică a funcţiei CEILING — returnează cel mai mare întreg mai mic sau egal cu valoarea expresiei numerice furnizată ca .99 29.SQRT Funcţia SQRT primeşte ca argument o expresie numerică şi returnează rădăcina pătrată a acesteia. Sintaxa generală a funcţiei este: SQRT (expresie numerică) Vom extrage radacina patrată din valorile TAXA_PENALIZARE nenule pe care tocmai le-am vazut: SELECT TAXA_INTARZIERE_SAU_PIERDERE.99 4 4 29. TAXA_PENA LIZARE 29. TAXA_INTARZIERE_SAU_PIE RDERE 4.00 4. în timp ce DB2 şi MySQL permite folosirea ambelor nume (CEIL şi CEILING). SQRT (TAXA_PENALIZARE) AS TAXA_SQRT FROM FILM_INCH WHERE TAXA_INTARZIERE_SAU_PIERDERE IS NOT NULL.4763 1263 2 2 5.47539953 CEILING (CEIL) Funcţia CEILING returnează cel mai mic întreg mai mare sau egal cu valoarea expresiei numerice furnizată ca parametru de intrare. Există câteva probleme interesante de compatibilitate legate de denumire între implementarile SQL: Microsoft SQL Server foloseşte numele CEILING. CEILING (PENALIZARE) AS TAXA_CEILING FROM FILM_INCHIRIERE WHERE TAXA_PENALIZARE IS NOT NULL.

99 29.00 4. TAXA_PENALIZARE 4. în care se aplică funcţia FLOOR asupra valorilor din coloana TAXA_PENALIZARE: SELECT TAXA_PENALIZARE. adică rotunjeşte numărul prin scădere până la următorul număr întreg(parte întreagă). luna. în toată această secţiune. FLOOR(TAXA_INTARZIERE_SAU_PIERDERE) AS TAXA_FLOOR FROM FILM_INCH WHERE TAXA_INTARZIERE_SAU_PIERDERE IS NOT NULL.minutul. Exemplu. Termenii scrişi cu caractere italice sunt definiţi în notele care urmează după fiecare tabel. Din cauza acestei diversităţi.98 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. ziua. TAXA_FLOOR 4 4 29 29 . cum ar fi anul. motivul este faptul ca producătorii au dezvoltat propriile tipuri de date temporale înainte de stabilirea standardelor. ora. funcţiile pentru dată şi oră sunt prezentate pe scurt pentru Microsoft SQL Server şî Oracle.parametru de intrare. Funcţii pentru dată şi oră în Microsoft SQL Server NOTA: Valoarea parte_de_dată este un parametru care specifică o parte a datei. secunda şi milisecunda.00 29. într-un format acceptabil pentru sistemul SGBD –ul respectiv. termenul data_si__ora înseamnă un şir de caractere care conţine informaţii despre dată şi oră.

data_si_ora parte _de_data. şirul de formatare 'MM/DD/YYYY HH:MI' are ca rezultat o dată. data_si_ora DATEPART DAY GETDATE parte_de_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. De exemplu. 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.Funcţie DATEADD DATEDIFF DATENAME Scop Returnează o nouă valoare data_si_ora. • Funcţia TO_CHAR poate fi folosită şi pentru transformarea valorilor numerice în şiruri de caractere. reprezentand ziua conţinuta în valoarea data_si _ora furnizata ca intrare. 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. dată de sfârşit porte _de_dată. respectiv YEAR. având ca efect ştergerea cifrelor din dreapta punctului zecimal. ca şir de caractere. 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. DAY. 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. HOUR. data_si_ora data_si_ora Nu are Nu are GETUTCDATE MONTH Returnează o valoare intreaga. • Funcţia TRUNC poate fi folosita şi pentru trunchierea valorilor numerice. interval. iar şirul de formatare 'DD-MON-RR' (formatul Oracle prestabilit) are ca rezultat o dată de forma '01-Dec-04‘. Retineţi că Oracle numeşte acest tip de date DATE şi toate datele au o componentă pentru orã. MONTH. reprezentând partea _de_dată selectată pentru valoarea data_si_ora furnizată ca intrare Returnează o valoare intreaga. reprezentand partea_de_data selectata pentru valoarea data_si_ora furnizata ca intrare Returnează o valoare intreaga. Există peste 40 de simboluri diferite care pot fi folosite în şirurile de formatare (puteţi găsi lista completă în documentaţia Oracle). data de început. MINUTE şi SECOND. care are valoarea zero (reprezentând miezul noptii) atunci când nu este folosită. de forma '12/01/2004 11:58‘. .

Microsoft Access foloseşte termenul query (interogare) în loc de vizualizare. sir_pentru_formatare TO_DATE Data. data Returnează data furnizata. De fapt. actualizare şi ştergere) dar interogările funcţionează pentru vizualizări la fel ca şi pentru tabele. după ce sunt create. 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. cuvant cheie pentru data_si_ora Folosirea avantajelor oferite de vizualizari Amintim că o vizualizare (view) este o interogare stocată în baza de date. în formatul specificat de sirul_pentru_formatare Transforma sirul de caractere furnizat ca intrare intr-o data formatata intern de Oracle. care pune la dispoziţia utilizatorului bazei de date un subset particularizat de date din unul sau mai multe tabele ale bazei de date. Frumuseţea vizualizărilor constă în faptul că. funcţia returnează un sir de caractere. Data. Daca acest parametru este omis. Pot exista unele restricţii la manipularea datelor (la inserare. sir_pentru_formatare TRUNC Data. data este trunchiata la ziua curenta. nu este nevoie ca utilizatorul să ştie dacă foloseşte o vizualizare sau un tabel real. MONTHS_BETWEEN Prima data. 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. pot fi interogate ca şi cum ar fi tabele reale. 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. precum uniunile Cresc performanţele interogărilor . 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.Funcţie ADD_MONTHS Scop Parametri de intrare 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.

SUPERVISOR_PERSOANA_ID = C. cum ar fi numele sau numele şefului lor (dacă există).PERSOANA_ID AS ID. că sintaxa generală pentru crearea unei vizualizări este : CREATE [OR REPLACE] VIEW nume_vizualizare AS interogare_sql. fără pericolul de a dezvălui în mod accidental informaţii confidenţiale. Interogarea din vizualizare trebuie să realizeze o uniune (join) cu tabelul PERSOANA pentru a afla numele angajatului şi (folosind o uniune externă) numele şefului acestuia. C. C. B.PERSOANA_INITIALA AS INITIALA . B. O interogare simplă făcută în vizualizarea pe care tocmai am creat-o: SELECT NUME. puteţi să o interogaţi ca şi cum ar fi un tabel. Vă amintiţi din Lecţia 2.PERSOANA_PRENUME AS MANAGER_PRENUME.FILM_ID.PERSOANA_NUME_FAMILIE AS NUME.PERSOANA_NUME_FAMILIE AS MANAGER_NUME FROM ANGAJAT A JOIN PERSOANA B ON A.MPAA_RATING_COD AS RATING.PERSOANA_PRENUME AS PRENUME. Instrucţiunea SQL folosită pentru crearea vizualizării: CREATE VIEW ANGAJAT_LISTA AS SELECT A. NUME MANAGER_NU ME Alexandr u Popescu Alexandru Ionescu Alexandru • Pentru crearea unui catalog cu filmele disponibile. C. MANAGER_NUME FROM ANGAJAT_LISTA ORDER BY NUME. aveţi nevoie de o vizualizare care să poată fi folosită în siguranţă de un dezvoltator. B.FILM_GEN_DESCRIERE AS GEN. 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. După crearea vizualizării. .PERSOANA_ID View created. în asemenea situaţii.MPAA_RATING_DESCRIERE AS RATING_DESC. C.PERSOANA_ID LEFT OUTER JOIN PERSOANA C ON A. B. Totuşi. Instrucţiunea SQL folosită pentru crearea vizualizării: CREATE VIEW FILM_LISTA AS SELECT A. aveţi nevoie de o listă cu descrierile categoriilor MPAA şi cu descrierile genurilor.PERSOANA_ID = B. există un număr de aplicaţii care necesită furnizarea unor informaţii despre angajaţi.Exemplele din această secţiune prezintă vizualizări care vă oferă avantajele menţionate mai sus.

A. RATING. 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'. În loc să se repete uniunea din vizualizarea FILM_LISTA dacă MPAA ar modifica sistemul de clasificare. 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 Strain Romantic Romantic 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 R PG-13 PG-13 FILM_TITLU Master and Commander: The Far Pirates of the Caribbean: The The Day After Tomorrow The Italian Job Kill Bill: Vol.RETAIL_PRET_DVD. Dorim ca numai filmele din categoriile MPAA G. 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 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. PG şi PG-13 să fie disponibile în acest chioşc.FILM_TITLU. 'PG-13') . FILM_TITLU.RETAIL_PRET_VHS.ANUL_PRODUCERII FROM FILM A JOIN FILM_GEN B ON A. astfel încât tinerii să poată căuta filmele online.A.MPAA_RATING_COD Exemplu de interogare simplă care foloseşte vizualizarea în locul tabelelor de bază: SELECT GEN. A. 'PG'. RATING.MPAA_RATING_COD = C.FILM_GEN_COD JOIN MPAA_RATING C ON A.FILM_GEN_COD = B. FILM_TITLU FROM FILM_LISTA ORDER BY GEN.

folosind aceeaşi interogare ca şi pentru vizualizarea FILM_LISTA: SELECT GEN. o coloană din rezultatele interogării poate fi formatată în funcţie de valorile conţinute pe o altă coloana. dacă rezultatul are valoarea TRUE logic. este returnată valoarea expresie_rezultat asociată condiţiei ELSE. care nu pot fi ignorate. la standardul SQL. Pentru prima dată. este returnată valoarea expresie_rezultata şi nici o altă condiţie WHEN nu mai este evaluată. ] ELSE expresie_rezultat END notă: Fiecare condiţie WHEN este evaluată sub forma expresie_de_intrare = expresie_comparare şi. . 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. părţi ale instrucţiunilor SQL pot fi executate condiţional.Rezultatele obţinute. RATING. 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ă.. dar foarte importantă. De exemplu. Dacă nici una dintre condiţiile WHEN nu este evaluată ca adevărată şi exista o condiţie ELSE. FILM _TITLU. FILM_TITLU FROM COPII_FILM_LISTA ORDER BY GEN. Vizualizările sunt instrumente puternice. RATING. Expresia CASE Expresia CASE este o adăugire recentă.

De exemplu. care poate fi afişat la terminalul de vânzare. 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. .Dacă nici una dintre condiţiile WHEN nu este evaluată ca adevărată şi nu există o condiţie ELSE. Remarcaţi plasarea cuvântului cheie AS imediat după cuvântul cheie END. incluzând şi operatorul de comparare. MPAA_RATING_COD AS RATING. Sintaxa generală a expresiei: CASE WHEN condiţie THEN expresie_rezultat [WHEN condiţie THEN expresie_rezultat. ] ELSE expresie_rezultat END notă: Fiecare condiţie poate fi orice expresie SQL care este evaluată ca adevărata sau falsă. deoarece fiecare condiţie este complet specificată. . pentru a asocia un nume coloanei generate în setul de rezultate. 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 Expresia CASE cu căutare Expresie CASE cu căutare (searched CASE) permite folosirea unor condiţii de comparare mai flexibile. . Iată exemplul: SELECT FILM_ID. se poate folosi expresia CASE pentru a transforma valoarea MPAA_RATING_COD într-un mesaj simplu. este returnată o valoare nula. pentru a aminti personalului magazinului să verifice vârsta clienţilor în cazul filmelor cu o categorie MPAA mai mare de PG-13.

95 50.97 15. Pot fi folosite în clauza WHERE a unei instrucţiuni SQL d. Returnează un set de valori b. este returnată o valoare nulă. Funcţiile SQL a. RETAIL_PRET_VHS. FIL M_ID 1 2 3 4 5 6 7 8 9 10 VHS 58. 1. este returnată valoarea expresie_rezultat asociată condiţiei ELSE.98 49.99 12. Funcţia REPLACE . Dacă nici una dintre condiţiile WHEN nu este evaluata ca adevărată şi nu exişti o condiţie ELSE.99 RETAIL_PRET_ IE Scump Convenabil Convenabil Convenabil Mediu Mediu Convenabil Scump Convenabil Scump PRET_CATEGOR Întrebări şi Probleme Alegeţi răspunsurile corecte pentru fiecare din următoarele întrebări cu răspunsuri multiple. considerăm o interogare care clasifică filmele în format VHS.99 14. SQL e.Condiţiile WHEN sunt evaluate secvenţial şi. CASE WHEN RETAIL_PRET__VHS IS NULL THEN ‚Not Available‘ . dacă una este evaluată ca adevărata. este returnata valoarea expresie_rezultat asociată şi nici o altă condiţie WHEN nu mai este evaluata.95 11. De exemplu. Reţineţi că întrebările pot avea mai multe răspunsuri corecte.99 24. în funcţie de pret: SELECT FILM_ID. Returnează o singură valoare c.95 24. Pot fi folosite ca pseudonime pentru numele tabelelor intr-o instr. Pot fi folosite în lista de coloane a unei instrucţiuni SQL 2. Dacă nici una dintre condiţiile WHEN nu este evaluată ca adevărată şi există o condiţie ELSE. 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.95 14.

Permit executarea condiţională a clauzelor dintr-o instrucţiune SQL b. Returnează întotdeauna un număr întreg d. Returnează valoarea corespunzătoare unui caracter din setul de caractere ASCII d. Înlocuieşte un nume de tabel cu un nume de vizualizare Înlocuieşte numele unei coloane cu pseudonimul coloanei Înlocuieşte un şir de caractere dintr-o coloană cu un alt şir de caractere Înlocuieşte toate valorile dintr-o coloană cu un alt set de valori Înlocuieşte toate rândurile dintr-o vizualizare cu rânduri conţinând date dintr-un alt tabel Funcţia LTRIM a. Returnează un număr întreg sau o valoare nulă e. b. Este numită CHR în unele implementări SQL b. 8. Exista sub două forme. Poate fi imbricată cu alte funcţii d. Returnează 0 dacă parametrul furnizat are valoarea NULL e. Returnează +1 dacă parametrul furnizat are o valoare pozitivă d.3. Elimină spaţiile de la începutul şi de la sfârşitul şirurilor de caractere Funcţia CHAR a. Expresiile CASE a. Elimină spaţiile de la începutul şirurilor de caractere c. Există sub două forme. Rotunjeşte un număr prin adăugire până la primul număr întreg b. Returnează 0 dacă parametrul furnizat are valoarea zero c. înlocuieşte valorile nule cu alte valori în şirurile de caractere e. 6. Este identică cu funcţia ASCII în unele implementări SQL c. respectiv statice şi dinamice c. Returnează -l daca parametrul furnizat are valoare negativa b. respectiv standard şi cu cautare Scrieţi instrucţiunile SQL pentru următoarele probleme: 1. respectiv simple şi cu cautare e. Există sub două forme. Rotunjeşte un număr prin scădere până la primul număr întreg c. Rotunjeşte un număr prin scădere până la primul număr întreg c. Rotunjeşte un număr prin adăugire până la primul număr întreg b. Există sub două forme. e. Elimină spaţiile de la sfârşitul şirurilor de caractere b. d. . c. 7. 5. Returnează un număr întreg sau o valoare nulă e. Afişaţi valorile MPAA_RATING_COD din tabelul MPAA_RATING. Returnează caracterul corespunzător unei valori e. Este numită FLR în unele implementări SQL a. Transformă o valoare numerică într-un şir de caractere Funcţia SIGN a. Returnează o valoare nulă dacă parametrul furnizat nu este un număr Funcţia CEILING a. 4. Returnează întotdeauna un număr întreg d. respectiv cu căutare şi fara cautare d. Este numită CEIL în unele implementări SQL Funcţia FLOOR a. cu liniuţele de despărţire înlocuite cu spaţii.

Folosind funcţia CHAR (numită CHR în Oracle). Limbajul de manipulare a datelor – DML În această lecţie se prezintă instrucţiunile DML (Data Manipulation Language). 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). Lecţia 5. Sugestie: Cel mai bine funcţionează în acest caz o expresie CASE simplă. în acest caz v-ar fi de folos o expresie CASE cu cautare. afişaţi toate restricţiile de tip cheie externă. în funcţie de valoarea coloanei ANUL_PRODUCERII sau necunoscut). 7. Aflaţi preţul mediu al filmelor în format DVD (coloana RETAIL_PRET _DVD din tabelul FILM). Folosiţi tabelul de sistem SYSOBJECTS. Sterge rânduri dintr-un tabel al bazei de date Instrucţiunile DML individuale afectează datele dintr-un singur tabel. 4. 6. Limbajul DML este format din trei comenzi SQL: INSERT UPDATE DELETE Adaugă noi rânduri într-un table al bazei de date.2. în care NAME este numele restricţiei. 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 valorile FILM_ID şi FILM_TITLU pentru toate filmele care conţin apostrofuri (caracterul ASCII 39) în titlu. generaţi comenzile SQL pentru eliminarea tuturor restricţiilor referenţiale aflate în proprietatea utilizatorului curent. 3. Numele tabelului pe care se bazează restricţia se află în coloana TABLE_NAME a vizualizării. o parte a limbajului SQL folosită pentru intreţinerea datelor stocate în tabele relaţionale ale bazei de date. iar coloana XTYPE are valoarea 'F' pentru restricţiile de tip cheie externă. 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. Scrieţi o instrucţiune SQL care afişează fiecare film (FILM_ID) şi o valoare pentru deceniu. Actualizeaza rândurile existente Într-un table al bazei de date. Minor (valoare < 10) sau Major (valoare > 10) . cu media calculată rotunjită prin adăugire la cea mai apropiată sumă fără zecimale. Pentru o bază de date Microsoft SQL Server. 10. iar restricţiile referenţiale au valoarea 'R' în coloana CONSTRAINT_TYPE. Aflaţi valoarea ASCII a semnului de exclamare (!). Pentru o bază de date Oracle. Vizualizarea Oracle de tip catalog se numeşte USER_CONSTRAINTS. cu media calculată rotunjită prin scădere la cea mai apropiată sumă fără zecimale. Aflaţi preţul mediu al filmelor în format VHS (coloana RETAIL_PRET_VHS din tabelul FILM). 8. 9. Este posibil ca într-o instrucţiune DML să referiţi şi o vizualizare care conţine date din mai . Nu uitaţi că trebuie să folosiţi comanda ALTER TABLE pentru eliminarea unei restricţii. 5.

Cand modificati valoarea unei chei primare (ceea ce se intampla rareori).multe tabele (adică o vizualizare care conţine o uniune de tabele). Î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. 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. asa că aceasta nu va afecta nici unul din rândurile tabelului. . sistemul DML va anula intreaga instrucţiune. 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‘. toate coloanele vizualizării referite în instrucţiunea DML trebuie să corespundă unor coloane dintr-un singur tabel fizic al bazei de date. în acest caz. Un alt aspect de care este important să se ţină seama. sistemul SGBD nu va permite niciodată apariţia inconsecvenţelor în baza de date. cheia primară a noului rând trebuie sa fie unică în întregul tabel. dacă apare o eroare la modificacfrea unui rând identificat de instrucţiunea DML. sunt restricţiile definite în tabelul referit de instrucţiunea DML. La formarea instructiunilor DML. Este foarte probabil ca sistemul SGBD folosit să pună la dispoziţie o formă oarecare de tranzacţii. Aceasta înseamna că. instrucţiunea DML poate referi numai coloane dintr-un singur tabel al vizualizării. noua valoare trebuie să fie unică în întregul tabel. în care o serie de instrucţiuni DML sunt tratate unitar. trebuie specificate valori pentru toate coloanele cu restricţii NOT NULL. Restricţii de unicitate Ca şi în cazul cheilor primare. Cu alte cuvinte. adică un grup de instructiuni care trebuie să reuşească toate sau sa eşueze toate. trebuie să se ţină seama de urmatoarele aspecte referitoare la restricţiile tabelului modificat: Restricţii de tip cheie primară Atunci când inseraţi un nou rând într-un tabel. SGBD va trata fiecare instrucţiune DML individuală ca pe o tranzactie. dar. În cazul instrucţiunilor INSERT. Această caracteristică este foarte utilă atunci când instructiunile SQL sunt folosite în tranzacţii comerciale. Dacă instrucţiunea DML referă o vizualizare . Instructiunile SQL din acestă lecţie presupune că sistemul SGBD pe care il utilizaţi foloseste formatul AAAA-LL-ZZ pentru datele calendaristice. un sir vid sau valoarea zero – este o valoare speciala care nu este egala cu nimic altceva. întreaga instrucţiune eşuează şi sistemul SGBD reface (unii ar spune „ca prin magie‖) cele două rânduri şterse. Cu alte cuvinte. Pentru bazele de date Oracle. 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. De exemplu . coloanele pe care a fost definită o restricţie de unicitate trebuie sa aibă valori unice în întregul tabel. 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 ). O valoare nula nu este acelasi lucru un un spatiu liber. 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ă.

probabil instrucţiunea INSERT va eşua la următoarea rulare. dar dacă este inclusă trebuie sa fie incadrată în paranteze. Iata sintaxa generală a instrucţiunii: INSERT INTO nume_tabel_sau_vizualizare [(lista_de_coloane)] VALUES (lista_de_valori). 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. Dacă o coloană este modificată sau în tabel este adăugată o nouă coloană. în ordinea în care sunt definite coloanele în tabel. în aceeaşi ordine. apoi randurile copii). Dacă lista de coloane este omisă. folosind o subinterogare. chiar şi opţională. Cu alte cuvinte. trebuie specificată o valoare pentru fiecare coloană din tabel. Orice coloana care lipseşte din listă va primi o valoare nulă. . deoarece opiterea acesteia face ca instrucţiunea INSERT să fie dependentă de definiţia tabelului. In sens invers. Se poate remarca următoarele: Lista de coloane este opţională. presupunund că valorile nule sunt acceptate în coloana respectivă. Instrucţiunea INSERT Instrucţiunea SQL INSERT este folosită pentru inserarea noilor rânduri de date în tabele. In general inserările în tabele trebuie făcute ierarhic (mai intai randurile parinte. decât dacă restricţia a fost definită cu opţiunea ON DELETE CASCADE. între lista de coloane şi lista de valori trbuie să existe o corespondenţa unu-la-unu. lista de valori trebuie să conţin o valoare pentru fiecare coloană din listă. Cuvântul cheie NULL poate fi folosit în lista de valori pentru specificarea unei valori nule pentru o coloană. Inserarea unui singur rand de dete folosind clauza Values Instrucţiunea INSERT care foloseşte o clauză VALUES poate crea un singur rând la fiecare rulare. deoarece valorile pentru rândul de date respective sunt specificate chiar în instrucţiune. Dacă lista de coloane este specificată. Este bine ca întotdeauna să includeţi lista de coloane.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. nu se poate şterge un rând părinte dacă există rânduri subordonate care referă valoarea din rândul părinte. iar ştergerile trebuie făcute în ordine inversă (copiii inaintea părinţilor). Restrictii de verificare (CHECK) O instructiune INSERT sau UPDATE nu poate stoca într-o coloana o valoare care încalcă o restricţie CHECK definită pentru coloana respectivă.

De asemenea . O altă soluţie. RETAIL_PRET_DVD. care poate fi folosită pentru a insera rânduri multiple într-un tabel . Inserări masive folosind instrucţiunea SELECT internă Aşa cum se observă.În Microsoft SQL Server şi Sybase Adaptive Server nu puteţi insera valori întro coloană care a fost definită proprietatea IDENTITY. ‘PG-13‘. ‘2004‘).AN_PRODUCERE) VALUES (‘Drama‘. ‘2004‘).95. cum ar fi coloana FILM_ID din tabelul FILM. este forma care foloseşte o instrucţiune SELECT internă. Sintaxa generală a instrucţiunii este INSERT INTO nume_tabel_sau_vizualizare [(lista_de_coloane)] SELECT instructiune_select. 1. PRET_INCHIRIAT_DVD.MPAA_COD_VARSTE.NULL. Pentru Microsoft SQL Server şi Sybase Adaptive Server.‘V‘). 29. dar dacă este inclusă trebuie să fie încadrată în paranteze. FILM_COD_GEN.FILM_NUME. cu o listă opţională de coloane.‘Ray‘. dacă este definită proprietatea IDENTITY pentru tabelul FILM. şi alta care creează un rând în tabelul FILM_COPII pentru acelaşi timp. una care creează un nou rând în tabelul FILM.‘PG-13‘. ‘Ray‘. 29.95. INSERT INTO FILM (FILM_ID. puteţi să omiteţi coloana respectivă din instrucţiunea INSERT. 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. AN_PRODUCERE) VALUES (21. INSERT INTO FILM_COPII VALUES (21. Dacă pentru o coloană a fost definită proprietatea IDENTITY. MPAA_RATING_COD. din care este omisă coloana RETAIL_PRET_VHS. Această formă este utilă şi pentru stabilirea următoarei valori disponibile pentru o cheie primară cu valori secvenţiale. Se remarcă următoarele: Lista de coloane este opţională.‘Drama‘. FILM_NUME. iar sistemul SGBD va atribui cheii primare următoarea valoare unică disponibilă. Proprietatea IDENTITY este o metodă frecven folosită pentru a atribui valori secvenţiale unei chei primare. folosind următoarea instrucţiune: SET identity_insert nume_tabel ON Exemplul următor conţine două instrucţiuni INSERT. se poate folosi următoarea variantă a primei instrucţiuni INSERT: INSERT INTO FILM (FILM_COD_GEN. . O altă soluţie este să dezactivaţi restricţia. 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. ‘2005-04-01‘. dar fără lista opţională de coloane.

instrucţiune SELECT internă să furnizeze o valoare pentru fiecare coloană din lista de valori. probabil instrucţiunea INSERT va eşua la următoarea rulare. cu un operator de egalitate între fiecare nume şi valoare. Instrucţiunea UPDATE Instrucţiunea UPDATE este folosită pentru actualizarea datelor din coloanele unui tabel (sau ale unei vizualizări).Dacă lista de coloane este omisă. Tabelul FILM_LIMBA conţine rânduri pentru limba franceză pentru o parte din filme. Se remarcă următoarele: Clauza SET conţine o listă cu una sau mai multe coloane. între lista de coloane şi setul de rezultate al instrucţiunii SELECT trebuie să existe o corespondenţa unu-la-unu. Dacă această clauză este omisă. în ordinea în care sunt definite coloanele în tabel. Ca exemplu. presupunund că valorile nule sunt acceptate în coloana respectivă. aşa că acum vrem să le adăugăm numai pe cele care lipsesc. în aceeaşi ordine.. ‘fr‘ FROM FILM FILM WHERE FILM_ID NOT IN ( SELECT FILM_ID FROM FILM_LIMBA WHERE COD_LIMBA =‘fr‘ ). Aceasta este o listă de perechi nume-valoare. Clauza WHERE conţine o expresie care limitează rândurile actualizate. să presupunem că toate filmele sunt acum disponibile şi în limba franceză.] [ WHERE conditie]. Dacă o coloană este modificată sau în tabel este adăugată o nouă coloană.. Orice coloană care lipseşte din listă va primi o valoare nulă. Dacă lista de coloane este specificată. instrucţiune SELECT internă trebuie să furnizeze o valoare pentru fiecare coloană din tabel. Sintaxa generală a instrucţiunii UPDATE: UPDATE nume_tabel_sau_vizualizare SET nume_coloana = expresie [. . Cuvântul cheie NULL poate fi folosit în instrucţiunea SELECT pentru specificarea unei valori nule pentru o coloană. Cu alte cuvinte. Este bine ca întotdeauna să includeţi lista de coloane.nume_coloana = expresie. motorul SQL va încerca să actualizeze toate rândurile din tabel sau din vizualizare. care poate fi apoi atribuită coloanei respective. un alt nume de coloană sau orice altă expresie pe care SQL o poate transforma într-o singură valoare. COD_LIMBA) SELECT FILM_ID. Instrucţiunea INSERT care va rezolva această problemă este: INSERT INTO FILM_LIMBA (FILM_ID. chiar şi opţională. deoarece opiterea acesteia face ca instrucţiunea INSERT să fie dependentă de definiţia tabelului. Expresia poate fi o constantă. separate prin virgule. împreună cu o expresie care specifică noua valoare pentru fiecare coloană.

Nu se pot şterge rânduri dacă se încalcă o restricţie referenţială. rotujind rezultatul la 2 zecimale cu funcţia ROUND. Exemple: Să se şteargă filmul adăugat mai devreme (cu FILM_ID = 21 ). Instrucţiunea următoare va actualiya două coloane din acelaşI rând a tabelului MOVIE.Exemple: Un film a fost adăugat cu un preţ incorect. clauza WHERE specifică rândurile care urmează să fie şterse. UPDATE ANGAJAT SET ANGAJAT_PLATA_ORA = ROUND (ANGAJAT_PLATA_ORA * 1. inclusiv toate valorile datelor (toate coloanele) din rândurile afectate.95 . Totuşi. În general. În instrucţiunile DELETE nu sunt referite niciodată coloane. Se observă că trebuie să se ştergă mai întâi rândurile corespondente din tabelele FILM_COPY şi FILM_LIMBA. rândurile subordonate trebuie şterse înaintea rândurilor părinte. Orice rând pentru care condiţia WHERE este evaluată ca adevărată este şters din tabel. UPDATE FILM SET RETAIL_PRET_VHS = 29. Instrucţiunea DELETE Instrucţiunea DELETE şterge unul sau mai multe rânduri dintr-un tabel. este folosită aproape întotdeauna. Dacă vreţi să ştergeţi o singură valoare din rândurile existente. 2) WHERE ANGAJAT_JOB_CATEGORY =‘C‘ . doarece instrucţiunea şterge rânduri întregi de date. deoarece o instrucţiune DELETE fără o clauză WHERE încearcă să şteargă toate rândurile din tabel. RETAIL_PRET_DVD = 34. 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). Sintaxa generală a instrucţiunii DELETE este DELETE FROM nume_tabel_sau_vizualizare [ WHERE conditie ].1.95 WHERE FILM_ID = 21 Conducerea firmei de produse video a decis să crească salariul tuturor funcţionarilor cu 10 procente. Atunci când este inclusă. deoarece acestea sunt rânduri „copii‖ ale rândului din tabelul „FILM‖ . folosiţi instrucţiunea UPDATE pentru a înlocui valorile respective cu valori nule (presupunând că valorile nule sunt permise în acele coloane). Se remarcă următoarele: Clauza WHERE este opţională. Instrucţiunea poate să folosească şi o vzualizare. Această instrucţiune va actualiza o singură coloană de pe mai multe rânduri.

caz în care valoarea codului de limbă trebuie specificată cu litere mici pentru a se potrivi cu datele din tabel. DELETE FROM FILM WHERE FILM_ID = 21. Restricţii NOT NULL d. La formarea unei instrucţiuni DML. DROP 2. DELETE FROM FILM_LIMBA WHERE COD_LIMBA =‘es‘. SELECT e. Coloane ale unei vizualizări bazate pe mai multe tabele 3. Trebuie să aibă o listă de valori c. Întrebări şi probleme 1. Poate insera rânduri multiple la o singură rulare d. Găsirea următoarei valori pentru o cheie primară atribuită secvenţial b. Poate folosi cuvântul cheie NULL pentru a atribui valori nule coloanelor e. Coloane din mai multe tabele b. DELETE FROM FILM_LIMBA WHERE FILM_ID = 21. UPDATE d.DELETE FROM FILM_COPY WHERE FILM_ID = 21. Să se şteargă din tabelul FILM_LIMBA toate rândurile pentru limba spaniolă (COD_LIMBA='es' ). Poate include o clauză WHERE 5. Mutarea rândurilor dintr-un tabel în altul . Restricţii de securitate c. O instrucţiune DML poate referi a. Coloane dintr-un singur tabel c. trebuie să tineti seama de următoarele restricţii a. Restricţii referenţiale b. Restricţii cheie primară 4. REMOVE c. Coloane ale unei vizualizări bazate pe un singur tabel e. Limbajul DML include următoarele comenzi SQL: a. Trebuie să aibă o listă de coloane b. Restricţii de unicitate e. În multe implementări SQL se face diferenţierea literelor mari de cele mici. O instrucţiune INSERT cu o clauză VALUES a. O instrucţiune INSERT cu o comandă SELECT imbricată este utilă pentru a. O vizualizare care conţine coloane dintr-un singur tabel d. INSERT b.

Trebuie să furnizeze o nouă valoare pentru cel puţin o coloană c. O instrucţiune INSERT cu o comandă SELECT imbricată a. O constantă b. Trebuie să includă o clauză SET b. Popularea unui tabel de test cu date dintr-un alt tabel d. Clauza SET dintr-o instrucţiune UPDATE poate atribui unei coloane o valoare care este a. Are ca rezultat un produs cartezian 8. Trebuie să aibă o instrucţiune SELECT internă care retumează un singur rând de date c. Eşuează si returnează o eroare c. Nu poate încălca restricţiile referenţiale ale tabelului e. Actualizează toate rândurile din tabel cu valori nule b. Actualizează toate rândurile din tabel cu valori nule b. încearcă să şteargă toate rândurile din tabel d. Inserarea mai multor rânduri într-un tabel cu o singură instrucţiune 6. Are ca rezultat un produs cartezian e.c. Eliminarea rândurilor duplicate dintr-un tabel e. Şterge toate rândurile din tabel e. Poate folosi cuvântul cheie FORCE pentru a forţa ştergerea rândurilor d. Numele unei alte coloane 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. Poate include o clauză WHERE opţională c. Trebuie să includă o clauză WHERE d. Poate atribui unei coloane o listă de valori derivate dintr-o expresie 10. Poate include o listă opţională de coloane b. Orice expresie din care rezultă o singură valoare e. O instrucţiune UPDATE a. O listă de valori d. una în clauza INSERT şi una în b. O instrucţiune DELETE a. încearcă să actualizeze toate rândurile din tabel c. O instrucţiune UPDATE fără o clauză WHERE a. Poate folosi cuvântul cheie NULL pentru a atribui valori nule coloanelor d. O instrucţiune DELETE fără o clauză WHERE a. Poate avea o instrucţiune SELECT internă. Poate atribui unei coloane valoarea unei alte coloane e. ca parte a clauzei WHERE 11. Trebuie să aibă două liste de coloane. Eşuează şi returnează o eroare d. Trebuie să includă o listă de coloane 9. Cuvântul cheie NULL . Poate include o clauză WHERE e.

NUMBER_OF_INCHIRIERES INTEGER NOT NULL. O clauză UNION Scrieţi instrucţiuni SQL pentru următoarele probleme 13. 19. O clauză WHERE b.12. numit TOTAL_INCHIRIERE. tabelul FILM_LIMBA nu conţine nici un rând pentru limba japoneză. 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. 20. asociat cu toate filmele din tabelul FILM. 17. 2) NOT NULL).) 16. . 18. Creaţi un tabel. inseraţi în tabelul FILM_GENRE un nou rând. TOTAL_COST_INCHIRIERES NUMERIC (7. inseraţi în tabelul FILM_LIMBA un rând pentru limba japoneză (COD_LIMBA = 'ja'). create la întrebarea 15. 14. O uniune a mai multor tabele e. CREATE TABLE TOTAL_INCHIRIERE (FILM_ID INTEGER NOT NULL. cu valorile FILM_COD_GEN = TRAIN' şi FILM_DESCRIERE_GEN = Training'. cu următoarele valori pentru date: FILM_ID: FILM_COD_GEN: MPAA_COD_RATING: FILM_NUME: 99 'TRAIN' NR ANGAJAT Training Video 15. Ştergeţi toate rândurile din tabelul INCHIRIERE TOTAL. NUMAR_COPIE = 1) a fost vândută pe data de 15 ianuarie 2005. folosind instrucţiunea CREATE de mai jos. Folosind o instrucţiune INSERT cu o instrucţiune SELECT internă. Instrucţiunea SELECT internă a unei instrucţiuni INSERT poate include a. inseraţi în tabelul FILM un nou rând. Copia 1 a filmului 1 (FILM_ID = 1. O clauză GROUP BY c. Folosind o instrucţiune INSERT cu o clauză VALUES. inseraţi în tabelul TOTAL_INCHIRIEREun rând pentru fiecare film din tabelul FILM INCHIRIERE. conţinând numărul total de închirieri şi suma totală obţinută din închirierea filmului respectiv. Folosind o instrucţiune INSERT cu o instrucţiune SELECT internă. (în prezent. Ştergeţi rândurile pentru limba japoneză. Una sau mai multe funcţii de agregare d. Folosind o instrucţiune INSERT cu o clauză VALUES si o listă de coloane. actualizaţi rândul respectiv din tabelul FILM_COPII. dar fără listă de coloane.

C. 2006 Roger Jennings. 1998 Chris Fehily. Modelarea bazelor de date.. Editura Teora. 2001 Mariana Popa. Editura Popescu Ileana. 2. 2004 . Utilizare Access. ALL. Editura B. Proiectarea bazelor de date. 4. Letiţia Vercescu.Învăţaţi SQL rapid şi uşor!. 3. Editura Tehnică. Baze de date Editura FRM. Ileana Popescu. BIBLIOGRAFIE 1. SQL. 5.I.

Sign up to vote on this title
UsefulNot useful