Exercices - SQL

Comme dans de nombreux domaines, pour progresser, il est nécessaire de s'entraîner. Vous trouverez ci-après une compilation d'exercices sur le SQL. Ces derniers balaient de nombreuses notions. La lecture de l'ensemble des chapitres du cours vous permettra de résoudre tous les exercices.

Il est possible de télécharger le fichier .sql avec les tables et les enregistrements.

Accès rapide aux différentes parties d'exercices :

I / Première partie

Ci-après la table à utiliser pour la première partie des exercices.

Table : lpecom_livres
id_livre titre isbn_10 auteur prix
1 Forteresse digitale 2709626306 Dan Brown 20.5
2 La jeune fille et la nuit 2253237620 Guillaume Musso 21.9
3 T'choupi se brosse les dents 2092589547 Thierry Courtin 5.7
4 La Dernière Chasse 2226439412 Jean-Christophe Grangé 22.9
5 Le Signal 2226319484 Maxime Chattam 23.9

Exercice 1

Quelle requête utiliser pour afficher l'ensemble des enregistrements de la table lpecom_livres ?

SQL
SELECT *
FROM lpecom_livres;

Exercice 2

Quelle requête utiliser pour sélectionner uniquement les livres qui ont un prix strictement supérieur à 20 de la table lpecom_livres ?

SQL
SELECT *
FROM lpecom_livres
WHERE prix > 20;

Exercice 3

Quelle requête utiliser pour trier les enregistrements de la table lpecom_livres du prix le plus élevé aux prix le plus bas ?

SQL
SELECT *
FROM lpecom_livres
ORDER BY prix DESC;

Exercice 4

Quelle requête utiliser pour récupérer le prix du livre le plus élevé de la table lpecom_livres ?

SQL
SELECT MAX(prix)
FROM lpecom_livres;

Exercice 5

Quelle requête utiliser pour récupérer les livres de la table lpecom_livres qui ont un prix compris entre 20 et 22 ?

SQL
SELECT *
FROM lpecom_livres
WHERE prix BETWEEN 20 AND 22;

Exercice 6

Quelle requête utiliser pour récupérer tous les livres de la table lpecom_livres à l'exception de celui portant la valeur pour la colonne isbn_10 : 2092589547 ?

SQL
SELECT *
FROM lpecom_livres
WHERE isbn_10 != 2092589547;

Exercice 7

Quelle requête utiliser pour récupérer le prix du livre le moins élevé de la table lpecom_livres en renommant la colonne dans les résultats par minus ?

SQL
SELECT MIN(prix) as minus
FROM lpecom_livres;

Exercice 8

Quelle requête utiliser pour sélectionner uniquement les 3 premiers résultats sans le tout premier de la table lpecom_livres ?

SQL
SELECT *
FROM lpecom_livres
LIMIT 3 OFFSET 1;

II / Deuxième partie

Ci-après les deux tables à utiliser pour la deuxième partie des exercices.

Table : lpecom_etudiants
id_etudiant prenom nom
30 Joseph Biblo
31 Paul Bismuth
32 Jean Michel
33 Ted Bundy
34 Caroline Martinez
35 Joséphine Henry
Table : lpecom_examens
id id_examen id_etudiant matiere note
788 45 30 Histoire-Geographie 10.5
789 87 33 Mathématiques 14
790 87 34 Mathématiques 4
791 45 31 Histoire-Geographie 15.5
792 45 32 Histoire-Geographie 8
793 87 31 Mathématiques 14
794 45 33 Histoire-Geographie 9.5
795 45 36 Histoire-Geographie 13
796 45 34 Histoire-Geographie 17
797 87 30 Mathématiques 7.5

Exercice 1

Quelle requête utiliser pour afficher l'id des étudiants qui ont participés à au moins un examen ?

SQL
SELECT DISTINCT id_etudiant
FROM lpecom_examens;

Exercice 2

Quelle requête utiliser pour compter le nombre d'étudiants qui ont participés à au moins un examen ?

SQL
SELECT COUNT(DISTINCT id_etudiant)
FROM lpecom_examens;

Exercice 3

Quelle requête utiliser pour calculer la moyenne de l'examen portant l'id : 45 ?

SQL
SELECT AVG(note)
FROM lpecom_examens
WHERE id_examen = 45;

Exercice 4

Quelle requête utiliser pour récupérer la meilleure note de l'examen portant l'id : 87 ?

SQL
SELECT MAX(note)
FROM lpecom_examens
WHERE id_examen = 87;

Exercice 5

Quelle requête utiliser pour afficher l'id des étudiants qui ont eu plus de 11 à l'examen 45 ou plus de 12 à l'examen 87 ?

SQL
SELECT DISTINCT id_etudiant
FROM lpecom_examens
WHERE (id_examen = 45 AND note > 11)
OR (id_examen = 87 AND note > 12);

Exercice 6

Quelle requête utiliser pour afficher tous les enregistrement de la table lpecom_examens avec en plus, si c'est possible, le prenom et le nom de l'étudiant ?

SQL
SELECT ex.*, et.prenom, et.nom
FROM lpecom_examens ex
LEFT JOIN lpecom_etudiants et ON ex.id_etudiant = et.id_etudiant;

Exercice 7

Quelle requête utiliser pour afficher les enregistrement de la table lpecom_examens avec le prenom et le nom de l'étudiant, uniquement quand les étudiants sont présents dans la table lpecom_etudiants ?

SQL
SELECT ex.*, et.prenom, et.nom
FROM lpecom_examens ex
INNER JOIN lpecom_etudiants et ON ex.id_etudiant = et.id_etudiant;

Exercice 8

Quelle requête utiliser pour afficher uniquement le nom et le prenom de l'étudiant avec l'id : 30 avec la moyenne de ses deux examens dans une colonne moyenne ?

SQL
SELECT et.prenom, et.nom, AVG(ex.note) as moyenne
FROM lpecom_examens ex
INNER JOIN lpecom_etudiants et ON ex.id_etudiant = et.id_etudiant
WHERE et.id_etudiant = 30;

Exercice 9

Quelle requête utiliser pour afficher les 3 meilleures examens, du meilleur au moins bon, avec le prenom et le nom de l'étudiant associé ?

SQL
SELECT *
FROM lpecom_examens ex
INNER JOIN lpecom_etudiants et ON ex.id_etudiant = et.id_etudiant
ORDER BY ex.note DESC
LIMIT 3;

III / Troisième partie

Ci-après les trois tables à utiliser pour la troisième partie des exercices. Pour cette nouvelle partie d'exercices, il est préférable de ne pas utiliser la console pour s'entrainer à comprendre les requêtes.

Table : lpecom_realisateurs
id nom prenom sexe nation
16ScottRidley0uk
22AronofskyDarren0us
47JenkinsPatty1us
66RitchieGuy0uk
Table : lpecom_films
id nom id_realisateur
121Requiem for a Dream22
546Gladiator16
666Fight Club61
775Blade Runner16
984Seul sur Mars16
986Black Swan22
987Wonder Woman47
988The Tomorrow Man85
Table : lpecom_films_notes
id id_film note
15464.5
25462.5
37755
49843.5
59873.1
66664.2
79863
89864.3
91211

Exercice 1

Quel est le résultat de la requête ci-dessous ?

SQL
SELECT id, prenom, nom
FROM lpecom_realisateurs
WHERE nation = "us"
AND sexe = 1;

Résultat de la requête
id prenom nom
47 Patty Jenkins

Exercice 2

Quel est le résultat de la requête ci-dessous ?

SQL
SELECT *
FROM lpecom_realisateurs
WHERE sexe = "0"
ORDER BY nom DESC
LIMIT 1;

id nom prenom sexe nation
16 Scott Ridley 0 uk

Exercice 3

Quel est le résultat de la requête ci-dessous ?

SQL
SELECT f.id, f.nom AS film, r.prenom, r.nom
FROM lpecom_films f
INNER JOIN lpecom_realisateurs r ON f.id_realisateur = r.id
ORDER BY f.id ASC;

id film prenom nom
121 Requiem for a Dream Darren Aronofsky
546 Gladiator Ridley Scott
775 Blade Runner Ridley Scott
984 Seul sur Mars Ridley Scott
986 Black Swan Darren Aronofsky
987 Wonder Woman Patty Jenkins

Exercice 4

Quel est le résultat de la requête ci-dessous ?

SQL
SELECT f.id, f.nom AS film, r.prenom, r.nom
FROM lpecom_films f
LEFT JOIN lpecom_realisateurs r ON f.id_realisateur = r.id
ORDER BY f.id ASC;

id film prenom nom
121 Requiem for a Dream Darren Aronofsky
546 Gladiator Ridley Scott
666 Fight Club
775 Blade Runner Ridley Scott
984 Seul sur Mars Ridley Scott
986 Black Swan Darren Aronofsky
987 Wonder Woman Patty Jenkins
988 The Tomorrow Man

Exercice 5

Quel est le résultat de la requête ci-dessous ?

SQL
SELECT f.id, f.nom, fn.note
FROM lpecom_films f
LEFT JOIN lpecom_films_notes fn ON f.id = fn.id_film
ORDER BY f.id ASC;

id nom note
121 Requiem for a Dream 1
546 Gladiator 4.5
546 Gladiator 2.5
666 Fight Club 4.2
775 Blade Runner 5
984 Seul sur Mars 3.5
986 Black Swan 4.3
986 Black Swan 3
987 Wonder Woman 3.1
988 The Tomorrow Man

Exercice 6

Quel est le résultat de la requête ci-dessous ?

SQL
SELECT f.nom, r.prenom AS realisateur_prenom, r.nom AS realisateur_nom, AVG(fn.note) AS moyenne_note
FROM lpecom_films f
INNER JOIN lpecom_realisateurs r ON f.id_realisateur = r.id
INNER JOIN lpecom_films_notes fn ON f.id = fn.id_film
WHERE f.id = 546;

nom realisateur_prenom realisateur_nom moyenne_note
Gladiator Ridley Scott 3.5

Exercice 7

Quel est le résultat de la requête ci-dessous ?

SQL
SELECT r.nation, AVG(fn.note) AS moyenne_note
FROM lpecom_films f
INNER JOIN lpecom_realisateurs r ON f.id_realisateur = r.id
INNER JOIN lpecom_films_notes fn ON f.id = fn.id_film
WHERE r.nation = "us";

La question pourrait être : Quelle est la moyenne des notes pour les films avec un réalisateur américain ?

nation moyenne_note
us 2.85

Exercice 8

Quel est le résultat de la requête ci-dessous ?

SQL
SELECT r.nation, MAX(fn.note) AS max_note
FROM lpecom_films f
INNER JOIN lpecom_realisateurs r ON f.id_realisateur = r.id
INNER JOIN lpecom_films_notes fn ON f.id = fn.id_film
WHERE r.nation = "uk";

nation max_note
uk 5

IV / Quatrième partie

Ci-après les trois tables à utiliser pour la quatrième partie des exercices. Dans les tableaux, il y a seulement un extrait aléatoire des données, donc toutes les lignes des tables ne sont pas listées. Dernier point, dans la table lpecom_cities, il y a uniquement les villes de la région Île-de-France. Pour cette nouvelle partie d'exercices, vous pouvez bien évidemment utiliser la console afin de tester vos requêtes.

Table : lpecom_cities
id department_code insee_code zip_code name gps_lat gps_lng
31315787841878360Montesson48.912102653061212.14510367346939
35142919113691160Champlan48.704581194029842.27765791044776
35241919152191130Ris-Orangis48.641683437499992.40548046875000
29906757505675007Paris48.854334500000012.31340290000000
35412949407194370Sucy-en-Brie48.768928723404242.53322074468085
Table : lpecom_departments
id region_code code name slug
813280Sommesomme
584457Mosellemoselle
197519Corrèzecorreze
633262Pas-de-Calaispas de calais
758474Haute-Savoiehaute savoie
Table : lpecom_regions
id code name slug
1252Pays de la Loirepays de la loire
1576Occitanieoccitanie
303Guyaneguyane
1793Provence-Alpes-Côte d'Azurprovence alpes cote dazur
1684Auvergne-Rhône-Alpesauvergne rhone alpes

Exercice 1

Quelle requête utiliser pour retrouver la ville qui possède les coordonnées GPS suivantes : 48.66913724637683, 1.87586057971015 ?

SQL
SELECT * FROM lpecom_cities WHERE gps_lat = 48.66913724637683 AND gps_lng = 1.87586057971015;

Exercice 2

Sans jointure, quelle requête utiliser pour calculer le nombre de villes que compte le département de l'Essonne ?

SQL
SELECT COUNT(*) FROM lpecom_cities WHERE department_code = 91;

Exercice 3

Sans jointure, quelle requête utiliser pour calculer le nombre de villes en Île-de-France se terminant par "-le-Roi" ?

SQL
SELECT COUNT(*) FROM lpecom_cities WHERE name LIKE "%-le-Roi";

Exercice 4

Combien de villes possèdent le code postal (zip_code) 77320 ? Renommez la colonne de résultat n_cities.

SQL
SELECT COUNT(*) as n_cities FROM lpecom_cities WHERE zip_code = 77320;

Exercice 5

Sans jointure, quelle requête utiliser pour calculer le nombre de villes commençant par "Saint-" en Seine-et-Marne ?

SQL
SELECT COUNT(*) FROM lpecom_cities WHERE name LIKE "SAINT-%" AND department_code = 77;

Exercice 6

Quelles villes possèdent un code postal (zip_code) compris entre 77210 et 77810 ?

SQL
SELECT * FROM lpecom_cities WHERE zip_code BETWEEN 77210 AND 77810;

Exercice 7

Sans jointure, quelles sont les deux villes de Seine-et-Marne à avoir le code postal (zip_code) le plus grand ?

SQL
SELECT * FROM lpecom_cities WHERE department_code = 77 ORDER BY zip_code DESC LIMIT 2;

Exercice 8

Quel est le code postal (zip_code) le plus grand de la table lpecom_cities ?

SQL
SELECT MAX(zip_code) FROM lpecom_cities;

Exercice 9

Avec un seul WHERE et aucun OR, quelle est la requête permettant d'afficher les départements des régions ayant le code suivant : 75, 27, 53, 84 et 93 ? Le résultat doit afficher le nom du département ainsi que le nom et le slug de la région associée.

SQL
SELECT d.name AS departement, r.name AS region, d.slug
FROM lpecom_departments d
INNER JOIN lpecom_regions r ON (d.region_code = r.code)
WHERE d.region_code IN (75, 27, 53, 84, 93);

Exercice 10

Point important, il sera sans doute nécessaire d'utiliser AS pour obtenir le résultat souhaité.

Quelle requête utiliser pour obtenir en résultat, les noms de la région, du département et de chaque ville du département ayant pour code 77 ?

SQL
SELECT r.name as reg, d.name as dep, c.name as ville
FROM lpecom_cities c
INNER JOIN lpecom_departments d ON (c.department_code = d.code)
INNER JOIN lpecom_regions r ON (d.region_code = r.code)
WHERE d.code = 77;

V / Cinquième partie

Ci-après les deux tables à utiliser pour la cinquième partie des exercices. Sujet d'actualité des années 2020 et 2021, la pandémie du COVID-19 va être au coeur de notre sujet pour cette nouvelle partie d'exercices. Nous utiliserons les tables lpecom_covid et lpecom_regions. La table lpecom_covid liste le nombre quotidien de personnes ayant reçu au moins une dose, par date d'injection, par région. Les colonnes n_cum_dose1 et n_cum_dose2 s'occupent de cumuler le nombre d'injection. Les colonnes couv_dose1 et couv_dose2 calculent la couverture vaccinale des régions chaque jour.

Dans les tableaux, seul un extrait des données est affiché, donc toutes les lignes des tables ne sont pas listées. Pour cette nouvelle partie d'exercices, vous pouvez bien évidemment utiliser la console afin de tester vos requêtes.

Table : lpecom_covid
id id_region jour n_dose1 n_dose2 n_cum_dose1 n_cum_dose2 couv_dose1 couv_dose2
404042021-04-0667663340066220824.702.60
202022021-04-066151041833052365.101.50
303032021-04-063013001057251993.601.80
505062021-04-061251841023647813.701.70
101012021-04-062271661050340272.801.10
Table : lpecom_regions
id code name slug
1894Corsecorse
19COMCollectivités d'Outre-Mercollectivites doutre mer
724Centre-Val de Loirecentre val de loire
1144Grand Estgrand est
1475Nouvelle-Aquitainenouvelle aquitaine

Exercice 1

Quelle requête utiliser pour afficher toutes les données de vaccination uniquement pour le 1er avril 2021 ?

SQL
SELECT c.*
FROM lpecom_covid c
WHERE jour = '2021-04-01';

Exercice 2

Quelle requête utiliser pour afficher toutes les données de vaccination uniquement pour le 1er avril 2021 avec le nom de la région concernée ?

SQL
SELECT r.name, c.*
FROM lpecom_covid c
INNER JOIN lpecom_regions r ON c.id_region = r.code
WHERE jour = '2021-04-01';

Exercice 3

Quelle requête utiliser pour afficher le nombre au cumulé de vaccination première dose toutes régions en 2020 ? Proposez également une solution pour les vaccination deuxième dose.

SQL
SELECT SUM(n_dose1)
FROM lpecom_covid c
WHERE jour <= '2020-12-31';
SQL
SELECT SUM(n_dose2)
FROM lpecom_covid c
WHERE jour <= '2020-12-31';

Exercice 4

Quelle requête SQL utiliser pour afficher le nombre au cumulé de vaccination première dose pour la région avec le code 93 uniquement pour le mois de mars 2021 ?

SQL
SELECT SUM(n_dose1)
FROM lpecom_covid c
WHERE id_region = '93'
AND jour BETWEEN '2021-03-01' AND '2021-03-31';

Exercice 5

Quelle requête utiliser pour afficher le nombre au cumulé de vaccination deuxième dose pour la région avec le code 11 uniquement pour le mois de mars 2021 ?

SQL
SELECT SUM(n_dose2)
FROM lpecom_covid c
WHERE id_region = '11'
AND jour BETWEEN '2021-03-01' AND '2021-03-31';

Exercice 6

Quelle requête SQL utiliser pour afficher le record de vaccination première dose en une seule journée ? Avec une deuxième requête, afficher les informations de la région concernée, dont son nom, ainsi que le jour du record.

SQL
SELECT MAX(n_dose1)
FROM lpecom_covid c;
SQL
SELECT c.*, r.name
FROM lpecom_covid c
INNER JOIN lpecom_regions r ON c.id_region = r.code
WHERE c.n_dose1 >= 56661;

Exercice 7

Quelle requête utiliser pour afficher le record de vaccination deuxième dose en une seule journée ? Avec une deuxième requête, afficher les informations de la région concernée, dont son nom, ainsi que le jour du record.

SQL
SELECT MAX(n_dose2)
FROM lpecom_covid c;
SQL
SELECT c.*, r.name
FROM lpecom_covid c
INNER JOIN lpecom_regions r ON c.id_region = r.code
WHERE c.n_dose2 >= 21524;

Exercice 8

Quelles requêtes permettent de connaitre quelle région possède la plus grande couverture de vaccination avec une dose et deux doses ? Vous aurez besoin de 4 requêtes pour répondre aux deux questions. Vous aurez besoin du résultat de la première requête pour la deuxième.

SQL
SELECT MAX(couv_dose1)
FROM lpecom_covid c;
SQL
SELECT c.*, r.name
FROM lpecom_covid c
INNER JOIN lpecom_regions r ON c.id_region = r.code
WHERE c.couv_dose1 >= 19.7;

SQL
SELECT MAX(couv_dose2)
FROM lpecom_covid c;
SQL
SELECT c.*, r.name
FROM lpecom_covid c
INNER JOIN lpecom_regions r ON c.id_region = r.code
WHERE c.couv_dose2 >= 8;

Exercice 9

Quelle requête utiliser pour afficher le nom de la région qui a le plus faible taux de couverture de vaccination avec une dose ? Vous aurez besoin de 2 requêtes pour répondre à la question.

SQL
SELECT MIN(c.couv_dose1)
FROM lpecom_covid c
WHERE c.jour = '2021-04-06';
SQL
SELECT c.*, r.name
FROM lpecom_covid c
INNER JOIN lpecom_regions r ON c.id_region = r.code
WHERE c.jour = '2021-04-06'
AND c.couv_dose1 <= 2.80;

Exercice 10

Quelle requête utiliser pour calculer la couverture moyenne entre les différentes régions à la date la plus récente, pour les vaccinations une et deux doses ? Vous renommez les colonnes de résultats : couverture_dose1_avg et couverture_dose2_avg.

SQL
SELECT AVG(c.couv_dose1) AS couverture_dose1_avg, AVG(c.couv_dose2) AS couverture_dose2_avg
FROM lpecom_covid c
WHERE c.jour = '2021-04-06';

Exercice 11

Quelle requête utiliser pour afficher les données de vaccination des régions (avec leur nom) qui possèdent une couveture vaccinale supérieure à 15 % pour la première dose et supérieure à 5 % pour la deuxième dose ?

SQL
SELECT c.*, r.name
FROM lpecom_covid c
INNER JOIN lpecom_regions r ON c.id_region = r.code
WHERE c.couv_dose1 >= 15
AND c.couv_dose2 >= 5
AND c.jour = '2021-04-06';

VI / Sixième partie

Dans cette sixième partie d'exercices, nous nous intéresserons toujours au même sujet qui nous tient tous en haleine : le COVID-19. Dans cette nouvelle partie, nous travaillerons sur les différents types de vaccins. Nous utiliserons les tables lpecom_covid_vaccin, lpecom_covid_vaccin_type et lpecom_departments. La table lpecom_covid_vaccin liste le nombre quotidien de personnes ayant reçu au moins une dose, par date d'injection, par département. Il y a uniquement les données pour les différents départements de la région Ile-de-France. Les colonnes n_cum_dose1 et n_cum_dose2 s'occupent de cumuler le nombre d'injection.

La table lpecom_covid_vaccin_type liste les différents types de vaccins utilisés pour les injections.

Dans les tableaux, seul un extrait des données est affiché, donc toutes les lignes des tables ne sont pas listées. Pour rappel, il y a uniquement les données pour les différents départements de la région Ile-de-France. Pour cette nouvelle partie d'exercices, vous pouvez bien évidemment utiliser la console afin de tester vos requêtes.

Table : lpecom_covid_vaccin
id dep_code vaccin jour n_dose1 n_dose2 n_cum_dose1 n_cum_dose2
25267502021-04-0652733457370829116607
1027512021-04-0641143384240541109520
2037522021-04-0637075796946
3047532021-04-0611563122709141
26277702021-04-062626191514254744880
Table : lpecom_covid_vaccin_type
id nom
0Tous vaccins
1COMIRNATY Pfizer/BioNTech
2Moderna
3AstraZeneka
Table : lpecom_departments
id region_code code name slug
365335Ille-et-Vilaineille et vilaine
382437Indre-et-Loireindre et loire
603259Nordnord
554454Meurthe-et-Mosellemeurthe et moselle
694468Haut-Rhinhaut rhin

Exercice 1

Sans jointure, quelle requête SQL utiliser pour afficher toutes les données de vaccination du 14 février 2021 uniquement, pour le département de Seine-et-Marne (77) ?

SQL
SELECT *
FROM lpecom_covid_vaccin v
WHERE v.jour = '2021-02-14'
AND v.dep_code = 77;

Exercice 2

Sans jointure, quelle requête SQL utiliser pour afficher le cumul de toutes les données de vaccination pour tous les vaccins du 14 février 2021 uniquement, pour les départements de l'Essonne (91) et de la Seine-et-Marne (77) ?

SQL
SELECT *
FROM lpecom_covid_vaccin v
WHERE v.jour = '2021-02-14'
AND v.dep_code IN (77, 91)
AND v.vaccin = 0;

Exercice 3

Sans jointure, quelle requête utiliser pour afficher la somme des vaccinations première dose réalisées uniquement avec le vaccin AstraZeneka pour le mois de février 2021 pour le département de la Seine-et-Marne (77) ?

SQL
SELECT SUM(v.n_dose1)
FROM lpecom_covid_vaccin v
WHERE v.dep_code = 77
AND v.jour BETWEEN '2021-02-01' AND '2021-02-31'
AND v.vaccin = 3;

Exercice 4

Sans jointure, quelle requête utiliser pour afficher la somme des vaccinations deuxième dose réalisées avec le vaccin AstraZeneka ou Moderna pour le mois de mars 2021 pour le département de la Seine-et-Marne (77) ?

SQL
SELECT SUM(v.n_dose2)
FROM lpecom_covid_vaccin v
WHERE v.dep_code = 77
AND v.jour BETWEEN '2021-03-01' AND '2021-03-31'
AND v.vaccin IN (2, 3);

Exercice 5

Sans jointure, quelle requête utiliser pour afficher le record de vaccination première dose avec un type de vaccin en une seule journée ? Avec une deuxième requête qui exploitera une jointure, afficher toutes les informations possibles pour cette journée record et sur le type de vaccin.

Réponse le 2021-03-12 et AstraZeneka.

SQL
SELECT MAX(v.n_dose1)
FROM lpecom_covid_vaccin v
WHERE v.vaccin != 0;
SQL
SELECT *
FROM lpecom_covid_vaccin v
INNER JOIN lpecom_covid_vaccin_type t ON t.id = v.vaccin
WHERE v.vaccin != 0
AND v.n_dose1 >= 7494;

Exercice 6

Sans jointure, quelle requête utiliser pour afficher le record de vaccination deuxième dose avec un type de vaccin en une seule journée ? Avec une deuxième requête qui exploitera deux jointures, afficher toutes les informations possibles pour cette journée record, sur le type de vaccin et sur le département.

Réponse le 2021-04-02 et Pfizer.

SQL
SELECT MAX(v.n_dose2)
FROM lpecom_covid_vaccin v
WHERE v.vaccin != 0;
SQL
SELECT *
FROM lpecom_covid_vaccin v
INNER JOIN lpecom_covid_vaccin_type t ON t.id = v.vaccin
INNER JOIN lpecom_departments d ON d.code = v.dep_code
WHERE v.vaccin != 0
AND v.n_dose2 >= 5046;

Exercice 7

Quelle requête permet de savoir quel département possède le plus grand nombre d'injections première dose pour le vaccin AstraZeneka ? Avec une deuxième requête, afficher uniquement les colonnes suivantes :

  • le nom du vaccin ;
  • le jour ;
  • le nom et le code du département ;
  • le nombre cumulé d'injections.

SQL
SELECT MAX(v.n_cum_dose1)
FROM lpecom_covid_vaccin v
INNER JOIN lpecom_covid_vaccin_type t ON t.id = v.vaccin
INNER JOIN lpecom_departments d ON d.code = v.dep_code
WHERE jour = '2021-04-06'
AND v.vaccin = 3;
SQL
SELECT v.jour, t.nom, v.n_cum_dose1, d.code, d.name
FROM lpecom_covid_vaccin v
INNER JOIN lpecom_covid_vaccin_type t ON t.id = v.vaccin
INNER JOIN lpecom_departments d ON d.code = v.dep_code
WHERE jour = '2021-04-06'
AND v.vaccin = 3
AND v.n_cum_dose1 >= 122709;

Exercice 8

Quelle requête permet de savoir quel département a eu le moins de vaccinations première dose avec le vaccin COMIRNATY Pfizer/BioNTech ? Avec une deuxième requête, afficher uniquement les colonnes suivantes :

  • le nom du vaccin ;
  • le jour ;
  • le nom et le code du département ;
  • le nombre cumulé d'injections.

SQL
SELECT MIN(v.n_cum_dose1)
FROM lpecom_covid_vaccin v
INNER JOIN lpecom_covid_vaccin_type t ON t.id = v.vaccin
INNER JOIN lpecom_departments d ON d.code = v.dep_code
WHERE jour = '2021-04-06'
AND vaccin = 1;
SQL
SELECT v.jour, t.nom, v.n_cum_dose1, d.code, d.name
FROM lpecom_covid_vaccin v
INNER JOIN lpecom_covid_vaccin_type t ON t.id = v.vaccin
INNER JOIN lpecom_departments d ON d.code = v.dep_code
WHERE jour = '2021-04-06'
AND v.vaccin = 1
AND v.n_cum_dose1 <= 90832;

Exercice 9

Quelle requête permet de connaître la moyenne de vaccinations première dose dans tous les départements pour le vaccin Moderna ? Renommer la colonne de résultat avec avg_moderna.

SQL
SELECT AVG(n_cum_dose1) AS avg_moderna
FROM lpecom_covid_vaccin v
INNER JOIN lpecom_covid_vaccin_type t ON t.id = v.vaccin
INNER JOIN lpecom_departments d ON d.code = v.dep_code
WHERE v.jour = '2021-04-06'
AND v.vaccin = 2;

Exercice 10

Quelle requête utiliser pour afficher les départements (avec leur nom) qui possèdent un nombre d'injections deuxième dose avec le vaccin Moderna supérieur à 9000 ou un nombre d'injections première dose avec le vaccin COMIRNATY Pfizer/BioNTech supérieur à 120000 ? Vous aurez besoin de deux jointures.

SQL
SELECT v.jour, t.nom, v.n_cum_dose1, d.code, d.name
FROM lpecom_covid_vaccin v
INNER JOIN lpecom_covid_vaccin_type t ON t.id = v.vaccin
INNER JOIN lpecom_departments d ON d.code = v.dep_code
WHERE (v.jour = '2021-04-06' AND v.vaccin = 1 AND v.n_cum_dose1 > 120000)
OR (v.jour = '2021-04-06' AND v.vaccin = 2 AND v.n_cum_dose2 > 9000);

VII / Septième partie

Cette nouvelle partie d'exercices concerne les professionnels de santé. Chaque professionnel santé possède un numéro unique, le code RPPS (Répertoire Partagé des Professionnels de Santé). Dans la table lpecom_rpps, ce code unique est stocké dans la colonne id_pp_nat. Nous utiliserons pour cette partie d'exercices 4 tables : lpecom_rpps, lpecom_cities, lpecom_departments et lpecom_regions.

La table lpecom_rpps ne contient que les données pour les professionnels de santé de Seine-et-Marne (77).

Il est possible qu'un professionel de santé apparaisse plusieurs fois dans la table. En effet, un professionel de santé peut pratiquer dans plusieurs communes. Il y a donc des doublons sur la colonne id_pp_nat.

Table : lpecom_rpps
id id_pp_nat nom prenom code_profession lib_profession code_savoir_faire lib_savoir_faire code_postal
5898810000653849TRAN KHAIHOAN10MédecinSM53Spécialiste en Médecine Générale77670
8586810003954020NABIALI10MédecinSM20Gynécologie-obstétrique77527
5027810000136571SIMARTSTEPHANE40Chirurgien-DentisteSCD03Médecine Bucco-Dentaire77290
5148810101026747ROMIOAXEL70Masseur-Kinésithérapeute77165
847810001643989AMAMRAALLAOUA10MédecinSM53Spécialiste en Médecine Générale77100

Exercice 1

Quelle requête SQL utiliser pour compter, sans doublons, le nombre de professionnels de santé en Seine-et-Marne (77) ?

SQL
SELECT COUNT(DISTINCT id_pp_nat)
FROM lpecom_rpps;

Exercice 2

Quelle requête SQL utiliser pour afficher pour tous les professionnels de santé avec le code postal 77300 les colonnes suivantes : id_pp_nat, prenom, nom, code_postal, ville, departement et région. Vous aurez besoin de plusieurs jointures.

SQL
SELECT rpps.id_pp_nat, rpps.prenom, rpps.nom, rpps.code_postal, c.name as ville, d.name as departement, r.name as region
FROM lpecom_rpps rpps
INNER JOIN lpecom_cities c ON (rpps.code_postal = c.zip_code)
INNER JOIN lpecom_departments d ON (c.department_code = d.code)
INNER JOIN lpecom_regions r ON (d.region_code = r.code)
WHERE rpps.code_postal = 77300;