Podzapytanie z instrukcją IN służy do sprawdzenia, czy wartość należy do określonego zbioru wartości.
Podzapytanie to zapytanie zagnieżdżone w innym zapytaniu. W podzapytaniu pojawia się kolejny raz instrukcja SELECT
Do omówienia podzapytań skorzystamy z bezpłatnej bazy Oracle HR dostępnej tutaj:
http://www.oracle.com/technetwork/database/express-edition/downloads/index.html
Chcemy dowiedzieć się, w których grupach zatrudnienia suma wynagrodzeń jest równa 42 000.
SELECT
JOBS.JOB_ID,
JOBS.JOB_TITLE,
EMPLOYEES.SALARY
FROM EMPLOYEES,JOBS
WHERE JOBS.JOB_ID = EMPLOYEES.JOB_ID
AND EMPLOYEES.SALARY IN
(SELECT EMPLOYEES.SALARY
FROM EMPLOYEES
WHERE EMPLOYEES.SALARY = 4200);
Zwróćmy uwagę, że inicjująca zapytanie instrukcja SELECT pojawiła się drugi raz. Całe podzapytanie weszło po wyrażenia IN. Ponadto podzapytanie znajduje się w nawiasie.
Otrzymujemy tabelę wynikową:
Kolejne podzapytanie z instrukcją IN. Chcemy się dowiedzieć, którzy pracownicy mają prowizję większa od 0,25.
SELECT
EMPLOYEES.FIRST_NAME,
EMPLOYEES.LAST_NAME,
JOBS.JOB_ID,
JOBS.JOB_TITLE,
EMPLOYEES.COMMISSION_PCT
FROM EMPLOYEES,JOBS
WHERE JOBS.JOB_ID = EMPLOYEES.JOB_ID
AND EMPLOYEES.COMMISSION_PCT IN
(SELECT EMPLOYEES.COMMISSION_PCT
FROM EMPLOYEES
WHERE EMPLOYEES.COMMISSION_PCT > 0.25);
Otrzymujemy tabelę wynikową:
Podzapytanie z instrukcją IN służy do złożonych zapytań. Dzięki niemu zapytanie staje się bardziej przejrzyste.
Wyświetlimy wszystkich pracowników, którzy pracują w Oxfordzie a ich imiona zaczynają się od „J”. Zrobimy to najpierw bez instrukcji IN a potem z tą instrukcją.
SELECT
EMPLOYEES.FIRST_NAME,
EMPLOYEES.LAST_NAME,
DEPARTMENTS.DEPARTMENT_NAME,
LOCATIONS.CITY,
EMPLOYEES.SALARY
FROM EMPLOYEES, LOCATIONS, DEPARTMENTS
WHERE DEPARTMENTS.DEPARTMENT_ID = EMPLOYEES.DEPARTMENT_ID AND DEPARTMENTS.LOCATION_ID = LOCATIONS.LOCATION_ID
AND EMPLOYEES.FIRST_NAME LIKE 'J
Otrzymujemy tabelę wynikową:
Teraz ta sama instrukcja z użyciem podzapytania z instrukcją IN.
EMPLOYEES.FIRST_NAME,
EMPLOYEES.LAST_NAME,
DEPARTMENTS.DEPARTMENT_NAME,
LOCATIONS.CITY,
EMPLOYEES.SALARY
FROM EMPLOYEES, LOCATIONS, DEPARTMENTS
WHERE DEPARTMENTS.DEPARTMENT_ID = EMPLOYEES.DEPARTMENT_ID AND DEPARTMENTS.LOCATION_ID = LOCATIONS.LOCATION_ID
AND EMPLOYEES.FIRST_NAME IN
(SELECT EMPLOYEES.FIRST_NAME
FROM EMPLOYEES
WHERE EMPLOYEES.FIRST_NAME LIKE 'J
Ciekawym rozwiązaniem jest instrukcja NOT IN. Stosując ją w miejsce instrukcji IN do powyżej zamieszczonego zapytania można wyświetlić wszystkich pracowników z Oxfordu, których imiona nie zaczynają się na J.
SELECT
EMPLOYEES.FIRST_NAME,
EMPLOYEES.LAST_NAME,
DEPARTMENTS.DEPARTMENT_NAME,
LOCATIONS.CITY,
EMPLOYEES.SALARY
FROM EMPLOYEES, LOCATIONS, DEPARTMENTS
WHERE DEPARTMENTS.DEPARTMENT_ID = EMPLOYEES.DEPARTMENT_ID AND DEPARTMENTS.LOCATION_ID = LOCATIONS.LOCATION_ID
AND EMPLOYEES.FIRST_NAME NOT IN
(SELECT EMPLOYEES.FIRST_NAME
FROM EMPLOYEES
WHERE EMPLOYEES.FIRST_NAME LIKE 'J



