|
|
-- 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;
|
|
|
|
|
|
-- 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
|
|
|
INNER JOIN athlete a ON a.code = r.athlete
|
|
|
WHERE 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';
|
|
|
|
|
|
/*CREATE OR REPLACE FUNCTION create_view_medailles(couleur_medaille medaille.couleur%TYPE) RETURNS void AS $$
|
|
|
BEGIN
|
|
|
-- TODO nom de la vue
|
|
|
CREATE VIEW MedaillesArgent AS SELECT a.pays code_pays,
|
|
|
COUNT(DISTINCT (r.epreuve, r.medaille)) medailles_or
|
|
|
FROM resultat r
|
|
|
INNER JOIN athlete a ON a.code = r.athlete
|
|
|
WHERE r.medaille = (
|
|
|
SELECT place FROM medaille WHERE couleur = couleur_medaille
|
|
|
)
|
|
|
GROUP BY a.pays;
|
|
|
END;
|
|
|
$$ LANGUAGE plpgsql;*/
|
|
|
CREATE VIEW MedaillesArgent AS SELECT a.pays code_pays,
|
|
|
COUNT(DISTINCT r.epreuve) medailles_argent
|
|
|
FROM resultat r
|
|
|
INNER JOIN athlete a ON a.code = r.athlete
|
|
|
WHERE 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
|
|
|
INNER JOIN athlete a ON a.code = r.athlete
|
|
|
WHERE 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.
|
|
|
CREATE VIEW TableauMedailles AS
|
|
|
SELECT p.nom pays,
|
|
|
COALESCE(o.medailles_or, 0) medailles_or, COALESCE(a.medailles_argent, 0) medailles_argent, COALESCE(b.medailles_bronze, 0) medailles_bronze,
|
|
|
(o.medailles_or + a.medailles_argent + b.medailles_bronze) total_medailles
|
|
|
FROM pays p
|
|
|
LEFT JOIN MedaillesOr o ON o.code_pays = p.code
|
|
|
LEFT JOIN MedaillesArgent a ON a.code_pays = p.code
|
|
|
LEFT JOIN MedaillesBronze b ON b.code_pays = p.code
|
|
|
WHERE medailles_or IS NOT NULL
|
|
|
OR medailles_argent IS NOT NULL
|
|
|
OR medailles_bronze IS NOT NULL -- Retire les pays qui ont 0 médaille peu importe la couleur
|
|
|
ORDER BY 2 DESC, 3 DESC, 4 DESC;
|
|
|
|
|
|
-- 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 ...
|
|
|
SELECT * FROM tableaumedailles ORDER BY total_medailles DESC, pays;
|
|
|
|
|
|
-- 1. Écrire une requête SQL calculant le nombre d’athlètes pratiquants par discipline et par pays
|
|
|
SELECT p.discipl code_discipline, a.pays code_pays, COUNT(*) athletes FROM pratiquer p
|
|
|
INNER JOIN athlete a ON a.code = p.athlete
|
|
|
GROUP BY p.discipl, a.pays;
|
|
|
|
|
|
-- 2. Transformer la requête précédente en vue Pratiquants_v1
|
|
|
CREATE VIEW Pratiquants_v1 AS
|
|
|
SELECT p.discipl code_discipline, a.pays code_pays, COUNT(*) athletes FROM pratiquer p
|
|
|
INNER JOIN athlete a ON a.code = p.athlete
|
|
|
GROUP BY p.discipl, a.pays;
|
|
|
|
|
|
-- 3. Même chose pour Pratiquants_v2 mais ce sera une vue matérialisée.
|
|
|
CREATE MATERIALIZED VIEW Pratiquants_v2 AS
|
|
|
SELECT p.discipl code_discipline, a.pays code_pays, COUNT(*) athletes FROM pratiquer p
|
|
|
INNER JOIN athlete a ON a.code = p.athlete
|
|
|
GROUP BY p.discipl, a.pays;
|
|
|
|
|
|
-- 5. Utiliser les vues créées précédemment pour afficher le nombre d’athlètes français pratiquant le judo
|
|
|
SELECT athletes francais_judokas FROM Pratiquants_v1
|
|
|
WHERE code_pays = 'FRA' AND code_discipline = 'JUD';
|
|
|
|
|
|
SELECT athletes francais_judokas FROM Pratiquants_v2
|
|
|
WHERE code_pays = 'FRA' AND code_discipline = 'JUD';
|
|
|
|
|
|
/*SELECT * FROM pratiquer p
|
|
|
INNER JOIN athlete a ON a.code = p.athlete
|
|
|
WHERE p.discipl = 'JUD' AND a.pays = 'FRA';*/
|
|
|
|
|
|
-- 6. Teddy RINER ne pratique plus le judo mais le skateboard (code ’SKB’). Faire les modifications nécessaires.
|
|
|
/*DELETE FROM pratiquer WHERE athlete = (
|
|
|
SELECT code FROM athlete WHERE prenom = 'Teddy' AND nom = 'RINER'
|
|
|
) AND discipl = 'JUD';
|
|
|
INSERT INTO pratiquer VALUES (
|
|
|
(
|
|
|
SELECT code FROM athlete WHERE prenom = 'Teddy' AND nom = 'RINER'
|
|
|
),
|
|
|
'SKB'
|
|
|
);*/
|
|
|
UPDATE pratiquer SET discipl = 'SKB' WHERE athlete = (
|
|
|
SELECT code FROM athlete WHERE prenom = 'Teddy' AND nom = 'RINER'
|
|
|
) AND discipl = 'JUD';
|
|
|
|
|
|
-- 7 et 8.
|
|
|
-- Teddy RINNER est toujours référence dans la version 2 comme judoka puisque c'est une vue matérisalisée et qu'il faut la rafraîchir :
|
|
|
REFRESH MATERIALIZED VIEW Pratiquants_v2;
|