Sunteți pe pagina 1din 5

StocareaiUtilizareaInformaieiMedicalendrumardeLaborator

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:

SELECT [DISTINCT] lista_coloane


[FROM lista_tabele]
[WHERE condiie]
[clauze_secundare];

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

Cteva funcii speciale pentru lucrul cu iruri de caractere


- Funciile lower() i upper() transform irurile de caractere n minuscule respectiv majuscule;
- Caracterul subliniere (underscore _ ) ine locul unui singur caracter, iar caracterul % (procent) ine
locul la zero, mai multe, sau oricte caractere;
Exemplu: afiarea tuturor persoanelor ale cror prenume ncep cu litera A (sau a):
SELECT * FROM Employees WHERE upper(first_name) LIKE 'A%' ;
Exist multe alte funcii pentru iruri de caractere, precum: initcap(), substr(), length() etc. pe care
nu le detaliem n acest ndrumar.
Exerciiu:
- Afiai persoanele care au caracterul a pe a treia poziie n Prenume;
- Afiai toate persoanele care au n Job_ID cuvntul clerk.

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 ;

De asemenea, putem folosi operatorul de concatenare a irurilor de caractere, || , pentru a obine


afiri mai personalizate, precum (testai direct):
SELECT 'Angajatul ' || first_name || ' ' || last_name || ' are salariul ' || salary AS
"Informatii persoane" FROM Employees ;
Sau:
SELECT first_name || ' ' || last_name AS "Nume si Prenume", Salary Salariu FROM Employees;
Observaie: Alias-ul Informatii persoane a fost scris cu ghilimele pentru a nu returna o eroare.
Puteam folosi i alias-ul Informatii_persoane.
Observaie: Putem limita numrul de linii returnat de o comand SELECT utiliznd funcia
ROWNUM, ca n exemplul de mai jos, n care se afieaz doar primele 3 linii:
SELECT first_name || ' ' || last_name AS "Nume si Prenume", Salary Salariu FROM Employees
where ROWNUM<=3;

Sortarea liniilor tabelei folosind clauza ORDER BY


Putem ordona liniile afiate de instruciunea SELECT adugnd clauza ORDER BY. De exemplu,
pentru a afia toi angajaii n ordinea cresctoare a salariului putem executa comanda:
SELECT First_name, Last_name, Salary FROM Employees ORDER BY Salary;

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

Crearea unei tabele folosind instruciunea SELECT


Prin execuia unei instruciuni SELECT se poate obine o tabel nou, coninnd rezultatul comenzii
SELECT. Astfel, pentru a crea o tabel Programatori prelund din tabela Employees numele i
prenumele angajailor cu Job_ID IT_PROG putem folosi instruciunea urmtoare:
CREATE TABLE Programatori AS
SELECT First_name Prenume, Last_Name Nume FROM Employees
WHERE Job_id = 'IT_PROG';
Observai utilizarea alias-urilor de coloan; verificai efectul instruciunii de mai sus prin afiarea
coninutului tabelei Programatori, i a structurii acesteia (DESCRIBE Programatori;).
Ce observai referitor la tipul de date al coloanelor din noua tabel?

Definirea cu SELECT a unor coloane noi


O facilitate a limbajului SQL este aceea c permite definirea (prin intermediul instruciunii
SELECT) a unor coloane noi, calculate prin expresii coninnd alte nume de coloane sau constante.
De exemplu, dac dorim afiarea unei coloane Salariu net lunar pentru angajaii din tabela
Employees putem utiliza codul urmtor:
SELECT First_name, Last_name, Salary as "Salariu brut", 0.7*Salary as "Salariu net"
FROM Employees;
Atenie: aceast nou coloan nu poate fi utilizat ca atare n clauza where, ci condiia poate fi
impus de exemplu: WHERE 0.7*Salary > 1000.
Exerciii:
- Modificai instruciunea de mai sus astfel nct n loc de Salariu net s apar o coloan denumit
Propunere marire salariu, care s conin un salariu brut majorat cu 20%, doar pentru toate cele 6
categorii de manageri. Verificare: tabela rezultat ar trebui s conin 12 linii.
- Afiai pentru toi angajaii salariul pe zi folosind un alias de coloan. Not: Putei utiliza funcia
ROUND(valoare, nr_zecimale);
Not: Limbajul SQL include mai multe funcii matematice, precum: valoare absolut ABS(n), restul
mpririi lui m la n MOD(m,n), rdcin ptrat SQRT(m), funcia putere POWER(m,n) etc.

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.

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