Professional Documents
Culture Documents
ZIUA 3
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)
mici
Exemplu
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:
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
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.
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:
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:
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;
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;
Join Clauses
In aceasta lectie se studiaza: - folosirea clauzelor USING si ON - realizarea unui join cu 3 tabele Clauza USING Intr-un natural join, daca tabelele au coloane cu acelasi nume dar tipuri diferite, se produce eroare. Pentru a evita aceasta situatie, clauza JOIN se inlocuieste cu clauza USING. Clauza USING specifica coloanele care ar trebui folosite pentru pentru equijoin. Coloana specificata in clauza USING nu trebuie sa aiba nici un specificator (nume de tabela sau alias), in nici o parte din instructiunea SELECT.
Join Clauses
Exemple: 1) SELECT client_number, first_name, last_name, event_date FROM d_clients JOIN d_events USING (client_number); 2)
Join Clauses
Exemple: 3) Clauza USING ne permite sa folosim WHERE pentru a restrictiona liniile dintr-o tabela sau din ambele tabele. SELECT client_number, first_name, last_name, event_date FROM d_clients JOIN d_events USING (client_number) WHERE last_name = Peters ;
Join Clauses
Clauza ON Daca coloanele folosite pentru join au denumiri diferite sau daca sunt folositi operatorii:<,> sau BETWEEN, atunci nu putem folosi clauza USING. In aceasta situatie se foloseste clauza ON. Aceasta permite specificarea unei game variate de conditii pentru join-uri. De asemenea, clauza ON ne permite sa folosim WHERE pentru a restrictiona linii dintr-o tabela sau din ambele tabele. Exemple: 1) SELECT e.last_name as "EMP", m.last_name as "MGR FROM employees e JOIN employees m ON (e.manager_id = m.employee_id); Se realizeaza un self-join pentru a selecta acei angajati (employees) care sunt si manageri.
Join Clauses
2) folosirea clauzei WHERE SELECT e.last_name as "EMP", m.last_name as "MGR" FROM employees e JOIN employees m ON (e.manager_id = m.employee_id) WHERE e.last_name like 'H%';
Join Clauses
Realizarea unui join cu 3 tabele Ambele clauze (ON si USING) se pot folosi pentru un astfel de join. Sa presupunem ca avem de realizat un raport despre clienti, evenimentele corespunzatoare lor si temele pentru acele evenimente. In aceasta situatie, avem nevoie sa facem un join cu 3 tabele: d_clients, d_events si d_themes. SELECT last_name, event_date, t.description FROM d_clients c JOIN d_events e USING (client_number) JOIN d_themes t ON (e.theme_code = t.code);
Join Clauses
Join Clauses
Comparing Oracle Proprietary Joins with ANSI/ISO SQL: 1999 Joins
Join Clauses
APLICATII
1) Realizati un join intre tabelele locations si departments folosind coloana location_id. Limitati rezultatele doar pentru locatia 1400. 2) Afisati:orasul, numele departamentului, id-ul locatiei si id-ul departamentului pentru departamentele 10, 20 si 30, pentru orasul Seattle.
Join Clauses
1) Realizati un join intre tabelele locations si departments folosind coloana location_id. Limitati rezultatele doar pentru locatia 1400. SELECT l.city, d.department_name FROM locations l JOIN departments d USING (location_id) WHERE location_id = 1400; 2) Afisati:orasul, numele departamentului, id-ul locatiei si id-ul departamentului pentru departamentele 10, 20 si 30, pentru orasul Seattle. SELECT l.city, d.department_name, location_id, d.department_id FROM locations l JOIN departments d USING (location_id) WHERE city = 'Seattle' AND department_id IN (10, 20, 30);
Group Functions
In SQL functiile de grup se pot aplica intregii tabele sau unui set de linii din tabela, fiecare functie furnizand un singur rezultat.
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 );
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.
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:
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
SUBQUERIES
APLICATII 1) Care este numele membrilor din personalul de la Global Fast Foods, al caror salariu este mai mare decat angajatul cu ID-ul 12? 2) Care dintre angajatii Oracle au acelasi id al departamentului ca si cel corespunzator cu departamentul IT?
SUBQUERIES
1) Care este numele membrilor din personalul de la Global Fast Foods, al caror salariu este mai mare decat angajatul cu ID-ul 12? SELECT last_name FROM f_staffs WHERE salary > (SELECT salary FROM f_staffs WHERE id = 12);
SUBQUERIES
2) Care dintre angajatii Oracle au acelasi id al departamentului ca si cel corespunzator cu departamentul IT? SELECT first_name, last_name FROM employees WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'IT');
SELECT last_name FROM employees WHERE salary = ANY (SELECT MIN(salary) FROM employees GROUP BY department_id);