←← →→

C99.hu

Egy gondolkodtató gyakorló feladatokból álló gyűjtemény. Főbb témák a nyelvspecifikus programozás és a matematika.

Főoldal

Az iskolai programozóverseny

SQL
Nehézség: Nehéz

Egy iskolai programozóversenyen a csapatokat, feladatokat és pontszámokat kell nyilvántartani. A feladatok már összetettebb JOIN, GROUP BY és szűrési műveleteket kérnek.

CREATE TABLE csapatok (
csapat_id INT PRIMARY KEY,
nev VARCHAR(100) NOT NULL,
osztaly VARCHAR(10) NOT NULL
);

CREATE TABLE feladatok (
feladat_id INT PRIMARY KEY,
nev VARCHAR(100) NOT NULL,
tema VARCHAR(50) NOT NULL,
max_pont INT NOT NULL
);

CREATE TABLE eredmenyek (
eredmeny_id INT PRIMARY KEY,
csapat_id INT NOT NULL,
feladat_id INT NOT NULL,
pont INT NOT NULL,
FOREIGN KEY (csapat_id) REFERENCES csapatok(csapat_id),
FOREIGN KEY (feladat_id) REFERENCES feladatok(feladat_id)
);

INSERT INTO csapatok (csapat_id, nev, osztaly) VALUES
(1, 'BitBetyárok', '11.A'),
(2, 'NullPointer', '12.B'),
(3, 'Stack Overflower', '11.C'),
(4, 'Kódkovácsok', '10.A');

INSERT INTO feladatok (feladat_id, nev, tema, max_pont) VALUES
(1, 'FizzBuzz+', 'algoritmus', 100),
(2, 'Rendezés', 'algoritmus', 100),
(3, 'Adatbázis', 'SQL', 100),
(4, 'Memória', 'rendszer', 100);

INSERT INTO eredmenyek (eredmeny_id, csapat_id, feladat_id, pont) VALUES
(1, 1, 1, 100),
(2, 1, 2, 80),
(3, 2, 1, 60),
(4, 2, 3, 90),
(5, 3, 2, 100),
(6, 3, 4, 70),
(7, 4, 1, 50),
(8, 4, 3, 95);

-- Feladatok:
-- 1. Listázza ki az összes csapat nevét és osztályát.
-- 2. Kérdezze le azokat a feladatokat, amelyek témája algoritmus.
-- 3. Számolja ki minden csapat összpontszámát.
-- 4. Listázza ki azokat a csapatokat, amelyek legalább 150 pontot szereztek.
-- 5. Kérdezze le, mely csapatok kaptak pontot az SQL témájú feladatra.


MegoldásMegoldási ötletek:
1. SELECT nev, osztaly FROM csapatok;
2. SELECT nev FROM feladatok WHERE tema = 'algoritmus';
3. SELECT c.nev, SUM(e.pont) AS osszpont FROM csapatok c JOIN eredmenyek e ON c.csapat_id = e.csapat_id GROUP BY c.nev;
4. SELECT c.nev FROM csapatok c JOIN eredmenyek e ON c.csapat_id = e.csapat_id GROUP BY c.nev HAVING SUM(e.pont) >= 150;
5. SELECT DISTINCT c.nev FROM csapatok c JOIN eredmenyek e ON c.csapat_id = e.csapat_id JOIN feladatok f ON e.feladat_id = f.feladat_id WHERE f.tema = 'SQL';