Po ciut dłuższej (no dobrze – długiej 🙂 ) przerwie zapraszam do kolejnej lekcji naszego Kursu Oracle SQL. Przyszła pora na podzapytania – dzisiaj skupimy się na podzapytaniach prostych (nie tylko z nazwy).
Zatem czym są podzapytania? Jest to zagnieżdżanie zapytań w innych zapytaniach. Rodzi się pewnie pytanie – “ale po co”? Robi się to po to, żeby:
- wynik jednego zapytania służył do filtrowania rekordów w drugim zapytaniu (klauzula WHERE lub HAVING)
- obchodzić ograniczenia języka SQL jak np. brak możliwości stosowanie funkcji agregujących w klauzuli WHERE
- pisać zapytania do wyników działania innych zapytań. W takim wypadku wynik działania jednego zapytania staje się źródłem danych dla drugiego.
Przykład 1. Wybierz pracownika(pracowników), który zarabia najwięcej.
select * from employees where salary = (select max(salary) from employees);
Podzapytanie “stoi” w nawiasie. Koncepcyjnie – wynik działania podzapytania jest wyliczany i wstawiany do zapytania zewnętrznego. Baza wyliczy maksymalną kwotę pensji. Po jej ustaleniu wynik zostanie wstawiony do zapytania zewnętrznego, po czym zostanie uruchomione zapytanie zewnętrzne – czyli np.:
select * from employees where salary = 24000;
I to jest ta magia podzapytań 🙂
Jeśli podzapytanie ma (lub może) zwracać więcej niż jeden wiersz zamiast operatorów = i != stosujemy odpowiednio IN oraz NOT IN. Operatory porównań != i = nie poradzą sobie z więcej niż jedną wartością. Nie możemy powiedzieć, że pensja = 1000,2000,3000. Co to miałoby znaczyć? 🙂
IN: Możemy powiedzieć natomiast, że jest równa 1000 lub 2000 lub 3000, czyli – pensja IN (1000,2000,3000). Można to przeczytać – pensja zawiera się na liście (1000, 2000, 3000), zatem jest równa co najmniej jednej wartości z listy.
NOT IN: pensja NOT IN (1000, 2000, 30000) – czyli pensja nie zawiera się na liście tych wartości, jest różna od wszystkich wartości w nawiasie.
Przykład 2. Wybierz departamenty z przypisanymi pracownikami
select * from departments where department_id in (select department_id from employees);
I to jest ta magia podzapytań 🙂
Każdy pracownik może być przypisany do jednego departamentu – ID tego departamentu, do którego jest przypisany znajduje się w kolumnie DEPARTMENT_ID w tabeli EMPLOYEES. Podzapytanie zwraca listę ID departamentów z tabeli EMPLOYEES. Zapytanie zewnętrzne sprawdza czy ID departamentu znajduje się w zwróconej przez podzapytanie liście departamentów z pracowników. Jeśli tak- departament ma przypisanych pracowników.
Co w kolejnej lekcji? Gdzie jeszcze można stosować podzapytania, klauzula WITH.