Non è strettamente necessario per la query, è vero. Esiste per diversi motivi:
- Come vincolo sul tavolo per impedirti di inserire qualcosa che non punta a nulla;
- Come indizio per l'ottimizzatore; e
- Per ragioni storiche dove ce n'era più bisogno.
(1) è probabilmente quello importante dei tre. Questo si chiama integrità referenziale . Significa che se c'è un valore in una chiave esterna, ci sarà un record corrispondente con quel valore come chiave primaria nella tabella padre.
Detto questo, non tutti i database supportano l'integrità referenziale (ad es. tabelle MySQL/MyISAM) e quelli che non la applicano necessariamente (per motivi di prestazioni).