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;
- Prima si uniscono le tabelle
studentseenrollmentssulla colonnastudents.id = enrollments.student_id. - Il risultato della prima join viene usato per unirsi alla tabella
coursessulla colonnaenrollments.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:
- 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.
- 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';
- 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.
GO TO FULL VERSION