CodeGym /Corsi /SQL SELF /Join multipli JOIN in una sola query

Join multipli JOIN in una sola query

SQL SELF
Livello 12 , Lezione 1
Disponibile

Immagina che ogni tabella nel tuo database sia un pezzo di un grande puzzle. La tabella degli studenti sa chi studia, la tabella dei corsi — cosa si insegna, e la tabella delle iscrizioni — chi è iscritto a cosa. Ma separati questi pezzi non dicono molto. Vuoi vedere il quadro completo? Devi unirli — ed è qui che entra in gioco il join multiplo JOIN.

Nella vita reale i dati sono spesso organizzati in tabelle collegate per mantenere la struttura ed evitare ridondanza. Ad esempio, nel nostro database universitario abbiamo queste tabelle:

  • students — dati sugli studenti.
  • enrollments — info sulle iscrizioni degli studenti ai corsi.
  • courses — info sui corsi.

Se vogliamo ottenere la lista completa di studenti, i loro corsi e i docenti, dobbiamo unire tre tabelle usando JOIN.

Ordine di esecuzione dei JOIN

Quando usi più JOIN, PostgreSQL li processa da sinistra a destra. Significa che prima si uniscono le prime due tabelle, poi il risultato si unisce alla terza, e così via.

Esempio:

SELECT *
FROM students
    INNER JOIN enrollments ON students.id = enrollments.student_id
    INNER JOIN courses ON enrollments.course_id = courses.id;
  1. Prima si uniscono le tabelle students e enrollments sulla colonna students.id = enrollments.student_id.
  2. Il risultato della prima join viene usato per unirsi alla tabella courses sulla colonna enrollments.course_id = courses.id.

L’ordine di esecuzione è super importante quando hai tabelle grandi nella query. Una struttura di JOIN sbagliata può rallentare tutto di brutto.

Esempio: Lista di studenti, i loro corsi e docenti

Supponiamo di avere queste tabelle con dati:

Tabella students:

id name
1 Otto Song
2 Maria Chi
3 Alex Lin

Tabella courses:

id name teacher
101 Mathematics Ellen Moore
102 Physics James Okoro
103 Computer Science Nina Delgado

Tabella enrollments:

student_id course_id
1 101
1 103
2 102
3 101

Query:

SELECT
    students.name AS student_name,
    courses.name AS course_name,
    courses.teacher AS teacher_name
FROM students
    INNER JOIN enrollments ON students.id = enrollments.student_id
    INNER JOIN courses ON enrollments.course_id = courses.id;

Risultato:

student_name course_name teacher_name
Otto Song Mathematics Ellen Moore
Otto Song Computer Science Nina Delgado
Maria Chi Physics James Okoro
Alex Lin Mathematics Ellen Moore

Filtrare nelle query con join multipli JOIN

Puoi usare condizioni di filtro nelle query con JOIN per limitare i dati restituiti e velocizzare la query. Ad esempio, se vuoi vedere solo gli studenti che seguono il corso "Mathematics":

SELECT
    students.name AS student_name,
    courses.name AS course_name
FROM students
    INNER JOIN enrollments ON students.id = enrollments.student_id
    INNER JOIN courses ON enrollments.course_id = courses.id
WHERE courses.name = 'Mathematics';

Risultato:

student_name course_name
Otto Song Mathematics
Alex Lin Mathematics

Ottimizzazione delle query con join multipli JOIN

Quando lavori con tabelle grandi, ottimizzare le query è fondamentale. Ecco qualche dritta:

  1. Usa gli indici

Gli indici permettono a PostgreSQL di lavorare più veloce, soprattutto quando fai join su colonne chiave. Assicurati che sulle colonne student_id e course_id nella tabella enrollments ci siano indici.

Esempio di creazione indice:

CREATE INDEX idx_enrollments_student_id ON enrollments(student_id);
CREATE INDEX idx_enrollments_course_id ON enrollments(course_id);

Scoprirai di più sugli indici nei prossimi livelli, ma volevo già accennarli qui. Sono spesso legati ai JOIN.

  1. Filtra i dati il prima possibile

Usa le condizioni WHERE per ridurre il numero di righe elaborate prima di fare il JOIN. Ad esempio:

SELECT
    students.name AS student_name,
    courses.name AS course_name
FROM students
    INNER JOIN enrollments ON students.id = enrollments.student_id
    INNER JOIN courses ON enrollments.course_id = courses.id
WHERE 
    courses.teacher = 'Ivan Petrov';
  1. Minimizza il numero di righe da unire

Invece di unire tutte le righe di due tabelle, prova prima a filtrarle con delle subquery:

SELECT
    students.name AS student_name,
    courses.name AS course_name
FROM 
    (SELECT * FROM students WHERE id IN (1, 2)) sub_students
INNER JOIN enrollments ON sub_students.id = enrollments.student_id
INNER JOIN courses ON enrollments.course_id = courses.id;

Scoprirai di più sui SELECT annidati letteralmente nel prossimo livello :P

Esempio di join complesso: studenti, corsi e facoltà

Supponiamo che aggiungiamo un’altra tabella faculties:

Tabella faculties:

id name
10 Engineering
20 Natural Sciences

Tabella courses aggiornata:

id name teacher faculty_id
101 Mathematics Ellen Moore 10
102 Physics James Okoro 20
103 Computer Science Nina Delgado 10

Per ottenere la lista di studenti, corsi e facoltà, aggiungiamo un altro JOIN:

SELECT
    students.name AS student_name,
    courses.name AS course_name,
    faculties.name AS faculty_name
FROM students
    INNER JOIN enrollments ON students.id = enrollments.student_id
    INNER JOIN courses ON enrollments.course_id = courses.id
    INNER JOIN faculties ON courses.faculty_id = faculties.id;

Risultato:

student_name course_name faculty_name
Otto Song Mathematics Engineering
Otto Song Computer Science Engineering
Maria Chi Physics Natural Sciences
Alex Lin Mathematics Engineering

Le query SQL con join multipli possono essere toste, ma ti permettono di creare report potenti e ottenere info preziose. Se le ottimizzi e strutturi bene, diventano il tuo strumento top per lavorare con grandi database.

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION