08. februar - ! PROČITAJTE KOD KUĆE: 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.
Jedan način kako predstaviti rezultate više upita zajedno, a da se ne koristi JOIN, već 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
UNION
SELECT City 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:
(