29.10. Ponavljanje SQL funkcija i izraza (bez rešenja)
🔹 SQL skripta za kreiranje baze i tabela
Kreiranje baze Skola1
-- Kreiranje baze podataka
CREATE DATABASE Skola1;
GO
-- Prelazak na novokreiranu bazu
USE Skola1;
GO
Treba da se kreiraju tabele:
-
Student – podaci o studentima
-
Ucenik – podaci o učenicima
-
Predmet – podaci o predmetima
-
Ocena – podaci o ocenama učenika iz predmeta
🔹 Kreiranje tabele Ucenik
-- Ako već postoji tabela, brišemo je
IF OBJECT_ID('Ucenik', 'U') IS NOT NULL
DROP TABLE Ucenik;
GO
-- Kreiranje tabele UCENIK
CREATE TABLE Ucenik (
UcenikID INT IDENTITY(1,1) PRIMARY KEY,
Ime NVARCHAR(30) NOT NULL,
Prezime NVARCHAR(30) NOT NULL,
Razred INT NOT NULL,
ProsecnaOcena DECIMAL(3,2) NULL,
DatumRodjenja DATE NULL
);
GO
🔹 Ubacivanje podataka
Svi podaci su primeri koji pokrivaju više razreda i različite situacije (poznata/nepoznata ocena, različiti datumi).
INSERT INTO Ucenik (Ime, Prezime, Razred, ProsecnaOcena, DatumRodjenja) VALUES
(N'Ana', N'Petrović', 3, 4.50, '2007-03-12'),
(N'Miloš', N'Nikolić', 3, 3.80, '2007-05-08'),
(N'Jelena', N'Pavlović', 4, 4.20, '2006-11-21'),
(N'Nikola', N'Simić', 4, 5.00, '2006-07-03'),
(N'Ivana', N'Marković', 4, NULL, '2007-02-17'),
(N'Danilo', N'Ristić', 3, 2.90, '2007-10-15'),
(N'Sara', N'Đorđević', 2, 4.75, '2008-01-28'),
(N'Mina', N'Popović', 2, 4.00, '2008-04-10'),
(N'Petar', N'Ilić', 2, NULL, '2008-06-22'),
(N'Andrej', N'Jovanović', 3, 3.20, '2007-09-05');
GO
🔹 Kreiranje tabela Student, Predmet, Ocena
CREATE TABLE Student (
UcenikID INT PRIMARY KEY IDENTITY(1,1),
Ime NVARCHAR(30),
Prezime NVARCHAR(30),
DatumRodjenja DATE,
Mesto NVARCHAR(30)
);
CREATE TABLE Predmet (
PredmetID INT PRIMARY KEY IDENTITY(1,1),
Naziv NVARCHAR(50),
FondNedeljno INT
);
CREATE TABLE Ocena (
OcenaID INT PRIMARY KEY IDENTITY(1,1),
UcenikID INT,
PredmetID INT,
Ocena INT,
DatumOcene DATE,
FOREIGN KEY (UcenikID) REFERENCES Ucenik(UcenikID),
FOREIGN KEY (PredmetID) REFERENCES Predmet(PredmetID)
);
🔹 Unos podataka
za tabelu Student:
INSERT INTO Student (Ime, Prezime, DatumRodjenja, Mesto)
VALUES
('Marko', 'Jovanović', '2007-03-15', 'Beograd'),
('Milica', 'Petrović', '2007-07-22', 'Novi Sad'),
('Nikola', 'Ilić', '2007-01-09', 'Niš'),
('Jelena', 'Stanković', '2007-05-30', 'Kragujevac'),
('Ana', 'Milenković', '2007-09-18', 'Subotica');
za tabelu Predmet:
INSERT INTO Predmet (Naziv, FondNedeljno)
VALUES
('Matematika', 4),
('Srpski jezik', 3),
('Informatika', 2),
('Fizika', 2),
('Hemija', 2);
zab tabelu Ocena:
INSERT INTO Ocena (UcenikID, PredmetID, Ocena, DatumOcene)
VALUES
(1, 1, 5, '2024-09-12'),
(1, 3, 4, '2024-09-20'),
(2, 1, 3, '2024-09-12'),
(2, 2, 5, '2024-09-18'),
(3, 3, 5, '2024-09-22'),
(3, 4, 4, '2024-09-25'),
(4, 2, 2, '2024-09-14'),
(4, 5, 3, '2024-09-16'),
(5, 1, 5, '2024-09-10'),
(5, 2, 5, '2024-09-12'),
(5, 3, 4, '2024-09-20');
🔹 Provera podataka
Kreirati upit za ispis svega što postoji u tabeli Ucenik
🔹 Ponavljanje gradiva
-
Izvedena kolona: kolona koja nije fizički u tabeli, već se dobija pomoću izraza ili funkcije.
Primer:SELECT Ime, Prezime, ProsecnaOcena * 20 AS Poeni FROM Ucenik; -
Redosled izračunavanja:
-
Zagrade
-
Množenje / Deljenje
-
Sabiranje / Oduzimanje
-
-
Funkcije:
-
String:
LEN,LEFT,RIGHT,UPPER,LOWER -
Datum:
GETDATE(),YEAR(),MONTH(),DAY() -
Numeričke:
ROUND,ABS,POWER -
Agregacione:
SUM,AVG,MIN,MAX,COUNT
-
Tipovi zadataka koji se rade u nastavku
-
Izvedene kolone (npr. izračunavanje godina učenika iz datuma rođenja)
-
Funkcije za stringove (npr.
UPPER(Ime) + ' ' + UPPER(Prezime)) -
Funkcije za datume (npr.
YEAR(GETDATE()) - YEAR(DatumRodjenja)) -
Agregacione funkcije (
AVG(Ocena),COUNT(*),MAX(Ocena), itd.) -
Grupisanje podataka po predmetima, učenicima, mestima
-
Filtriranje grupa pomoću
HAVING
Vežbe
🔹 Izvedene kolone i aritmetičke operacije
Zadatak 1: Prikazati ime, prezime i vrednost ocene pomnoženu sa 20 (pretpostaviti da to predstavlja broj poena).
Zadatak 2: Prikazati ime, prezime i broj godina svakog učenika (pretpostaviti da je tekuća godina 2025).
Zadatak 3: Prikazati ime, prezime i datum rođenja učenika, kao i godinu rođenja, mesec i dan kao posebne kolone.
🔹 Redosled izračunavanja
Zadatak 4:
Prikazati kolonu gde se prosečna ocena koriguje tako da se sabere 0.5, pa rezultat podeli sa 2.
🔹 Funkcije za rad sa stringovima
Zadatak 5: Prikazati ime i prezime velikim slovima, spojene u jednu kolonu pod nazivom PunoIme.
Zadatak 6: Prikazati samo prva tri slova imena svakog učenika.
Zadatak 7: Prikazati ime i dužinu svakog imena (broj slova) učenika.
🔹 Funkcije za rad sa datumima
Zadatak 8: Prikazati ime, prezime i godinu rođenja učenika (ko želi može još dodati i mesec rođenja učenika).
Zadatak 9: Prikazati učenike koji su rođeni posle 1. januara 2007. godine.
Zadatak 10: Prikazati datum rođenja učenika i dan u nedelji kada je rođen.
🔹 Numeričke funkcije
Zadatak 11: Prikazati ime i prezime učenika, kao i prosečnu ocenu, ALI treba zaokružiti prosečnu ocenu na 1 decimalno mesto.
Zadatak 12: Za svakog učenika prikazati ime i prezime, kao i kvadrat prosečne ocene.
Zadatak 13: Prikazati kvadratni koren fonda časova za svaki predmet.
Zadatak 12/13 v: Varijacija prethodna dva zadatka: raditi samo za učenike za koje postoji uneta prosečna ocena ...
🔹 Funkcije za agregaciju
Zadatak 14: Prikazati prosečnu ocenu svih učenika u školi.
Zadatak 15: Prikazati najmanju i najveću prosečnu ocenu od svih učenika u školi.
Zadatak 16: Prebrojati koliko učenika u školi ima poznatu prosečnu ocenu.
Zadatak 17: Prikazati broj različitih učenika koji imaju ocene u tabeli Ocena.
🔹 Grupisanje podataka (GROUP BY)
Zadatak 18: Prikazati prosečnu ocenu po razredima.
🔹 Filtriranje grupa (HAVING)
Zadatak 19: Prikazati prosečnu ocenu po razredima ALI samo one razrede čiji je prosek veći od 4.0.
Završni deo (Diskusija)
-
Zašto je važno znati redosled izračunavanja?
-
Koje funkcije se koriste za rad sa tekstom, a koje sa brojevima?
-
Šta radi
HAVING, a štaWHERE?
Predlog zadataka za samostalni rad kod kuće
🔸 Za slabije učenike
-
Prikazati imena svih učenika i njihovu godinu rođenja.
👉 Hint: koristiYEAR() -
Prikazati naziv i fond časova svakog predmeta.
-
Prikazati naziv predmeta i fond časova u minutima ako čas traje 45 minuta.
-
Prikazati sve učenike čije prezime ima više od 7 slova.
-
Prikazati sve učenike rođene u mesecu maju.
🔸 Za srednje učenike
-
Prikazati ime i prezime učenika, i broj dana od rođenja do danas (
DATEDIFF). -
Prikazati prosečnu ocenu po učeniku i zaokružiti je na 2 decimale (
ROUND). -
Prikazati sve predmete gde je fond časova manji od proseka svih fondova.
-
Prikazati sve učenike iz Niša i njihove prosečne ocene.
-
Prikazati koliko učenika ima ocenu 5.
🔸 Za bolje učenike
-
Prikazati ime učenika i prosečnu ocenu, sortirano od najboljeg do najlošijeg.
-
Prikazati učenike koji imaju barem 2 ocene u tabeli
Ocena. -
Prikazati predmete kod kojih nijedna ocena nije manja od 4.
-
Prikazati mesto i prosečnu ocenu učenika iz tog mesta (grupisanje po Mesto).
-
Prikazati ime učenika i dan u nedelji kada je poslednji put ocenjen.