Académique Documents
Professionnel Documents
Culture Documents
Lectia4 Functiijoinurifunctiidegrupsisubinterogari
Lectia4 Functiijoinurifunctiidegrupsisubinterogari
litere mici
Exemplu
SELECT title
FROM d_cds
WHERE LOWER(title) = 'carpe diem';
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:
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
DATE FUNCTIONS
Exemple:
1)
2)
3)
4)
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
-
CONVERSION FUNCTIONS
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
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:
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;
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;
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
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;
NONEQUIJOINS
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;
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);
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.
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
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');
SELECT last_name
FROM employees
WHERE salary = ANY
(SELECT MIN(salary)
FROM employees
GROUP BY department_id);