You are on page 1of 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-JUL-95 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 ( format model ) are urmatoarele caracteristici: - 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-JAN-04. 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-THEN-ELSE 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 nonequijoin-ul. 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: <=, >=, BETWEEN AND

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, id-ului 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 idul 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) non-null SELECT COUNT (YEAR) FROM d_cds WHERE year < 2001; determina numarul de valori distincte,

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 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.

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

Afisati angajatii cu salarul minim.


select last_name,salary from employees where salary=(select min(salary) from employees)
interogarea principala (outer query)

subinterogare (inner query)

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 buffer-ului 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 multiple-row: 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);

You might also like