Documente Academic
Documente Profesional
Documente Cultură
SELECT
Clauza SELECT are o sintaxă foarte complexă, dar, pe scurt, se poate folosi următoarea:
SQL pune la dispoziţie condiţii de joncţiune ce permit obţinerea de date din tabele diferite. Se pot folosi următoarele:
CROSS JOIN
Este echivalentul din standardul ANSI/ISO SQL: 1999 SQL pentru calcularea unui produs cartezian. Seturile de rezultate
reprezintă toate combinaţiile posibile de coloane din ambele tabele.
INNER JOIN
Permite folosirea de condiţii la joncţiune. Folosind clauza ON se permite folosirea clauzei WHERE pentru a restrânge
numărul de rânduri obţinute.
OUTER JOINS
În standardul ANSI-99 SQL, o joncţiune a două sau mai multe tabele care returnează doar rândurile corespondente se
numeşte joncţiune interioară. Dacă se returnează şi celelalte, se spune că avem o joncţiune exterioară. Se folosesc în sintaxă
termenii “left, full, şi right”, care fac referire la ordinea de apariţie a tabelelor în clauza FROM.
Interogarea va întoarce toate rândurile corespondente, cât şi toate notele, chiar dacă acestea nu aparţin nici unui student.
Extrage atât rândurile corespondente cât şi celelalte din ambele tabele, adică se vor returna toate rândurile din ambele tabele
chiar dacă acestea nu au corespondent.
UNION
Acet operator combină rezultatele obţinute în urma execuţiei a două interogări într-unul singur. Permite combinarea
rezultatelor a două interogări într-un singur set de rezultate, respectând condiţiile:
a. fiecare interogare trebuie să aibă acelaşi număr de coloane şi să le listeze în aceeaşi ordine;
b. coloanele returnate de fiecare instrucţiune SELECT trebuie să fie compatibile la atribuire sau trebuie să fie transformate
explicit într-un tip de date compatibil la atribuire cu coloanele lor corespondente din celelalte instrucţiuni SELECT
c. combinarea coloanelor compatibile la atribuire, dar de tipuri diferite, produce o coloană de tipul cu cea mai mare
precedenţă dintre cele două (de exemplu, combinarea unei coloane de tip smallint cu o coloană de tip float produce o
coloană rezultat de tip float;
d. numele coloanelor returnate de UNION sunt derivate din cele din prima instrucţiune SELECT
e. UNION ALL este mai rapidă decât UNION deoarece ea nu elimină duplicatele înainte de returnate.
Operaţii semantice
FROM: permite afişarea produsului cartesian al listei_de_tabele
WHERE: aplică σpredicat
GROUP BY: grupează tuplurile corespunzător cu lista_de_grupare_pe_coloane
HAVING: aplică σpredicat grupurilor
SELECT: aplică πlista_de_iesire_a_coloanelor (păstrează duplicatele)
DISTINCT: elimină duplicatele
ORDER BY: ordonează rezultatul pe baza listei_de_ordonare_pe_coloane
Predicate
Un predicat este o expresie care returnează TRUE sau NOT TRUE. Ele se întâlnesc în clauzele WHERE sau HAVING ale
unei interogări.
Obs. S-a folosit NOT TRUE şi nu FALSE datorită problemelor de logică trivalentă – uneori nu se cunoaşte dacă o expresie
este falsă, tot ceea ce se ştie este că, cu siguranţă, nu este adevărată
Cele mai folosite predicate sunt:
BETWEEN – indică dacă o valoare dată se găseşte în intervalul închis definit de alte două valori
LIKE – testează dacă o valoare se află sau nu într-un şir model. Se pot folosi caracterele de înlocuire: “%” – procent
(corespunde oricărui număr de caractere) şi “ _” – underscore (corespunde unui singur caracter).
EXISTS – funcţie predicat care acceptă ca unic parametru o subinterogare. Dacă interogarea returnează un set de rezultate,
EXISTS întoarce valoarea TRUE, altfel întoarce valoarea FALSE
IN – oferă o metodă prescurtată de comparare a unei valori scalare cu fiecare element dintr-o listă.
ANY, ALL – lucrează exclusiv cu subinterogări. ANY, operează similar predicatului IN
GROUP BY
Această clauză se foloseşte pentru a grupa rândurile dintr-un tabel în seturi mai mici, pe baza unei condiţii de grupare.
HAVING
Să presupunem că se doreşte găsirea celei mai mari note acordate fiecărui student, dar numai a acelora care au mai mult de o
notă. Ce este greşit în această soluţie?
BAZE DE DATE Laborator 5
SELECT cods, MAX(nota)
FROM note
WHERE COUNT(*) > 1
GROUP BY cods;
Se poate folosi clauza HAVING la fel ca în cazul clauzei WHERE pentru a restrânge numărul de rânduri returnate de
interogare. Într-o interogare care foloseşte clauzele GROUP BY şi HAVING, rândurile sunt mai întâi grupate, după care se
afişează doar rândurile ce îndeplinesc condiţia din clauza HAVING. Clauza HAVING este folosită pentru a restrânge
numărul de grupuri returnate de clauza GROUP BY.
MIN: folosită pe coloane ce păstrează orice fel de tipuri de date returnând valoarea minimă.
MAX: folosită pe coloane ce păstrează orice fel de tipuri de date returnând valoarea maximă.
SUM: folosită pe coloane ce păstrează valori numerice pentru a calcula suma valorilor din coloana respectivă.
AVG: folosită pe coloane ce păstrează valori numerice pentru a calcula media aritmetică a valorilor din coloana respectivă.
COUNT: întoarce numărul de rânduri.
VARIANCE: folosită pe coloane ce păstrează valori numerice pentru a calcula împrăştierea rezultatelor. De exemplu, dacă
media aritmetică a notelor dintr-o grupă la ultimul test este 82%, iar studenţii au înregistrat un scor între 40% şi 100%,
rezultatul obţinut folosind această funcţie este mai mare decât dacă scorul studenţilor ar fi fost cuprins între 78% şi 88%.
STDDEV: asemănător cu funcţia anterioară. Pentru două seturi de date care au aproximativ aceeaşi medie, cu cât
împrăştierea este mai mare cu atât deviaţia standard este mai mare.
Sintaxa:
Subinterogări
O clauză SELECT care este inserată în cadrul altei clauze SELECT este numită subinterogare. Subinterogarea se execută cu
scopul de a obţine informaţii necunoscute. Clauza exterioară foloseşte informaţiile obţinute prin subinterogare pentru a afla
ceea ce i se cere.
Subinterogarea se execută o singură dată, anterior, în memoria principală a sistemului.
Subinterogările se pot introduce în clauzele: WHERE, HAVING şi FROM.
Sintaxa:
SELECT lista_de_selectie
FROM tabel
WHERE expresie operator(SELECT lista_de_selectie
FROM tabel);
Obs. Construcţiile SELECT pot fi imbricate pe max. 16 nivele. O subinterogare diferă de operatorul de cuplare prin aceea
că rezultatul final conţine date doar de la ultimul tabel.
Varianta 1
Predicatele [ANY | SOME | ALL]
Această variantă este folosită atunci când se compară o valoare cu o altă valoare obţinută în urma folosirii unei
subinterogări. De exemplu, următoarea construcţie întoarce toţi studenţii (şi notele corespunzătoare acestora) care au cele
mai mari note.
în care răspunsul corespunde întrebării: "Care este cea mai mare notă obţinută de fiecare student?"
Se observă faptul că, deoarece subinterogarea întoarce o singură valoare, nu este nevoie să se folosească nici unul dintre
predicatele ANY, SOME sau ALL. Următoarea construcţie prezintă toţi studenţii (şi notele corespunzătoare acestora) care
au note mai mari decât notele studentului Radu Tiberiu:
Se observă faptul că predicatele ANY şi SOME conduc la obţinerea aceluiaşi rezultat, returnând toate variantele ce respectă
condiţia de comparare pentru cel puţin una dintre valorile returnate de către subinterogare. De exemplu, dacă se înlocuieşte
ALL cu SOME în interogarea anterioară, rezultatul obţinut va conţine toţi studenţii (şi notele corespunzătoare acestora) care
sunt mai mari decât cea mai mică notă acordată studentului Radu Tiberiu.
Varianta 2
Predicatul [NOT] IN
Această variantă se foloseşte la căutarea unei valori a unei coloane dintr-un tabel rezultat în urma alteri interogări. De
exemplu, următoarea construcţie returnează toţi studenţii (şi notele corespunzătoare) din tabelul "Student" care nu apar în
tabelul "Note" (studenţii care nu au note):
Varianta 3
Predicatul [NOT] EXISTS
Această variantă se foloseşte atunci când se verifică dacă o anumită valoare există (este returnată) în urma executării
subinterogării. De exemplu, următoarea construcţie afişează toţi studenţii care nu au note:
Se observă faptul că tabelul "Note" este referit în subinterogare, ceea ce face ca SQL Server să evalueze subinterogarea câte
o dată pentru fiecare valoare a identificatorului "CodS" din tabelul "Note".
Observaţii de ansamblu
Atunci când se folosesc sintaxele 1 sau 2 subinterogarea trebuie să întoarcă o singură coloană. Altfel va apare un mesaj de
eroare.
Clauza SELECT interioară are acelaşi format şi reguli ca şi orice altă clauză SELECT, dar trebuie inclusă între paranteze
rotunde.
Exerciţii
5. Afişaţi numele şi prenumele studenţilor care au plătit taxe de peste 20 de lei, dar mai mici de
30 lei.
16. Afişaţi numele şi prenumele studenţilor, precum şi cursurile promovate cu note mai mari de
8.
18. Câte note are fiecare student? Furnizaţi numele şi prenumele lor.
20. Afişaţi numele şi prenumele studenţilor care au primit note mai mari decât cea mai mică notă
acordată.