Na času koristimo sledeći SQL kod:

1. Kreiranje tabela koje nam trebaju:

CREATE TABLE ucenici1 (
ucenikID INT PRIMARY KEY AUTO_INCREMENT,
ime VARCHAR(25) NOT NULL,
prezime VARCHAR(25) NOT NULL );

CREATE TABLE razredi (
razredID INT PRIMARY KEY AUTO_INCREMENT,
skolskaGodina CHAR(9),
smer VARCHAR(50)
);

2. Umesto da smo odmah radili sa kreiranjem svih ključeva, naknadno dodajemo ograničenje tipa FOREIGN KEY:

ALTER TABLE ucenici1
ADD FOREIGN KEY (RazredID) REFERENCES Razredi(RazredID)

3. Zatim unosimo podatke u naše tabele:

INSERT INTO razredi(skolskaGodina, smer)
VALUES ('2020/2021', 'Elektrotehnicar informacionih tehnologija'),
('2020/2021', 'Elektrotehnicar racunara'),
('2020/2021', 'Elektrotehnicar energetike'),
('2020/2021', 'Masinski tehnicar');

4. Da bi proverili šta sve imamo u ovoj tabeli, koristimo naredbu SELECT:

  SELECT * FROM razredi;

5. Sledeće je da se unesu još neki podaci:

INSERT INTO razredi(skolskaGodina, smer)
VALUES ('2019/2020', 'Elektrotehnicar informacionih tehnologija'),
('2019/2020', 'Elektrotehnicar racunara'),
('2019/2020', 'Elektrotehnicar energetike'),
('2019/2020', 'Masinski tehnicar');

INSERT INTO razredi(razredID, skolskaGodina, smer)
VALUES (13, '2020/2021', 'Elektroinstalater');

INSERT INTO razredi(skolskaGodina, smer)
VALUES ('2021/2022', 'Elektrotehnicar informacionih tehnologija'),
('2021/2022', 'Elektrotehnicar racunara'),
('2021/2022', 'Elektrotehnicar energetike'),
('2021/2022', 'Masinski tehnicar');

INSERT INTO `ucenici1` (`ucenikID`, `Ime`, `Prezime`, `RazredID`)
VALUES ('1', 'Pera', 'P.', '1');

INSERT INTO ucenici1(Ime, Prezime, RazredID)
VALUES ('Ana', 'Simic',
(SELECT RazredID FROM razredi WHERE SkolskaGodina LIKE '2020%' AND Smer LIKE '%info%')
);

Obratite pažnju da su korišćeni različiti načini na koji se mogu uneti podaci. U poslednjem upitu je čak korišćen i podupit da bi se došlo do validne vrednosti koja se unosi.

Vi unesite još podataka u tabelu sa učenicima, korišćenjem poslednje navedenog načina, a u ovom tekstu će to biti preskočeno da bismo nastavili dalje.

6. Proverite šta se nalazi u ovoj drugoj tabeli:

SELECT * FROM `ucenici1`;


PRESEK (ili šta je zajedničko u dve tabele)

za ovo ponovite kako radi NATURAL JOIN i INNER JOIN iz prethodnih lekcija. Upiti su u nastavku:

Želim da znam koji učenici imaju razredID koji postoji i u tabeli razredi (koji učenici su u kojim razredima):

   SELECT u.Ime, u.Prezime, r.Smer, r.SkolskaGodina
FROM razredi r NATURAL JOIN ucenici1 u;

ili, ako upotrebite INNER JOIN na sledeći način:

  SELECT u.Ime, u.Prezime, r.Smer, r.SkolskaGodina
FROM razredi r INNER JOIN ucenici1 u USING (RazredID);


RAZLIKA (ili šta ima u jednoj a nema u drugoj tabeli)

Za ovo je potrebno da ponovite LEFT OUTER JOIN i RIGHT OUTER JOIN iz prethodnih lekcija. (OUTER je opciono pisati u većini verzija SQL-a)

Kako da vidimo šta ima u jednoj tabeli, šta je zajedničko za obe, a šta se ne poklapa?

Šta je rezultat sledećeg upita:

SELECT r.Smer, u.Ime 
FROM razredi r LEFT JOIN ucenici1 u Using (RazredID)

Odgovor: videćemo u kojem od smerova na svakoj od školskih godina nema ni jednog učenika, a u kojim smerovima ima učenika i koji su.

Ako bismo hteli da vidimo samo u kojim od tih smerova nema ni jednog učenika (što je u stvari operacija RAZLIKA između skupova), treba da dodamo i uslov za proveru:

  SELECT r.Smer, u.Ime 
FROM razredi r LEFT JOIN ucenici1 u USING (RazredID)
WHERE u.Ime IS NULL;

A ako ne želimo da vidimo NULL na mestu imena učenika, već informaciju u kojim je to školskim godinama bilo smerova bez ijednog učenika, možemo da uporebimo sledeći upit:

SELECT r.Smer, r.SkolskaGodina
FROM razredi r LEFT JOIN ucenici1 u USING (RazredID)
WHERE u.Ime IS NULL;


UNIJA (rezultati više upita se spajaju u jedan rezultat)


Dva ili više upita mogu se kombinovati u jednu naredbu upotrebom operatora za rad sa skupovima: UNION-unija (UNION ALL-unija svih),

Da bi se upiti spajali ovim operatorima, liste atrubuta ili izraza u klauzulama svih SELECT naredbi moraju da budu iste po broju i tipu (moraju da imaju iste domene, UNION kompatibilne).

Rezultujuća tabela će imati iste nazive kolona kao što su nazivi kolona u prvom upitu.

Primeri:

SELECT r.Smer, u.Ime, u.Prezime 
FROM razredi r LEFT JOIN ucenici1 u USING (RazredID)
WHERE u.Ime IS NULL

UNION

SELECT r.Smer, u.Ime, u.Prezime
FROM razredi r LEFT JOIN ucenici1 u USING (RazredID)
WHERE u.Ime IS NOT NULL

ili ako koristimo NATURAL JOIN u jednom od upita i UNION da spojimo rezultate:

SELECT r.Smer, u.Ime 
FROM razredi r LEFT JOIN ucenici1 u USING (RazredID)
WHERE u.Ime IS NULL

UNION

SELECT r.Smer, u.Prezime
FROM razredi r NATURAL JOIN ucenici1 u

Možete da kombinujete šta god hoćete, unija će prikazati sve, dokle god je broj kolona isti i tipovi podataka u njima se slažu. Zaglavlje na vrhu će odgovarati zaglavlju iz prvog dela unije, a onda se često može desiti da se ne slažu podaci.

Do vas je da kontrolišete šta se i gde treba uraditi. Ni jedna baza podataka ne proverava istinitost podataka niti logičnost onoga što treba da se izbaci kao rezultat.

To onda znači da će unija na primer ispisat imena, pa prezimena, pa školske godine, a na vrhu može da u zaglavlj piše ko zna žta- vi vodite računa!

U većini slučajeva se umesti UNION može koristiti samo logički operator OR.


AUTO_INCREMENT (dodeljivanje rednih brojeva)

Ovo smo dosada koristili više puta, i stvar je u sledećem:

Ako je u nekoj koloni INT tip podataka, za koji je navedeno da je i AUTO_INCREMENT, pa ako prilikom unosa ne navedete i tu kolonu (namerno ili slučajno) sledi da će automatski biti unesen sledeći ceo broj (u odnosu na prethodno uneseni)  - unose se automatski neki različiti brojevi.

Ovo je jako zgodno kada se radi o kolonama koje sui primarni ključevi, jer tada morate da obezbedite da su sve vrednosti različite.

Samo u MySQL-u se koristi AUTO_INCREMENT !!!

( Ako koristite MS SQL Server, tamo se koristi IDENTITY, dok je za ORACLE baze nešto drugo, ...  )

Ako vam je potrebna kompatibilnost između različitin verzija SQL-a nemojte koristiti AUTO_INCREMENT, već automatsko menjanje broja rešite na drugi način (podupit, promenjive, okidači, VIEW, ... )

Last modified: Thursday, 15 April 2021, 11:44 AM