Kiedy mamy do czynienia ze skomplikowanym zapytaniem to dzielimy je na podproblemy, rozwiązujemy podproblemy, a następnie używając ich rozwiązań konstruujemy rozwiązanie całego problemu.
Mechanizm, który pozwala nam to zrezalizować w praktyce to podzapytanie. Podzapytanie to Ujęte w nawiasy zapytanie, umieszczone wewnątrz innego zapytania (tzw. zapytania zewnętrznego). Podzapytania najczęściej umieszcza się w warunkach w klauzulach WHERE i HAVING zapytania zewnętrznego, niektóre SZBD dopuszczają również stosowanie podzapytań w klauzulach SELECT i FROM.
Np. Wypisz wszystkich pracowników oddziału o najmniejszym numerze:
select * from pracownicy
where ID_Oddz = (select MIN(ID) from Oddzialy);
Zauważmy, że w podzapytaniu nie skorzystaliśmy z nazw kolumn wprowadzonych w głównym zapytaniu. Takie podzapytanie nazywamy zwykłym - zbiór wynikowych wierszy podzapytania nie zmienia się i nie zależy od wierszy w głównym zapytaniu. Podzapytanie nazywamy skorelowanym jeśli zbiór wyników podzapytania zależy od wartości występujących w wierszach w głównym zapytaniu.
Np. Wyświetl wszystkich pracowników, których płaca podstawowa jest wyższa od średniej płacy podstawowej.
select * from pracownicy as a
where a.Placa_pod > (select AVG(Placa_pod) from Pracownicy);
Do wykonania niektórych zapytań potrzebne są podzapytania i nie da się ich w innym przypadku wykonać, np Podaj listę pracowników pracujących w oddziałach zatrudniających czterech pracowników.
select * from Pracownicy as a
where (select Count(*) from pracownicy where ID_Oddz=a.ID_Oddz) = 4
Podzapytanie w klauzuli SELECT wyswietlajace dla każdego pracownika ile osób pracuje w nim w dziale.
select Nazwisko, ID_Oddz , (select Count(*) from pracownicy where a.ID_Oddz=ID_Oddz) as Ilu from Pracownicy a
Operatory EXISTS i NOT EXISTS - sprawdzają czy podzapytanie daje pusty zbiór wyników czy nie, np. Wyświetlenie listy oddziałów nie mających żadnych pracowników:
select * from Oddzialy as a
where NOT EXISTS (SELECT * FROM pracownicy where ID_Oddz = a.id)
Zadanie Domowe
Termin wykonania zadania: Sobota 26.11.2016 do godziny 24.00.
Wykonać zadania 1,3,5,7,9,11,13,15 z tematu 7. Podzapytania
Rozwiązania proszę przesłać przez stronę:
Logujemy się jak na komputery Wydziałowe, przesyłamy plik (jeden wspólny dla wszystkich) z rozwiązaniami.
UWAGA! Rozwiązania można przesłać tylko raz.
Wykorzystano materiały z
http://edu.pjwstk.edu.pl/wyklady/rbd/scb/wyklad9/sqlb.htm
http://wazniak.mimuw.edu.pl/images/8/8a/BD-1st-2.4-lab5.tresc-1.1-kolor.pdf