Sunteți pe pagina 1din 30

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________

I. BAZE DE DATE Noiuni 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 - 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

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________

II. NUCLEUL SQL*PLUS


Limbajul SQL Structured Query Language este un limbaj standard de interogare a bazelor de date. Implementat n majoritatea SGBD-urilor, dar nu numai. In ORACLE este implementat nucleul SQL cu anumite particularitati. 1. Tipuri de date: TIP VARCHAR2(size) NUMBER(p,s) LONG DATE RAW(size) LONG RAW ROWID CHAR(size) BLOB BFILE 2. Operatori SQL Operator <, >, =, >=, <=, NOT BETWEEN ... AND ... IN(list) LIKE IS NULL Caracteristici Operatori de comparatie ntre dou valori (inclusiv). egal cu oricare valoare din list similar cu un ablon % - oricte caractere; _ - un caracter; are valoarea NULL Caracteristici sir de caractere de lungime variabila Numeric: p (precision) = 1..38, s (scale) =-84..127 sir de caractere de lung>2GB data calendaristica date de tip binar. Maxim size este 2000 bytes. lungime variabila > 2GB se stocheaza grafice, sunete, documente adresa fiecarui rind din tabela sir de caractere de lungime fixa binary large object (max 4GB) se stocheaza date nestructurate (text,imagine, video, date spatiale) contine un pointer catre un fisier binar stocat in afara bazei de date

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 CREATE ALTER DROP Scop Creaza un obiect nou (tabela, utilizator, rol, etc) Modifica o parte dintre proprietatile unui obiect Elimina un obiect din baza de date

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ 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 GRANT REVOKE Scop Acorda utilizatorilor drepturile necesare pentru accesul si manipularea obiectelor din baza de date Anuleaza anumite drepturi utilizatorilor

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________

PARTEA I. Comenzi LDD


Comanda CREATE ALTER DROP Scop Creaza un obiect nou: TABLE, INDEX, CLUSTER, TABLESPACE, SEQUENCE, VIEW, MATERIALIZED VIEW, USER, ROLE, PROCEDURE, FUNCTION, TRIGGER Modifica o parte dintre proprietatile unui obiect 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 Exemplu crearea tabelelor pentru aplicatia utilizata la seminar. Descarcati de pe site scriptul CR_TABELE ! Scriptul se executa cu ajutorul comenzii: @ C:\ [cale director] \ nume_fisier . extensie 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;

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ 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 (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];

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ 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

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));
6

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ ALTER TABLE PERSONAL DISABLE CONSTRAINT check_varsta; ALTER TABLE PERSONAL DROP CONSTRAINT check_varsta;

1.3. STERGEREA TABELELOR COMANDA DROP


DROP permite stergera unei tabele. DROP TABLE PERSONAL; SAU DROP TABLE PERSONAL CASCADE CONSTRAINTS;

VIZUALIZAREA OBIECTELOR CE APARTIN UNUI ANUMIT UTILIZATOR: SELECT * FROM USER_TABLES; SELECT TABLE_NAME, cluster_name FROM USER_TABLES; SELECT * FROM USER_CATALOG; SELECT DISTINCT OBJECT_TYPE FROM USER_OBJECTS; SELECT TABLE_NAME, CONSTRAINT_TYPE, CONSTRAINT_NAME FROM USER_CONSTRAINTS; SELECT TABLE_NAME , COMMENTS FROM USER_TAB_COMMENTS;

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ EXERCIII COMENZI LDD

1. CREAREA TABELELOR COMANDA CREATE TABLE


CREATE TABLE nume_tabel ( .... definirea cmpurilor i a tipurilor de date aferente definirea restriciilor de integritate ); Definirea restriciilor se poate realiza la nivel de cmp (in-line) sau la nivelul tabelei (outof-line): Sintaxa general: Constraint nume_restricie tip_restricie [ (cmpurile crora li se aplic restricia)] Tipuri de restricii: 1. Restricia de tip PRIMARY KEY: Constraint nume_restricie PRIMARY KEY [ (cmpuri care formeaz cheia primar)] 2. Restricia de tip FOREIGN KEY: Constraint nume_restricie FOREIGN KEY (cmpul cheie extern) REFERENCES Tabel_printe (cmp cheie primar) 3. Restricia de tip NOT NULL: Se definete numai la nivelul cmpului cruia i se aplic restricia: Ex: nume VARCHAR2(20) NOT NULL 4. Restricia de tip UNIQUE: Constraint nume_restricie UNIQUE [ (cmp cheie unic)] 5. Restricia de tip CHECK: Constraint nume_restricie CHECK [ (condiie asupra unui cmp)]

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 - ADD (definire cmpuri);

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ MODIFY (redefinire cmpuri existente); DROP COLUMN cmp; ADD CONSTRAINT nume_restricie TIP_RESTRICIE .; DROP CONSTRAINT nume_restricie; DISABLE CONSTRAINT nume_restricie; ENABLE CONSTRAINT nume_restricie; RENAME TO nume_nou_tabel;

3. STERGEREA TABELELOR COMANDA DROP


DROP TABLE nume_tabel CASCADE CONSTRAINTS;

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________

PARTEA II - ACTUALIZAREA TABELELOR PRIN COMENZI LMD


Comanda INSERT SELECT DELETE UPDATE Scop Adauga o noua inregistrare in tabela Regaseste inregistrari in tabele sau vederi. Sterge inregistrari din tabele 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 - vezi scriptul pentru adaugarea inregistrarilor in tabelele utilizate ca exemplu. Descarcati de pe site scriptul INS_TABELE.SQL! 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 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');
10

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ 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') b) adaugarea datelor pe baza valorilor din alte tabele: INSERT INTO TABELA SELECT [LISTA DE CAMPURI] FROM 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;

11

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________

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]; 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

12

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ 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] { * , tabel1.cmp1 [alias] , expresii AS ALIAS ...} FROM tabel1, tabel2,.... WHERE {condiii, precizarea legturilor dintre tabele} GROUP BY tabel .cmp HAVING {condiii impuse valorilor de grup} ORDER BY tabel .cmp ASC/DESC; unde: SELECT DISTINCT * atribut expresie alias FROM tabele WHERE GROUP BY HAVING ORDER BY specific atributele selectate; suprim valorile duplicate; selecteaz toate atributele; selecteaz coloana numit; permite construirea de expresii si valori noi denumiri pentru atributele selectate; specific tabelele ce conin coloanele selectate. clauza permite specificarea conditiilor si a criteriilor de selectie a datelor se precizeaza campul dupa care vor fi grupate datele in cazul expresiilor si functiilor de grup (SUM(), AVG(), COUNT(), MIN(), MAX()) in cazul functiilor de grup conditiile impuse acestora se precizeaza in clauza HAVING precizeaza ordonarea in functie un anumite campuri ascendent (ASC) implicit sau descendent (DESC)

Frazele SQL: Nu sunt case sensitive; 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 BETWEEN ... AND ... Operatori de comparatie ntre dou valori (inclusiv).

SELECT codprodus, cant FROM rindcom WHERE cant BETWEEN 10 AND 15;

13

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ 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 % - oricte 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 afiate, nu obligatoriu n ordinea n care apar n descrierea tabelelor.
-

Afiarea se face implicit cu litere mari, la stnga 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 acelai lucru cu blank sau zero. Cu ajutorul frazelor select se pot extrage informaii din baza de date. Utiliznd aceast instruciune se pot realiza toate cele trei operaii specifice modelului relaional. Operator unar, prin care se obine o nou relaie care conine toate atributele relaiei iniiale i un numr redus de tupluri. Reducerea se face dup o condiie numit condiie de selecie.

Selecia:

Proiecia:

Operator unar, prin care se obine o nou relaie care conine un numr redus de atribute fa de relaia iniial i toate valorile sau combinaiile distincte de valori ale acestor atribute. Atributele care se regsesc n relaia rezultat se numesc atribute de proiecie.

14

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ Jonciunea: Operator binar, caz particular de produs cartezian. Relaia rezultat va conine tuplurile corespunztore atributelor de join care se afl ntr-o anumit relaie. Cel mai utilizat caz de jonciune este acela n care atributele de join au aceeai semnificaie, relaia n care acestea trebuie s se afle este de egalitate, unul dintre atribute e cheie primar ntr-una dintre relaii, iar cellalt 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 (jonciunilor) ntre relaii. 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.* 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%
15

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ 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 afieze 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 aceeai tabel 10. S se afieze 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 = (SELECT zona FROM firme WHERE denfirma= SC MEDIA SA); 12. S se afieze produsele care au preul 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);

16

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________

1. CREAREA TABELELOR COMANDA CREATE TABLE


CREATE TABLE nume_tabel ( .... definirea cmpurilor i a tipurilor de date aferente definirea restriciilor de integritate ); Definirea restriciilor se poate realiza la nivel de cmp (in-line) sau la nivelul tabelei (outof-line): Sintaxa general: Constraint nume_restricie tip_restricie [ (cmpurile crora li se aplic restricia)] Tipuri de restricii: 6. Restricia de tip PRIMARY KEY: Constraint nume_restricie PRIMARY KEY [ (cmpuri care formeaz cheia primar)] 7. Restricia de tip FOREIGN KEY: Constraint nume_restricie FOREIGN KEY (cmpul cheie extern) REFERENCES Tabel_printe (cmp cheie primar) 8. Restricia de tip NOT NULL: Se definete numai la nivelul cmpului cruia i se aplic restricia: Ex: nume VARCHAR2(20) NOT NULL 9. Restricia de tip UNIQUE: Constraint nume_restricie UNIQUE [ (cmp cheie unic)] 10. Restricia de tip CHECK: Constraint nume_restricie CHECK [ (condiie asupra unui cmp)]

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 - ADD (definire cmpuri); MODIFY (redefinire cmpuri existente);
17

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ DROP COLUMN cmp; ADD CONSTRAINT nume_restricie TIP_RESTRICIE .; DROP CONSTRAINT nume_restricie; DISABLE CONSTRAINT nume_restricie; ENABLE CONSTRAINT nume_restricie; RENAME TO nume_nou_tabel;

3. STERGEREA TABELELOR COMANDA DROP


DROP TABLE nume_tabel CASCADE CONSTRAINTS;

18

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ RECAPITULARE COMENZI LMD

1. ADAUGAREA DATELOR COMANDA INSERT


INSERT INTO TABELA VALUES ([LISTA DE VALORI PENTRU FIECARE ATRIBUT]);

2. MODIFICAREA DATELOR COMANDA UPDATE


UPDATE [TABELA] SET [COLOANA] = [VALOARE] WHERE [CONDITIE];

3. STERGEREA DATELOR COMANDA DELETE


DELETE FROM [TABELA] WHERE [CONDITIE];

4. SELECTIA DATELOR COMANDA SELECT


SELECT [DISTINCT] { * , tabel1.cmp1 [alias] , expresii AS ALIAS ...} FROM tabel1, tabel2,.... WHERE {condiii, precizarea legturilor dintre tabele} GROUP BY tabel .cmp HAVING {condiii impuse valorilor de grup} ORDER BY tabel .cmp ASC/DESC; unde: SELECT DISTINCT * atribut expresie alias FROM tabele WHERE GROUP BY HAVING ORDER BY specific atributele selectate; suprim valorile duplicate; selecteaz toate atributele; selecteaz coloana numit; permite construirea de expresii si valori noi denumiri pentru atributele selectate; specific tabelele ce conin coloanele selectate. clauza permite specificarea conditiilor si a criteriilor de selectie a datelor se precizeaza campul dupa care vor fi grupate datele in cazul expresiilor si functiilor de grup (SUM(), AVG(), COUNT(), MIN(), MAX()) in cazul functiilor de grup conditiile impuse acestora se precizeaza in clauza HAVING precizeaza ordonarea in functie un anumite campuri ascendent (ASC) implicit sau descendent (DESC)

19

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ SELECTIA DATELOR COMANDA SELECT - continuare

FUNCTII
Funcii single-row (sau scalare). O funcie single-row ntoarce un singur rnd rezultat pentru fiecare rnd al tabelei interogate sau view Funcii de grup (sau agregate). O funcie de grup ntoarce un singur rnd rezultat pentru un grup de rnduri interogate. Funciile de grup pot apare n clauza HAVING

FUNCII 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 afieze 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 afieze data primei comenzi ncheiate i data celei mai vechi comenzi ncheiate: SELECT min(data), max(data) FROM comenzi; 15. S se afieze numrul de produse al cror stoc>200: SELECT count(*) Nr_prod FROM produse WHERE stoc>200; 16. S se afieze numrul total de comenzi incheiate: SELECT count(nrcom) Numar_Comenzi FROM comenzi; 17. S se afieze numrul de produse vndute: SELECT count(distinct(codprodus)) Produse_Vandute FROM rindcom;

20

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ 18. S se afieze cantitatea medie vndut din fiecare produs i s se realizeze ordonarea n funcie 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 afieze produsele i cantitatea medie vndut numai acele produse a cror 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;

FUNCTII SINGLE-ROW Funcii de tip caracter


Operatorul de concatenare ( || ) 22. S se afieze denumirea produsului i stocul disponibil SELECT 'produsul: ' || initcap(denprodus)|| ' are stocul diponibil ' || stoc FROM produse;

21

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________

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; Funcia CONCAT() , funcia LENGTH() , funcia SUBSTR() 24. S se afieze denumirea firmei concatenat cu localitatea i lungimea atributului denumirea firmei, numai pentru localitile al cror nume ncepe cu C SELECT denfirma, concat(denfirma,loc), length(denfirma) FROM firme WHERE substr(loc,1,1)='C';

Funcii de tip numeric


Funcia ROUND() S se afieze numrul 45,923 rotunjit la dou zecimale SELECT round(45.923,2), round(45.923,0) FROM dual;

Funcii de tip dat calendaristic


Funcile SYSDATE 25. S se afieze perioada de timp corespunztoare (n sptmni) ntre data ncheierii comenzii i data curent: SELECT nrcom, round((sysdate-data)/7) saptamani FROM comenzi; 26. Afisati data curenta (se selecteaza data din tabela DUAL): SELECT sysdate DATA_CURENTA FROM DUAL; Funciile MONTH_BETWEEN() , ADD_MONTHS() , NEXT_DAY() , LAST_DAY() 27. S se afieze comenzile, data ncheierii comenzilor, numrul de luni ntre data curent i data ncheierii, urmtoarea zi de vineri dup data ncheierii, ultima zi din luna din care face parte data ncheierii, precum i data corespunztoare dup 2 luni de la data ncheierii SELECT nrcom, data, round(MONTHS_BETWEEN(sysdate, data)) luni, ADD_MONTHS(data,2),
22

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ NEXT_DAY(data, 'FRIDAY'), LAST_DAY(data) FROM comenzi; 28. S se afieze comenzile incheiate in luna trecuta: SELECT nrcom, data FROM comenzi WHERE round(MONTHS_BETWEEN(sysdate, data))=1; Funcia ROUND() 29. S se afieze comenzile incheiate in 2004. Se va rotunji data ncheierii la prima zi din luna corespunztoare dac data ncheierii este n prima jumatate a lunii sau la prima zi din luna urmtoare: SELECT nrcom, data, ROUND(data, 'MONTH') FROM comenzi WHERE data LIKE '%04';

Funcii de conversie
Funcia TO_CHAR(d [, fmt ]) 30. S se afieze comenzile i data ncheierii in format MM/YY SELECT nrcom, TO_CHAR(data, 'MM/YY') data_incheierii FROM comenzi; Funcia TO_DATE(char [, fmt ]) Funcia TO_NUMBER(char [,fmt ]) 31. S se afieze comenzile i data ncheierii n formatul Month dd, YYYY SELECT nrcom, data FROM comenzi WHERE data=TO_DATE( 'January 15, 2005', 'Month dd,YYYY'); Funcia EXTRACT () 32. S se afieze informaii despre comenzile ncheiate n anul 2004 SELECT nrcom, data FROM comenzi WHERE EXTRACT (YEAR from data) = 2004;

23

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ 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;

24

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ 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:
25

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ 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 (cmp); 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_iniial 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
26

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ 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;

27

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ EXERCIII RECAPITULATIVE

1. S se creeze tabelele Faculti, Catedre i Persoane pe baza schemei de mai sus, innd cont de urmtoarele: FACULTI Nume coloan Tipul restriciei Tip dat Lungime CATEDRE Nume coloan Tipul restriciei Tip dat Lungime PERSOANE Nume coloan Tipul restriciei CODP Primary key NUME FUNCIA Check DATAANG CODCAT Foreign key - refer tabela Catedre, coloana CODCAT Date Varchar2 7 CODCAT Primary key Varchar2 7 DENCAT Not null Varchar2 40 CODFAC Foreign key - refer tabela Faculti, coloana CODFAC Varchar2 5 CODFAC Primary key Varchar2 5 DENFAC Not null Varchar2 100

Tip dat Lungime

Number 3

Varchar2 30

Varchar2 5

Atributul FUNCIA poate lua valorile: Prof (profesor), Conf (confereniar), Lect (lector), Asist (asistent), Prep (preparator)

28

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ 2. S se redenumeasc tabela Persoane n Angajati. 3. S se adauge n tabela Angajati coloana Salariu, avnd tipul Number(4). 4. S se adauge n tabela Angajati o restricie de integritate avnd numele VerificaSalariu asupra cmpului Salariu, care s nu permit introducerea de valori mai mici dect 1000 si mai mari dect 5000. 5. Modificai proprietile cmpului DenFac din tabela Facultati, astfel nct lungimea acestuia s fie de 60 6. Dezactivai restricia de integritate VerificaSalariu existent n tabela Angajati. 7. S se adauge n tabele urmtoarele informaii: FACULTI CODFAC CSIE CIG COM CATEDRE CODCAT IE CIB EM STAT ANGAJATI CODP 1 2 3 4 5 6 NUME Ionescu Popescu Georgescu Stanescu Tudor Zaharia FUNCIA Prof Prof Asist Conf Lect Prep 04-FEB-2005 23-APR-2002 10-OCT-2001 DATAANG 12-NOV-1994 CODCAT IE CIB IE EM IE EM SALARIU 2200 2000 1000 1400 1500 900 DENCAT Informatica Economica Cibernetica Economica Economie Matematica Statistica si Previziune Economica CODFAC CSIE CSIE CSIE CSIE DENFAC Cibernetica, Statistica si Informatica Economica Contabilitate si Informatica de Gestiune Comert

8. n tabela Angajati modificai n Marinescu numele angajatului cu Codp egal cu 3 (cmpul Nume). 9. n tabela Angajati modificai n Lect funcia angajatului cu Codp egal cu 4 (cmpul Functia).
29

BAZE DE DATE SEMINAR IDD

___________________________________________________________________________ 10. n tabela Angajati cretei cu 10% salariile angajailor care au n prezent salariul mai mic dect 1400 (cmpul Salariu). 11. n tabela Angajati modificai codul catedrei (cmpul CodCat) angajatului cu Codp egal cu 4 astfel nct s fie acelasi cu codul catedrei unde este ncadrat angajatul cu Codp egal cu 2, utiliznd clauza SELECT. 12. S se afieze toate informaiile despre Facultati. 13. S se afieze numele i funcia tuturor angajatilor, ordonai descresctor dup nume. 14. S se afieze angajaii al cror nume incepe cu litera S. 15. S se afiseze numele asistenilor i lectorilor (funciile sunt codificate prin Asist, respectiv Lect). 16. S se creeze o tabel virtual avnd numele PersonalCatedre, care s conin pentru fiecare angajat de la catedrele cu codul IE i CIB: numele, funcia i denumirea catedrei. 17. S se afieze salariile maxim, minim i mediu pentru toate persoanele angajate dup anul 2000. 18. S se afieze numrul de persoane de la catedra cu CodCat egal cu IE. 19. S se afieze salariul mediu pentru fiecare catedr. (gruparea se va face n funcie de codul catedrei) 20. S se afieze salariul mediu corespunztor fiecrei funcii, numai n cazul n care acesta depete 1200. 21. S se afieze informaii despre persoanele angajate la aceeai catedr ca i Ionescu. 22. S se afieze persoanele care au salariul mai mare dect salariul mediu. 23. S se afieze denumirea catedrei i numrul de persoane de la fiecare catedr, cu excepia catedrei de Informatic Economic i numai pentru acele catedre care au mai mult de o persoan. 24. S se afieze pentru fiecare funcie numrul de angajai. 25. tergei tuplul corespunztor codului Codp egal cu 2.

30