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.
świetny kurs!
OdpowiedzUsuń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ńZgadza się to zapytanie zwraca średnią salary.
OdpowiedzUsuńtrochę screeny się pomieszały ;).
OdpowiedzUsuńPrzykłady dla ALL i ANY nie działają.
OdpowiedzUsuń