Sunteți pe pagina 1din 8

Prof.

Felicia Ionescu

LABORATOR 2 - SQL
FUNCII SQL (single-row) Funciile SQL sunt predefinite n sistemul Oracle i pot fi utilizate n instruciuni SQL. Ele nu trebuie confundate cu funciile definite de utilizator, scrise n PL/SQL. Dac o funcie SQL este apelat cu un argument avnd un alt tip de date dect cel ateptat, sistemul convertete implicit argumentul nainte s evalueze funcia. Dac o funcie SQL este apelat cu un argument null, atunci aceasta returneaz valoarea null. Singurele funcii care nu urmeaz aceast regul sunt CONCAT, NVL i REPLACE. Principalele funcii SQL pot fi clasificate n urmtoarele categorii: Funcii single-row Funcii multiple-row (funcii agregat)

Funciile single-row returneaz cte o linie rezultat pentru fiecare linie a tabelului sau vizualizrii interogate. Aceste funcii pot aprea n listele SELECT, clauzele WHERE, START WITH, CONNECT BY i HAVING. 1. Analizai urmtoarele funcii pentru prelucrarea irurilor de caractere: Funcie LOWER (expresie) UPPER (expresie) INITCAP (expresie) Semnificaie Exemplu Convertete un ir de caractere LOWER ('AbCdE') = 'abcde' la minuscule. Convertete un ir de caractere UPPER ('AbCdE') = 'ABCDE' la majuscule. Convertete un ir de caractere la un ir care ncepe cu INITCAP ('AbCdE') = 'Abcde' majuscul i continu cu minuscule. Concateneaz doua expresii de tip caracter. Echivalent cu CONCAT ('Ab', 'CdE') = 'AbCdE' operatorul de concatenare '||'. Extrage din expresia de tip ir de caractere, n caractere ncepnd cu poziia m. Dac SUBSTR ('AbCdE', 2, 2) = 'bC' lipsete argumentul n, atunci SUBSTR ('AbCdE', 2) = 'bCdE' extrage toate caracterele pn la SUBSTR ('AbCdE', -3,2) = 'Cd' sfritul irului. Dac m este SUBSTR ('AbCdE', -3) = 'CdE' negativ numrtoarea poziiilor ncepe de la sfritul irului de caractere spre nceput. Returneaz numrul de LENGTH ('AbCdE') = 5 caractere al expresiei. Returneaz poziia la care se INSTR ('abcde abcde', 'ab', 1, 1) = 1 gsete a n-a ocurent a INSTR ('abcde abcde', 'ab', 1, 2) = 7 expresiei 'subsir' n cadrul INSTR ('abcde abcde', 'ab', 5, 2) = 0 expresiei 'sir', cutarea ncepnd INSTR ('abcde abcde', 'ab', 5) = 7

CONCAT (expr1, expr2)

SUBSTR (expresie, m[, n])

LENGTH (expresie) INSTR (sir, subsir[, pozitie][, n])

LPAD (expresie, n[, expr1]) sau RPAD (expresie, n[, expr1])

LTRIM (expresie[, expr1]) sau RTRIM (expresie[, expr1])

de la poziia pozitie. Valorile implicite pentru pozitie i n sunt 1. Completeaz expresia caracter dat ca parametru (expresie), la stnga (LPAD), respectiv la dreapta (RPAD) cu caracterele specificate n expresia expr1, pn la lungimea specificat de parametrul n. Implicit, dac lipsete, expr1 este ' ' un spaiu. Reversul funciilor LPAD, RPAD. Truncheaz expresia caracter la stnga sau la dreapta prin eliminarea succesiv a caracterelor din expresia expr1. Implicit, daca lipsete, expr1 este ' ' un spaiu.

INSTR ('abcde abcde', 'ab') = 1

RPAD (LOWER('AbCdE'), 10, 'X') = 'abcdeXXXXX' LPAD (LOWER('AbCdE'),10) = ' abcde'

RTRIM ('abcdeXXXX', 'X') = 'abcde' LTRIM (' abcde') = 'abcde'

TRIM (LEADING 'X' FROM Permite eliminarea caracterelor 'XXXabcdeXXX') = 'abcdeXXX' TRIM (LEADING | TRAILING | specificate (caractere_trim) de TRIM (TRAILING 'X' FROM BOTH caractere_trim FROM la nceputul (leading) , sfritul 'XXXabcdeXXX') = 'XXXabcde' expresie) (trailing) sau din ambele pri, TRIM ( BOTH 'X' FROM dintr-o expresie caracter data. 'XXXabcdeXXX') = 'abcde' TRIM (' abcde REPLACE (expr, expr1, expr2) ') = 'abcde' nlocuiete n prima expresie REPLACE ('%1%11','%','2') = '21211' toate ocurentele irului expr1 cu REPLACE ('%1%11','%1','23') = '23231' irul expr2. REPLACE ('%1%11','%') = '111'

Fiecare caracter din irul de caractere expr care apare i nTRANSLATE('%1%11','%','2') = '21211' expr1 este transformat nTRANSLATE('%1%111','%1','23') TRANSLATE(expr, expr1, expr2) caracterul corespunztor (aflat = ' 232333' pe aceeai poziie ca i n expr1) din irul de caractere expr2. Returneaz codul ASCII al ASCII (expresie) primului caracter din irul ASCII ('curs') = ASCII ('c') = 99 'expresie'. ntoarce caracterul CHR(expresie) corespunztor codului ASCII CHR(99)= 'c' specificat. 2. S se listeze numele i data angajrii salariatului avnd codul 200. S se eticheteze coloanele conform cu semnificaiile acestora (Nume, Data angajrii), fr ca aliasurile s fie trunchiate la dimensiunea coloanei i respectndu-se forma de scriere a acestora (aliasurile ncep cu majuscul). Obs.: Numai aliasul specificat ntre ghilimele pstreaz formatul exact (majuscule, respectiv minuscule), celelalte sunt transformate implicit n majuscule.

Cuvntul cheie care specific un alias este AS. Acesta este facultativ. SELECT last_name AS "Nume" , RPAD(TO_CHAR(hire_date),20,' ') "Data angajarii" FROM employees WHERE employee_id=200; 3. S se afieze pentru fiecare angajat din departamentul 20 un ir de caractere de forma "Funcia salariatului {prenume} {nume} este {cod functie}". S se afieze prenumele cu iniiala litera mare, iar numele cu litere mari (Stephen KING), iar codul funciei s se afieze cu litere mici. SELECT 'Functia salariatului ' || INITCAP(last_name)|| ' ' || UPPER(first_name)|| ' este ' || LOWER(job_id) Informatii FROM employees WHERE department_id=20; 4. S se afieze pentru angajatul cu numele 'HIGGINS' codul, numele i codul departamentului. Cum se scrie condiia din WHERE astfel nct s existe sigurana ca angajatul 'HIGGINS' va fi gsit oricum ar fi fost introdus numele acestuia? Cutarea trebuie s nu fie case-sensitive, iar eventualele blank-uri care preced sau urmeaz numelui trebuie ignorate. SELECT employee_id, last_name, department_id FROM employees WHERE UPPER(TRIM(last_name))='HIGGINS'; 5. S se afieze pentru toi angajaii al cror nume se termin n 'n', codul, numele, lungimea numelui i poziia din nume n care apare prima data litera 'a'. Asociai aliasuri coloanelor returnate de cerere. SELECT employee_id, last_name, LENGTH(last_name), INSTR(last_name, 'a') FROM employees WHERE SUBSTR(last_name,-1)='n'; 6. Analizai urmtoarele funcii aritmetice: Funcie Semnificaie Exemplu ROUND(1.6) = 2 Returneaz valoarea rotunjit a expresiei ROUND(1.4) = 1 pn la n zecimale. Daca n este negativ sunt ROUND (expresie [, n]) ROUND (1234.56,1) = 1234.6 rotunjite cifre din stnga virgulei. Valoarea ROUND (1230.56, -2) = 1200 implicit pentru n este 0. ROUND (1260.56, -2) = 1300 CEIL(1.4) = 2 CEIL(1.6) = 2 CEIL(1234.56) = 1235 CEIL(-1234.56)= -1234 FLOOR(1.4) = 1 FLOOR(1.6) = 1 FLOOR (1234.56) = 1234 FLOOR (-1234.56) = -1235 TRUNC (1234.56) = 1234 TRUNC (123456, -2) = 123400 TRUNC (1234.56) = 1234 TRUNC (1234.56,1) = 1234.5

CEIL(n)

Partea ntreag superioar

FLOOR (n)

Partea ntreag inferioare

TRUNC (expresie[, n])

Returneaz valoarea trunchiat a expresiei pn la n zecimale. Daca n este negativ sunt trunchiate cifre din stnga virgulei. Valoare implicit pentru n este 0.

MOD (m,n) ABS(n) SQRT(n) EXP(n) LN(n) LOG (n,m) POWER(n,p) SIGN(n) COS, COSH SIN, SINH TAN, TANH

Returneaz restul mpririi lui m la n. Valoarea absolut Rdcina ptrat Ridicarea la putere a lui e Logaritm natural Logaritm n baz n din m Ridicarea la putere; n la puterea p Semnul unui numr Cosinus, cosinus hiperbolic Sinus, sinus hiperbolic Tangent, tangent hiperbolic

MOD (11, 4) = MOD (11, -4) = 3 MOD(-11, 4) = MOD (-11, -4) = -3 ABS(-2) = 2

7. S se afieze detalii despre salariaii care au lucrat un numr ntreg de sptmni pn la data curent. SELECT employee_id, last_name, salary FROM employees WHERE MOD(ROUND(SYSDATE hire_date), 5)=0; 8. S se afieze numele, salariul i numrul de mii al salariului rotunjit la 2 zecimale pentru cei care nu au salariul divizibil cu 1000. SELECT first_name || || last_name Nume si Prenume, salary, ROUND(salary/1000,2) Nr de mii FROM employees WHERE MOD(salary,1000)!=0; 9. Analizai urmtoarele operaii pe expresii de tip dat calendaristic: Operaie date -/+ number Tipul de date al Descriere rezultatului Date Scade/Adaug un numr de zile dintr-o / la o dat. Returneaz numrul de zile dintre dou date calendaristice. Scade/Adaug un numr de ore la o / dintr-o dat calendaristic.

date1 - date2 Number date +/- number/24 Date

10. S se afieze data (luna, ziua, ora, minutul si secunda) de peste 10 zile. SELECT TO_CHAR(SYSDATE+10, MONTH DD HH24:MI:SS) Data FROM DUAL; 11. S se afieze numrul de zile rmase pn la sfritul anului. SELECT ROUND(TO_DATE(31-DEC-2007)-SYSDATE) Nr zile ramase FROM DUAL; 12. a. S se afieze data de peste 12 ore. SELECT TO_CHAR(SYSDATE+12/24, MONTH DD HH24:MI:SS) Data FROM DUAL; b. S se afieze data de peste 5 minute. SELECT TO_CHAR(SYSDATE+1/288, MONTH DD HH24:MI:SS) Data FROM DUAL; 13. Analizai urmtoarele funcii pentru prelucrarea datelor calendaristice:

Funcie SYSDATE MONTHS_BETWEEN (date1, date2)

Semnificaie Exemplu ntoarce data i timpul curent Returneaz numrul de luni dintre data date1 i data date2. Rezultatul poate fi pozitiv sau negativ dup cum ROUND(MONTHS_BETWEEN date1 este mai recent sau nu fa de (SYSDATE + 31, SYSDATE)) = 1 date2. Zecimalele reprezint pari dintr-o luna! Adaug n luni la o data specificat. Valoarea n trebuie s fie ntreag (pozitiv sau negativ). Returneaz data corespunztoare primei zile a sptmnii specificate (char) care urmeaz dup date. MONTHS_BETWEEN (ADD_MONTHS(SYSDATE, 3), SYSDATE) = 3 NEXT_DAY('15-dec-2006','Monday') = '18-dec-2006' NEXT_DAY ('15-dec-2006',1) = '18-dec-2006'

ADD_MONTHS (date, n)

NEXT_DAY (date, char)

LAST_DAY (date)

Returneaz data corespunztoare LAST_DAY ('15-feb-2006') = '28-febultimei zile din luna calendaristic ce 2006' conine data specificat. ROUND (TO_DATE ('27-OCT00'),'YEAR') = 01-JAN-01 TO_CHAR (ROUND (TO_DATE ('15feb-2006 13:50','dd-mon-yyyy hh24:mi')), 'dd-mm-yyyy hh24:mi') = '16-02-2006 00:00' TO_CHAR (ROUND (TO_DATE ('15feb-2006 11:50','dd-mon-yyyy hh24:mi')), 'dd-mm-yyyy hh24:mi') = '15-02-2006 00:00' TO_CHAR (TRUNC (TO_DATE ('15feb-2006 13:50','dd-mon-yyyy hh24:mi')), 'dd-mm-yyyy hh24:mi') = '15-02-2006 00:00'

ROUND (date [, format])

Returneaz data calendaristic rotunjit dup formatul specificat Valoarea implicit este 'DAY'.

TRUNC (date [, format])

Returneaz data calendaristic trunchiat dup formatul specificat. Valoarea implicit este 'DAY'.

Dintr-o list de date calendaristice, LEAST(d1, d2, , dn) funciile ntorc prima, respectiv GREATEST(d1, d2, , dn) ultima dat n ordine cronologic. 14. S se afieze numele angajatului, data angajrii i data negocierii salariului, care a avut loc n prima zi de Luni, dup 6 luni de serviciu. Etichetai aceast coloan Negociere. SELECT first_name, hire_date, NEXT_DAY(ADD_MONTHS(hire_date, 6), Monday) Negociere FROM employees; 15. Pentru fiecare angajat s se afieze numele i numrul de luni de la data angajrii. Etichetai coloana Luni lucrate. S se ordoneze rezultatul dup numrul de luni lucrate. Se va rotunji numrul de luni la cel mai apropiat numr ntreg.

SELECT last_name, ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) Luni lucrate FROM employees ORDER BY MONTHS_BETWEEN(SYSDATE, hire_date); SELECT last_name, ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) Luni lucrate FROM employees ORDER BY Luni lucrate; SELECT last_name, ROUND(MONTHS_BETWEEN(SYSDATE, hire_date)) Luni lucrate FROM employees ORDER BY 2; 16. Analizai urmtoarele funcii de conversie: Obs. Conversiile implicite asigurate de server-ul Oracle sunt: de la VARCHAR2 sau CHAR la NUMBER; de la VARCHAR2 sau CHAR la DATE; de la NUMBER la VARCHAR2 sau CHAR; de la DATE la VARCHAR2 sau CHAR. SELECT last_name FROM employees WHERE TO_CHAR(hire_date,'yyyy')=1994; SELECT last_name FROM employees WHERE hire_date='07-JUN-1994'; SELECT employee_id||' '||last_name||' '||hire_date FROM employees WHERE department_id=10; Conversiile explicite se realizeaz cu ajutorul funciilor de tip TO_{tip} Semnificaie Exemplu Convertete o valoare de tip numeric sau dat TO_CHAR('3') = ' 3' calendaristic, la un ir de caractere conform cu TO_CHAR(-12) = '-12' TO_CHAR formatul specificat sau cu setrile naionale TO_CHAR(sysdate, 'DDMMYYYY') (expr_number_sau specificate (NLS - National Language Support). _date[, format][, = ' 09122004' Daca formatul sau parametrii lipsesc se nlsparameters]) TO_CHAR (sysdate + 365 * 57, utilizeaz formatul i parametrii implicii. 'ddmmyyyy') = ' 25112061' Formatul este case sensitive. TO_NUMBER Convertete o valoare de tip ir de caractere la o (expr_char[, valoare numeric conform cu formatul TO_NUMBER ('-12.22', 'S99.99') format][, specificat. Dac formatul sau parametrii lipsesc = -12.22 nlsparameters]) se utilizeaz formatul i parametrii implicii. Convertete o valoare de tip ir de caractere la o TO_DATE valoare de tip dat calendaristic n conformitate (expr_char[, TO_DATE ('15-feb-2006','dd-moncu formatul specificat. Dac formatul sau format][, yyyy') parametrii lipsesc se utilizeaz formatul i nlsparameters]) parametrii implicii. 17. S se afieze numele i prenumele pentru toi angajaii care s-au angajat n luna mai. Funcie

18. S se afieze data urmtoarei zile de Vineri de peste 3 luni. S se eticheteze coloana. Rezultatul trebuie s fie formatat 'NumeZi, NumeLuna NumarZi, an'. 19. Analizai urmtoarele funcii SQL: Semnificaie Exemplu Returneaz expr1 dac aceasta nu este NVL(NULL, 1) = 1 NULL, expr2 n caz contrar. Cele 2 expresii NVL(2, 1) = 2 NVL (expr1, expr2) trebuie s aib acelai tip sau expr2 s NVL('c', 1) = 'c' -- face conversie permit conversia implicit la tipul expresiei NVL(1, 'c') -- eroare expr1. --nu face conversie Dac expr1 este nenul atunci returneaz NVL2 (1, 2, 3) = 2 NVL2 (expr1, expr2, expr3) expr2, altfel Returneaz expr3 NVL2 (NULL, 2, 3) = 3 Daca expr1 = expr2 atunci funcia returneaz NULL, altfel returneaz expresia NULLIF (1, 2) = 1 NULLIF (expr1, expr2) expr1. Echivalent cu CASE WHEN expr1 = NULLIF (1,1) = NULL expr2 THEN NULL ELSE expr1 END COALESCE (1, 2, 3) = 1 Returneaz expr1 dac nu este NULL, altfel COALESCE (expr1, COALESCE (NULL, 2, 3) = 2 expr2, dac expr2 nu este NULL, altfel... expr2, ... , exprn) COALESCE (NULL, NULL, 3) = exprn , dac expr2 nu este NULL. 3 ntorc ID-ul, respectiv username-ul UID, USER utilizatorului ORACLE curent SELECT VSIZE(hire_date) ntoarce numrul de octei ai unei expresii VSIZE(expresie) FROM employees de tip DATE, NUMBER sau VARCHAR2 WHERE employee_id=104; 20. S se afieze numele angajailor i comisionul. Dac un angajat nu ctig comision, s se scrie Fara comision. Etichetai coloana Comision. SELECT last_name, NVL(TO_CHAR(commission_pct), Fara comision) comision FROM employees; 21. S se listeze numele, salariul i comisionul tuturor angajailor al cror venit lunar depete 10000$. SELECT last_name, salary, commission_pct, salary + salary * NVL(commission_pct, 0) venit_lunar FROM employees WHERE salary + salary * NVL(commission_pct, 0) > 10000 ORDER BY venit_lunar; 22. Analizai expresia CASE i funcia DECODE: Funcie/Expresie Semnificaie Exemplu CASE expr WHEN expr_bool1 THEN n funcie de valoarea unei expresii return_expr1 returneaz valoarea primei perechi [WHEN expr_bool2 THEN WHEN .. THEN care se potrivete sau return_expr2 dac nu se potrivete nici una expresia ... din ELSE. Nu se poate specifica NULL WHEN expr_booln THEN pentru toate expresiile de returnat. return_exprn ] (return_expri). Toate expresiile trebuie sa [ELSE return_expr] aib acelai tip de date END DECODE (expr, expr_cautare1, Decodific valoarea expresiei. Dac DECODE (1, 1, 2, 3) = 2 Funcie

expr_rezultat1, [expr_cautare2, expr_rezultat2, .. expr_cautaren, expr_rezultatn, ] [rezultat_implicit])

valoarea expresiei este expr_cautarei atunci e returnat expr_rezultati. Dac nu DECODE (2, 1, 2, 3) = 3 se potrivete nici o expresie de cutare DECODE (3, 1, 2, 3) = 3 atunci e returnat rezultat_implicit.

23. S se afieze numele, codul funciei, salariul i o coloana care s arate salariul dup mrire. Se tie c pentru IT_PROG are loc o mrire de 10%, pentru ST_CLERK 15%, iar pentru SA_REP o mrire de 20%. Pentru ceilali angajai nu se acord mrire. S se denumeasc coloana "Salariu revizuit". SELECT last_name, job_id, salary, DECODE(job_id, IT_PROG, salary*1.1, ST_CLERK, salary*1.15, SA_REP, salary*1.2, salary ) salariu revizuit FROM employees; SELECT last_name, job_id, salary, CASE job_id WHEN IT_PROG THEN salary* 1.1 WHEN ST_CLERK THEN salary*1.15 WHEN SA_REP THEN salary*1.2 ELSE salary END salariu revizuit FROM employees; SELECT last_name, job_id, salary, CASE WHEN job_id= IT_PROG THEN salary* 1.1 WHEN job_id=ST_CLERK THEN salary*1.15 WHEN job_id =SA_REP THEN salary*1.2 ELSE salary END salariu revizuit FROM employees; 24. S se exemplifice exemplele prezentate n tabelele anterioare, utiliznd comenzi SELECT asupra tabelului DUAL. Exemplu: SELECT ABS(-10) FROM DUAL;

S-ar putea să vă placă și