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:

Kupci
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:

Prodavci
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:

(

| Transcript | SQL Script) - UNION počinje na 4:06 , ali bi trebalo znati i ostalo iz ovoga videa


Last modified: Sunday, 8 March 2020, 9:13 PM