Vous êtes sur la page 1sur 174

ORACLE ZIUA 3

CASE AND CHARACTER


MANIPULATION

Selectarea si folosirea functiilor single-row


care realizeaza conversii si si/sau manipularea
sirurilor de caractere

Selectarea si folosirea functiilor LOWER, UPPER


si INITCAP (transformare tipurilor de litere)

Selectarea si folosirea functiilor CONCAT,


SUBSTR, LENGTH, INSTR,LPAD, RPAD, TRIM si
REPLACE (folosite pentru manipularea sirurilor
de caractere)

CASE AND CHARACTER


MANIPULATION
Tabela DUAL
Tabela DUAL are o singura linie (denumita X) si o singura coloana
(denumita DUMMY) si este folosita pentru utilizarea
instructiunilor SELECT care nu se aplica direct asupra tabelelor.
Interogarile care folosesc tabela DUAL furnizeaza ca rezultat o linie.
Tabela DUAL poate fi utila in realizarea calculelor si pentru
evaluarea expresiilor ce nu contin date din tabele.
Tabela va fi folosita pentru a studia multe dintre functiile single-row.
Exemplu
SELECT (319/29) +12
FROM DUAL;
Rezultat: 23

CASE AND CHARACTER


MANIPULATION
SINGLE-ROW CHARACTER FUNCTIONS
Functiile caracter single-row sunt impartite in doua categorii:

Functii care fac conversii asupra tipurilor de litere din sirurile


de caractere (LOWER, UPPER, INITCAP)

Functii care realizeaza diverse operatii asupra sirurilor de


caractere -concatenare, extragere de subsiruri, cautare etc.
(CONCAT, SUBSTR, LENGTH, INSTR, LPAD | RPAD, TRIM,
REPLACE)
Functiile single-row pot fi folosite in clauzele SELECT, WHERE si
ORDER BY.

CASE AND CHARACTER


MANIPULATION
FUNCTII CARE FAC CONVERSII ASUPRA TIPURILOR DE
LITERE DIN SIRURILE DE CARACTERE
(CASE-MANIPULATION FUNCTIONS)
Aceste functii pot fi folosite in majoritatea clauzelor instructiunii
SELECT.
1) LOWER(column|expression) converteste toate literele in

litere mici
Exemplu

SELECT title
FROM d_cds
WHERE LOWER(title) = 'carpe diem';

CASE AND CHARACTER


MANIPULATION
FUNCTII CARE FAC CONVERSII ASUPRA TIPURILOR DE
LITERE DIN SIRURILE DE CARACTERE
2) UPPER(column|expression) converteste toate literele in
litere mari.
SELECT title
FROM d_cds
WHERE UPPER(title) = 'CARPE DIEM';
3) INITCAP( column|expression) converteste litera de
inceput a fiecarui cuvant in litera mare.
SELECT title
FROM d_cds
WHERE INITCAP(title) = 'Carpe Diem';

CASE AND CHARACTER


MANIPULATION
FUNCTII CARE REALIZEAZA DIVERSE OPERATII ASUPRA
SIRURILOR DE CARACTERE
(CHARACTER-MANIPULATION FUNCTIONS)
1) CONCAT concateneaza doua siruri de caractere
Exemplu: CONCAT (Hello, World) rezultatul=HelloWorld
2) SUBSTR - extrage un subsir de o dimensiune specificata
Exemplu: SUBSTR (HelloWorld, 1, 5) rezultatul=Hello
3) LENGTH: returneaza o valoare numerica ce reprezinta
lungimea unui sir de caractere
Exemplu: LENGTH (HelloWorld) rezultatul=10
4) INSTR: determina pozitia primei aparitii a unui caracter dat
intr-un sir de caractere
Exemplu: INSTR (HelloWorld, W) rezultatul=6

CASE AND CHARACTER


MANIPULATION
FUNCTII CARE REALIZEAZA DIVERSE OPERATII ASUPRA
SIRURILOR DE CARACTERE
5) LPAD: completeaza la afisare, cu un caracter dat, partea
stanga a valorii de afisat, pe o anumita lungime.
Exemplu: LPAD (salary, 10,*) rezultatul=*****24000
6) RPAD: completeaza la afisare, cu un caracter dat, partea
dreapta a valorii de afisat, pe o anumita lungime.
Exemplu: RPAD (salary, 10, *) rezultatul=24000*****
7) TRIM: Elimina toate caracterele specificate atat de la
inceputul cat si de la sfarsitul unui sir de caractere (implicit se
elimina si de la inceput si de la sfarsit). Sintaxa este
urmatoarea:
trim ( [leading | trailing | both [character(s) to be
removed ] from] string to trim)
Exemplu: TRIM (H, FROM HelloWorld) rezultatul=elloWorld

CASE AND CHARACTER


MANIPULATION
FUNCTII CARE REALIZEAZA DIVERSE OPERATII ASUPRA
SIRURILOR DE CARACTERE
8) REPLACE: inlocuieste o secventa de caractere dintr-un string
cu un alt sir de caractere. Sintaxa este urmatoarea:
replace (string1, string_to_replace, [replacement_string] )
- string1 sirul in care se face inlocuirea secventei de
caractere
- string_to_replace secventa de caractere ce va fi inlocuita
- [replacement_string] sirul de caractere ce va inlocui
secventa
Exemplu: REPLACE('JACK and JUE','J','BL') rezultatul=BLACK and
BLUE

CASE AND CHARACTER


MANIPULATION
APLICATII
1. Care este lungimea sirului de caractere Oracle
Internet Academy?
2. Care este pozitia caracterului I in Oracle
Internet Academy?

NUMBER FUNCTIONS
Functiile numerice de tipul single-row pot avea ca
parametri numere si furnizeaza ca rezultate valori numerice.
Cele trei functii numerice sunt urmatoarele:

ROUND
TRUNC
MOD

NUMBER FUNCTIONS
Functia ROUND
este folosita pentru a rotunji numere la un numar specificat
de zecimale.
- functia poate rotunji numerele si in partea stanga a punctului
zecimal. - functia poate fi folosita si cu date calendaristice.
Sintaxa:
ROUND(column|expression, decimal places)
Daca nu este specificat numarul de zecimale (decimal places) sau
acesta este 0, numarul nu va avea zecimale.

NUMBER FUNCTIONS
Functia ROUND exemple

ROUND(45.926) - rezultatul=46
ROUND(45.926, 0) rezultatul=46
ROUND(45.926,2) - rezultatul=45.93
ROUND(45.926, -1) rezultatul=50
ROUND(45.926,-2) rezultatul=0

NUMBER FUNCTIONS
Functia TRUNC
este folosita pentru a trunchia o valoare la un numar specificat
de zecimale
Daca numarul de zecimale nu este specificat, atunci implicit
este considerat 0
functia poate fi folosita si cu date calendaristice.
Sintaxa:
TRUNC(column|expression, decimal places)
-

NUMBER FUNCTIONS
Functia TRUNC exemple

TRUNC(45.926) - rezultatul=45
TRUNC(45.926, 0) rezultatul=45
TRUNC(45.926,2) - rezultatul=45.92
TRUNC(45.926, -1) rezultatul=40
TRUNC(45.926,-2) rezultatul=0

NUMBER FUNCTIONS
Functia MOD
- se foloseste pentru a determina restul impartirii a doua
numere intregi

Exemple:
1) MOD( 1600 / 300) rezultatul este 100
2) SELECT last_name, salary, MOD(salary, 2) As "Mod Demo"
FROM f_staffs
WHERE staff_type IN(Order Taker, Cook, Manager');
Coloana "Mod Demo indica daca salariul este numar par sau
impar.

NUMBER FUNCTIONS
APLICATII
1. Sa se afiseze campurile last_name si salary pentru acei
angajati care lucreaza in departmentul 80. Sa se dea fiecarui
angajat o crestere salariala de 5.33% iar rezultatul sa fie
trunchiat la doua zecimale.
SELECT last_name, TRUNC(salary * .0533,2)
FROM employees
WHERE department_id = 80;

NUMBER FUNCTIONS
2. Folositi tabela DUAL pentru a realiza urmatoarele:

845.553 rotunjit la o pozitie zecimala


30695.348 rotunjit la doua pozitii zecimale
30695.348 - rotunjit cu -2 pozitii zecimale (cu 2 pozitii
zecimale la stanga)
2.3454 trunchierea lui 454 de pozitiile zecimale

NUMBER FUNCTIONS

SELECT round(845.553,1)
FROM DUAL;

SELECT round(30695.348,2)
FROM DUAL;

SELECT ROUND(30695.348,-2)
FROM DUAL;

SELECT TRUNC(2.3454,1)
FROM DUAL;

DATE FUNCTIONS
- Formatul implicit pentru datele calendaristice este DD-MON-RR
Exemplu: 02-DEC-99
- Datele calendaristice sunt stocate intern in format numeric fiind
reprezentate: secolul, anul, luna, ziua, orele, minutele si
secundele. Aceasta reprezentare permite efectuarea de operatii
aritmetice asupra datelor calendaristice.
- Datele calendaristice Oracle se regasesc in intervalul de valori: 1
ianuarie 4712 i.c. 31 decembrie 9999 d.c.
- Atunci cand inseram intr-o tabela o inregistrare care are un camp
de tip data calendaristica informatia cu privire la secol este
preluata de la functia SYSDATE.
- SYSDATE este o functie pentru date calendaristice care ne
furnizeaza data si ora curenta a serverului bazei de date Oracle

DATE FUNCTIONS
Exemplu: pentru afisarea datei curente, se foloseste tabela
DUAL
SELECT SYSDATE
FROM DUAL
- Tipul de date data calendaristica stocheaza intotdeauna anul
sub forma a 4 cifre 2 cifre pentru secol si 2 cifre pentru an
- Functii pentru date calendaristice: MONTHS_BETWEEN,
ADD_MONTHS, NEXT_DAY, LAST_DAY, ROUND, TRUNC.
Inafara de funcia MONTHS_BETWEEN, toate celelate functii
returneaza valori de tip data calendaristica.
- De asemenea, asupra datelor calendaristice se pot face operatii
aritmetice

DATE FUNCTIONS
EXEMPLE:
1) SELECT last_name, hire_date+60
FROM employees
2) SELECT last_name, (SYSDATE-hire_date)/7
FROM employees
3) SELECT order_no, amt_due, purch_date+30 Due Date
FROM dual

DATE FUNCTIONS

MONTHS_BETWEEN determina numarul de luni dintre 2


date calendaristice
ADD_MONTHS aduna un anumit numar de luni la o data
calendaristica
NEXT_DAY - returneaza data calendaristica corespunzatoare
zilei din saptamana specificate, care urmeaza unei anumite
date calendaristice
LAST_DAY returneaza ultima zi a lunii corespunzatoare datei
specificate
ROUND rotunjeste o data calendaristica
TRUNC trunchiaza o data calendaristica

DATE FUNCTIONS
Exemple:
1)
2)
3)
4)

MONTHS_BETWEEN(01-SEP-92, 01-JUN-91) rezultatul=15


ADD_MONTHS(11-JAN-94,6) rezultatul este=11-JUL-94
NEXT_DAY(01-SEP-95,FRIDAY) rezultatul este=08-SEP-95
LAST_DAY(01-FEB-95) rezultatul este=28-FEB-95

Pentru urmatoarele exemple, presupunem ca SYSDATE=25-JUL95


5) ROUND(SYSDATE,MONTH) rezultatul este=01-AUG-95
6) ROUND(SYSDATE,YEAR) rezultatul este=01-JAN-96
7) TRUNC(SYSDATE,MONTH) rezultatul este=01-JUL-95
8) TRUNC(SYSDATE,YEAR) rezultatul este=01-JAN-95

DATE FUNCTIONS
Exemple:
9) SELECT employee_id, hire_date,
MONTHS_BETWEEN(SYSDATE, hire_date) AS TENURE,
ADD_MONTHS (hire_date, 6) AS REVIEW,
NEXT_DAY(hire_date, 'FRIDAY'),
LAST_DAY(hire_date)
FROM employees
WHERE MONTHS_BETWEEN (SYSDATE, hire_date) > 36;

DATE FUNCTIONS
Aplicatii:
1) Afisati numarul de zile dintre data corespunzatoare inceputului
ultimei vacante de vara si data inceputului anului scolar
curent. Se presupune ca o luna are 30.5 zile. Denumiti
iesirea (rezultatul) "Days.
SELECT ROUND(MONTHS_BETWEEN (15-SEP-07', '15-JUN-07')*30.5) AS
Days
FROM dual;

DATE FUNCTIONS
Aplicatii:
2) Folosind o singura instructiune, rotunjiti data curenta la cea
mai apropiata luna si la cel mai apropiat an si trunchiati-o la
cea mai apropiata luna si cel mai apropiat an. Folositi cate un
alias pentru fiecare coloana.
SELECT ROUND(SYSDATE,'MONTH') AS MONTH,
ROUND(SYSDATE,'YEAR') AS YEAR,TRUNC(SYSDATE,'MONTH')
AS Month, TRUNC(SYSDATE,'YEAR') AS Year
FROM DUAL;

CONVERSION FUNCTIONS
-

Pentru bazele de date, schimbarile de format si de afisare


pentru diverse tipuri de date, se realizeaza cu ajutorul
functiilor de conversie.

Atunci cand este creata o tabela pentru o baza de date,


programatorul trebuie sa specifice ce tip de date se stocheaza
in fiecare camp. In SQL sunt diverse tipuri de date acestea
definesc domeniul de valori pe care fiecare coloana le poate
contine. Vom folosi urmatoarele tipuri de date:
VARCHAR2
CHAR
NUMBER
DATE

CONVERSION FUNCTIONS

VARCHAR2: folosit pentru siruri de caractere de lungime


variabila, incluzand numere, caractere speciale si liniuta de
despartire.
CHAR: folosit pentru texte sau siruri de caractere de lungime
fixa, incluzand numere, caractere speciale si liniuta de
despartire.
NUMBER: pentru date numerice de lungime variabila
DATE: pentru valori de tip data calendaristica si timp.

Serverul Oracle poate realiza urmatoarele conversii implicite:


- De la VARCHAR2 sau CHAR la NUMBER sau DATE
- De la NUMBER la VARCHAR2
- De la DATE la VARCHAR2

CONVERSION FUNCTIONS
Sunt posibile 4 conversii explicite de tip:
- Conversia unei date calendaristice intr-o data de tip sir de
caractere
- Conversia unei date de tip numeric intr-o data de tip sir de
caractere
- Conversia unei date de tip sir de caractere intr-o data de tip
numeric
- Conversia unei date de tip sir de caractere intr-o data
calendaristica

CONVERSION FUNCTIONS
CONVERSIA UNEI DATE CALENDARISTICE IN SIR DE
CARACTERE
Adesea, este preferabil sa convertim datele calendaristice stocate
in bazele de date din formatul implicit intr-un format
convenabil. Conversia se realizeaza cu ajutorul functiei
TO_CHAR.

Sintaxa:
TO_CHAR (date column name, 'format model')

CONVERSION FUNCTIONS
Modelul de format
caracteristici:

(format

model)

are

urmatoarele

- Trebuie inclus intre apostrofuri si este case sensitiv


- Poata sa contina orice format valid de data calendaristica
- Poate folosi specificatia fm pentru a elimina spatiile inutile si
zerourile nesemnificative la afisare
- Poate folosi specificatia sp pentru a scrie un numar litera cu litera
- Foloseste th pentru ca numarul sa apara in format ordinal (ca
numar de ordine).
- Sunt folosite ghilimelele pentru a adauga siruri de caractere
modelului de format

CONVERSION FUNCTIONS
Elemente ale modelului de format pentru date
calendaristice:
- YYYY anul intreg pe 4 cifre
- YEAR anul scris litera cu litera
- MM luna reprezentata sub forma a doua cifre
- MONTH numele intreg al lunii calendaristice
- MON denumirea lunii abreviata la 3 litere
- DY - denumirea zilei abreviata la 3 litere
- DAY numele intreg al zilei
- DD numarul zilei din luna

CONVERSION FUNCTIONS
Exemple:
1) SELECT TO_CHAR (event_date, 'fmMonth dd, YYYY')
FROM d_events;
va fi afisat urmatorul rezultat:
May 14, 2004
April 28, 2004
2) SELECT id, TO_CHAR(event_date, 'MONTH DD, YYYY')
FROM d_events;
100 MAY 14, 2004
100 APRIL 28, 2004

CONVERSION FUNCTIONS
Exercitiu:
Identificati modelele de format pentru a realiza afisarea datei
curente in felul urmator:

August 6th, 2004


August 06, 2004
AUG 6, 2004
August 6th, Friday, Two Thousand Four

CONVERSION FUNCTIONS
1) August 6th, 2004
SELECT TO_CHAR (sysdate,'Month fmddth,YYYY')
from dual
2) August 06, 2004
SELECT TO_CHAR (sysdate,'Month dd,YYYY')
from dual
3) AUG 6, 2004
SELECT TO_CHAR (sysdate,'MON fmdd,YYYY')
from dual
4) August 6th, Friday, Two Thousand Four
SELECT TO_CHAR (sysdate,'Month fmddth,Day,Year')
from dual

CONVERSION FUNCTIONS
CONVERSIA NUMERELOR IN SIRURI DE CARACTERE
(VARCHAR2)
Valorile numerice stocate in bazele de date nu au un anume
format, iar pentru stabilirea unui format este necesara
conversia in siruri de caractere. Aceasta transformare se
realizeaza tot cu ajutorul functiei TO_CHAR:
TO_CHAR(number, 'format model')

CONVERSION FUNCTIONS
Cateva dintre elementele de format folosite de functia
TO_CHAR pentru a afisa valorile numerice ca siruri de
caractere, sunt urmatoarele:
- 9 reprezinta o pozitie numerica (numarul de cifre 9 determine
pe cate pozitii se face afisarea)
- 0 determina afisarea zerourilor nesemnificative
Exemplu: 099999 determina afisarea 001234
- $ - afisarea semnului $
Exemplu: $999999 determina afisarea $1234
- L afisarea simbolului monedei locale
- . specifica pozitia punctului zecimal
Exemplu: 999999.99 determina afisarea 1234
- , - specifica pozitia virgulei indicatoare pentru mii

CONVERSION FUNCTIONS
- MI pentru numerele negative, semnul minus se pune in
dreapta
Exemplu: 999999MI determina afisarea 1234- PR punerea numerelor negative intre paranteze
Exemplu: 999999PR determina afisarea <1234>
- EEEE afisarea notatiei stiintifce
Exemplu: 99.999EEEE determina afisarea 1.23E+03
- B afisarea valorilor 0 ca spatii

CONVERSION FUNCTIONS
APLICATII
Identificati modelele de format pentru afisarea urmatoarelor
valori numerice:

$3000.00
4,500
9,000.00
0004422

CONVERSION FUNCTIONS
1) $3000.00
SELECT TO_CHAR(3000,$99999.99)

2) 4,500
SELECT TO_CHAR(4500,999,999)

3) 9,000.00
SELECT TO_CHAR(9000,999,999.99)

4) 0004422
SELECT TO_CHAR(4422,0999999)

CONVERSION FUNCTIONS
CONVERSIA SIRURILOR DE CARACTERE IN NUMERE
Functia care realizeaza aceasta conversie:
TO_NUMBER(character string, 'format model')
Exemplu:
SELECT TO_NUMBER('450', '9999') + 10
AS "Number Change FROM DUAL;
Rezultatul afisat va fi 460

CONVERSION FUNCTIONS
CONVERSIA SIRURILOR DE CARACTERE IN DATE
CALENDARISTICE
Functia care realizeaza aceasta conversie:
TO_DATE('character string', 'format model')
Exemplu:
TO_DATE('November 3, 2001', 'Month dd, RRRR')
va returna 03-NOV-01

CONVERSION FUNCTIONS
La conversiile de la siruri de caractere la date calendaristice
poate fi folosit modificatorul fx (format exact) care specifica o
potrivire exacta intre argumentul sir de caractere si modelul
de format al datei calendaristice.
Exemplu:
SELECT TO_DATE('May10,1989', 'fxMonDD,RRRR') AS "Convert"
FROM DUAL;
Regulile de utilizare a modificatorului fx:
- Punctuatia si textul sirului de caractere trebuie sa se
potriveasca partilor corespunzatoare din modelul de format
- Daca sirul de caractere are blank-uri suplimentare, fara
specificatia fx vor fi ignorate
- Datele numerice din sirul de caractere trebuie sa aiba acelasi
numar de cifre ca si elementul corespunzator al formatului.

CONVERSION FUNCTIONS
FORMATELE RR SI YY
- Daca formatul de data este specificat folosind YY sau YYYY,
valoarea returnata va fi in secolul curent.
- Daca formatul de data foloseste RR sau RRRR, sunt doua
posibilitati:

CONVERSION FUNCTIONS
Exemplu:

CONVERSION FUNCTIONS
Aplicatii:
1) Realizati conversia datei calendaristice January 3,
2004 la formatul implicit de data calendaristica 03-JAN04.
2) Realizati conversia datei curente dupa formatul
urmator: "Today is the Twentieth of March, Two
Thousand Four
3) Ellen Abel este o angajata care a primit o marire de
salariu de 2000 $. Afisati pentru ea
prenumele(first_name) si numele(last_name), salariul
actual si noul salariu. Afisati ambele salarii cu simbolul
$ si cu doua zecimale. Denumiti coloana cu noul salariu:
New Salary.

CONVERSION FUNCTIONS
1) Realizati conversia datei calendaristice January 3,
2004 la formatul implicit de data calendaristica
03-JAN-04
SELECT TO_DATE('January 3, 2004', 'Month dd, YYYY')as
"Date"
FROM DUAL;

2) Realizati conversia datei curente dupa formatul


urmator: "Today is the Twentieth of March, Two
Thousand Four
SELECT 'Today is the ' ||TO_CHAR(SYSDATE, 'Ddspth "of"
Month, Yyyysp')
FROM DUAL;

CONVERSION FUNCTIONS
3) Ellen Abel este o angajata care a primit o marire
de salariu de
2000$. Afisati, pentru angajata
urmatoarele:
prenumele(first_name)
si
numele(last_name), salariul actual si noul salariu.
Afisati ambele salarii cu simbolul $ si cu doua
zecimale. Denumiti coloana cu noul salariu: New
Salary.
SELECT first_name, last_name, TO_CHAR(salary,
'$99,999.99'), TO_CHAR(salary + 2000, '$99,999.99') AS
"New Salary"
FROM f_staffs;

NULL FUNCTIONS
Pana la aceasta lectie am aplicat functii de tipul single-row in
instructiuni simple. Totusi, este posibil sa imbricam functii pe
oricate nivele. In aceasta situatie evaluarea functiilor se va
face de la cel mai interior nivel catre exterior.
Exemplu:
SELECT TO_CHAR(NEXT_DAY(ADD_MONTHS(hire_date, 6),
'FRIDAY'), 'fmDay, Month DDth, YYYY') AS "Next Evaluation"
FROM employees
WHERE employee_id=100;
Rezultatul va fi: Friday, December 18TH, 1987

NULL FUNCTIONS
SELECT TO_CHAR(NEXT_DAY(ADD_MONTHS(hire_date, 6),
'FRIDAY'), 'fmDay, Month DDth, YYYY') AS "Next
Evaluation"
FROM employees
WHERE employee_id=100;

Pasul 1: Se vor adauga 6 luni la data angajarii (hire_date).


Pasul 2: Va fi identificata prima zi de vineri (Friday) care
urmeaza.
Pasul 3: Formatul de data implicit va fi convertit conform
modelului de format

NULL FUNCTIONS
Sunt 4 functii generale care folosesc valorile
null:

NVL
NVL2
NULLIF
COALESCE

NULL FUNCTIONS
FUNCTIA NVL
- Functia NVL converteste o valoare null intr-un numar, sir de
caractere sau data calendaristica.
- Coloana care contine valoarea null si valoarea care substituie
pe null trebuie sa fie de acelasi tip.
- Sintaxa:
NVL ( value that may contain a null, value to replace the null)
- Exemple:
NVL(comission_pct,0)
NVL(hire_date,01-JAN-97)
NVL(job_id,No Job Yet)

NULL FUNCTIONS
Functia NVL poate fi folosita pentru a converti valorile null din
coloane in numere pentru efectuarea unor calcule
matematice, evitandu-se astfel rezultatele null. (Se stie ca o
rezultatul evaluarii unei expresii in care este folosita o valoare
null este null).
Exemplu:
SELECT first_name, last_name,NVL(auth_expense_amt, 0)*1.05
AS Expenses
FROM D_Partners;

NULL FUNCTIONS
FUNCTIA NVL2
Functia NVL2 evalueaza o expresie cu 3 valori:
NVL2(valoare1, valoare2, valoare3)
Daca valoare1 nu este null, atunci rezultatul este dat de
valoare2; daca valoare1 este null atunci rezultatul este dat de
valoare3
- valoare1 poate avea orice tip
- valoare2 si valoare3 pot avea orice tip cu exceptia tipului LONG
- tipul de date al valorii returnate este cel al valorii2, cu exceptia
situatiei in care valoare2 este sir de caractere si atunci
rezultatul este de tipul VARCHAR2

NULL FUNCTIONS
Exemplu:
SELECT last_name, salary, NVL2(commission_pct,
salary + (salary *commission_pct), salary) income
FROM employees;

NULL FUNCTIONS
FUNCTIA NULLIF
Functia NULLIF compara doua expresii. Daca expresiile sunt
egale functia returneaza null, in caz contrar functia returneaza
valoarea primei expresii.
Sintaxa:
NULLIF(expression 1, expression 2)
Exemplu:
SELECT first_name, LENGTH(first_name) "Expression1 ,
last_name, LENGTH(last_name) "Expression 2",
NULLIF(LENGTH(first_name), LENGTH(last_name)) AS
"Compare Them FROM D_PARTNERS;

NULL FUNCTIONS
FUNCTIA COALESCE
Functia COALESCE este o generalizare a functiei NVL, insa poate
lua mai multe valori.
Sintaxa:
COALESCE(expresie1, expresie2,,expresie n)
Functia returneaza valoarea primei expresii diferita de null.
Exemplu:
SELECT last_name, COALESCE(commission_pct, salary, 10) comm
FROM employees
ORDER BY commission_pct;

NULL FUNCTIONS
APLICATII
1) Sa se creeze un raport care sa indice denumirile
promotionale de la Global Fast Foods , data de inceput,
si data finala din tabela f_promotional_menus table.
Daca este o data de sfarsit, inlocuiti-o temporar cu
"end in two weeks." Daca nu exista data de sfarsit,
inlocuiti-o cu data curenta.
2) Nu toti anagajatii de la Global Fast Foods sunt platiti
pentru orele suplimentare efectuate. Inlocuiti afisarea
valorii null pentru acesti angajati cu zero. Afisati
numele (last_name) angajatilor si plata orelor
suplimentare.Denumiti plata orelor suplimentare
"Overtime Status."

NULL FUNCTIONS
1) Sa se creeze un raport care sa indice denumirile
promotionale de la Global Fast Foods , data de inceput,
si data finala din tabela f_promotional_menus table.
Daca este o data de sfarsit, inlocuiti-o temporar cu
"end in two weeks." Daca nu exista data de sfarsit,
inlocuiti-o cu data curenta.
SELECT name, NVL2(end_date,'end in two weeks', SYSDATE)AS
Promotion
FROM f_promotional_menus;

NULL FUNCTIONS
2) Nu toti anagajatii de la Global Fast Foods sunt platiti
pentru orele suplimentare efectuate. Inlocuiti afisarea
valorii null pentru acesti angajati cu zero. Afisati
numele (last_name) angajatilor si plata orelor
suplimentare.Denumiti plata orelor suplimentare
"Overtime Status."
SELECT last_name,NVL(overtime_rate,0)AS "Overtime Status"
FROM f_staffs;

CONDITIONAL
EXPRESSIONS
Sunt doua expresii conditionale: CASE si DECODE Acestea
implementeaza in instructiunile SQL, teste de tipul IF-THENELSE
1) Expresia CASE
CASE expr WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2 WHEN
comparison_expr n THEN return_expr n ELSE else_expr]
END
Tipurile de date corespunzatoare expresiilor din CASE, WHEN si
ELSE trebuie sa fie aceleasi.

CONDITIONAL
EXPRESSIONS
Exemplu:

CONDITIONAL
EXPRESSIONS
2) Expresia DECODE

DECODE(columnl|expression, search1, result1[, search2,


result2,...,] [, default])
Daca este omisa valoarea default, atunci daca valoarea
cautata nu se regaseste in expresie, rezultatul va fi null.

CONDITIONAL
EXPRESSIONS

CONDITIONAL
EXPRESSIONS
APLICATII
1) Pentru fiecare meniu promotional de la Global Fast
Foods, afisati numele evenimentului si calculati numarul
de luni dintre data curenta si ultima zi a promotiei.
Rotunjiti numarul de luni. Denumiti coloana "Past
Promos."
2) Folositi baza de date Oracle pentru a scrie o interogare
care returneaza salariul angajatului 174 dupa modelul
urmator: Ellen Abel earns $11000.00 monthly but wants
$14000.00.
3) Din tabela DJ on Demand d_songs, creati o interogare
care inlocuieste melodiile de 2 minute cu "shortest" si
cele de 10 minute cu "longest." Denumiti coloana la
afisare "Play Times."

CONDITIONAL
EXPRESSIONS
1) Pentru fiecare meniu promotional de la Global Fast
Foods, afisati numele evenimentului si calculati
numarul de luni dintre data curenta si ultima zi a
promotiei. Rotunjiti numarul de luni. Denumiti coloana
"Past Promos."
SELECT name,ROUND(MONTHS_BETWEEN(SYSDATE, end_date),0)
AS "Past Promos"
FROM f_promotional_menus;

CONDITIONAL
EXPRESSIONS
2) Folositi baza de date Oracle pentru a scrie o interogare
care returneaza salariul angajatului 174 dupa modelul
urmator: Ellen Abel earns $11000.00 monthly but wants
$14000.00.
SELECT INITCAP(first_name)||' ' ||INITCAP(last_name)||' || 'earns
||TO_CHAR(salary, '$99999.99')||' ' ||'but wants ' ||
TO_CHAR((salary + 3000),'$99999.99') as "Wish Salary"
FROM employees
WHERE last_name LIKE 'Abel';

CONDITIONAL
EXPRESSIONS
3) Din tabela DJ on Demand d_songs, creati o interogare
care inlocuieste melodiile de 2 minute cu "shortest" si
cele de 10 minute cu "longest." Denumiti coloana la
afisare "Play Times."
SELECT id, title, duration, DECODE(duration, '2 min', 'shortest',
'10 min', 'longest')
AS "Play Times"
FROM d_songs;

Cartesian Product and the Join


Operations
- Scopul acestei lectii este de a studia modalitatea preluarii
de date din mai multe tabele.
- Pentru a putea realiza acest lucru, facand legaturi intre
tabelele unei baze de date, putem folosi:
- JOIN-urile proprietatea ORACLE
- JOIN-urile ANSI/ISO SQL99

Cartesian Product and the


Join Operations
Tipuri de JOIN-uri

Cartesian Product and the Join


Operations
JOIN-uri proprietatea Oracle
Pentru a prelua date din mai multe tabele, forma de baza a
unei instructiuni SELECT consta in adaugarea unei conditii de
legatura (join) in clauza WHERE:

SELECT table1.column, table2.column


FROM table1, table2
WHERE table1.column1 =table2.column2;
Numele coloanei trebuie prefixat de numele tabelei in situatiile
cand acelasi nume de coloana apare in mai multe tabele.

Cartesian Product and the Join


Operations
PRODUSUL CARTEZIAN (CARTESIAN PRODUCT)
- Presupune ca toate liniile din prima tabela sa fie unite (legate)
cu toate liniile din tabela a doua.
- Se produce atunci cand:
1) conditia de join este omisa
2) conditia de join nu este valida
- Pentru a evita produsul cartezian trebuie adaugata o conditie de
join valida.
- Produsul cartezian genereaza foarte multe linii si este folosit
foarte rar.

Cartesian Product and the Join


Operations
EQUIJOIN
Uneori denumit simple join sau inner join, un equijoin este o
legatura intre tabele care combina linii ce au valori
echivalente pentru coloanele specificate.
Exemplu:

Cartesian Product and the Join


Operations

Cartesian Product and the Join


Operations
FOLOSIREA OPERATORULUI AND
Ca si la interogarile care folosesc o singura tabela, se poate
folosi operatorul AND pentru a restrictiona liniile selectate.

Cartesian Product and the Join


Operations
ALIASURI
Atunci cand denumirile coloanelor si tabelelor sunt mari, devine
incomod de lucrat cu acestea. Pentru a scurta denumirile
respective, se folosesc alias-urile. Se pot folosi alias-uri atat
pentru coloane cat si pentru tabele.
Daca este precizat un alias pentru o tabela in clauza FROM,
atunci alias-ul respectiv trebuie sa inlocuiasca numele tabelei
in clauza SELECT.

Cartesian Product and the Join


Operations
APLICATII
1) Realizati un produs cartezian care afiseaza coloanele
tabelelor d_play_list_items si d_track_listings din baza
de date DJs on Demand.
2) Scrieti o interogare pentru a extrage informatii din trei
tabele ale bazei de date DJs on Demand: d_clients,
d_events si d_job_assignments.

Cartesian Product and the Join


Operations
1) Realizati un produs cartezian care afiseaza coloanele
tabelelor d_play_list_items si d_track_listings din baza
de date DJs on Demand.
SELECT d.event_id, d.song_id, d.comments, t.cd_number, t.track
FROM d_play_list_items d, d_track_listings t;
2) Scrieti o interogare pentru a extrage informatii din trei
tabele ale bazei de date DJs on Demand: d_clients,
d_events si d_job_assignments.
SELECT c.last_name, e.name, j.job_date
FROM d_clients c , d_events e , d_job_assignments j
WHERE c.client_number = e.client_number AND e.id =j.event_id;
(Solutia nu este unica.)

NONEQUIJOINS

Este posibil sa dorim sa extragem date dintr-o tabela ce nu au


coloana corespondenta in cealalta tabela (ex. cand datele se
inregistreaza ca domenii de valori) se foloseste nonequijoinul.
In acest tip de join, deoarece nu exista o potrivire exacta intre 2
coloane din fiecare tabela, nu se foloseste operatorul de
egalitate. Se pot folosi operatorii: <=, >=, BETWEENAND

NONEQUIJOINS

NONEQUIJOINS

Outer Joins
Join-urile studiate pana in acest moment au avut ca rezultat linii care
fie au avut o valoare care sa corespunda in ambele tabele, fie o
valoare intr-o tabela se regasea in interavalul dintre 2 valori ale
celeilalte tabele. Liniile care nu indeplineau conditiile nu erau
selectate.
Uneori, dorim sa extragem toate datele dintr-o tabela, chiar daca nu
au valori care sa se potriveasca in cealalta tabela( missing data).
Acest lucru se realizeaza folosind outer join-ul. Operatorul pentru
outer join este semnul plus pus intre paranteze rotunde (+)
Un outer join este folosit pentru a vizualiza toate liniile care au valoare
corespondenta in cealalta tabela si liniile dintr-o tabela care nu au
valoare corespondenta in cealalta tabela. Pentru a indica tabela
deficitara (care poate avea date lipsa missing data), se pune
operatorul (+) dupa numele coloanei din tabela, in clauza WHERE.

Outer Joins
OBSERVATIE:
Un outer join nu poate folosi operatorul IN si nu poate fi legat la
alta conditie prin operatorul OR.

Outer Joins

Outer Joins

Outer Joins
APLICATII:
1) Creati o interogare care are ca rezultat afisarea
numelui (last_name) si id-ul si numele departamentului
pentru angajati. Includeti toti angajatii, chiar daca nu
sunt asignati unui departament.
2) Modificati interogarea din problema anterioara pentru
a afisa toate id-urile departamentelor, chiar daca nu au
angajati asociati lor.

Outer Joins
1) Creati o interogare care are ca rezultat afisarea
numelui (last_name) si id-ul si numele departamentului
pentru angajati. Includeti toti angajatii, chiar daca nu
sunt asignati unui departament.
SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id (+);

Outer Joins
2) Modificati interogarea din problema anterioara pentru
a afisa toate id-urile departamentelor, chiar daca nu au
angajati asociati lor.
SELECT e.last_name, e.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id ;

Self Joins
In data modeling, uneori este necesar sa punem in evidenta o
entitate in relatie cu ea insasi. Un exemplu este entitatea
employee (angajat). Un angajat poate fi si manager. Odata ce
avem tabela Employees, devine necesara o relatie speciala
numita self join (un join de la tabela Employees la ea insasi),
pentru a afla numele managerului pentru fiecare angajat.
Pentru a face join de la o tabela la ea insasi, tabelei ii sunt
asociate 2 alias-uri. Astfel, pentru baza de date, exista in
aparenta 2 tabele.

Self Joins

Self Joins

Self Joins
APLICATII
1) Afisati numele (last_name) si numarul pentru fiecare angajat
impreuna cu numele si numarul managerului. Denumiti
coloanele: Employee, Emp#, Manager si Mgr#.
2) Modificati interogarea 1 pentru a afisa toti angajatii si
managerii lor chiar daca un angajat nu are un manager.
Ordonati lista obtinuta alfabetic, dupa numele angajatilor.

Self Joins
1) Afisati numele (last_name) si numarul pentru fiecare
angajat impreuna cu numele si numarul managerului.
Denumiti coloanele: Employee, Emp#, Manager si
Mgr#.
SELECT e.last_name as "Employee", e.employee_id AS Emp#",
m.last_name AS "Manager", m.employee_id AS "Mgr#"
FROM employees e, employees m
WHERE e.manager_id = m.employee_id;

Self Joins
2) Modificati interogarea 1 pentru a afisa toti angajatii si
managerii lor chiar daca un angajat nu are un manager.
Ordonati lista obtinuta alfabetic, dupa numele
angajatilor.
SELECT e.last_name as "Employee", e.employee_id AS "Emp#",
m.last_name AS "Manager", m.employee_id AS "Mgr#"
FROM employees e, employees m
WHERE e.manager_id = m.employee_id(+)
ORDER BY e.last_name;

Cross Joins and Natural Joins


NATURAL JOIN
- Este un ANSI/ISO SQL:1999 join echivalent cu equijoin-ul.
- Se face pe baza tuturor coloanelor care au acelasi nume din 2
tabele; coloanele respective trebuie sa aiba acelasi tip de date.
Sunt selectate liniile care au valori egale in toate coloanele
corespondente.
Exemplu:
SELECT first_name, last_name, event_date, description
FROM d_clients NATURAL JOIN d_events;

Cross Joins and Natural Joins


Exemple:
SELECT event_id, song_id, cd_number
FROM d_play_list_items NATURAL JOIN d_track_listings
WHERE event_id = 105;

Cross Joins and Natural Joins


CROSS JOIN
- Realizeaza produsul cartezian pentru doua tabele.
Exemplu:
SELECT last_name, department_name
FROM employees
CROSS JOIN departments
este echivalenta cu instructiunea:
SELECT last_name, department_name
FROM employees, departments

Cross Joins and Natural Joins


APLICATII
1) Creati un cross-join care afiseaza numele (last_name) si
denumirea departmentului din tabelele employees si
departments.
2) Creati o interogare care foloseste un natural join pentru a pune
in legatura tabelele departments si locations table cu ajutorul
coloanei location_id. Afisati id-ul si denumirea
departamentului, id-ului locatiei si orasul.

Cross Joins and Natural Joins


1) Creati un cross-join care afiseaza numele (last_name) si denumirea
departmentului din tabelele employees si departments.
SELECT last_name, department_name
FROM employees
CROSS JOIN departments;
2) Creati o interogare care foloseste un natural join pentru a pune in
legatura tabelele departments si locations table cu ajutorul
coloanei location_id. Afisati id-ul si denumirea departamentului, idului locatiei si orasul.
SELECT department_id, department_name, location_id, city
FROM departments
NATURAL JOIN locations;

Join Clauses
In aceasta lectie se studiaza:
- folosirea clauzelor USING si ON
- realizarea unui join cu 3 tabele
Clauza USING
Intr-un natural join, daca tabelele au coloane cu acelasi nume dar
tipuri diferite, se produce eroare. Pentru a evita aceasta
situatie, clauza JOIN se inlocuieste cu clauza USING. Clauza
USING specifica coloanele care ar trebui folosite pentru pentru
equijoin.
Coloana specificata in clauza USING nu trebuie sa aiba nici un
specificator (nume de tabela sau alias), in nici o parte din
instructiunea SELECT.

Join Clauses
Exemple:
1) SELECT client_number, first_name, last_name, event_date
FROM d_clients JOIN d_events
USING (client_number);
2)

Join Clauses
Exemple:
3) Clauza USING ne permite sa folosim WHERE pentru a
restrictiona liniile dintr-o tabela sau din ambele tabele.
SELECT client_number, first_name, last_name, event_date
FROM d_clients JOIN d_events
USING (client_number)
WHERE last_name = Peters;

Join Clauses
Clauza ON
Daca coloanele folosite pentru join au denumiri diferite sau daca
sunt folositi operatorii:<,> sau BETWEEN, atunci nu putem
folosi clauza USING. In aceasta situatie se foloseste clauza ON.
Aceasta permite specificarea unei game variate de conditii
pentru join-uri.
De asemenea, clauza ON ne permite sa folosim WHERE pentru a
restrictiona linii dintr-o tabela sau din ambele tabele.
Exemple:
1) SELECT e.last_name as "EMP", m.last_name as "MGR
FROM employees e JOIN employees m
ON (e.manager_id = m.employee_id);
Se realizeaza un self-join pentru a selecta acei angajati
(employees) care sunt si manageri.

Join Clauses
2) folosirea clauzei WHERE
SELECT e.last_name as "EMP", m.last_name as "MGR"
FROM employees e JOIN employees m
ON (e.manager_id = m.employee_id)
WHERE e.last_name like 'H%';

Join Clauses
Realizarea unui join cu 3 tabele
Ambele clauze (ON si USING) se pot folosi pentru un astfel de
join.
Sa presupunem ca avem de realizat un raport despre clienti,
evenimentele corespunzatoare lor si temele pentru acele
evenimente. In aceasta situatie, avem nevoie sa facem un join
cu 3 tabele: d_clients, d_events si d_themes.
SELECT last_name, event_date, t.description
FROM d_clients c JOIN d_events e
USING (client_number)
JOIN d_themes t
ON (e.theme_code = t.code);

Join Clauses

Join Clauses
Comparing Oracle Proprietary Joins with ANSI/ISO SQL: 1999 Joins

Join Clauses
APLICATII
1) Realizati un join intre tabelele locations si departments
folosind coloana location_id. Limitati rezultatele doar pentru
locatia 1400.
2) Afisati:orasul, numele departamentului, id-ul locatiei si id-ul
departamentului pentru departamentele 10, 20 si 30, pentru
orasul Seattle.

Join Clauses
1) Realizati un join intre tabelele locations si departments
folosind coloana location_id. Limitati rezultatele doar
pentru locatia 1400.
SELECT l.city, d.department_name
FROM locations l JOIN departments d USING (location_id)
WHERE location_id = 1400;
2) Afisati:orasul, numele departamentului, id-ul locatiei si
id-ul departamentului pentru departamentele 10, 20 si
30, pentru orasul Seattle.
SELECT l.city, d.department_name, location_id, d.department_id
FROM locations l JOIN departments d USING (location_id)
WHERE city = 'Seattle'
AND department_id IN (10, 20, 30);

Inner vs. Outer Joins


In ANSI-99 SQL, un join cu 2 sau mai multe tabele care returneaza
doar liniile care se potrivesc se numeste inner join. Atunci
cand un join returneaza atat liniile care se potrivesc cat si cele
care nu se potrivesc, acesta se numeste outer join.
Sunt trei tipuri de outer join in ANSI/ISO SQL:
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- FULL OUTER JOIN

Inner vs. Outer Joins


LEFT OUTER JOIN
- Sunt afisati si acei angajati care nu au desemnat un
department_id (tabela departments este cea deficitara).

Inner vs. Outer Joins


RIGHT OUTER JOIN
- Sunt afisate si acele departamente care nu au angajati

Inner vs. Outer Joins


FULL OUTER JOIN
- Returneaza atat liniile care se potrivesc cat si cele care nu se
potrivesc din ambele tabele.
- Spre deosebire de outer join-ul proprietatea Oracle, care nu
permitea folosirea operatorului (+) in ambele parti ale clauzei
WHERE, full outer join-ul permite acest lucru.

Inner vs. Outer Joins


Construiti un join pentru a afisa o lista a clientilor si comenzilor
lor de la Global Fast Foods. Includeti toti clientii fie ca au plasat
comenzi sau nu.
SELECT c.first_name, c.last_name, o.order_number, o.order_date,
o.order_total
FROM f_customers c
LEFT OUTER JOIN f_orders o
ON (c.id = o.cust_id);

Inner vs. Outer Joins


APLICATII
1) Afisati prenumele (first_name), numele (last_name) si
denumirea departamentului pentru toti angajatii, inclusiv
pentru cei care nu sunt desemnati la nici un departament.
2) Afisati prenumele (first_name), numele (last_name) si
denumirea departamentului pentru toti angajatii, inclusiv
acele departamente care nu au nici un angajat asociat.
3) Afisati prenumele (first_name), numele (last_name) si
denumirea departamentului pentru toti angajatii, inclusiv
acele departamente care nu au nici un angajat asociat si acei
angajati care nu sunt desemnati nici unui departament.

Inner vs. Outer Joins


1) Afisati prenumele (first_name), numele (last_name) si
denumirea departamentului pentru toti angajatii, inclusiv
pentru cei care nu sunt desemnati la nici un departament.
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
LEFT OUTER JOIN departments d
ON (e.department_id=d.department_id)

Inner vs. Outer Joins


2) Afisati prenumele (first_name), numele (last_name) si
denumirea departamentului pentru toti angajatii, inclusiv
acele departamente care nu au nici un angajat asociat.
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d
ON (e.department_id=d.department_id)

Inner vs. Outer Joins


3) Afisati prenumele (first_name), numele (last_name) si
denumirea departamentului pentru toti angajatii, inclusiv
acele departamente care nu au nici un angajat asociat si acei
angajati care nu sunt desemnati nici unui departament.
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
FULL OUTER JOIN departments d
ON (e.department_id=d.department_id)

Inner vs. Outer Joins


ALTE APLICATII:
1. Sa se afiseze: id-ul job-ului (job_id), denumirea job-ului
(job_title), prenumele (first_name), numele (last_name) si id-ul
departamentului (department_id) pentru toti angajatii cu id-ul
job-ului corespunzator pentru IT_PROG.
2. Afisati numele (last_name) si numarul pentru anagajati impreuna
cu numele (last_name) si numarul managerului. Denumiti
coloanele astfel: Employee, Emp#, Manager, and Mgr#.
3. Modificati rezultatul de la problema 2 astfel incat sa fie afisati
toti angajatii, inclusiv aceia care nu au manager Ordonati
rezultatele dupa numarul angajatului.

Inner vs. Outer Joins


1. Sa se afiseze: id-ul job-ului (job_id), denumirea job-ului
(job_title), prenumele (first_name), numele (last_name)
si id-ul departamentului (department_id) pentru toti
angajatii cu id-ul job-ului corespunzator pentru
IT_PROG.
SELECT j.job_id, j.job_title, e.first_name, e.last_name,
e.department_id
FROM jobs j
JOIN employees e
ON( j.job_id = e.job_id)
WHERE j.job_id = 'IT_PROG'

Inner vs. Outer Joins


2. Afisati numele (last_name) si numarul pentru anagajati
impreuna
cu
numele
(last_name)
si
numarul
managerului. Denumiti coloanele astfel: Employee,
Emp#, Manager, and Mgr#.
SELECT w.last_name as "Employee", w.employee_id as "Emp#",
m.last_name as "Manager", m.employee_id as "Mgr#"
FROM employees w JOIN employees m
ON (w. manager_id = m.employee_id);

Inner vs. Outer Joins


3. Modificati rezultatul de la problema 2 astfel incat sa fie
afisati toti angajatii, inclusiv aceia care nu au manager
Ordonati rezultatele dupa numarul angajatului.
SELECT w.last_name as "Employee", w.employee_id as "Emp#",
m.last_name as "Manager", m.employee_id as "Mgr#"
FROM employees w
LEFT OUTER JOIN employees m
ON (w. manager_id = m.employee_id)
ORDER BY w.employee_id;

Group Functions
In SQL functiile de grup se pot aplica intregii tabele sau unui set
de linii din tabela, fiecare functie furnizand un singur rezultat.

AVG
COUNT
MIN
MAX
SUM
VARIANCE
STDDEV

Group Functions
Functia AVG
returneaza media aritmetica pentru o multime de valori
- Se foloseste doar pentru coloane ce contin valori numerice
Exemplu:

Group Functions
Functia SUM
returneaza suma pentru o multime de valori
- Se foloseste doar pentru coloane ce contin valori numerice
Exemplu

Group Functions
Functiile MIN si MAX
- Returneaza valoarea minima (maxima) dintr-o multime de valori
- Se pot folosi pentru coloane de tip: NUMBER, VARCHAR2 si
DATE.
Exemplu:

Group Functions
Functia COUNT
- Returneaza numarul de linii care nu au valoarea null pentru o
expresie specificata
- COUNT(*) returneaza numarul total de linii din tabela
Exemple:

Group Functions
Functia STDDEV
- Este o functie statistica care returneaza deviatia standard
ignorand valorile null (masoara dispersia datelor)
Exemplu:

Group Functions
Functia VARIANCE
- Este o functie statistica care calculeaza variatia pentru un set
de valori ignorand valorile null
Exemplu:

Group Functions
OBSERVATII:
- Functiile de grup se scriu in clauza SELECT
- Functiile de grup nu pot fi folosite in clauza WHERE
- Functiile de grup ignora valorile null
- Pot fi folosite mai multe functii de grup in clauza SELECT
Exemplu:
SELECT MAX(salary), MIN(salary), MIN(employee_id)
FROM employees
WHERE department_id = 60;

Group Functions
APLICATII
Folosind baza de date Oracle, selctati cel mai mic salariu,
cea mai recenta data a angajarii, numele (last_name)
persoanei care este prima in ordinea alfabetica a
angajatilor, si numele (last_name) persoanei care este
ultima in ordinea alfabetica a angajatilor. Selectati doar
angajatii din departamentele 50 sau 60.

Group Functions
Folosind baza de date Oracle, selctati cel mai mic salariu,
cea mai recenta data a angajarii, numele (last_name)
persoanei care este prima in ordinea alfabetica a
angajatilor, si numele (last_name) persoanei care este
ultima in ordinea alfabetica a angajatilor. Selectati doar
angajatii din departamentele 50 sau 60.

SELECT MIN(salary), MAX(hire_date), MIN(last_name),


MAX(last_name)
FROM employees
WHERE department_id IN (50 , 60 );

COUNT, DISTINCT, NVL


COUNT
- COUNT(expression) determina numarul de valori non-null
SELECT COUNT (YEAR)
FROM d_cds
WHERE year < 2001;
- COUNT(DISTINCT expression) determina numarul de valori
distincte, non-null
SELECT COUNT (YEAR)
FROM d_cds
WHERE year < 2001;

COUNT, DISTINCT, NVL


COUNT
- COUNT(*) returneaza numarul de linii care satisface conditia
instructiunii SELECT (sunt incluse si liniile care pot avea valori
null pentru una sau mai multe coloane)
SELECT COUNT (*)
FROM d_cds
WHERE year < 2001;

COUNT, DISTINCT, NVL


DISTINCT
- Se poate folosi cu toate functiile de grup
- Se foloseste pentru a returna toate valorile sau combinatiile de
valori distincte intr-o interogare
Exemple:
1) SELECT year as CD Year
FROM d_cds;
SELECT DISTINCT year as CD Year
FROM d_cds;

COUNT, DISTINCT, NVL


DISTINCT
Exemple:
2) SELECT SUM(salary)
FROM employees
WHERE department_id = 90;
SELECT SUM(DISTINCT salary)
FROM employees
WHERE department_id = 90;

COUNT, DISTINCT, NVL


NVL
Uneori, este preferabil sa includem valorile null in functiile de
grup. Aceasta situatie se rezolva imbricand functia NVL in
functiile de grup respective.
Exemple:
SELECT AVG(NVL(customer_orders, 0))

COUNT, DISTINCT, NVL


APLICATII
1) Cate melodii sunt tabela D_SONGS din baza de date DJs on
Demand?
2) Folosind tabela de mai jos, ce valori vor fi returnate la
executarea urmatoarei instructiuni?
SELECT COUNT(shoe_color), COUNT(DISTINCT shoe_color)
FROM shoes;

COUNT, DISTINCT, NVL


APLICATII
3) Creati o interogare care va converti orice valoare null d in

coloana auth_expense_amt column a tabelei


D_PARTNERS a bazei de date DJs on Demand, in 100000
si care determina media aritmetica a valorilor din
aceasta coloana. Rotunjiti rezultatul la doua zecimale.

COUNT, DISTINCT, NVL


1) Cate melodii sunt tabela D_SONGS din baza de date DJs
on Demand?
SELECT COUNT(*)
FROM d_songs;
2) Folosind tabela de mai jos, ce valori vor fi returnate la
executarea urmatoarei instructiuni?
SELECT COUNT(shoe_color), COUNT(DISTINCT
shoe_color)
FROM shoes;
- rezultatul este: COUNT = 4 DISTINCT = 3

COUNT, DISTINCT, NVL


3) Creati o interogare care va converti orice valoare null
din coloana auth_expense_amt column a tabelei
D_PARTNERS a bazei de date DJs on Demand, in 100000
si care determina media aritmetica a valorilor din
aceasta coloana. Rotunjiti rezultatul la doua zecimale.
SELECT ROUND(AVG(NVL(auth_expense_amt, 100000)),2)
FROM d_partners;

GROUP BY and HAVING clauses


GROUP BY
- Clauza GROUP BY se foloseste pentru a imparti liniile dintr-o
tabela in grupuri mai mici. Se pot folosi functiile de grup
pentru a extrage informatii corespunzatoare fiecarui grup.
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;
In exemplul anterior liniile sunt grupate dupa department_id, iar
functia AVG este aplicata automat asupra fiecarui grup.

GROUP BY and HAVING


clauses
GROUP BY
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id;
- Se afiseaza cel mai mare salariu al unui angajat pentru fiecare
departament si departamentul respectiv (gruparea se face
dupa department_id).
OBSERVATIE:
- Este obligatoriu ca fiecare coloana scrisa in clauza SELECT si
care nu face parte dintr-o functie de grup, sa fie apara in
clauza GROUP BY.

GROUP BY and HAVING


clauses
Exemplu:
SELECT job_id, last_name, AVG(salary)
FROM employees
GROUP BY job_id;
- Instructiune incorecta deoarece numele de coloana last_name
ar trebui sa apara in clauza GROUP BY.

GROUP BY and HAVING


clauses
Se poate folosi clauza WHERE pentru a exclude linii inainte ca
cele ramase sa fie incluse in grupuri.
SELECT department_id, MAX(salary)
FROM employees
WHERE last_name <> King
GROUP BY department_id;

GROUP BY and HAVING


clauses
Exemple:
1) SELECT AVG(graduation_rate), city
FROM students
WHERE graduation_date >= 01-JUN-00
GROUP BY city;
2) SELECT COUNT(first_name), grade
FROM students
GROUP BY grade;

GROUP BY and HAVING


clauses
Reguli de folosire a clauzei GROUP BY
- Daca este inclusa o functie de grup in clauza SELECT
precum si coloane individuale, atunci fiecare coloana
individuala trebuie sa apara si in clauza GROUP BY
- Nu se poate folosi un alias de coloana in clauza GROUP
BY
- Clauza WHERE exclude linii inainte ca acestea sa fie
impartite in grupuri

GROUP BY and HAVING


clauses
Uneori este necesar ca grupurile de linii sa fie impartite in grupuri
mai mici
SELECT department_id, job_id, count(*)
FROM employees
WHERE department_id > 40
GROUP BY department_id, job_id;
- se va afisa numarul de angajati care efectueaza fiecare job in
cadrul fiecarui departament.

GROUP BY and HAVING


clauses
De asemenea, 2 functii de grup pot fi imbricate atunci cand este
folosita clauza GROUP BY.
SELECT max(avg(salary))
FROM employees
GROUP by department_id;
In aceasta situatie se va afisa un singur rezultat si anume cel mai
mare salariu mediu: se calculeaza media salariilor pentru
fiecare departament, iar dintre rezultatele obtinute se extrage
valoarea cea mai mare.

GROUP BY and HAVING


clauses
HAVING
Asa cum clauza WHERE se foloseste pentru a restrictiona linii, putem
folosi clauza HAVING pentru a restrictiona grupuri. Clauza HAVING
este folosita pentru a restrictiona grupurile returnate de clauza
GROUP BY.
Intr-o interogare care foloseste clauzele GROUP BY si HAVING, mai
intai se realizeaza gruparea liniilor, apoi se plica functiile de grup si
apoi sunt afisate doar acele grupuri care se potrivesc clauzei
HAVING.
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 1;

GROUP BY and HAVING


clauses
HAVING
Desi clauza HAVING poate preceda clauza GROUP BY in
instructiunea SELECT, este recomandabil sa respectam
urmatoarea ordine a clauzelor (Clauza ORDER BY, daca se
foloseste, va fi intotdeauna ultima):

SELECT column, group_function


FROM table
WHERE
GROUP BY
HAVING
ORDER BY

GROUP BY and HAVING


clauses
APLICATII
Scrieti o interogare care va returna cea mai mare si cea
mai mica medie a salariilor pe departamente, din tabela
employees.
SELECT max(avg(salary)), min(avg(salary))
FROM employees
GROUP by department_id;

SUBQUERIES
In SQL, subinterogarile ne permit sa aflam o informatie care ne
este necesara pentru a obtine informatia pe care o vrem.
- O subinterogare (subquery) este o instructiune SELECT care
este inclusa in clauza unei alte instructiuni SELECT.
- Un subquery poate fi plasat in una din urmatoarele clauze:
WHERE, HAVING si FROM.
- Subbquery-ul se executa prima data, iar rezultatul sau este
folosit pentru obtinerea rezultatului de catre interogarea
principala (outer query).

SUBQUERIES
EXEMPLU:

SELECT select_list
FROM table
WHERE expression operator
(SELECT select_list
FROM table);

SUBQUERIES
REGULI DE FOLOSIRE A SUBINTEROGARILOR
- Un subquery se pune intre paranteze rotunde
- Un subquery este plasat in partea dreapta a unei conditii de
comparare
- Interogarea exterioara si subquery-ul pot prelua date din tabele
diferite
- Intr-o instructiune SELECT se poate folosi o singura clauza ORDER
BY si, daca se foloseste, trebuie sa fie ultima clauza a interogarii
principale. Un subquery nu poate avea propria clauza ORDER BY.
- Singura limita a numarului de interogari este dimensiunea bufferului folosit de interogare.
- Daca subinterogarea returneaza null sau nu returneaza nici o linie,
atunci interogarea exterioara nu va returna nimic

SUBQUERIES
Sunt doua tipuri de subinterogari(subqueries):
1) single-row subqueries care folosesc operatorii single-row:
>,=,>=,<,<= si dau ca rezultat o singura linie
2) multiple-row subqueries care folosesc operatorii multiplerow: IN, ANY, ALL si dau ca rezultat mai multe linii

SINGLE ROW SUBQUERIES

SINGLE ROW SUBQUERIES

SINGLE ROW SUBQUERIES


Se pot folosi functiile de grup in subinterogari. O functie de grup
utilizata in subquery fara clauza GROUP BY, returneaza o
singura linie.

SINGLE ROW SUBQUERIES


Subinterogarile pot fi plasate si in clauza HAVING. Deoarece
clauza HAVING are intotdeauna o conditie de grup, si
subinterogarea va avea aproape intotdeauna o conditie de
grup.

SUBQUERIES
APLICATII
1) Care este numele membrilor din personalul de la Global Fast
Foods, al caror salariu este mai mare decat angajatul cu ID-ul
12?
2) Care dintre angajatii Oracle au acelasi id al departamentului ca
si cel corespunzator cu departamentul IT?

SUBQUERIES
1) Care este numele membrilor din personalul de la Global Fast
Foods, al caror salariu este mai mare decat angajatul cu ID-ul
12?
SELECT last_name
FROM f_staffs
WHERE salary >
(SELECT salary
FROM f_staffs
WHERE id = 12);

SUBQUERIES
2) Care dintre angajatii Oracle au acelasi id al departamentului ca
si cel corespunzator cu departamentul IT?
SELECT first_name, last_name
FROM employees
WHERE department_id =
(SELECT department_id
FROM departments
WHERE department_name = 'IT');

MULTIPLE ROW SUBQUERIES


- Sunt acele subinterogari care dau ca rezultat mai
multe valori.
- Folosesc operatorii multiple row: IN, ANY, ALL.
Operatorul NOT poate fi folosit in combinatie cu
oricare dintre acestia.

MULTIPLE ROW SUBQUERIES


IN
Operatorul IN este folosit daca in interogarea exterioara clauza
WHERE este folosita pentru a selecta acele valori care sunt
egale cu una dintre valorile din lista returnata de
subinterogare (inner query).

MULTIPLE ROW SUBQUERIES


ANY
- Acest operator este folosit atunci cand dorim ca interogarea
exterioara sa selecteze valori egale, mai mici sau mai mari
decat cel putin o valoare dintre cele extrase de subquery.
SELECT title, producer
FROM d_cds
WHERE year < ANY
(SELECT year
FROM d_cds
WHERE producer = 'The Music Man');

MULTIPLE ROW SUBQUERIES


ALL
Acest operator este folosit atunci cand dorim ca interogarea
exterioara sa selecteze valori egale, mai mici sau mai mari
decat toate valoarile extrase de subquery.
SELECT title, producer,year
FROM d_cds
WHERE year > ALL
(SELECT year
FROM d_cds
WHERE producer = The Music Man);

MULTIPLE ROW SUBQUERIES


VALORI NULL
Daca una dintre valorile returnate de subinterogarea multiple row
este null, dar celelalte valori nu sunt null, atunci:
- Daca sunt folositi operatorii IN sau ANY, interogarea exterioara
va returna liniile care se potrivesc cu valorile non-null.
- Daca este folosit operatorul ALL, interogarea exterioara nu va
returna nimic.

MULTIPLE ROW SUBQUERIES


GROUP BY si HAVING
- Pot fi folosite cu subinterogarile de tip multiple row.
SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) <ANY
(SELECT salary
FROM employees
WHERE department_id IN (10,20));

MULTIPLE ROW SUBQUERIES


GROUP BY si HAVING
De asemenea, se poate folosi clauza GROUP BY intr-o
subinterogare
SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) >ALL
(SELECT MIN(salary)
FROM employees
WHERE department_id < 50
GROUP BY department_id);

MULTIPLE ROW SUBQUERIES


APLICATII
1) Gasiti numele (last_name) pentru toti angajatii ale caror salarii
sunt aceleasi cu salariul minim din oricare (any) departament.

SELECT last_name
FROM employees
WHERE salary = ANY
(SELECT MIN(salary)
FROM employees
GROUP BY department_id);

MULTIPLE ROW SUBQUERIES


2) Scopul interogarii urmatoare este de a afisa salariul
minim pentru fiecare departament al carui salariu minim
este mai mic decat cel mai mic salariu al angajatilor din
departamentul 50.
Oricum, subinterogarea nu se executa deoarece are 5
erori. Gasiti erorile si corectati-le.
SELECT department_id
FROM employees
WHERE MIN(salary)
HAVING MIN(salary) >
GROUP BY department_id
SELECT MIN(salary)
WHERE department_id < 50;

MULTIPLE ROW SUBQUERIES


SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) <
(SELECT MIN(salary)
FROM employees
WHERE department_id = 50);

Vous aimerez peut-être aussi