środa, 3 maja 2017

Lekcja 19. Podzapytania skorelowane.

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