środa, 5 kwietnia 2017

Lekcja 17. Podzapytania jednowierszowe.

Podzapytania jednowierszowe zwracają do zewnętrznej instrukcji SQL zero lub jeden wiersz. Podzapytanie możemy umieścić w klauzuli WHERE, klauzuli HAVING lub klauzuli FROM instrukcji SELECT.

Podzapytanie w klauzuli WHERE
Podzapytanie można umieścić w klauzuli WHERE innego zapytania. Klauzula WHERE poniższego zapytania zawiera podzapytanie. Należy zauważyć, że zostało ono umieszczone w nawiasach okrągłych. Ten przykład pobiera wartości pól first_name i last_name z wiersza tabeli employee, w którym ­last­_name ma wartość Forest


Podzapytanie w klauzuli WHERE ma postać :


To zapytanie jest uruchamiane jako pierwsze (i tylko jeden raz) i zwraca emp_no dla wiersza, w którym last­­­_name na wartość Forest. Wartość emp­­_no w tym wierszu wynosi 9 i jest ona przysłana do klauzuli WHERE zewnętrznego zapytania, dlatego też zwraca ono ten sam wynik co poniższe:



Użycie innych operatorów jednowierszowych
W klauzuli WHERE podzapytania przestawionego na początku był wykorzystywany operator równości (=). W podzapytaniach jednowierszowych można również używać innych operatorów porównania, takich jak <>, <, >, <= i >= .
W poniższym przykładzie w klauzuli WHERE zewnętrznego zapytania użyto operatora > . W podzapytaniu zastosowano funkcję AVG() do obliczania średniego wynagrodzenia pracowników, która jest przesłana do klauzuli WHERE zewnętrznego zapytania. Całe zapytanie zwraca emp­­_no, first­_name, last_name i salary pracowników, których wynagrodzenie jest większe od średniego wynagrodzenia wszystkich pracowników:

 

Poniższy przykład przestawia uruchomienie samego podzapytania:

 

Wartość 385796,85 zwrócona przez podzapytanie jest wykorzystywana w klauzuli WHERE zewnętrznego zapytania, w związku z czym jest ono tożsame z poniższym:


Podzapytanie w klauzuli HAVING
W klauzuli HAVING zewnętrznego zapytania możemy umieścić podzapytanie. To pozwala na filtrować wyniki grupy wierszy na podstawie wyników zwracanych przez podzapytanie.
W poniższym przykładzie użyto podzapytania w klauzuli HAVING zewnętrznego zapytania. Przykład pobiera kod (job_code) oraz średnie wynagrodzenie pracowników o danym kodzie, jeżeli jest ono większe niż średnie wynagrodzenie wszystkich pracowników:

 

Zauważmy, że podzapytanie oblicza najpierw średnie wynagrodzenie wszystkich pracowników za pomocą funkcji AVG(). Przeanalizujmy przykład, aby zrozumieć działanie tego zapytania. Oto wynik uruchomienia podzapytania: 

 

Wartość 385796,85 jest wykorzystywana w klauzuli HAVING zewnętrznego zapytania do odfiltrowania tylko wierszy grup, w których średnia wynagrodzeń jest większa od 385796,85. Poniższe zapytanie przestawia wersję zewnętrznego zapytania, która pobiera kod oraz średnie wynagrodzenie pracowników pogrupowanych według job_code:

 

Średnie wynagrodzenie większe niż niż 385796,85 występują w grupach z job_code równym Eng i SRep . Zgodnie z oczekiwaniami te same grupy zostały zwrócone przez zapytanie przestawione na początku.

Podzapytanie w klauzuli FROM
Podzapytanie można umieścić w klauzuli FROM zewnętrznego zapytania. Tego typu podzapytania nazywamy widokami wbudowanymi. Poniższy, prosty przykład pobiera pracowników, dla których emp_no jest mniejsze od 10:

 

Podzapytanie zwraca do zapytania zewnętrznego wiersze z tabeli employee, w których emp_no ma wartość mniejszą od 10. Zapytanie zewnętrzne pobiera i wyświetla te wartości emp_no. Z perspektywy klauzuli FROM zewnętrznego zapytania wyniki podzapytania są po prostu kolejnym źródłem danych. 

Brak komentarzy:

Prześlij komentarz