Kurs Oracle SQL online. Podzapytania – pierwsze starcie

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.

About Rafal Stryjek

My LinkedIn profile. Passionate about data. Data Warehousing Expert. Snowflake Data SuperHero & Oracle ACE Associate. International conferences Speaker: Snowflake Build Summit-BUILD.local 2021, Oracle Open World, DOAG, UKOUG, APEX World,.. Visit dataconsulting.pl website!
This entry was posted in Oracle, Oracle SQL, Oracle SQL Zaawansowany, SQL and tagged , , , , . Bookmark the permalink.

Leave a Reply