|
Subinterogari
Subinterogarea este o comanda SELECT care apare intr-o clauza a altei comenzi select. La randul sau subinterogarea pote contine alte subinterogari. Fiecare subinterogare trebuie sa fie inchisa intre paranteze rotunde.
Subinterogarile pot fi plasate in clauzele WHERE, HAVING, FROM sau SELECT;
Subinterogarile pot fi : a) incuibarite (fara sincronizare);
b) corelate ( cu sincronizare);
Subinterogarea fara sincronizare este caracterizata de faptul ca intoarce un rezultat care este transmis subinterogarii de nivel superior. Valoarea returnata de o subinterogare incuibarita(fara sincronizare) nu depinde in niciun fel de valorile produse de instructiunile SELECT exterioare ei.
Exemplu :
Sa se obțina lista celor mai scumpe carți :
Select titlu from tCarti
where pret = (select max(pret) from tCarti)
Sa se obțina lista carților care au prețul mai mare decat prețul mediu al carților:
Select titlu , pret from tCarti
where pret > (select AVG(pret) from tCarti).
Sa se obțina colegii de facultate ai studentei Popa Andreea :
Select nume, prenume from tStudenti
where CodFacultate = (Select CodFacultate from tStudenti
where nume='Popa' and prenume = 'Andreea')
Subinterogarea corelata (cu sincronizare ) este caracterizata de faptul ca face referire la una sau mai multe coloane ale interogarii exterioare. Eavaluarea subinterogarii corelate se face pentru fiecare rand rezultat al interoigarii exterioare care o conține.
Exemple :
Sa se obțina lista carților al caror preț depașește media prețurilor carților ce aparțin aceluiași domeniu :
Select * from tCarti as A
where pret > (select avg(pret) from tCarti
where CodDomeniu = A.CodDomeniu)
Sa se determine nota maxima obtinuta la examene de catre fiecare student
select codStd, numeStd,
(select max(nota) from tNote where codStd=A.codStd) as NotaMaxima
from tStudenti as A
Rezultatul furnizat de o subinterogare poate fi prelucrat in interogarea de nivel superior prin utilizarea oricarui operator de comparare =, >, <, >=, <=, <>, !=, !<,!> sau, daca subinterogarea intoarce mai multe rezultate putem folosi opreatorii logici ALL, ANY, IN, EXISTS.
Operatorul ALL - condiția este adevarata daca este verificata pentru toate elementele listei returnate.
Sa se afiseze produsele al caror preț este diferit de prețurile produselor alimentare :
Select * from tProduse
where pret <> All(select pret from tProduse
Where Categoria ='Alimentare')
Operatorul ANY - condiția este adevarata daca este verificata pentru cel puțin una din valorile returnate de subinterogare.
>Any este echivalenta cu mai mare decat minimul din lista
<Any este echivalenta cu mai mic decat maximul din lista
Select * from tProduse
where pret > ANY(select pret from tProduse
where Categoria ='Alimentare')
Operatorul IN -
expresie in (set de valori)
returneaza adevarat daca expresie se gasește in setul de valori specificat intre paranteze.
Sa se obțina numele cititorilor care au imprumutat carți scrise de Eminescu:
Select nume, prenume
from tCititori as A inner join tImprumuturi as B
on A.CodCititor = B.CodCititor
where codCarte in (Select codCarte from tCarti
where autor like %Eminescu%')
Operatorul IN poate fi inlocuit cu =ANY.
EXISTS - presupune ca predicatul este adevarat daca subinterogarea intoarce cel puțin un rezultat.
Sa se obțina lista cititorilor care au carți nerestituite și acest termen este depașit:
Select * from tCititori as A
where EXISTS (select * from tImprumuturi
where CodCititor = A.CodCititor and
dataRestituire < GetDate()
Operatorii in si exists pot fi folosiți și in varianta negata not in și not exists
Sa se afișeze studenții care nu s-au prezentat la examen la disciplina cu codul c1'
Select codStd, nume, prenume from tStudenti
where codStd not in (select codStd from tRezEx where codCurs='c1')
Valori NULL
NULL indica o valoare necunoscuta. O valoare null este diferita de șirul vid sau 0.
Doua valori null nu sunt egale intre ele. Comparația dintre doua valori NULL sau dintre dintre NULL și o alta valoare returneaza o valoare necunoscuta (UNKNOWN).
Operatorii is null și is not null se folosesc pentru a testa in clauza where daca o valoare este sau nu null.
Select count(*) from tStudenti where telefon is null
Functia ISNULL
Functia ISNULL inlocuiește o valoare null cu o valoare de inlocuire specificata.
Sintaxa
ISNULL (expresie, valaore_de_inlocuire)
Exemplu fie tabelul tTest ce conține coloana Coloana1 cu valorile
Coloana1
5
7
NULL
3
NULL
atunci
Select AVG (Coloana1 ) from tTest
furnizeaza rezultatul 5(valorile null sunt ignorate), iar
Select AVG (ISNULL (Coloana1, 0) ) from tTest
furnizeaza rezultatul 3 (valorile null sunt inlocuite cu 0).
Funcția NULLIF
Sintaxa
NULLIF( expresie1, expresie2)
returneaza expresie1 daca expresie1<>expresie2 și NULL daca expresie1 = expresie2
Funcția CASE
Funcția CASE evalueaza o lista de expresii și returneaza una din mai multe expresii rezultat posibile.
V1. Sintaxa :
CASE expresie_intrare
WHEN expresie1 THEN rezultat1
WHEN expresie2 THEN rezultat2
.
WHEN expresien THEN rezultatn
ELSE rezultat]
END
Expresie_intrare se compara cu expresie1, expresie2, .. expresien. Daca expresie_intrare este egala cu expresiek atunci se returneaza rezultatk.
Daca expresie_intrare este diferita de expresie1, expresie2, .. expresien se returneaza rezultat. Clauza else este opționala, in acest caz funcția case returneaza valoarea null daca expresia de intrare este diferita de expresie 1,2,.n.
V2.Sintaxa :
CASE
WHEN expresieLogica1 THEN rezultat1
WHEN expresieLogica2 THEN rezultat2
.
WHEN expresieLogica n THEN rezultatn
END
Funcția CASE returneaza rezultatk daca expresieLogicak este prima dintre expresiile adevarate.
SELECT
Sum (CASE UM WHEN 'Kg' THEN CANTITATE ELSE 0 END) AS [TOTAL Kg ] ),
Sum (CASE WHEN UM='L' THEN CANTITATE END) AS [TOTAL LITRI ]
FROM tDetaliiBon as A inner join tProduse as B On A.CodProd = B.CodProdus
SELECT
Sum (CASE WHEN um= 'Kg' THEN CANTITATE ELSE 0 END) AS [TOTAL Kg ] ),
Sum (CASE WHEN UM='L' THEN CANTITATE END) AS [TOTAL LITRI ]
FROM tDetaliiBon as A inner join tProduse as B On A.CodProd = B.CodProdus