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żyna
Wygrane
Medal
CyberWarriors
2
★
PixelMasters
2
★
NoobSlayers
1
★
GameOver
0
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;
Nick
Drużyna
Punkty
Shadow
CyberWarriors
87
Flash
CyberWarriors
87
PixelQueen
PixelMasters
50
Light
PixelMasters
50
Destroyer
GameOver
22
NoobKiller
NoobSlayers
37
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;
Mecz
Drużyna 1
Drużyna 2
Różnica
5
CyberWarriors
NoobSlayers
5
3
CyberWarriors
GameOver
8
2
GameOver
NoobSlayers
15
1
CyberWarriors
PixelMasters
5
4
PixelMasters
NoobSlayers
6
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;
Mecz
Drużyna 1
Punkty
Drużyna 2
Punkty
1
CyberWarriors
PixelMasters
2
GameOver
NoobSlayers
3
CyberWarriors
GameOver
4
PixelMasters
NoobSlayers
5
CyberWarriors
NoobSlayers
Ćwiczenia z podzapytaniami
1. Gracze, którzy zdobyli więcej punktów niż średnia punktów wszystkich graczy
SELECT z.nick, SUM(CASE WHEN m.id_druzyna1=z.id_druzyny THEN w.punkty_druzyny1 ELSE w.punkty_druzyny2 END) AS punkty
FROM zawodnicy z
JOIN mecze m ON z.id_druzyny=m.id_druzyny1 OR z.id_druzyny=m.id_druzyny2
JOIN wyniki w ON m.id_meczu=w.id_meczu
GROUP BY z.nick
HAVING SUM(CASE WHEN m.id_druzyna1=z.id_druzyny THEN w.punkty_druzyny1 ELSE w.punkty_druzyny2 END) >
(SELECT AVG(punkty) FROM (SELECT SUM(CASE WHEN m2.id_druzyna1=z2.id_druzyny THEN w2.punkty_druzyny1 ELSE w2.punkty_druzyny2 END) AS punkty
FROM zawodnicy z2
JOIN mecze m2 ON z2.id_druzyny=m2.id_druzyny1 OR z2.id_druzyny=m2.id_druzyny2
JOIN wyniki w2 ON m2.id_meczu=w2.id_meczu
GROUP BY z2.nick) AS sub);
Nick
Punkty
Shadow
87
Flash
87
2. Drużyny, które wygrały więcej meczów niż średnia wszystkich drużyn
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
HAVING COUNT(w.id_wyniku) > (SELECT AVG(wygrane) FROM (SELECT COUNT(w2.id_wyniku) AS wygrane
FROM druzyny d2
LEFT JOIN wyniki w2 ON d2.id_druzyny=w2.zwyciezca
GROUP BY d2.id_druzyny) AS sub);
Drużyna
Wygrane
CyberWarriors
2
PixelMasters
2
3. Mecze, w których drużyna zdobyła więcej punktów niż średnia punktów w 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
WHERE w.punkty_druzyny1 > (SELECT AVG((punkty_druzyny1+punkty_druzyny2)/2) FROM wyniki)
OR w.punkty_druzyny2 > (SELECT AVG((punkty_druzyny1+punkty_druzyny2)/2) FROM wyniki);
Mecz
Drużyna 1
Punkty 1
Drużyna 2
Punkty 2
3
CyberWarriors
30
GameOver
22
5
CyberWarriors
40
NoobSlayers
35
4. Drużyny, które wygrały wszystkie mecze w turnieju „LatoCup”
SELECT nazwa FROM druzyny
WHERE id_druzyny IN (
SELECT zwyciezca FROM wyniki w
JOIN mecze m ON w.id_meczu=m.id_meczu
WHERE m.turniej='LatoCup'
GROUP BY zwyciezca
HAVING COUNT(*) = (SELECT COUNT(*) FROM mecze WHERE turniej='LatoCup')
);
Drużyna
PixelMasters
5. Najlepsi gracze, którzy zdobyli więcej punktów niż średnia swojej drużyny
SELECT z.nick, SUM(CASE WHEN m.id_druzyna1=z.id_druzyny THEN w.punkty_druzyny1 ELSE w.punkty_druzyny2 END) AS punkty
FROM zawodnicy z
JOIN mecze m ON z.id_druzyny=m.id_druzyny1 OR z.id_druzyny=m.id_druzyny2
JOIN wyniki w ON m.id_meczu=w.id_meczu
GROUP BY z.nick
HAVING SUM(CASE WHEN m.id_druzyna1=z.id_druzyny THEN w.punkty_druzyny1 ELSE w.punkty_druzyny2 END) >
(SELECT AVG(CASE WHEN m2.id_druzyna1=z2.id_druzyny THEN w2.punkty_druzyny1 ELSE w2.punkty_druzyny2 END)
FROM zawodnicy z2
JOIN mecze m2 ON z2.id_druzyny=m2.id_druzyny1 OR z2.id_druzyny=m2.id_druzyny2
JOIN wyniki w2 ON m2.id_meczu=w2.id_meczu
WHERE z2.id_druzyny=z.id_druzyny);