tutto ciò che è inutile aumenta il rischio di danni, semplificando
codice:
SELECT idP, name, q1, q2, q3, time, points, year, grid, position
FROM result
JOIN races s ON result.raceId=s.raceId
JOIN pilota p ON p.cognome=s.surname AND p.nome=s.forename
WHERE year BETWEEN "2011" AND "2015"
con alcune attenzioni,

year (e forse anche time) è un nome di funzione, usarlo come nome di campo può produrre risultati non voluti

name, nome sono la stessa cosa ?

i campi selezionati provengono tutti da result ?