Turniej E-sportowy - baza SQL

Struktura bazy danych

druzyny

CREATE TABLE druzyny ( id_druzyny INT PRIMARY KEY, nazwa VARCHAR(50), miasto VARCHAR(50), kapitan VARCHAR(30) ); INSERT INTO druzyny VALUES (1,'CyberWarriors','Warszawa','Janek'), (2,'PixelMasters','Kraków','Anna'), (3,'GameOver','Gdańsk','Piotr'), (4,'NoobSlayers','Poznań','Ewa');

zawodnicy

CREATE TABLE zawodnicy ( id_zawodnika INT PRIMARY KEY, imie VARCHAR(30), nick VARCHAR(30), id_druzyny INT, rola VARCHAR(20), FOREIGN KEY (id_druzyny) REFERENCES druzyny(id_druzyny) ); INSERT INTO zawodnicy VALUES (1,'Jan','Shadow','1','Sniper'), (2,'Anna','PixelQueen','2','Support'), (3,'Piotr','Destroyer','3','Carry'), (4,'Ewa','NoobKiller','4','Tank'), (5,'Tomasz','Flash','1','Carry'), (6,'Kasia','Light','2','Sniper');

mecze

CREATE TABLE mecze ( id_meczu INT PRIMARY KEY, data_meczu DATE, id_druzyna1 INT, id_druzyna2 INT, turniej VARCHAR(50), FOREIGN KEY (id_druzyna1) REFERENCES druzyny(id_druzyny), FOREIGN KEY (id_druzyna2) REFERENCES druzyny(id_druzyny) ); INSERT INTO mecze VALUES (1,'2025-09-01',1,2,'LatoCup'), (2,'2025-09-02',3,4,'LatoCup'), (3,'2025-09-05',1,3,'AutumnCup'), (4,'2025-09-06',2,4,'AutumnCup'), (5,'2025-09-10',1,4,'ProLeague');

wyniki

CREATE TABLE wyniki ( id_wyniku INT PRIMARY KEY, id_meczu INT, zwyciezca INT, punkty_druzyny1 INT, punkty_druzyny2 INT, FOREIGN KEY (id_meczu) REFERENCES mecze(id_meczu), FOREIGN KEY (zwyciezca) REFERENCES druzyny(id_druzyny) ); INSERT INTO wyniki VALUES (1,1,2,15,20), (2,2,4,10,25), (3,3,1,30,22), (4,4,2,18,12), (5,5,1,40,35);

Ćwiczenia SQL z efektami

1. Ranking drużyn według wygranych

SELECT d.nazwa, COUNT(w.id_wyniku) AS wygrane FROM druzyny d LEFT JOIN wyniki w ON d.id_druzyny = w.zwyciezca GROUP BY d.id_druzyny ORDER BY wygrane DESC;
DrużynaWygraneMedal
CyberWarriors2
PixelMasters2
NoobSlayers1
GameOver0

2. Najlepszy zawodnik (punkty zdobyte przez drużynę)

SELECT z.nick, d.nazwa, SUM( CASE WHEN w.id_wyniku IS NOT NULL AND (m.id_druzyna1=z.id_druzyny OR m.id_druzyna2=z.id_druzyny) THEN (CASE WHEN m.id_druzyna1=z.id_druzyny THEN w.punkty_druzyny1 ELSE w.punkty_druzyny2 END) ELSE 0 END ) AS punkty FROM zawodnicy z JOIN druzyny d ON z.id_druzyny = d.id_druzyny LEFT JOIN mecze m ON m.id_druzyna1=d.id_druzyny OR m.id_druzyna2=d.id_druzyny LEFT JOIN wyniki w ON w.id_meczu = m.id_meczu GROUP BY z.id_zawodnika ORDER BY punkty DESC;
NickDrużynaPunkty
ShadowCyberWarriors87
FlashCyberWarriors87
PixelQueenPixelMasters50
LightPixelMasters50
DestroyerGameOver22
NoobKillerNoobSlayers37

3. Mecze z największą różnicą punktów

SELECT m.id_meczu, d1.nazwa AS druzyna1, d2.nazwa AS druzyna2, ABS(w.punkty_druzyny1 - w.punkty_druzyny2) AS roznica FROM mecze m JOIN druzyny d1 ON m.id_druzyna1=d1.id_druzyny JOIN druzyny d2 ON m.id_druzyna2=d2.id_druzyny JOIN wyniki w ON m.id_meczu=w.id_meczu ORDER BY roznica DESC;
MeczDrużyna 1Drużyna 2Różnica
5CyberWarriorsNoobSlayers5
3CyberWarriorsGameOver8
2GameOverNoobSlayers15
1CyberWarriorsPixelMasters5
4PixelMastersNoobSlayers6

4. Progres bar punktów drużyn w każdym meczu

SELECT m.id_meczu, d1.nazwa AS druzyna1, w.punkty_druzyny1, d2.nazwa AS druzyna2, w.punkty_druzyny2 FROM mecze m JOIN wyniki w ON m.id_meczu=w.id_meczu JOIN druzyny d1 ON m.id_druzyna1=d1.id_druzyny JOIN druzyny d2 ON m.id_druzyna2=d2.id_druzyny;
MeczDrużyna 1PunktyDrużyna 2Punkty
1CyberWarriors
PixelMasters
2GameOver
NoobSlayers
3CyberWarriors
GameOver
4PixelMasters
NoobSlayers
5CyberWarriors
NoobSlayers

Ćwiczenia z podzapytaniami

1. Gracze, którzy zdobyli więcej punktów niż średnia punktów wszystkich graczy

NickPunkty
Shadow87
Flash87

2. Drużyny, które wygrały więcej meczów niż średnia wszystkich drużyn

DrużynaWygrane
CyberWarriors2
PixelMasters2

3. Mecze, w których drużyna zdobyła więcej punktów niż średnia punktów w meczu

MeczDrużyna 1Punkty 1Drużyna 2Punkty 2
3CyberWarriors30GameOver22
5CyberWarriors40NoobSlayers35

4. Drużyny, które wygrały wszystkie mecze w turnieju „LatoCup”

Drużyna
PixelMasters

5. Najlepsi gracze, którzy zdobyli więcej punktów niż średnia swojej drużyny

NickPunkty
Shadow87
Flash87