SQL - Podupiti (Subqueries)


Šta je podupit?

Podupit, takođe poznat kao ugniježđeni upit ili podselekt, je SELECT upit ugrađen u klauzulu WHERE ili HAVING drugog SQL upita. Podatke koje vraća podupit koristi vanjski izraz na isti način na koji bi se koristila literalna vrijednost. Podupiti pružaju jednostavan i efikasan način za obradu upita koji zavise o rezultatima drugog upita. Gotovo su identični uobičajenim SELECT naredbama, ali postoji malo ograničenja. U nastavku su navedena najvažnija ograničenja:

  • Podupit se uvijek mora pojaviti u zagradama.
  • Podupit mora vratiti samo jedanu kolonu. To znači da u podupitu ne možete koristiti SELECT *, osim ako tabela na koju upućujete ima samo jedau kolonu. Možete koristiti podupit koji vraća više kolona ako je svrha usporedba redova.
  • Možete koristiti samo podupite koji vraćaju više od jednog reda s više operatora vrijednosti, poput operatora IN ili NOT IN.
  • Podupit ne može biti UNIJA (UNION). Dopušten je samo jedan izraz SELECT.

Podupiti se najčešće koriste s naredbom SELECT, međutim možete ih koristiti i u naredbi INSERT, UPDATE ili DELETE, ili unutar drugog podupita.



Podupiti s SELECT izjavom

Sljedeća izjava vratit će detalje samo onih kupaca čija je vrijednost narudžbe u tabeli narudžbi veća od 5000 dolara. Takođe imajte na umu da smo u podupitu koristili ključnu riječ DISTINCT da bismo eliminisali duplirane vrijednosti cust_id iz skupa rezultata.

SELECT * FROM customers
WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders 
                      WHERE order_value > 5000);


Podupiti s izjavom INSERT

Podupiti se takođe mogu koristiti s INSERT izrazima. Evo primjera:

INSERT INTO premium_customers 
SELECT * FROM customers 
WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders 
                      WHERE order_value > 5000);

Gornja izjava ubaci će zapise premium kupaca u tabelu koja se naziva premium_customers, koristeći podatke vraćene iz podupita. Ovdje su premium kupci kupci koji su naručili više od 5000 dolara.



Podupiti s UPDATE izjavom

Podupite takođe možete koristiti zajedno s izrazom UPDATE za ažuriranje jedne ili više kolona u tabeli, kao što je prikazanu u narednom primjeru:

UPDATE orders
SET order_value = order_value + 10
WHERE cust_id IN (SELECT cust_id FROM customers 
                      WHERE postal_code = 75016);

Gornja izjava ažurirat će vrijednost narudžbe u tabeli narudžbi za one kupce koji žive na području čiji je poštanski broj 75016, povećavanjem trenutne vrijednosti narudžbe za 10 dolara.



Podupiti s izjavom DELETE

Slično tome, podupite možete koristiti zajedno s izrazom DELETE za brisanje pojedinačnih ili više redova u tabeli, kao što je prikazanu u narednom primjeru:

DELETE FROM orders
WHERE order_id IN (SELECT order_id FROM order_details 
                   WHERE product_id = 5);

SQL izraz u gornjem primjeru će izbrisati te narudžbe iz tabele narudžbi koja sadrži proizvod čiji je product_id 5.