Documente Academic
Documente Profesional
Documente Cultură
• Compactitate ridicată: volumul ocupat de sistemele de baze de date este mult mai redus
1
decât volumul ocupat de documente scrise sau de fișiere necorelate.
• Redundanța scăzută a datelor memorate, care se obține prin partajarea datelor între
mai mulți utilizatori și aplicații.
Modelarea datelor
2
date. În proiectarea bazelor de date se folosesc, de regulă, mai multe modele de date, care se
pot clasifica în două categorii:
- modele conceptuale de nivel înalt și
- modele specializate.
Modelul Entitate-Asociere
3
Asocierile pot fi
- binare (de gradul 2, între 2 mulțimi de entități) sau
- multiple (între k mulțimi de entități, k > 2).
Asocierile binare sunt, la rândul lor, de trei categorii, după numărul elementelor din
fiecare dintre cele două mulțimi puse în corespondență de asocierea respectivă. Fiind date
două mulțimi de entități, E1 ș i E2 , se definesc următoarele categorii de asocieri binare:
• Asocierea “unul-la-unul” (one-to-one) este asocierea prin care unui element
(entitate) din mulțimea E1 îi corespunde un singur element din mulțimea E2 , si reciproc; se
notează cu 1:1.
• Asocierea „unul-la-multe” (one-to-many) este asocierea prin care unui element din
mulțimea E1 îi corespund unul sau mai multe elemente din mulțimea E2 , dar unui element
din E2 îi corespunde un singur element în mulțimea E1 ; se notează cu 1:N.
• Asocierea „multe-la-multe” (many-to-many) este asocierea prin care unui element
din mulțimea E1 îi corespund unul sau mai multe elemente din mulțimea E2 si reciproc; se
notează cu M: N.
Realizarea bazelor de date relaționale constă în luarea unor decizii cu privire la modelarea
unor sisteme din lumea reală într-o bază de date.
Există trei etape în procesul de realizare a unei baze de date:
- proiectarea conceptuală,
- proiectarea logică și
- proiectarea fizică.
4
domeniilor atributelor, determinarea atributelor chei candidat și chei primare,
specializarea și generalizarea tipurilor de entități.
Notații:
5
Diagrama Entitate-Asociere (Entitate-Relație)
MODELUL RELATIONAL
Terminologie
Relație: o relație este un tabel cu coloane și linii (rânduri). – tip de entitate, mulțime de entități
Atribut: Un atribut este o coloană a unei relații, cu o anumită denumire.
Domeniu: Un domeniu este mulțimea de valori permise pentru unul sau mai multe
atribute. Pentru fiecare atribut se definește în mod central denumirea domeniului, sensul
acestuia și domeniul de definiție. Ca urmare, sistemul va evita operațiile incorecte semantic.
6
Exemplu:
Tuplu: Un tuplu este un rând dintr-o relație. Corespunde unei entități, instanțe a unui tip de
entitate.
Intensitatea unei relații: structura tabelului, specificarea domeniilor și a altor restricții
referitoare la valorile posibile. Intensitatea este de regulă fixa/fixată.
Extensia (starea) unei relații: tuplurile, care se modifică în timp.
Grad: Gradul unei relații reprezintă numărul de atribute pe care îl conține. O relație cu două
atribute, de exemplu, se numește binară.
Cardinalitate : cardinalitatea unei relații este numărul de tupluri conținute de aceasta.
Chei relaționale
Supercheia : Este un atribut sau un set de atribute care identifică în mod unic un tuplu din
interiorul unei relații.
O supercheie poate conține și atribute care nu sunt necesare identificării unice a tuplului.
Cheia candidat: este o supercheie minimă, pentru care nicio submulțime nu este supercheie
în cadrul relației respective.
O cheie poate include mai multe atribute, caz în care se numeste cheie combinată.
O cheie candidat este unică (în fiecare tuplu al relației R, valorile cheii identifică
acel tuplu în mod unic) și ireductibilă (nicio submulțime a cheii candidat nu este unică).
Cheia primară: este cheia candidat care este selectată ( din toate cheile candidat
identificate) pentru a identifica în mod unic tuplurile din cadrul unei relații.
Cheile candidat neselectate se numesc chei alternative.
Cheie straină : Un atribut sau o mulțime de atribute din cadrul unei relatii, care se potrivesc
cu o cheie candidat din altă relație.
De exemplu, o cheie straina dintr-o relatie poate coincide cu cheia primara din alta
relație.
Atributele comune joaca un rol important în manipularea datelor.
Prin intermediul cheilor străine se realizează legăturile dintre relații (tabele).
7
1) Relaţia dintre tabela DateDeContact şi tabela Abonaţi este o relaţie de tipul 1-1.
8
2). Relaţia dintre tabela Abonamente şi tabela Tarife - relaţie de tipul 1-1.
9
2. CREAREA UNEI BAZE DE DATE PRIN COMENZI SQL
Utilizatorii finali ai bazei de date au acces la baza de date prin intermediul unei
aplicaţii sau a instrumentelor Oracle, executând în special următoarele activităţi:
• Adăugarea, modificarea şi ştergerea datelor din baza de date în
concordanţă cu drepturile de acces pe care le are;
• Generarea unor rapoarte cu datele din baza de date.
1
Pentru a putea executa sarcinile de administrare a unei baze de date o persoană
trebuie să aibă privilegii (drepturi) atât la nivelul bazei de date Oracle, cât şi la
nivelul sistemului de operare al serverului pe care se află baza de date.
Prin urmare, un administrator trebuie să aibă:
• Cont de administrator pentru sistemul de operare, care să-i permită
să execute comenzile sistemului de operare;
• Cont de administrator Oracle definit de două conturi de utilizator (SYS şi
SYSTEM cu parolele CHANGE_OF_INSTALL şi respectiv MANAGER);
• Rol de DBA, care este creat automat la momentul creării unei baze de date
Oracle. Acest rol conţine toate privilegiile bazei de date Oracle.
Exemplu:
2
pentru utilizatorul SYS şi respectiv numărul de utilizatori care pot executa activităţi
de administrator (DBA).
3
2.2. CREAREA, PORNIREA ŞI OPRIREA UNEI BAZE DE DATE ORACLE
Pentru a crea o bază de date Oracle, trebuie să avem suficientă memorie pentru
pornirea unei instanţe Oracle şi pentru crearea tuturor obiectelor proiectate ale bazei
de date. Dacă la momentul instalării s-a creat şi o bază de date iniţială, atunci aceasta
poate fi dezvoltată astfel încât să cuprindă, în final, toate obiectele bazei de date
proiectate. De asemenea, această bază de date iniţială poate fi ştearsă şi în locul ei să
se creeze o nouă bază de date. Dacă am folosit o versiune anterioară Oracle se poate
crea o bază de date nouă în întregime, dacă nu ne mai interesează vechea bază de date;
altfel, putem migra această bază de date la noua versiune Oracle.
4
eventuale modificări, baza de date trebuie oprită complet şi repornită după ce s-au
efectuat astfel de modificări.
Mulţi parametri de iniţializare se folosesc pentru ajustarea şi creşterea performanţelor
bazei de date.
Specificarea parametrilor se realizează după următoarele reguli:
• Toţi parametrii sunt opţionali;
• În fişierul cu parametri se vor fi introduce numai parametri şi
comentarii;
• Semnul (#) marchează începutul unui comentariu, restul liniei fiind ignorat;
• Serverul Oracle are valori asumate pentru fiecare parametru;
• Parametrii pot fi specificaţi în orice ordine;
• Fişierul de parametri nu este „case-sensitive” ;
• Pentru a introduce mai mulţi parametrii pe o linie aceştia se vor separa prin
spaţiu:
PROCESSES = 100 SAVEPOINTS = 5 OPEN_CURSORS = 10
• Unii parametri, ca de exemplu ROLLBACK_SEGMENTS, acceptă valori
multiple, acestea putându-se specifica între paranteze şi separate prin virgulă, sau
fără paranteze şi virgule, ambele sintaxe fiind valide, astfel:
ROLLBACK_SEGMENTS = (SEG1, SEG2, SEG3, SEG4, SEG5)
ROLLBACK_SEGMENTS = SEG1 SEG2 SEG3 SEG4 SEG5
• Caracterul (/) foloseşte pentru marcarea întreruperii scrierii unui parametru pe
o linie şi continuarea lui pe linia următoare, imediat fără nici un spaţiu în faţă,
astfel:
ROLLBACK_SEGMENTS = (SEG1, SEG2, / SEG3, SEG4, SEG5)
• Parametrul IFILE se poate introduce într-un fişier cu parametrii alt fişier cu
parametrii, astfel:
IFILE = COMMON1.ORA
Se pot folosi trei niveluri de imbricare. În exemplu de mai sus, fişierul
COMMON1.ORA poate conţine un al doilea parametru IFILE pentru fişierul
COMMON2.ORA, care la rândul său poate conţine un al treilea parametru IFILE
pentru fişierul COMMON3.ORA. De asemenea, se pot utiliza mai mulţi parametrii
IFILE în acelaşi fişier, astfel:
IFILE = DBPARMS.ORA IFILE = GCPARMS.ORA IFILE = LOGPARMS.ORA
Dacă valoarea unui parametru conţine caractere speciale, atunci caracterul special
trebuie precedat de caracterul de comutare (\) sau întreaga valoare este inclusă între
caracterele (“ ”), ca în exemplul de mai jos:
DB_DOMAIN = JAPAN.ACME\#.COM
sau
DB_DOMAIN = "JAPAN.ACME#.COM"
5
ALTER SYSTEM SET nume_parametru = valoare DEFERRED
Comanda ALTER SESSION schimbă valoarea unui parametru numai la nivelul
sesiunii care a lansat-o, după repornirea bazei de date se va utiliza aceeași valoare din
fişierul cu parametri.
Comanda ALTER SYSTEM modifică valoarea globală a
parametrului, la nivelul întregului sistem, deci pentru toate sesiunile active, după
repornirea bazei de date se va utiliza aceeași valoare din fişierul cu parametrii.
Comanda ALTER SYSTEM DEFERRED modifică valoarea globală a parametrului
nu pentru sesiunile active, ci pentru sesiunile viitoare, care vor fi active după
repornirea bazei de date.
Afişarea valorilor curente ale parametrilor de iniţializare ai bazei de date se face cu
comanda SHOW PARAMETERS, afişarea făcându-se în ordinea alfabetică a
parametrilor. Listarea la imprimantă a parametrilor afişaţi se face cu comanda
SPOOL.
Aşa cum s-a prezentat mai sus, compania Oracle furnizează un fişier iniţial cu
parametri cu ajutorul căruia putem să pornim o bază de date. Pentru a personaliza
baza de date conform cerinţelor beneficiarului, administratorul va trebui să seteze
valori noi pentru anumiţi parametri specificaţi mai jos, astfel:
• DB_NAME defineşte numele bazei de date. Se formează dintr-un şir de
maximum opt caractere. Dacă nu se furnizează, Oracle atribuie bazei de date un
nume standard. Acesta se găseşte în fişierul cu parametrii furnizat o dată cu
software-ul Oracle. În timpul creerii bazei de date numele acesteia este scris în
fişierele de date, de control şi de log.
Exemplu: DB_NAME = BAZA1
• DB_DOMAIN este format dintr-un şir de caractere şi defineşte domeniul
din reţea căruia aparţine baza de date, de obicei este definit de numele
organizaţiei căreia aparţine baza de date. Dacă se utilizează numele domeniului
6
din Internet, atunci partea adresei de e-mail care urmează după caracterul ”@”
este foarte bună pentru a fi folosită ca valoare pentru acest parametru.
Exemplu: DB_DOMAIN = BUC.ORG.COM
• GLOBAL_NAMES defineşte numele global al bazei de date în cadrul reţelei
de calculatoare şi este format din numele bazei de date şi numele domeniului
separate prin punct. Acest parametru mai poate lua şi valorile: TRUE (caz în care
se forţează ca numele global al bazei de date să fie identic cu cel al bazei de date)
sau FALSE (numele global nu are semnificaţie, nu se utilizează).
Exemplu: GLOBAL_NAMES =FALSE
• CONTROL_FILES defineşte numele fişierelor de control ce vor fi create
pentru baza de date (se va furniza pentru fiecare fişier calea completă de acces la
acesta). Este recomandat ca să se definească cel puţin două fişiere de control, care
să fie plasate pe două discuri diferite.
Exemplu: CONTROL_FILES =diska:cntrl1.ora,diskb:cntrl2.ora
• LOG_FILES specifică numărul maxim de grupuri de fişiere de log ce pot fi
utilizate pentru o bază de date. Ia valori de la 2 la 255. Acest parametru specifică
totodată şi numărul minim de fişiere de log ce pot fi deschise pentru o bază de
date.
• DB_FILE_MULTIBLOCK_READ_COUNT defineşte numărul de blocuri
citite simultan pentru accesarea unei tabele a bazei de date. Este folosit pentru
optimizarea parcurgerii totale a unei tabele atunci când se caută o anumită valoare
a unei coloane aferentă unui rând din aceasta.
• REMOTE_LOGIN_PASSWORDFILE specifică dacă se foloseşte sau nu
fişierul cu parole pentru identificarea utilizatorilor ce pot executa activităţi de
administrator. Poate lua valorile: NONE nu se foloseşte fişierul de parole iar
utilizatorul care va executa activităţi de administrare trebuie să fie
autentificat de către sistemul de operare gazdă; EXCLUSIVE se foloseşte un
singur fişier cu parole pentru o singură bază de date. Pe lângă utilizatorii SYS şi
SYSTEM şi alţi utilizatori pot executa sarcini de administrare; SHARED se
foloseşte un singur fişier cu parole pentru mai multe baze de date, caz în care
singurii utilizatori ce pot executa activităţi de administrare sunt SYS şi
SYSTEM. În acest caz nu se pot adăuga alţi utilizatori în fişierul cu parole.
• DB_FILES specifică numărul maxim de fişiere de date ce pot fi
deschise de către o bază de date. De fiecare dată când se modifică acest parametru
baza de date se opreşte şi apoi se reporneşte.
• LOG_CHECKPOINT_INTERVAL specifică frecvenţa punctelor de control
(checkpoites) ;
• LOG_CHECKPOINT_TIMEOUT specifică timpul maxim dintre două
puncte de control în secunde;
• PROCESSES specifică numărul maxim de utilizatori care se pot conecta
simultan la baza de date, iar acest număr trebuie să fie mai mare decât numărul
total de procese background, Job Queue şi Parallel Query;
• ROLLBACK_SEGMENTS defineşte toate segmentele rollback pe care o
instanţă le poate acapara la momentul pornirii. Valoarea acestui parametru se dă
sub forma unei liste de valori.
Exemplu:
ROLLBACK_SEGMENTS = (rbseg1, rbseg2, rbseg3, rbseg4)
• LICENSE_MAX_SESSIONS specifică numărul maxim de utilizatori
concurenţiali ce pot fi admişi în timpul unei sesiuni;
7
• LICENSE_MAX_USERS specifică numărul maxim de utilizatori ce pot fi
creaţi pentru o bază de date. LICENSE_MAX_SESSIONS şi
LICENSE_MAX_USERS nu pot avea simultan valori diferite de zero, deci unul
din aceşti parametri trebuie să fie setat pe zero;
• LICENSE_SESSIONS_WARNING specifică numărul de utilizatori
concurenţiali. Dacă se depăşeşte, se emite un mesaj de atenţionare;
• TRANSACTIONS_PER_ROLLBACK_SEGMENT specifică numărul
tranzacţiilor concurente permise pe un segment rollback;
• AUDIT_TRAIL activează sau dezactivează scrierea rândurilor în fişierul
de audit. Înregistrările de audit nu se scriu dacă parametrul are valoarea NONE
sau lipseşte.
8
CHARACTER SET US7ASCII DATAFILE 'diska:datfile1.dat' SIZE 2M DATAFILE
'disk1:datfile2.dbf' AUTOEXTEND ON disk2:datfile3.dbf' AUTOEXTEND ON
NEXT 10M MAXSIZE UNLIMITED;
După crearea unei baze de date, instanţa Oracle poate fi lăsată să ruleze, iar baza de
date este deschisă şi montată pentru utilizare normală. Pentru opririle şi pornirile
ulterioare se poate utiliza Oracle Enterprise Manager.
Deschiderea unei baze de date se poate face după ce instanţa a fost pornită, baza de
date montată dar închisă, cu ajutorul comenzii SQL ALTER DATABASE cu
opţiunea OPEN.
Exemplu: SQL> ALTER DATABASE baza1 OPEN;
9
Exemplu:
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM DISABLE RESTRICTED SESSION;
Oprirea prin anularea instanţei se execută dacă baza de date sau una din aplicaţiile
sale funcţionează anormal şi nici una din metodele de oprire anterioare nu
funcţionează. Această oprire se execută din fereastra de dialog Shutdown prin setarea
butonului radio Abort.
10
• finalizează instrucţiunile SQL aflate în lucru, tranzacţiile nefinalizate
nu mai sunt aduse la starea anterioară momentului începerii acestora
(nu mai sunt anulate prin procesul de roll back), iar
• toţi utilizatorii sunt deconectaţi imediat.
Structura tabelelor
• Tabelele pot fi create în orice moment, chiar în momentul când utilizatorul
folosește baza de date.
• Nu este necesară specificarea mărimii unei baze de date. Este important,
totuși, cât spațiu va ocupa tabelul în timp.
• Structura unui tabel poate fi modificată dinamic.
11
3.2. Crearea tabelelor
Pentru a crea un tabel, se utilizează Comanda CREATE TABLE
Este posibilă realizarea unui tabel dacă se dispune de:
- Drepturi pentru crearea unei tabele;
- Unitate de stocare
• Trebuie specificate:
- Numele tabelului
- Numele coloanei, tipul de dată pentru coloană și mărimea tipului de data.
Opțiunea DEFAULT
12
Exemplu de creare a unui tabel:
Table created.
Ca urmare a acestei comenzi, se creează un tabel dept4 având capul de tabel de forma:
13
- DEFAULT expr specifica valoarea implicita pentru coloana.
Table altered.
Rezultatul execuției va fi un tabel cu 4 coloane:
Observatii:
Se pot adăuga, modifica coloane, dar nu se pot elimina din tabelă.
Nu se poate specifica locul de apariție al noii coloane. Noua coloana devine
ultima coloană. Dacă tabelul conține înregistrari în momentul adăugării unei noi
coloane, atunci noua coloană se inițializează cu valori nule pentru toate înregistrarile.
Table altered.
Observații:
• Se poate mări lățimea sau precizia unei coloane numerice
• Se poate micșora lățimea unei coloane dacă aceasta conține numai valori nule sau
dacă tabelul nu are rânduri
• Se poate schimba tipul de date dacă coloana conține numai valori null
• Se poate converti o coloană de tip CHAR la una de tip VARCHAR2 sau invers
dacă aceasta conține valori null sau dacă nu i se schimbă lățimea
• Schimbarea valorii predefinite pentru o coloană afecteaza numai inserările
ulterioare în tabel
14
3.3 Ștergerea unui tabel
Cum spuneam, nu poate fi ștearsă o coloană dintr-un tabel. Singura opțiune de
ștergere este a întregului tabel.
Sinatxa:
DROP TABLE table; table- numele tabelului care se șterge.
și afișării mesajului
Table dropped.
Comanda DROP TABLE șterge definiția unei tabele. Când se aplică comanda
DROP unei tabele, baza de date pierde toate înregistrările din tabelă, împreună cu
indexurile asociate acesteia.
Comanda DROP TABLE este ireversibilă.
Observații:
• Toate datele sunt șterse
• Orice vedere sau sinonim va rămâne dar vor fi invalide
• Orice tranzacție în curs va fi finalizată
• Numai utilizatorul care a creat tabelul sau cel care are privilegiul DROP ANY
TABLE poate șterge un tabel
Sintaxa:
RENAME old_name TO new_name;
- old_name numele vechi al obiectului;
- new_name numele nou al obiectului;
Table renamed.
Observație:
15
3.5. Ștergerea înregistrărilor unui tabel
Există două opțiuni de ștergere:
• TRUNCATE TABLE
Comanda șterge toate înregistrarile din tabelul specificat, eliberând spațiul
folosit de tabelă. Operațiunea este ireversibilă.
Sinatxa:
TRUNCATE TABLE table;
- table numele tabelului.
Table truncated.
• DELETE
Sintaxa:
DELETE FROM table;
sau
DELETE * FROM table;
Sinatxa:
COMMENT ON TABLE table | COLUMN table.column IS text;
- table numele tabelului;
- column numele coloanei din tabel;
- text textul comentariului.
16
Comment created
REZUMAT
CREATE TABLE
• Creează o tabelă
ALTER TABLE
• Modifică structura tabelelor
• Schimbă lățimea sau tipul de date al coloanelor, poate adăuga coloane
DROP TABLE
• Șterge rândurile și structura tabelului
• Ireversibilă
RENAME
• Redenumește o tabelă, vedere, secvență sau sinonim
TRUNCATE
• Șterge toate rândurile dintr-o tabelă și eliberează spațiul folosit de tabelă
• Comanda DELETE șterge doar rândurile, nu eliberează spațiul
COMMENT
• Adaugă un comentariu la o tabelă sau la o coloană
• Vizualizarea comentariilor se face prin interogarea dicționarului de date
17
ÎNCĂRCAREA ȘI ACTUALIZAREA DATELOR ÎN TABELE
INSTRUCȚIUNEA SELECT
Tipuri de date
Tip Descriere
CHAR(n) Șir de caractere cu lungime fixă (n octeti)
VARCHAR2(n) Șir de caractere cu lungime variabilă (maxim n octeti)
NUMBER (p,s) Date numerice de lungime variabilă. Tipul number permite definirea
preciziei și a scalei. Precizia este egală cu numărul total de cifre ale
numarului; scala se referă la numarul de cifre din dreapta punctului
zecimal. Aceste numere pot fi stocate cu o precizie de pâna la 38 de cifre.
Exemple:
Nr_Articol number
'123456'
Nr_Articol number(6, 2)
'1234.56'
În acest exemplu, (6,2) reprezinta urmatoarele:
·6 este precizia. Precizia este sinonima cu numărul total de cifre permise.
Acest număr include numărul total de cifre din ambele părți ale punctului
zecimal.
· 2 este scala, sau numărul de cifre din dreapta punctului zecimal.
Este recomandabil să se specifice întotdeauna precizia și scala datei, în
acest fel se asigura verificarea integrității datei atunci când aceasta este
introdusă.
DATE Date calendaristice si temporal. Tipul date stochează data calendaristică și
ora în coloanele unui tabel cu precizie de o secundă. Acest tip de dată
1
stocheaza cele patru cifre ale anului, luna, ziua, ora, minutele și secundele
scurse de la miezul nopții.
Pentru operațiile de intrare/iesire de date, formatul prestabilit este DD-
MON-YY. Ora este stocată în format HH:MM:SS. Nu se poate specifica
data în litere. Dacă nu se specifică componenta pentru oră într-o valoare
de tip data, ora prestabilită este 12:00:00 AM. În mod similar, dacă se
omite componenta corespunzătoare datei calendaristice a unei valori de
tip data, data prestabilită este prima zi a lunii curente. Domeniul valid
pentru date calendaristice este 1 Ianuarie 4712 Î.E.N - 1 Ianuarie 4712
E.N.
CLOB Obiecte de tip caracter de lungime mare - 4 gigabytes.
LONG Siruri de caractere de lungime variabilă - 2 gigabytes.
BLOB Date binare nestructurate
BFILE Date binare stocate într-un fisier extern
ROWID Date în format binar ce reprezintă adresa fizică pe disc a înregistrării
2
ÎNCĂRCAREA ȘI ACTUALIZAREA DATELOR CU COMENZI SQL
Actualizarea datelor se referă la adăugarea unor noi rânduri într-un tabel (cu comanda
INSERT), la modificarea valorilor uneia sau mai multor valori dintr-un rând (cu comanda
UPDATE) şi la ştergerea unui rând dintr-un tabel (cu comanda DELETE).
În vederea adăugarii unor rânduri noi într-un tabel sau într-o vedere se utilizează comanda:
Valori Null
• O valoare NULL este o valoare care nu este diponibilă, este nealocată, necunoscută, sau
neaplicabilă.
• Un NULL nu are același înțeles ca zero sau spațiu.
• Dacă unui rând îi lipsește valoarea datei pentru o anumită coloană, acea valoare este
considerată null.
• Orice tip de coloană poate conține null. Se pot impune restricții cum ar fi NOT NULL sau
PRIMARY KEY care nu permit ca valoarea null să fie folosită în acea coloană.
Pentru a furniza valori pentru o coloană de tip dată calendaristică se poate folosi funcţia
TO_DATE sau cuvântul cheie SYSDATE.
Funcţia TO_DATE permite furnizarea valorilor într-un format diferit de cel standard.
Exemple:
3
se poate confirma crearea tabelului (utilizând comanda DESCRIBE):
dept
nr.dept numedept localitate
1 cercetare București
UPDATE tabel
SET (coloana, coloana, …) = (SELECT coloana, coloana, …
FROM tabel
WHERE condiție)
WHERE condiție;
Sunt două posibilități de modificare. Una constă în furnizarea în mod explicit a fiecărei
valori pentru câmpurile care trebuie modificate, iar cealaltă posibilitate constă în obţinerea
valorilor în urma unei cereri SQL.
Dacă nu este specificată clauza WHERE, se vor modifica toate rândurile tabelului.
4
(coloana, coloana, …) = (subinterogare) impune ca cererea să conţină pentru fiecare rând un
număr de valori corespunzător numărului de coloane din paranteza care precede caracterul =.
În cazul în care se modifcă o singură coloană, parantezele pot fi omise.
Exemple:
1) Să se modifice câmpul NRSAL din tabelul dept, pentru departamentul cu codul 1,
atribuindu-i valoarea 11.
SQL> UPDATE dept
SET NRSAL=11
WHERE nr.dept= 1;
1 record updated.
2) Să se modifice data de livrare cu data actuală pentru toate produsele cu codul egal cu 33, din
toate comenzile.
SQL> UPDATE comenzi
SET datal=SYSDATE
WHERE codp=33;
1 record updated.
Exemple:
1) Să se şteargă datele din tabelul dept.
SQL> DELETE FROM dept;
7 records deleted.
5
2) Să se şteargă datele pentru departamentele care au codul mai mare sau egal cu 10.
SQL> DELETE FROM dept
WHERE nr.dept>=10;
2 records deleted.
3) Să se scrie comanda pentru ştergerea datelor despre salariatul Ionescu. Ştergerile să nu fie
efectuate imediat, ci ulterior.
SQL> SET AUTOCOMMIT OFF
SQL> DELETE FROM salariați
WHERE nume='Ionescu';
1 record deleted.
SQL> COMMIT ;
6
Întrucât au apărut cuvinte specifice limbajului SQL, se prezintă următoarea
Terminologie:
ACȚIUNEA 1:
Selectarea tuturor coloanelor dintr-un tabel
SQL> SELECT *
FROM dept;
Pentru a afișa toate coloanele cu date din tabelă, se va folosi cuvântul cheie SELECT urmat
de un asterix (*).
Ca exemplu, tabela departamente conține trei coloane: nr.dept, numedept și localitate.
Tabelul conține patru linii, pentru fiecare departament.
O variantă de comandă SELECT pentru a afișa toate informațiile din tabel este aceea în care
după SELECT sunt specificate toate numele de coloane.
7
ACȚIUNEA 2:
NR.DEPT LOCALITATE
1 BUCUREȘTI
2 TIMIȘOARA
3 CLUJ
4 IAȘI
Instrucțiunea SELECT poate fi folosită pentru a afișa anumite coloane din tabelă, specificând
numele coloanelor, separate prin virgulă.
În exemplu se afișează toate numele și localitățiile din tabela dept.
În clauzele SELECT se specifică coloanele dorite, în ordinea în care se dorește afișarea.
Pentru a afișa localitățiile înaintea numărului departamentului, instrucțiunea SELECT este
următoarea::
LOCALITATE NR.DEPT
BUCUREȘTI 1
TIMIȘOARA 2
CLUJ 3
IAȘI 4
Modul de afișare
Aliniere implicită
Stânga – caractere
Dreapta – date calendaristice și date numerice
Afișarea implicită LITERE MARI
8
Expresii aritmetice
Operator Descriere
+ Adunare
- Scădere
* Înmulțire
/ Împărțire
Expresii aritmetice
Executând anumite calcule, poate fi modificat modul în care sunt afișate datele dintr-un
tabel. Calculele se pot efectua utilizind operațiile aritmetice. Expresiile aritmetice pot conține nume
de coloane, constante numerice și operatori aritmetici.
Operatori aritmetici
Operatorii aritmetici pot fi utilizați în orice clauză SQL, exceptând clauza FROM.
ACȚIUNEA 3:
Tabel ang
Folosind comanda
9
În exemplul dat, s-a folosit operatorul adunare pentru a crește salariile cu 500 lei pentru toți
angajații și afișarea noii coloane SALARIU+500 la ieșire.
În urma adunării, coloana rezultat (SALARIU+500) nu este o nouă coloană în tabela ang; ea apare
doar la afișare. Implicit, denumirea noii coloane vine de la operația care a generat-o, în acest caz
SALARIU+500.
Prioritatea operatorilor
Se observă că sunt afișate câmpurile nume, salariul lunar și salariul anual + o bonificație ale
angajaților. Înmulțirea se efectuează înaintea adunării.
10
Folosirea parantezelor pentru a schimba prioritatea operatorilor
Dacă o linie nu are date pentru o coloană particulară, aceasta valoare se numește nulă.
Valoarea nul este o valoare indisponibila, neatribuită, necunoscută sau inaplicabilă.
Valoarea nul nu este aceeași cu zero sau spațiu. Zero este număr iar spațiul este un caracter.
Coloanele din orice tip pot conține valoarea nulă, cu excepția celor care au fost definite
nenule sau chei primare în coloanele create.
În coloana COMISION din tabela ang, absența valorilor arată că acei angajați nu sunt
îndreptățiți să primească comisioane. Valoarea vidă (nulă) reprezintă acest fapt. Numai Andronache
și Tache pot avea comision. În cazul de față, au comisionul 0 nu null.
11
Valoarea nulă în expresiile aritmetice
A_NUME 12*SALARIU+COMISION
IONESCU
Dacă o coloană dintr-o expresie aritmetică conține valoarea nulă, rezultatul este nul.
În exempl, angajatul IONESCU primește comision. Deoarece coloana COMISION în
expresia aritmetică este nulă, rezultatul este nul.
Specificarea aliasului se face după numele coloanei în lista SELECT, folosind spațiul ca
separator. Implicit, capul de tabel obținut prin alias este scris cu litere mari. Dacă aliasul conține
spații, caractere speciale (ca $ sau #), sau au importanță literele mari (mici), aliasul va fi scris între
ghilimele (“ ”).
NUME SALARIU_ANUAL
IONESCU 67200
POPESCU 19800
VASILESCU 22800
ANDRONACHE 38200
GEORGESCU 43200
TACHE 18600
Sunt afișate numele și salariul anual al tuturor angajaților. Cuvântul cheie AS a fost folosit înainte
de alias. Rezultatul interogării este același dacă cuvântul cheie AS este folosit sau nu. Un alt aspect
este că nume și salariu_anual au fost scrise în interogare cu litere mici iar afișarea s-a făcut cu
litere mari. Rămâne valabil faptul că, implicit, capul de coloană este afișat cu litere mari.
12
SQL> SELECT a_nume nume, 12*(salariu+100) “Salariu anual”
FROM ang;
Deoarece Salariu anual implică folosirea spațiului, aliasul trebuie scris între ghilimele. Astfel, va fi
afișat exact cum a fost scris în expresia SELECT. De remarcat că a fost scris numai cu inițială mare,
restul literelor, mici.
Operatorul de concatenare
Folosind operatorul de concatenare, se pot lega coloane de alte coloane, expresii aritmetice sau
valori constante pentru a creea expresii caracter. Coloanele de o parte și de alta a operatorului sunt
combinate pentru a face o singură coloană de ieșire.
Departament
1CERCETARE
2OPERAȚII
3CONTURI
4VÂNZĂRI
13
Șiruri de caractere
• Un “literal” este un caracter, expresie sau numar inclus in lista SELECT
• Valorile literale pentru datele calendaristice și caractere trebuie incluse între apostrofi
• Fiecare șir de caractere este afișat o dată pentru fiecare rând întors
Detalii angajați
IONESCU are un salariu anual de 67200
POPESCU are un salariu anual 19800
VASILESCU are un salariu anual 22800
ANDRONACHE are un salariu anual 38200
GEORGESCU are un salariu anual 43200
TACHE are un salariu anual 18600
Exemplul de mai sus afișează numele si salariile anuale ale tuturor angajaților. Coloana are titlul
Detalii angajați. Spațiile dintre apostrofi din instrucțiunea SELECT îmbunătățesc lizibilitatea ieșirii.
Rânduri duplicate
În mod predefinit, interogările afișează toate rândurile, incluzând rândurile duplicate.
Eliminarea rândurilor duplicate se face folosind cuvântul cheie DISTINCT în clauza SELECT.
Se pot specifica coloane multiple după clauza DISTINCT. Această clauză afectează toate
coloanele selectate și rezultatul reprezintă o combinație de coloane distinctă.
14
Manipularea datelor
dept
nr.dept numedept localitate 5 dezvolare Constanța
1 cercetare București
2 operații Timișoara
3 conturi Cluj inserează o nouă
4 vânzări Iași înregistrare în
baza de date dept
dept
nr.dept numedept localitate
1 cercetare București
2 operații Timișoara
3 conturi Cluj
4 vânzări Iași
5 dezvolare Constanța
Schema de mai sus ilustrează adaugarea unui nou departament în tabelul dept.
1
Inserarea unor noi înregistrări
Atunci când se inserează o nouă înregistrare conținând valori pentru fiecare coloană,
valorile se dau în ordinea prestabilită a coloanelor din tabel. Precizarea coloanelor
este optională. Valorile de tip caracter sau data trebuie încadrate de apostrofuri.
dept
nr.dept numedept localitate
1 cercetare București
2 operații Timișoara
3 conturi Cluj
4 vânzări Iași
dept
nr.dept numedept localitate
1 cercetare București
2 operații Timișoara
3 conturi Cluj
4 vânzări Iași
5 dezvolare Constanța
Deoarece se poate insera o nouă înregistrare care conține valori pentru fiecare
coloană, lista coloanelor nu este necesară în sintaxa INSERT. Dacă aceasta nu este
precizată, valorile trebuie enumerate conform ordinii coloanelor din tabel.
Pentru claritate, trebuie precizată lista coloanelor în sintaxa INSERT.
Încadrarea între apostrofuri se face numai pentru sirurile de caractere și datele
calendaristice. Valorile numerice nu se încadrează între apostrofuri.
Metoda implicită:
dept
nr.dept numedept localitate
1 cercetare București
2 operații Timișoara
3 conturi Cluj
4 vânzări Iași
5 dezvolare Constanța
2
dept
nr.dept numedept localitate
1 cercetare București
2 operații Timișoara
3 conturi Cluj
4 vânzări Iași
5 dezvolare Constanța
6 control
Metoda explicită:
dept
nr.dept numedept localitate
1 cercetare București
2 operații Timișoara
3 conturi Cluj
4 vânzări Iași
5 dezvolare Constanța
6 control
7 finanțe
Orice coloana care nu este specificată explicit în listă, va primi o valoare nulă în
noua înregistrare.
ang
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
1 row created.
ang
3
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
Ion 1 oct 2017 4000 economist
ang
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
Ion 1 oct 2017 4000 economist
1 row created.
TO_DATE('2003/07/09', 'yyyy/mm/dd')
Rezultat: valoarea datei July 9, 2003
TO_DATE('070903', 'MMDDYY')
Rezultat: valoarea datei July 9, 2003
4
TO_DATE('20020315', 'yyyymmdd')
Rezultat: valoarea datei Mar 15, 2002
ang
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
Iancu 25 sept 2017 16000 CEO
manager
nume salariu data_angajare
Calimente 7000 2 aug 2010
Având tabelele ang și manager, se poate copia o linie din tabelul ang în manager
cu comanda:
manager
nume salariu data_angajare
Calimente 7000 2 aug 2010
Iancu 16000 25 sept 2017
Sintaxa comenzii INSERT INTO, pentru copierea informațiilor dintr-un tabel în alt tabel,
este următoarea:
5
Numărul și tipul câmpurilor (coloanelor) din lista specificată în comanda INSERT trebuie
să corespundă numărului și tipului valorilor din subinterogare.
ang
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
modifică o
înregistrare din
a_nume data_angajare salariu post nr.dept tabelul ang
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 2
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
UPDATE tabel
SET coloana = valoare [,coloana=valoare]
[WHERE condiție];
unde:
6
Pentru a identifica o singură înregistrare trebuie folosită drept condiție o coloană care să
facă distincție clară (să asigure unicitatea) între înregistrări. Coloana care asigură această
unicitatea înregistrărilor dintr-o tabelă reprezintă ceea ce se numește cheia primară
Folosirea altor coloane poate determina modificarea mai multor înregistrări.
De exemplu, identificarea unei singure înregistrări în tabelul ang prin nume poate fi
periculoasă, deoarece pot exista mai mulți angajați cu același nume.
Fie următorul tabel
ang
a_nume data_angajare salariu 12*salariu post matricol nr.dept
Ionescu 11 ian 2000 5500 66000 inginer 1489 1
Popescu 18 nov 2011 1550 18600 inginer 7852 1
Vasilescu 23 aug 2011 1800 21600 economist 2598 2
Andronache 1 mai 2017 2250 27000 economist 12358 3
Georgescu 2 sept 2000 3500 42000 agent vânzări 2466 4
Tache 22 iul 2015 1450 16400 economist 1587 2
Ionescu 25 aug 1999 4520 54240 inginer 675 3
SQL>UPDATE ang
SET nr.dept = 2;
7 rows updated.
obținem efectul :
ang
a_nume data_angajare salariu 12*salariu post matricol nr.dept
Ionescu 11 ian 2000 5500 66000 inginer 1489 2
Popescu 18 nov 2011 1550 18600 inginer 7852 2
Vasilescu 23 aug 2011 1800 21600 economist 2598 2
Andronache 1 mai 2017 2250 27000 economist 12358 2
Georgescu 2 sept 2000 3500 42000 agent vânzări 2466 2
Tache 22 iul 2015 1450 16400 economist 1587 2
Ionescu 25 aug 1999 4520 54240 inginer 675 2
7
ang
a_nume data_angajare salariu 12*salariu post matricol nr.dept
Ionescu 11 ian 2000 5500 66000 inginer 1489 1
Popescu 18 nov 2011 1550 18600 inginer 7852 1
Vasilescu 23 aug 2011 1800 21600 economist 2598 2
Andronache 1 mai 2017 2250 27000 economist 12358 3
Georgescu 2 sept 2000 3500 42000 agent vânzări 2466 4
Tache 22 iul 2015 1450 16400 economist 1587 2
Ionescu 25 aug 1999 4520 54240 inginer 675 3
Dacă lansăm comanda UPDATE cu clauza WHERE, dar alegem o coloană care să
nu asigure unicitatea (a_nume):
SQL>UPDATE ang
SET nr.dept = 2;
WHERE a_nume = ‘Ionescu’
2 rows updated.
ang
a_nume data_angajare salariu 12*salariu post matricol nr.dept
Ionescu 11 ian 2000 5500 66000 inginer 1489 2
Popescu 18 nov 2011 1550 18600 inginer 7852 1
Vasilescu 23 aug 2011 1800 21600 economist 2598 2
Andronache 1 mai 2017 2250 27000 economist 12358 3
Georgescu 2 sept 2000 3500 42000 agent vânzări 2466 4
Tache 22 iul 2015 1450 16400 economist 1587 2
Ionescu 25 aug 1999 4520 54240 inginer 675 2
Dacă lansăm comanda UPDATE cu clauza WHERE, dar alegem o coloană care să
asigure unicitatea (matricol):
SQL>UPDATE ang
SET nr.dept = 2;
WHERE matricol = 675
1 row updated.
ang
a_nume data_angajare salariu 12*salariu post matricol nr.dept
Ionescu 11 ian 2000 5500 66000 inginer 1489 1
Popescu 18 nov 2011 1550 18600 inginer 7852 1
Vasilescu 23 aug 2011 1800 21600 economist 2598 2
Andronache 1 mai 2017 2250 27000 economist 12358 3
Georgescu 2 sept 2000 3500 42000 agent vânzări 2466 4
Tache 22 iul 2015 1450 16400 economist 1587 2
Ionescu 25 aug 1999 4520 54240 inginer 675 2
8
Actualizarea înregistrărilor folosind subinterogări după mai multe
câmpuri
Există posibilitatea de a modifica câmpuri precizate ale unei înregistrări astfel încât să
coincidă cu câmpurile omoloage ale alte înregistrări:
Acest lucru este posibil prin implementarea mai multor subinterogări în clauza SET a
comenzii UPDATE:
UPDATE tabel
SET (coloana, coloana, ... ) = (SELECT coloana, coloana,
FROM tabel
WHERE condition)
WHERE condition;
ang
a_nume data_angajare salariu 12*salariu post matricol nr.dept
Ionescu 11 ian 2000 5500 66000 inginer 1489 1
Popescu 18 nov 2011 1550 18600 inginer 7852 1
Vasilescu 23 aug 2011 1800 21600 economist 2598 2
Andronache 1 mai 2017 2250 27000 economist 12358 3
Georgescu 2 sept 2000 3500 42000 agent vânzări 2466 4
Tache 22 iul 2015 1450 16400 economist 1587 2
Ionescu 25 aug 1999 4520 54240 inginer 675 3
Rezultat:
ang
a_nume data_angajare salariu 12*salariu post matricol nr.dept
Ionescu 11 ian 2000 5500 66000 inginer 1489 1
Popescu 18 nov 2011 1550 18600 inginer 7852 1
Vasilescu 23 aug 2011 1800 21600 economist 2598 2
Andronache 1 mai 2017 2250 27000 agent vânzări 12358 4
Georgescu 2 sept 2000 3500 42000 agent vânzări 2466 4
Tache 22 iul 2015 1450 16400 economist 1587 2
Ionescu 25 aug 1999 4520 54240 inginer 675 3
9
Actualizarea înregistrărilor folosind valori dintr-un alt tabel
și tabelul
ang
a_nume data_angajare salariu 12*salariu post matricol nr.dept
Ionescu 11 ian 2000 5500 66000 inginer 1489 1
Popescu 18 nov 2011 1550 18600 inginer 7852 1
Vasilescu 23 aug 2011 1800 21600 economist 2598 2
Andronache 1 mai 2017 2250 27000 economist 12358 3
Georgescu 2 sept 2000 3500 42000 agent vânzări 2466 4
Tache 22 iul 2015 1450 16400 economist 1587 2
Ionescu 25 aug 1999 4520 54240 inginer 675 3
lansând comanda :
Este schimbat în tabelul pers numărul de departament pentru toți angajații care
ocupă același post ca al celui cu numarul 1587 din tabelul ang, noul lor număr de
departament devenind egal cu al angajatului cu numărul matricol 12358 (3).
pers
nume matricol nr.depr post copii pasiuni
Ionescu 1489 1 inginer 1 citit
Popescu 7852 1 inginer 2 scris
Vasilescu 2598 3 economist 1 ascultat
Andronache 12358 3 economist 1 vorbit
Georgescu 2466 4 agent vânzări 3 mancare
Tache 1587 3 economist 0 bautura
Iancu 675 inginer 5
10
Ștergerea unei înregistrări dintr-un tabel
dept
nr.dept numedept localitate
1 cercetare București
2 operații Timișoara
3 conturi Cluj
4 vânzări Iași
5 dezvolare Constanța
șterge o dept
înregistrare din nr.dept numedept localitate
tabelul dept
1 cercetare București
2 operații Timișoara
3 conturi Cluj
4 vânzări Iași
În sintaxa:
tabel este numele tabelului,
condiție identifică înregistrările care trebuie șterse și poate fi
compusă din expresii, nume de coloane, constante,
subinterogări sau operatori de comparare.
Mesj de confirmare:
1 row deleted
11
Ștergerea unor înregistrări utilizând funcții SQL și operatori de comparare.
Cu comanda
4 rows deleted.
din tabelul
ang
a_nume data_angajare salariu 12*salariu post matricol nr.dept
Ionescu 11 ian 2000 5500 66000 inginer 1489 1
Popescu 18 nov 2011 1550 18600 inginer 7852 1
Vasilescu 23 aug 2011 1800 21600 economist 2598 2
Andronache 1 mai 2017 2250 27000 economist 12358 3
Georgescu 2 sept 2000 3500 42000 agent vânzări 2466 4
Tache 22 iul 2015 1450 16400 economist 1587 2
Ionescu 25 aug 1999 4520 54240 inginer 675 3
ang
a_nume data_angajare salariu 12*salariu post matricol nr.dept
Ionescu 11 ian 2000 5500 66000 inginer 1489 1
Georgescu 2 sept 2000 3500 42000 agent vânzări 2466 4
Ionescu 25 aug 1999 4520 54240 inginer 675 3
Dacă se omite clauza WHERE, vor fi șterse din tabel toate rândurile.
Rezultatul comenzii
7 rows deleted.
ang
a_nume data_angajare salariu 12*salariu post matricol nr.dept
12
Ștergerea înregistrărilor folosind valori dintr-un alt tabel
Având tabelele
pers
nume matricol nr.depr post copii pasiuni
Ionescu 1489 1 inginer 1 citit
Popescu 7852 1 inginer 2 scris
Vasilescu 2598 2 economist 1 ascultat
Andronache 12358 3 economist 1 vorbit
Georgescu 2466 4 agent vânzări 3 mancare
Tache 1587 2 economist 0 bautura
Iancu 675 inginer 5
dept
nr.dept numedept localitate
1 cercetare București
2 operații Timișoara
3 conturi Cluj
4 vânzări Iași
5 dezvolare Constanța
comanda
pers
nume matricol nr.depr post copii pasiuni
Ionescu 1489 1 inginer 1 citit
Popescu 7852 1 inginer 2 scris
Vasilescu 2598 2 economist 1 ascultat
Georgescu 2466 4 agent vânzări 3 mancare
Tache 1587 2 economist 0 bautura
Iancu 675 inginer 5
13
Tranzacții
14
Utilizarea COMMIT și ROLLBACK
COMMIT
Savepoint Savepoint
A B
ROLLBACK to Savepoint B
ROLLBACK to Savepoint A
ROLLBACK
15
• Înregistrările protejate (locked) sunt deblocate pentru modificare și pot fi schimbate
de alți utilizatori.
• Toate savepoint-urile sunt șterse.
SQL>UPDATE ang
SET nr.dept = 1
WHERE matricol = 1587;
1 row updated.
SQL>COMMIT;
Commit complete.
Exemplu:
Încercând să se ștergă o înregistrare din tabelul ang, se poate șterge accidental întreg
tabelul. Se poate corecta greșeala, iar apoi se pot da comenzile corecte și salva
modificările.
16
Anularea modificărilor pînă la un punct marcat (Marker) - Savepoint
Se poate crea un marcaj în cadrul unei tranzacții curente folosind comanda SAVEPOINT.
Astfel, tranzacția poate fi împărțită în secțiuni mai mici. Se creează posibilitatea de a
anula modificările temporare pâna la acel marcaj folosind comanda ROLLBACK TO
SAVEPOINT.
Dacă este creeat un al doilea savepoint cu același nume ca unul anterior, savepoint-ul
anterior este șters.
SQL> UPDATE . . .
SQL> SAVEPOINT marker_1;
Savepoint created.
SQL> INSERT. . .
SQL> ROLLBACK TO marker_1;
Rollback complete.
17
INCLUDEREA CONSTRÂNGERILOR
Constrângerile previn introducerea de date invalide în tabel.
Utilizarea constrângerilor are ca efect:
- forțează regulile la nivel de tabel atunci când este inserat, actualizat sau șters un rând
din tabel; operația este încheiată cu succes dacă este respectată constrângerea
- previne ștergerea unui tabel dacă există dependențe din alte tabele.
Definirea constrângerilor
Sintaxa
1
Toate constrângerile sunt cuprinse într-un dicționar. Este ușor să se facă referință la constrângeri
dacă li se dau nume sugestive. Numele unei constrângeri trebuie să urmeze un anumit standard.
Dacă nu se denumește constrângerea, serverul Oracle generează un nume de forma SYS_Cn,
unde n este un număr întreg astfel încât numele constrâgerii este unic.
Constrângerile definite pentru un anumit tabel pot fi vizualizate ân USER_CONSTRAINTS
(dicționarul tabelului).
De obicei, constrângerile sunt create în același timp cu tabelul, dar pot fi și adăugate tabelului
după crearea lui.
Constrângerile pot fi definite pe două nivele:
• Coloană - Face referire la o singură coloană; poate defini orice tip de constrângere de
integritate
• Tabel - Face referire la una sau mai multe coloane; poate defini orice constrângere,
exceptând pe cea de tip NOT NUL.
Sintaxa
1. Constrângere la nivel de coloană
coloană,..
[CONSTRAINT nume_constrângere] tip_constrângere
(coloană,...),
Constrângerea NOT NULL ne asigură că valorile null nu sunt permise în coloana respectivă.
Coloanele fără constrângerea NOT NULL pot conține, implicit, valori null.
ang
A_NUME DATA_ANGAJARE SALARIU BONIFICAȚIE POST MATRICOL NR.DEPT
IONESCU 11 IAN 2000 5500 INGINER 1489 1
POPESCU 18 NOV 2011 1550 INGINER 7852 1
VASILESCU 23 AUG 2011 1800 ECONOMIST 2598 2
ANDRONACHE 1 MAI 2017 2250 ECONOMIST 12358 3
GEORGESCU 2 SEPT 2000 3500 AGENT 2466 4
VÂNZĂRI
TACHE 22 IUL 2015 1450 ECONOMIST 1587 2
IONESCU 25 AUG 1999 4520 INGINER 675 3
2
Constrângerea NOT NULL definită la nivel de coloană
… nr.dept NUMBER(7,2)
CONSTRAINT ang_nr.dept_nn NOT NULL …
dept
inserare
O constrângere de integritate cheie unică cere ca fiecare valoare din coloana sau set de
coloane să fie unică – două înregistrări ale tabelului nu pot avea valori duplicat în coloana sau
setul de coloane care formează constrângerea. Coloana (setul de coloane) inclusă în definiția
cheii unice se numește cheie unică. Dacă cheia unică conține mai multe coloane se numește
cheie unică compusă.
Constrângerea cheie unică permite introducerea de valori null dacă nu a fost definită o
constrângere NOT NULL pentru acea coloană.
3
Orice număr de înregistrări pot include valori null în coloane fără constrângerea NOT
NULL.
O valoare null într-o coloană (sau în toate coloanele unei chei unice compuse)
întotdeauna satisface o constrângere de cheie unică.
Constrângerea cheie unică (unique key) definită la nivel de tabel sau coloană
inserare
4
Constrângerea cheii primare definită la nivel de coloană sau tabel
ang
A_NUME DATA_ANGAJARE SALARIU BONIFICAȚIE POST MATRICOL NR.DEPT
IONESCU 11 IAN 2000 5500 INGINER 1489 1
POPESCU 18 NOV 2011 1550 INGINER 7852 1
VASILESCU 23 AUG 2011 1800 ECONOMIST 2598 2
ANDRONACHE 1 MAI 2017 2250 ECONOMIST 12358 3
GEORGESCU 2 SEPT 2000 3500 AGENT 2466 4
VÂNZĂRI
TACHE 22 IUL 2015 1450 ECONOMIST 1587 2
IONESCU 25 AUG 1999 4520 INGINER 675 3
inserare
nu este permisă, nu există nr.dept 7 în tabelul dept
A_NUME DATA_ANGAJARE SALARIU BONIFICAȚIE POST MATRICOL NR.DEPT
Claudiu 15.oct.2017 1950 ECONOMIST 5555 7
Vasile 15.oct.2017 1950 ECONOMIST 5556
permisă
5
Cheia externă, sau constrângerea de integritate referențială, desemnează o coloană sau o
combinație de coloane în funcția de cheie externă și stabilește o relație cu o cheie primară sau o
cheie unică în același tabel sau un tabel diferit.
În exemplu, nr.dept a fost definit cheie externă în tabelul ang (dependent sau tabel copil); ea
referă coloana nr.dept din tabelul dept (referit sau tabel părinte).
Valoarea unei chei externe trebuie să se potrivească cu o valoare existentă în tabelul părinte
sau să fie NULL.
Constrângerile cheii externe pot fi definite la nivelul constrângerilor de tabel sau de coloană.
O cheie externă compusă este creată folosind definițiile la nivel tabel.
Exemplul de mai sus definește o constrângere de tip cheie externă în coloana nr.dept din
tabela ang. Numele constrângerii este ang_nr.dept_fk.
6
• ON DELETE SET NULL convertește valorile foreign key în valori nule atunci
când valoarea părinte este ștearsă.
Constrângerile externe sunt definite în tabelul copil și tabelul care conține coloana la care se
face referință devine părinte.
Fără opțiunea ON DELETE CASCADE, rândul din tabelul părinte nu va putea fi șters dacă
este referit în tabelul copil.
Sintaxa:
Pentru tabelul pers se poate impune o constrângere de tip check la nivelul vârstei (pentru a fi
angajat, trebuie să fii major).
pers
nume matricol nr.depr vârsta copii pasiuni
Ionescu 1489 1 25 1 citit
Popescu 7852 1 39 2 scris
Vasilescu 2598 2 45 1 ascultat
Andronache 12358 3 34 1 vorbit
Georgescu 2466 4 62 3 mancare
Tache 1587 2 40 0 bautura
Iancu 675 5
se va termina cu succes:
1 row(s) affected
7
iar inserarea
se va termina cu eșec:
Observație:
Denumirea constrângerii este opțională, dar recomandată. Dacă nu se dă nume
constrângerilor, sistemul va genera nume implicit SYS_Cn .
Exemplu: Se doreşte ca pe coloana nume a tabelului pers să nu existe valori nule sau identice
şi lungimea minimă să fie de 6 caractere:
Sintaxa generală:
ALTER TABLE tabel
DROP PRIMARY KEY| UNIQUE (coloană)|CONSTRAINT nume_constrângere
[CASCADE];
8
Defalcat:
ALTER TABLE tabel
DROP PRIMARY KEY [CASCADE];
Exemplu:
Eliminarea constrângerii de tip cheie primară din tabelul dept precum și eliminarea
constrângerii externe asociate la coloana ang-nr.dept.
Table altered.
Dezactivarea constrângerilor
Dezactivarea constrângerii se efectuează cu declaraţia ALTER TABLE însoţită de clauza
DISABLE.
Sintaxa:
Exemplu:
9
Table altered.
Clauza DISABLE se poate folosi atât în funcția CREATE TABLE cât și în funcția ALTER
TABLE.
Clauza CASCADE dezactivează constrângerile de integritate dependente.
Activarea constrângerilor
Activarea unei constrângeri de integritate care este dezactivată se face utilizând ALTER
TABLE cu clauza ENABLE..
Sintaxa:
ALTER TABLE tabel
ENABLE CONSTRAINT nume_constrângere [CASCADE];
Table altered.
• Dacă se activează o constrângere, constrângerea este aplicată tuturor datelor din tabel.
Toate datele din tabel trebuie să îndeplinească condițiile din constrângere.
• Dacă se activează o constrângere de tip unic sau cheie primară, atunci este creat în mod
automat un index de tip unic.
• Clauza ENABLE se poate folosi atât în funcția CREATE TABLE cât și în funcția ALTER
TABLE.
Vizualizarea constrângerilor
După crearea unui tabel, se poate confirma existența sa prin folosirea comenzii DESCRIBE.
Singura constrângere care poate fi verificată în această situație este constrângerea NOT NULL.
Pentru a vedea toate constrângerile din tabel, este necesară interogarea tabelului
USER_CONSTRAINTS.
Interogarea tabelului USER_CONSTRAINTS pentru a putea vedea toate numele și definițiile
constrângerilor se face în modul următor:
CONSTRAINT_NAME C SEARCH_CONDITION
SYS_C00674 C A_NUME IS NOT NULL
SYS_C00675 C NR.DEPT IS NOT NULL
ANG_MATRICOL_PK P
…
10
Constrângerilor care nu primesc un nume de la posesorul tabelei, li se atribuie un nume
automat de către sistem. La tipul constrângerii, C provine de la CHECK, P de la PRIMARY
KEY, R de la integritate referențială și U de la UNIQUE. De observat faptul că constrângerea
NOT NULL este o constrângere de tip CHECK.
CONSTRAINT_NAME COLUMN_NAME
ANG_NR.DEPT_FK NR.DEPT
ANG_MATRICOL_PK MATRICOL
SYS_C00675 NR.DEPT
11
Restricționarea și sortarea datelor
(Cum putem limita numărul de linii returnat de o interogare și cum putem sorta aceste linii)
La citirea datelor dintr-o bază de date, ar pute fi util să fie redus numărul de linii afișate sau să fie
specificată o anumită ordine în afișarea acestora.
„selectează toți
angajații din
departamentul 2”
În exemplul de mai sus s-a dorit afișarea tuturor angajaților din departamentul 2. Ca urmare, singurele
returnate sunt setul de linii care au valoarea 2 în coloana nr.dept. Această restricționare reprezintă baza
clauzei WHERE în limbajul SQL.
În sintaxă:
WHERE restricționează interogarea la liniile ce îndeplinesc condiția.
condiție e compusă din nume de coloane, expresii, constante și operatori de
comparație.
Clauza WHERE poate compara valorile din coloane, valori literale, expresii aritmetice sau funcții.
Clauza WHERE e compusa din trei elemente:
Numele coloanei
Operatorul de comparație
Nume de coloană, constantă sau listă de valori
Tabelul ang
2
SQL> SELECT a_nume, post, nr.dept
FROM ang
WHERE a_nume = ‘Tache’;
Deși șirurile de caractere și datele prezente în clauza WHERE trebuie incluse între apostrofuri (‘ ‘),
constantele numerice nu trebuie incluse.
Toate căutările de tip caracter sunt case-sensitiv.
În cazul instrucțiunii următoare nu este returnată nicio linie deoarece nu există potrivire între forma în
care este scrisă condiția și modul în care aceasta este înscrisă în tabela ang.
ang
Operator Comentariu
= Egal cu
> Mai mare decât
>= Mai mare sau egal
< Mai mic decât
<= Mai mic sau egal
<> Diferit de
Exemple:
WHERE data_angajare=’ 1 mai 2017’
WHERE salariu >= 1500
WHERE a_nume=’Ionescu’
3
Exemplu de utilizare a clauzei WHERE cu operator
ang
Se lansează comanda:
Rezultatul afișat:
În exemplul de mai sus, instrucțiunea SELECT returnează numele, salariul și bonificația din tabela ang,
unde salariul angajatului este mai mic sau egal decât valoarea comisionului. De observat că nu este o
valoare explicită în clauza WHERE. Cele două valori comparate sunt luate din coloanele salariu,
respectiv bonificație din tabela ang.
Alți operatori care pot fi utilizați în clauza WHERE, în afara celor de comparație:
Operator Semnificatie
BETWEEN Între două valori (inclusiv)
…AND…
IN(listă) Orice valoare din listă
LIKE Corespunde unui tip de caracter
IS NULL Este o valoare nula
4
Folosirea operatorului BETWEEN
Lansând comanda:
A_NUME SALARIU
POPESCU 1550
VASILESCU 1800
ANDRONACHE 2250
TACHE 1450
Prin folosirea operatorului BETWEEN s-au afișat liniile pentru care valoarea existentă se găsește
într-un interval specificat printr-o limită inferioară și una superioară.
Ca urmare, instrucțiunea SELECT cu clauza WHERE și operatorul BETWEEN va afișa liniile din
tabela ang pentru toți angajații ale căror salarii sunt cuprinse între 1500 și 3000.
5
Folosirea operatorului IN
Lansând comanda:
Dacă în listă sunt folosite caractere sau date, acestea trebuie incluse între apostrofuri (‘ ‘).
6
Folosirea operatorului LIKE
Operatorul LIKE se folosește pentru a efectua căutări cu caractere wildcard în șiruri valide de
căutare.
Condițiile căutării pot conține fie caractere literale, fie numere
% Reprezintă orice secvență de două sau mai multe caractere
_ Reprezintă un singur caracter
Nu întotdeauna se știe valoarea exactă care va fi căutată. De exemplu, nu se cunoaște numele exact al
angajatului, dar se știe că începe cu litera A. Se pot selecta linii care se potrivesc după un tip de
caractere folosind operatorul LIKE. Operația de potrivire după un tip de caractere este referită ca o
căutare cu caractere wildcard.
Având tabela
ang
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
lansând comanda:
se va afișa:
A_NUME
ANDRONACHE
Instrucțiunea SELECT va returna numele tuturor angajaților din tabela ang al căror nume începe cu
“A”. Numele care încep cu “a” nu vor fi returnate.
Operatorul LIKE poate fi folosit ca scurtătură pentru câteva comparații făcute cu BETWEEN.
7
Următorul exemplu afișează numele și data angajării, angajaților având data angajării cuprinsă între 1
ianuarie 2011 si 31 decembrie 2011.
Având tabela
ang
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
Rezultat:
A_NUME DATA_ANGAJARE
POPESCU 18 NOV 2011
VASILESCU 23 AUG 2011
ang
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
cu comanda
se vor afișa numele angajaților al căror nume conține pe a doua poziție litera o
A_NUME
IONESCU
POPESCU
8
Simbolurile % si _ pot fi folosite în orice combinație cu caractere literale.
Pentru a căuta caracterele “%” și “_” în interiorul unui șir de caractere, se poate folosi identificatorul
ESCAPE. Utilizarea acestei opțiuni implică necesitatea de a specifica care este caracterul ESCAPE.
Pentru a afișa numele tuturor angajaților care conțin secvența “A_B” se va folosi următoarea sintaxă a
instrucțiunii SELECT:
În acest exemplu, opțiunea ESCAPE identifică caracterul backslash (\) ca fiind caracter ESCAPE.
Operatorul IS NULL caută valorile nule. O valoare nulă e o valoare care nu e disponibilă, neatribuită,
necunoscută sau neaplicabilă. Din această cauză nu poate fi testată cu “=” deoarece o valoare
inexistentă nu poate fi egala sau inegala cu orice altă valoare.
ang
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
Iancu 25 sept 2017 16000 CEO
Pentru a găsi un angajat care nu este afiliat unui departament, lansăm comanda:
Rezultat:
A_NUME
IANCU
9
Operatori logici
Operator Comentariu
AND Returnează TRUE dacă ambele componente ale condiției sunt
adevărate
OR Returnează TRUE dacă cel puțin una dintre componentele condiției
este adevărată
NOT Returnează TRUE dacă condiția este falsă
Un operator logic combină rezultatul a două componente de tip condiție pentru a produce un singur
rezultat bazat pe acestea sau pentru a inversa rezultatul unei singure condiții.
ang
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
Iancu 25 sept 2017 16000 CEO
Comanda
În exemplul de mai sus, pentru a fi selectată vreo înregistrare, ambele condiții trebuie să fie adevărate.
De aceea, dintre cei trei economiști a fost selectat numai cel care are n salariu mai mare de 2000.
Toate căutările de tip caracter sunt case-sensitiv.
Nu va fi returnată nicio linie dacă economist nu este scris numai cu litere mici.
Șirurile de caractere trebuie incluse între apostrofuri.
10
Tabela de adevăr a operatorului AND:
Folosirea operatorului OR
ang
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
Comanda
SQL> SELECT a_nume, salariu, post
FROM ang
WHERE salariu>=2000
OR post=’economist’;
va avea ca rezultat:
După cum se observă, în exemplul de mai sus au fost selectați toți angajații care au salariul mai mare
sau egal cu 2000 sau (OR) sunt economiști (una dintre condiții adevărată).
11
Folosirea operatorului NOT
Operatorul NOT (negare) va determina afișarea tuturor liniilor care nu îndeplinesc condiția de după el.
ang
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
Comanda
are ca rezultat
A_NUME POST
IONESCU INGINER
POPESCU INGINER
Vor fî afișați toți angajații care nu sunt economiști sau agent vânzări.
Operatorul NOT poate fi folosit cu alți operatori SQL, cum ar fi BETWEEN, LIKE și NULL.
NOT BETWEEN
ang
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
12
Comanda
SQL> SELECT a_nume, salariu
FROM ang
WHERE salariu NOT BETWEEN 1500 AND 3000;
va avea ca efect
A_NUME SALARIU
IONESCU 5500
GEORGESCU 3500
TACHE 1450
NOT LIKE
ang
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
Iancu 25 sept 2017 16000 CEO
Comanda
SQL> SELECT a_nume
FROM ang
WHERE a_nume NOT LIKE ‘A%’;
va afișa
A_NUME
IONESCU
POPESCU
VASILESCU
GEORGESCU
TACHE
13
NOT IS NULL
ang
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
Iancu 25 sept 2017 16000 CEO
Comanda
Prioritățile operatorilor
14
Un exemplu de apariție a mai multor operatori în interiorul clauzei WHERE:
ang
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
Iancu 25 sept 2017 16000 CEO
Utilizând comanda
Conform priorităților operatorilor care impune tratarea prioritară a lui AND, apoi a lui OR,
instrucțiunea SELECT va fi interpretată “selectează liniile în care angajații sunt agent vânzări și au
salariul mai mare decât 4000 sau angajații ocupă post de economist”.
Rezultat:
ang
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
Iancu 25 sept 2017 16000 CEO
15
În această situație instrucțiunea SELECT se va interpreta: “Selectează linia dacă angajatul este
economist sau agent vânzări si dacă angajatul câștigă mai mult de 2000.”
Rezultat:
Clauza ORDER BY
Utilizând această clauză, liniile pot fi afișate fie în ordine crescătoare (ASC) - implicit, fie în ordine
descrescătoare (DESC). Se poate specifica sortarea după o expresie sau după un alias.
În comanda SELECT, clauza ORDER BY este ultima.
Sintaxa:
SELECT expresie
FROM tabel
[WHERE condiție/(i)]
[ORDER BY {coloana, expresie} [ASC]|[DESC]];
ang
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
16
Ordinea implicită a sortării datelor este cea ascendentă.
ang
a_nume data_angajare salariu 12*salariu post nr.dept
Ionescu 11 ian 2000 5500 66000 inginer 1
Popescu 18 nov 2011 1550 18600 inginer 1
Vasilescu 23 aug 2011 1800 21600 economist 2
Andronache 1 mai 2017 2250 27000 economist 3
Georgescu 2 sept 2000 3500 42000 agent vânzări 4
Tache 22 iul 2015 1450 16400 economist 2
17
SQL> SELECT a_nume, 12*salariu salariu_anual
FROM ang
ORDER BY salariu_anual;
• Ordinea listei apărută în clauza ORDER BY este ordinea în care se va face sortarea.
ang
a_nume data_angajare salariu 12*salariu post nr.dept
Ionescu 11 ian 2000 5500 66000 inginer 1
Popescu 18 nov 2011 1550 18600 inginer 1
Vasilescu 23 aug 2011 1800 21600 economist 2
Andronache 1 mai 2017 2250 27000 economist 3
Georgescu 2 sept 2000 3500 42000 agent vânzări 4
Tache 22 iul 2015 1450 16400 economist 2
Se observă faptul că prima coloană este ordonată ascendent (implicit), iar a doua coloană descendent,
întrucât s-a specificat în cazul acesteia clauza DESC.
Dacă se dorește ca ambele coloane să fie afișate descendent, trebuie ca în dreptul ambelor coloane să
apară opțiunea DESC.
18
SQL> SELECT a_nume, nr.dept, salariu
FROM ang
ORDER BY nr.dept DESC, salariu DESC;
19
Funcții de un singur rând
Funcțiile constituie blocul de bază al interogării mai puternic și sunt folosite pentru a manipula
date.
Funcție Rezultat
argumente 1..n
n
Funcții SQL
Funcțiile reprezintă o componentă importantă a limbajului SQL, și pot fi utilizate pentru a face
următoarele:
- Calcule matematice asupra datelor
- Modificarea unor elemente individuale
- Manipularea ieșirii pentru grupuri de rânduri
- Stabilirea unui format pentru date calendaristice și numere atunci când acestea sunt afișate
- Schimbarea tipului de dată a unei coloane
Funcțiile de un singur rând acționează doar asupra unui singur rând la un moment dat și întorc
un rezultat pentru fiecare rând.
Dintre funcțiile de un singur rând, le vom analiza pe cele care se referă la următoarele tipuri:
• Caracter - acceptă argumente de tip caracter și întorc rezultate de tip caracter sau
numeric
• Număr - : acceptă argumente de tip numeric și întorc rezultate de tip numeric
• Data calendaristică - acceptă argumente de tip dată calendaristică și întorc rezultate de
tip dată calendaristică, cu excepția funcției MONTH_BEETWEEN care întoarce o
valoare numerică
• Conversie - fac conversia dintr-un tip de dată în altul
Funcțiile de mai multe rânduri acționează asupra unor grupuri de rânduri și întorc un rezultat
pentru fiecare grup.
Cum spuneam, funcțiile de un singur rând sunt utilizate pentru a manipula date. Ele acceptă
unul sau mai multe argumente și întorc o singură valoare pentru fiecare rând rezultat din
interogare. O funcție poate avea ca argument unul din următoarele:
- O constantă furnizată de utilizator
1
- O variabilă
- O denumire de coloană
- O expresie
Sintaxa:
unde,
Funcții pentru
caractere
2
Funcții de conversie a caracterelor din/în litere mari în/din litere mici.
1. Având tabelul
ang
a_nume post nr.dept
IONESCU INGINER 1
POPESCU INGINER 1
VASILESCU ECONOMIST 2
cu comanda:
Detalii angajați
-----------------------------------------------------------------
Postul ocupat de Ionescu este inginer
Postul ocupat de Popescu este inginer
Postul ocupat de Vasilescu este economist
3 rows selected.
2. Având tabelul
ang
a_nume data_angajare salariu
Ionescu 11 ian 2000 5500
Popescu 18 nov 2011 1550
Vasilescu 23 aug 2011 1800
Andronache 1 mai 2017 2250
Georgescu 2 sept 2000 3500
Tache 22 iul 2015 1450
3
Lansând comanda
Clauza WHERE din specifică numele angajatului ca fiind IONESCU. În tabelul ang numele
este scris cu prima literă mare, restul mici. Ca urmare, IONESCU nu poate fi găsit - nu se
afișează nimic.
În această a doua situație, clauza WHERE face mai întîi conversia numelui memorat în tabela
din litere mari în inițială mare, restul mici și compară rezultatul obținut cu numele ‘Ionescu’.
Există corespondență, deci se pot selecta informațiile necesare din tabel.
Clauza WHERE mai poate fi scrisă ca în exemplul de mai jos, efectul instrucțiunii fiind
același.
Cele șade funcții pentru manipulat caracatere pe care le vom analiza sunt:
• CONCAT (expresie|coloană1, expresie|coloană2): Concatenează cei doi parametri. Funcția
limitează numărul parametrilor la 2.
• SUBSTR(expresie|coloană, m, n) - Întoarce un șir de caractere din cadrul valorii de tip
caracter începând cu poziția m și având lungimea n. Dacă m este negativ, atunci poziția de
început a numărării se consideră a fi ultimul caracter din șir. Dacă n este omis, atunci
funcția întoarce toate caracterele de la poziția m pâna la sfîrșitul șirului.
• LENGTH(expresie|coloană): Întoarce lungimea șirului de caractere (întoarce o valoare
numerică).
• INSTR(expresie|coloană, c): Gasește poziția caracterului specificat.
• LPAD(expresie|coloană,n,’șir caractere’): Funcție cu trei argumente. Întoarce un șir de
caractere rezultat prin inserarea celui de al treilea argument la stînga primului argument,
lungimea rezultatului având lungimea specificată de cel de-al doilea argument.
• RPAD: are un comportament similar cu funcția LPAD, dar inserarea se face la dreapta
primului argument.
4
Exemple de utilizare:
Utilizând funcțiile pentru manipulat caractere, se poate alege un mod particular de afișare a
informațiilor dintr-un tabel:
ang
a_nume post nr.dept
IONESCU INGINER 1
ION INGINER 1
VASILESCU ECONOMIST 2
IONESCU IONESCUINGINER 7 4
ION IONINGINER 3 0
Exemplul de mai sus afișează numele angajatului, numele șipostul concatenate, lungimea
numelui și poziția literei E în cadrul numelui, pentru toți angajații care au funcția de inginer.
ang
a_nume post nr.dept
IONESCU INGINER 1
ION INGINER 1
VASILESCU ECONOMIST 2
A_NUME POST
ION INGINER
5
Funcții pentru valori numerice
Funcțiile pentru valori numerice acceptă ca argument valori numerice și întorc valori
numerice.
Funcția ROUND
6
Exemple de utilizare:
are ca rezultat
ROUND(123.9994, 3)
----------------------------
123.9990
are ca rezultat
ROUND(123.9995, 3)
----------------------------
124.0000
În Oracle, SELECT impune utilizarea clauzei FOR. Pentru funcțiile numerice, există un tabel
implicit de o linie și o coloană numit DUAL.
Tabelul DUAL este proprietatea utilizatorului SYS și poate fi accesat de toți utilizatorii. El
conține o coloană DUMMY (substitut, fictiv), si un rând cu o valoare. Se utilizează atunci
când se întoarce o singură valoare (valoarea unei constante, pseudocoloane sau o expresie)
care nu provine dintr-un tabel cu datele utilizatorului.
rezultat:
ROUND(34.4158,-1)
----------------------------
30
Funcția TRUNC
Exemple de utilizare:
are ca rezultat:
7
TRUNC(2.465,1)
----------------------
2.4
, iar
TRUNC(142.465,-2)
-------------------------
100
Funcția MOD
Exemple:
MOD(7,2)
-------------
1
MOD(7,-2)
---------------
1
8
SELECT MOD(-7, 2);
MOD(-7,2)
--------------
-1
bonus
a_nume post salariu 12*salariu+1000
IONESCU INGINER 5500 67000
POPESCU INGINER 1550 19600
VASILESCU ECONOMIST 1800 22600
ANDRONACHE ECONOMIST 2250 28000
GEORGESCU AGENT VÂNZĂRI 3500 43000
TACHE ECONOMIST 1450 18400
Rezultatul execuției:
Exemplul de mai sus calculează restul împărțirii dintre salariu și salariul anual + bonificație
pentru toți angajații care sunt agenți vânzări (se poate verifica astfel dacă bonificația este cea
corectă).
Date calendaristice
Oracle memorează datele calendaristice într-un format numeric intern: secol, an, lună, zi, oră,
minut, secundă.
Formatul implicit pentru date calendaristice este: DD-MON-YY.
Fincția care întorce data și timpul este SYSDATE.
Pentru a vedea rezultatul întors de SYSDATE, este utilizată tabela DUAL.
9
SYSDATE poate fi utilizată ca orice denumire de coloană. De exemplu, se poate afișa data
curentă selectând SYSDATE dintr-un tabel. Pentru afișarea datei poate fi utilizat și tabelul
fictiv DUAL.
Exemple:
rezultat:
--------------------------
7/20/2013 2:49:59 PM
10
2. SQL> SELECT TO_CHAR (SYSDATE, 'MM-DD-YYYY HH24:MI:SS') "NOW"
FROM DUAL;
rexultat:
NOW
--------------------------
05-Ian-2015 15:39:45
Întrucât datele calendaristice sunt memorate în baxele de date ca numere, asupra acestor date
se pot efectua operații aritmetice utilizînd operatori aritmetici cum ar fi + și - .
ang
a_nume salariu data_angajare nr.dept
IONESCU 5500 11 ian 2000 1
POPESCU 1550 18 nov 2011 1
VASILESCU 1800 23 aug 2011 2
ANDRONACHE 2250 1 mai 2017 3
GEORGESCU 3500 2 sept 2000 4
TACHE 1450 22 iul 2015 2
A_NUME SĂPTĂMÂNI
IONESCU 896.235
POPESCU 311.495
Exemplul de mai sus prezintă un tabel cu numele angajaților din departamentul 1 alături de
perioada de timp de câmd au fost angajați, exprimată în saptamâni. Pentru a afiașa perioada de
câmd sunt angajații în saptamâni se face diferența între data curentă (furnizată de SYSDATE)
11
și data la care a fost angajată persoana respectivă (luată din coloana data_angajare din tabelul
ang) și apoi se împarte rezultatul la 7. După operația aritmetică s-a specificat numele noii
coloane obținută în urma calculului.
Funcțiile pentru date calendaristice operează asupra datelor calendaristice de tip Oracle.
Toate funcțiile pentru date întorc o valoare de tip dată, cu exceptia funcției
MONTH_BETWEEN, care întoarce o valoare numerică.
• MONTHS_BETWEEN(data1, data2): Calculează numărul de luni dintre data1 și data2.
Rezultatul poate fi pozitiv sau negativ. Dacă data1 este mai apropiată de prezent decât
data2, atunci rezultatul este pozitiv. Partea zecimală a rezultatului reprezintă o parte din
lună.
exemplu: MONTHS_BETWEEN (‘11-SEP-97’,’12-JAN-95’) 22.0124374
Exemplu:
SQL> SELECT MONTHS_BETWEEN
(TO_DATE('02-02-2015','MM-DD-YYYY'),TO_DATE('12-01-2014','MM-DD-YYYY') )
"Luni"
FROM DUAL;
12
rezultat:
Luni
---------------
2.03225806
Exemplu:
ang
a_nume salariu data_angajare nr.dept
IONESCU 5500 11 ian 2000 1
POPESCU 1550 18 nov 2011 1
VASILESCU 1800 23 aug 2011 2
ANDRONACHE 2250 1 mai 2017 3
GEORGESCU 3500 2 sept 2000 4
TACHE 1450 22 iul 2015 2
13
rezultat:
14
• LAST_DAY(data): Determină data calendaristică a ultimei zile din lună, care urmează
datei “data”
exemplu: LAST_DAY (‘01-SEP-95’) ‘30-SEP-95’
Exemplu de utilizare:
rezultat:
15
• ROUND(data[,’fmt’]): Întoarce data rotunjită în funcție de formatul fmt. Dacă fmt este
omis, data este rotunjită la cea mai apropiată data.
exemplu:
efect:
16
• TRUNC(data[,’fmt’]): Întoarce data “data” trunchiata în funcție de de formatul fmt. Dacă
fmt este omis, data este rotunjită la cea mai apropiată zi.
exemplu:
efect:
An trunchiat
-----------------
01-JAN-15
17
Funcii pentru conversia tipului de date
Conversia tipului
de date
Funcțiile de conversie transformă tipul unei valori în altul. În general, funcțiile de conversie
respectă următoarea formă: tip de dată1 TO tip de dată2, unde tip de dată1este tipul de dată
care trebuie transformat și reprezintă intrarea, iar tip de dată2este tipul de dată spre care se
face conversia și reprezintă ieșirea.
Conversiile de date implicite se fac conform unui set de reguli.
Conversiile de date explicite se fac utilizînd funcții de conversie.
Deși se fac conversii de date în mod implicit atunci când este nevoie, este recomandat ca
aceste conversii să fie făcute explicit de către utilizator, pentru a asigura corectitudinea
instrucțiunilor.
În cazul operațiilor de atribuire, se fac automat conversiile (din tipul de dată al sursei în tipul
de dată al destinației):
În cazul evaluării expresiilor (în cazul în care regulile de conversie pentru atribuire nu acoperă
și situația respectivă), Oracle face automat conversia:
• Din VARCHAR2 sau CHAR în NUMBER
• Din VARCHAR2 sau CHAR în DATE
Observații:
Conversia din CHAR în NUMBER are loc cu succes doar dacă șirul de caractere reprezintă
un număr valid.
Conversia din CHAR în DATE are loc cu succes doar dacă șirul de caractere respectă formatul
implicit: DD-MON-YY.
18
Conversii de date explicite
TO_NUMBER TO_DATE
TO_CHAR TO_CHAR
TO_CHAR (număr|data calendaristică, [‘fmt’]) - Face conversia dintr-un număr sau o dată
calendaristică într-un șir de caractere de tipul VARCHAR2, respectând formatul fmt specificat.
TO_NUMBER (caracter) - Face conversia dintr-un șir de caractere ce conține cifre într-o
valoare numerică
TO_DATE (caracter ,[‘fmt’]) - Face conversia dintr-un șir de caractere ce reprezintă o dată
într-o valoare de tip DATE respectând formatul fmt specificat. Dacă fmt este omis, formatul
implicit este DD-MON-YY.
19
Utilizarea funcției TO_CHAR împreună cu date calendaristice
Sintaxa:
Observații
• Trebuie inclus între apostrofuri și este case sensitive
• Poate include orice element valid al modelului de formatare pentru date calendaristice.
Valoarea trebuie separata de modelul de formatare prin virgula.
• Pentru numele zilelor și a lunilor, la ieșire, se adaugă automat spații. Pentru a elimina
spațiile si zerourile nesemnificative, se folosește elementul pentru modul de umplere.
• Există posibilitatea de a redimensiona lungimea pe care se face afișarea pentru un câmp cu
ajutorul comenzii SQL*Plus COLUMN.
• Lungimea implicită a coloanei rezultate este de 80 caractere.
Element Descriere
SCC sau CC Secol:S precede data î.e.n cu -
YYYY sau SYYYY Anul: S precede data î.e.n cu -
(an în cadrul datelor calendaristice)
YYY sau YY sau Y Ultimele 3,2 sau 1 cifre din an
Y,YYY O virgula în cadrul anului
[YYY,[YY,[Y,] 4,3,2 sau o cifra din an conform standardului
ISO
SYEAR sau YEAR Anul în litere :S precede data î.e.n cu -
BC sau AD Indicatorul BC AD
B.C. sau A.D. Indicatorul BC AD cu puncte
Q Sfertul unui an
MM Luna scrisă cu doua cifre
MONTH Numele întreg al lunii scris pe 9 caractere.
Dacă denumirea lunii nu ocupa cele 9
caractere, spațiul rămas liber este automat
umplut cu spații
MON Abreviere a numelui unei luni formată din trei
litere
RM Luna scrisă cu cifre romane
WW sau W Săptămâna din an sau luna
DDD sau DD sau D Numărul zilei din an, lună sau săptămâna.
DAY Denumirea completă a zilei, completată,
eventual, cu spații pânț la 9 caractere.
20
DY Abreviere a numelui unei zile formată din trei
litere
J Numărul de zile de la data de 31 Decembrie
4713BC
Pentru a afișa ora într-un anumit format sau folosind litere în loc de cifre.
Element Descriere
AM sau PM indicator de meridian
A.M. sau P.M. indicator de meridian cu puncte
HH sau HH12 sau HH24 ora
MI minute (0-59)
SS secunde (0-59)
SSSSS Numărul de secunde începând cu miezul
nopții
Alte formate
Element Descriere
/.. Punctuația este reprodusă în rezultat.
“of the” Este reprodus șirul încadrat între ghilimele
Specificati sufixe
Element Descriere
TH Număr de ordine dat în cifre
SP Număr scris în litere
SPTH sau THSP Număr de ordine scris în litere
Exemple:
ddspth - fourteenth
21
Având tabelul ang
ang
a_nume data_angajare salariu 12*salariu post matricol nr.dept
Ionescu 11 ian 2000 5500 66000 inginer 1489 1
Popescu 18 nov 2011 1550 18600 inginer 7852 1
Vasilescu 23 aug 2011 1800 21600 economist 2598 2
Andronache 1 mai 2017 2250 27000 economist 12358 3
Georgescu 2 sept 2000 3500 42000 agent vânzări 2466 4
Tache 22 iul 2015 1450 16400 economist 1587 2
Ionescu 25 aug 1999 4520 54240 inginer 675 3
să se afișeze numele angajaților cu data angajării în care luna e scrisă coplet, cu litere:
A_NUME DATA_ANGAJARE
7 rows selected
Modificați exemplul de mai sus astfel încât data calendaristică ăa aibă urmatorul format:
Ex. Seventh of February 1981 08:00:00 AM
A_NUME DATA_ANGAJARE
………………….
7 rows selected
De remarcat este faptul că denumirea lunii respecta modelul pentru format specificat
(INITCAP).
22
Utilizarea funcției TO_CHAR împreună cu valori numerice
Atunci când se lucrează cu valori numerice ca șiruri de caractere, ar trebui convertite în valori
de tip caracter utilizând funcția TO_CHAR, care face conversia dintre o valoare de tip
NUMBER într-o valoare de tip VARCHAR2. Această conversie este utilă în cadrul unei
concatenări.
Pentru a converti un număr într-o valoare de tip caracter, se pot utiliza următoarele elemente.
SALARY
--------------
$5,500
23
Observații
Serverul Oracle
• afiseaza semnul # în locul valorii numerice al cărui număr de cifre a depășit
valoarea specificată prin model.
• rotunjește valoarea zecimală la o valoare cu un număr de zecimale specificat de
către modelul de formatare.
TO_NUMBER și TO_DATE
Este posibilă conversia dintr-un sir de caractere într-un număr sau într-o dată calendaristică.
Pentru a realiza aceste tipuri de conversii se utilizează funcțiile TO_NUMBER și TO_DATE.
Modelul după care se face formatarea va trebui alcătuit pe baza elementelor pentru formatare
prezentate anterior.
Pentru a face conversia dintr-un șir de caractere într-un număr se folosește funcția
TO_NUMBER
Sintaxa:
TO_NUMBER (char)
Pentru a face conversia dintr-un șir de caractere într-o dată calendaristică se folosește funcția
TO_DATE
Sintaxa:
TO_DATE (char [, ‘ fmt ’] )
Exemplu
Să se afișeze numele și data angajării pentru toate persoanele care au fost angajate pe January
11, 2000.
ang
a_nume data_angajare salariu 12*salariu post matricol nr.dept
Ionescu January 11, 2000 5500 66000 inginer 1489 1
Popescu 18 nov 2011 1550 18600 inginer 7852 1
Vasilescu 23 aug 2011 1800 21600 economist 2598 2
Andronache 1 mai 2017 2250 27000 economist 12358 3
Georgescu 2 sept 2000 3500 42000 agent vânzări 2466 4
Tache 22 iul 2015 1450 16400 economist 1587 2
Ionescu 25 aug 1999 4520 54240 inginer 675 3
24
A_NUME DATA_ANGAJARE
--------------- --------------------------
IONESCU 11-JAN-00
Formatul RR pentru date calendaristice este similar cu elementul YY, dar va permite
specificarea de secole diferite. Există posibilitatea de a folosi elementul RR în locul
elementului YY pentru formatarea datelor și astfel secolul valorii returnate variază în funcție
de ultimele două cifre specificate în an și de ultimele două cifre ale anului curent. Tabelul
următor descrie comportamentul elementului RR.
25
Funcția NVL
Tipurile de date care pot fi folosite sunt: data calendaristică, caracter și număr.
Sintaxa
Dacă expr1 este NULL, NVL returnează expr2, iar dacă expr1 nu este NULL, returnează
expr1.
unde: expr1 este valoarea sau expresia destinație care conține o valoare nulă.
expr2 este valoarea la care se face conversia
Exemplu de utilizare:
ang
a_nume data_angajare salariu bonificație
Ionescu 11 ian 2000 5500
Popescu 18 nov 2011 1550
Vasilescu 23 aug 2011 1800
Andronache 1 mai 2017 2250
Georgescu 2 sept 2000 3500 2000
Tache 22 iul 2015 1450 1500
26
POPESCU 1550
VASILESCU 1800
ANDRONACHE 2250
GEORGESCU 3500 2000 44000
TACHE 1450 1500 18900
Se poate remarca faptul că salariul anual + bonificația se calculează numai pentru acei angajați
care au o valoare pentru bonificație nenula. Dacă pe colana bonificație apare o valoare nulă,
atunci rezultatul este nul. Pentru a calcula valorile pentru toți angajații trebuie convertite
valorile nule în valori numerice înainte de a aplica operatorul aritmetic.
O soluție corectă pentru această problemă este prezentată în următor în care, pentru conversia
valorilor nule, s-a folosit funcția NVL.
Functia DECODE
Faciliteaza simularea unor structuri de tip CASE sau
IF-THEN-ELSE
Funcția DECODE
27
Funcția DECODE evaluează o expresie într-un mod similar structurii IF-ELSE
Sintaxa:
Funcția DECODE evaluează expresia după ce o compara cu fiecare valoare căutare. Dacă
valoarea expresiei este aceeași cu valoarea conținută în căutare atunci este întoarsă valoarea
rezultat.
Dacă valoarea implicită este omisă, funcția va întoarce o valoare nula în cazul în care valoarea
expresiei nu se potrivește cu nicio valoare căutare.
Se dorește modificarea salariilor pentru anumite posturi: crește cu 10% pentru ingineri, cu
15% pentru operatori, cu 20% pentru manageri, restul salariilor rămânând neschimbate.
ang
a_nume post salariu
Ionescu inginer 5500
Popescu inginer 1550
Vasilescu economist 1800
Andronache economist 2250
Georgescu agent vânzări 3500
Tache economist 1450
28
POST SALARIU SALARIU_ACTUALIZAT
29
Funcții de grup
Fucțiile de grup opereaza pe seturi de linii, oferind un singur rezultat pentru tot grupul.
• AVG
• COUNT
• MAX
• MIN
• STDDEV
• SUM
• VARIANCE
Fiecare dintre funcțiile de grup acceptă un argument. Următorul tabel identifică opțiunile
posibile:
Funcție Descriere
AVG([DISTINCT|ALL]n) Valoarea medie a lui ’’n’’, ignorând
valorile nule;
COUNT({*|[DISTINCT|ALL]expr}) Numără toate rândurile selectate folosind
*, inclusiv duplicatele și rândurile cu
valori nule.
MAX([DISTINCT|ALL]expr) Valoarea maximală a expresiei, ignorând
valorile nule;
MIN([DISTINCT|ALL]expr) Valoarea minimă a expresiei, ignorând
valorile nule;
STDDEV([DISTINCT|ALL]x) Abaterea standard a lui ’’n’’, ignorând
valorile nule;
SUM([DISTINCT|ALL]n) Suma valorilor lui ’’n’’, ignorând valorile
nule;
VARIANCE([DISTINCT|ALL]x) Variația lui ’’n’’, ignorând valorile nule;
ang
a_nume data_angajare salariu 12*salariu post matricol nr.dept
Ionescu 11 ian 2000 5500 66000 inginer 1489 1
Popescu 18 nov 2011 1550 18600 inginer 7852 1
Vasilescu 23 aug 2011 1800 21600 economist 2598 2
Andronache 1 mai 2017 2250 27000 economist 12358 3
Georgescu 2 sept 2000 3500 42000 agent vânzări 2466 4
Tache 22 iul 2015 1450 16400 economist 1587 2
Ionescu 25 aug 1999 4520 54240 inginer 675 3
Comanda
SQL> SELECT AVG(salariu), MAX(salariu), MIN(salariu), SUM(salariu)
FROM ang
WHERE post LIKE ‘inginer’;
ang
a_nume data_angajare salariu 12*salariu post matricol nr.dept
Ionescu 11 ian 2000 5500 66000 inginer 1489 1
Popescu 18 nov 2011 1550 18600 inginer 7852 1
Vasilescu 23 aug 2011 1800 21600 economist 2598 2
Andronache 1 mai 2017 2250 27000 economist 12358 3
Georgescu 2 sept 2000 3500 42000 agent vânzări 2466 4
Tache 22 iul 2015 1450 16400 economist 1587 2
Ionescu 25 aug 1999 4520 54240 inginer 675 3
2
Se va afișa:
MIN(DATA_ANGAJARE) MAX(DATA_ANGAJARE)
25-AUG-99 1-MAY-17
Exemplul următor afișează numele primului angajat și al ultimului angajat în ordinea alfabetică a
listei tuturor angajaților.
ang
a_nume data_angajare salariu 12*salariu post matricol nr.dept
Ionescu 11 ian 2000 5500 66000 inginer 1489 1
Popescu 18 nov 2011 1550 18600 inginer 7852 1
Vasilescu 23 aug 2011 1800 21600 economist 2598 2
Andronache 1 mai 2017 2250 27000 economist 12358 3
Georgescu 2 sept 2000 3500 42000 agent vânzări 2466 4
Tache 22 iul 2015 1450 16400 economist 1587 2
Ionescu 25 aug 1999 4520 54240 inginer 675 3
Rezultat:
MIN(A_NUME) MAX(A_NUME)
ANDRONACHE VASILESCU
Funcția COUNT
ang
a_nume data_angajare salariu 12*salariu post matricol nr.dept
Ionescu 11 ian 2000 5500 66000 inginer 1489 1
Popescu 18 nov 2011 1550 18600 inginer 7852 1
Vasilescu 23 aug 2011 1800 21600 economist 2598 2
Andronache 1 mai 2017 2250 27000 economist 12358 3
Georgescu 2 sept 2000 3500 42000 agent vânzări 2466 4
Tache 22 iul 2015 1450 16400 economist 1587 2
Ionescu 25 aug 1999 4520 54240 inginer 675 3
3
Comanda
are ca rezultat:
COUNT(*)
2
ang
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
Iancu 25 sept 2017 16000 CEO
Comanda
SQL> SELECT COUNT(nr.dept)
FROM ang;
va afișa:
COUNT(NR.DEPT)
6
Afișarea numărului de departamente din tabelul ang (fără a verifica coincidențele de valori):
COUNT(NR.DEPT)
6
iar pentru a afișa numărul departamentelor distincte:
COUNT((DISTINCT (DEPTNO))
4
4
Funcțiile de grup și valorile Null
comada
SQL> SELECT AVG(salariu)
FROM ang;
afișează:
AVG(SALARIU)
4500
deoarece media este calculată doar pe baza rândurilor din tabel în care în coloana salariu există o
valoare validă. Media este calculată ca totalul salariilor plătite către toți angajații, împărțit la
numărul angajaților care au salariul stabilit (2).
Cu comanda
AVG(NVL(SALARIU,0))
1285.174
5
Crearea grupurilor de date
Uneori, trebuie împărțit tabelul în grupuri mai mici. Aceasta se poate face folosind clauza
GROUP BY pentru a împărți rândurile din tabel în grupuri. Se pot folosi funcțiile de grup pentru a
întoarce sumarul informației pentru fiecare grup.
Când se folosește clauza GROUP BY, trebuie avut în vedere ca toate coloanele din lista
SELECT care nu sunt în funcțiile de grup să fie incluse în clauza GROUP BY.
Exemplu:
Exemplul de mai sus afișează numărul și media salariilor pentru fiecare departament.
Cum este evaluată comanda SELECT de mai sus, conținând o clauză GROUP BY :
Clauza SELECT specifică coloanele care să fie afișate :
- coloana numărului departamentului
- media tuturor salariilor din grupul specificat în clauza GROUP BY
Clauza FROM tabelul pe care baza de date trebuie sa-l acceseze: tabelul ang.
Clauza WHERE specifică liniile ce trebuie incluse. Dacă nu exista nicio clauză WHERE,
implicit, toate rândurile sunt incluse.
Clauza GROUP BY specifică modul de grupare a rândurilor. Rândurile sunt grupate după
numărul departamentului, deci funcția AVG care este aplicată coloanei salariilor va calcula
media salariilor pentru fiecare departament.
Rezultat:
6
NR.DEPT AVG(SALARIU)
________ _______________
1 3525
2 1625
3 2250
4 3500
Este posibil să nu se folosească numele coloanei după care se face gruparea în clauza SELECT
dar, în această situație, afișarea nu este clară:
AVG(SALARIU)
_______________
3525
1625
2250
3500
Declarația SELECT de mai sus afișează media salariilor pentru fiecare departament fără să
afișeze numărul departamentului respectiv. Fără numărul departamentului, rezultatele nu arată
relevant.
și rezultatele vor fi afișate în ordine crescătoare după valoarea mediei salariilor pe departamente:
NR.DEPT AVG(SALARIU)
________ _______________
2 1625
3 2250
4 3500
1 3525
7
Gruparea mai multor coloane
ang
nr.dept post salariu
1 manager 5000
1 inginer 4000
2 manager 5000
2 inginer 4000
2 analist 3000
3 manager 5000
3 inginer 4000
3 analist 3000
3 inginer 4000
De exemplu, este uneori de interes să aflăm care este fondul de salarii grupat pe funcții și
departamente.
Adică, am dori o situație a salariilor pentru fiecare funcție, grupate după departamente:
Tabelul ang este grupat mai întâi după numărul departamentului și apoi după numele funcției. De
exemplu, cei doi ingineri din departamentul 3 sunt grupați împreună și se afișează un singur rezultat
(suma salariilor).
Se pot obține rezultatele sinteză pentru grupuri și subgrupuri, prin listarea a mai mult de o
coloană în clauza GROUP BY. Ordinea implicită a rezultatelor rezultă din ordinea coloanelor din
clauza GROUP BY.
Având o comandă
SQL> SELECT nr.dept, post, SUM(salariu)
FROM ang
GROUP BY nr.dept, post;
8
- în grupurile formate după numărul departamentului, rândurile se grupează după
numele postului.
Funcția SUM este aplicată coloanei salariilor pentru toate numele de posturi din fiecare grup
după numărul departamentului.
În același mod în care se folosește clauza WHERE pentru a restricționa rândurile selectate,
clauza HAVING se va utiliza pentru a restricționa grupuri.
Comada
se va solda cu o eroare.
WHERE SUM(salariu)>2000
*
ERROR at line 3:
ORA-00934: group function is not allowed here
9
NR.DEPT AVG(SALARIU)
________ _______________
1 3525
2 1625
3 2250
4 3500
este:
NR.DEPT AVG(SALARIU)
________ _______________
1 3525
4 3500
Exemplul care afișează numărul departamentului și salariul maxim la acele departamente la care
salariul maxim este mai mare de 4000.
ang
nr.dept post salariu
1 manager 5000
1 inginer 4000
2 manager 5000
2 inginer 4000
2 analist 3000
3 manager 4000
3 inginer 3000
3 analist 2000
3 inginer 3000
NR.DEPT MAX(SALARIU)
_________ ________________
1 5000
2 5000
Exemplul care afișează numerele departamentelor și salariul mediu la acele departamente la care
salariul maxim este mai mare de 2000.
ang
a_nume data_angajare salariu post nr.dept
Ionescu 11 ian 2000 5500 inginer 1
Popescu 18 nov 2011 1550 inginer 1
Vasilescu 23 aug 2011 1800 economist 2
Andronache 1 mai 2017 2250 economist 3
Georgescu 2 sept 2000 3500 agent vânzări 4
Tache 22 iul 2015 1450 economist 2
10
SQL> SELECT nr.dept, AVG(salariu)
FROM ang
GROUP BY nr.dept
HAVING MAX(salariu)>2000;
rezultat:
NR.DEPT AVG(SALARIU)
________ _______________
1 3525
3 2250
4 3500
Exemplul care afișează numele postului și fondul de salarii pentru fiecare nume de post cu un
fond de salarii depășind 5000. Exemplul exclude agenții de vânzări și sortează lista după fondul de
salarii.
rezultat:
POST FOND_SALARII
____________ _______________
ECONOMIST 5500
INGINER 7050
Funcțiile de grup pot fi grupate pe orice adâncime. Exemplul următor afișează salariul mediu
maxim
11
Având
NR.DEPT AVG(SALARIU)
________ _______________
1 3525
2 1625
3 2250
4 3500
lansând comanda
MAX(AVG(SAL))
________________
3525
12