Sunteți pe pagina 1din 22

BAZE DE DATE – SINTEZA

___________________________________________________________________________

I. BAZE DE DATE – Noţiuni introductive:


Tipuri de legaturi intre tabele:
 1-1 – legatura dintre cele doua tabele se face pe baza cheilor primare
 1-n – cheia primara din tabela “parinte” se adauga in tabela “copil” sub forma
de cheie externa
 n-n – nu se poate implementa practice si se recurge la adaugarea unei tabele
suplimentare care va contine cheile primare ale tabelelor initiale si campuri
referitoare la asocierea dintre tabelele “parinti”. Cheia primara din tabela
intermediara va fi o cheie compusa.

Structura bazei de date utilizata ca exemplu in continuare - Se considera activitatea de


evidenta a comenzilor incheiate de o societate comerciala cu diverse firme prin intermediul
agentilor angajati in cadrul societatii. Comenzile contin produse aflate in depozitul societatii,
iar pentru fiecare produs se cunoaste in permanenta stocul existent.

FIRME
CODFIRMA DENFIRMA LOC CONTBANCA ZONA

AGENTI
CODAGENT NUMEAGENT DATAANG DATANAST ZONA FUNCTIE CODSEF

COMENZI
NRCOM CODFIRMA CODAGENT DATA

RANDCOM
NRCOM CODPRODUS CANT PRET TERMENLIVR

PRODUSE
CODPRODUS DENPRODUS UM STOC

1
BAZE DE DATE – SINTEZA
___________________________________________________________________________

II. Notiuni fundamentale ale limbajului SQL

Limbajul SQL – Structured Query Language este un limbaj standard de interogare


a bazelor de date, implementat în majoritatea SGBD, dar nu numai.
In ORACLE este implementat nucleul SQL cu anumite particularitati.

1. Tipuri de date:

TIP Caracteristici
VARCHAR2(size) sir de caractere de lungime variabila
NUMBER(p,s) Numeric: p (precision) = 1..38, s (scale) =-84..127
LONG sir de caractere de lung>2GB
DATE data calendaristica
RAW(size) date de tip binar. Maxim size este 2000 bytes.
LONG RAW lungime variabila > 2GB se stocheaza grafice, sunete, documente
ROWID adresa fiecarui rind din tabela
CHAR(size) sir de caractere de lungime fixa
BLOB binary large object (max 4GB) se stocheaza date nestructurate
(text,imagine, video, date spatiale)
BFILE contine un pointer catre un fisier binar stocat in afara bazei de date

2. Operatori SQL

Operator Caracteristici
AND, OR, NOT Operatori logici
<, >, =, >=, <=, <>, != Operatori de comparatie
BETWEEN ... AND ... între două valori (inclusiv).
IN(listă) egal cu oricare valoare din listă
LIKE similar cu un şablon
% - oricâte caractere; _ - un caracter;
IS NULL are valoarea NULL

3. Comenzi SQL

Comenzile referitoare la bazele de date sunt comune tuturor versiunilor de SQL si sunt
impartite in urmatoarele categorii:

1) Comenzi LDD (Limbaj de Definire a Datelor - Data Definition Language)

Comanda Scop
CREATE Creaza un obiect nou (tabela, utilizator, rol, etc)
ALTER Modifica o parte dintre proprietatile unui obiect
DROP Elimina un obiect din baza de date

2
BAZE DE DATE – SINTEZA
___________________________________________________________________________

2) Comenzi LMD (Limbaj de Manipulare a Datelor - Data Manipulation


Language)
Comanda Scop
SELECT Regaseste inregistrari in tabele sau vederi.
DELETE Sterge inregistrari din tabele
INSERT Adauga o noua inregistrare in tabela
UPDATE Modifica valorile unor inregistrari din tabele

3) Comenzi LPT (Limbaj pentru Procesarea Tranzactiilor)


Comanda Scop
COMMIT Finalizeaza o tranzactie
ROLLBACK Anuleaza o tranzactie
SAVEPOINT Defineste un punct de salvare, in locul in care tranzactia salveaza toate
operatiile effectuate pana in momentul respective, inainte de a continua
urmatorul set de modificari effectuate in baza de date.

4) Comenzi LCD (Limbaj de Control al Datelor - Data Control Language)

Comanda Scop
GRANT Acorda utilizatorilor drepturile necesare pentru accesul si manipularea
obiectelor din baza de date
REVOKE Anuleaza anumite drepturi utilizatorilor

3
BAZE DE DATE – SINTEZA
___________________________________________________________________________

PARTEA I. Comenzi LDD

Comanda Scop
CREATE Creaza un obiect nou: TABLE, INDEX, CLUSTER, TABLESPACE,
SEQUENCE, VIEW, MATERIALIZED VIEW, USER, ROLE,
PROCEDURE, FUNCTION, TRIGGER
ALTER Modifica o parte dintre proprietatile unui obiect
DROP Sterge un obiect din baza de date

CREAREA SI GESTIUNEA TABELELOR

1.1. CREAREA TABELELOR – COMANDA CREATE TABLE

Pentru a crea o tabela se specifica urmatoarele:


- definitiile atributelor
- modul de organizare a tabelei
- restrictiile de integritate
- spatiul de tabela
- caracteristicile de stocare
- clusterul
- datele daca se preiau dintr-o alta tabela
- definitiile partitiilor

RESTRICTII DE INTEGRITATE
- Tipuri de restrictii:
o NOT NULL
o UNIQUE
o PRIMARY KEY
o FOREIGN
o CHECK
- Precizarea restrictiilor se poate face in 2 moduri: in-line la definirea coloanei pe care
se impune restrictia si out-of-line separat, fie la sfarsitul sintaxei create table, fie prin
comanda alter

Definirea restricţiilor – se poate realiza la nivel de câmp (in-line) sau la nivelul tabelei (out-of-
line):
Sintaxa generală:

Constraint nume_restricţie tip_restricţie [ (câmpurile cărora li se aplică restricţia)]

Tipuri de restricţii:

1. Restricţia de tip PRIMARY KEY:


Constraint nume_restricţie PRIMARY KEY [ (câmpuri care formează cheia primară)]

2. Restricţia de tip FOREIGN KEY:

4
BAZE DE DATE – SINTEZA
___________________________________________________________________________

Constraint nume_restricţie FOREIGN KEY (câmpul cheie externă) REFERENCES


Tabelă_părinte (câmp cheie primară)

3. Restricţia de tip NOT NULL:


Se defineşte numai la nivelul câmpului căruia i se aplică restricţia:

Ex: nume VARCHAR2(20) NOT NULL

4. Restricţia de tip UNIQUE:


Constraint nume_restricţie UNIQUE [ (câmp cheie unică)]

5. Restricţia de tip CHECK:


Constraint nume_restricţie CHECK [ (condiţie asupra unui câmp)]

Exemplu – crearea tabelelor pentru BD indicata in pagina 1.

DROP TABLE FIRME CASCADE CONSTRAINTS;


DROP TABLE AGENTI CASCADE CONSTRAINTS;
DROP TABLE COMENZI CASCADE CONSTRAINTS;
DROP TABLE RINDCOM CASCADE CONSTRAINTS;
DROP TABLE PRODUSE CASCADE CONSTRAINTS;

create table firme


(codfirma number(2) constraint PKey_firme primary key,
denfirma varchar2(20) not null,
loc varchar2(20),
contbanca varchar(15),
zona varchar2(15) CONSTRAINT FZONA_CK check (zona in
('MOLDOVA','ARDEAL','BANAT','MUNTENIA','DOBROGEA','TRANSILVANIA')));

create table agenti


(codagent varchar2(3) constraint pk_agent primary key,
numeagent varchar2(25) not null,
dataang date default sysdate,
datanast date,
zona varchar2(15) CONSTRAINT AGZONA_CK check (zona
in('MOLDOVA','ARDEAL','BANAT','MUNTENIA','DOBROGEA', 'TRANSILVANIA')),
functia varchar2(20),
codsef varchar2(3));

create table comenzi


(nrcom number(4) constraint pk_comenzi primary key,
codfirma number(2) not null,
codagent varchar2(3) not null,
data date default sysdate,
CONSTRAINT FKAgent FOREIGN KEY (codagent) REFERENCES agenti(codagent),
CONSTRAINT FKFirme FOREIGN KEY (codfirma) REFERENCES firme(codfirma));

create table produse

5
BAZE DE DATE – SINTEZA
___________________________________________________________________________

(codprodus number(3) constraint pk_produse primary key,


denprodus varchar2(20) not null,
um varchar2(3),
stoc number(4));

create table rindcom


(nrcom number(4),
codprodus number(3) not null,
cant number(10),
pret number(8),
termenliv date,
CONSTRAINT FKComenzi FOREIGN KEY (nrcom) REFERENCES comenzi(nrcom),
CONSTRAINT FKProduse FOREIGN KEY (codprodus) REFERENCES
produse(codprodus));

CREAREA UNEI TABELE PE BAZA CAMPURILOR DIN ALTA TABELA:

CREATE TABLE nume_tabela


AS
SELECT [*, nume campuri] FROM nume_tabela_sursa
WHERE [conditie];

Exemplu: Tabela firme_buc va contine firmele din Bucuresti


CREATE TABLE FIRME_BUC
AS
SELECT * FROM FIRME
WHERE LOC='BUCURESTI';

COMANDA DESCRIBE SAU DESC – PERMITE VIZUALIZAREA STRUCTURII UNEI


TABELE

Exemplu: Sa se vizualizeze structura tabelei AGENTI;

DESC AGENTI;

1.2. MODIFICAREA STRUCTURII TABELELOR - COMANDA ALTER

Realizeaza urmatoarele:
- Modificarea structurii tabelei: ADD, MODIFY, DROP COLUMN, SET UNUSED
- Modificarea restrictiilor de integritate: ADD, MODIFY, DROP, DISABLE
CONSTRAINT
- Redenumeste tabela: RENAME

ALTER TABLE nume_tabelă

6
BAZE DE DATE – SINTEZA
___________________________________________________________________________

- ADD (definire câmpuri);


- MODIFY (redefinire câmpuri existente);
- DROP COLUMN câmp;
- ADD CONSTRAINT nume_restricţie TIP_RESTRICŢIE ….;
- DROP CONSTRAINT nume_restricţie;
- DISABLE CONSTRAINT nume_restricţie;
- ENABLE CONSTRAINT nume_restricţie;
- RENAME TO nume_nou_tabelă;

Exemple - dupa fiecare comanda vizualizati structura tabelei cu DESCRIBE sau DESC:

ALTER TABLE agenti RENAME TO personal;


Sau
RENAME AGENTI TO PERSONAL;

ALTER TABLE PERSONAL


ADD (EMAIL VARCHAR2(10),
VARSTA NUMBER(2));

ALTER TABLE PERSONAL


MODIFY (EMAIL VARCHAR2(30));

ALTER TABLE PERSONAL


DROP COLUMN EMAIL;

ALTER TABLE PERSONAL


SET UNUSED COLUMN FUNCTIA;

ALTER TABLE PERSONAL


DROP UNUSED COLUMNS;

ALTER TABLE PERSONAL


ADD (CONSTRAINT check_varsta CHECK (varsta>18 and varsta<60));

ALTER TABLE PERSONAL


DISABLE CONSTRAINT check_varsta;

ALTER TABLE PERSONAL


DROP CONSTRAINT check_varsta;

1.3. STERGEREA TABELELOR – COMANDA DROP

7
BAZE DE DATE – SINTEZA
___________________________________________________________________________

DROP permite stergera unei tabele.

DROP TABLE PERSONAL;


SAU
DROP TABLE PERSONAL CASCADE CONSTRAINTS;

PARTEA II - ACTUALIZAREA TABELELOR PRIN COMENZI LMD

Comanda Scop
INSERT Adauga o noua inregistrare in tabela
SELECT Regaseste inregistrari in tabele sau vederi.
DELETE Sterge inregistrari din tabele
UPDATE Modifica valorile unor inregistrari din tabele

Dupa actualizarea datelor se va utiliza comanda select * from [nume_tabela_actualizata];


pentru a vizualiza rezultatel!

2.1. ADAUGAREA DATELOR – COMANDA INSERT

Datele se pot adauga in tabele in mai multe moduri:


- precizand explicit in sintaxa comenzii valorile
- cu ajutorul variabilelor de substitutie
- pe baza valorilor din alte tabele

Precizarea explicita a valorilor introduse se realizeaza cu comanda:

INSERT INTO TABELA VALUES ([LISTA DE VALORI PENTRU FIECARE


ATRIBUT]);

Exemplu - adaugarea inregistrarilor in tabelele create din schema BD indicata in pag.1

insert into firme values('10','SC ALFA SRL','Cluj','bcr1000','TRANSILVANIA');


insert into firme values('20','SC MEDIA SA','Bucuresti','brd1111','MUNTENIA');
insert into firme values('30','SC SOFTY SRL','Ploiesti','bcr2222','MUNTENIA');
insert into firme values('40','SC MEGA SRL','Iasi','brd3333','MOLDOVA');
insert into firme values('50','SC STAR SA','Timisoara','bcr4444','BANAT');
insert into firme values('60','SC Sas SA','Timisoara','bcr333','BANAT');

insert into agenti


values('1','Toma Alina',to_date('feb 3,04','mon dd,yy'),to_date('jan 23,44','mon
dd,yy'),'BANAT','ECONOMIST','2');
insert into agenti
values('2','Rotaru Maria',to_date('apr 12,03','mon dd,yy'),to_date('feb 13,54','mon
dd,yy'),'MOLDOVA','DIRECTOR','2');
insert into agenti

8
BAZE DE DATE – SINTEZA
___________________________________________________________________________

values('3','Popescu Ionel',to_date('may 30,04','mon dd,yy'),to_date('Sep 3,65','mon


dd,yy'),'MUNTENIA','CONTABIL','1');

insert into produse


values('111','napolitane','buc','1000');
insert into produse
values('222','ciocolata','buc','4000');
insert into produse
values ('333','biscuiti','pac','3000');
insert into produse
values('444','servetele','pac','1100');

insert into comenzi


values('100','10','2',to_date('oct 12,04','mon dd,yy'));
insert into comenzi
values('200','20','3',to_date('oct 6,04','mon dd,yy'));
insert into comenzi
values('300','40','1',to_date('nov 30,04','mon dd,yy'));
insert into comenzi
values('400','30','2',to_date('dec 12,04','mon dd,yy'));
insert into comenzi
values('500','50','1',to_date('jan 15,05','mon dd,yy'));

insert into rindcom


values('100','111','150','5000',to_date('oct 31,04','mon dd,yy'));
insert into rindcom
values('200','222','300','20000',to_date('nov 30,04','mon dd,yy'));
insert into rindcom
values('300','444','1000','1500',to_date('dec 25,04','mon dd,yy'));
insert into rindcom
values('300','111','200','5000',to_date('jan 31,05','mon dd,yy'));
insert into rindcom
values('400','333','1500','5000',to_date('jan 31,05','mon dd,yy'));
insert into rindcom
values('500','111','100','5000',to_date('feb 20,05','mon dd,yy'));

Atentie! Pt dataang si datanast se va utiliza functia de conversie to_date.


Ex: to_date('jan 20,05','mon dd,yy')
Ex: to_date('15.10.2018','dd.mm.yyyy')

b) adaugarea datelor pe baza valorilor din alte tabele:

INSERT INTO TABELA SELECT [LISTA DE CAMPURI]


FROM TABELA_SURSA
WHERE [CONDITIE];

Exemple:

9
BAZE DE DATE – SINTEZA
___________________________________________________________________________

Sa se creeze tabela STOC_MIN cu aceeasi structura cu a tabelei PRODUSE care sa contina


informatii depre produsele cu stocul mai mic decat 1000 unitati.

Create table stoc_min


as select * from produse where 2=3;

Insert into stoc_min select *


from produse where stoc<=1000;

2.2. MODIFICAREA DATELOR – COMANDA UPDATE

Sintaxa este:
UPDATE [TABELA]
SET [COLOANA] = [VALOARE]
WHERE [CONDITIE];

Exemple:
Sa se scada cu 100 de pachete stocul de servetele:

UPDATE PRODUSE
SET STOC=STOC-100
WHERE lower(denprodus)='servetele';

SELECT * FROM PRODUSE;

Sa se modifice pretul si stocul produsului 333 cu pretul si stocul produsului cu codul 111:

UPDATE PRODUSE
SET (PRET,STOC)=(SELECT PRET, STOC FROM PRODUSE
WHERE CODPRODUS='111')
WHERE CODPRODUS='333';

Sa se modifice pretul si stocul produselor cu pretul si stocul produsului cu codul 111, dar
numai pentru produsele aflate in comanda cu nr 400:

UPDATE PRODUSE
SET (PRET,STOC)=(SELECT PRET, STOC FROM PRODUSE WHERE
CODPRODUS='111')
WHERE CODPRODUS IN (SELECT CODPRODUS FROM RINDCOM WHERE
NRCOM=400);

2.3. STERGEREA DATELOR – COMANDA DELETE

Sintaxa este:
DELETE FROM [TABELA]
WHERE [CONDITIE];

10
BAZE DE DATE – SINTEZA
___________________________________________________________________________

Exemple:
Sa se stearga produsele comandate pt care cant<200;

DELETE FROM rindcom


WHERE cant<200;

Sa se stearga produsele comandate pt care termen livrare>feb 2005:

DELETE FROM rindcom


WHERE termenliv>TO_DATE('01-02-05','DD-MM-YY');

Sa se stearga toate inregistrarile din tabela stoc_min:

DELETE FROM stoc_min;

2.4. SELECTIA DATELOR – COMANDA SELECT

SELECT – realizeza selectia si regasirea datelor din tabele

SELECT [DISTINCT] { * , tabelă1.câmp1 [alias] , expresii AS ALIAS ...}


FROM tabelă1, tabelă2,....
WHERE {condiţii, precizarea legăturilor dintre tabele}
GROUP BY tabelă .câmp
HAVING {condiţii impuse valorilor de grup}
ORDER BY tabelă .câmp ASC/DESC;

unde:
SELECT specifică atributele selectate;
DISTINCT suprimă valorile duplicate;
* selectează toate atributele;
atribut selectează coloana numită;
expresie permite construirea de expresii si valori noi
alias denumiri pentru atributele selectate;
FROM tabele specifică tabelele ce conţin coloanele selectate.
WHERE clauza permite specificarea conditiilor si a criteriilor de selectie
a datelor
GROUP BY se precizeaza campul dupa care vor fi grupate datele in cazul
expresiilor si functiilor de grup (SUM(), AVG(), COUNT(),
MIN(), MAX())
HAVING in cazul functiilor de grup conditiile impuse acestora se
precizeaza in clauza HAVING
ORDER BY precizeaza ordonarea in functie un anumite campuri ascendent
(ASC) –implicit sau descendent (DESC)

Frazele SQL:
Nu sunt case sensitive;

11
BAZE DE DATE – SINTEZA
___________________________________________________________________________

Pot fi scrise pe mai multe linii;


Cuvintele cheie nu pot fi prescurtate sau scrise pe mai multe linii.

In construirea frazelor SQL se utilizeaza urmatorii operatori:

<, >, =, >=, <=, NOT Operatori de comparatie


BETWEEN ... AND ... între două valori (inclusiv).
SELECT codprodus, cant FROM rindcom WHERE cant BETWEEN 10 AND 15;
IN(listă) egal cu oricare valoare din listă
SELECT codagent, numeagent FROM agenti WHERE codagent IN ('1', '3');
SELECT codprod, cant FROM rindcom WHERE cant IN (400,500,1000);
LIKE similar cu un şablon
% - oricâte caractere; _ - un caracter;
SELECT denfirma, loc FROM firme WHERE loc LIKE 'B%';
SELECT denfirma, loc FROM firme WHERE loc LIKE '_I%';
IS NULL are valoarea NULL
SELECT denfirma, loc FROM firme WHERE loc IS NULL;

- Atributele se specifică în ordinea în care se doresc a fi afişate, nu obligatoriu în ordinea în


care apar în descrierea tabelelor.
- Afişarea se face implicit cu litere mari, la stânga pentru datele de tip dată calendaristică şi
caracter, şi la dreapta pentru datele numerice.
- Valoarea NULL, ca şi în alte limbaje, semnifică valoare ne-disponibilă, ne-alocată, şi nu
este acelaşi lucru cu „blank” sau „zero”.
- Cu ajutorul frazelor select se pot extrage informaţii din baza de date.
- Utilizând această instrucţiune se pot realiza toate cele trei operaţii specifice modelului
relaţional.

Selecţia: Operator unar, prin care se obţine o nouă relaţie care conţine toate
atributele relaţiei iniţiale şi un număr redus de tupluri. Reducerea se face
după o condiţie numită condiţie de selecţie.

Proiecţia: Operator unar, prin care se obţine o nouă relaţie care conţine un număr
redus de atribute faţă de relaţia iniţială şi toate valorile sau combinaţiile
distincte de valori ale acestor atribute. Atributele care se regăsesc în

12
BAZE DE DATE – SINTEZA
___________________________________________________________________________

relaţia rezultată se numesc atribute de proiecţie.

Joncţiunea: Operator binar, caz particular de produs cartezian. Relaţia rezultat va


conţine tuplurile corespunzătore atributelor de join care se află într-o
anumită relaţie. Cel mai utilizat caz de joncţiune este acela în care
atributele de join au aceeaşi semnificaţie, relaţia în care acestea trebuie să
se afle este de egalitate, unul dintre atribute e cheie primară într-una
dintre relaţii, iar celălalt este cheie externă.

EXEMPLE:
1. Sa se selecteze toti agentii din tabela agenti:

SELECT * FROM agenti;

2. Sa se selecteze campurile codagent, numeagent si zona din tabela agenti:

SELECT codagent, numeagent, zona FROM agenti;

3. Sa se selecteze numai firmele din Bucuresti:

SELECT * FROM firme


WHERE upper(loc) LIKE '%BUCURESTI%';

4. Sa se selecteze comenzile incheiate de agentul cu codul = 1:

SELECT * FROM comenzi


WHERE codagent = 1;

Realizarea Join-urilor (joncţiunilor) între relaţii. Tipuri de join-uri

a. Join de egalitate (de echivalenţă - equijoin)

5. Sa se selecteze comenzile emise de agentii societatii (in clauza WHERE se va preciza


conditia de legatura dintre tabele)

SELECT agenti.*, comenzi.*

13
BAZE DE DATE – SINTEZA
___________________________________________________________________________

FROM agenti, comenzi


WHERE agenti.codagent= comenzi.codagent;

6. Sa se selecteze comenzile incheiate de agentul ‘Toma Alina’ numai in luna octombrie:

SELECT agenti.*, comenzi.*


FROM agenti, comenzi
WHERE agenti.codagent = comenzi.codagent
AND lower(comenzi.data) like '%oct%'
AND upper(agenti.numeagent) = 'TOMA ALINA';

7. Sa se calculeze valoarea fiecarui produs (val_prod =cant* pret) si sa se afiseze pretul,


cantitatea, valoarea si stocul disponibil:

SELECT produse.denprodus, rindcom.cant, rindcom.pret,


rindcom.cant * rindcom.pret AS Val_Prod, produse.stoc
FROM produse, rindcom
WHERE produse.codprodus= rindcom. codprodus;

8. Sa se selecteze numai produsele cu valoarea cuprinsa intre 1 si 3 mil:

SELECT produse.denprodus, rindcom.cant, rindcom.pret,


rindcom.cant * rindcom.pret AS Val_Prod, produse.stoc
FROM produse, rindcom
WHERE produse.codprodus= rindcom. codprodus
and rindcom.cant * rindcom.pret BETWEEN 500000 AND 2000000;

b. Join extern

9. Să se afişeze codul produsului, denumirea produsului şi cantitatea comandata


corespunzatoare:

SELECT p.codprodus, p.denprodus, rc.cant, rc.pret


FROM produse p, rindcom rc
WHERE p.codprodus = rc.codprodus (+);

c. Join tabelă cu aceeaşi tabelă

10. Să se afişeze numele fiecarui agent şi numele sefului direct superior:

SELECT agent.numeagent||' lucreaza pentru: '||sefi. numeagent


FROM agenti agent, agenti sefi
WHERE agent.codsef=sefi.codagent;

Realizarea Subcererilor (se utilizeaza 2 fraze SELECT imbricate)

11. Sa se selecteze firmele care sunt in aceaasi zona cu firma SC MEDIA SA:

SELECT * FROM firme


WHERE zona =

14
BAZE DE DATE – SINTEZA
___________________________________________________________________________

(SELECT zona FROM firme WHERE denfirma= 'SC MEDIA SA');

12. Să se afişeze produsele care au preţul unitar cel mai mic:

SELECT p.denprodus, rc.pret


FROM produse p, rindcom rc
WHERE p.codprodus = rc.codprodus
And rc.pret=(select min(rindcom.pret) from rindcom);

FUNCTII

 Funcţii single-row (sau scalare). O funcţie single-row întoarce un singur rând rezultat
pentru fiecare rând al tabelei interogate sau view
 Funcţii de grup (sau agregate). O funcţie de grup întoarce un singur rând rezultat pentru
un grup de rânduri interogate. Funcţiile de grup pot apare în clauza HAVING

FUNCŢII DE GRUP

AVG([DISTINCT|ALL] n) – calculeaza media elementelor


COUNT({* | [DISTINCT|ALL] expr}) – intoarce numarul total al elementelor
MAX([DISTINCT|ALL] expr) – intoarce elementul maxim
MIN([DISTINCT|ALL] expr) – intoarce elementul minim
SUM([DISTINCT|ALL] n) - calculeaza suma elementelor

Se utilizeaza urmatoarele clauze:


GROUP BY – grupeaza datele in functie de un anumit camp;
ORDER BY – ordoneaza datele in functie de un anumit camp;
HAVING – permite stabilirea unor criterii de selectie asupra functiilor de grup;

13. Să se afişeze valoarea maximă, valoarea medie, valoarea minimă şi valoarea totală a
produselor comandate:

SELECT avg(rc.cant * rc.pret), max(rc.cant * rc.pret), min(rc.cant * rc.pret),


sum(rc.cant * rc.pret)
FROM rindcom rc;

14. Să se afişeze data primei comenzi încheiate şi data celei mai vechi comenzi încheiate:

SELECT min(data), max(data)


FROM comenzi;

15. Să se afişeze numărul de produse al căror stoc>200:

SELECT count(*) Nr_prod FROM produse WHERE stoc>200;

16. Să se afişeze numărul total de comenzi incheiate:

15
BAZE DE DATE – SINTEZA
___________________________________________________________________________

SELECT count(nrcom) Numar_Comenzi FROM comenzi;

17. Să se afişeze numărul de produse vândute:

SELECT count(distinct(codprodus)) Produse_Vandute FROM rindcom;

18. Să se afişeze cantitatea medie vândută din fiecare produs şi să se realizeze ordonarea
în funcţie de aceasta (se utilizeaza functia AVG() si clauza GROUP BY pt gruparea
datelor in functie de produse, iar ordonarea se realizeaza cu ajutorul functiei ORDER
BY ).

SELECT codprodus, avg(cant) Medie_Prod FROM rindcom


GROUP BY codprodus
ORDER BY avg(cant);

19. Să se afişeze produsele şi cantitatea medie vândută numai acele produse a căror
cantitate medie este mai mare de 1500 (conditia se specifica in clauza HAVING si nu
in clauza WHERE deoarece este utilizata functia de grup AVG si conditia este
avg(cant)>800)

SELECT codprodus, avg(cant) FROM rindcom


GROUP BY codprodus
HAVING avg(cant)>800;

20. Sa se calculeze valoarea totala a fiecarei comenzi si sa se sorteze descrescator in


functie de valoare:

SELECT comenzi.nrcom, SUM(rindcom.cant * rindcom.pret) Total_Comanda


FROM comenzi, rindcom
WHERE rindcom.nrcom=comenzi.nrcom
GROUP BY comenzi.nrcom
ORDER BY Total_Comanda DESC;

21. Sa se afiseze numai comenzile care au valoarea cuprinsa intre 3 si 5 mil (conditia va fi
mentionata in clauza HAVING pt ca se utilizeaza o functie de grup - SUM):

SELECT comenzi.nrcom, SUM(rindcom.cant * rindcom.pret) Total_Comanda


FROM comenzi, rindcom
WHERE rindcom.nrcom=comenzi.nrcom
GROUP BY comenzi.nrcom
HAVING SUM(rindcom.cant * rindcom.pret) BETWEEN 1000000 AND 3000000
ORDER BY Total_Comanda DESC;

16
BAZE DE DATE – SINTEZA
___________________________________________________________________________

FUNCTII SINGLE-ROW

Funcţii de tip caracter

Operatorul de concatenare ( || )

22. Să se afişeze denumirea produsului şi stocul disponibil

SELECT 'produsul: ' || initcap(denprodus)|| ' are stocul diponibil ' || stoc
FROM produse;

Functia LOWER() , UPPER()

23. Sa se afiseze firmele din zona ‘muntenia’:

SELECT codfirma, upper(denfirma), upper(loc), upper(zona)


FROM firme
WHERE lower(zona)= 'muntenia';

Funcţia CONCAT() , funcţia LENGTH() , funcţia SUBSTR()

24. Să se afişeze denumirea firmei concatenată cu localitatea şi lungimea atributului


denumirea firmei, numai pentru localităţile al căror nume începe cu “C”

SELECT denfirma, concat(denfirma,loc), length(denfirma)


FROM firme
WHERE substr(loc,1,1)='C';

Funcţii de tip numeric

Funcţia ROUND()

25. Să se afişeze numărul 45,923 rotunjit la două zecimale

SELECT round(45.923,2), round(45.923,0) FROM dual;

Funcţii de tip dată calendaristică

Funcţile SYSDATE

26. Să se afişeze perioada de timp corespunzătoare (în săptămâni) între data încheierii
comenzii şi data curentă:

SELECT nrcom, round((sysdate-data)/7) saptamani


FROM comenzi;

27. Afisati data curenta (se selecteaza data din tabela DUAL):

17
BAZE DE DATE – SINTEZA
___________________________________________________________________________

SELECT sysdate DATA_CURENTA FROM DUAL;

Funcţiile MONTH_BETWEEN() , ADD_MONTHS() , NEXT_DAY() , LAST_DAY()

28. Să se afişeze comenzile, data încheierii comenzilor, numărul de luni între data curentă
şi data încheierii, următoarea zi de vineri după data încheierii, ultima zi din luna din care
face parte data încheierii, precum şi data corespunzătoare după 2 luni de la data încheierii

SELECT nrcom, data,


round(MONTHS_BETWEEN(sysdate, data)) luni,
ADD_MONTHS(data,2),
NEXT_DAY(data, 'FRIDAY'), LAST_DAY(data)
FROM comenzi;

29. Să se afişeze comenzile incheiate in luna trecuta:

SELECT nrcom, data FROM comenzi


WHERE round(MONTHS_BETWEEN(sysdate, data))=1;

Funcţia ROUND()

30. Să se afişeze comenzile incheiate in 2004. Se va rotunji data încheierii la prima zi din
luna corespunzătoare dacă data încheierii este în prima jumatate a lunii sau la prima zi din
luna următoare:

SELECT nrcom, data, ROUND(data, 'MONTH')


FROM comenzi
WHERE data LIKE '%04';

Funcţii de conversie

Funcţia TO_CHAR(d [, fmt ])

31. Să se afişeze comenzile şi data încheierii in format “MM/YY”

SELECT nrcom, TO_CHAR(data, 'MM/YY') data_incheierii


FROM comenzi;

Funcţia TO_DATE(char [, fmt ]) – vezi exemple de utilizare in comenzile INSERT (pag.8-9)

Funcţia TO_NUMBER(char [,fmt ])

Funcţia EXTRACT ()

32. Să se afişeze informaţii despre comenzile încheiate în anul 2004

SELECT nrcom, data


FROM comenzi
WHERE EXTRACT (YEAR from data) = 2004;

18
BAZE DE DATE – SINTEZA
___________________________________________________________________________

CREAREA UNEI TABELE PE BAZA CAMPURILOR DIN ALTA TABELA:

CREATE TABLE nume_tabela


AS
SELECT [*, nume campuri]
FROM nume_tabela_sursa
[WHERE conditie];

Exemplu: Tabela firme_buc va contine firmele din Bucuresti


CREATE TABLE FIRME_BUC
AS
SELECT * FROM FIRME
WHERE LOC='BUCURESTI';

ADAUGAREA DATELOR PE BAZA VALORILOR DIN ALTE TABELE:

INSERT INTO nume_tabela


SELECT [*, nume campuri]
FROM nume_tabela_sursa
[WHERE conditie];

Exemple:

Sa se creeze tabela STOC_MIN cu aceeasi structura cu a tabelei PRODUSE care sa contina


informatii depre produsele cu stocul mai mic decat 1000 unitati.

Create table stoc_min as select * from produse where 2=3;

INSERT INTO STOC_MIN


SELECT *
FROM PRODUSE
WHERE STOC<=1000;

select * from stoc_min;

19
BAZE DE DATE – SINTEZA
___________________________________________________________________________

GESTIUNEA ALTOR OBIECTE ALE BAZEI DE DATE

1. TABELE VIRTUALE

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW nume_view


AS
subcerere
[WITH READ ONLY]

Sa se realizeze o tabela virtuala cu toate firmele din Bucuresti:

CREATE VIEW firme_buc_v


AS
SELECT * FROM firme
WHERE upper(loc)='BUCURESTI';

SELECT * FROM firme_buc_v;

Sa se realizeze o tabela virtuala care sa contina numai produsele pentru care unitatea de
masura (um)=’buc’.

CREATE VIEW PROD_BUC_V


AS
SELECT codprodus COD_PRODUS, denprodus DENUMIRE, um UNITATE
FROM produse
WHERE um='buc';

SELECT * FROM PROD_BUC_V;

Sa se stearga inregistrarile din tabela virtuala PROD_BUC_V pentru produsele care au stocul
mai mare de 1000.

DELETE FROM PROD_BUC_V


WHERE STOC>1000;

Sa realizeze o tabela virtuala cu toti agentii din Muntenia. Tabela virtuala nu va putea fi
actualizata:

CREATE VIEW agenti_zona_v


AS SELECT * FROM agenti
WHERE upper(zona)='MUNTENIA'
WITH READ ONLY;

SELECT * FROM firme_buc_v;

Sa se stearga tabela virtuala PROD_BUC_V:

DROP VIEW PROD_BUC_V;

Vizualizarea informatiilor despre tabelele virtuale:

20
BAZE DE DATE – SINTEZA
___________________________________________________________________________

SELECT VIEW_NAME, TEXT FROM USER_VIEWS;

2. INDECSI

- Permit accesul rapid la date prin sortarea logica a inregistrarilor.


- Sunt gestionati automat de catre serverul Oracle.
- Se creaza automat la introducerea unei restrictii de cheie primara sau de unicitate sau
manual de catre utilizator.

CREATE INDEX nume_index ON Nume_tabelă (câmp);

DROP INDEX nume_index;

Exemple:
Sa se creeze un index pe tabela agenti pe coloana numeagent:
CREATE INDEX AGENTI_NUMEAG_IDX ON AGENTI(NUMEAGENT);

Vizualizarea inecsilor unui anumit utilizator:


Select * from user_indexes;

Sa se strearga indexul creat anterior:


DROP INDEX AGENTI_NUMEAG_IDX;

3. SECVENTE

- Sunt utilizate pentru asigurarea unicitatii cheilor primare sau a valorilor pentru care s-a
impus o restrictie de tip UNIQUE.
- Pot fi utilizate pentru mai multe tabele.
- Pentru fiecare secventa se va preciza valoarea de inceput, pasul de incrementare si
valoarea maxima generate.

CREATE SEQUENCE nume_secvenţă


STRAT WITH valoare_iniţială
INCREMENT BY pasul_de_incrementare
MAXVALUE valoare_maximă
NOCYCLE;

ALTER SEQUENCE nume_secvenţă …...;

DROP SEQUENCE nume_secvenţă;

Exemple:

Sa se creeze o secventa pentru asigurarea unicitatii cheii primare din tabela Comenzi.

Create sequence seq_nrcomanda


start with 500 Increment by 10

21
BAZE DE DATE – SINTEZA
___________________________________________________________________________

Maxvalue 1000 nocycle;

Insert into comenzi values (seq_nrcomanda.nextval, '10', '3', to_date('oct 12,05', 'mon dd,yy'));

Sa se afiseze valoarea curenta a secventei:


Select seq_rcomanda.currval from dual;

Sa se modifice pasul de incrementare pentru secventa anterioara:


Alter sequence seq_nrcomanda increment by 100;

Sa se strearga secventa seq_rcomanda:


Drop sequence seq_rcomanda;

Sa se vizualizeze informatiile depre secventele utilizatorilor:


Select * from user_sequences;

4. SINONIME

- Sunt nume alternative utilizate pentru referirea obiectelor unei baze de date
- Pot fi sinonime publice (accesibile tuturor utilizatorilor) sau private.
- Sinonimele publice pot fi create numai de administratorul bazei de date

CREATE SYNONYM nume_sinonim FOR nume_tabelă;

DROP SYNONYM nume_sinonim;

Exemple:
Sa se creeze un sinonim pentru tabela rindcom:
Create synonym detalii_comanda for rindcom;

Sa se strearga sinonimul creat anterior:


Drop synonym detalii_comanda;

Vizualizarea sinonimelor se realizeaza astfel


Select * from user synonyms;

22

S-ar putea să vă placă și