13 tabel w czterech obszarach: placówka i władze, kadra dydaktyczna, organizacja zajęć oraz studenci z dziennikiem ocen. Poniżej diagram ERD, przykładowe dane i 28 typowych zapytań z wynikami.
placówkakadradydaktykastudenci i ocenyPK/FK/UQkursywa = NULL
jeden do wielu (o = opcjonalnie)
Najedź lub dotknij tabeli, aby podświetlić jej relacje. Wersja PNG do katalogu rozwiązań: erd.png.
Decyzje projektowe
wym. 1
Placówka i władze
uczelnia ma dane teleadresowe, sekretariat kontakt (wydzial_id NULL = sekretariat główny). Rektor i dziekani to funkcja_kierownicza z datami kadencji, więc historia zmian zostaje.
wym. 2
Pracownicy
PESEL i e-mail unikalne, konto jako IBAN (PL + 26 cyfr), data ustania stosunku pracy opcjonalna i nie wcześniejsza niż zatrudnienie. Adres w osobnej tabeli adres.
wym. 3 i 6
Tabela zajecia
Łączy przedmiot, prowadzącego, grupę i semestr. Daje to „wykładowca prowadzi wiele przedmiotów”, a oceny wiążą się od razu z grupą, przedmiotem i semestrem.
wym. 4 i 5
Studenci i grupy
Student należy do jednej grupy; numer albumu i PESEL są unikalne. Grupa ma nazwę, rocznik (YEAR) i opiekuna wskazującego na pracownik.
wym. 6
Dziennik i indeks
ocena_czastkowa przyjmuje wiele wpisów, ocena_koncowa jeden na studenta i zajęcia. Skala ocen 2.0–5.0 pilnowana przez CHECK.
do konsultacji
Czego baza nie wymusza
To, że oceniany student należy do grupy z zajęć, sprawdza zapytanie 24 (lub trigger). Do omówienia: studenci bez PESEL i student w kilku grupach naraz.
Dane przykładowe
Zawartość dane.sql. Dane są fikcyjne i generowane skryptem, więc spełniają wszystkie ograniczenia schematu.
Tabela
Wierszy
adres
11
uczelnia
1
wydzial
2
sekretariat
3
pracownik
10
funkcja_kierownicza
7
przedmiot
14
semestr
3
grupa
4
student
24
zajecia
29
ocena_czastkowa
574
ocena_koncowa
131
Uczelnia: fikcyjna Dolnośląska Akademia Nauk Stosowanych we Wrocławiu, 2 wydziały, 3 sekretariaty.
Kadra: 10 wykładowców, jedna osoba zwolniona w lutym 2026. Władze mają bieżące i zakończone kadencje.
Semestry: 2025/2026 zimowy i letni są zakończone i mają oceny końcowe. 2026/2027 zimowy trwa, więc ma tylko pierwsze oceny cząstkowe.
Identyfikatory: PESEL, NIP, REGON i IBAN mają poprawne sumy kontrolne; płeć studenta zgadza się z cyfrą w PESEL.
Celowy brak: jeden student nie ma oceny końcowej w zakończonym semestrze, żeby zapytanie 20 miało co pokazać.
Zapytania z wynikami
Zawartość zapytania.sql. Wyniki pochodzą z uruchomienia na danych przykładowych, z bieżącą datą 27.10.2026. Wartości oznaczone -- parametr można podmienić.
APlacówka i władze
01
Wizytówka uczelni: dane teleadresowe i wszystkie sekretariaty
Dane kontaktowe uczelni i wszystkich sekretariatów w jednym widoku. LEFT JOIN do wydziału, bo sekretariat rektora nie należy do żadnego wydziału.
JOINLEFT JOINCOALESCE
SELECT u.nazwa,
CONCAT(a.ulica, ' ', a.nr_domu, COALESCE(CONCAT('/', a.nr_lokalu), ''), ', ',
a.kod_pocztowy, ' ', a.miejscowosc) AS adres,
u.telefon, u.email, u.www,
COALESCE(w.nazwa, 'Rektorat') AS jednostka,
s.nazwa AS sekretariat,
s.telefon AS tel_sekretariatu,
s.email AS email_sekretariatu,
s.nr_pokoju, s.godziny_otwarcia
FROM uczelnia u
JOIN adres a ON a.id = u.adres_id
JOIN sekretariat s ON s.uczelnia_id = u.id
LEFT JOIN wydzial w ON w.id = s.wydzial_id
ORDER BY s.wydzial_id ISNOTNULL, w.nazwa;
3 wiersze
nazwa
adres
telefon
email
www
jednostka
sekretariat
tel_sekretariatu
email_sekretariatu
nr_pokoju
godziny_otwarcia
Dolnośląska Akademia Nauk Stosowanych
plac Uniwersytecki 3, 50-137 Wrocław
+48 71 375 20 00
kontakt@dans.edu.pl
https://dans.edu.pl
Rektorat
Sekretariat Rektora
+48 71 375 20 01
rektorat@dans.edu.pl
A-101
pn-pt 8:00-15:30
Dolnośląska Akademia Nauk Stosowanych
plac Uniwersytecki 3, 50-137 Wrocław
+48 71 375 20 00
kontakt@dans.edu.pl
https://dans.edu.pl
Wydział Informatyki i Telekomunikacji
Dziekanat WIT
+48 71 375 21 10
dziekanat.wit@dans.edu.pl
C-012
pn, śr, pt 9:00-14:00
Dolnośląska Akademia Nauk Stosowanych
plac Uniwersytecki 3, 50-137 Wrocław
+48 71 375 20 00
kontakt@dans.edu.pl
https://dans.edu.pl
Wydział Zarządzania
Dziekanat WZ
+48 71 375 22 10
dziekanat.wz@dans.edu.pl
B-004
wt, czw 10:00-15:00
02
Aktualne władze uczelni (rektor, prorektorzy, dziekani, prodziekani)
Kto dziś pełni funkcje kierownicze. Kadencja jest aktywna, gdy zaczęła się przed dziś i nie ma daty końca lub ta jest w przyszłości. FIELD() ustawia kolejność od rektora.
filtr datFIELD
SELECT f.funkcja,
COALESCE(w.nazwa, '— cała uczelnia —') AS jednostka,
CONCAT(p.tytul_naukowy, ' ', p.imie, ' ', p.nazwisko) AS osoba,
p.email, f.data_od
FROM funkcja_kierownicza f
JOIN pracownik p ON p.id = f.pracownik_id
LEFT JOIN wydzial w ON w.id = f.wydzial_id
WHERE f.data_od <= CURDATE()
AND (f.data_do ISNULLOR f.data_do >= CURDATE())
ORDER BYFIELD(f.funkcja, 'REKTOR', 'PROREKTOR', 'KANCLERZ', 'DZIEKAN', 'PRODZIEKAN'), w.nazwa;
5 wierszy
funkcja
jednostka
osoba
email
data_od
REKTOR
— cała uczelnia —
prof. dr hab. inż. Andrzej Wiśniewski
a.wisniewski@dans.edu.pl
2024-09-01
PROREKTOR
— cała uczelnia —
dr hab. Małgorzata Kowalczyk
m.kowalczyk@dans.edu.pl
2024-09-01
DZIEKAN
Wydział Informatyki i Telekomunikacji
dr hab. inż. Piotr Zieliński
p.zielinski@dans.edu.pl
2024-09-01
DZIEKAN
Wydział Zarządzania
prof. dr hab. Agnieszka Kamińska
a.kaminska@dans.edu.pl
2024-09-01
PRODZIEKAN
Wydział Informatyki i Telekomunikacji
dr inż. Tomasz Wójcik
t.wojcik@dans.edu.pl
2024-09-01
03
Historia funkcji kierowniczych na wydziale (kadencje)
Pełna historia kadencji na wydziale, łącznie z zakończonymi. Pokazuje, po co funkcje są osobną tabelą z datami zamiast kolumny „dziekan” w tabeli wydziału.
historia
SELECT f.funkcja, CONCAT(p.imie, ' ', p.nazwisko) AS osoba, f.data_od,
COALESCE(f.data_do, 'trwa') AS data_do
FROM funkcja_kierownicza f
JOIN pracownik p ON p.id = f.pracownik_id
WHERE f.wydzial_id = 1 -- parametr: wydziałORDER BY f.data_od DESC;
3 wiersze
funkcja
osoba
data_od
data_do
DZIEKAN
Piotr Zieliński
2024-09-01
trwa
PRODZIEKAN
Tomasz Wójcik
2024-09-01
trwa
DZIEKAN
Ewa Szymańska
2020-09-01
2024-08-31
BKadra
04
Aktywni pracownicy ze stażem pracy w latach
Aktywni pracownicy, czyli bez daty ustania stosunku pracy lub z datą w przyszłości, posortowani po stażu.
TIMESTAMPDIFF
SELECT p.id, p.tytul_naukowy, p.imie, p.nazwisko, p.email, p.telefon,
p.data_zatrudnienia,
TIMESTAMPDIFF(YEAR, p.data_zatrudnienia, CURDATE()) AS staz_lat
FROM pracownik p
WHERE p.data_zwolnienia ISNULLOR p.data_zwolnienia > CURDATE()
ORDER BY staz_lat DESC, p.nazwisko;
9 wierszy
id
tytul_naukowy
imie
nazwisko
email
telefon
data_zatrudnienia
staz_lat
1
prof. dr hab. inż.
Andrzej
Wiśniewski
a.wisniewski@dans.edu.pl
+48 663 614 624
1995-10-01
31
8
prof. dr hab.
Agnieszka
Kamińska
a.kaminska@dans.edu.pl
+48 779 374 784
1998-10-01
28
2
dr hab.
Małgorzata
Kowalczyk
m.kowalczyk@dans.edu.pl
+48 730 111 934
2001-02-15
25
3
dr hab. inż.
Piotr
Zieliński
p.zielinski@dans.edu.pl
+48 795 416 125
2003-10-01
23
4
dr inż.
Ewa
Szymańska
e.szymanska@dans.edu.pl
+48 788 590 625
2008-10-01
18
9
dr
Paweł
Jankowski
p.jankowski@dans.edu.pl
+48 581 238 902
2010-10-01
16
5
dr inż.
Tomasz
Wójcik
t.wojcik@dans.edu.pl
+48 628 673 511
2012-10-01
14
7
dr
Marcin
Dąbrowski
m.dabrowski@dans.edu.pl
+48 636 610 479
2014-03-01
12
6
mgr inż.
Katarzyna
Lewandowska
k.lewandowska@dans.edu.pl
+48 633 809 597
2016-10-01
10
05
Pracownicy, z którymi rozwiązano stosunek pracy
Byli pracownicy. Dane zostają w bazie, bo są powiązane z zajęciami i ocenami z przeszłości.
filtr dat
SELECT p.imie, p.nazwisko, p.data_zatrudnienia, p.data_zwolnienia
FROM pracownik p
WHERE p.data_zwolnienia <= CURDATE()
ORDER BY p.data_zwolnienia DESC;
1 wiersz
imie
nazwisko
data_zatrudnienia
data_zwolnienia
Joanna
Mazur
2021-10-01
2026-02-28
06
Lista do wypłat (kadry / księgowość): aktywni pracownicy z kontem i adresem
Zestawienie dla kadr i księgowości: PESEL, IBAN i adres zamieszkania aktywnych pracowników.
JOINdane wrażliwe
SELECT p.nazwisko, p.imie, p.pesel, p.nr_konta,
CONCAT(a.ulica, ' ', a.nr_domu, COALESCE(CONCAT('/', a.nr_lokalu), ''), ', ',
a.kod_pocztowy, ' ', a.miejscowosc) AS adres_zamieszkania
FROM pracownik p
JOIN adres a ON a.id = p.adres_id
WHERE p.data_zwolnienia ISNULLOR p.data_zwolnienia > CURDATE()
ORDER BY p.nazwisko, p.imie;
9 wierszy
nazwisko
imie
pesel
nr_konta
adres_zamieszkania
Dąbrowski
Marcin
83120214917
PL06109010143627010798193319
ul. Kościuszki 150/8, 50-439 Wrocław
Jankowski
Paweł
79061416374
PL62105000864866283601610550
ul. Borowska 203/51, 50-556 Wrocław
Kamińska
Agnieszka
68042115601
PL91114020042059972837929841
ul. Polna 14, 55-040 Kobierzyce
Kowalczyk
Małgorzata
72070411402
PL22249010445364556815188447
ul. Powstańców Śląskich 118/4, 53-333 Wrocław
Lewandowska
Katarzyna
90090814225
PL64249010448768045717847267
ul. Wrocławska 7, 55-095 Długołęka
Szymańska
Ewa
81013012866
PL18105000860932081967273177
ul. Legnicka 65/27, 54-206 Wrocław
Wiśniewski
Andrzej
64031210711
PL39109010143998698797309114
ul. Grunwaldzka 41/12, 50-357 Wrocław
Wójcik
Tomasz
85051713594
PL28114020048876634400297875
ul. Ślężna 22/3, 53-302 Wrocław
Zieliński
Piotr
75112312136
PL64114020045761698716897684
ul. Kasprowicza 9, 51-137 Wrocław
07
Przedmioty prowadzone przez każdego wykładowcę w bieżącym semestrze
Odpowiedź na wymaganie 3: jeden wykładowca prowadzi kilka przedmiotów. Bieżący semestr wybierany jest po dacie, bez wpisywania jego id.
GROUP BYGROUP_CONCAT
SELECTCONCAT(p.imie, ' ', p.nazwisko) AS wykladowca,
COUNT(*) AS liczba_zajec,
GROUP_CONCAT(CONCAT(pr.nazwa, ' (', g.nazwa, ')')
ORDER BY pr.nazwa SEPARATOR', ') AS zajecia
FROM zajecia z
JOIN pracownik p ON p.id = z.pracownik_id
JOIN przedmiot pr ON pr.id = z.przedmiot_id
JOIN grupa g ON g.id = z.grupa_id
JOIN semestr s ON s.id = z.semestr_id
WHERECURDATE() BETWEEN s.data_od AND s.data_do
GROUP BY p.id, p.imie, p.nazwisko
ORDER BY liczba_zajec DESC, wykladowca;
Obciążenie dydaktyczne w roku akademickim: zajęcia, grupy, studenci
Obciążenie w całym roku akademickim: liczba zajęć, różnych przedmiotów, grup i studentów na zajęciach.
COUNT DISTINCT
SELECTCONCAT(p.imie, ' ', p.nazwisko) AS wykladowca,
COUNT(DISTINCT z.id) AS zajecia,
COUNT(DISTINCT z.przedmiot_id) AS rozne_przedmioty,
COUNT(DISTINCT z.grupa_id) AS grupy,
COUNT(st.id) AS studentow_na_zajeciach
FROM pracownik p
JOIN zajecia z ON z.pracownik_id = p.id
JOIN semestr s ON s.id = z.semestr_id
JOIN student st ON st.grupa_id = z.grupa_id
WHERE s.rok_akademicki = '2025/2026'-- parametrGROUP BY p.id, p.imie, p.nazwisko
ORDER BY zajecia DESC;
10 wierszy
wykladowca
zajecia
rozne_przedmioty
grupy
studentow_na_zajeciach
Piotr Zieliński
3
1
3
18
Katarzyna Lewandowska
3
3
2
18
Marcin Dąbrowski
3
1
3
18
Małgorzata Kowalczyk
2
1
2
12
Ewa Szymańska
2
1
2
12
Tomasz Wójcik
2
2
2
12
Agnieszka Kamińska
2
2
1
12
Paweł Jankowski
2
2
1
12
Joanna Mazur
2
1
2
12
Andrzej Wiśniewski
1
1
1
6
09
Aktywni wykładowcy bez zajęć w bieżącym semestrze
Aktywni pracownicy bez żadnych zajęć w bieżącym semestrze, np. przy planowaniu obsady.
NOT EXISTS
SELECT p.imie, p.nazwisko, p.email
FROM pracownik p
WHERE (p.data_zwolnienia ISNULLOR p.data_zwolnienia > CURDATE())
ANDNOTEXISTS (
SELECT 1
FROM zajecia z
JOIN semestr s ON s.id = z.semestr_id
WHERE z.pracownik_id = p.id
ANDCURDATE() BETWEEN s.data_od AND s.data_do);
4 wiersze
imie
nazwisko
email
Małgorzata
Kowalczyk
m.kowalczyk@dans.edu.pl
Piotr
Zieliński
p.zielinski@dans.edu.pl
Marcin
Dąbrowski
m.dabrowski@dans.edu.pl
Agnieszka
Kamińska
a.kaminska@dans.edu.pl
CGrupy, studenci, plan zajęć
10
Grupy z opiekunem i liczbą studentów
Wymaganie 5: grupa ma nazwę, rocznik i opiekuna. LEFT JOIN do studentów, żeby pusta grupa też się pokazała.
LEFT JOINGROUP BY
SELECT g.nazwa, g.rocznik, w.skrot AS wydzial,
CONCAT(p.tytul_naukowy, ' ', p.imie, ' ', p.nazwisko) AS opiekun,
COUNT(st.id) AS liczba_studentow
FROM grupa g
JOIN wydzial w ON w.id = g.wydzial_id
JOIN pracownik p ON p.id = g.opiekun_id
LEFT JOIN student st ON st.grupa_id = g.id
GROUP BY g.id, g.nazwa, g.rocznik, w.skrot, p.tytul_naukowy, p.imie, p.nazwisko
ORDER BY g.rocznik, g.nazwa;
4 wiersze
nazwa
rocznik
wydzial
opiekun
liczba_studentow
INF-2A
2024
WIT
dr Marcin Dąbrowski
6
INF-1A
2025
WIT
dr inż. Ewa Szymańska
6
INF-1B
2025
WIT
dr inż. Tomasz Wójcik
6
ZAR-1A
2025
WZ
dr Paweł Jankowski
6
11
Lista studentów grupy (np. lista obecności)
Lista studentów jednej grupy z wiekiem liczonym z daty urodzenia, np. jako lista obecności.
TIMESTAMPDIFF
SELECT st.nr_albumu, st.nazwisko, st.imie,
TIMESTAMPDIFF(YEAR, st.data_urodzenia, CURDATE()) AS wiek
FROM student st
JOIN grupa g ON g.id = st.grupa_id
WHERE g.nazwa = 'INF-1A'-- parametrORDER BY st.nazwisko, st.imie;
6 wierszy
nr_albumu
nazwisko
imie
wiek
251002
Duda
Julia
19
251005
Michalski
Szymon
19
251001
Nowicki
Jakub
20
251006
Rutkowska
Hanna
20
251004
Sikora
Maja
19
251003
Tomaszewski
Antoni
20
12
Wyszukiwanie studenta po nazwisku, numerze albumu lub PESEL
Wyszukiwarka dziekanatu: po fragmencie nazwiska, numerze albumu lub PESEL. Wszystkie trzy kolumny mają indeks.
LIKEOR
SELECT st.id, st.nr_albumu, st.imie, st.nazwisko, st.pesel, g.nazwa AS grupa
FROM student st
JOIN grupa g ON g.id = st.grupa_id
WHERE st.nazwisko LIKE'Now%'-- parametrOR st.nr_albumu = '251001'-- parametrOR st.pesel = '00000000000'; -- parametr
2 wiersze
id
nr_albumu
imie
nazwisko
pesel
grupa
1
251001
Jakub
Nowicki
06261441134
INF-1A
15
243015
Wojciech
Nowak
05301556597
INF-2A
13
Plan zajęć grupy w bieżącym semestrze (przedmiot, ECTS, prowadzący)
Plan zajęć grupy w bieżącym semestrze z punktami ECTS i prowadzącym.
JOIN ×4
SELECT pr.kod, pr.nazwa AS przedmiot, pr.punkty_ects,
CONCAT(p.tytul_naukowy, ' ', p.imie, ' ', p.nazwisko) AS prowadzacy
FROM zajecia z
JOIN przedmiot pr ON pr.id = z.przedmiot_id
JOIN pracownik p ON p.id = z.pracownik_id
JOIN grupa g ON g.id = z.grupa_id
JOIN semestr s ON s.id = z.semestr_id
WHERE g.nazwa = 'INF-1A'-- parametrANDCURDATE() BETWEEN s.data_od AND s.data_do
ORDER BY pr.nazwa;
2 wiersze
kod
przedmiot
punkty_ects
prowadzacy
INF-IO
Inżynieria oprogramowania
4
dr inż. Tomasz Wójcik
INF-SI
Sztuczna inteligencja
5
prof. dr hab. inż. Andrzej Wiśniewski
DDziennik i indeks
14
Dziennik: oceny cząstkowe studenta z jednego przedmiotu w semestrze
Wymaganie 6, widok studenta: jego oceny cząstkowe z jednego przedmiotu w jednym semestrze.
dziennik
SELECT oc.data_wystawienia, oc.opis, oc.wartosc
FROM ocena_czastkowa oc
JOIN zajecia z ON z.id = oc.zajecia_id
JOIN przedmiot pr ON pr.id = z.przedmiot_id
WHERE oc.student_id = 1 -- parametrAND pr.kod = 'INF-BD'-- parametrAND z.semestr_id = 2 -- parametrORDER BY oc.data_wystawienia;
4 wiersze
data_wystawienia
opis
wartosc
2026-03-14
kolokwium 1
3.5
2026-04-07
kolokwium 2
3.0
2026-04-29
laboratorium
3.5
2026-05-19
projekt
3.5
15
Dziennik grupy: średnia cząstkowych i liczba ocen każdego studenta
Widok prowadzącego: dla każdego studenta grupy liczba ocen, średnia i ciąg ocen w kolejności wystawienia.
LEFT JOINAVGGROUP_CONCAT
-- z każdego przedmiotu (widok prowadzącego)SELECT pr.nazwa AS przedmiot, st.nazwisko, st.imie,
COUNT(oc.id) AS liczba_ocen,
ROUND(AVG(oc.wartosc), 2) AS srednia_czastkowych,
GROUP_CONCAT(oc.wartosc ORDER BY oc.data_wystawienia SEPARATOR' | ') AS oceny
FROM zajecia z
JOIN przedmiot pr ON pr.id = z.przedmiot_id
JOIN student st ON st.grupa_id = z.grupa_id
LEFT JOIN ocena_czastkowa oc ON oc.zajecia_id = z.id AND oc.student_id = st.id
WHERE z.grupa_id = 1 -- parametrAND z.semestr_id = 2 -- parametrGROUP BY pr.nazwa, st.id, st.nazwisko, st.imie
ORDER BY pr.nazwa, st.nazwisko;
18 wierszy
przedmiot
nazwisko
imie
liczba_ocen
srednia_czastkowych
oceny
Algorytmy i struktury danych
Duda
Julia
4
3.63
4.0 | 3.5 | 3.5 | 3.5
Algorytmy i struktury danych
Michalski
Szymon
4
3.63
4.0 | 3.0 | 4.5 | 3.0
Algorytmy i struktury danych
Nowicki
Jakub
4
3.38
3.5 | 4.0 | 2.0 | 4.0
Algorytmy i struktury danych
Rutkowska
Hanna
4
3.75
5.0 | 3.5 | 3.5 | 3.0
Algorytmy i struktury danych
Sikora
Maja
4
3.25
3.0 | 3.0 | 3.5 | 3.5
Algorytmy i struktury danych
Tomaszewski
Antoni
4
3.0
3.5 | 2.0 | 3.0 | 3.5
Bazy danych
Duda
Julia
4
3.38
3.0 | 3.5 | 3.5 | 3.5
Bazy danych
Michalski
Szymon
4
3.0
3.0 | 3.5 | 3.5 | 2.0
Bazy danych
Nowicki
Jakub
4
3.38
3.5 | 3.0 | 3.5 | 3.5
Bazy danych
Rutkowska
Hanna
4
3.63
4.0 | 3.5 | 3.5 | 3.5
Bazy danych
Sikora
Maja
4
3.13
3.5 | 3.5 | 3.5 | 2.0
Bazy danych
Tomaszewski
Antoni
4
3.25
3.0 | 3.5 | 3.0 | 3.5
Systemy operacyjne
Duda
Julia
4
4.0
4.5 | 4.0 | 3.5 | 4.0
Systemy operacyjne
Michalski
Szymon
4
3.63
4.0 | 4.0 | 3.0 | 3.5
Systemy operacyjne
Nowicki
Jakub
4
3.88
4.5 | 4.5 | 3.0 | 3.5
Systemy operacyjne
Rutkowska
Hanna
4
4.0
4.5 | 4.0 | 3.5 | 4.0
Systemy operacyjne
Sikora
Maja
4
3.75
3.5 | 4.0 | 4.5 | 3.0
Systemy operacyjne
Tomaszewski
Antoni
4
3.5
3.0 | 4.0 | 3.5 | 3.5
16
Indeks studenta: oceny końcowe ze wszystkich semestrów
Indeks studenta: oceny końcowe ze wszystkich semestrów, z punktami ECTS i prowadzącym.
indeks
SELECT s.rok_akademicki, s.typ AS semestr, pr.nazwa AS przedmiot, pr.punkty_ects,
ok.wartosc AS ocena_koncowa, ok.data_wystawienia,
CONCAT(p.imie, ' ', p.nazwisko) AS wystawil_prowadzacy
FROM ocena_koncowa ok
JOIN zajecia z ON z.id = ok.zajecia_id
JOIN semestr s ON s.id = z.semestr_id
JOIN przedmiot pr ON pr.id = z.przedmiot_id
JOIN pracownik p ON p.id = z.pracownik_id
WHERE ok.student_id = 1 -- parametrORDER BY s.data_od, pr.nazwa;
6 wierszy
rok_akademicki
semestr
przedmiot
punkty_ects
ocena_koncowa
data_wystawienia
wystawil_prowadzacy
2025/2026
ZIMOWY
Matematyka dyskretna
6
4.0
2026-02-08
Małgorzata Kowalczyk
2025/2026
ZIMOWY
Programowanie obiektowe
6
3.0
2026-02-08
Tomasz Wójcik
2025/2026
ZIMOWY
Sieci komputerowe
5
4.5
2026-02-08
Joanna Mazur
2025/2026
LETNI
Algorytmy i struktury danych
6
3.5
2026-07-03
Piotr Zieliński
2025/2026
LETNI
Bazy danych
5
3.5
2026-07-03
Ewa Szymańska
2025/2026
LETNI
Systemy operacyjne
5
4.0
2026-07-03
Marcin Dąbrowski
17
Średnia semestralna studentów ważona punktami ECTS
Średnia semestralna ważona punktami ECTS oraz suma zaliczonych ECTS, liczona tylko z ocen co najmniej 3.0.
średnia ważonaCASE
-- (ECTS zaliczone liczone tylko z ocen pozytywnych)SELECT s.rok_akademicki, s.typ, g.nazwa AS grupa, st.nr_albumu, st.nazwisko, st.imie,
ROUND(SUM(ok.wartosc * pr.punkty_ects) / SUM(pr.punkty_ects), 2) AS srednia_wazona,
SUM(CASEWHEN ok.wartosc >= 3.0 THEN pr.punkty_ects ELSE 0 END) AS ects_zaliczone
FROM ocena_koncowa ok
JOIN zajecia z ON z.id = ok.zajecia_id
JOIN semestr s ON s.id = z.semestr_id
JOIN przedmiot pr ON pr.id = z.przedmiot_id
JOIN student st ON st.id = ok.student_id
JOIN grupa g ON g.id = st.grupa_id
WHERE s.id = 2 -- parametr: semestrGROUP BY s.rok_akademicki, s.typ, g.nazwa, st.id, st.nr_albumu, st.nazwisko, st.imie
ORDER BY g.nazwa, srednia_wazona DESC;
24 wiersze
rok_akademicki
typ
grupa
nr_albumu
nazwisko
imie
srednia_wazona
ects_zaliczone
2025/2026
LETNI
INF-1A
251002
Duda
Julia
3.84
16
2025/2026
LETNI
INF-1A
251001
Nowicki
Jakub
3.66
16
2025/2026
LETNI
INF-1A
251006
Rutkowska
Hanna
3.66
16
2025/2026
LETNI
INF-1A
251005
Michalski
Szymon
3.34
16
2025/2026
LETNI
INF-1A
251004
Sikora
Maja
3.16
16
2025/2026
LETNI
INF-1A
251003
Tomaszewski
Antoni
3.0
16
2025/2026
LETNI
INF-1B
252011
Zając
Kacper
4.66
16
2025/2026
LETNI
INF-1B
252008
Olszewska
Lena
4.31
16
2025/2026
LETNI
INF-1B
252010
Pawlak
Alicja
4.31
16
2025/2026
LETNI
INF-1B
252007
Czarnecki
Filip
3.66
16
2025/2026
LETNI
INF-1B
252012
Górska
Oliwia
3.34
16
2025/2026
LETNI
INF-1B
252009
Malinowski
Jan
2.88
11
2025/2026
LETNI
INF-2A
243018
Kowalska
Amelia
5.0
14
2025/2026
LETNI
INF-2A
243013
Grabowski
Mikołaj
4.68
14
2025/2026
LETNI
INF-2A
243015
Nowak
Wojciech
4.54
14
2025/2026
LETNI
INF-2A
243016
Król
Wiktoria
3.5
14
2025/2026
LETNI
INF-2A
243014
Majewska
Natalia
3.07
10
2025/2026
LETNI
INF-2A
243017
Wieczorek
Igor
3.0
9
2025/2026
LETNI
ZAR-1A
254024
Szewczyk
Zofia
5.0
10
2025/2026
LETNI
ZAR-1A
254022
Pietrzak
Emilia
4.7
10
2025/2026
LETNI
ZAR-1A
254020
Baran
Laura
4.5
10
2025/2026
LETNI
ZAR-1A
254019
Stępień
Adam
4.2
10
2025/2026
LETNI
ZAR-1A
254021
Wróbel
Bartosz
3.5
10
2025/2026
LETNI
ZAR-1A
254023
Jabłoński
Oskar
3.3
10
18
Ranking studentów w grupach (np. do stypendium rektora) — funkcje okna
Ranking studentów w każdej grupie za cały rok, np. do stypendium rektora. RANK() daje to samo miejsce przy równych średnich.
RANK() OVERpodzapytanie
SELECT grupa, nr_albumu, nazwisko, imie, srednia,
RANK() OVER (PARTITION BY grupa ORDER BY srednia DESC) AS miejsce_w_grupie
FROM (
SELECT g.nazwa AS grupa, st.nr_albumu, st.nazwisko, st.imie,
ROUND(SUM(ok.wartosc * pr.punkty_ects) / SUM(pr.punkty_ects), 2) AS srednia
FROM ocena_koncowa ok
JOIN zajecia z ON z.id = ok.zajecia_id
JOIN przedmiot pr ON pr.id = z.przedmiot_id
JOIN student st ON st.id = ok.student_id
JOIN grupa g ON g.id = st.grupa_id
JOIN semestr s ON s.id = z.semestr_id
WHERE s.rok_akademicki = '2025/2026'-- parametrGROUP BY g.nazwa, st.id, st.nr_albumu, st.nazwisko, st.imie
) AS srednie
ORDER BY grupa, miejsce_w_grupie;
24 wiersze
grupa
nr_albumu
nazwisko
imie
srednia
miejsce_w_grupie
INF-1A
251002
Duda
Julia
3.92
1
INF-1A
251006
Rutkowska
Hanna
3.74
2
INF-1A
251001
Nowicki
Jakub
3.73
3
INF-1A
251005
Michalski
Szymon
3.58
4
INF-1A
251003
Tomaszewski
Antoni
3.42
5
INF-1A
251004
Sikora
Maja
3.42
5
INF-1B
252011
Zając
Kacper
4.76
1
INF-1B
252008
Olszewska
Lena
4.48
2
INF-1B
252010
Pawlak
Alicja
4.23
3
INF-1B
252007
Czarnecki
Filip
3.91
4
INF-1B
252012
Górska
Oliwia
3.61
5
INF-1B
252009
Malinowski
Jan
2.76
6
INF-2A
243018
Kowalska
Amelia
5.0
1
INF-2A
243015
Nowak
Wojciech
4.52
2
INF-2A
243013
Grabowski
Mikołaj
4.23
3
INF-2A
243016
Król
Wiktoria
3.12
4
INF-2A
243017
Wieczorek
Igor
3.08
5
INF-2A
243014
Majewska
Natalia
3.05
6
ZAR-1A
254022
Pietrzak
Emilia
4.86
1
ZAR-1A
254024
Szewczyk
Zofia
4.74
2
ZAR-1A
254020
Baran
Laura
4.36
3
ZAR-1A
254019
Stępień
Adam
4.21
4
ZAR-1A
254021
Wróbel
Bartosz
3.5
5
ZAR-1A
254023
Jabłoński
Oskar
3.29
6
19
Studenci z oceną niedostateczną (2.0) — lista do poprawek / warunku
Oceny niedostateczne z ocen końcowych: lista do poprawek albo wpisu warunkowego.
filtr
SELECT s.rok_akademicki, s.typ, g.nazwa AS grupa, st.nr_albumu, st.nazwisko, st.imie,
pr.nazwa AS przedmiot, CONCAT(p.imie, ' ', p.nazwisko) AS prowadzacy
FROM ocena_koncowa ok
JOIN zajecia z ON z.id = ok.zajecia_id
JOIN semestr s ON s.id = z.semestr_id
JOIN przedmiot pr ON pr.id = z.przedmiot_id
JOIN pracownik p ON p.id = z.pracownik_id
JOIN student st ON st.id = ok.student_id
JOIN grupa g ON g.id = st.grupa_id
WHERE ok.wartosc = 2.0
ORDER BY s.data_od, g.nazwa, st.nazwisko;
6 wierszy
rok_akademicki
typ
grupa
nr_albumu
nazwisko
imie
przedmiot
prowadzacy
2025/2026
ZIMOWY
INF-1B
252009
Malinowski
Jan
Matematyka dyskretna
Małgorzata Kowalczyk
2025/2026
ZIMOWY
INF-2A
243016
Król
Wiktoria
Algorytmy i struktury danych
Piotr Zieliński
2025/2026
ZIMOWY
INF-2A
243014
Majewska
Natalia
Bazy danych
Ewa Szymańska
2025/2026
LETNI
INF-1B
252009
Malinowski
Jan
Systemy operacyjne
Marcin Dąbrowski
2025/2026
LETNI
INF-2A
243014
Majewska
Natalia
Inżynieria oprogramowania
Tomasz Wójcik
2025/2026
LETNI
INF-2A
243017
Wieczorek
Igor
Sztuczna inteligencja
Andrzej Wiśniewski
20
Brakujące wpisy: zakończone zajęcia, z których student nie ma oceny końcowej
Zakończone zajęcia, z których student nie ma oceny końcowej. W danych przykładowych jest jeden celowy brak.
LEFT JOIN … IS NULL
SELECT s.rok_akademicki, s.typ, g.nazwa AS grupa, pr.nazwa AS przedmiot,
st.nr_albumu, st.nazwisko, st.imie, CONCAT(p.imie, ' ', p.nazwisko) AS prowadzacy
FROM zajecia z
JOIN semestr s ON s.id = z.semestr_id
JOIN przedmiot pr ON pr.id = z.przedmiot_id
JOIN pracownik p ON p.id = z.pracownik_id
JOIN grupa g ON g.id = z.grupa_id
JOIN student st ON st.grupa_id = z.grupa_id
LEFT JOIN ocena_koncowa ok ON ok.zajecia_id = z.id AND ok.student_id = st.id
WHERE s.data_do < CURDATE()
AND ok.id ISNULL;
1 wiersz
rok_akademicki
typ
grupa
przedmiot
nr_albumu
nazwisko
imie
prowadzacy
2025/2026
ZIMOWY
ZAR-1A
Podstawy zarządzania
254021
Wróbel
Bartosz
Agnieszka Kamińska
21
Statystyki przedmiotów: średnia, rozkład ocen końcowych i zdawalność
Statystyki przedmiotu w semestrze: średnia, rozkład ocen i odsetek zdających. W MySQL wyrażenie logiczne to 0/1, więc SUM liczy wystąpienia.
SUM(warunek)AVG
SELECT pr.nazwa AS przedmiot, s.rok_akademicki, s.typ,
COUNT(*) AS ocen,
ROUND(AVG(ok.wartosc), 2) AS srednia,
SUM(ok.wartosc = 5.0) AS bdb,
SUM(ok.wartosc IN (4.0, 4.5)) AS db,
SUM(ok.wartosc IN (3.0, 3.5)) AS dst,
SUM(ok.wartosc = 2.0) AS ndst,
ROUND(100 * AVG(ok.wartosc >= 3.0), 1) AS zdawalnosc_proc
FROM ocena_koncowa ok
JOIN zajecia z ON z.id = ok.zajecia_id
JOIN przedmiot pr ON pr.id = z.przedmiot_id
JOIN semestr s ON s.id = z.semestr_id
GROUP BY pr.id, pr.nazwa, s.id, s.rok_akademicki, s.typ
ORDER BY s.id, zdawalnosc_proc, pr.nazwa;
16 wierszy
przedmiot
rok_akademicki
typ
ocen
srednia
bdb
db
dst
ndst
zdawalnosc_proc
Algorytmy i struktury danych
2025/2026
ZIMOWY
6
3.67
1
2
2
1
83.3
Bazy danych
2025/2026
ZIMOWY
6
3.58
1
1
3
1
83.3
Matematyka dyskretna
2025/2026
ZIMOWY
12
4.0
1
9
1
1
91.7
Mikroekonomia
2025/2026
ZIMOWY
6
4.08
1
3
2
0
100.0
Podstawy zarządzania
2025/2026
ZIMOWY
5
4.3
1
3
1
0
100.0
Programowanie obiektowe
2025/2026
ZIMOWY
12
3.71
1
3
8
0
100.0
Sieci komputerowe
2025/2026
ZIMOWY
12
4.13
1
8
3
0
100.0
Systemy operacyjne
2025/2026
ZIMOWY
6
3.92
1
2
3
0
100.0
Inżynieria oprogramowania
2025/2026
LETNI
6
3.67
1
2
2
1
83.3
Sztuczna inteligencja
2025/2026
LETNI
6
3.67
1
2
2
1
83.3
Systemy operacyjne
2025/2026
LETNI
12
3.75
1
5
5
1
91.7
Algorytmy i struktury danych
2025/2026
LETNI
12
3.63
0
4
8
0
100.0
Bazy danych
2025/2026
LETNI
12
3.58
1
3
8
0
100.0
Marketing
2025/2026
LETNI
6
4.25
2
2
2
0
100.0
Rachunkowość finansowa
2025/2026
LETNI
6
4.17
1
3
2
0
100.0
Sieci komputerowe
2025/2026
LETNI
6
4.5
3
3
0
0
100.0
22
Porównanie: średnia cząstkowych a ocena końcowa (kontrola rozbieżności >= 0.5)
Kontrola jakości: ocena końcowa różni się od średniej cząstkowych o co najmniej 0.5.
HAVING
SELECT st.nazwisko, st.imie, pr.nazwa AS przedmiot, s.rok_akademicki, s.typ,
ROUND(AVG(oc.wartosc), 2) AS srednia_czastkowych,
ok.wartosc AS ocena_koncowa
FROM ocena_koncowa ok
JOIN zajecia z ON z.id = ok.zajecia_id
JOIN semestr s ON s.id = z.semestr_id
JOIN przedmiot pr ON pr.id = z.przedmiot_id
JOIN student st ON st.id = ok.student_id
JOIN ocena_czastkowa oc ON oc.zajecia_id = ok.zajecia_id AND oc.student_id = ok.student_id
GROUP BY ok.id, st.nazwisko, st.imie, pr.nazwa, s.rok_akademicki, s.typ, ok.wartosc
HAVINGABS(AVG(oc.wartosc) - ok.wartosc) >= 0.5
ORDER BYABS(AVG(oc.wartosc) - ok.wartosc) DESC;
11 wierszy
nazwisko
imie
przedmiot
rok_akademicki
typ
srednia_czastkowych
ocena_koncowa
Malinowski
Jan
Matematyka dyskretna
2025/2026
ZIMOWY
2.88
2.0
Majewska
Natalia
Bazy danych
2025/2026
ZIMOWY
2.63
2.0
Wieczorek
Igor
Sztuczna inteligencja
2025/2026
LETNI
2.63
2.0
Rutkowska
Hanna
Sieci komputerowe
2025/2026
ZIMOWY
4.5
4.0
Pawlak
Alicja
Matematyka dyskretna
2025/2026
ZIMOWY
4.5
4.0
Zając
Kacper
Sieci komputerowe
2025/2026
ZIMOWY
5.0
4.5
Jabłoński
Oskar
Podstawy zarządzania
2025/2026
ZIMOWY
3.5
3.0
Szewczyk
Zofia
Podstawy zarządzania
2025/2026
ZIMOWY
5.0
4.5
Baran
Laura
Mikroekonomia
2025/2026
ZIMOWY
4.5
4.0
Tomaszewski
Antoni
Systemy operacyjne
2025/2026
LETNI
3.5
3.0
Wieczorek
Igor
Inżynieria oprogramowania
2025/2026
LETNI
2.5
3.0
23
Bieżący semestr: kto nie ma jeszcze żadnej oceny cząstkowej z danych zajęć
Bieżący semestr: studenci, którzy z danych zajęć nie mają jeszcze żadnej oceny cząstkowej.
NOT EXISTS
SELECT g.nazwa AS grupa, pr.nazwa AS przedmiot, st.nr_albumu, st.nazwisko, st.imie
FROM zajecia z
JOIN semestr s ON s.id = z.semestr_id
JOIN przedmiot pr ON pr.id = z.przedmiot_id
JOIN grupa g ON g.id = z.grupa_id
JOIN student st ON st.grupa_id = z.grupa_id
WHERECURDATE() BETWEEN s.data_od AND s.data_do
ANDNOTEXISTS (SELECT 1 FROM ocena_czastkowa oc
WHERE oc.zajecia_id = z.id AND oc.student_id = st.id)
ORDER BY g.nazwa, pr.nazwa, st.nazwisko;
8 wierszy
grupa
przedmiot
nr_albumu
nazwisko
imie
INF-1A
Inżynieria oprogramowania
251001
Nowicki
Jakub
INF-1A
Sztuczna inteligencja
251001
Nowicki
Jakub
INF-1A
Sztuczna inteligencja
251003
Tomaszewski
Antoni
INF-1B
Inżynieria oprogramowania
252009
Malinowski
Jan
INF-2A
Projekt zespołowy
243013
Grabowski
Mikołaj
ZAR-1A
Rachunkowość finansowa
254020
Baran
Laura
ZAR-1A
Rachunkowość finansowa
254024
Szewczyk
Zofia
ZAR-1A
Zarządzanie projektami
254020
Baran
Laura
EKontrola spójności
24
Oceny wystawione studentom spoza grupy, dla której prowadzone są zajęcia
Reguła, której schemat nie wymusza kluczem obcym: oceniany student musi należeć do grupy z zajęć. Poprawne dane dają 0 wierszy.
UNION ALLspójność
SELECT'cząstkowa'AS rodzaj, oc.id, oc.student_id, oc.zajecia_id
FROM ocena_czastkowa oc
JOIN zajecia z ON z.id = oc.zajecia_id
JOIN student st ON st.id = oc.student_id
WHERE st.grupa_id <> z.grupa_id
UNION ALLSELECT'końcowa', ok.id, ok.student_id, ok.zajecia_id
FROM ocena_koncowa ok
JOIN zajecia z ON z.id = ok.zajecia_id
JOIN student st ON st.id = ok.student_id
WHERE st.grupa_id <> z.grupa_id;
0 wierszy Dane są spójne.
25
Zajęcia przypisane wykładowcy, który w trakcie semestru już nie pracował
Zajęcia w semestrze, który zaczął się po zwolnieniu prowadzącego. Poprawne dane dają 0 wierszy.
spójność
SELECT z.id, CONCAT(p.imie, ' ', p.nazwisko) AS wykladowca, p.data_zwolnienia,
s.rok_akademicki, s.typ
FROM zajecia z
JOIN pracownik p ON p.id = z.pracownik_id
JOIN semestr s ON s.id = z.semestr_id
WHERE p.data_zwolnienia < s.data_od;
0 wierszy Dane są spójne.
FOperacje zapisu
26
Wpis oceny cząstkowej do dziennika
Wpis oceny do dziennika. CHECK odrzuci wartość spoza skali 2.0–5.0.