INNER JOIN

Gli argomenti di questa pagina

  • Sintassi per la INNER JOIN
  • Primi esempi semplici sulle tabelle sql_agenda e sql_citta
  • Statistiche sui libri
  • JOIN su più tabelle
  • JOIN con doppia specifica
  • Esempio di JOIN con ALIAS su tabelle

Sintassi per la INNER JOIN

La sintassi base per la INNER JOIN non è complessa.

SELECT elenco campi
FROM tabella1 INNER JOIN tabella2
ON specifica di JOIN
WHERE condizioni di ricerca
ORDER BY elenco campi

Primi esempi semplici sulle tabelle sql_agenda e sql_citta

Questa è la struttura delle due tabelle usate per gli esempi.

Field Type Null Key Default Extra
id int NO PRI auto_increment
cognome varchar(250) NO
nome varchar(250) NO
indirizzo varchar(250) NO
id_citta int NO
data_nascita date NO
telefono varchar(250) NO
I campi della tabella sql_agenda:
id, cognome, nome, indirizzo, id_citta, data_nascita, telefono
Field Type Null Key Default Extra
id int NO PRI auto_increment
cap varchar(10) YES
citta varchar(250) YES
prov varchar(10) YES
I campi della tabella sql_citta:
id, cap, citta, prov

Creare un elenco dei miei contatti e della città dove abitano

1
2
3
4
5
6
7
8
<?php
$Query 
"SELECT sql_agenda.cognome, sql_agenda.nome, 
sql_citta.cap, sql_citta.citta, sql_citta.prov
FROM sql_agenda 
INNER JOIN sql_citta 
ON sql_agenda.id_citta = sql_citta.id
"
;
?>
103 record trovati
15 record visualizzati
cognome nome cap citta prov
Migliavacca Luigi 38030 Varena TN
Rizzi Carlo 38030 Varena TN
Liberali Franca 23821 Abbadia Lariana LC
Di Maggio Mario 67010 Ville di Fano AQ
Scicchitano Andrea 67010 Ville di Fano AQ
Edelvisi Maurizio 67010 Ville di Fano AQ
Gerardini Silvano 67010 Ville di Fano AQ
Pasotti Alessio 20050 Correzzana MB
Calvi Giovanni 58010 Marsiliana GR
Poggi Giuseppe 23821 Abbadia Lariana LC
Curti Oreste 67010 Ville di Fano AQ
Borsotti Mirella 67010 Ville di Fano AQ
Franchinotti Anna 23821 Abbadia Lariana LC
Pischedda Giovanni 60015 Falconara Alta AN
Maini Marilena 12011 Borgo S. Dalmazzo CN
... ... ... ... ...

Creare un elenco dei miei contatti e della città dove abitano, ma mostra più dettagli sui miei contatti

1
2
3
4
5
6
7
8
9
10
<?php
$Query_join 
"SELECT sql_agenda.cognome, sql_agenda.nome, sql_agenda.indirizzo, 
sql_citta.id AS id_citta, sql_citta.cap, sql_citta.citta, sql_citta.prov, 
DATE_FORMAT( sql_agenda.data_nascita, '%d-%m-%Y' ) AS nato, 
sql_agenda.telefono 
FROM sql_agenda 
INNER JOIN sql_citta 
ON sql_agenda.id_citta = sql_citta.id
"
;
?>
103 record trovati
15 record visualizzati
cognome nome indirizzo id_citta cap citta prov nato telefono
Migliavacca Luigi VIA P. FIMIANI TRIVIO 21 38030 Varena TN 22-01-2004 084 41655
Rizzi Carlo VIA SABIN, 34/2 21 38030 Varena TN 22-11-2007 07 9940508
Liberali Franca VIA DEL TUSCOLANO, 1 2 23821 Abbadia Lariana LC 20-08-2004 036 348719
Di Maggio Mario TERMINAL CONTENITORI MOLO VII 22 67010 Ville di Fano AQ 21-05-2009 051 18752
Scicchitano Andrea VIA SABIN, 34/2 22 67010 Ville di Fano AQ 12-01-1997 07 74891
Edelvisi Maurizio VIA MATTEO RICCI, 12 22 67010 Ville di Fano AQ 02-07-1987 079 89428
Gerardini Silvano Z.I SAMBUCETO 22 67010 Ville di Fano AQ 12-08-2009 012 164848
Pasotti Alessio VIA SABIN, 34/2 13 20050 Correzzana MB 14-11-1987 05 9552713
Calvi Giovanni VIA SABIN, 34/2 18 58010 Marsiliana GR 26-07-1987 044 5602773
Poggi Giuseppe VIA SABIN, 34/2 2 23821 Abbadia Lariana LC 25-01-1987 08 0640120
Curti Oreste STRADA MARCHESANE, 43_4 22 67010 Ville di Fano AQ 26-06-1988 027 42781
Borsotti Mirella VIA DEL TUSCOLANO, 1 22 67010 Ville di Fano AQ 19-07-1987 09 379786
Franchinotti Anna VIA BREDINA, 6 2 23821 Abbadia Lariana LC 10-05-2009 062 8880
Pischedda Giovanni VIA MATTEO RICCI, 12 14 60015 Falconara Alta AN 08-08-1999 07 628585
Maini Marilena MACRON TICHON STREET, 27 6 12011 Borgo S. Dalmazzo CN 20-03-2002 02 6638
... ... ... ... ... ... ... ... ...

Creare un elenco dei miei contatti nati dopo il 2000 e della città dove abitano

1
2
3
4
5
6
7
8
9
10
11
<?php
$Query 
"SELECT sql_agenda.cognome, sql_agenda.nome, 
DATE_FORMAT( sql_agenda.data_nascita, '%d-%m-%Y' ) AS nato, 
sql_citta.cap, sql_citta.citta, sql_citta.prov
FROM sql_agenda
INNER JOIN sql_citta 
ON sql_agenda.id_citta = sql_citta.id
WHERE data_nascita > '1999-12-31' 
ORDER BY data_nascita 
"
;
?>
41 record trovati
15 record visualizzati
cognome nome nato cap citta prov
De Paula Loredana 20-01-2000 06031 Bevagna PG
Dionisio Andrea 28-01-2000 39013 Moso in passiria BZ
Basilio Davide 26-09-2000 06031 Bevagna PG
Zeva Oronza 13-02-2001 17010 Giusvalla SV
Orlandi Enrico 13-02-2001 67010 Ville di Fano AQ
Mongelli Natalina 16-04-2001 06031 Bevagna PG
Castagna Attilio 20-08-2001 06031 Bevagna PG
Derosa Valeria 14-11-2001 06031 Bevagna PG
Zerlenga Francesco 25-01-2002 23821 Abbadia Lariana LC
Maini Marilena 20-03-2002 12011 Borgo S. Dalmazzo CN
Helvetia Italia 12-08-2002 89030 Condofuri RC
Broccardo Andrea 22-11-2002 23821 Abbadia Lariana LC
Buscetti Editta 25-01-2003 06031 Bevagna PG
Scicchitano Pierluigi 02-05-2003 23821 Abbadia Lariana LC
Migliavacca Luigi 22-01-2004 38030 Varena TN
... ... ... ... ... ...

Statistiche sui libri

La tabella che ci dice quali sono i libri prestati è sql_lib_prestiti. Però in questa tabella i libri ed i clienti che li hanno presi in prestito non sono indicati esplicitamente ma solo tramite un ID (id_libro, id_iscritto) che fanno riferimento alla tabella sql_libri e sql_agenda dalle quali possiamo prelevare i dati completi (nella tabella sottostante le date non sono formattate ma vengono mostrate come sono registrate nel DB).

Questa è la struttura delle tre tabelle

Field Type Null Key Default Extra
id int NO PRI auto_increment
id_libro int NO
id_iscritto int NO
data_prestito date YES
data_restituzione date YES
I campi della tabella sql_lib_prestiti:
id, id_libro, id_iscritto, data_prestito, data_restituzione
Field Type Null Key Default Extra
id int NO PRI auto_increment
gruppo varchar(50) YES
codice varchar(10) YES
Titolo varchar(100) NO
Autore varchar(150) YES
prezzo decimal(8,2) NO
quantita int NO
I campi della tabella sql_libri:
id, gruppo, codice, Titolo, Autore, prezzo, quantita
Field Type Null Key Default Extra
id int NO PRI auto_increment
cognome varchar(250) NO
nome varchar(250) NO
indirizzo varchar(250) NO
id_citta int NO
data_nascita date NO
telefono varchar(250) NO
I campi della tabella sql_agenda:
id, cognome, nome, indirizzo, id_citta, data_nascita, telefono

Per questo motivo è necessario collegare la tabella sql_libri con la tabella sql_lib_prestiti in questa maniera

Mostra un elenco dei libri prestati

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$Query 
"SELECT 
sql_libri.id, 
sql_libri.Titolo, 
sql_libri.gruppo, 
DATE_FORMAT( sql_lib_prestiti.data_prestito, '%d-%m-%Y' ) AS prestato 
FROM sql_libri
    INNER JOIN sql_lib_prestiti 
        ON sql_libri.id = sql_lib_prestiti.id_libro 
ORDER BY sql_lib_prestiti.data_prestito DESC
"
;
?>
10 record trovati
10 record visualizzati
id Titolo gruppo prestato
20 Poser 4 Pro curiouslabs 02-05-2014
2 Macromedia Flash 6 macromedia 19-04-2014
2 Macromedia Flash 6 macromedia 01-04-2014
8 Macromedia Spectra macromedia 29-03-2014
21 Kai`s PhotoSoap2 scansoft 10-03-2014
15 CorelDRAW corel 13-02-2014
5 Adobe Photoshop 7.0 adobe 20-01-2014
5 Adobe Photoshop 7.0 adobe 15-03-2013
10 Adobe Digital Video Collection adobe 02-02-2013
9 Adobe After Effects 5.5 adobe 01-01-2012

Ora due Query complementari tra loro: con la prima vedo i libri che sono stati resi e con la seconda quelli che risultano non resi. In entrambi i casi viene effettuata una JOIN sulla tabella sql_lib_prestiti e la tabella sql_libri.

Mostra i libri prestati e non resi

1
2
3
4
5
6
7
<?php
$Query 
"SELECT sql_lib_prestiti.id_libro, sql_libri.Titolo, sql_libri.gruppo
FROM sql_libri
INNER JOIN sql_lib_prestiti ON sql_libri.id = sql_lib_prestiti.id_libro
WHERE data_restituzione IS NULL
"
;
?>
5 record trovati
5 record visualizzati
id_libro Titolo gruppo
20 Poser 4 Pro curiouslabs
15 CorelDRAW corel
2 Macromedia Flash 6 macromedia
5 Adobe Photoshop 7.0 adobe
10 Adobe Digital Video Collection adobe

Mostra i libri prestati e resi

1
2
3
4
5
6
7
8
<?php
$Query 
"SELECT sql_lib_prestiti.id_libro, sql_libri.Titolo, sql_libri.gruppo, 
DATE_FORMAT( sql_lib_prestiti.data_restituzione, '%d-%m-%Y' ) AS reso
FROM sql_libri
INNER JOIN sql_lib_prestiti ON sql_libri.id = sql_lib_prestiti.id_libro
WHERE data_restituzione IS NOT NULL
"
;
?>
5 record trovati
5 record visualizzati
id_libro Titolo gruppo reso
2 Macromedia Flash 6 macromedia 15-04-2014
8 Macromedia Spectra macromedia 09-04-2014
5 Adobe Photoshop 7.0 adobe 19-04-2013
9 Adobe After Effects 5.5 adobe 10-04-2013
21 Kai`s PhotoSoap2 scansoft 09-04-2014

JOIN su più tabelle

Per rispondere ad alcuni quesiti è necessario coinvolgere anche più di due tabelle come nel seguente esempio. Questa la struttura delle tabelle coinvolte

Field Type Null Key Default Extra
id int NO PRI auto_increment
cognome varchar(250) NO
nome varchar(250) NO
indirizzo varchar(250) NO
id_citta int NO
data_nascita date NO
telefono varchar(250) NO
I campi della tabella sql_agenda:
id, cognome, nome, indirizzo, id_citta, data_nascita, telefono
Field Type Null Key Default Extra
id int NO PRI auto_increment
gruppo varchar(50) YES
codice varchar(10) YES
Titolo varchar(100) NO
Autore varchar(150) YES
prezzo decimal(8,2) NO
quantita int NO
I campi della tabella sql_libri:
id, gruppo, codice, Titolo, Autore, prezzo, quantita
Field Type Null Key Default Extra
id int NO PRI auto_increment
cap varchar(10) YES
citta varchar(250) YES
prov varchar(10) YES
I campi della tabella sql_citta:
id, cap, citta, prov
Field Type Null Key Default Extra
id int NO PRI auto_increment
id_libro int NO
id_iscritto int NO
data_prestito date YES
data_restituzione date YES
I campi della tabella sql_lib_prestiti:
id, id_libro, id_iscritto, data_prestito, data_restituzione

La richiesta:

Dammi un elenco dei clienti che hanno preso dei libri

La richiesta sembra semplice. Tuttavia osservendo la struttura delle tabelle notiamo che non c'è un collegamento diretto che colleghi i Clienti con i libri. Per collegare i clienti (sql_agenda) con i libri (sql_libri) dovremo passare anche per la tabella del movimento dei libri (sql_lib_prestiti) collegando prima sql_agenda con sql_lib_prestiti, quindi sql_lib_prestiti con sql_libri, come è mostrato nella prossima Query.

1
2
3
4
5
6
7
8
<?php
$Query 
"SELECT sql_agenda.cognome, sql_agenda.nome, sql_libri.Titolo
FROM sql_agenda
INNER JOIN sql_lib_prestiti ON sql_agenda.id = sql_lib_prestiti.id_iscritto
INNER JOIN sql_libri ON sql_lib_prestiti.id_libro = sql_libri.id 
ORDER BY sql_agenda.cognome, sql_agenda.nome
"
;
?>
10 record trovati
10 record visualizzati
cognome nome Titolo
Alama Ornella CorelDRAW
Alcantara Pinuccia Adobe Digital Video Collection
Arquati Dorotea Adobe After Effects 5.5
Basilio Davide Macromedia Flash 6
Basilio Davide Kai`s PhotoSoap2
Bialetti Vincenzo Adobe Photoshop 7.0
Borsotti Mirella Poser 4 Pro
Curti Oreste Adobe Photoshop 7.0
Orlandi Enrico Macromedia Spectra
Scicchitano Andrea Macromedia Flash 6

Ora proviamo con un'altra richiesta che come la precedente sembra semplice ma la cui risoluzione richiede un percorso ancora più lungo. Le tabelle su cui si lavora sono sempre le solite quattro.

In quali città sono distribuiti i libri prestati?

Anche in questo caso occorre creare il percorso che unisce le due tabelle sql_libri e sql_citta

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$Query 
"SELECT sql_libri.Titolo, sql_libri.Autore, 
sql_citta.cap, sql_citta.citta, sql_citta.prov
FROM sql_citta 
INNER JOIN sql_agenda 
    ON sql_citta.id = sql_agenda.id_citta
INNER JOIN sql_lib_prestiti 
    ON sql_agenda.id = sql_lib_prestiti.id_iscritto
INNER JOIN sql_libri 
    ON sql_libri.id = sql_lib_prestiti.id_libro
ORDER BY sql_libri.Titolo
"
;
?>
10 record trovati
10 record visualizzati
Titolo Autore cap citta prov
Adobe After Effects 5.5 Shannyn Sossamon e Geri Halliwell 35031 AbanoTerme PD
Adobe Digital Video Collection Eddie Murphy e Nicole Mitchell 12040 Isola di bene vagienna CN
Adobe Photoshop 7.0 Kim Basinger 67010 Ville di Fano AQ
Adobe Photoshop 7.0 Kim Basinger 06031 Bevagna PG
CorelDRAW Joe Strummer 67020 Castelvecchio calvisio AQ
Kai`s PhotoSoap2 Tonya Lewis Lee 06031 Bevagna PG
Macromedia Flash 6 Shannyn Sossamon 67010 Ville di Fano AQ
Macromedia Flash 6 Shannyn Sossamon 06031 Bevagna PG
Macromedia Spectra Spike Lee e Tonya Lewis Lee 67010 Ville di Fano AQ
Poser 4 Pro Alec Baldwin 67010 Ville di Fano AQ

In questa Query invece delle città vengono mostrati i nomi dei clienti.

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$Query 
"SELECT sql_lib_prestiti.id, sql_libri.gruppo, sql_libri.codice, sql_libri.Titolo, sql_libri.Autore, 
sql_agenda.cognome, sql_agenda.nome, 
DATE_FORMAT( sql_lib_prestiti.data_prestito, '%d-%m-%Y' ) AS uscito, 
DATE_FORMAT( sql_lib_prestiti.data_restituzione, '%d-%m-%Y' ) AS reso 
FROM sql_lib_prestiti 
INNER JOIN sql_libri 
    ON sql_libri.id = sql_lib_prestiti.id_libro 
INNER JOIN sql_agenda 
    ON sql_agenda.id = sql_lib_prestiti.id_iscritto 
"
;
?>
10 record trovati
10 record visualizzati
id gruppo codice Titolo Autore cognome nome uscito reso
1 macromedia MC003 Macromedia Flash 6 Shannyn Sossamon Scicchitano Andrea 01-04-2014 15-04-2014
2 macromedia MC007 Macromedia Spectra Spike Lee e Tonya Lewis Lee Orlandi Enrico 29-03-2014 09-04-2014
3 curiouslabs CL001 Poser 4 Pro Alec Baldwin Borsotti Mirella 02-05-2014 NULL
4 corel CR001 CorelDRAW Joe Strummer Alama Ornella 13-02-2014 NULL
5 macromedia MC003 Macromedia Flash 6 Shannyn Sossamon Basilio Davide 19-04-2014 NULL
6 adobe AD001 Adobe Photoshop 7.0 Kim Basinger Curti Oreste 20-01-2014 NULL
7 adobe AD001 Adobe Photoshop 7.0 Kim Basinger Bialetti Vincenzo 15-03-2013 19-04-2013
8 adobe AD003 Adobe Digital Video Collection Eddie Murphy e Nicole Mitchell Alcantara Pinuccia 02-02-2013 NULL
9 adobe AD002 Adobe After Effects 5.5 Shannyn Sossamon e Geri Halliwell Arquati Dorotea 01-01-2012 10-04-2013
10 scansoft SS001 Kai`s PhotoSoap2 Tonya Lewis Lee Basilio Davide 10-03-2014 09-04-2014

JOIN con doppia specifica

Possiamo fare questa richiesta:

Mostra i libri del gruppo adobe che sono stati prestati e a quali clienti sono stati prestati

La richiesta non è dissimile da quelle precedenti, ma questa volta c'è una condizione da rispettare e cioè che i libri che ci interessano sono quelli del gruppo adobe.
In questo caso possiamo comportarci in due modi: aggiungiamo un AND alla specifica della JOIN come ho fatto nella Query o, in alternativa, al posto della "AND sql_libri.gruppo = 'adobe'" possiamo usare la clausola WHERE (commentata alla fine della Query).

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$Query 
"SELECT sql_lib_prestiti.id, sql_agenda.cognome, sql_agenda.nome, 
sql_libri.gruppo, sql_libri.codice, sql_libri.Titolo, sql_libri.Autore, 
DATE_FORMAT( sql_lib_prestiti.data_prestito, '%d-%m-%Y' ) AS uscito, 
DATE_FORMAT( sql_lib_prestiti.data_restituzione, '%d-%m-%Y' ) AS reso 
    FROM sql_lib_prestiti 
    INNER JOIN sql_libri ON sql_libri.id = sql_lib_prestiti.id_libro 
    INNER JOIN sql_agenda ON sql_agenda.id = sql_lib_prestiti.id_iscritto 
        AND sql_libri.gruppo = 'adobe' 
"

//        WHERE sql_libri.gruppo = 'adobe' 
?>
4 record visualizzati
id cognome nome gruppo codice Titolo Autore uscito reso
6 Curti Oreste adobe AD001 Adobe Photoshop 7.0 Kim Basinger 20-01-2014 NULL
7 Bialetti Vincenzo adobe AD001 Adobe Photoshop 7.0 Kim Basinger 15-03-2013 19-04-2013
8 Alcantara Pinuccia adobe AD003 Adobe Digital Video Collection Eddie Murphy e Nicole Mitchell 02-02-2013 NULL
9 Arquati Dorotea adobe AD002 Adobe After Effects 5.5 Shannyn Sossamon e Geri Halliwell 01-01-2012 10-04-2013

Esempio di JOIN con ALIAS su tabelle

Alle tabelle indicate in una Query, specie se complessa, è possibile assegnare un ALIAS, ossia un nome temporaneo che deve essere usato come riferimento nel resto della query. Una tipica applicazione degli ALIAS di tabella è quando si vuole assegnare identificatori a nomi di tabella lunghi per mantere leggibili le clausole JOIN.
Qui di seguito vediamo replicata una Query di questa pagina assegnando degli ALIAS ai nomi di tabelle.

1
2
3
4
5
6
7
8
9
10
11
<?php
$Query 
"SELECT agenda.cognome, agenda.nome, 
DATE_FORMAT( agenda.data_nascita, '%d-%m-%Y' ) AS nato, 
citta.cap, citta.citta, citta.prov
FROM sql_agenda AS agenda 
INNER JOIN sql_citta AS citta 
ON agenda.id_citta = citta.id
WHERE agenda.data_nascita > '1999-12-31' 
ORDER BY agenda.data_nascita 
"
;
?>
41 record trovati
15 record visualizzati
cognome nome nato cap citta prov
De Paula Loredana 20-01-2000 06031 Bevagna PG
Dionisio Andrea 28-01-2000 39013 Moso in passiria BZ
Basilio Davide 26-09-2000 06031 Bevagna PG
Zeva Oronza 13-02-2001 17010 Giusvalla SV
Orlandi Enrico 13-02-2001 67010 Ville di Fano AQ
Mongelli Natalina 16-04-2001 06031 Bevagna PG
Castagna Attilio 20-08-2001 06031 Bevagna PG
Derosa Valeria 14-11-2001 06031 Bevagna PG
Zerlenga Francesco 25-01-2002 23821 Abbadia Lariana LC
Maini Marilena 20-03-2002 12011 Borgo S. Dalmazzo CN
Helvetia Italia 12-08-2002 89030 Condofuri RC
Broccardo Andrea 22-11-2002 23821 Abbadia Lariana LC
Buscetti Editta 25-01-2003 06031 Bevagna PG
Scicchitano Pierluigi 02-05-2003 23821 Abbadia Lariana LC
Migliavacca Luigi 22-01-2004 38030 Varena TN
... ... ... ... ... ...

 

 



settore tecnico il sito di lorettabweb il Forum di sostegno
il forum il forum il forum