Quando si lavora con il database, potrebbe essere necessario mettere insieme i dati di alcune tabelle diverse. Questo articolo ti mostrerà come fare.
Ho già scritto sui join SQL qui e qui, ma prendiamoci un momento per esaminare prima come funziona un join, e in particolare la sintassi specifica per MySQL.
Istruzione SQL Join
Join è un'istruzione che ti consente di mettere insieme due tabelle, facendo corrispondere le righe correlate tra loro e mantenendo solo le righe che possono essere abbinate, non mantenendo le righe non accoppiate.
SELECT * FROM table1
INNER JOIN table2
ON table1.id = table2.id;
Il SELECT ... FROM
indica qual è la prima tabella, quindi il nome della seconda tabella viene scritto subito dopo il INNER JOIN
parole chiave.
Il modo in cui le due tabelle devono essere unite è scritto in ON
dichiarazione. In questo caso le due tabelle vengono unite usando la relazione table1.id = table2.id
.
È possibile utilizzare più istruzioni join insieme per unire più tabelle contemporaneamente.
SELECT *
FROM table1
INNER JOIN table2
ON table1.id = table2.id
INNER JOIN table3
ON table2.id = table3.id;
Per farlo aggiungi un secondo INNER JOIN
istruzione e un secondo ON
istruzione per indicare la terza tabella e la seconda relazione.
Parliamo un momento delle relazioni che puoi avere tra i tavoli e del motivo per cui potresti voler unire tre tavoli insieme.
Relazioni tra tabelle in SQL
Quando hai tabelle correlate tra loro, le loro relazioni potrebbero essere di vari tipi.
uno-a-molti
In un tipo di relazione uno-a-molti, una riga della prima tabella può essere correlata a più righe della seconda tabella.
In un database relazionale questo può essere implementato con la seconda tabella che ha un first_table_id
colonna che dice a quale riga della prima tabella è correlata quella riga.
molti-a-uno
In un tipo di relazione molti-a-uno, una riga della prima tabella può essere correlata a una singola riga della seconda tabella e una riga della seconda tabella può essere correlata a più righe della prima tabella.
In un database relazionale questo può essere implementato con la prima tabella che ha un second_table_id
colonna che dice a quale riga della seconda tabella è correlata quella riga.
molti-a-molti
In questo caso più righe sono correlate a più righe.
Questo tipo di relazione non può essere rappresentato come con le tabelle SQL:è necessario aggiungere una tabella di accoppiamento tra le due tabelle in modo che tra le tabelle siano presenti solo relazioni molti-a-uno e uno-a-molti.
Ogni riga della tabella al centro rappresenta una relazione tra le righe della tabella di sinistra e le righe della tabella di destra.
In pratica in MySQL, quella tabella centrale avrà una colonna per first_table_id
e una colonna per second_table_id
, con ogni combinazione unica.
Unire tabelle SQL in pratica
Immaginiamo di avere il database di un'organizzazione, dove abbiamo una tabella con i team (il loro nome e altre informazioni identificative) e una tabella con i progetti (nome, stato di avanzamento e così via).
id | nome_squadra | specialità |
---|---|---|
1 | Lanciabanane | Banane |
2 | Rosa legno | Rosicchiare il legno |
3 | Gli elefanti rosa | Calpestare il terreno |
4 | Patate soffici | Lavorare e dormire |
id | nome_progetto | progressi |
---|---|---|
1 | Costruzione della diga | Sono necessari altri lavori per rosicchiare il legno e pestare il terreno |
2 | Torta alla banana | Qualcuno sta mangiando tutte le banane |
3 | Ricerca sul sonno | Troppo dormire non abbastanza ricerche |
Poiché una squadra può lavorare su più progetti e un progetto può essere lavorato da più squadre, c'è anche una terza tabella che tiene traccia delle partite squadra-progetto.
id_progetto | ID_gruppo |
---|---|
1 | 2 |
1 | 3 |
2 | 1 |
3 | 1 |
3 | 2 |
3 | 3 |
3 | 4 |
Possiamo usare un JOIN
dichiarazione per mettere insieme tutto quando abbiamo bisogno di visualizzare le informazioni dalle tabelle in un modo leggibile dall'uomo, in questo modo:
SELECT
teams.team_name AS team_name,
projects.project_name AS project_name
FROM TABLE teams
INNER JOIN matches
ON teams.id = matches.team_id
INNER JOIN matches
ON matches.project_id = projects.id
ORDER BY teams.id;
Scegliamo quali colonne mostrare da ogni tabella con un SELECT
dichiarazione.
Specifichiamo come le righe delle tabelle devono essere combinate con un ON
dichiarazione.
E ordiniamo le righe nel modo che preferiamo con un ORDER BY
dichiarazione.
Il ON
dichiarazioni teams.id = matches.team_id
e matches.projects_id = projects.id
significa che le righe vengono combinate utilizzando le righe dei matches
tavolo. Ogni riga della tabella di output ha il nome del progetto e il nome del team combinati utilizzando le coppie di ID progetto e ID squadra nelle matches
tabella.
La tabella di output apparirà come di seguito.
Nome_squadra | Nome_progetto |
---|---|
Lanciabanane | Torta alla banana |
Lanciabanane | Ricerca sul sonno |
Rosa legno | Costruzione della diga |
Rosa legno | Ricerca sul sonno |
Gli elefanti rosa | Costruzione della diga |
Gli elefanti rosa | Costruzione della diga |
Patate morbide | Ricerca sul sonno |
Non ci sono colonne direttamente dalle matches
tavolo. Il matches
la tabella non viene mostrata nell'output ma viene utilizzata come istruzioni su come combinare le righe dei teams
e projects
tabelle.
Conclusione
Il JOIN
istruzione ti consente di unire insieme una o più tabelle. Deve essere utilizzato insieme a ON
istruzione per determinare la relazione tra le righe di una tabella e le righe di una tabella diversa.
In questo articolo hai imparato come usare il JOIN
dichiarazione per unire tre diverse tabelle.