Bazy Danych

Opis zajęć i zasad

Zajęcia 6

Podzapytania *

Podzapytania

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

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 19.11.2016 do godziny 24.00.

Wykonać zadania 1-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