sobota, 6 listopada 2010

Kurs Oracle SQL. Podzapytania

PODZAPYTANIA


Podzapytanie proste


Podzapytania są bardzo wygodną metodą osiągania pożądanego wyniku w języku SQL. Stosujemy je wtedy, gdy w zapytaniu chcemy się odwołać nie do jakiejś statycznej wartości ale do wyniku zwróconego z innego zapytania.
Podzapytania proste wykonują się w ten sposób, że najpierw jeden raz wykonuje się podzapytanie, a następnie zwrócone przez nie wartości są podstawiane do zapytania zewnętrznego i wykonywane jest zapytanie zewnętrzne.




W powyższym przykładzie najpierw wyświetliłem jaka jest najniższa płaca, a następnie korzystając z tego zapytania jako podzapytania wyświetliłem kto zarabia najmniej.




Inny przykład: Chcemy wybrać tylko tych pracowników z działu nr 50 którzy zarabiają więcej niż średnia w tym dziale – tych którzy zawyżają średnią płac ( off topic: np. średnia zarobków w Polsce :) ). W tym celu najpierw musimy obliczyć średnią płac tylko w tym dziale a następnie ten wynik porównać z zarobkami każdej osoby. Średnia zarobków wynosi 6461$ co wiemy dzięki temu zapytaniu:

 



Teraz to zapytanie musimy „zamontować” do naszego głównego zapytania jako element warunku:



W tym wypadku obliczenie średniej realizowane jest w pierwszej kolejności, a dopiero po nim wykonywane jest porównanie zarobków każdego pracownika osobno z tą średnią.


Podzapytania w klauzuli FROM

Każde zapytanie dostarcza zbioru danych uszeregowanych w postaci wierszy i kolumn. a więc w takiej postaci, w jakiej dane są przechowywane w tabelach. Można to wykorzystać wpisując podzapytanie w klauzuli FROM zapytania zewnętrznego.
W takim wypadku wynik zwrócony przez podzapytanie jest traktowany jak dynamicznie utworzona tabela, która posiada pewien określony zbiór kolumn i wierszy, do których można odwoływać się w zapytaniu zewnętrznym jak do kolumn i wierszy zwykłej, statycznej tabeli.




W tym zapytaniu najpierw zostanie wykonane zapytanie pobierające dane o nazwisku i zarobkach osób mających managera o id 100. Z tego zapytania zostali wyświetleni tylko ci któzy zarabiają więcej niż 10000.



Podzapytania w klauzuli SELECT

Podzapytania można też umieszczać w klauzuli SELECT pod warunkiem, że są to podzapytania zwracające dokładnie jeden wiersz i dokładnie jedną kolumną.




Tutaj wyświetliłem nazwisko i płacę pracownika oraz porównałem je z maksymalnymi zarobkami przy pomocy podzapytania w klauzuli select.


Any i All



Any i All służą do porównywania wartości ze zbiorem. Przykłady poniżej:


Wyświetlenie tych pracowników których wypłata jest większa od wypłaty przynajmniej jednej osoby z departamentu o numerze 100.

select last_name,salary from employees where salary > ANY (select salary from employees where department_id=100);


Wyświetlenie tych pracowników których wypłata jest większa od wypłaty wszystkich z departamentu o numerze 100.

select last_name,salary from employees where salary > ALL (select salary from employees where department_id=100);



Exists i not exists


Tych operatorów używamy gdy chcemy sprawdzić czy podzapytanie zwraca jakiekolwiek wiersze.

Poniżej przykład 2 zapytań. Pierwsze wyświetla tych pracowników którzy są managerami któregokolwiek z departamentów. Drugie wyświetla tych pracowników którzy nie są managerami żadnego departamentu.


select employee_id from employees e where exists (select manager_id from departments d where d.manager_id=e.employee_id);


select employee_id from employees e where not exists (select manager_id from departments d where d.manager_id=e.employee_id);






Ten temat omawiam na poniższych szkoleniach:
• Podstawy Oracle SQL
• Podstawy SQL i PL/SQL
Możesz w nich uczestniczyć, a jako czytelnik tego bloga otrzymasz 10% zniżki - poinformuj o tym fakcie konsultanta.

5 komentarzy:

  1. Coś nie tak. Przykład w części pt. "Podzapytanie proste" nie zawiera żadnego podzapytania, a końcowy opis ("W powyższym przykładzie najpierw wyświetliłem jaka jest najniższa płaca...") nie pasuje do przykładu ("select avg(salary) from employees").

    OdpowiedzUsuń
  2. Zgadza się to zapytanie zwraca średnią salary.

    OdpowiedzUsuń
  3. trochę screeny się pomieszały ;).

    OdpowiedzUsuń
  4. Przykłady dla ALL i ANY nie działają.

    OdpowiedzUsuń