-- 1. Discipline proposant plus d’épreuves en juillet qu’en août. SELECT d.nom discipline FROM epreuve e INNER JOIN discipline d ON d.code = e.discipl WHERE EXTRACT(MONTH FROM e.dateE) = 7 GROUP BY d.code HAVING COUNT(*) >= ( SELECT COUNT(*) FROM epreuve WHERE discipl = d.code AND EXTRACT(MONTH FROM dateE) = 8 ); /* discipline ----------------------- Archery 3x3 Basketball Cycling BMX Racing Baseball/Softball Cycling Road Canoe Slalom Diving Fencing Trampoline Gymnastics Judo Cycling Mountain Bike Rowing Rugby Sevens Shooting Skateboarding Surfing Swimming Tennis Taekwondo Triathlon Table Tennis Weightlifting (22 lignes) */ -- 2. Pays dont au moins la moitié des athlètes ont obtenu une médaille. SELECT p.nom nom_pays, COUNT(*) athletes, COUNT(DISTINCT r.athlete) athletes_medailles FROM athlete INNER JOIN pays p ON athlete.pays = p.code LEFT JOIN resultat r on athlete.code = r.athlete GROUP BY p.code HAVING COUNT(DISTINCT r.athlete) >= COUNT(*) FILTER (WHERE r.athlete IS NULL); /* nom_pays | athletes | athletes_medailles ------------+----------+-------------------- Bermuda | 2 | 1 Fiji | 32 | 26 San Marino | 6 | 3 (3 lignes) */ -- 3. Pays ayant remporté plus de médailles d’or que de médailles d’argent et de bronze cumulées. SELECT pays, COUNT(r.medaille) FILTER (WHERE r.medaille = 1) medailles_or, COUNT(r.medaille) FILTER (WHERE r.medaille != 1) autres_medailles FROM resultat r INNER JOIN athlete a on a.code = r.athlete GROUP BY pays HAVING COUNT(r.medaille) FILTER (WHERE r.medaille = 1) >= COUNT(r.medaille) FILTER (WHERE r.medaille != 1); /* pays | medailles_or | autres_medailles ------+--------------+------------------ CUB | 8 | 8 KOS | 2 | 0 EST | 4 | 1 BEL | 20 | 6 SLO | 3 | 2 TUN | 1 | 1 BER | 1 | 0 LAT | 4 | 1 THA | 1 | 1 FIJ | 13 | 13 BUL | 7 | 3 PUR | 1 | 0 MAR | 1 | 0 UGA | 2 | 2 BRA | 29 | 26 ECU | 2 | 1 BAH | 2 | 0 JPN | 68 | 63 QAT | 2 | 2 UZB | 3 | 2 (20 lignes) */ -- 4. Nom et prénom des athlètes féminines plus grandes que tous leurs compatriotes masculins. SELECT nom, prenom FROM athlete a WHERE sexe = 'F' AND taille IS NOT NULL AND taille >= ALL ( SELECT taille FROM athlete WHERE pays = a.pays AND sexe = 'M' AND taille IS NOT NULL ); /* nom | prenom -----------------------+---------------------- ABDUL HADI | Farah Ann AL-KAABI | Fatimah Abbas Waheeb ALVARADO | Luciana ALVES LOPES | Marcia AYIVON | Claire BABOVIC | Anastasija BALADIN | Hande BANDA | Babra BAYASGALAN | Solongo BELEMU | Margaret BENITEZ | Jackie BOZ | Meryem BRNOVIC | Tatjana BYLON | Atheyna [...] (86 lignes) */ -- 5. Lister chaque athlète masculin français (nom, prénom, taille) et comparer leur taille avec celle du plus grand d’entre eux. SELECT nom, prenom, taille, taille - ( SELECT MAX(taille) FROM athlete WHERE sexe = 'M' AND pays = 'FRA' ) diff FROM athlete WHERE sexe = 'M' AND pays = 'FRA'; /* nom | prenom | taille | diff ------------------+-----------------+--------+------- ABALO | Luc | 1.83 | -0.35 AIT SAID | Samir | 1.68 | -0.50 ALBICY | Andrew | 1.78 | -0.40 ALIEV | Mourad | | AMDOUNI | Morhad | | AMOROS | Emile | 1.78 | -0.40 ANDRE | Sylvain | | ANDRODIAS | Matthieu | 1.94 | -0.24 [...] (220 lignes) */ -- 6. Pour chaque épreuve, indiquer sa date et les dates des premières et dernières épreuves de la discipline. SELECT *, (SELECT MIN(dateE) FROM epreuve WHERE discipl = e.discipl) datemin, (SELECT MAX(dateE) FROM epreuve WHERE discipl = e.discipl) datemax FROM epreuve e; /* code | discipl | nom | datee | datemin | datemax ------+---------+----------------------------------------------+------------+------------+------------ E001 | ARC | Mixed Team | 2021-07-24 | 2021-07-24 | 2021-07-31 E002 | CRD | Men's Road Race | 2021-07-24 | 2021-07-24 | 2021-07-28 E003 | FEN | Men's Sabre Individual | 2021-07-24 | 2021-07-24 | 2021-08-01 E004 | FEN | Women's Epée Individual | 2021-07-24 | 2021-07-24 | 2021-08-01 E005 | JUD | Men -60 kg | 2021-07-24 | 2021-07-24 | 2021-07-31 E006 | JUD | Women -48 kg | 2021-07-24 | 2021-07-24 | 2021-07-31 E007 | SHO | 10m Air Pistol Men | 2021-07-24 | 2021-07-24 | 2021-08-02 [...] (355 lignes) */ -- 7. Un typhon est annoncé. Les épreuves de la dernière journée doivent être reportée d’une semaine. Quelle commande permet de faire cette modification sans connaître la date de la dernière journée ? UPDATE epreuve SET dateE = dateE + 7 WHERE dateE = ( SELECT MAX(dateE) FROM epreuve ); /* UPDATE 13 */ -- 8. Suspicion de dopage dans les épreuves d’haltérophilie (Weightlifting). Supprimer tous les résultats aux épreuves d’haltérophilie pour le pays ayant remporté le plus de médailles dans cette discipline. DELETE FROM resultat r USING epreuve e WHERE e.code = r.epreuve AND e.discipl = ( SELECT code FROM discipline WHERE nom = 'Weightlifting' ) AND r.athlete IN ( SELECT code FROM athlete WHERE pays IN ( SELECT a.pays FROM resultat r INNER JOIN epreuve e ON e.code = r.epreuve INNER JOIN athlete a ON a.code = r.athlete WHERE e.discipl = ( SELECT code FROM discipline WHERE nom = 'Weightlifting' ) GROUP BY a.pays ORDER BY COUNT(*) DESC LIMIT 1 ) ); /* DELETE 8 */ -- 9. Ajouter une nouvelle épreuve :’Women’’s team’ pour le golf ayant lieu le 09/08/2021 (code de l’épreuve :’E356’). INSERT INTO epreuve VALUES( 'E356', (SELECT code FROM discipline WHERE nom = 'Golf'), 'Women''s team', '2021-08-09' ); /* INSERT 0 1 */ -- 10. Écrire une requête permettant de donner une médaille d’or lors de l’épreuve crée à la question précédente à toutes les golfeuses des Etats-unis. INSERT INTO resultat SELECT 'E356', a.code, (SELECT place FROM medaille WHERE couleur = 'Or') FROM athlete a INNER JOIN pratiquer p ON p.athlete = a.code WHERE a.pays = (SELECT code FROM pays WHERE nom = 'United States of America') AND p.discipl = (SELECT code FROM discipline WHERE nom = 'Golf') AND a.sexe = 'F'; /* INSERT 0 4 */ -- 11. Même question mais pour donner une médaille d’argent à toutes les golfeuses sud-coréennes. INSERT INTO resultat SELECT 'E356', a.code, (SELECT place FROM medaille WHERE couleur = 'Argent') FROM athlete a INNER JOIN pratiquer p ON p.athlete = a.code WHERE a.pays = (SELECT code FROM pays WHERE nom = 'Republic of Korea') AND p.discipl = (SELECT code FROM discipline WHERE nom = 'Golf') AND a.sexe = 'F'; /* INSERT 0 4 */ -- 12. Vérifier que vos deux requêtes précédentes ont bien fonctionnées en affichant les résultats de l’épreuve 'E356' (y compris nom, prénom et pays des médaillées). SELECT p.nom pays, a.sexe, a.nom, a.prenom, m.couleur FROM resultat r INNER JOIN medaille m ON m.place = r.medaille INNER JOIN athlete a ON a.code = r.athlete INNER JOIN pays p ON p.code = a.pays WHERE r.epreuve = 'E356' ORDER BY r.medaille; /* pays | sexe | nom | prenom | couleur --------------------------+------+----------+-----------+--------- United States of America | F | THOMPSON | Lexi | Or United States of America | F | KORDA | Jessica | Or United States of America | F | KORDA | Nelly | Or United States of America | F | KANG | Danielle | Or Republic of Korea | F | PARK | Inbee | Argent Republic of Korea | F | KIM | Hyojoo | Argent Republic of Korea | F | KIM | Sei Young | Argent Republic of Korea | F | KO | Jin Young | Argent (8 lignes) */ -- 13. Réinitialiser votre base de données avec le script jo.sql pour annuler les modifications faites sur ces deux dernières questions. \i jo.sql