|
|
-- 1. Écrire une requête permettant de lister les codes de pays et le nombre de médailles d’or qu’ils ont remporté
|
|
|
SELECT a.pays code_pays,
|
|
|
COUNT(DISTINCT r.epreuve) medailles_or
|
|
|
FROM resultat r
|
|
|
INNER JOIN athlete a ON a.code = r.athlete
|
|
|
WHERE r.medaille = (
|
|
|
SELECT place FROM medaille WHERE couleur = 'Or'
|
|
|
)
|
|
|
GROUP BY a.Pays
|
|
|
ORDER BY medailles_or DESC;
|
|
|
|
|
|
-- 2. Transformer la requête précédente en vue nommée MedaillesOr.
|
|
|
CREATE VIEW MedaillesOr AS SELECT a.pays code_pays, COUNT(DISTINCT r.epreuve) medailles_or
|
|
|
FROM resultat r, athlete a
|
|
|
WHERE a.code = r.athlete AND r.medaille = (
|
|
|
SELECT place
|
|
|
FROM medaille
|
|
|
WHERE couleur = 'Or')
|
|
|
GROUP BY a.pays;
|
|
|
|
|
|
-- 3. Utiliser la vue créée pour trouver le nombre de médailles d’or remportées par la France.
|
|
|
SELECT medailles_or FROM MedaillesOr WHERE code_pays = 'FRA';
|
|
|
|
|
|
-- 4. Comme pour MedaillesOr, créer deux vues MedaillesArgent et MedaillesBronze associant le code des pays au nombre de médailles d’argent et de bronze remportées, respectivement.
|
|
|
|
|
|
CREATE VIEW MedaillesArgent AS SELECT a.pays code_pays, COUNT(DISTINCT r.epreuve) medailles_argent
|
|
|
FROM resultat r, athlete a
|
|
|
WHERE a.code = r.athlete AND r.medaille = (
|
|
|
SELECT place
|
|
|
FROM medaille
|
|
|
WHERE couleur = 'Argent')
|
|
|
GROUP BY a.pays;
|
|
|
|
|
|
CREATE VIEW MedaillesBronze AS SELECT a.pays code_pays, COUNT(DISTINCT r.epreuve) medailles_bronze
|
|
|
FROM resultat r, athlete a
|
|
|
WHERE a.code = r.athlete AND r.medaille = (
|
|
|
SELECT place
|
|
|
FROM medaille
|
|
|
WHERE couleur = 'Bronze')
|
|
|
GROUP BY a.pays;
|
|
|
|
|
|
-- 5. Créer une vue TableauMedailles listant le nombre de médailles d’or, d’argent, de bronze et
|
|
|
-- le total de médailles remportées par chaque pays. Les pays ayant remporté le plus de médailles d’or
|
|
|
-- apparaitront en premier, puis ceux ayant remporté le plus de médailles d’argent et enfin ceux ayant
|
|
|
-- remporté le plus de médailles de bronze.
|
|
|
|
|
|
CREATE VIEW TableauMedailles AS
|
|
|
SELECT p.nom pays,
|
|
|
o.medailles_or, a.medailles_argent, b.medailles_bronze,
|
|
|
(o.medailles_or + a.medailles_argent + b.medailles_bronze) total_medailles
|
|
|
FROM pays p, MedaillesOr o, MedaillesArgent a, MedaillesBronze b
|
|
|
WHERE o.code_pays = p.code AND a.code_pays = p.code AND b.code_pays = p.code AND
|
|
|
medailles_or IS NOT NULL
|
|
|
OR medailles_argent IS NOT NULL
|
|
|
OR medailles_bronze IS NOT NULL
|
|
|
ORDER by total_medailles DESC;-- Retire les pays qui ont 0 médaille peu importe la couleur
|
|
|
|
|
|
SELECT * FROM TableauMedailles WHERE pays = 'France';
|
|
|
|
|
|
-- 6. Afficher le tableau des médailles
|
|
|
SELECT * FROM tableaumedailles;
|
|
|
|
|
|
-- 7. Un organe de presse souhaite faire son propre classement, en ordonnant les pays en fonction
|
|
|
-- du nombre total de médailles remportées, et par ordre alphabétique des noms de pays en cas d’égalité.
|
|
|
-- Sans modifier votre vue TableauMedailles, afficher ce nouveau classement.
|
|
|
|
|
|
SELECT *
|
|
|
FROM TableauMedailles
|
|
|
ORDER BY (total_medailles) DESC, (pays) ASC;
|
|
|
|
|
|
|
|
|
--! Partie 2
|
|
|
|
|
|
-- 1. Ecrire une requête SQL calculant le nombre d’athlètes pratiquants par discipline et par pays
|
|
|
-- (trié par discipline, puis pays).
|
|
|
|
|
|
SELECT pa.nom AS pays, d.code AS discipline, count(*) AS nb_athletes
|
|
|
FROM Athlete a, Pays pa, Pratiquer pr, Discipline d
|
|
|
WHERE a.pays = pa.code AND pr.athlete = a.code AND d.code = pr.discipl
|
|
|
GROUP BY pa.nom, d.code;
|
|
|
|
|
|
-- 2. Transformer la requête précédente en vue Pratiquants_v1.
|
|
|
DROP VIEW Pratiquants_v1 cascade;
|
|
|
CREATE VIEW Pratiquants_v1 AS SELECT pa.nom AS pays, d.code AS discipline, count(*) AS nb_athletes
|
|
|
FROM Athlete a, Pays pa, Pratiquer pr, Discipline d
|
|
|
WHERE a.pays = pa.code AND pr.athlete = a.code AND d.code = pr.discipl
|
|
|
GROUP BY pa.nom, d.code;
|
|
|
|
|
|
-- 3. Même chose pour Pratiquants_v2 mais ce sera une vue matérialisée
|
|
|
|
|
|
CREATE MATERIALIZED VIEW Pratiquants_v2 AS SELECT pa.nom AS pays, d.code AS discipline, count(*) AS nb_athletes
|
|
|
FROM Athlete a, Pays pa, Pratiquer pr, Discipline d
|
|
|
WHERE a.pays = pa.code AND pr.athlete = a.code AND d.code = pr.discipl
|
|
|
GROUP BY pa.nom, d.code;
|
|
|
|
|
|
-- 4. Utiliser les vues créées précédemment pour afficher le nombre d’athlètes français pratiquant le
|
|
|
-- judo (code ’JUD’)
|
|
|
|
|
|
SELECT *
|
|
|
FROM Pratiquants_v1
|
|
|
WHERE pays = 'France' AND discipline = 'JUD';
|
|
|
|
|
|
SELECT *
|
|
|
FROM Pratiquants_v2
|
|
|
WHERE pays = 'France' AND discipline = 'JUD';
|
|
|
|
|
|
-- 5.Teddy RINER ne pratique plus le judo mais le skateboard (code ’SKB’). Faire les modifications
|
|
|
-- nécessaires.
|
|
|
-- UPDATE discipl
|
|
|
-- SET discipl = 'SKB'
|
|
|
-- FROM Pratiquer
|
|
|
-- WHERE athlete = (a.code FROM Athlete a WHERE a.nom = 'Riner');
|
|
|
|
|
|
UPDATE pratiquer
|
|
|
SET discipl = 'SKB'
|
|
|
WHERE athlete = (
|
|
|
SELECT code
|
|
|
FROM Athlete
|
|
|
WHERE nom = 'RINER');
|
|
|
|
|
|
-- 6. Réafficher le nombre d’athlètes français pratiquant le judo (code ’JUD’).
|
|
|
-- Comparer le résultat obtenu avec les 2 vues. Pourquoi cette différence ?
|
|
|
|
|
|
SELECT *
|
|
|
FROM Pratiquants_v2
|
|
|
WHERE pays = 'France' AND discipl = 'JUD';
|
|
|
|
|
|
SELECT *
|
|
|
FROM Pratiquants_v1
|
|
|
WHERE pays = 'France' AND discipl = 'JUD';
|
|
|
|
|
|
-- car elle est pas update
|
|
|
|
|
|
-- 7. Que faut-il faire pour que les deux vues affichent le même résultat ? Vérifier
|
|
|
|
|
|
-- mettre
|
|
|
-- REFRESH MATERIALIZED VIEW Pratiquants_v2; |