TP 12 : bases de données

Cliquez sur cette invitation pour récupérer le repository du TP.


Présentation


On va utiliser python dans ce tp pout accéder aux bases de données, mais de manière la plus transparente possible.


Un problème de mis-à-jour récent impose d’obliger Colab à passer à la dernière version du module permettant d’utiliser les commandes sql magiques.
La première commande exécutée de votre notebook devra donc être (ajoutez la commande dans une nouvelle cellule au début du notebook) :

%%capture
!pip install ipython-sql==0.5.0

Commençons par cloner le repository Github source dans l’instance Colab.

!git clone https://github.com/Info-TSI-Vieljeux/s3-tp12

Puis, chargeons une extension ipython permettant de se connecter à une base de données et d’interagir avec en SQL.

%load_ext sql

Connectons-nous à la base Population.db issue de données de l’INSEE pour pouvoir tester les exemples du cours et pour quelques questions.

%sql sqlite:///s3-tp12/Population.db

Dorénavent, il suffit de débuter chaque cellule par la commande magique %%sql et d’écrire en dessous vos requêtes SQL. En ajoutant resultats << à la ligne introductive, on stocke le résultat de la requête dans la variable resultats.

%%sql resultats <<

SELECT *
FROM Communes
LIMIT 10;

sqlite:///s3-tp12/F1.db
* sqlite:///s3-tp12/Population.db
Done.
Returning data to local variable resultats

Pour afficher les résultats, il suffit d’exécuter resultats :

resultats
CODREGCODDEPCODCOMCOMPOP
84011L'Abergement-Clémenciat798
84012L'Abergement-de-Varey257
84014Ambérieu-en-Bugey14514
84015Ambérieux-en-Dombes1776
84016Ambléon118
84017Ambronay2915
84018Ambutrix777
84019Andert-et-Condon335
840110Anglefort1122
840111Apremont379

Écrivez une requête affichant le numéro des départements contenant au moins une commune de plus de $100\,000$ habitants ainsi que le nom de ces communes.

Correction (cliquer pour afficher)
SELECT CODDEP, COM
FROM Communes
WHERE POP > 100000;
CODDEPCOM
06Nice
13Aix-en-Provence
14Caen
21Dijon
25Besançon
29Brest
30Nîmes
31Toulouse
33Bordeaux
34Montpellier
35Rennes
37Tours
38Grenoble
42Saint-Étienne
44Nantes
45Orléans
49Angers
51Reims
54Nancy
57Metz
59Lille
63Clermont-Ferrand
66Perpignan
67Strasbourg
68Mulhouse
69Villeurbanne
69Lyon 3e Arrondissement
72Le Mans
74Annecy
75Paris 11e Arrondissement
75Paris 12e Arrondissement
75Paris 13e Arrondissement
75Paris 14e Arrondissement
75Paris 15e Arrondissement
75Paris 16e Arrondissement
75Paris 17e Arrondissement
75Paris 18e Arrondissement
75Paris 19e Arrondissement
75Paris 20e Arrondissement
76Le Havre
76Rouen
80Amiens
83Toulon
87Limoges
92Boulogne-Billancourt
93Montreuil
93Saint-Denis
95Argenteuil
974Saint-Denis
974Saint-Paul

Écrivez maintenant une requête permettant d’obtenir la liste des noms de chaque département associés au nombre de communes qu’ils contiennent, en triant de manière décroissante selon le nombre de communes par département.

Correction (cliquer pour afficher)
SELECT NBCOM,DEP
FROM Departements
ORDER BY NBCOM DESC;
NBCOMDEP
890Pas-de-Calais
800Aisne
772Somme
725Moselle
708Seine-Maritime
698Côte-d'Or
679Oise
648Nord
613Marne
591Meurthe-et-Moselle
586Haute-Garonne
585Eure
573Doubs
565Saône-et-Loire
546Pyrénées-Atlantiques
539Haute-Saône
535Gironde
528Calvados
514Bas-Rhin
512Isère
507Seine-et-Marne
507Vosges
505Dordogne
499Meuse
494Jura
469Hautes-Pyrénées
464Puy-de-Dôme
463Charente-Maritime
461Gers
449Ardennes
446Manche
433Aude
431Aube
426Haute-Marne
423Yonne
393Ain
385Orne
366Haut-Rhin
365Charente
365Eure-et-Loir
364Drôme
354Sarthe
351Gard
348Côtes-d'Armor
342Hérault
335Ardèche
333Ille-et-Vilaine
327Ariège
327Landes
325Loiret
323Loire
319Lot-et-Garonne
317Allier
314Tarn
313Lot
309Nièvre
287Cher
285Aveyron
280Corrèze
279Haute-Savoie
277Finistère
273Savoie
272Indre-et-Loire
267Loir-et-Cher
267Rhône
266Vienne
259Yvelines
258Vendée
257Haute-Loire
256Creuse
256Deux-Sèvres
250Morbihan
246Cantal
241Indre
240Mayenne
236Haute-Corse
226Pyrénées-Orientales
207Loire-Atlantique
198Alpes-de-Haute-Provence
195Tarn-et-Garonne
195Haute-Vienne
194Essonne
184Val-d'Oise
177Maine-et-Loire
163Alpes-Maritimes
162Hautes-Alpes
153Var
152Lozère
151Vaucluse
124Corse-du-Sud
119Bouches-du-Rhône
101Territoire de Belfort
47Val-de-Marne
40Seine-Saint-Denis
36Hauts-de-Seine
34Martinique
32Guadeloupe
24La Réunion
22Guyane
1Paris

Écrivez ensuite une requête permettant d’obtenir la liste des noms de communes donnés plusieurs fois associés au nombre de fois où ils sont répétés, nombre que l’on rebaptisera NB_REDOND. La liste ne devra contenir que les noms donnés au moins 10 fois.

Correction (cliquer pour afficher)
SELECT COM,COUNT(*) AS NB_REDOND
FROM Communes
GROUP BY COM
HAVING NB_REDOND >= 10;
COMNB_REDOND
Beaulieu10
Saint-Aubin10
Saint-Sauveur11
Sainte-Colombe12

Écrivez une requête donnant le nom d’une ville, ici ‘La Rochelle’, le nom du département auquel elle appartient, et le nom de la région auquelle elle appartient.

Correction (cliquer pour afficher)
SELECT COM, DEP, REG
FROM Communes
JOIN Regions ON Communes.CODREG = Regions.CODREG
JOIN Departements ON Communes.CODDEP = Departements.CODDEP
WHERE COM = "La Rochelle";
COMDEPREG
La RochelleCharente-MaritimeNouvelle-Aquitaine
La RochelleHaute-SaôneBourgogne-Franche-Comté

Écrivez enfin une requête donnant le nom du département Charente-Maritime, sa population, le nombre de communes qu’il contient, le nom de la commune la plus peuplée et sa population ainsi que le nom de la commune la moins peuplée et sa population.

Correction (cliquer pour afficher)
SELECT DEP, Departements.POP, Departements.NBCOM, MAXCOM, MAXPOP, MINCOM, MINPOP
FROM ((SELECT CODDEP, COM AS MAXCOM, MAX(POP) AS MAXPOP  
       FROM Communes
       GROUP BY CODDEP) AS MAXOU
       JOIN (SELECT CODDEP, COM AS MINCOM, MIN(POP) AS MINPOP  
             FROM Communes
             GROUP BY CODDEP) AS MINOU 
       ON MINOU.CODDEP = MAXOU.CODDEP) AS Autojointure
JOIN Departements ON Autojointure.CODDEP = Departements.CODDEP
WHERE DEP = "Charente-Maritime";
DEPPOPNBCOMMAXCOMMAXPOPMINCOMMINPOP
Charente-Maritime667287463La Rochelle79333Lussac47

On construit généralement des grosses requêtes comme celle-ci bloc par bloc qu'on joint ensuite ensemble.
Regardons par exemple à quoi ressemble la table intermédiaire Autojointure (qui a été construite, comme son nom l'indique, par autojointure).
SELECT Autojointure.CODDEP, MAXCOM, MAXPOP, MINCOM, MINPOP
FROM
((SELECT CODDEP, COM AS MAXCOM, MAX(POP) AS MAXPOP  
  FROM Communes
  GROUP BY CODDEP) AS MAXOU
  JOIN (SELECT CODDEP, COM AS MINCOM, MIN(POP) AS MINPOP  
        FROM Communes
        GROUP BY CODDEP) AS MINOU 
  ON MINOU.CODDEP = MAXOU.CODDEP) AS Autojointure
CODDEPMAXCOMMAXPOPMINCOMMINPOP
01Bourg-en-Bresse42853Armix31
02Saint-Quentin54851Tannières17
03Montluçon35431Saint-Éloy-d'Allier38
04Manosque23197Majastres4
05Gap42176La Haute-Beaume8
06Nice345528Auvare33
07Annonay16920Lafarre39
08Charleville-Mézières47526Le Mont-Dieu15
09Pamiers16137Senconac13
10Troyes63087Ortillon24
11Narbonne56700Fontanès-de-Sault5
12Rodez26410Arnac-sur-Dourdou37
13Aix-en-Provence148336Saint-Antonin-sur-Bayon127
14Caen108404Rapilly48
15Aurillac26876Valjouze23
16Angoulême43290Saint-Sulpice-de-Ruffec31
17La Rochelle79333Lussac47
18Bourges66606Saint-Céols13
19Brive-la-Gaillarde47615Toy-Viam38
21Dijon161380Les Goulles9
22Saint-Brieuc45099Loc-Envel70
23Guéret13371Beissat25
24Périgueux31476Faurilles36
25Besançon121144Châtillon-sur-Lison8
26Valence66149Rochefourchat1
27Évreux47574Vieux-Port48
28Chartres39698Morainville19
29Brest142555Trégarvan120
2AAjaccio72228Mela30
2BBastia49198Érone12
30Nîmes150786Revens20
31Toulouse498596Bourg-d'Oueil5
32Auch23276Roquepine35
33Bordeaux264257Bossugan38
34Montpellier298933Romiguières23
35Rennes224655Bléruais108
36Châteauroux44662Saint-Médard52
37Tours139843Couziers111
38Grenoble160441Oulles6
39Dole24604Mérona7
40Mont-de-Marsan31220Arx49
41Blois47418La Madeleine-Villefrouin31
42Saint-Étienne175792La Chambonie40
43Le Puy-en-Velay20096Arlet23
44Nantes323975Juigné-des-Moutiers335
45Orléans118632Feins-en-Gâtinais34
46Cahors20877Labastide-du-Haut-Mont51
47Agen33464Boussès36
48Mende13147Sainte-Eulalie38
49Angers158930La Lande-Chasles123
50Cherbourg-en-Cotentin80912Taillepied18
51Reims184114Rouvroy-Ripont4
52Saint-Dizier23427Charmes-en-l'Angle7
53Laval52370Rennes-en-Grenouilles105
54Nancy106504Leménil-Mitry3
55Verdun17906Beaumont-en-Verdunois0
56Lorient58732Hœdic100
57Metz120335Molring5
58Nevers34069Moissy-Moulinot18
59Lille236400Dehéries39
60Beauvais58520Gouy-les-Groseillers25
61Alençon26622Le Ménil-Vicomte23
62Calais73134Guinecourt16
63Clermont-Ferrand150596La Godivelle16
64Pau77070Aubous45
65Tarbes43821Ourdon11
66Perpignan120771Sansa19
67Strasbourg290106Blancherupt34
68Mulhouse109531Lucelle33
69Villeurbanne153294Vernay105
70Vesoul15663Ranzevelle16
71Chalon-sur-Saône46577Chérizet20
72Le Mans146703Nauvay12
73Chambéry60478Champ-Laurent34
74Annecy134101Novel51
75Paris 15e Arrondissement232668Paris 1er Arrondissement16055
76Le Havre170120Le Mesnil-Durdent20
77Meaux56229Montenils25
78Versailles86846Le Tartre-Gaudran37
79Niort61027Les Groseillers57
80Amiens137380Épécamps5
81Albi50625Senaux34
82Montauban62832Goas39
83Toulon180641Vérignon9
84Avignon92821Lagarde-d'Apt33
85La Roche-sur-Yon58103Marillet124
86Poitiers91487Lauthiers70
87Limoges133136Surdoux47
88Épinal33706Maroncourt7
89Auxerre35554Bois-d'Arcy24
90Belfort47242Lamadeleine-Val-des-Anges45
91Évry-Courcouronnes67317Chatignonville69
92Boulogne-Billancourt122825Marnes-la-Coquette1835
93Saint-Denis113766Coubron4963
94Vitry-sur-Seine95969Périgny2712
95Argenteuil111595Charmont36
971Les Abymes54027Terre-de-Bas999
972Fort-de-France77410Grand'Rivière621
973Cayenne65878Saül159
974Saint-Denis155302Saint-Philippe5264

Changeons maintenant de base de données pour celle qui a eu les honneurs de l’épreuve Centrale 2022.
Vous trouverez ci-dessous deux extraits du sujet : d’abord l’introduction générale de l’épreuve puis la présentation de la base.

Petite modification sur la base :

  • to_temps est en ms dans la base qu’on va utiliser.
  • gp_date est de type TEXT (chaîne de caractères). Ex : 2009-03-29.

Les questions qui suivent sont adaptées du sujet 2022.

Pourquoi avoir utilisé la colonne pi_id comme clef primaire de la table pilote et pas la colonne pi_nom ?

  • a : il peut y avoir des noms identiques.
  • b : une clé primaire est forcément constitué d’entiers.
  • c : pi_nom est une clé étrangère renvoyant à la table circuit.
Correction (cliquer pour afficher)
En cas d'homonymes (réponse a). Une clé primaire doit être unique.

Estimez le nombre de lignes de la table Tour d’après les informations données dans l’énoncé du concours :

Correction (cliquer pour afficher)
La table Tour contient un enregistrement par tour d'un participant.
Il y en a donc environ autant que de (nombre de championnats) $\times$ (nombre moyen de grands prix par championnat) $\times$ (nombre moyen de pilotes par grand prix) $\times$ (nombre moyen de tours par grand prix).
Cela donne environ $(2022-1950)\times 20 \times 20 \times 60\approx 1,7.10^6$ soit un peu moins de 2 millions de lignes.

Vérifions grâce à la requête suivante :
SELECT COUNT(*)
FROM Tour;
COUNT(*)
517573

On peut supposer que notre surestimation vient des nombreux abandons ayant empêché les pilotes de boucler tous les tours d'un circuit.
Essayons de vérifier cette hypothèse :

Vérifions d'abord que la base de données va bien jusqu'à 2022 :
SELECT gp_date
FROM GrandPrix
ORDER BY gp_date DESC
LIMIT 3;
gp_date
2022-11-20
2022-11-13
2022-10-30

Vérifions ensuite le nombre moyen de tours par participation :
SELECT AVG(nb_tours)
FROM (SELECT MAX(to_num) AS nb_tours
      FROM Tour
      GROUP BY Pa_id);
AVG(nb_tours)
52.94864450127877

L'écart n'est pas assez grand pour expliquer la valeur obtenue...

Vérifions enfin le nombre moyen de course par année :
SELECT COUNT(*)
FROM GrandPrix;
COUNT(*)
1079

Étant donné que $1079/72\approx15$, l'énoncé nous a fait surestimer cette valeur.

Vérifions enfin le nombre moyen de pilotes par grand prix :
SELECT AVG(nb_pilotes)
FROM (SELECT COUNT(pi_id) AS nb_pilotes
      FROM Participation
      GROUP BY gp_id)
AVG(nb_pilotes)
24.0188679245283

Zut, là ça va dans le mauvais sens (on avait prix 20 pilotes par course)...

Reprenons le calcul : $72\times 15 \times 24 \times 53\approx 1,4.10^6$
On reste encore plus de deux fois trop grand...

L'autre hypothèse est que la base de données n'est pas complète.
SELECT COUNT(*) 
FROM (SELECT * 
      FROM Tour
      GROUP BY pa_id);
COUNT(*)
9775
SELECT COUNT(*) 
FROM Participation;
COUNT(*)
25460

Bingo ! Beaucoup de participations (62%) ne semblent pas avoir de données dans la table Tour.

Connectons-nous à la base :

%load_ext sql
%sql sqlite:///s3-tp12/F1.db

Connected: @s3-tp12/F1.db

Écrire une requête SQL qui liste, par ordre chronologique, la date et le nom du circuit de toutes les courses qui se sont déroulées en France (ci_pays = 'France').

Correction (cliquer pour afficher)
SELECT gp_date,ci_nom
FROM (SELECT ci_nom, ci_pays, gp_date
      FROM GrandPrix
      JOIN Circuit ON GrandPrix.ci_id = Circuit.ci_id)
WHERE ci_pays = 'France'
ORDER BY gp_date;
gp_dateci_nom
1950-07-02Reims-Gueux
1951-07-01Reims-Gueux
1952-07-06Rouen-Les-Essarts
1953-07-05Reims-Gueux
1954-07-04Reims-Gueux
1956-07-01Reims-Gueux
1957-07-07Rouen-Les-Essarts
1958-07-06Reims-Gueux
1959-07-05Reims-Gueux
1960-07-03Reims-Gueux
1961-07-02Reims-Gueux
1962-07-08Rouen-Les-Essarts
1963-06-30Reims-Gueux
1964-06-28Rouen-Les-Essarts
1965-06-27Charade Circuit
1966-07-03Reims-Gueux
1967-07-02Le Mans
1968-07-07Rouen-Les-Essarts
1969-07-06Charade Circuit
1970-07-05Charade Circuit
1971-07-04Circuit Paul Ricard
1972-07-02Charade Circuit
1973-07-01Circuit Paul Ricard
1974-07-07Dijon-Prenois
1975-07-06Circuit Paul Ricard
1976-07-04Circuit Paul Ricard
1977-07-03Dijon-Prenois
1978-07-02Circuit Paul Ricard
1979-07-01Dijon-Prenois
1980-06-29Circuit Paul Ricard
1981-07-05Dijon-Prenois
1982-07-25Circuit Paul Ricard
1982-08-29Dijon-Prenois
1983-04-17Circuit Paul Ricard
1984-05-20Dijon-Prenois
1985-07-07Circuit Paul Ricard
1986-07-06Circuit Paul Ricard
1987-07-05Circuit Paul Ricard
1988-07-03Circuit Paul Ricard
1989-07-09Circuit Paul Ricard
1990-07-08Circuit Paul Ricard
1991-07-07Circuit de Nevers Magny-Cours
1992-07-05Circuit de Nevers Magny-Cours
1993-07-04Circuit de Nevers Magny-Cours
1994-07-03Circuit de Nevers Magny-Cours
1995-07-02Circuit de Nevers Magny-Cours
1996-06-30Circuit de Nevers Magny-Cours
1997-06-29Circuit de Nevers Magny-Cours
1998-06-28Circuit de Nevers Magny-Cours
1999-06-27Circuit de Nevers Magny-Cours
2000-07-02Circuit de Nevers Magny-Cours
2001-07-01Circuit de Nevers Magny-Cours
2002-07-21Circuit de Nevers Magny-Cours
2003-07-06Circuit de Nevers Magny-Cours
2004-07-04Circuit de Nevers Magny-Cours
2005-07-03Circuit de Nevers Magny-Cours
2006-07-16Circuit de Nevers Magny-Cours
2007-07-01Circuit de Nevers Magny-Cours
2008-06-22Circuit de Nevers Magny-Cours
2018-06-24Circuit Paul Ricard
2019-06-23Circuit Paul Ricard
2021-06-20Circuit Paul Ricard
2022-07-24Circuit Paul Ricard

Écrire une requête SQL qui liste, pour chaque course de l’année 2021, le nom du circuit, le nom du pilote gagnant et son temps de course (dans cet ordre).

Correction (cliquer pour afficher)
SELECT ci_nom AS "Grand Prix", pi_nom AS Vainqueur,temps
FROM Participation 
JOIN GrandPrix ON GrandPrix.gp_id = Participation.gp_id
JOIN Circuit ON GrandPrix.ci_id = Circuit.ci_id
JOIN Pilote ON Participation.pi_id = Pilote.pi_id
JOIN (SELECT pa_id,SUM(to_temps) as temps
      FROM Tour
      GROUP BY pa_id) AS tpstot
ON Participation.pa_id = tpstot.pa_id
WHERE gp_date >= 2021 AND gp_date < 2022 AND pa_cla = 1;
Grand PrixVainqueurtemps
Bahrain International CircuitHamilton5523897
Autodromo Enzo e Dino FerrariVerstappen7354598
Autódromo Internacional do AlgarveHamilton5671421
Circuit de Barcelona-CatalunyaHamilton5587680
Circuit de MonacoVerstappen5936820
Baku City CircuitPérez8016410
Circuit Paul RicardVerstappen5245770
Red Bull RingVerstappen4938925
Red Bull RingVerstappen5034543
Silverstone CircuitHamilton7103284
HungaroringOcon7483199
Circuit de Spa-FrancorchampsVerstappen207071
Circuit Park ZandvoortVerstappen5405395
Autodromo Nazionale di MonzaRicciardo4914365
Sochi AutodromHamilton5441001
Istanbul ParkBottas5464103
Circuit of the AmericasVerstappen5676552
Autódromo Hermanos RodríguezVerstappen5919086
Autódromo José Carlos PaceHamilton5542851
Losail International CircuitHamilton5068471
Jeddah Corniche CircuitHamilton7575118
Yas Marina CircuitVerstappen5417345

Que récupère la requête suivante ?

La requête contient deux petites erreurs et une petite bizarrerie. Les identifier et proposer des corrections.

Correction (cliquer pour afficher)
Pour chaque circuit, on récupère son nom, le nom du pilote qui a fait le meilleur tour, la date à laquelle ce tour a eu lieu et le temps du tour.

Erreurs :
  • faute de frappe to_tmps à la fin
  • bugue car nécessite de préciser dans quelle table prendre les ci_id (même si ce sont les mêmes)
  • bizarre de grouper par ci_id, ci_nom... Un seul des deux suffit !
Requête corrigée :
SELECT ci_nom, pi_nom, gp_date, to_temps
FROM (SELECT Circuit.ci_id, ci_nom, MIN(to_temps) AS mtt
        FROM Circuit
            JOIN GrandPrix ON GrandPrix.ci_id = Circuit.ci_id
            JOIN Participation ON Participation.gp_id = GrandPrix.gp_id
            JOIN Tour ON Tour.pa_id = Participation.pa_id
        GROUP BY
            ci_nom
        ) AS rdc
    JOIN GrandPrix ON GrandPrix.ci_id = rdc.ci_id
    JOIN Participation ON Participation.gp_id = GrandPrix.gp_id
    JOIN Pilote ON Pilote.pi_id = Participation.pi_id
    JOIN Tour ON Tour.pa_id = Participation.pa_id AND to_temps = mtt
ORDER BY
    ci_nom;
ci_nompi_nomgp_dateto_temps
A1-RingSchumacher2003-05-1868337
Albert Park Grand Prix CircuitLeclerc2022-04-1080260
Autodromo Enzo e Dino FerrariHamilton2020-11-0175484
Autodromo Internazionale del MugelloHamilton2020-09-1378833
Autodromo Nazionale di MonzaBarrichello2004-09-1281046
Autódromo Hermanos RodríguezBottas2021-11-0777774
Autódromo Internacional do AlgarveHamilton2020-10-2578750
Autódromo José Carlos PaceBottas2018-11-1170540
Autódromo Juan y Oscar GálvezBerger1997-04-1387981
Autódromo do EstorilVilleneuve1996-09-2282873
Bahrain International CircuitRussell2020-12-0655404
Baku City CircuitLeclerc2019-04-28103009
Buddh International CircuitVettel2011-10-3087249
Circuit Gilles VilleneuveBottas2019-06-0973078
Circuit Park ZandvoortHamilton2021-09-0571097
Circuit Paul RicardVettel2019-06-2392740
Circuit de Barcelona-CatalunyaFisichella2005-05-0875641
Circuit de MonacoHamilton2021-05-2372909
Circuit de Nevers Magny-CoursCoulthard2002-07-2175045
Circuit de Spa-FrancorchampsRäikkönen2004-08-29105108
Circuit of the AmericasLeclerc2019-11-0396169
Circuito de JerezFrentzen1997-10-2683135
Fuji SpeedwayMassa2008-10-1278426
HockenheimringRäikkönen2004-07-2573780
HungaroringSchumacher2002-08-1876207
Indianapolis Motor SpeedwayBarrichello2004-06-2070399
Istanbul ParkPablo Montoya2005-08-2184770
Jeddah Corniche CircuitHamilton2021-12-0590734
Korean International CircuitVettel2011-10-1699605
Losail International CircuitVerstappen2021-11-2183196
Marina Bay Street CircuitMagnussen2018-09-16101905
NürburgringPablo Montoya2001-06-2478354
Red Bull RingSainz2020-07-1265619
Sepang International CircuitVettel2017-10-0194080
Shanghai International CircuitSchumacher2004-09-2692238
Silverstone CircuitSchumacher2004-07-1178739
Sochi AutodromHamilton2019-09-2995761
Suzuka CircuitHamilton2019-10-1390983
Valencia Street CircuitGlock2009-08-2398683
Yas Marina CircuitVerstappen2021-12-1286103