Documente Academic
Documente Profesional
Documente Cultură
Capitolul4Interogareabazelordedate
Instruciunea SELECT
Instruciunea SELECT este instruciunea de interogare a bazei de date din SQL2, prin care regsim
informaiile dorite din una sau mai multe tabele [FI]. Aceast instruciune are urmtoarea sintax
general:
Reamintim c elementele ntre paranteze drepte sunt opionale, cu meniunea c n Oracle clauza
FROM este obligatorie, chiar dac nu specificm o tabel real, ci dorim s afim rezultatul unor
calcule matematice, de exemplu:
SELECT 4*5 + 3 FROM DUAL;
Sau afiarea datei curente:
SELECT CURRENT_DATE FROM DUAL;
Sau a datei i a timpului:
SELECT CURRENT_TIMESTAMP FROM DUAL;
Sau, mai complicat, utiliznd o funcie de conversie text cu specificarea formatului:
SELECT TO_CHAR(SYSDATE, 'MM-DD-YYYY HH24:MI:SS') "Data si ora curenta"
FROM DUAL;
Tabela DUAL este o tabel virtual special (cu rol de variabil auxiliar) care permite lucrul cu
SELECT ca i cnd am afia valoarea unei variabile sau constante.
Restricia
Operaia de restricie (sau selecie) permite decuparea pe orizontal a coninutului unei tabele, dup
o anumit condiie specificat n clauza WHERE a instruciunii SELECT. Restricia presupune c
afim toate atributele (coloanele) tabelei.
Exemplu (testai direct):
- Afiai toi angajaii (din tabela Employees) care au salariul mai mare dect 5000:
SELECT * FROM Employees WHERE Salary > 5000;
Exerciiu:
- Afiai toi angajaii care au salariul ntre 7000 i 10000;
Not: aici se poate folosi mai elegant operatorul between and .
- Afiai toi angajaii care au prenumele John;
- Afiai toi angajaii care au fost angajai dup 01-DEC-2007;
- Afiai toi programatorii (job IT_PROG), apoi dintre acetia, pe cei care ctig mai mult
de 5000;
- Afiai ntr-o singur instruciune Select doar angajaii care au funcia de Stock Clerk
(ST_CLERK) i pe cei care au funcia de Marketing Manager (MK_MAN).
Proiecia
Proiecia este operaia din algebra relaional care permite o decupare pe vertical a unei tabele,
adic alegerea doar a unor coloane din aceasta.
Exemplu de proiecie:
SELECT DISTINCT first_name, last_name FROM Employees;
Alias-ul unei coloane:
Reprezint afiarea unei coloane cu alt nume dect cel din tabel. De exemplu, putem relua
instruciunea de mai sus afind numele atributelor n limba romn; testai direct:
SELECT DISTINCT first_name as Prenume, last_name as Nume FROM Employees ;
Sau, echivalent (AS fiind opional n Oracle):
SELECT DISTINCT first_name Prenume, last_name Nume FROM Employees ;
Sortarea cresctoare este cea prestabilit. Dac dorim o sortare descresctoare putem aduga
opiunea DESC dup cum urmeaz:
SELECT First_name, Last_name, Salary FROM Employees ORDER BY Salary DESC;
Coloana dup care se face ordonarea (Salary n exemplul de mai sus) nu trebuie neaprat s fac
parte din proiecie (din coloanele afiate). De asemenea, valoarea NULL este considerat cea mai
mare valoare.
Exerciiu: Afiai lista angajailor din Employees n ordinea cresctoare a numelui, apoi a
prenumelui (angajaii cu acelai nume s fie ordonai ascendent dup prenume).
Funcii agregat
Funciile agregat, sau funciile de grup, permit obinerea de date statistice din mai multe linii ale
tabelei. Cele mai importante sunt:
COUNT
ntoarce numrul de nregistrri COUNT(*) sau numrul de valori diferite de NULL
COUNT(expresie)
AVG
Calculeaz media aritmetic.
3
MIN
ntoarce valoarea minim a unei expresii.
MAX
ntoarce valoarea maxim a unei expresii.
SUM
Calculeaz suma valorilor.
Exemple:
SELECT COUNT(*) FROM Employees; -- afieaz numrul de linii din tabel
Afiarea salariului minim, maxim i mediu din toat tabela Employees:
SELECT MIN(Salary) Salariul_min, MAX(Salary) Salariul_max, ROUND(AVG(Salary),2)
Salariul_mediu FROM Employees;
Exerciiu: Afiai salariul minim, maxim i mediu pentru programatorii din tabela Employees.
Clauza GROUP BY
Clauza GROUP BY se folosete pentru a grupa liniile unei tabele pe baza unor criterii n scopul
calculrii de valori statistice pentru fiecare grup n parte. Rezultatul obinut va conine cte o linie
pentru fiecare grup identificat. [FR]
Exemplu:
Care este salariul mediu pe fiecare categorie de angajai din tabela Employees?
SELECT Job_ID, ROUND(AVG(Salary)) Salariul_mediu FROM Employees GROUP BY Job_ID;
Observaii:
GROUP BY se folosete doar atunci cnd avem nevoie de funcii agregat. Dac omitem
clauza group by, funciile agregat se vor aplica pe toate liniile tabelei.
Coloana (sau coloanele) dup care se realizeaz gruparea pot s nu apar n tabela rezultat
(pot s nu fie specificate ntre SELECT i FROM).
Nu se poate preciza in group by un alias de coloan.
Numele de coloane specificate n SELECT trebuie s fie compatibile cu clauza de grupare.
Astfel, urmtorul exemplu este incorect:
SELECT First_name, AVG(Salary) FROM Employees
GROUP BY Department_ID;
i va returna o eroare: not a GROUP BY expression, deoarece coloana First_name conine
valori diferite pentru aceeai valoare a Department_ID.
Clauza HAVING
n cazul n care folosim clauza GROUP BY, nu putem folosi clauza WHERE. Clauza WHERE se
nlocuiete n aceast situaie cu clauza HAVING, care are acelai efect ca i WHERE, doar c este
folosit mpreun cu GROUP BY.
Exemplu:
Care sunt categoriile de angajai cu un salariu minim de cel puin 7000?
SELECT Job_ID, MIN(Salary) Salariul_minim FROM Employees
GROUP BY Job_ID
HAVING MIN(Salary) > 7000;
Subinterogri
Subinterogrile sunt folosite pentru a returna anumite date ctre interogarea principal.
Exemplu: S se gseasc salariaii din fiecare departament, care au salariul minim n departamentul
respectiv [IP]:
SELECT First_name, Last_name, Salary, Department_ID
FROM Employees
WHERE (Department_ID, Salary) IN (SELECT Department_ID, MIN(Salary) FROM Employees
GROUP BY Department_ID);
Not: Observai folosirea perechii (Department_ID, Salary) pentru a identifica persoanele care au
salariul minim pe fiecare departament, i a operatorului IN.
Exerciiu: afiai (utiliznd o sub-interogare) toi angajaii care lucreaz n acelai departament cu
angajatul cu numele Karen PARTNERS.
Jonciuni
Jonciunea este operaia din algebra relaional prin care putem combina liniile din dou tabele ntr-
o singur tabel. Cel mai frecvent jonciunea este implementat impunnd egalitatea valorii cheii
strine cu valoarea cheii primare (sau secundare) referite.
Exemplu: Afiai toi angajaii din tabela Employees mpreun cu numele departamentului n care
lucreaz fiecare:
SELECT First_name, Last_name, Department_name FROM Employees, Departments
WHERE Employees.Department_ID = Departments.Department_ID;
Probleme propuse
1) Afiai toi angajaii din tabela Employees care lucreaz n departamentul cu numele Sales.
2) Afiai numrul de angajai care lucreaz n departamentul Sales.
3) Afiai pentru fiecare angajat: Prenumele, Numele i numele complet al job-ului (de
exemplu: Programmer.
4) Scriei i rulai instruciunea SQL pentru a afia ntr-un tabel cu 2 coloane, Numele
departamentului i Numr de angajai, pe cte o linie ci angajai lucreaz n fiecare
departament. Not: ar trebui s obinei un tabel cu 11 linii.
5) Scriei i rulai instruciunea SQL pentru interogarea: Care sunt numele departamentelor
care au sediul n oraul Seattle?.
6) Scriei i rulai instruciunea SQL pentru interogarea: Care sunt numele departamentelor
care au sediul pe strada Arthur St?. Not: folosii operatorul LIKE, deoarece adresa nu
conine doar denumirea strzii, ci i numrul. De asemenea, putei utiliza funciile upper sau
lower pentru a nu depinde de felul n care a fost introdus adresa (litere mari sau mici).
7) Scriei i rulai instruciunea SQL pentru interogarea: Care sunt prenumele i numele
angajailor care lucreaz n SUA sau Canada?. Afiai i numele rii, i ordonai rezultatul
dup aceast coloan.