Subinterogari
Subinterogari
Buna dimineata!
Cum se pot crea subinterogari si daca este posibil sa-mi dati si anumite exemple v-as fi recunoscator.
Multumesc anticipat!
Cum se pot crea subinterogari si daca este posibil sa-mi dati si anumite exemple v-as fi recunoscator.
Multumesc anticipat!
Re: Subinterogari
Prin subinterogari se intelege, de regula, includerea unei instructiuni SELECT in cadrul altei instructiuni SQL. De obicei, subinterogarile sunt incluse in clauza WHERE a unei instructiuni SQL, dar pot aparea si in clauza SELECT.
In grila QBE se poate introduce o subinterogare fie in campul CRITERIA, fie in campul FIELD.
Iata ce se poate realiza cu ajutorul subinterogarilor:
1. Sa verificam daca anumite valori se afla printre datele continute intr-o tabela sau returnate de o interogare. Sintaxa este, in mare, urmatoarea:
Sa presupunem ca dorim sa vedm profesorii (impreuna cu titlurile si catedrele lor) care au salariul mai mare de 2400 lei. Pentru aceasta, putem folosi ori prima dintre interogarile de mai jos (care contine o subinterogare), ori pe cea de-a doua (bazata pe un join).
sau
Acest tip de subinterogare nu poate returna decat o singura coloana, altfel, se va obtine o eroare.
Pentru a verifica daca anumite valori nu sunt intr-o lista se foloseste operatorul NOT.
2. Sa comparam o valoare cu datele returnate de o interogare. Sintaxa este:
Si in acest caz, subinterogarea nu trebuie sa returneze decat o singura coloana.
Sa presupunem ca dorim sa aflam numele, titlul si catedra profesorilor care au salariul mai mare decat al profesorului "Dr.Excel". Pentru aceasta, putem folosi urmatoarea interogare:
In cazul in care am dori sa facem comparatii cu mai multe valori returnate de o subinterogare, putem utiliza urmatoarele predicate:
- ANY sau SOME: comparatia este adevarata daca exista cel putin o valoare returnata de subinterogare pentru care ea sa fie adevarata;
- ALL: comparatia este adevarata daca ea este adevarata pentru orice valoare returnata de subinterogare.
Daca am dori sa aflam numele, titlul si catedra profesorilor care au salariul mai mare decat cel putin un alt profesor (deci care nu au salariul cel mai mic), am putea scrie:
Pe de alta parte, daca ne intereseaza numele, titlul si catedra profesorilor care au salariul mai mare decat orice alt profesor, am scrie:
3. Se pot stabili criterii in functie de existenta inregistrarilor returnate de o subinterogare. Pentru aceasta se va folosi predicatul EXISTS in cadrul sintaxei:
Subinterogarile prezentate mai sus au fost independente de interogarea "exterioara" (cea care le folosea). Putem crea insa si subinterogari "corelate" cu interogarea exterioara prin intermediul unei coloane de legatura (subinterogarile care folosesc predicatul EXISTS, de obicei sunt corelate).
Sa presupunem ca dorim sa aflam care sunt cursurile la care nu s-a inscris niciun student. Pentru aceasta, om folosi o subinterogare ce contine predicatul NOT EXISTS:
Subinterogarea de mai sus este corelata deoarece utilizeaza in clauza WHERE date din interogarea exterioara.
In grila QBE se poate introduce o subinterogare fie in campul CRITERIA, fie in campul FIELD.
Iata ce se poate realiza cu ajutorul subinterogarilor:
1. Sa verificam daca anumite valori se afla printre datele continute intr-o tabela sau returnate de o interogare. Sintaxa este, in mare, urmatoarea:
Cod: Selectaţi tot
expresie [NOT] IN (subinterogare)
Cod: Selectaţi tot
SELECT Nume, IdTitlu, Catedra
FROM Profesor
WHERE IdTitlu IN (SELECT IdTitlu FROM Titlu
WHERE Salariu >=2400);
Cod: Selectaţi tot
SELECT Nume, IdTitlu, Catedra
FROM Profesor INNER JOIN Titlu
ON Profesor.IdTitlu = Titlu.IdTitlu
WHERE Salariu >=2400;
Pentru a verifica daca anumite valori nu sunt intr-o lista se foloseste operatorul NOT.
2. Sa comparam o valoare cu datele returnate de o interogare. Sintaxa este:
Cod: Selectaţi tot
comparatie [{ANY|SOME|ALL}] (subinterogare)
Sa presupunem ca dorim sa aflam numele, titlul si catedra profesorilor care au salariul mai mare decat al profesorului "Dr.Excel". Pentru aceasta, putem folosi urmatoarea interogare:
Cod: Selectaţi tot
SELECT Nume, Titlu, Catedra
FROM Profesor INNER JOIN Titlu
ON Profesor.IdTitlu = Titlu.IdTitlu
WHERE Salariu > (SELECT Salariu
FROM Profesor INNER JOIN Titlu
ON Profesor.IdTitlu = Titlu.IdTitlu
WHERE Nume = "Dr.Excel");
- ANY sau SOME: comparatia este adevarata daca exista cel putin o valoare returnata de subinterogare pentru care ea sa fie adevarata;
- ALL: comparatia este adevarata daca ea este adevarata pentru orice valoare returnata de subinterogare.
Daca am dori sa aflam numele, titlul si catedra profesorilor care au salariul mai mare decat cel putin un alt profesor (deci care nu au salariul cel mai mic), am putea scrie:
Cod: Selectaţi tot
SELECT Nume, Titlu, Catedra
FROM Profesor INNER JOIN Titlu
ON Profesor.IdTitlu = Titlu.IdTitlu
WHERE Salariu > ANY (SELECT Salariu FROM Titlu);
Cod: Selectaţi tot
SELECT Nume, Titlu, Catedra
FROM Profesor INNER JOIN Titlu
ON Profesor.IdTitlu = Titlu.IdTitlu
WHERE Salariu >= ALL (SELECT Salariu FROM Titlu);
Cod: Selectaţi tot
[NOT] EXISTS (subinterogare)
Sa presupunem ca dorim sa aflam care sunt cursurile la care nu s-a inscris niciun student. Pentru aceasta, om folosi o subinterogare ce contine predicatul NOT EXISTS:
Cod: Selectaţi tot
SELECT IdCurs, Dnumire
FROM Curs
WHERE NOT EXISTS (SELECT * FROM Curs_Student
WHERE IdCurs=Curs.IdCurs);