You are on page 1of 4

~SQL - JEDNOSTAVNI UPITI~

Relacijska shema baze fakultet:


STUDENT (JMBAG, PREZIMES, IMES, DATR, GODINA)
NASTAVNIK (OIB, PREZIMEN, IMEN, BRSOBE, PLACA)
PREDMET (SIFRA, NASLOV, OIB, SEMESTAR, ECTS)
UPISAO (JMBAG, SIFRA, DATU, OCJENA) // veza izmeu predmeta i studenta

DESCRIBE STUDENT; // pokazuje kako tablica student izgleda


// klju nikad ne smije biti null

Zad 1 Ispisati citav sadrzaj svake od 4 tabele u demo bazi.


SELECT * FROM STUDENT;
SELECT * FROM NASTAVNIK;

Zad 2 Ispisati imena i datume roenja za sve studente.


SELECT IMES, DATR FROM STUDENT;

Zad 3 Recimo da fakultet odluci svim nastavnicima udvostruciti placu od iduce godine. Ispisite kolike ce biti place nastavnika iduce
godine.
SELECT PREZIMEN,PLACA*2 FROM NASTAVNIK; //naravno, imamo i +, -, /, ()

Zad 4 Ispisite OIB-e nastavnika koji predaju bar jedan kolegij.


SELECT DISTINCT OIB FROM PREDMET; // bar jednog kolegija --> koristim DISTINCT

Zad 5 Ispisati sve podatke o nastavnicima iz sobe 127. Ispisati imena nastavnika s placom vecom od 10 000. Ispisati imena nastavnika
koji ne sjede u sobi 315.
a) SELECT * FROM NASTAVNIK WHERE BRSOBE=127; // * znai sve
b) SELECT IMEN FROM NASTAVNIK WHERE PLACA>10000;
c) SELECT IMEN FROM NASTAVNIK WHERE BRSOBE!=315;

Zad 6 Ispisati sve podatke o nastavnicima koji sjede u sobi 127 ili 315. Ispisati sve podatke o nastavnicima koji ne sjede ni u sobi 127
ni u sobi 315.
a) SELECT * FROM NASTAVNIK WHERE BRSOBE=127 OR BRSOBE=315; ili SELECT * FROM NASTAVNIK WHERE BRSOBE IN(127,315);
b) SELECT * FROM NASTAVNIK WHERE BRSOBE!=127 AND BRSOBE!=315; ili ... WHERE BRSOBE NOT IN(127, 315);

Zad 7 Ispisati sve podatke o nastavnicima koji zaradjuju izmedju 10 000 i 12 000 (ukljucivo). Ispisati sve podatke o nastavnicima koji
zaradjuju manje od 9 000 ili vise od 11 000.
a) SELECT * FROM NASTAVNIK WHERE PLACA >= 10000 AND PLACA <= 12000; ili SELECT * FROM NASTAVNIK WHERE
PLACA BETWEEN 10000 AND 12000; // NOT BETWEEN je stroga nejednakost
b) SELECT * FROM NASTAVNIK WHERE PLACA > 11000 OR PLACA < 9000 ili .... WHERE PLACA NOT BETWEEN 9000 AND 11000;

Zad 8 Ispisati JMBAG-ove svih studenata koji su iz kolegija sa sifrom 72001 dobili ocjenu izmedju 3 i 5. Ispisati JMBAG-ove studenata
koji su bar iz jednog kolegija dobili ocjenu izmedju 3 i 5.
a) SELECT JMBAG FROM UPISAO WHERE SIFRA=72001 AND OCJENA BETWEEN 3 AND 5;
b) SELECT DISTINCT JMBAG FROM UPISAO WHERE OCJENA BETWEEN 3 AND 5;

Zad 9 Ispisi imena studenata koja pocinju slovom 'M', zatim sva imena studenata u kojima se pojavljuje niz znakova 'ar'. Na kraju,
ispisati imena studenata kojima se kao trece slovo pojavljuje 'a'.
a) SELECT IMES FROM STUDENT WHERE IMES BETWEEN 'M' AND 'N'; ili (korektniji nain:) SELECT IMES FROM STUDENT WHERE
IMES LIKE 'M%'; // %=0, 1 ili vie znakova
b) SELECT IMES FROM STUDENT WHERE IMES LIKE '%ar%';
c) SELECT IMES FROM STUDENT WHERE IMES LIKE '__a%'; // _ zamjenjuje tono jedan znak

Zad 10 Ispisati podatke o nastavnicima, uzlazno sortirane po placi. Ispisati sve podatke o nastavnicima, silazno sortirano po placi.
a) SELECT * FROM NASTAVNIK ORDER BY PLACA ASC; // ASC= ulazno, to je default pa ne moramo pisati
b) SELECT * FROM NASTAVNIK ORDER BY PLACA DESC; // DESC= silazno

Zad 11 Ispisite prezimena studenata rodjenih 1992 godine, koji su na 1. godini studija. Ispis treba biti abecedno sortiran po
prezimenima.
SELECT PREZIMES FROM STUDENT WHERE DATR LIKE '1992%' AND GODINA=1 ORDER BY PREZIMES; // datum roenja je oblika
godina, mjesec, dan
// kako umjesto DATR napisati DATUM RODENJA u tablici? ovako:
SELECT PREZIMES PREZIME_STUDENTA, DATR DATUM_RODJENJA FROM STUDENT;

Zad 12 Ispisati podatke o nastavnicima koji zaradjuju izmedju 10 000 i 12 000, tako da im prezimena budu sortirana po abecedi. Ispisati
podatke o svim nastavnicima, sortirano po sobama, s time da nastavnici iz iste sobe slijede abecedno poredani po prezimenima.
a) SELECT * FROM NASTAVNIK WHERE PLACA BETWEEN 10000 AND 12000 ORDER BY PREZIMEN;
b) SELECT * FROM NASTAVNIK ORDER BY BRSOBE, PREZIMEN; // mogu dodat DESC iza BRSOBE

Zad 13 Ispisite studente sortirano po starosti (pocevsi od najstarijeg).


SELECT JMBAG FROM STUDENT ORDER BY DATR; // JMBAG je jedinstven pa smo zato to ispisali

Zad 14 Ispisati imena i udvostrucene place nastavnika, sortirano po udvostrucenim placama.


SELECT IMEN, PLACA*2 FROM NASTAVNIK ORDER BY 2; // 2 je ovo drugo koje je ovdje navedeno, dakle plaa
STVARANJE I AURIRANJE TABELA I INDEXA
tipovi podataka: http://web.math.pmf.unizg.hr/~karaga/bptipovipodataka.html

Zad 15 Stvoriti tablice koje odgovaraju onima u demo bazi "fakultet".


CREATE TABLE STUDENT (JMBAG NUMERIC(10) UNSIGNED NOT NULL, PREZIMES CHAR(20), IMES CHAR (20), DATR DATE, GODINA
ENUM ('1','2','3','4','5'), PRIMARY KEY (JMBAG));
CREATE = naredba za stvaranje
TABLE= talica
STUDENT=ime, mi neto drugo
UNSIGNED= znai bez predznaka, to stavljamo iza brojeva
ENUM=moe poprimiti samo te vrijednosti (1, 2, 3, 4 ili 5)
NOT NULL= to uvijek stavim kod kljua
PRIMARY KEY = klju

EVO NAE BAZE:


CREATE TABLE ST (JMBAG NUMERIC(10) UNSIGNED NOT NULL, PREZIMES CHAR(20), IMES CHAR(20), DATR DATE, GODINA
ENUM('1','2','3','4','5'), PRIMARY KEY(JMBAG));

CREATE TABLE NA (OIB NUMERIC(11) UNSIGNED NOT NULL, PREZIMEN CHAR(20), IMEN CHAR(20), BRSOBE NUMERIC(3) UNSIGNED,
PLACA NUMERIC(5) UNSIGNED, PRIMARY KEY(OIB));

CREATE TABLE PR (SIFRA NUMERIC(5) UNSIGNED NOT NULL, NASLOV CHAR(80), OIB NUMERIC(11) UNSIGNED, SEMESTAR
ENUM('Z','L'), ECTS NUMERIC(2) UNSIGNED, PRIMARY KEY(SIFRA));

CREATE TABLE UP (JMBAG NUMERIC(10) UNSIGNED NOT NULL, SIFRA NUMERIC(5) UNSIGNED NOT NULL, DATU DATE, OCJENA
ENUM('1','2','3','4','5'), PRIMARY KEY(JMBAG,SIFRA));

Kako napuniti tablice?

Zad 16 U direktoriju /math/karaga/baze nalaze se datoteke s podacima za demo bazu. Jedna datoteka odgovara jednoj tabeli, jedan
redak datoteke jednoj n-torki. Vrijednosti atributa razdvojene su znakovima tab. Imena datoteka su datanastavnik i datapredmet.
Inicijalizirajte sadrzaj za vlastite tabele NASTAVNIK i PREDMET t. d. ucitate podatke iz odgovarajucih datoteka.

LOAD DATA INFILE "../../../../math/karaga/baze/datanastavnik" INTO TABLE NASTAVNIK; // umjesto NASTAVNIK mi napisali NA ;)
LOAD DATA INFILE "../../../../math/karaga/baze/datapredmet" INTO TABLE PR;

Zad 17 Inicijalizirajte sadrzaj za vlastite tabele UPISAO i STUDENT t. d. prepisete podatke iz odgovarajucih tabela demo baze "fakultet".
INSERT INTO ST SELECT * FROM fakultet.STUDENT;
INSERT INTO UP SELECT * FROM fakultet.UPISAO;

Zad 18 Upisite u bazu novog nastavnika s OIB-om 50000000000, prezimenom Mirkovic, imenom Mirko, koji ce sjediti u sobi 101 i imati
ce placu 8000 kuna.
1.nain
INSERT INTO NA VALUES(50000000000, 'Mirkovic', 'Mirko', 101, 8000);
isti redosljed atributa kao u tablici // to je loe jer trebamo pamtiti redosljed u tablici :(
2.nain
INSERT INTO NA (PREZIMEN, IMEN, PLACA, BRSOBE, OIB) VALUE ('Mirkovic, 'Mirko', 8000, 101, 50000000000);
u redosljedu navedeno tu na poetku :)
3.nain
INSERT INTO NA SET PLACA=8000, BRSOBE=101, IMEN='Mirko', PREZIMEN='Mirkovic', OIB=50000000000;
ne moramo paziti na redosljed, a i smijemo izostaviti neke atribute - oni se postavljaju automatski na NULL (sve osim kljua)

Zad 19 Realizirajte situaciju u kojoj je nastavnik s OIB-om 44102179316 (Klein) dobio otkaz. Sve njegove kolegije preuzima nastavnik s
OIB-om 50000000000 (Mirkovic).
prvo mijenjamo predmet td OIB od kleina zamijenimo s OIBom od mirkovia
UPDATE PR SET OIB=50000000000 WHERE OIB=44102179316;
sad briemo kleina
DELETE FROM NA WHERE OIB=44102179316;

Zad 20 Nastavnika Pascala premjestite u sobu 201 i dajte mu povisicu u visini 20% dosadasnje place.
UPDATE NA SET BRSOBE=201, PLACA=PLACA*1.2 WHERE PREZIMEN='Pascal'; // to moemo jer imamo samo jednog Pascala

Zad 21 Ponistite upise svih kolegija koji nisu polozeni.


DELETE FROM UP WHERE OCJENA IS NULL;
ako nije null, piemo IS NOT NULL

Zad 22 Dajte svim nastavnicima placu od 10000


UPDATE NA SET PLACA=10000;

Indeksi su pomone strukture na atributima koji ubrzavaju pretraivanje po tim atributima. Dodatno, unique indeks na kljuu osigurava i "svojstvo
kljua" (tj. da ne moemo imati vie unosa s istom vrijednou kljua)

Zad 23 Stvorite indeks po primarnom kljucu za svaku od 4 tablice.


CREATE UNIQUE INDEX STUDENT_IND ON ST(JMBAG); gdje STUDENT_IND = ime indexa
CREATE UNIQUE INDEX UPISAO_IND ON UP(JMBAG, SIFRA);
CREATE UNIQUE INDEX PREDMET_IND ON PR(SIFRA);
CREATE UNIQUE INDEX NASTAVNIK_IND ON NA(OIB);
Zad 24 Provjerite da "unique indeks" zaista sprecava upis 2 n-torke s istom vrijednoscu primarnog kljuca.
sami...

Zad 25 Stvorite indekse kojima se ubrzava: trazenje studenata na zadanoj godini, trazenje nastavnika koji sjede u zadanoj sobi.
CREATE INDEX SG ON ST(GODINA);
CREATE INDEX NS ON NA(BRSOBE);

NAPOMENA:
SHOW INDEX FROM imetablice; // ispisuje sve indexe koji su na nekoj tablici
DROP INDEX ime ON TABLE imet;
DROP TABLE imet; // brisanje tablice
ALTER TABLE // promijeni ve stvorenu tablicu ali bolje DROP TABLE pa sve ispoetka

- upiti koji koriste vie tablica


- ugnjeeni upiti
- upiti koji koriste funkcije

Zad 1 Ispisati listu imena studenata zajedno s naslovima kolegija koje su oni upisali. Ispisati naslove onih kolegija koje je upisao
student Vukovic Janko.
// Trebaju mi tablice STUDENT, PREDMET i UPISAO (jer upisao povezuje ova dva)
// pazi, imamo 2 OIBa (iz nastavnika i iz predmeta, morat emo tu paziti)

a) SELECT STUDENT.IMES, PREDMET.NASLOV FROM STUDENT, UPISAO, PREDMET WHERE STUDENT.JMBAG=UPISAO.JMBAG AND
UPISAO.SIFRA=PREDMET.SIFRA;
b) SELECT PREDMET.NASLOV FROM STUDENT, UPISAO, PREDMET WHERE STUDENT.JMBAG=UPISAO.JMBAG AND
UPISAO.SIFRA=PREDMET.SIFRA AND STUDENT.IMES='Janko' AND STUDENT.PREZIMES='Jankovic';

Zad 2 Ispisati listu imena studenata zajedno s nazivima kolegija koje su oni upisali, s time da iskljucimo studente na 3. godini. Ispisati
nazive onih kolegija koje je upisao bar jedan student na 2. godini.
a) SELECT IMES, NASLOV FROM STUDENT, UPISAO, PREDMET WHERE GODINA !=3 AND STUDENT.JMBAG=UPISAO.JMBAG AND
UPISAO.SIFRA=PREDMET.SIFRA;
b) SELECT DISTINCT NASLOV FROM STUDENT, UPISAO, PREDMET WHERE GODINA=2 AND STUDENT.JMBAG=UPISAO.JMBAG AND
UPISAO.SIFRA=PREDMET.SIFRA;

U SQLu moemo kombinirati tablicu samu sa sobom. Tada tablici dajemo nadimke (aliase).

Zad 3 Ispisati sve parove nastavnika (po prezimenima) koji sjede u istoj sobi.
SELECT N1.PREZIMEN,N2.PREZIMEN FROM NASTAVNIK N1, NASTAVNIK N2 WHERE N1.BRSOBE=N2.BRSOBE AND
N1.PREZIMEN<N2.PREZIMEN;
// dodali smo AND... da ne bi parove ispisivao 2 puta

Zad 4 Ispisati prezimena i place svih nastavnika koji imaju vecu placu od nastavnika Codd-a.
// etat emo se po N2, fixirat emo N1
SELECT N2.PREZIMEN, N2.PLACA FROM NASTAVNIK N1,NASTAVNIK N2 WHERE N1.PREZIMEN='Codd' AND N2.PLACA>N1.PLACA;
ili
SELECT PREZIMEN, PLACA FROM NASTAVNIK WHERE PLACA>(SELECT PLACA FROM NASTAVNIK WHERE PREZIMEN='Codd');

Zad 5 Ispisati listu imena i prezimena studenata zajedno s naslovima kolegija koje ti studenti nisu upisali.
// nisu upisali - trait u koje jesu upisali pa u to negirati tj nai studenti nisu u tom skupu
SELECT IMES, PREZIMES, NASLOV FROM STUDENT, PREDMET WHERE SIFRA NOT IN (SELECT SIFRA FROM UPISAO WHERE
UPISAO.JMBAG=STUDENT.JMBAG);

Zad 6 Ispisati imena i prezimena studenata koji nisu upisali ni jedan kolegij.
SELECT IMES, PREZIMES FROM STUDENT WHERE JMBAG NOT IN (SELECT JMBAG FROM UPISAO);

Zad 7 Ispisati imena studenata koji su upisali bar jedan kolegij. Ispisati sobe nastavnika koji predaju bar jedan kolegij.
a) SELECT DISTINCT IMES FROM STUDENT, UPISAO WHERE STUDENT.JMBAG=UPISAO.JMBAG
b) SELECT DISTINCT BRSOBE FROM NASTAVNIK WHERE OIB IN (SELECT OIB FROM PREDMET);

Funkcije u MySQL-u: funkcije 1, funkcije2 U SQLu umjesto atributa moemo koristiti i pozive funkcija.

Zad 8 Izracunaj izraz e^sinx + e^cosx za x=1.2 rad.


SELECT EXP(SIN(1.2))+EXP(COS(1.2));

Zad 9 Ispisi place svih nastavnika u stranoj valuti, kao cijeli broj. Jedinica strane valute vrijedi kao 7.8 jedinica domace. // ispisat emo i
prezime
SELECT PREZIMEN, ROUND(PLACA/7.8) FROM NASTAVNIK;

Zad 10 Ispisi parove studenata koji su se rodili istog dana u tjednu.


// imamo parove, koristit emo aliase
SELECT S1.JMBAG, S2.JMBAG FROM STUDENT S1, STUDENT S2 WHERE S1.JMBAG<S2.JMBAG AND
DAYOFWEEK(S1.DATR)=DAYOFWEEK(S2.DATR);
Zad 11 Prikazi uspjeh studenata koji su polozili predmet s sifrom 56001 u obliku histograma (veca ocjena-dulji niz zvjezdica. )
// LPAD(a,b,c) funkcionira ovak: cccca, ispod cccc je -->vitiasta zagrada-->b
// LPAD(a,b,c) pred a naljepi c tono b puta
SELECT IMES, PREZIMES, LPAD (' ', OCJENA*2, '*') HISTOGRAM FROM STUDENT, UPISAO WHERE STUDENT.JMBAG=UPISAO.JMBAG
AND OCJENA IS NOT NULL AND UPISAO.SIFRA=56001;

Zad 12 Ispisite svoje korisnicko ime i trenutnu verziju MySQL-a.


SELECT USER( );
SELECT VERSION( );

SQL - GRUPIRAJUI UPITI


Ponekad je korisno retke u tablici formirati u grupe po nekom kriteriju, te na te grupe primjenjivati tzv grupne funkcije. Moemo i itavu tablicu
promatrati kao jednu grupu i na nju primjeniti grupne funkcije.
Pogledaj funkcije 3

Zad 13 Ispisati: zbroj svih placa nastavnika, prosjecnu placu nastavnika, ime i placu nastavnika s najvecom placom.
a) SELECT SUM(PLACA) FROM NASTAVNIK;
b) SELECT AVG(PLACA) FROM NASTAVNIK;
c) SELECT IMEN, MAX(PLACA) FROM NASTAVNIK; NIJE DOBRO
upit mora biti ili "obian" ili grupirajui //pomou ugnjeenih upita//
SELECT IMEN, PLACA FROM NASTAVNIK WHERE PLACA=(SELECT MAX(PLACA) FROM NASTAVNIK);

Zad 14 Ispisati: broj studenata na 1. godini, broj studenata na 2. godini, broj svih godina, broj svih studenata.
a) SELECT COUNT(GODINA) FROM STUDENT WHERE GODINA=1;
b) SELECT COUNT(GODINA) FROM STUDENT WHERE GODINA=2;
c) SELECT COUNT(DISTINCT GODINA) FROM STUDENT;
d) SELECT COUNT(*) FROM STUDENT;

Zad 15 Ispisati koliko studenata ima na svakoj godini studija.


// grupirat emo studente po godinama pa puknuti COUNT(*) //
SELECT GODINA, COUNT(*) FROM STUDENT GROUP BY GODINA;
//gdje je GODINA kriterij grupiranja); a GODINA =atribut po kojem smo grupirali

Zad 16 Ispisati maksimum, minimum i raspon place za nastavnike iz svake od soba. Zatim ispisati iste podatke samo za sobu 127.
a) SELECT MAX(PLACA), MIN(PLACA), MAX(PLACA)-MIN(PLACA) RASPON, BRSOBE FROM NASTAVNIK GROUP BY BRSOBE;
b) SELECT MAX(PLACA), MIN(PLACA), MAX(PLACA)-MIN(PLACA) RASPON, BRSOBE FROM NASTAVNIK WHERE BRSOBE=127 GROUP
BY BRSOBE;

Zad 17 Ispisite srednje ocjene i standardne devijacije za ocjene po svim kolegijima.


SELECT SIFRA, AVG(OCJENA), STD(OCJENA) FROM UPISAO GROUP BY SIFRA;

Zad 18 Ispisite maksimalnu ocjenu koju su studenti s pojedine godine ostvarili iz pojedinog kolegija.
SELECT UPISAO.SIFRA, STUDENT.GODINA, MAX(OCJENA) FROM UPISAO, STUDENT WHERE STUDENT.JMBAG=UPISAO.JMBAG
GROUP BY UPISAO.SIFRA, STUDENT.GODINA;

Zad 19 Ispisite prosjecnu placu za nastavnike iz iste sobe, no samo za sobe u kojima ima vise od jednog nastavnika.
SELECT BRSOBE, COUNT(*), AVG(PLACA) FROM NASTAVNIK GROUP BY BRSOBE HAVING COUNT(*)>1;
naredba HAVING je analogon naredbi WHERE, jedino to se WHERE izvrava prije a HAVING nakon grupiranja

Zad 20 Zbrojite place po sobama i ispisite rang listu soba po placama.


SELECT BRSOBE, SUM(PLACA) FROM NASTAVNIK GROUP BY BRSOBE ORDER BY 2 DESC;

Zad 21 Ispisite imena i place za tri najbolje placena nastavnika.


// ovaj upit nema veze s grupiranjem nego nas ui naredbi LIMIT
LIMIT(a,b) gdje a=broj retka od kojeg poinje ispis, b= maximalan broj redaka koji ispisujemonpr. LIMIT(0,3) ispisuje retke 0, 1, 2
SELECT IMEN, PLACA FROM NASTAVNIK ORDER BY PLACA DESC LIMIT 0,3;

KOLOKVIJ
TO E BITI: SQL - jednostavni upiti, sloeni upiti, grupirajui upiti. Samo to. Kolokvij je na kompu, traje 45min, 8 selecta emo morati napraviti
HINTOVI:
ne biti brzoplet!
smijemo koristiti SELECT *, tako provjerim dal sam dobro rijeila zadatak !!!!!!!!!!!!!!!!

You might also like