Sunteți pe pagina 1din 6

BAZE DE DATE – SEMINAR 6

___________________________________________________________________________

UTILIZAREA FUNCȚIILOR PREDEFINITE ÎN INTEROGĂRI

• Funcții de tip single-row (sau scalare). O funcție single-row întoarce un singur rezultat
pentru fiecare rând al tabelei interogate sau view
• Funcții de grup (sau agregate). O funcție de grup întoarce un singur rezultat pentru un
grup de rânduri interogate. Funcțiile de grup pot apare în clauza HAVING.

FUNCTII SINGLE-ROW

Funcții de tip caracter


Funcția LOWER() , UPPER(), INITCAP()

1. Să se afișeze cu litere mari denumirea departamentelor din locația 1700:

SELECT id_departament, UPPER(denumire_departament)


FROM departamente
WHERE id_locatie=1700;

2. Să se afișeze salariații al căror nume începe cu litera s

SELECT id_angajat, nume FROM angajati WHERE nume like 's%';


SELECT id_angajat, nume FROM angajati WHERE nume like upper('s%');

3. Să se afișeze toți angajații cu numele Smith utilizând funcțiile INITCAP, UPPER,


LOWER

SELECT id_angajat, nume FROM angajati WHERE INITCAP(nume) = 'Smith';


SELECT id_angajat, nume FROM angajati WHERE UPPER(nume) = 'SMITH';
SELECT id_angajat, nume FROM angajati WHERE LOWER(nume) = 'smith';

Operatorul de concatenare (||)


4. Să se afișeze denumirea produsului și stocul disponibil

SELECT 'Produsul: ' || INITCAP(denumire_produs) || ' are pretul_minim ' || pret_min


produs_pret_minim
FROM produse;

Funcția CONCAT() , funcția LENGTH() , funcția SUBSTR()


5. Să se afișeze id_client, numele clienților concatenată cu sexul acestora și lungimea
prenumelui, nivel_venituri numai pentru clienții cu venituri in categoria F: 110000 -
129999
SELECT id_client, CONCAT(nume_client,sex), LENGTH(prenume_client), nivel_venituri
FROM clienti
WHERE SUBSTR(nivel_venituri,1,1)='F';
INSTR(), - poziția primei apariții a unui string în alt string
LPAD(), RPAD(), - left/right PAD – adăugare unui șir la alt șir până la un nr.
REPLACE(), REVERSE() - înlocuiește toate aparițiile unui subșir într-un șir, cu un
nou subșir / inversează un șir

Pagina 1 din 6
BAZE DE DATE – SEMINAR 6
___________________________________________________________________________

Funcții de tip numeric


Funcția ROUND(), TRUNC()

6. Să se afișeze numărul 45,923 rotunjit la două zecimale și rotunjit la număr întreg.


Să se aplice și funcția TRUNC.

SELECT ROUND(45.923,2), ROUND(45.923,0) FROM DUAL;


SELECT TRUNC(45.923,2), TRUNC(45.923,0) FROM DUAL;

SIGN(), POWER(), MOD(), SQRT(),CORR(),STDDEV()

Funcții de tip dată calendaristică


Funcția SYSDATE

7. Să se afișeze perioada de timp corespunzătoare (în săptămâni) între data încheierii


comenzii și data curentă:

SELECT id_comanda, (SYSDATE-data)/7 saptamani


FROM comenzi;

8. Afișați data curentă (se selectează data din tabela DUAL):

SELECT SYSDATE data_curenta FROM DUAL;

Funcțiile MONTHS_BETWEEN() , ADD_MONTHS() , NEXT_DAY() , LAST_DAY()

9. Să se afișeze comenzile, data încheierii comenzilor, numărul de luni între data curentă
și data încheierii, următoarea zi de vineri după data încheierii, ultima zi din luna din care
face parte data încheierii, precum și data corespunzătoare după 2 luni de la data încheierii
comenzii
SELECT id_comanda, data, round(MONTHS_BETWEEN(sysdate, data)) luni,
NEXT_DAY(data, 'FRIDAY'), LAST_DAY(data),ADD_MONTHS(data,2)
FROM comenzi;

10. Să se afișeze comenzile încheiate în luna trecută:


SELECT id_comanda, data FROM comenzi
WHERE round(MONTHS_BETWEEN(sysdate, data))=1;

SELECT id_comanda, data FROM comenzi


WHERE round(MONTHS_BETWEEN(sysdate, data))=51;

Funcția ROUND(), TRUNC()


11. Să se afișeze comenzile încheiate în 2020. Se va rotunji data încheierii la prima zi din
luna corespunzătoare dacă data încheierii este în prima jumătate a lunii sau la prima zi din
luna următoare:
SELECT id_comanda, data, ROUND(data, 'MONTH') FROM comenzi
WHERE data LIKE '%-20%';

Pagina 2 din 6
BAZE DE DATE – SEMINAR 6
___________________________________________________________________________

Funcții de conversie

Funcția TO_CHAR

12. Să se afișeze comenzile si data încheierii in formatul inițial si in format “MM/YY”

SELECT id_comanda, data, TO_CHAR(data, 'MM/YY') data_incheierii_comenzii


FROM comenzi;

Funcția TO_DATE

13. Să se afișeze comenzile încheiate între 15 ianuarie si 15 decembrie 2019.

SELECT id_comanda, data


FROM comenzi
WHERE data BETWEEN TO_DATE( 'January 15, 2019', 'Month dd,YYYY') AND
TO_DATE( 'December 15, 2019', 'Month dd,YYYY');

Funcția TO_NUMBER - Convertește șirul de caractere într-un număr cu un anumit format


TO_NUMBER(char[, 'format_model'])

SELECT TO_NUMBER('RON12,345.64', 'L99G999D99') FROM DUAL;

ALTER SESSION SET NLS_CURRENCY = 'RON';


CREATE TABLE test(NUMAR VARCHAR2(50));
INSERT INTO test SELECT salariul FROM angajati;
UPDATE test
SET numar = 'RON'||numar;
SELECT * FROM test;
SELECT TO_NUMBER(numar,'L99999') FROM test;

Pagina 3 din 6
BAZE DE DATE – SEMINAR 6
___________________________________________________________________________

Funcția EXTRACT()

14. Să se afișeze comenzile încheiate în anii 2017 și 2018.

SELECT id_comanda, data


FROM comenzi
WHERE EXTRACT(YEAR FROM data) IN (2017, 2018);

15. Să se afișeze comenzile încheiate în lunile iulie și august.

SELECT id_comanda, data


FROM comenzi
WHERE EXTRACT(MONTH FROM data) IN (7,8);

Functiile NVL, NVL2, NULLIF, COALESCE


NVL - convertește o valoare nulă într-o valoare reală. Tipurile de date care pot fi utilizate sunt
data, caracter și număr
NVL(comision,0)
NVL(data_angajarii,'01-JAN-17')
NVL(id_functia,'Nu_exista_functia')

16. Să se calculeze veniturile anuale ale angajaților


SELECT nume, salariul*12 + salariul*12*NVL(comision,0) venit_anual
FROM angajati;

NVL2
17. Să se afișeze angajații care au comision (1) si pe cei care nu au comision (0).
SELECT nume, NVL2(comision, 1, 0)
FROM angajati;

NULLIF - returnează NULL dacă două expresii sunt egale, în caz contrar, returnează prima
expresie
18. Să se afișeze lungimea numelui, lungimea prenumelui, daca acestea sunt egale sa se
returneze nul ca rezultat, iar daca nu sunt egale se va returna lungimea numelui.
SELECT nume, LENGTH(nume), prenume, LENGTH(prenume),
NULLIF(LENGTH(nume), LENGTH(prenume)) rezultat
FROM angajati;

COALESCE - returnează primul argument care se evaluează la o valoare non-nulă


19. Să se afișeze id-ul managerului fiecărui angajat, daca acesta este nul, se va afișa
comisionul, iar daca si acesta este nul se va afisa -1.
SELECT nume, prenume, COALESCE(id_manager,comision,-1)
FROM angajati;

Pagina 4 din 6
BAZE DE DATE – SEMINAR 6
___________________________________________________________________________

FUNCŢII DE GRUP

AVG([DISTINCT|ALL] n) – calculează media aritmetică a valorilor


COUNT(* | [DISTINCT|ALL] expr) – întoarce numărul total al valorilor
MAX([DISTINCT|ALL] expr) – întoarce valoarea maximă
MIN([DISTINCT|ALL] expr) – întoarce valoarea minimă
SUM([DISTINCT|ALL] n) – calculează suma valorilor

Se utilizează următoarele clauze:


GROUP BY – grupează datele în funcție de un anumit câmp;
ORDER BY – ordonează datele in funcție de un anumit câmp;
HAVING – permite stabilirea unor criterii de selecție asupra funcțiilor de grup;

Exemple:
1. Să se afișeze valoarea medie, valoarea maximă, valoarea minimă și valoarea totală a
produselor comandate:

SELECT AVG(rc.cantitate * rc.pret), MAX(rc.cantitate * rc.pret), MIN(rc.cantitate *


rc.pret), sum(rc.cantitate * rc.pret)
FROM rand_comenzi rc;

2. Să se afișeze data primei comenzi încheiate și data celei mai vechi comenzi încheiate:

SELECT MIN(data), MAX(data)


FROM comenzi;

3. Să se afișeze numărul de produse al căror pret_min>350:

SELECT COUNT(*) nr_produse


FROM produse
WHERE pret_min>350;

4. Sa se afișeze numărul de salarii (distincte) din tabela angajati.

SELECT COUNT (salariul) FROM angajati; → 107


SELECT COUNT (DISTINCT salariul) FROM angajati; → 58

5. Să se afișeze numărul total de comenzi încheiate:

SELECT COUNT(id_comanda) nr_comenzi FROM comenzi;

6. Să se afișeze pe câte comenzi apare produsul cu codul 3124:

SELECT COUNT(id_comanda) produse_comandate_id_produs


FROM rand_comenzi WHERE id_produs = 3124;

Pagina 5 din 6
BAZE DE DATE – SEMINAR 6
___________________________________________________________________________

7. Să se afișeze cantitatea medie vândută din fiecare produs. Să se ordoneze după cantitate
(se utilizează funcția AVG() și clauza GROUP BY pentru gruparea datelor în funcție de
id_ul produsului, iar ordonarea se realizează cu ajutorul funcției ORDER BY).

SELECT id_produs, ROUND(AVG(cantitate),2) medie_produse


FROM rand_comenzi
GROUP BY id_produs
ORDER BY medie_produse;

8. Să se afișeze produsele și cantitatea medie vândută numai pentru acele produse a căror
cantitate medie este mai mare de 25 (condiția se specifica în clauza HAVING și nu în
clauza WHERE deoarece este utilizata funcția de grup AVG și condiția este
AVG(cantitate)>25).

SELECT id_produs, ROUND(AVG(cantitate),1) medie_produse


FROM rand_comenzi
GROUP BY id_produs
HAVING ROUND(AVG(cantitate),1)>25;

9. Să se calculeze valoarea totală a fiecărei comenzi și să se sorteze descrescător în funcție


de valoare:

SELECT comenzi.id_comanda, SUM(rand_comenzi.cantitate * rand_comenzi.pret)


total_comanda
FROM comenzi, rand_comenzi
WHERE rand_comenzi.id_comanda=comenzi.id_comanda
GROUP BY comenzi.id_comanda
ORDER BY total_comanda DESC;

10. Să se afișeze numai comenzile care au valoarea cuprinsă între 1000 și 3000 (condiția va
fi menționată în clauza HAVING deoarece se utilizează funcția de grup SUM):

SELECT comenzi.id_comanda, SUM(rand_comenzi.cantitate * rand_comenzi.pret)


total_comanda
FROM comenzi, rand_comenzi
WHERE rand_comenzi.id_comanda=comenzi.id_comanda
GROUP BY comenzi.id_comanda
HAVING SUM(rand_comenzi.cantitate * rand_comenzi.pret) BETWEEN 1000 AND
3000
ORDER BY total_comanda DESC;

Pagina 6 din 6

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