You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

236 lines
8.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

-- 1. Discipline proposant plus dépreuves en juillet quen août.
SELECT d.*
FROM Discipline d, Epreuve e
WHERE d.code=e.discipl AND e.dateE < '2021-08-01' AND e.dateE > '2021-06-30'
GROUP BY d.code
HAVING count(*) >=ALL (SELECT count(*)
FROM Epreuve
WHERE dateE >= '2021-08-01' AND dateE <= '2021-08-31' AND d.code=discipl);
-- code | nom
-- ------+-----------------------
-- FEN | Fencing
-- JUD | Judo
-- TKW | Taekwondo
-- GTR | Trampoline Gymnastics
-- TRI | Triathlon
-- TTE | Table Tennis
-- CRD | Cycling Road
-- SKB | Skateboarding
-- SWM | Swimming
-- BK3 | 3x3 Basketball
-- SRF | Surfing
-- ROW | Rowing
-- RUG | Rugby Sevens
-- BSB | Baseball/Softball
-- DIV | Diving
-- SHO | Shooting
-- BMX | Cycling BMX Racing
-- CSL | Canoe Slalom
-- ARC | Archery
-- TEN | Tennis
-- WLF | Weightlifting
-- MTB | Cycling Mountain Bike
-- (22 lignes)
-- 2. Pays dont au moins la moitié des athlètes ont obtenu une médaille.
SELECT p.nom FROM Pays p WHERE (SELECT COUNT(*) FROM Athlete a WHERE a.pays = p.code) * 0.5 <= (SELECT COUNT(DISTINCT r.athlete) FROM Resultat r
WHERE r.medaille IS NOT NULL AND r.athlete IN (SELECT a.code FROM Athlete a WHERE a.pays = p.code));
/* nom
--------------------
Bermuda
San Marino
Fiji
Russian Federation
URSS
(5 lignes)
*/
-- 3. Pays ayant remporté plus de médailles dor que de médailles dargent 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 dentre 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 dune 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 dhaltérophilie (Weightlifting). Supprimer tous les résultats aux épreuves dhalté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 :Womens team pour le golf ayant lieu le 09/08/2021 (code de lépreuve :E356).
INSERT INTO Epreuve (code, discipl, nom, dateE)
VALUES ('E356', 'GLF', 'Women''s team', '2021-08-09');
/*
INSERT 0 1
*/
-- 10. Écrire une requête permettant de donner une médaille dor 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 dargent à 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