You are on page 1of 53

.

CAPITOLUL II. SQL (9 sapt.)


CURS 9. Limbajul SQL
Noiuni introductive
Limbajul SQL (Structured Query Language) este limbajul utilizat de
majoritatea sistemelor de baze de date relaionale (SGBDR) pentru definirea i
manipularea datelor.
Din punct de vedere istoric ar trebui menionat faptul c limbajul SQL a
fost dezvoltat ntr-un prototip de sistem de gestiune a bazelor de date relaionale
la IBM, n 1970. n 1979 corporaia Oracle a introdus prima implementare a
limbajului SQL n varianta comercial. n 1987 Institutul Naional de Standarde
(ANSI) a elaborat standardul limbajului SQL. Ulterior au avut loc mai multe
revizii ale acestui standard.
Majoritatea limbajelor posed un set de instruciuni comun unanim
acceptat de toate marile companii productoare de soft, precum MICROSOFT
sau ORACLE.
Termenii utilizai de limbajul SQL sunt
- tabel (Table) utilizat pentru a desemna o relaie;
- linie (row) utilizat pentru a desemna un tuplu;
- coloan (column) utilizat pentru a desemna un atribut.
Componentele pe care le cuprinde limbajul SQL sunt urmtoarele:
1.
componenta de descriere a datelor relaionale (limbajul de descriere a
datelor - LDD),
2.
componenta de manipulare a datelor relaionale (limbajul de manipulare a
datelor - LMD),
ambele fiind absolut necesare n gestiunea BD.
Pe lng aceste componente principale, standardul SQL2 mai prevede i
alte componente ale limbajului:
3.
controlul tranzaciilor;
4.
controlul securitii i refacerea datelor.
Controlul tranzaciilor conine comenzi pentru specificarea tranzaciilor.
Unele implementri adaug comenzilor prevzute n standard i alte comenzi
suplimentare de control al concurenei i refacerea datelor.
Controlul securitii i refacerea datelor conine comenzi de administrare
a bazei de date pentru definirea utilizatorilor i a drepturilor acestora de acces la
tabele. Aceast component este dependent de SGBD, iar pentru sisteme
performante, administratorul BD este obiectul activitii unei categorii speciale de
utilizatori ai BD administratori ai BD.

Structura lexical a limbajului SQL


-

Elementele unei instruciuni (statement) sunt:


cuvintele cheie (key words), dintre care fac parte comenzile (SELECT,
UPDATE, INSERT etc), operatorii (AND, OR, NOT, LIKE), clauzele
(WHERE, SET, VALUES etc);
identificatorii (identifier) sunt elementele care denumesc tabela, coloana
sau alt obiect BD; SQL face diferena ntre literele mari i mici, deci este
case-sensitive; identificatorul care conine ghilimele se numete
identificator delimitat;
constantele (literal) reprezint iruri de caractere ( ), numere ntregi,
numere reale (ex. 3.5; 4. ; .001; 5e2), constanta NULL care simbolizeaz
lipsa de informare, constante de tip logic (1 pentru TRUE i 0 pentru
FALSE);
caracterele speciale, cum ar fi ; care semnific terminarea comenzilor, .
care semnific virgula zecimal, sau * care simbolizeaz operatorul de
nmulire.

Operatori SQL
SQL are urmtorii operatori:

operatori aritmetici binari:


+
*
% modulo
^ ridicarea la putere
& AND orientat pe bii
| OR orientat pe bii
# XOR orientat pe bii
<< deplasare la stnga
>> deplasare la dreapta

operatori binari de comparaie


<
>
<=
>=
=
<> sau != diferit

operatori aritmetici mari

@ valoarea absolut
! factorial
!! factorial, operator postfix
~ NOT orientat pe bii

operatori de comparaie
A BETWEEN min AND max (compar A cu dou valori: min i max)
A IN (v1,...,vn) compar A cu o list de valori
A IS NULL
A IS NOT NULL
A LIKE model_ir

operatori logici

Operatorii logici sunt legai prin cuvintele cheie AND, OR, NOT i
returneaz o valoare logic TRUE, FALSE sau NULL.

operatori relaionali
UNION (reuniune)
INTERSECT (intersecie)
MINUS (diferena).
Funcii definite n SQL

Funcii agregat
Funciile agregat calculeaz un rezultat din mai multe linii ale unui
tabel (funcii de totalizare):
COUNT (furnizeaz numrul de linii ale unui rezultat);
SUM (execut suma tuturor valorilor dintr-o coloan);
MAX (returneaz valoarea cea mai mare dintr-o coloan);
MIN (returneaz valoarea cea mai mic dintr-o coloan);
AVG (calculeaz media valorilor dintr-o coloan).
Aceste funcii vor fi folosite n instruciunea SELECT.

Funcii scalare

Funciile scalare primesc unul sau mai multe argumente i returneaz


valoarea calculat sau NULL n caz de eroare. Argumentele funciilor pot fi
constante sau valori ale atributelor specificate prin numele coloanelor
corespunztoare. Dintre funciile scalare amintim:

funcii numerice
- de calcul trigonometric: sin, cos, tg, ctg etc.
- de calcul al logaritmului: ln, log, lg
4

de calcul al puterilor: pow


de rotunjire: floor, ceil etc.
funcii pentru manipularea irurilor de caractere
funcii pentru data calendaristic
funcii de conversie

Tipuri de date
n limbajul SQL sunt definite mai multe tipuri de date: numeric, ir de
caractere, ir de bii, data (calendaristic), timp.
Denumirile tipurilor de date precum i limitele acestora difer de la un
SGBD la altul, dar n general, sunt destul de asemntoare.
Tipul numeric include

numere ntregi: INTEGER sau INT reprezentat pe 4 octei;


SMALLINT reprezentat pe 2 octei;
numere reale reprezentate n virgul flotant, cu diferite precizii:
FLOAT reprezentat pe 4 octei;
REAL reprezentat pe 8 octei;
DOUBLE [PRECISION] reprezentat pe 8 octei;
numere zecimale reprezentate cu precizia dorit:
tipul NUMERIC sau DECIMAL, cu forma numeric[(p,s)],
unde p este numrul total de cifre afiate, iar s este
numrul de cifre dup punctul zecimal.
Tipul ir de caractere

CHARACTER (n) sau CHAR (n) definesc iruri de caractere cu lungimea fix.
CHARACTER VARYING sau VARCHAR (n) definete irul de caractere cu
lungimea variabil.
Asemnarea dintre cele dou tipuri prezentate mai sus este aceea c
ambele reprezint iruri de maxim n caractere, iar deosebirea este aceea c
pentru iruri cu numr de caractere mai mic ca n, CHAR (n) completeaz irul cu
spaii albe pn la n caractere, iar VARCHAR (n) memoreaz numai attea
caractere cte are irul dat.

Tipul iruri de bii

BIT (n) definete secvene de cifre binare (care pot lua valoarea 0 sau 1) de
lungime finit n;
BIT VARYING (n) definete secvene de lungime variabil, cu limita maxim n.

Tipuri pentru data calendaristic i timp

DATE permite memorarea datelor calendaristice n formatul yyyy-mm-dd;


5

TIME permite memorarea timpului, folosind trei cmpuri hh:mm:ss;


TIMESTAMP(p) permite memorarea combinat a datei calendaristice i a
timpului, cu precizia p pentru cmpul SECOND (al secundelor); valoarea implicit
a lui p este 6;
INTERVAL este utilizat pentru memorarea intervalelor de timp.
Tipurile de date sunt case-insensitive, deci nu in cont de caracterele
mari sau mici.

CURS 10. Limbaje relaionale de definire a datelor (LDD)


Limbajul de definire a datelor (a schemei unei BD) include instruciuni ce
permit:
- crearea schemei bazei de date;
- adugarea relaiilor la schema bazei;
- tergerea unor relaii existente;
- adugarea de noi atribute relaiilor existente;
- optimizarea bazei de date (index, grup, declanator);
- definirea structurii fizice i logice a unei BD;
- restricii cu privire la utilizarea structurii de mai sus.

Comenzi pentru crearea unei baze de date


Comanda pentru crearea unei baze de date este
CREATE DATABASE nume_baza;

Exemplu: S se creeze baza de date AGENTIA_IMOBILIARA.


CREATE DATABASE AGENTIA_IMOBILIARA;
Aceast comand creeaz o BD cu numele nume_baza. Nu toate SGBDR
suport noiunea explicit de BD, dei utilizarea unei asemenea noiuni poate
facilita controlul drepturilor de acces la relaiile BD. Sisteme precum DB2 nu
posed noiunea explicit de BD, n timp ce sistemul dBASE o suport.
Creatorul bazei de date devine automat administratorul BD.

Comenzi pentru suprimarea unei baze de date


Comanda pentru suprimarea unei baze de date este
DROP DATABASE nume_baza;
Aceast comand distruge BD cu numele nume_baza.

Comenzi pentru crearea relaiilor de baz

n cadrul acestor comenzi se precizeaz numele relaiei precum i numele


i tipul atributelor.
n SQL, cele mai frecvente tipuri de date sunt:
CHAR pentru ir de caractere de lungime fix;
VARCHAR2 pentru ir de caractere de lungime variabil;
NUMBER pentru numere ntregi sau reale de lungime variabil;
DATE pentru date calendaristice;
LONG pentru texte de lungime variabil
RAW pentru informaie binar de lungime variabil.
Comanda de creare a unei relaii este

CERATE TABLE nume_tabela (atribute);

Crearea unei relaii indicnd cheia la nivel de coloan

Exemplu: S se creeze relaia JUDETE (simbol_judet, nume_judet).


CREATE TABLE JUDETE
(simbol_judet CHAR(2) PRIMARY KEY,
nume_judet VARCHAR(30));

Crearea unei relaii indicnd cheile la nivel de tabel

Exemplu: S se creeze relaia LOCALITATI (cod_loc, simbol_judet, nume_loc).


CREATE TABLE LOCALITATI
(cod_loc VARCHAR(7),
simbol_judet CHAR (2),
nume_loc VARCHAR (50),
PRIMARY KEY (cod_loc, simbol_judet),
FOREIGN KEY (simbol_judet)
REFERENCES JUDETE(simbol_judet));
Dac cheia primar are mai mult de o coloan atunci cheile trebuie
indicate la nivel de tabel.

Crearea unui tabel prin copiere

Exemplu: S se creeze relaia LOCALITATI_CLUJ (cod_loc, simbol_judet,


nume_loc) utiliznd copierea datelor din relaia LOCALITATI.
CREATE TABLE LOCALITATI_CLUJ
SELECT
cod_loc ,
simbol_judet ,
nume_loc
FROM LOCALITATI
WHERE simbol_judet LIKE 'CJ';

Comenzi pentru suprimarea unei relaii de baz


Comanda de suprimarea unei relaii este
DROP TABLE nume_tabela;
Comanda SQL distruge relaia nume_tabela.

Comenzi pentru schimbarea numelui unei relaii


Comanda SQL pentru schimbarea numelui unei relaii este
RENAME nume_tabela TO nume_tabela_nou;

Exemplu: S se modifice numele relaiei LOCALITATI_CLUJ n LOC_CJ, apoi s


se suprime relaia LOC_CJ.
RENAME TABLE LOCALITATI_CLUJ TO LOC_CJ;
DROP TABLE LOC_CJ;
Comenzi pentru modificarea structurii unei relaii

Prin modificarea structurii unei relaii se nelege:


extinderea schemei relaiei prin adugarea de noi atribute;
restrngerea schemei unei relaii prin suprimarea unor atribute;
modificarea numelui i/sau tipului unui atribut din cadrul relaiei.
Unele limbaje relaionale (QBE) admit toate aceste tipuri de modificri n
schema unei relaii, iar altele (SQL sau QUEL) numai o parte.
Comanda de modificare a unei relaii este
ALTER TABLE nume_tabel ...
-

Adugarea unui atribut cu ajutorul opiunii ADD

Exemplu: S se adauge atributul regiunea la relaia LOCALITATI. (Valorile


acestui atribut vor fi: Transilvania, Banat, Oltenia, Muntenia, Moldova,
Dobrogea.)
ALTER TABLE LOCALITATI ADD
(regiunea VARCHAR(10));

Modificarea unui atribut cu ajutorul opiunii MODIFY

Exemplu: Presupunnd c relaia FACTURI a fost adugat bazei de date


AGENTIA_IMOBILIARA i c atributul pret_unitar este de tip INTEGER, s se
modifice forma preului unitar.
ALTER TABLE FACTURI MODIFY
pret_unitar DECIMAL (10,2) ;

Comenzi pentru declararea restriciilor de integritate (a constrngerilor)

Constrngere este un mecanism care asigur c valorile unei coloane sau


a unei mulimi de coloane satisfac o condiie declarat. Unei constrngeri i se
poate da un nume unic. Dac nu se specific un nume explicit atunci sistemul
automat i atribuie un nume de forma SYS_Cn, unde n reprezint numrul
constrngerii. Constrngerile pot fi terse, pot fi adugate, pot fi activate sau
dezactivate, dar nu pot fi modificate.
Prin comanda CREATE TABLE pot fi specificate anumite restricii
(constrngeri) prin care se exprim o condiie care trebuie respectat de toate
tuplurile uneia sau mai multor relaii. Acestea pot fi definite cu ajutorul comenzii
ALTER TABLE

Constrngerile declarative pot fi:


- constrngeri de domeniu, care definesc valorile luate de un atribut:
DEFAULT
NOT NULL
UNIQUE
CHECK
- constrngeri de integritate a entitii care precizeaz cheia primar
PRIMARY KEY
- constrngeri de integritate referenial care asigur corespondena ntre
cheile primare i cheile externe corespunztoare
FOREIGN KEY
Fiecrei restricii i se poate da un nume, lucru util atunci cnd, la un
moment dat (salvri, restaurri, ncrcarea BD) se dorete dezactivarea uneia
sau mai multora dintre acestea. Astfel se prefigureaz numele fiecrei restricii cu
tipul su:
pk_(PRIMARY KEY) pentru cheile primare
un_(UNIQUE) pentru cheile alternative
nn_(NOT NULL) pentru atributele obligatorii
ck_(CHECK) pentru reguli de validare la nivel de atribut
fk_(FOREIGN KEY) pentru cheile strine.
Exemplu: S se realizeze constrngerea de cheie primar, de cheie extern i
constrngerea de domeniu pentru relaia DESCRIERE_IMOBIL.
CREATE TABLE DESCRIERE_IMOBIL
(id_co SMALLINT (7) NOT NULL,
CONSTRAINT FOREIGN KEY fk_co(id_co)
REFERENCES CERERI_OFERTE(id_co),
CONSTRAINT pk_co PRIMARY KEY (id_co),
tip_imobil VARCHAR(10),
etaj VARCHAR(10),
nr_camere SMALLINT (6),
suprafata DECIMAL (12,4),
garaj TINYINT (4),
centrala_termica TINYINT (4),
termopane TINYINT (4));
Observaia 1: Liniile ce nu respect constrngerea sunt depuse automat
ntr-un tabel special.
Observaia 2: Constrngerile previn tergerea unui tabel dac exist
dependene. (vezi cursul tergerea datelor)
Observaia 3: Constrngerile pot fi activate sau dezactivate n funcie de
necesiti.
Observaia 4: Constrngerile pot fi create o dat cu tabelul sau dup ce
acesta a fost creat.

Modificarea unei restricii de integritate

10

Comanda de modificare a unei restricii este


ALTER TABLE nume_tabela
TIP_CONSTRNGERE);

MODIFY

(nume_atribut

Exemplu: S se modifice una din constrngerile din exemplul de mai sus.


ALTER TABLE DESCRIERE_IMOBIL MODIFY
tip_imobil VARCHAR (10) NOT NULL ;

Activarea i/sau dezactivarea unei constrngeri

Activarea sau dezactivarea unei constrngeri se realizeaz cu ajutorul


opiunilor ENABLE sau DISABLE.
Exemplu: S se dezactiveze, apoi s se activeze constrngerea de cheie
primar din relaia DESCRIERE_OFERTA.
ALTER TABLE DESCRIERE_IMOBIL ADD
(CONSTRAINT id_co PRIMARY KEY (id_co)
DISABLE);
ALTER TABLE DESCRIERE_IMOBIL
ENABLE (CONSTRAINT id_co);

Suprimarea unei constrngeri cu ajutorul opiunii DROP


Comanda pentru suprimarea unei restricii este
ALTER TABLE nume_tabela DROP PRIMARY KEY;

Exemplu: S se suprime restricia de cheie primar pentru atributul nr_factura


din tabela FACTURI.
ALTER TABLE FACTURI DROP PRIMARY KEY;

Adugarea unei constrngeri cu ajutorul opiunii ADD


Comanda pentru adugarea unei restricii este
ALTER TABLE nume_tabela ADD CONSTRAINT ...;

Exemplu: S se adauge restricia de cheie primar nr_factura pentru relaia


FACTURI.
ALTER
TABLE
FACTURI
ADD
CONSTRAINT
pk_nr_factura PRIMARY KEY (nr_factura);
Observaia 1: Astfel, comanda ALTER TABLE realizeaz modificarea
structurii tabelului (la nivel de coloan sau la nivel de tabel), dar nu modificarea
coninutului acestuia.

11

Observaia 2: Constrngerile pot fi adugate (ADD CONSTRAINT), terse


(DROP CONSTRAINT), activate (ENABLE) sau dezactivate (DISABLE), dar nu
pot fi modificate.
Observaia 3: Dac exist o cheie extern care refer o cheie primar i
dac se ncearc tergerea cheii primare, aceast tergere nu se poate realiza
(tabelele sunt legate prin declaraia de cheie extern). tergerea este totui
permis dac n comanda ALTER apare opiunea CASCADE, care determin i
tergerea cheilor externe ce refer cheia primar urmrind sintaxa
ALTER TABLE Nume_tabela
DROP PRIMARY KEY CASACDE;
Ex

Comenzi pentru acordarea drepturilor de acces la baza de date

La nivel logic, limbajele relaionale ofer comenzi pentru acordarea


drepturilor de acces la baza de date. Accesul unor persoane la BD se poate
realiza doar n condiiile recunoaterii acestora de ctre sistem drept utilizatori
autorizai.
Creatorul unei relaii primete n mod automat toate privilegiile de operare
asupra acestei relaii:
- cutri de date n relaie
- actualizri ale datelor n relaie
- actualizri ale schemei relaiei
- ataarea unor restricii de integritate
- suprimarea relaiei.
Poate acorda, la rndul su, privilegii asupra relaiei i altor utilizatori n
funcie de sistem:
- sistem centralizat (INGRES) n cadrul cruia singurul care poate acorda
drepturi de acces la BD este administratorul bazei de date, funcia de
administrator neputnd fi delegat altor persoane;
- sistem descentralizat (DBz, SABRINA, ORACLE) n cadrul cruia
administratorul poate da drepturi de acces la BD, dar, n acelai timp, putnd
delega i alte persoane s fie administratori.
Comanda n SQL de acordare a drepturilor utilizatorilor este
GRANT SELECT, UPDATE ,... ON nume_tabela TO
nume_utilizator;
Exemplu: S se confere utilizatorului cu numele Zita i cu parola BDZ dreptul de
conectare la BD, precum i unele drepturi de acces la una dintre tabelele bazei
de date.
GRANT SELECT, UPDATE ON DESCRIERE_IMOBIL TO
Zita IDENTIFIED BY 'BDZ';

Comenzi pentru retragerea drepturilor de acces la baza de date


Comanda SQL pentru retragerea drepturilor de acces la BD este
12

REVOKE UPDATE ON nume_tabela FROM nume_utilizator;


Exemplu: S se retrag drepturile utilizatorului Zita de actualizare a datelor.
REVOKE UPDATE ON DESCRIERE_IMOBIL FROM Zita;

13

CURS 11. Limbaje relaionale de manipulare a datelor (LMD) Interogarea datelor


Limbajele de manipulare a datelor trebuie s ofere o serie de faciliti
pentru prelucrarea datelor din relaiile bazei de date i anume:
- interogri
- inserri
- modificri
- tergere.
1. Interogarea datelor
Interogarea bazei de date reprezint principala funcie a unui limbaj
relaional de manipulare a datelor.
Comanda fundamental a standardului SQL este SELECT, aceasta
permind interogarea unei baze de date.
Interogarea reprezint o ntrebare care i extrage rspunsul din baza de
date. Componentele interogrii se numesc clause.
Sintaxa general a comenzii SELECT este urmtoarea:
SELECT [ALL/DISTINCT/UNIQUE] list de selecie
FROM list de relaii (tabele)
WHERE condiie de cutare asupra liniilor
GROUP BY list de atribute care permit partiionarea
HAVING condiie asupra partiiilor
ORDER BY list de atribute;
Clauzele SELECT i FROM sunt obligatorii. SELECT specific datele care
se selecteaz, iar clauza FROM specific relaiile din care se selecteaz. Restul
clauzelor sunt opionale.
Exemplul 1: S se selecteze toate persoanele mpreun cu toate datele
personale ale acestora existente n baza de date.
SELECT * FROM DATE_PERSOANA;
Exemplul 2: S se selecteze toate ofertele/cererile nregistrate n data de 200607-03.
SELECT * FROM CERERI_OFERTE
WHERE data_inreg=2006-07-03;

Interogarea datelor folosind operatorii IS i IS NOT

Exemplu: S se selecteze numele tuturor persoanelor care nu au completat


adresa de email, apoi s se afieze numele tuturor persoanelor care au numrul
de telefon completat.
SELECT numele FROM DATE_PERSOANA
WHERE email IS NULL;
SELECT numele FROM DATE_PERSOANA
14

WHERE nr_telefon IS NOT NULL;

Interogarea datelor folosind operatorii logici AND, OR, NOT


Sintaxa pentru interogarea care utilizeaz un operator logic este
condiie 1 AND condiie 2;
condiie1 OR condiie 2;
NOT condiie;

Exemplu: S se determine numrul facturii i codul numeric personal pentru


ofertele soluionate dup date de 2006-05-01 i cu un pre final mai mare sau
egal ca 100.000.
SELECT cnp,nr_factura FROM FACTURI
WHERE data_factura=2006-08-01 AND total>=100000;

Interogarea datelor folosind operatorul IN


Sintaxa este

SELECT valoare_cmp IN (valoare1, valoare2,...);


Aceast sintax a operatorului IN este similar cu urmtoarea list de
disjuncii:
Valoare_cmp=valoare1 OR valoare_cmp=valoare2 OR ...;
Exemplu: S se selecteze numrul facturii, id-ul cererii/ofertei, data facturii,
valoarea total a facturii, valoarea TVA i codul numeric personal pentru
cererile/ofertele soluionate cu valoarea total de 70.000,80.000, 90.000.
SELECT * FROM FACTURI
WHERE total IN (119000.00,178500.00,90000);

Interogarea datelor folosind sintaxa DISTINCT

Pentru a selecta seturi de valori distincte, adic eliminarea valorilor


duplicat, n SQL se folosete sintaxa DISTINCT, micornd astfel setul de date.
Sintaxa acestei comenzi este
SELECT DISTINCT nume_cmp1, nume_cmp2,... FROM
nume_tabela
WHERE comenzi;
sau
SELECT DISTINCT * FROM nume_tabela;
Sintaxa DISTINCT se refer la o nregistrare care poate cuprinde unul sau
mai multe cmpuri.
Exemplu: S se afieze toate datele distincte n care s-au nregistrat cereri sau
oferte.
SELECT DISTINCT data_inreg FROM CERERI_OFERTE;

15

Interogarea datelor folosind operatorul LIKE

Se cunosc mai multe modaliti de utilizare a expresiei LIKE, i anume:


pentru o expresie care ncepe cu o anumit liter, de exemplu litera A:
LIKE A%;
pentru o expresie care se termin cu o anumit liter, de exemplu litera
A: LIKE %A;
pentru o expresie care include o anumit liter, de exemplu litera A: LIKE
%A%;

Exemplu: S se selecteze numele, adresa i emailul tuturor persoanelor feminine


care au adres de email pe yahoo sau personal.
SELECT numele, adresa, email FROM DATE_PERSOANA
WHERE adresa LIKE %BAIA MARE% AND (email LIKE
%yahoo% OR email LIKE %personal%);

Interogarea datelor folosind operatorul BETWEEN

Operatorul se utilizeaz n combinaie cu dou valori ntre care se afl


valoarea la care se refer operatorul. Sintaxa este
val BETWEEN minim AND maxim;
sau
val>=min AND val<=max;
Cele trei expresii val, min, max pot fi de tip numeric (numeric, decimal, int,
smalint etc.) sau de tip dat calendaristic.
Exemplu: S se selecteze codurile tuturor cererilor/ofertelor nregistrate n
perioada 1 ianuarie 2006 i 1 mai 20006.
SELECT id_co FROM CERERI_OFERTE
WHERE data_inreg BETWEEN 2006-01-01 AND 2006-0501;

Interogarea datelor folosind funciile calendaristice YEAR, DAY, MONTH

Funciile YEAR, DAY, MONTH rein dintr-un cmp de tip dat


calendaristic anul, ziua, respectiv luna.
Exemplu: S se vizualizeze codurile tuturor cererilor/ofertelor nregistrate n luna
mai.
SELECT id_co FROM CERERI_OFERTE
WHERE MONTH(data_inreg)=05;

Interogarea datelor folosind ordonarea

Datele se pot ordona dup orice cmp. Ordonarea se poate face att
cresctor ct i descresctor. Sintaxa pentru interogarea
16

ordonat cresctor este


ORDER BY nume_cmp (ASC);
- ordonat descresctor este
ORDER BY nume_cmp (DESC);
Dac ORDER BY nu este urmat de ASC sau DESC, ordonarea se face
implicit cresctor.
Exemplu: S se vizualizeze lista persoanelor n ordine alfabetic.
SELECT numele FROM DATE_PERSOANA
ORDER BY numele;

Interogarea datelor din mai multe tabele

Interogarea datelor din mai multe relaii este strns legat de noiunea de
cheie primar, cheie secundar, restricii de integritate, asocieri ntre relaii.
Exemplu: S se afieze ofertele i denumirile oraelor corespunztoare ofertelor.
SELECT id_co, nume_loc
FROM CERERI_OFERTE, LOCALITATI
WHERE CERERI_OFERTE.tipul=oferta AND
CERERI_OFERTE.cod_loc=LOCALITATI.cod_loc;
Observaii: Clauza FROM specific dou relaii. Clauza SELECT cuprinde valori
din relaia CERERI_OFERTE i din relaia LOCALITATI, prin urmare trebuie
definite cmpurile n funcie de tabela din care face parte. Se utilizeaz sintaxa
nume_tabel.nume_cmp
Clauza WHERE include condiii care exprim o egalitate ntre valorile
identificatorului nume_cmp a relaiei nume_tabel i a celei ale referinei la acest
identificator n tabela referit.

17

CURS 12. Limbaje relaionale de manipulare a datelor (LMD) Interogarea datelor din mai multe relaii
Atunci cnd n clauza FROM a unei comenzi SELECT apar mai multe tabele
se realizeaz produsul cartezian al acestora. De aceea numrul de linii rezultat
crete considerabil, fiind necesar restricionarea acestora cu o clauza WHERE.
Atunci cnd este necesar obinerea de informaii din mai multe tabele se
utilizeaz condiii de join. n acest fel liniile dintr-un tabel pot fi puse n legtura cu
cele din alt tabel conform valorilor comune ale unor coloane. Condiiile de corelare
utilizeaz de obicei coloanele cheie primar i cheie extern.
Tipuri de asocieri pentru relaii
Rolul unei relaii fiind acela de a modela entiti, ntre relaii exist aceleai
tipuri de asocieri ca i ntre entiti, prezentate la nceputul cursului, i anume
asocieri unu la unu, unu la mai muli, muli la mai muli.

Asocieri de la unu la unu

Dou relaii stocheaz informaii n asocierea unu la unu dac unei nregistrri
din relaia A i corespunde (sau nu) o singur nregistrare din B.
Acest tip de asociere este utilizat mai rar. Exist, totui, cazuri n care este
necesar i util stabilirea unei astfel de relaii.
Exemplu:
CERERI_OFERTE
id_co #
tip
cnp
data_inreg
tip_solutionare
cod_loc
id_strada
nr_imobil
pret_min
pret_max

1:1

DESCRIERE_IMOB IL
id_co#
tip_imobil
etaj
nr_camere
suprafata
garaj
centrala_termica
termopane

Fig. 12.1. Asociere de tip 1:1

Asocieri de la unu la mai muli

O relaie A se afl ntr-o asociere de unu la mai muli cu o relaie B dac


fiecrei nregistrri din A i corespund una sau mai multe nregistrri din relaia B.
Unei nregistrri din relaia B nu i corespunde dect maxim o nregistrare din relaia
A.
Sunt utilizate urmtoarele denumiri:
B este relaia copil sau relaia care refer la A sau relaia cheie strin;
A este relaia printe (master) sau relaia referit sau relaia cheie primar.
18

Exemplu:
B

A
JUDETE
simbol_judet#
nume_judet

1:n

LOCALITATI
cod_loc#
simbol_judet
nume_judet

Fig. 12.2. Asociere de tip 1:n


Observaie: Relaia A are cheia primar simbol_judet, iar relaia B are atributul
simbol_judet cheie extern.

Asocieri de la mai muli la mai muli

O relaie A se afl n asociere de tipul muli la mai muli cu o relaie B dac


unei nregistrri din relaia A i pot corespunde mai multe nregistrri din relaia B i
unei nregistrri din relaia B i pot corespunde mai multe nregistrri din relaia A.
O asociere n la n nu se definete direct, asocierea construindu-se cu ajutorul
unei relaii de jonciune. n aceast relaie se pstreaz legtura ntre cele dou
relaii, precum i informaiile necesare.
Exemplu:
A
JUDETE
simbol_judet#
nume_judet

B
1:n

LOCALITATI
cod_loc#
simbol_judet
nume_judet

1:n

STRAZI
id_strada#
cod_loc#
nume_str

Fig. 12.3. Asociere de tip n:n


Observaie: n exemplul de mai sus, relaia LOCALITATI realizeaz jonciunea ntre
relaiile JUDETE i STRAZI, stocnd informaiile privind numele judeului
nume_judet, simbolul judeului simbol_judet i identificatorul localitii cod_loc.
Astfel, asocierea n la n este vizualizat sub forma a dou relaii de unu la n.

Interogarea datelor din mai multe relaii folosind aliasuri

Un alias este o redenumire fie a unui cmp, fie a unei relaii. Aliasurile sunt
utilizate la eliminarea rescrierii complete a denumirii unei relaii sau a unui cmp,
redenumindu-le ntr-un mod simplificat. Sintaxa utilizat este:
nume_relaie/camp AS nume_nou;
sau
nume_relaie/camp nume_nou;
Exist posibilitatea de a utiliza aliasuri pentru tabelele din clauza FROM i
utilizarea lor n cadrul comenzii SELECT respective (alias.coloana). Aceast
19

identificare (prin 'tabel.coloana' sau 'alias.coloana') este obligatorie atunci cnd se


face referin la o coloana ce apare n mai mult de un tabel din clauza FROM.
Exemplul 1: S se determine toate ofertele de apartamente din oraul Baia Mare, de
pe strada Victoriei.
SELECT CO.id_co, L.nume_loc, S.nume_str, CO.nr_imobil,
DI.etaj, DI.nr_camere, DI.garaj, DI.suprafata,
DI.centrala_termica, DI.termopane, DI.tip_imobil, CO.pret_min,
CO.pret_max
FROM CERERI_OFERTE AS CO, LOCALITATI AS L, STRAZI
AS S, DESCRIERE_IMOBIL AS DI
WHERE CO.tipul=oferta AND CO.id_co=DI.id_co AND
CO.cod_loc=L.cod_loc AND CO.id_strada=S.id_strada AND
CO.cod_loc=S.cod_loc AND L.cod_loc='MM430' AND
S.id_strada='152' AND DI.tip_imobil='apartament';
Lista afiat n urma acestei interogri poate fi de genul:

Fig. 12.4. Lista apartamentelor din Baia Mare, de pe strada Victoriei


Exemplul 2: S se afieze toate cererile nesoluionate de terenuri din localitatea
Bora, data nregistrrii, precum i datele personale ale clienilor.
SELECT CO.id_co, CO.tipul, CO.cnp, CO.data_inreg,
CO.tip_solutionare, CO.cod_loc, DP.numele,
DP.adresa, DP.nr_telefon, DP.email, DI.tip_imobil
FROM CERERI_OFERTE CO, DATE_PERSOANA DP,
DESCRIERE_IMOBIL DI
WHERE CO.tipul='cerere' AND CO.cnp=DP.cnp
AND cod_loc='MM435'
AND CO.tip_solutionare='0'
AND CO.id_co = DI.id_co
AND DI.tip_imobil LIKE 'teren';
Observaie: n cazul n care un atribut apare doar ntr-o relaie dintre cele menionate
n list, nu este obligatorie precizarea relaiei (adic a aliasului) din care face parte
atributul respectiv, dup cum este cod_loc='MM435'.
Interogarea datelor din mai multe relaii folosind tipuri de asocieri

Tipurile de asocieri utilizate n interogarea mai multor relaii sunt:


INNER JOIN (jonciunea intern)
LEFT OUTER JOIN (semijonciunea la stnga)
RIGHT OUTER JOIN (semijonciunea la dreapta)

a) Sintaxa
SELECT ...FROM tabel_A INNER JOIN tabel_B (condiii de join)
selecteaz toate informaiile din relaiile A i B care corespund condiiilor de asociere.
20

Exemplul 1: Selectai codul ofertei/cererilor i codul localitilor fiecrei oferte folosind


operaia de join, apoi utiliznd clauza WHERE.
SELECT CO.id_co, CO.cod_loc
FROM CERERI_OFERTE CO INNER JOIN LOCALITATI L
ON (CO.cod_loc=L.cod_loc);
SELECT CO.id_co, CO.cod_loc
FROM CERERI_OFERTE CO, LOCALITATI L
WHERE CO. cod_loc=L.cod_loc;
Observaie: Rezultatul este acelai. Valorile NULL vor fi ignorate.
Exemplul 2: Selectai numele persoanelor care ofer imobile, codul ofertelor, precum
i denumirile localitilor, ordonnd alfabetic localitile.
SELECT DP.numele, CO.id_co, L.nume_loc
FROM DATE_PERSOANA DP
INNER JOIN CERERI_OFERTE CO ON (DP.cnp=CO.cnp)
INNER JOIN LOCALITATI L ON (CO.cod_loc=L.cod_loc)
WHERE CO.tipul LIKE oferta
ORDER BY L.nume_loc;
SELECT DP.numele, CO.id_co, L.nume_loc
FROM DATE_PERSOANA DP, CERERi_OFERTE
LOCALITATI L
WHERE CO.tipul LIKE oferta
AND DP.cnp=CO.cnp
AND CO.cod_loc=L.cod_loc
ORDER BY L.nume_loc;

CO,

Observaie: Sintaxei SELECT-FROM-INNER JOIN i se pot aduga i alte condiii,


neincluse n condiiile de join, dac acestea se refer la alte cmpuri dect cele care
particip la join.
Exemplul 3: Selectai numele persoanelor care ofer imobile n judeul Maramure,
codul ofertelor, tipul acestora, precum i denumirile localitilor i a strzilor,
ordonnd alfabetic localitile i strzile.
1) Folosind INNER JOIN
SELECT DP.numele, CO.id_co, S.nume_str, DI.tip_imobil,
L.nume_loc
FROM DATE_PERSOANA DP INNER JOIN
CERERI_OFERTE CO ON (DP.cnp=CO.cnp)
INNER JOIN STRAZI S ON (CO.id_strada=S.id_strada )
INNER JOIN LOCALITATI L ON (CO.cod_loc=L.cod_loc
AND L.cod_loc LIKE 'MM%')
INNER JOIN DESCRIERE_IMOBIL DI ON
(CO.id_co=DI.id_co AND CO.tipul='oferta')
ORDER BY L.nume_loc, S.nume_str;
Observaie: Toate condiiile ce se refer la cmpurile din join se vor prezenta n
cadrul condiiilor de join.
21

2) Folosind WHERE
SELECT DP.numele, CO.id_co, S.nume_str, DI.tip_imobil,
L.nume_loc
FROM DATE_PERSOANA DP, CERERI_OFERTE CO,
STRAZI S, LOCALITATI L, DESCRIERE_IMOBIL DI
WHERE CO.tipul='oferta' AND
DP.cnp=CO.cnp AND
CO.id_strada=S.id_strada AND
CO.cod_loc=L.cod_loc AND
CO.id_co=DI.id_co AND
L.cod_loc LIKE 'MM%'
ORDER BY L.nume_loc, S.nume_str;
3) Folosind INNER JOIN i WHERE
SELECT DP.numele, CO.id_co, S.nume_str, DI.tip_imobil,
L.nume_loc
FROM DATE_PERSOANA DP INNER JOIN
CERERI_OFERTE CO ON (DP.cnp=CO.cnp)
INNER JOIN STRAZI S ON (CO.id_strada=S.id_strada )
INNER JOIN LOCALITATI L ON (CO.cod_loc=L.cod_loc )
INNER JOIN DESCRIERE_IMOBIL DI ON
(CO.id_co=DI.id_oferta)
WHERE L.cod_loc LIKE 'MM%' AND CO.tipul='oferta'
ORDER BY L.nume_loc, S.nume_str;
b) Sintaxa
SELECT ...FROM tabel_A LEFT OUTER JOIN tabel_B ON
(condiii de join)
selecteaz toate informaiile din A, pe care le completeaz cu informaii din B, n
msura n care satisfac condiiile de join; acolo unde nu vor exista informaii din B,
acestea vor fi completate cu NULL.
Exemplul1: Selectai toate ofertele. Dac exist informaii despre aceste oferte,
afiai i aceste informaii.
SELECT *
FROM CERERI_OFERTE CO LEFT OUTER JOIN
DESCRIERE_IMOBIL DI ON (CO.id_co=DI.id_co )
WHERE CO.tipul='oferta';
Observaie: Ordinea n care se scrie denumirea relaiei n sintaxa LEFT OUTER
JOIN este foarte important. Astfel, relaia din stnga este relaia primar, adic
relaia pentru care se dorete returnarea tuturor informaiilor; relaia din dreapta este
relaia secundar, adic informaiile din ea sunt necesare doar n msura n care se
potrivesc condiiilor de asociere. Astfel se explic i denumirea de asociere de la
stnga spre exterior.
Exemplul2: Selectai toate ofertele, preciznd i numele judeelor, localitilor precum
i a strzilor. Dac exist informaii despre aceste oferte, afiai i aceste informaii.
SELECT L.nume_loc, CO.*, S.nume_str, DI.tip_imobil,
22

DI.nr_camere, DI.suprafata, DI.garaj,


DI.centrala_termica, DI.termopane
FROM CERERI_OFERTE CO LEFT OUTER JOIN
DESCRIERE_IMOBIL DI ON(DI.id_co=CO.id_co)
INNER JOIN STRAZI S ON S.id_strada = CO.id_strada AND
CO.cod_loc=S.cod_loc
INNER JOIN LOCALITATI L ON CO.cod_loc = L.cod_loc
WHERE CO.tipul LIKE 'oferta';
c) Sintaxa
SELECT ...FROM tabel_A RIGHT OUTER JOIN tabel_B ON
(condiii de join)
selecteaz toate informaiile din B, pe care le completeaz cu informaii din A, n
msura n care satisfac condiiile de join; acolo unde nu vor exista informaii din A,
acestea vor fi completate cu NULL.
Exemplu: Selectai toate localitile i, n localitile n care exist cereri
nesoluionate, afiai numele clienilor i tipul de cerere de imobil respectiv.
SELECT L.nume_loc, DP.numele, CO.tip_solutionare,
DI.tip_imobil
FROM LOCALITATI L RIGHT OUTER JOIN CERERI_OFERTE
CO ON (L.cod_loc=CO.cod_loc)
INNER JOIN DATE_PERSOANA DP ON (DP.cnp=CO.cnp)
INNER JOIN DESCRIERE_IMOBIL DI ON
(CO.id_co=DI.id_co AND CO.tipul = cerere)
WHERE CO.tip_solutionare=0;
Observaie: Sintaxa RIGHT OUTER JOIN este utilizat mai rar; de obicei se
utilizeaz sintaxa LEFT OUTER JOIN.

23

CURS 13. Limbaje relaionale de manipulare a datelor (LMD) Interogarea datelor din mai multe relaii (continuare)

Interogarea datelor din mai multe relaii folosind instruciunea UNION


Sintaxa interogrii datelor din mai multe relaii folosind instruciunea UNION

este
SELECT Cmp 1, Cmp 2, ..., Cmp n
FROM Tabel 1
UNION (ALL)
SELECT Cmp 1A, Cmp 2A,..., Cmp nA
FROM Tabel 2
i returneaz nregistrri distincte, dac este folosit instruciunea UNION i toate
nregistrrile, dac se folosete UNION ALL. Astfel operatorul UNION elimin
duplicatele, iar UNION ALL vizualizeaz toate nregistrrile, inclusiv duplicatele.
Pentru a utiliza aceast interogare, trebuie s se in seama de dou cerine:
domeniile Cmp 1A, Cmp 2A,..., Cmp nA i Cmap 1, Cmp 2, ..., Cmp n trebuie
s fie respectiv aceleai i, numrul de cmpuri din fiecare interogare trebuie s
coincid.
Operatorul UNION se folosete atunci cnd ntre relaii nu exist o asociere
direct.
Exemplul 1: Pentru exemplificare se vor considera relaiile: PROFESORI (prof_id,
nume, prenume), respectiv STUDENTI (stud_id, nume, prenume). Selectai lista
numelor tuturor profesorilor i a studenilor.
SELECT nume, prenume FROM PROFESORI
UNION ALL
SELECT nume, prenume FROM STUDENTI;
Rezultatul generat de interogare va fi
numeprenumePOPVAS
ILEIONANA
Fig. 13.1. Interogarea mai multor relaii folosind operatorul UNION ALL
Observai: Problema mai poate fi soluionat utiliznd alte interogri, dar acestea
rmn ca exerciii individuale.
Exemplul 2: S se determine care sunt ofertele i cererile soluionate prin facturi,
afind ntr-o list id_ul cererii/ofertei i cnp-ul cleintului, att din tabela
CERERI_OFERTE ct i din tabela FACTURI.
SELECT cnp, id_co FROM FACTURI
UNION ALL
SELECT cnp, id_co FROM CERERI_OFERTE;
Rezultatul generat de interogare va fi o lista greu de urmrit, dup cum este i cea
din figura 13.1, deoarece nu se specific clar care inregistrare corespunde facturilor,
i care tabelei CERERI_OFERTE (acest neajuns va fi nlturat utiliznd
concatenarea):
24

Fig. 13.2. Interogarea mai multor relaii folosind operatorul UNION ALL (cazul neclar)

Interogarea datelor mai multor relaii folosind operatorul de concatenare a


dou iruri de caractere

Rolul operatorului de concatenare a dou iruri de caractere este de a uni


dou iruri de caractere ntr-unul singur. Este utilizat n toate SGBD-urile, cu mici
modificri ale simbolului: n Tranzact SQL se folosete simbolul +, n Oracle simbolul
|| etc.
Se pot concatena o constant cu un cmp, sau dou cmpuri. Cmpurile
trebuie s fie de tip text.
Sintaxa pentru concatenarea a dou cmpuri este
CONCAT(Cmp1, Cmp2)
sau insernd virgula, spaiu sau oricare marcaj de delimitare
CONCAT(Cmp1,,, Cmp2) sau CONCAT (Cmp1, , Cmp2).
Sintaxa
CONCAT(Ceva, Cmp)
concateneaz cmpul i valoarea returnnd o singur valoare.
Sintaxa
CONCAT(Ceva1, Ceva1)
concateneaz cele dou constante ntr-una singur Ceva1Ceva2.
Exemplu: S se determine care sunt ofertele i cererile soluionate prin facturi,
afind ntr-o list id_ul cererii/ofertei i cnp-ul cleintului, att din tabela
25

CERERI_OFERTE ct i din tabela FACTURI. De aceast dat, s se precizeze


cnd este vorba de facturi, respectiv cnd este vorba de cerere sau ofert.
SELECT CONCAT('F:', ' ', 'cnp;',cnp,' ', 'id_co:',id_co,' ','data:',
data_factura) AS feacturi_si_oferte_cereri
FROM FACTURI
UNION
SELECT CONCAT('C_O:',' ', 'cnp;',cnp,'
', 'id_co:',id_co,'
','data:', data_inreg) FROM CERERI_OFERTE;
Rezultatul generat de interogare va fi

Fig. 13.3. Interogarea mai multor relaii folosind concatenarea (cazul mai clar)
Observaie: Concatenarea prezint dezavantajul afirii cmpurilor null.

a)

Interogarea datelor folosind funciile totalizatoare


MAX
MIN
COUNT
SUM
AVG
Interogarea datelor folosind funcia MAX
26

Sintaxa
MAX(Nume_cmp) FROM Tabela
returneaz un numr egal cu valoarea maxim a cmpului Nume_cmp din relaia
Tabela, valorile null fiind ignorate.
Exemplu: Selectai cea mai recent nregistrare din tabela CERERI_OFERTE, fr a
da un nume rezultatului, apoi cu nume pentru cmpul rezultat.
SELECT MAX(data_inreg) FROM CERERI_OFERTE;
SELECT MAX(data_inreg) AS data_ultimei_nregistrari FROM
CERERI_OFERTE;
b)

Interogarea datelor folosind funcia MIN

Funcia MIN este o funcie similar cu funcia MAX, cu ajutorul creia se poate
determina valoarea cea mai mic dintr-un cmp.
Att funcia MIN ct i funcia MAX se poate aplica doar pentru tipurile de date
numeric sau dat calendaristic.
c)

Interogarea datelor folosind funcia COUNT


Sintaxa

COUNT (*) FROM Nume_tabela


returneaz un numr egal cu numrul de nregistrri ale tabelei Nume_tabela.
Exemplu: Precizai numrul de oferte nregistrare.
SELECT COUNT(*) AS numar_de_oferte
FROM CERERI_OFERTE
WHERE tipul LIKE oferta;
Sintaxa
COUNT (Nume_cmp) FROM Tabela
returneaz un numr egal cu numrul de valori nenule ale cmpului Nume_cmp din
tabela Nume_tabela. Sunt ignorate valorile null.
Exemplu: Precizai numrul de cereri nesoluionate.
SELECT COUNT(tip_solutionare) AS cereri_solutionate
FROM CERERI_OFERTE
WHERE tip_solutionare=1 AND
tipul=cerere;
Sintaxa
COUNT(DISTINCT Nume_cmp) FROM Tabela
returneaz un numr egal cu numrul de valori distincte nenule ale cmpului
Nume_cmp din tabela Nume_tabela. Sunt ignorate valorile null.
Exemplu: Precizai numrul de localiti din care provin ofertele.
SELECT COUNT(DISTINCT cod_loc) FROM CERERI_OFERTE
WHERE tipul=oferta;
27

d)

Interogarea datelor folosind funcia SUM


Sintaxa

SUM (Nume_cmp) FROM Tabela


returneaz un numr egal cu suma tuturor valorilor cmpului Nume_cmp din relaia
Nume_Tabela. Sunt ignorate valorile null.
Exemplu: Precizai suma tuturor ncasrilor existente pe facturile emise.
SELECT SUM(DISTINCT total) FROM FACTURI;
Sintaxa
SUM (DISTINCT Nume_cmp) FROM Tabela
returneaz un numr egal cu suma valorilor distincte ale cmpului Nume_cmp din
relaia Nume_Tabela.
Funcia SUM se aplic acelor cmpuri care au domeniul de valori de tipul
FLOAT, DECIMAL, NUMERIC, INT etc. i nu are sene pentru cmpuri de tip text.
e)

Interogarea datelor folosind funcia AVG


Sintaxa

AVG (nume_cmp) FROM Nume_tabela


returneaz un numr egal cu media aritmetic a tuturor valorilor cmpului
Nume_cmp din relaia Nume_tabela. Valorile null sunt ignorate.
Funcia AVG se utilizeaz doar pentru date de tip numeric: INT, FLOAT,
NUMERIC.
Exemplu: Selectai media valorilor vnzrilor din agenia imobiliar.
SELECT AVG (total) FROM FACTURI;
Interogarea datelor folosind instruciunea GROUP BY

Prin instruciunea GROUP BY se grupeaz datele dup fiecare produs n


parte.
Exemplu: Selectai fiecare tip de imobil n parte grupndu-le alfabetic i precizai
numrul de imobile vndute din fiecare tip.
SELECT DI.tip_imobil, COUNT(F.id_co) AS suma
FROM DESCRIERE_IMOBIL DI, FACTURI F
WHERE F.id_co=DI.id_co
GROUP BY DI.tip_imobil;
Interogarea returneaz urmtoarele informaii:

Fig. 13.4 Rezultatul interogrii folosind instruciunea GROUP BY i funcia SUM


Menionarea clauzelor SELECT, FROM, WHERE, GROUP BY, ORDER BY n
aceast ordine este obligatorie. Greeala frecvent care duce la apariia unor mesaje
28

de eroare este aceea a introducerii unor cmpuri dup care se grupeaz n clauza
SELECT i neintroducerea lor n clauza GROUP BY.
Pentru a evita pierderea de informaii, este indicat ca atributul dup care se
grupeaz s fie cheie primar.
SELECT CO.id_co, J.nume_judet, L.nume_loc, S.nume_str,
CO.pret_min, CO.pret_max
FROM JUDETE J, CERERI_OFERTE CO, LOCALITATI L,
STRAZI S
WHERE CO.cod_loc=L.cod_loc
AND CO.id_strada=S.id_strada
AND L.simbol_judet=J.simbol_judet
GROUP BY J.nume_judet;

Fig.13.5. Rezultatul interogrii folosind instruciunea GROUP BY cu pierderi de


informaii
Acest inconvenient este nlturat dac se grupeaz dup numele judeului,
localitii i a strzii, caz n care vor aprea tupluri duplicat.
SELECT CO.id_co,J.nume_judet, L.nume_loc, S.nume_str,
CO.pret_min, CO.pret_max
FROM JUDETE J, CERERI_OFERTE CO, LOCALITATI L,
STRAZI S
WHERE CO.cod_loc=L.cod_loc
AND CO.id_strada=S.id_strada
AND L.simbol_judet=J.simbol_judet
GROUP BY L.cod_loc;

Fig.13.6. Rezultatul interogrii folosind instruciunea GROUP BY fr pierderi de


informaii

Interogarea datelor folosind instruciunea HAVING


29

Instruciunea HAVING se utilizeaz numai n combinaie cu instruciunea


GROUP BY. Dac gruparea de date trebuie s satisfac vreo condiie, aceast
condiie se exprim cu ajutorul sintaxei HAVING.
Clauza HAVING este utilizat cnd se dorete filtrarea datelor grupate
conform unor criterii. Aceste criterii presupun compararea unor valori obinute prin
apelarea unor funcii totalizatoare. Aceste tipuri de comparri presupun gruparea
datelor. Din aceast cauz, HAVING cere obligatoriu clauza GROUP BY.
Exemplu: Selectai adresele ofertelor grupate dup judee, localiti i strzi care au
preul minim cuprins ntre 50000 i 300000.
SELECT CO.id_co,J.nume_judet, L.nume_loc, S.nume_str,
CO.pret_min, CO.pret_max
FROM JUDETE J, CERERI_OFERTE CO, LOCALITATI L,
STRAZI S
WHERE CO.cod_loc=L.cod_loc
AND CO.id_strada=S.id_strada
AND L.simbol_judet=J.simbol_judet
GROUP BY CO.id_co
HAVING CO.pret_min BETWEEN 50000 AND 300000;
Ordinea obligatorie a unei fraze SELECT complete este: SELECT, FROM,
WHERE, GROUP BY, HAVING, ORDER BY.

30

Curs 14. Funcii utilizate n interogri

a)
b)
c)
d)

Cele mai des ntlnite funcii n interogri sunt:


funcii pentru iruri de caractere
funcii pentru valori numerice
funcii pentru date calendaristice
funcii de conversie dintr-un tip n altul.

a) Funcii pentru iruri de caractere


-

CONCAT: concateneaz dou iruri de caractere


SELECT CONCAT('My', 'S', 'QL');
-> 'MySQL'
SELECT CONCAT('My', NULL, 'QL');
-> NULL
SELECT CONCAT(14.3);
-> '14.3'
- REPLACE: nlocuirea unui ir de caractere cu un altul ntr-o expresie de acest
tip;
SELECT REPLACE('www.mysql.com', 'w', 'Ww');
-> WwWwWw.mysql.com
- CHAR_LENGTH: returneaz numrul de caractere dintr-un ir;
- FIELD(str,str1,str2,str3,): returneaz poziia irului de caractere str n lista
irurilor de caractere str1,str2,str3; dac irul str nu este gsit, returneaz
valoarea 0.
SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
-> 2
SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
-> 0
- LEFT(str,n): returneaz subirul fromat dintr-un numr de n caractere;
SELECT LEFT('paralelipiped', 5);
-> 'paral'
- LOWER(str): toate literele din str vor fi convertite n minuscule;
SELECT LOWER('LITERE MARI');
-> 'litere mari'
- UPPER(str): toate literele din str vor fi convertite n majuscule;
SELECT LOWER('LITERE mari');
-> 'LITERE MARI'
- LPAD(str,n,caracter): completeaz la stnga cu un caracter pn la atingerea
unei lungimi specificate
SELECT LPAD('buna',6,'?');
->??buna
SELECT LPAD('buna',1,'??');
->b
- RPAD(str,n,caracter): completeaz la dreapta cu un caracter pn la atingerea
unei lungimi specificate
SELECT RPAD('buna',5,'?');
31

->buna?
LTRIM(str): elimin spaiile de la stnga valorii str;
SELECT LTRIM(' barbar');
->barbar
RTRIM(str): elimin spaiile de la dreapta valorii str;
SELECT RTRIM('barbar
');
->barbar
TRIM: eliminarea simultan a spaiillor la stnga i la dreapta;
SELECT TRIM(' bar ');
->bar
SUBSTR(sir,n): extragerea unei poriuni dintr-un ir ncepnd cu a n-a liter;
SELECT SUBSTRING('Paralelipiped',5);
->lelipiped

b) Funcii pentru valori numerice


-

CEIL(p): ntoarce cel mai mic ntreg mai mare sau egal cu argumentul p;
SELECT CEIL(1.23);
->2
SELECT CEIL(-1.23);
->-1
FLOOR(p): ntoarce cel mai mare ntreg mai mic sau egal cu argumentul p;
SELECT FLOOR(-1.23);
->-2
SELECT FLOOR(1.23);
->1
ROUND(p,n): rotunjete rezultatul unei expresii (p) la un numr de poziii
funcionare dac n este pozitiv, sau, dac n este negativ, se face la ordinul
zecilor, sutelor, miilor etc.
SELECT ROUND(-1.23);
->-1
SELECT ROUND(-1.58);
->-2
SELECT ROUND(1.58);
->2
SELECT ROUND(1.298, 1);
->1.3
SELECT ROUND(1.298, 0);
->1
SELECT ROUND(23.298, -1);
->20
TRUNC(p,n): are efect similar funciei ROUND, numai c n loc de rotunjire se
face trunchiere.
SELECT TRUNCATE(1.223,1);
->1.2
SELECT TRUNCATE(1.999,1);
->1.9
SELECT TRUNCATE(1.999,0);
->1
SELECT TRUNCATE(-1.999,1);
32

->-1.9
SELECT TRUNCATE(122,-2);
->100
c) Funcii pentru date calendaristice
-

CURRENT_DATE(): furnizeaz data curent sub forma YYYY-MM-DD;


SELECT current_date();
-> 2006-08-15
- SYSDATE(): furnizeaz data curent i ora exact sub forma YYYY-MM-DD
HH-MM-SS;
SELECT SYSDATE();
-> 2006-08-15 15:06:44
- CURRENT_TIMESTAMP(), NOW(), SYSTIMESTAMP: sunt sinonime cu
SYSDATE;
- DATE_ADD (data,INETRVAL nr.): adun un numr de ani, luni sau zile la data
argument;
SELECT DATE_ADD('2006-08-15', INTERVAL 1 MONTH);
-> 2006-09-15
- LAST_DAY(data): furnizeaz ultima zi din luna n care se afl data argument;
SELECT LAST_DAY('2008-02-15');
-> 2008-02-29
- DATEDIFF(data1,data2): calculeaz numrul de zile dintre cele dou date
calendaristice;
SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30');
->1
SELECT DATEDIFF('1997-11-30 23:59:59','1997-12-31');
->-31
- DAYNAME(data): afieaz denumirea zilei corespunztoare datei argument;
SELECT DAYNAME(2006-08-19);
-> 'Saturday'
DAYOFMONTH(data), DAYOFYEAR(data): (ziua din lun, ziua din an)
furnizeaz numrul de ordine n cadrul lunii, respective a anului pentru o dat
calendaristic.
SELECT DAYOFYEAR('2006-08-19');
->231
d) Funcii de conversie dintr-un tip n altul
Funcia de conversie cel mai des utilizat este funcia CAST.
- CAST: realizeaz diferite conversii, de exemplu
SELECT CONCAT('Data: ', CAST(NOW() AS DATE));
-> Data: 2006-08-18
concateneaz irul de caractere data: cu data calendaristic actual, convertit la
ir de caractere.
Exemple
Exemplul 1: Modificai toate numerele de telefon din judeul Maramure, astfel ca
prefixul s nu mai fie 0262 ci 0362, din baza de date AGENTIE_IMOBILIARA.
33

UPDATE DATE_PERSOANA SET


nr_telefon=CONCAT('0362', SUBSTR(nr_telefon, 5))
WHERE SUBSTR(nr_telefon,1,4)='0262';
Pentru modificarea datelor s-a folosit comanda
UPDATE nume_tabel SET instructiuni
WHERE conditii,
iar funcia
SUBSTR(sir,nr)
extrage ciferele din ntregul numr de telefon, ncepnd cu a cincea poziie, cifre ce
vor fi concatenate cu prefixul 0362. De asemenea, prin funcia
SUBSTR(nr_telefon,1,4)
se realizeaz extragerea primelor patru numere din ntregul numr de telefon.
Exemplul 2: Afiai numele i data naterii clienilor din baza de date
AGENTIE_IMOBILIARA, cunoscnd codul numeric personal al acsotra.
SELECT CONCAT('Numele: ',numele) AS numele,
CONCAT('Anul: ', '19',SUBSTR(cnp,2,2),' , ','Luna:',
SUBSTR(cnp,4,2), ', ','Ziua: ',
SUBSTR(cnp,6,2))
AS data_nasterii
FROM DATE_PERSOANA;
Observaie: n interogarea de mai sus se concateneaz irul Numele cu numele
clientului, apoi se concateneaz irul Anul cu irul 19 (deoarece se consider c nu
sunt clieni nscui dup anul 1999) i cu cele dou cifre ale codului numeric
personal care desemneaz anul naterii unei persoane (SUBSTR(cnp,2,2)). n mod
analog se efectueaz i celelalte concatenri.

Fig. 14.1. Utilizarea funciilor CONCAT i SUSTR


Exemplul 3: Afiai preurile ofertelor (preul minim i preul maxim) folosind alinierea
la dreapta i la stnga.
SELECT LPAD(pret_min,30,' ') AS 'pret minim',
RPAD(pret_max,30,' ') AS 'pret maxim'
FROM CERERI_OFERTE
WHERE tipul LIKE oferta
ORDER BY pret_min,pret_max;

34

Fig. 14.2. Utilizarea funciilor LPAD i RPAD


Exemplul 4: S se afieze numrul de cereri de imobile primite n prima jumtate a
oricrei luni fa de cele primite n cea de a doua jumtate.
SELECT LTRIM(COUNT(id_co)) AS 'nr de cereri in
prima jumatate a lunii'
FROM CERERI_OFERTE
WHERE DAYOFMONTH(data_inreg)<16
AND tipul =cerere;
(a)
SELECT COUNT(id_co) AS 'nr de cereri in a doua
jumatate a lunii'
FROM CERERI_OFERTE
WHERE DAYOFMONTH(data_inreg)>15
AND tipul =cerere;
(b)
Fig. 14.3. Utilizarea funciei DAYOFMONTH (a), (b)

35

SINTEZ I EXERCIII
1. Cei opt operatori iniiali
a
b
c
Restricia

x
y

Proiecia

Reuninuea

a
a
b
b
c
c

x
y
x
y
x
y

Produs

Intersecia

Diferena

a1
a2
a3

b1
b1
b2

b1
b2
b3

c1
c2
c3

a1
a2
a3

b1
b1
b2

c1
c1
c3

a
b
c

a
a
a
b
c

x
y
z
x
y

x
z

Uniune(natural)
mprirea

Fig. 1. Reprezentarea operatorilor relaional

36

2. Teste
Curs 1 - Exerciii
1.

2.

3.

4.

5.

6.

7.

Prin tipul unei date nelegem:


a) mulimea valorilor pe care le poate lua data;
b) structura, mulimea valorilor, operaiile admise i modul de tratare a erorilor;
c) structura, mulimea valorilor, operaiile admise, regulile de protecie i
securitatea datelor.
Prin valoarea atomica, nelegem:
a) o valoare reprezentat printr-un singur simbol;
b) o valoare din care nu putem elimina nici o component fr s denaturm
semnificaia datei;
c) o valoare cu format rigid
Atributul reprezint:
a) mulimea valorilor posibile ale unei date;
b) o caracteristic a unei entiti;
c) formatul de reprezentare a unei date
Prin baza de date, nelegem:
a) orice colecie de date;
b) o colecie de date conectate logic, exhaustiv i neredundant;
c) orice colecie de date materializat sub forma unor fiiere de disc magnetic
Prin sistem de gestiune a bazelor de date, nelegem:
a) modul de organizare al unui sistem informatic, care manipuleaz date din
baze de date;
b) un program sau pachet de programe, care permite crearea, pstrarea i
eliminarea bazelor de date;
c) un sistem de programe, care permite utilizatorului definirea, crearea i
ntreinerea bazei de date, precum i accesul controlat la aceasta.
Definii urmtorii termeni:
- baz de date
- sistem de gestiune de baz de date
- entitate
- diagram E-R
- atribut
- asociere
Care sunt etapele de realizare a unei baze de date?

37

Curs 2- Exerciii
8.

O relaie este:
a) orice tabel bidimensional cu valori atomice;
b) orice tabel;
c) orice tabel bidimensional
9.
Se numete grad al unei relaii:
a) numrul domeniilor distincte ale relaiei;
b) numrul de tupluri distincte ale relaiei;
c) numrul de atribute ale relaiei
10.
Cardinalitatea unei relaii reprezint:
a) numrul de atribute ale relaiei;
b) numrul de tupluri ale relaiei;
c) numrul de atribute identificator, ale relatiei.
11.
Care sunt componentele unei diagrame E-R?
12.
Ce se nelege prin cardinalitate?
13.
Numii trei tipuri de asocieri ntre entiti.
14.
Pentru baza de date FURNIZORI_COMPONENTE descris mai jos, n figura
2, precizai tipurile de relaionri ntre relaiile F,C, respectiv FC, apoi realizai
diagrama E-R.
15.
Dai exemple de:
- o relaie de tip muli la muli
- o relaie de tip unu la unu
- o relaie de tip unu la muli.
16.
Relaiile de tip mai multe la mai multe sunt dificil de implementat ntr-un
proiect
eficient de baze de date. Ce este de fcut, n acest caz?
17.
Desenai diagrama entitate-relaie (preciznd i tipul asocierilor) pentru
urmtoarea baz de date COLECTIE_MUZICA: presupunei c avei o colecie
muzical rock, format din CD-uri i DVD-uri i casete audio i dorii s construii o
baz de date care s permit s gsii nregistrrile pe care le avei pentru un anumit
interpret (de exemplu, Joe Cocker), pentru un anumit chitarist (de exemplu, Joe
Satriani), pentru un anumit baterist (de exemplu, Lars Ulrich), pentru un anumit
album (de exemplu, Master of Puppets), o anumit formaie (de exemplu, Metallica).

38

Curs 3- Exerciii
18.

Se numete domeniu al unui atribut:


a) mulimea valorilor posibile ale unui atribut;
b) tipul datelor de atribut;
c) mulimea valorilor actuale ale unui atribut
19.
Se numete baz de date relaional:
a) un set de tabele;
b) un set de tabele normalizate;
c) un set de tabele bidimensionale
20.
Definii urmtorii termeni:
- cheie primar
-cheie extern
- BDR
- domeniu
- entitate
- atribut
- relaie
21.
Care sunt conceptele utilizate pentru a descrie elementele de baz ale
organizrii unei BDR?

39

Curs 4- Exerciii
22.

Dou relaii R1 i R2 sunt compatibile cu reuniunea, dac:


a) au acelai numr de atribute;
b) au acelai numr de atribute, iar atributele care ocup aceeai poziie au
acelai nume;
c) au acelai numr de atribute, iar atributele care ocup aceeai poziie au
acelai domeniu.
23.
Pentru a putea determina intersecia relaiilor R1 i R2 este necesar ca:
a) relaiile s fie compatibile cu intersecia;
b) relaiile s fie compatibile cu reuniunea;
c) relaiile s aib cel puin un tuplu comun.
24.
Dac R1 are n1 tupluri, R2 are n2 tupluri, atunci R1 U R2 are:
a) cel puin n1 + n2 tupluri;
b) n1 + n2 tupluri;
c) cel mult n1 + n2 tupluri.
25.
Operatorul de proiecie aplicat unei relaii, permite:
a) eliminarea unor coloane;
b) modificarea poziiei coloanelor;
c) eliminarea unor coloane i modificarea poziiei lor
26.
Pentru a putea realiza jonciunea natural ntre relaiile R1 i R2 este necesar
ca:
a) relaiile R1 i R2 s fie compatibile cu reuniunea;
b) relaiile R1 i R2 s aib cte un atribut cu acelai domeniu;
c) relaiile R1 i R2 s aib cel puin cte un atribut cu acelai nume i acelai
domeniu.
27.
Se consider relaiile:
STUDENT (NR_LEG, NUME, PRENUME, GRUPA) i
TELEFON (NR_LEG, PREFIX, TELEFON, TIP_TELEFON).
Se presupune c fiecare student are cel mult un telefon mobil. Pentru a rezolva
cererea s se afieze toi studenii unei grupe precizate, iar acolo unde este cazul s
se afieze i telefonul mobil, este necesar s utilizam:
a) o jonciune natural;
b) o jonciune de egalitate;
c) o jonciune extern.
28.
Rezultatul aplicrii unui operator relaional, este ntotdeauna:
a) o relaie;
b) o relaie sau o valoare;
c) o relaie sau un set de relaii.
29.
Definii urmtorii operatori:
- reuniunea
- diferena
- produsul cartezian
- proiecia
- selecia
- intersecia
- diviziunea
30.
Enumerai cele trei tipuri de jonciune.
31.
Care dintre operatorii relaionali definii n cursul 4 au o definiie care nu se
bazeaz pe aceeai structur?
40

32.
Fie baza de date FURNIZORI_COMPONENTE modelat de urmtoarele
valori eantion:
F F#numeFStareorasF1Pop20BucurestiF2Achim
FC F#C#cantF1C1300F
10PloiestiF3Ardelean30PloiestiF4Popescu20B
ucurestiF5Ionescu30Vaslui

C C#numeCCuloareMasaorasC1piulitaRosu12.0Bucuresti

1C2200F1C3400F1
C4200F1C5100F1C
6100F2C1300F2C24
00F3C2200F4C2200
F4C4300F4C5400

C2BoltVerde17.0PloiestiC3Surubalbastru17.0AradC4Su
rubRosu14.0BucurestiC5CamaAlbastru12.0PloiestiC6R
oata dintatarosu19.0Bucuresti

Fig. 2. Baza de date FURNIZORI_COMPONENTE (valori eantion)


Furnizorii i componentele sunt identificate n mod unic prin numrul
furnizorului F, respectiv prin numrul componentei C. Fiecare furnizor are un numr
F, un nume numeF, care nu este neaprat unic, o valoare de cotare sau a strii
stare i o localizare oras. Se presupune c fiecare furnizor este localizat n exact
un singur ora. Fiecare component are un numr C care este unic, un nume
numeC, o culoare culoare, o mas mas i localitate n care sunt stocate
componentele. Relaia FC reprezint livrrile i se exprim astfel: Furnizorul F
livreaz componenta C n cantitatea cant.
Care este valaorea expresiei F JOIN FC JOIN C?
33.
Fie R o relaie de gardul n. Cte proiecii diferite ale relaiei R exist?
34.
Reuniunea, intersecia, produsul i jonciunea sunt att comutative, ct i
asociative. Verificai aceste proprieti pe baza unor exemple construite de
dumneavoastr.
35.
Fie expresia a JOIN b. Dac relaiile a i b au anteturi disjuncte, atunci
aceast expresie este echivalent cu a TIMES b; dac au acelai antet, atunci este
echivalent cu a INTERSECT b. Verificai aceste afirmaii pe baza unor exemple
construite de dumneavoastr.
36.
n aritmetic, nmulirea i mprirea sunt operaii inverse. TIMES i
DIVIDEDBY sunt operaii inverse n algebra relaional?

41

Curs 5- Exerciii
37.
Fie A si B dou atribute (simple sau compuse) ale relaiei R. Se spune c
atributul B este dependent funcional de A, dac:
a) fiecrei valori a lui A i este asociat exact o valoare a atributului B;
b) fiecrei valori a lui A i este asociat cel puin o valoare nenul a atributului
B;
c) fiecare valoare a lui B este asociat unei valori a lui A.
38.
Explicai urmtoarele noiuni:
- restricii de integritate
- cheia primar a unei relaii
- cheia extern a unei relatii
- relaie care refer
- relaie referit.
39.
n baza de date FURNIZORI_COMPONENTE, dai exemple de
a) chei primare i secundare
b) chei simple i chei compuse
c) relaie care refer i relaie referit.
40.
Precizai care sunt restriciile de integritate minimal ale modelului relaional,
apoi enunai aceste restricii.
41.
Ce nseamn dependen funcional? Dai dou exemple de DF.
42.
Se definete o relaie ORAR, cu urmtoarele atribute:
Z ziua din sptmn (de la 1 la 5)
T perioada din zi (de la 1 la 6)
C numrul slii de clas
P numele profesorului
L numele leciei.
Tuplul (z,t,c,p,l) apare n aceast relaie dac i numai dac la momentul (z,t)
lecia l este predat de profesorul p n sala de clas c. Se presupune c leciile au
durata de o perioad i c ficare lecie are un nume, care este unic pentru toate
leciile predate ntr-o sptmn. Ce dependene funcionale conine aceast relaie?
Care sunt cheile candidat?
43.
Fie relaia F_O_C din figura urmtoare:
F_O_C

F#orasC#cantF1BrasovC11
00F1BrasovC2100F2IasiC
1200F2IasiC2200F3IasiC2
300F4BrasovC2400F4Bras
ovC4400F4BrasovC5400

Fig. 3. Relaia F_O_C (valori eantion)


Determinai dependnele funcionale.

42

Curs 7- Curs 8- Exerciii


44.

Se spune c o relaie este n forma normal 1, dac:


a) nu conine atribute compuse;
b) fiecare atribut are numai valori atomice;
c) conine cel puin o cheie candidat.
45.
Se spune c o relaie se afl n a doua form normal, dac:
a) se afl n prima form normal i fiecare atribut care nu este cheie primar
este total dependent de cheia primara;
b) se afl n prima form normal i orice atribut care nu este cheie candidat
este total dependent de cheia primar;
c) se afl n prima form normal i orice atribut care nu este determinat este
total dependent de cheia primar.
46.
Se consider relaia EXAMEN (NR_LEG, DATA_EXAMEN, ID_MATERIE,
SALA, NOTA). Aceast relaie se afl n:
a) a II-a form normal;
b) a III-a form normal;
c) prima form normal.
47.
Exist numai trei forme normale? Enumerai formele normale.
48.
Definii urmtoarele noiuni:
- atribut simplu (atomic)
- atribut compus.
49.
S se normalizeze bazele de date prezente pe parcursul acestui capitol:
COLECTIE_MUZICALA, FURNIZORI_COMPONENTE.

43

Curs 9- Exerciii
50.

Limbajul SQL reprezint:


a) un limbaj procedural de descriere i manipulare a datelor ntr-o baz de
date;
b) un limbaj neprocedural de descriere i manipulare a datelor ntr-o baza
de date;
c) un limbaj neprocedural de descriere i manipulare a datelor ntr-o baza
de date relaional, sau obiect relational.
51.
Ce este SQL?
52.
Care sunt limbajele SQL?
53.
Explicai care este rezultatul returnat de fiecare dintre urmtoarele funcii:
MAX, MIN, COUNT, SUM, AVG.
54.
Care sunt domeniile celor mai utilizate tipuri de variabile numerice? Dar
pentru tipul ir de caractere?

44

Curs 10- Exerciii


55.
Precizai care sunt rezultatele generate de comanda ALTER
TABLE...ADD.
56.
Care este comanda prin care o cheie primar, o cheie extern sau o
constrngere este exprimat?
57.
Creai tabelul salariat avnd urmtoarea structur:
Nume
cod_angajat
nume
prenume
functia
sef
data_angajarii
varsta
email
salariu

Caracteristici
NOT NULL

Valoare implicit 0

Tipul
INTEGER(4)
VARCHAR(25)
VARCHAR(25)
VARCHAR(20)
INTEGER(4)
DATE
NUMBER
CHAR(10)
DECIMAL(9,2)

Fig. 4. Structura tabelului SALARIAT (prima form)


58.
Pentru baza de date COLECTIE_MUZICA (vezi problema 9), s se
execute toate comenzile din cursul 10, i anume
- crearea bazei de date
- crearea tabelelor indicnd cheile
- modificarea numelui unei tabele
- adugarea unui atribut
- modificarea unui atribut
- adugarea/ suprimarea unor restricii de integritate
- modificarea unei constrngeri
- acordarea/ retragerea drepturilor de acces la baza de date.
59.
Exersai
aceleai
comenzi
pentru
baza
de
date
FURNIZORI_COMPONENTE.
60.
S se defineasc o constrngere la nivel de coloan prin care s se
specifice cheia primar i cheia extern prin construirea tabelei F din baza de
date FURNIZORI_COMPONENTE descris n problema 15.
61.
S se defineasc o constrngere la nivel de tabel prin care s se specifice
cheia primar i cheia extern prin construirea tabelei FC din baza de date
FURNIZORI_COMPONENTE descris n problema 15.
62.
Dup ce tabela F a fost creat n problema 33, suprimai cheia primar a
tabelei F din baza de date FURNIZORI_COMPONENTE apoi recreai cheia
primar a tabelei.
63.
Aceeai cerin ca n problema precedent, pentru cheia strin.
64.
tergei i apoi creai din nou tabelul salariat cu urmtoarea structur.
NUME

TIP

45

CONSTRNGERE

cod_ang
nume
prenume
data_nasterii
functia

INTEGER(4)
VARCHAR(25)
VARCHAR(25)
DATE
VARCHAR(9)

sef

INTEGER(4)

data_angajarii
email
salariu
cod_dept

DATE
VARCHAR(20)
DECIMAL(12,3)
INTEGER(4)

Cheie primar
NOT NULL
data_nasterii<data_angajarii
NOT NULL
Refer ca i cheie extern
cod_ang din acelai tabel
unic
>0
NOT NULL
Combinaia NUME +
PRENUME s fie unic

Fig. 5. Structura tabelului SALARIAT (a doua form)


65.
tergei tabelul salariat,
constrngerile la nivel de tabel.

iar

apoi

recreai-l

implementnd

toate

Observaie: Constrngerea de tip NOT NULL se poate declara doar la nivel de coloan.

46

Curs 11- Exerciii


66.

Se consider comanda SQL


SELECT * FROM (STUDENT INNER JOIN ADRESA ON
NR_LEG = NR_LEG)
INNER JOIN TELEFON ON NR_LEG = NR_LEG
Care dintre urmtoarele afirmaii este corect:
a) comanda este corect;
b) comanda va genera un mesaj de eroare;
c) comanda se execut dar nu se afieaz nimic.
67.
Se consider comanda SQL
SELECT * FROM STUDENT
LEFT OUTER JOIN TELEFON ON STUDENT. NR_LEG =
TELEFON.NR_LEG WHERE GRUPA = 7710;
Se presupune c n grupa selectat sunt 30 de studeni, 5 studeni au un telefon
i 4 studeni au cte dou telefoane. Atunci, n urma execuiei se va afia:
a) o list cu 30 linii;
b) o list cu 34 de linii;
c) o list cu 13 linii.
68.
S se afieze numele clienilor care au achiziionate ntre 3 i 10 imobile,
din baza de date AGENTIE_IMOBILIARA.
69.
Pentru baza de date FURNIZORI_COMPONENTE realizai urmtoarele
interogri:
A) afiarea tuturor furnizorilor i a oraelor unde sunt situate, ordonnd
descresctor dup numele furnizorilor;
B) afiarea tuturor furnizorilor din Ploieti;
C) afiarea componentelor care au masa sub 14 u.m, inclusiv;
D) afiarea componentelor de culoare roie i albastr care nu sunt produse
n oraul Ploieti;
E) afiarea acelor furnizori care au livrat componenta C2, ordonnd dup
furnizori;
F) afiarea mediei cantitii livrate de furnizorul F1; (utilizai dicionarul pentru
a afla detalii despre funcia MIN, MAX, SUM, COUNT, AVG);
G) afiarea furnizorilor care au livrat cel mai mare numr de componente de
un anumit tip;
H) afiarea furnizorilor care au livrat cea mai mic cantitate de componente,
afind numele acestora oraul de provenien al furnizorilor i
componenta livrat;
I) afiarea tuturor culorilor folosite pentru componentele livrate de furnizori;
J) afiarea tuturor informaiilor furnizorilor a cror nume ncepe cu A;
K) afiarea numelui furnizorilor care au starea cuprins ntre 10 si 20;
70.
S se vizualizeze toate denumirile albumelor existente n baza de date
COLECTIE_MUZICA, ordonate alfabetic.
71.
S se realizeze interogri asemntoare cu cele de la exerciiul 39 pentru
baza de date COLECTIE_MUZICA.

47

Currs 12- Exerciii


72.
n cazul bazei de date FURNIZORI_COMPONENTE, s se realizeze
urmtoarele interogri:
a) Care sunt numele furnizorilor ce au livrat componenta C2 i care sunt
oraele din care provin aceti furnizori?
b) Care component roie s-a livrat n cea mai mare cantate?
c) Din ce ora provine furnizorul cu cele mai puine componente vndute, i
care sunt aceste componente?
d) S se vizualizeze toate informaiile legate de furnizorii care au livrat
componente, precum i toate informaiile despre aceste componente.
73.
Afiai lista cu toi interpreii i cu albumele lor existente n baza de date
COLECTIE_MUZICA, ordonnd dup interprei.
74.
Vizualizai aceeai list de mai sus existent pe casete audio.
75.
Care dintre interprei figureaz i pe CD i pe casete audio?
76.
Descriei tipurile de JOIN utilizate n procesul de interogare a relaiilor unei
baze de date.
77.
Pentru toate interogrile de mai sus, s se formuleze fraze SELECT att
cu ajutorul clauzei WHERE ct i cu ajutorul operaiilor de JOIN.
78.
Fie baza de date H-R cu diagrama reprezentat n figura 6.
manages

DEPARTMENTS
79.
Department_id
Department_name
Manager_id
Location_id

EMPLOYEES
employee_id
first_name
last_name
salary
Manager_id
Department_id
Job_id
Location_id

belongs to

Located in

LOCATIONS
location_id
country_id
street_address
city

is manager of

has job

JOBS
job_id
job_title
min_salary
max_salary

Located in (2)

COUNTRIES
country_id
country_name
region_id

Located in
(3)

JOB_HISTORY
employee_id
start_date
end_date
job_id
department_id

REGIONS
region_id
region_name

48

JOB_GRADES
Grade_level
Lowest_sal
Highest_sal

Fig. 6. Diagrama bazei de date H-R


n ipoteza n care tabelele au fost poulate cu date, s se afieze numele salariailor i
numele departamentelor n care lucreaz. Se vor afia i salariaii care nu lucreaz
ntr-un departament. (right outher join).
80.
S se afieze numele departamentelor i numele salariailor care lucreaz n
ele. Se vor afia i departamentele care nu au salariai. (left outher join).

49

Curs 13- Exerciii


81.
Din
cte
localiti
provin
furnizorii?
(BD
utilizat
este
FURNIZORI_COMPONENTE).
82.
Pentru baza de date AGENTIE_IMOBILIARA, precizai:
A) care sunt localitile cu cele mai multe solicitri (cereri) de imobil? Dar cu cele
mai multe oferte?
B) n ce lun a anului s-au nregistrat cele mai multe oferte? Dar cele mai puine
cereri?
C) Care este clientul ce a achiziionat cele mai multe imobile?
83.
n ce interogri este necesar utilizarea cuvntului HAVING?
a) cnd este necesar s eliminm linii duble din rezultat;
b) cnd este necesar s ordonm mulimea rezultat;
c) cnd este necesar s efectum un calcul pe grup;
d) cnd este necesar s restricionm grupurile de linii returnate.
84.
Cu care clauz se utilizeaz n permanen clauz HAVING?
85.
Precizai deosebirea dintre clauzele ORDER BY i GROUP BY.

50

Curs 14- Exerciii


86.
Care sunt funciile pentru adugarea i eliminarea caracterelor suplimentare
(inclusiv a spaiilor albe) din irurile de caractere?
87.
Se pot folosi mai multe funcii ntr-o singur instruciune?
88.
Afiai ultima zi a lunii curente.
89.
S se afieze data curent i data peste trei luni.
90.
Afiai data peste un an, 2 luni i 3 zile de la data curent.
91.
S se afieze lista clienilor din baza de date AGENTIE_IMOBILIARA ce
trebuie felicitai de Sfnta Maria.
92.
Extragei din fiecare nume a clientului patru caractere, ncepnd cu al cincilea,
apoi s se afieze numrul de caractere care intr n componena numelui fiecrui
client (se va utiliza baza de date AGENTIE_IMOBILIARA).
93.
Scriei cu majuscule numele furnizorilor din baza de date
FURNIZORI_COMOPNENTE.
94.
nlocuii literele F i C cu furniz, respecitv cu compon n baza de date
FURNIZORI_COMOPNENTE.
95.
S se afieze lista furnizorilor i componentelor din baza de date
FURNIZORI_COMOPNENTE sub forma Furnizorul ... a livrat componenta ... n
cantitatea de ....
96.
Folosii toate cele patru funcii numerice (CEIL, FLOOR, ROUND, TRUNC)
pentru suma de achitat lunar n decursul unui an, sum ce se obine mprind preul
total (de pe factur) al unei tranzacii imobiliare la numrul de luni dint-un an (din
baza de date AGENTIE_IMOBILIARA).
97.
Calculai numrul de zile cuprins ntre data de nregistrare a ofertelor i data
de soluionare a acestora, adic data de pe factur (n cazul n care ofertele au fost
soluionate) utiliznd BD AGENTIE_IMOBILIARA.
98.
Cte oferte au fost primite n timpul primelor trei zile ale sptmnii (de-a
lungul tuturor lunilor) din baza de date AGENTIE_IMOBILIARA? Dar n restul zilelor
sptmnii?
99.
Afiai n ce zile ale sptmnii s-au nregistrat oferte n baza de date
AGENTIE_IMOBILIARA. Aceeai cerin pentru numele lunilor (folosii funcia
MONTHNAME).

51

BAZE DE DATE.........................................................................................................................1
CAPITOLUL I. PROIECTARE (DESIGN) DE DATE (9 sapt.)................................................1
CURS 1. Preliminarii..............................................................................................................1
1.1.
Noiuni folosite n teoria bazelor de date................................................................1
1.2.
Funcionarea unei baze de date...............................................................................2
1.3
Realizarea unei baze de date...................................................................................3
CURS 2. Construirea de diagrame entitate-relaie..................................................................6
CURS 3. Proiectarea modelului relaional............................................................................15
3.1 Structura relaional a datelor...................................................................................15
CURS 4. Operatorii modelului relaional.............................................................................18
3.2 Operatorii modelului relaional..................................................................................18
CURS 5. Restricii de integritate ale modelului relaional...................................................32
3.3 Restricii de integritate ale modelului relaional.........................................................32
CURS 6. Prelucrarea/evaluarea i optimizarea cerinelor.....................................................38
CURS 7. Tehnica normalizrii relaiilor...............................................................................43
7.1 Prima form normal (FN1)........................................................................................44
7.2. A doua form normal (FN2)......................................................................................48
CURS 8. A treia form normal............................................................................................49
7.3. A treia form normal (FN3)......................................................................................49
CAPITOLUL II. SQL (9 sapt.).................................................................................................51
CURS 9. Limbajul SQL........................................................................................................51
CURS 10. Limbaje relaionale de definire a datelor (LDD).................................................56
CURS 11. Limbaje relaionale de manipulare a datelor (LMD) - Interogarea datelor.........63
CURS 12. Limbaje relaionale de manipulare a datelor (LMD) - Interogarea datelor din mai
multe relaii...........................................................................................................................67
CURS 13. Limbaje relaionale de manipulare a datelor (LMD) - Interogarea datelor din mai
multe relaii (continuare).......................................................................................................73
Curs 14. Funcii utilizate n interogri..................................................................................80
SINTEZ I EXERCIII.........................................................................................................85

52

id_
tipul
cnp
tip_solutionare
(1,n)
(0,1)
conin
(1,1)
(0,n)
are
finisate
ARHIVA_CER
ARHIVA_OFE
REZ:
DATE_PERSO
TRANSPORT:
TARIFE:
LOCALIT:
Operator
atribut
R1
se
R2
R3
OFERTE
regsete
asociat
din
R2
R1
icnp
id_
d_
tipul
FACTURI
FN2
FN3
BCFN
FN4
FN5
OFERTANTI
Relaia
FN1
DESCRIERE
CERERIJUDETE
LOCALITAT
STRZI
STRAZI:
data_inreg
(a)
(b)
FACTURI:
DATE_PERS
OFERTE
CERERI_OF
REZ:
LOCALITATI
JUDETE:
DESCRIERE
DATE_PERS
LOCALITAT
simbol_judet
aDEPOZIT_
numele,
cod_loc
DEPOZIT
CERERI_
PRODUS
nr_imobil
pret_max
a#
id_strada
JUDETE
pret_min
STRAZI
cnp
cod_loc
cnp
cod_loc
tipul
cnp
E
:de
:vin
simbol_jude
numele
id
Transport
Localit
cnp#
cod_loc#
tipul
D1
Jude
nume
Tarif
Jude
nr_telefon
D1 D1
CERERI_O
nr_
id_co
-FACTURI

Consultare:
PRODUSE
CLIENTI
LINII_FAC
FACTURI
01
cerere
=
R1
R3
R2
P
REZ:
S
R
atribut
atribut,
condiie
atribut
din
raft#
cnp#
id_tip_oferte
nr_factura#
simbol_judet#
simbol_judet#
cod_loc#
Formal
vin
numele
denumire
nume_loc
nume_loc
Uzual
raft
co#
ERI:
RTE:
comparaie
VECHI:
co#
ANA
: I cerere
:nr_factura#
universal
_IMOB
OFERTE
Isimbol_judet
id_strada#
OANA
OANA:
ERTE:
nr_telefon
_IMOBIL
PRODUS
OFERTE
OANA
IL
D3
D1
D4

P1
D1
2066
1210
BV
210
1066
Pop
0221
Bora
1701205230032
Ana
oferta
Maramure
Data_nreg<20
FERTE
factura#
SELECT
TURI
258102345
170120523
A
R
din
operator
,A
Rjoferta
,...,A
= mCab.
MM
430
Realie
j2
Cab.
01
11oferta
Baia
Tablou
Mare
1
arbore
12
1701205230023
12

id_oferta
id_co#
#id_co
cod_loc#
cnp#
# cerere
06-07-03
D1CJ400
1551212245038
autobuz
Baia
Maramure
Cluj11
2066
BV
1316
Sas
1210
Braov
Ioan
oferta
Braov
0362/409209
raft,
P2
D2
22
43
Cnp1
N1
cod_client#
vin,
cod_produs
nume_clien
nr_factura#
7723
0023
operator
de
SM
MM
Sauvignon
Sauvignon
Mare
algebric
AB
435
CJ
Tuplu
01
2cerere
Borsa
Linie
13
234
oferta
cerere
data_factura
tip_imobil
tip
nume_judet
simbol_judet
nume_str
numele
1551212245038
Mare
Napoca
000
P1
CJ
220
3161
Bora
234
cerere
Maramure
2760805270024
oferta
P3
D3
44
nume_clien
cod_client
producator
#
t#
nr_factura#
data_factur
de
atribut
comparai
din
(nu
este
435
Pinot
3
Noir
Pinot
Borsa
Noir Bibliografie
400
BV
Atribut
02
Cluj-Napoca
Coloan
etaj
cnp
nume_loc
adresa
troleibuz
Braov
BV230
Braov
Brasov
10
2560405570053
_ cerere
D11316
Braov
P4
D4
t710
a400
data_factur
FROM
denumire_
adresa_clie
cod_produs
comparai
R
e,
valoare
pret
nr_camere
data_inreg
nr_telefon
2
unic)
P3
2660805270023
000
22
Merlot
Pinot
ClujNoir
Domeniu
01
Botosani
Tip
de

1. Baze de date-Organizare, proiectare i implementare- Ion Lungu, Constanta Bodea,


Georgeta Bdescu, Crsitian Ioni, Ed. ALL Educational, Bucureti, 1995.
2. Proiectarea bazelor de date. Normalizare i postonormalizare. Implementri SQL i
Oracle- Marin Fotache, Ed. Polirom.
3. Baze de date relaionale - proiectare i implementare- Ileana Popescu, Editura
Universitii din Bucureti, 1996.
4. Transact SQL- tefan Ardeleanu, Ed. Niculescu.
5. SQL. Dialecte DB2, Oracle i Visual FoxPro- Marin Fotache, Polirom, 2001.
6. Oracle 9i2. Ghidul dezvoltrii aplicaiilor profesionale- Marin Fotache, Ctlin
Strmbei, Liviu Creu, Polirom, 2003.

53

You might also like