Podzapytanie skorelowane
Podzapytanie skorelowane odwołuje się do jednej lub
kilku kolumn z zewnętrznej instrukcji SQL. Takie zapytanie nazywamy
skorelowanym, ponieważ są związane z zewnętrzną instrukcją SQL za pośrednictwem
tych samych kolumn. Podzapytania skorelowane są zwykle używane, gdy chcemy
uzyskać odpowiedź na pytanie dotyczące wartości w każdym wierszu znajdującym
się w zewnętrznym zapytaniu. Na przykład możemy chcieć sprawdzić, czy występuje
relacja między danymi, ale nie interesuje nas, ile wierszy zostało zwróconych
przez podzapytanie. To znaczy, że chcemy jedynie sprawdzić, czy zostały
zwrócone jakiekolwiek wiersze. Podzapytanie skorelowane jest wykonywane raz dla
każdego wiersza w zapytaniu zewnętrznym, co odróżnia je od podzapytania
nieskorelowanego, które jest uruchamiane jeden raz, przed uruchomieniem
zapytania zewnętrznego.
Przykład
podzapytania skorelowanego
Poniższe podzapytanie skorelowane pobiera pracowników,
których wynagrodzenie jest wyższe niż średnie w grupie o danym kodzie:
Zewnętrzne zapytanie zostało oznaczone aliasem emp1,
natomiast podzapytanie zostało oznaczone aliasem emp2. Odwołanie do kolumny emp_no w części zewnętrznej i
wewnętrznej sprawia, że wewnętrzne podzapytanie jest skorelowane z zapytaniem
zewnętrznym. Poza tym podzapytanie zwraca jeden wiersz zawierający średnie
wynagrodzenie pracowników o danym kodzie. W podzapytaniu skorelowanym każdy
wiersz z zapytania zewnętrznego jest przesyłany po kolei do podzapytania.
Podzapytanie odczytuje i przetwarza każdy wiersz z zapytania zewnętrznego.
Następnie zwracane są wyniki całego zapytania. W powyższym przykładzie
zewnętrzne zapytanie pobiera wszystkie wiersze z tabeli empolyee i przesyła je do zapytania wewnętrznego. Każdy wiersz jest
odczytywany przez zapytanie wewnętrzne. Oblicza ono średnie wynagrodzenie
pracownika, dla którego job_code w
zapytaniu wewnętrznym jest równy job_code
w zapytaniu zewnętrznym.
Użycie operatorów
EXISTS i NOT EXISTS z podzapytaniem skorelowanym
Operator EXISTS
służy do sprawdzenia, czy podzapytanie zwróciło jakiekolwiek wiersze. Choć
można korzystać z tego operatora z podzapytaniem nieskorelowanymi, zwykle
używamy go jednak z podzapytaniami skorelowanymi. Operator NOT EXISTS stanowi logiczne zaprzeczenie EXISTS: sprawdza, czy podzapytanie nie zwróciło żadnych wierszy.
Użycie operatora
EXISTS z podzapytaniem skorelowanym
W poniższym przykładzie użyto operatora EXISTS do pobrania nazw działów będących
nadrzędnymi innych działów. Należy zauważyć, że nie interesuje nas liczba
zwróconych wierszy przez zapytanie. Chcemy się jedynie dowiedzieć, czy w ogóle
zostały zwrócone jakieś wiersze:
Ponieważ operator EXISTS
jedynie sprawdza, czy podzapytanie zwróciło jakieś wiersze, nie musi ono
zwracać kolumny – może po prostu zwracać literał. Ta właściwość może poprawić
jego wydajność. Zmieniono powyższe zapytanie tak, aby podzapytanie zwracało
literał 1:
Jeżeli podzapytanie zwraca choć jeden wiersz, EXISTS zwraca wartość prawda. Jeżeli
podzapytanie nie zwraca żadnych wierszy, EXISTS
zwraca fałsz. W powyższych przykładach nie interesowała nas liczba wierszy
zwracanych przez podzapytanie. Chcieliśmy się jedynie dowiedzieć, czy w ogóle
zostały zwrócone jakieś wiersze, więc użyliśmy operatora EXISTS zwracającego wartość prawda lub fałsz. Ponieważ zapytanie
zewnętrzne wymaga przynajmniej jednej kolumny, w powyższym przykładzie
podzapytanie zwraca literał 1.
Użycie operatora NOT
EXISTS z podzapytaniem skorelowanym
W poniższym przykładzie użyto operatora NOT EXISTS do pobrania nazw działów nie będących
nadrzędnymi innych działów:
Brak komentarzy:
Prześlij komentarz