Podzapytania - Instytut Informatyki

advertisement
Rozdział 6: Podzapytania
(c) 1999, Instytut Informatyki Politechniki Poznańskiej
Podzapytania
• podzapytanie jest poleceniem SELECT zagnieżdżonym w
innym poleceniu SELECT
• ogólny format zagnieżdżania zapytań:
SELECT atrybut1, atrybut2, ...
FROM relacja
WHERE atrybut operator (SELECT atrybut
FROM relacja
WHERE warunek);
• operator
 =, !=, <>, >, >=, <, <=
 IN
 ANY, ALL
(c) 1999, Instytut Informatyki Politechniki Poznańskiej
Reguły zagnieżdżania podzapytań
• podzapytanie ograniczamy nawiasami i zagnieżdżamy po
prawej stronie warunku zapytania zewnętrznego;
• w podzapytaniu nie używamy klauzuli ORDER BY;
• klauzula ORDER BY może wystąpić wyłącznie jako ostatnia
klauzula najbardziej zewnętrznego zapytania;
• liczba oraz typy atrybutów występujących w klauzuli
SELECT podzapytania musi być zgodna z liczbą i typem
atrybutów użytych w warunku zapytania zewnętrznego, tj.
zapytania wyższego poziomu zagnieżdżenia;
• w podzapytaniu można używać operatorów zbiorowych;
• podzapytania są zawsze wykonywane w kolejności od
najgłębiej zagnieżdżonego do najbardziej zewnętrznego.
(c) 1999, Instytut Informatyki Politechniki Poznańskiej
Podzapytania wyznaczające jedną krotkę
• wyznacz pracownika zarabiającego najmniej
SELECT nazwisko, etat, placa_pod
FROM pracownicy
WHERE placa_pod = (SELECT MIN(placa_pod)
FROM pracownicy);
• wyznacz pracownika zarabiającego najmniej w swoim
zespole
SELECT nazwisko, etat, placa_pod
FROM pracownicy
WHERE (placa_pod, id_zesp) IN
(SELECT MIN(placa_pod), id_zesp
FROM pracownicy
GROUP BY id_zesp);
(c) 1999, Instytut Informatyki Politechniki Poznańskiej
Podzapytania wyznaczające wiele krotek cd.
• operator ANY
SELECT nazwisko, placa_pod, etat, id_zesp FROM pracownicy
WHERE placa_pod > ANY (SELECT DISTINCT placa_pod
FROM pracownicy
WHERE id_zesp = 30);
• operator ALL
SELECT nazwisko, placa_pod, etat, id_zesp FROM pracownicy
WHERE placa_pod > ALL (SELECT DISTINCT placa_pod
FROM pracownicy
WHERE id_zesp = 30);
(c) 1999, Instytut Informatyki Politechniki Poznańskiej
Podzapytania w klauzuli HAVING
• wyświetl te zespoły, w których średnia płaca podstawowa
jest większa niż średnia płaca w zespole trzydziestym
SELECT id_zesp, AVG (placa_pod) FROM pracownicy
HAVING AVG (placa_pod) > (SELECT AVG (placa_pod)
FROM pracownicy
WHERE id_zesp = 30)
GROUP BY id_zesp;
(c) 1999, Instytut Informatyki Politechniki Poznańskiej
Wielopoziomowe zagnieżdżanie zapytań
• wyświetlić nazwiska i płace pracowników, zarabiających
więcej niż wynosi maksymalna płaca w zespole o nazwie
ALGORYTMY
SELECT nazwisko, placa_pod
FROM pracownicy
WHERE placa_pod >
(SELECT MAX (placa_pod)
FROM pracownicy
WHERE id_zesp =
(SELECT id_zesp
FROM zespoly
WHERE nazwa ='ALGORYTMY'));
(c) 1999, Instytut Informatyki Politechniki Poznańskiej
Podzapytania skorelowane
• cechy
– wykonywane dla każdej krotki przeglądanej przez
zapytanie zewnętrzne
– operują na wartościach atrybutów przekazanych przez
zapytanie zewnętrzne
• przykład:
– wyszukaj pracowników zarabiających więcej niż wynosi
średnia pensja w ich zespole
(c) 1999, Instytut Informatyki Politechniki Poznańskiej
Podzapytania skorelowane cd.
P
Pracownicy
nazwisko placa_pod id_zesp
nazwisko placa_pod id_zesp
LECH
CZECH
RUS
PIAST
300
400
400
500
1
1
2
2
LECH
CZECH
RUS
PIAST
300
400
400
500
SELECT nazwisko, placa_pod, id_zesp
FROM pracownicy p
WHERE placa_pod >
(SELECT AVG(placa_pod) FROM pracownicy
WHERE id_zesp = p.id_zesp);
(c) 1999, Instytut Informatyki Politechniki Poznańskiej
1
1
2
2
Podzapytania skorelowane cd.
• operator EXISTS
– umożliwia sprawdzenie czy podzapytanie wyznacza
jakąkolwiek wartość
• operator NOT EXISTS
• przykład: wyszukaj pracowników, którym służbowo
podlegają inni pracownicy
select id_prac, nazwisko, etat, id_zesp
from pracownicy p
where exists (select id_prac
from pracownicy
where id_szefa = p.id_prac);
(c) 1999, Instytut Informatyki Politechniki Poznańskiej
Download