Kombinovanje rezultata više SQL upita (unija)
Ako se želi raditi sa više tabela u jednom upitu, ili sa više upita koji treba da rezultat spakuju u jedno rešenje, postoji više načina na koji se to može izvesti.
U nekoj od narednih lekcija ćemo raditi spojeve (join), koji predstavljaju način kombinovanja redova iz više tabela, koje imaju bar jednu kolonu zajedničku (istu).
Sada se koncentrišemo na problem kako predstaviti rezultate više upita zajedno. U tome će nam pomoći operator UNION:
operator: UNION
Operator UNION (unija, kao u skupovima) se koristi za kombinovanje rezultata dva ili više SQL upita.
Ipak, ne može uvek da se upotrebi. Postoje uslovi koji moraju biti zadovoljeni da bi se mogao koristiti:
- Svaki SELECT iskaz u okviru unije mora da daje isti broj kolona
- Kolone moraju da imaju slične tipove podataka
- redosled kolona sa sličnim tipovima podataka treba da je isti u oba SELECT iskaza u uniji
Sintaksa za UNION:
SELECT kolone FROM tabela1
UNION
SELECT kolone FROM tabela2;
Operator UNION će da selektuje samo vrednosti koje se ne ponavljaju, što je za uniju podrazumevano (isto kao u matematici). Da bi se dozvolili duplikati, koristi se UNION ALL:
Sintaksa za UNION ALL:
SELECT kolone FROM tabela1
UNION ALL
SELECT kolone FROM tabela2;
Napomena: imena kolona u rezultatu su obično jednaka imenima kolona u prvom SELECT iskazu u okviru unije.
Primer:
Ako imamo bazu u kojoj su, između ostalih, dve tabele: Kupci i Prodavci:
Deo tabele Kupci je ispod:
| kupacID |
imeKupca | kontaktOsoba | adresa |
grad | postanskiBroj | drzava |
|---|---|---|---|---|---|---|
| 1 | Pera Simić |
Sima Simić |
Kopernikova 23 |
Novi Sad |
21000 | Srbija |
| 2 | Ana Matić |
Saša Matić |
Mataderos 2312 | Meksiko grad |
05021 | Meksiko |
| 3 | Nikola Nikolić |
Marija Jovanović |
49 Gilbert St. | London | EC1 4SD | UK |
Deo tabele Prodavci je ispod:
| prodavacID |
imeProdavca | kontaktOsoba | adresa |
grad | postanskiBroj | drzava |
|---|---|---|---|---|---|---|
| 1 | Exotic Liquid |
Charlotte Cooper |
51 Gilbert St. |
London |
EC1 4SD | UK |
| 2 | Aleksandar Cosmetics |
kol centar |
Miše Dimitrijevića 1 | Novi Sad |
21000 | Srbija |
| 3 | Grandma Kelly's Homestead |
Regina Murphy |
707 Oxford Rd. | Ann Arbor | E48104 | USA |
PRIMER korišćenja operatora UNION:
Sledeći iskaz treba da isporuči gradove (bez ponavljanja imena grada) iz obe tabele:
SELECT grad FROM Kupci
UNION
SELECT grad FROM Prodavci
ORDER BY grad;
Napomena: Ako neki kupci ili prodavci žive u istom gradu, svaki grad će biti naveden samo jednom. Zo je zbog toga što unija selektuje samo vrednosti koje se ne ponavljaju. Ako se ipak želi navesti i duplikate, tada treba koristiti UNION ALL.
PRIMER korišćenja operatora UNION ALL:
Sledeći iskaz treba da isporuči gradove (uključujući i ponavljanja imena grada) iz obe tabele:SELECT grad FROM Kupci
UNION ALL
SELECT grad FROM Prodavci
ORDER BY grad;
SQL UNION sa WHERE klauzulom
Sledeći iskaz treba da isporuči gradove iz Srbije (bez ponavljanja imena grada) iz obe tabele:
SELECT grad, drzava FROM Kupci
WHERE drzava='Srbija'
UNION
SELECT grad, drzava FROM Prodavci
WHERE drzava='Srbija'
ORDER BY grad;
SQL UNION ALL sa WHERE klauzulom
Sledeći iskaz treba da isporuči gradove iz Srbije (uključujući i ponavljanja imena grada) iz obe tabele:
SELECT grad, drzava FROM Kupci
WHERE drzava='Srbija'
UNION ALL
SELECT grad, drzava FROM Prodavci
WHERE drzava='Srbija'
ORDER BY grad;
Primere možete isprobati online:
****
Dodatno: na online platformi možete isprobati sve primere sa časa, ali na njihovoj demo bazi:
SELECT * FROM Customers;
SELECT * FROM Suppliers;
SELECT City FROM Customers
WHERE Country='USA'
UNION
SELECT City FROM Suppliers
WHERE Country='USA';
SELECT City FROM Customers
WHERE Country='Germany'
UNION ALL
SELECT City FROM Suppliers
WHERE Country='Germany'
ORDER BY City DESC;
SELECT City AS 'GRAD' FROM Customers
WHERE Country='Argentina';
SELECT COUNT(City) AS 'Broj gradova' FROM Customers;
SELECT COUNT(City) AS 'Broj gradova', Country AS 'Država' FROM Customers
GROUP BY Country;
****
A možete pogledati i video lekciju predavača sa Stanford univerziteta:
(