Functii Join Sub Queries

download Functii Join Sub Queries

of 174

Transcript of Functii Join Sub Queries

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 MANIPULATIONTabela DUALTabela 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 MANIPULATIONSINGLE-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 MANIPULATIONFUNCTII 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

miciExemplu

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

CASE AND CHARACTER MANIPULATIONFUNCTII 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 MANIPULATIONFUNCTII 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 MANIPULATIONFUNCTII 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 MANIPULATIONFUNCTII 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 MANIPULATIONAPLICATII1. Care este lungimea sirului de caractere Oracle Internet Academy ? 2. Care este pozitia caracterului I in Oracle Internet Academy ?

NUMBER FUNCTIONSFunctiile 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 FUNCTIONSFunctia ROUNDeste 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 FUNCTIONSFunctia 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 FUNCTIONSFunctia TRUNCeste 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 FUNCTIONSFunctia 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 FUNCTIONSFunctia 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 FUNCTIONSAPLICATII 1. Sa se afiseze campurile last_name si salary pentru acei angajaticare 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 FUNCTIONS2. 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 FUNCTIONSExemplu: 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 FUNCTIONSEXEMPLE: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 FUNCTIONSExemple: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 FUNCTIONSExemple: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 FUNCTIONSAplicatii: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 FUNCTIONSAplicatii: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 FUNCTIONSPentru 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 FUNCTIONSSunt 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 FUNCTIONSCONVERSIA 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 FUNCTIONSModelul 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 FUNCTIONSElemente 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 FUNCTIONSExemple: 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 FUNCTIONSExercitiu: 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 FUNCTIONS1) 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 FUNCTIONSCONVERSIA 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 FUNCTIONSCateva 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 - EEEE afisarea notatiei stiintifce Exemplu: 99.999EEEE determina afisarea 1.23E+03 - B afisarea valorilor 0 ca spatii

CONVERSION FUNCTIONSAPLICATII Identificati modelele de format pentru afisarea urmatoarelor valori numerice:

$3000.00 4,500 9,000.00 0004422

CONVERSION FUNCTIONS1) $3000.00SELECT TO_CHAR(3000, $99999.99 )

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

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

4) 0004422SELECT TO_CHAR(4422, 0999999 )

CONVERSION FUNCTIONSCONVERSIA SIRURILOR DE CARACTERE IN NUMEREFunctia 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 FUNCTIONSCONVERSIA 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 FUNCTIONSLa 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 FUNCTIONSFORMATELE 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 FUNCTIONSExemplu:

CONVERSION FUNCTIONSAplicatii: 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 FUNCTIONS1) Realizati conversia datei calendaristice January 3, 2004 la formatul implicit de data calendaristica 03-JAN-04SELECT 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 FourSELECT 'Today is the ' ||TO_CHAR(SYSDATE, 'Ddspth "of" Month, Yyyysp') FROM DUAL;

CONVERSION FUNCTIONS3) 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 FUNCTIONSPana 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 FUNCTIONSSELECT 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 FUNCTIONSSunt 4 functii generale care folosesc valorile null:

-

NVL NVL2 NULLIF COALESCE

NULL FUNCTIONSFUNCTIA 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 FUNCTIONSFunctia 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 FUNCTIONSFUNCTIA NVL2Functia 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 FUNCTIONSExemplu: SELECT last_name, salary, NVL2(commission_pct, salary + (salary *commission_pct), salary) income FROM employees;

NULL FUNCTIONSFUNCTIA NULLIFFunctia 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 FUNCTIONSFUNCTIA COALESCEFunctia 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 FUNCTIONSAPLICATII1) 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 FUNCTIONS1) 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 FUNCTIONS2) 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 EXPRESSIONSSunt 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 EXPRESSIONSExemplu:

CONDITIONAL EXPRESSIONS2) 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 EXPRESSIONSAPLICATII1) 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 EXPRESSIONS1) 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 EXPRESSIONS2) 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 EXPRESSIONS3) 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 OperationsTipuri de JOIN-uri

Cartesian Product and the Join OperationsJOIN-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 OperationsPRODUSUL 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 OperationsEQUIJOIN 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 OperationsFOLOSIREA 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 OperationsALIASURI 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 OperationsAPLICATII1) 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 Operations1) 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 JoinsJoin-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 JoinsOBSERVATIE:Un outer join nu poate folosi operatorul IN si nu poate fi legat la alta conditie prin operatorul OR.

Outer Joins

Outer Joins

Outer JoinsAPLICATII: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 Joins1) 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 Joins2) 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 JoinsIn 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 JoinsAPLICATII1) 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 Joins1) 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 Joins2) 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 JoinsNATURAL 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 JoinsExemple: 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 JoinsCROSS 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 JoinsAPLICATII1) 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 Joins1) 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 ClausesIn 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 ClausesExemple: 1) SELECT client_number, first_name, last_name, event_date FROM d_clients JOIN d_events USING (client_number); 2)

Join ClausesExemple: 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 ClausesClauza 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 Clauses2) 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 ClausesRealizarea 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 ClausesComparing Oracle Proprietary Joins with ANSI/ISO SQL: 1999 Joins

Join ClausesAPLICATII1) 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 Clauses1) 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 JoinsIn 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 JoinsLEFT OUTER JOIN - Sunt afisati si acei angajati care nu au desemnat un department_id (tabela departments este cea deficitara).

Inner vs. Outer JoinsRIGHT OUTER JOIN - Sunt afisate si acele departamente care nu au angajati

Inner vs. Outer JoinsFULL 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 JoinsConstruiti 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 JoinsAPLICATII1) 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 Joins1) 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 Joins2) 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 Joins3) 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 JoinsALTE 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 Joins1. 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 Joins2. 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 Joins3. 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 FunctionsIn 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 FunctionsFunctia AVG returneaza media aritmetica pentru o multime de valori - Se foloseste doar pentru coloane ce contin valori numerice Exemplu:

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

Group FunctionsFunctiile 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 FunctionsFunctia COUNT - Returneaza numarul de linii care nu au valoarea null pentru o expresie specificata - COUNT(*) returneaza numarul total de linii din tabela Exemple:

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

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

Group FunctionsOBSERVATII: - 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 FunctionsAPLICATIIFolosind 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 FunctionsFolosind 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, NVLCOUNT- 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, NVLCOUNT- 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, NVLDISTINCT- 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, NVLDISTINCTExemple: 2) SELECT SUM(salary) FROM employees WHERE department_id = 90; SELECT SUM(DISTINCT salary) FROM employees WHERE department_id = 90;

COUNT, DISTINCT, NVLNVLUneori, 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, NVLAPLICATII1) 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, NVLAPLICATII3) 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, NVL1) 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, NVL3) 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 clausesGROUP 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 clausesGROUP 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 clausesExemplu: 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 clausesSe 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 clausesExemple: 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 clausesReguli 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 clausesUneori 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 clausesDe 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 clausesHAVINGAsa 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 clausesHAVINGDesi 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 clausesAPLICATII 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;

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

SUBQUERIESEXEMPLU:

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)

SUBQUERIESREGULI 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

SUBQUERIESSunt doua tipuri de subinterogari(subqueries): 1) single-row subqueries care folosesc operatorii single-row: >,=,>=, ALL (SELECT year FROM d_cds WHERE producer = The Music Man );

MULTIPLE ROW SUBQUERIESVALORI 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 SUBQUERIESGROUP 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) ALL (SELECT MIN(salary) FROM employees WHERE department_id < 50 GROUP BY department_id);

MULTIPLE ROW SUBQUERIESAPLICATII 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 SUBQUERIES2) 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 SUBQUERIESSELECT department_id, MIN(salary) FROM employees GROUP BY department_id HAVING MIN(salary) < (SELECT MIN(salary) FROM employees WHERE department_id = 50);