Riepilogo :in questo tutorial imparerai vari tipi di join SQLite per eseguire query sui dati da due o più tabelle.
Per la dimostrazione utilizzeremo gli artists
e albums
tabelle dal database di esempio.
Un artista può avere zero o più album mentre un album appartiene a un artista.
Per interrogare i dati di entrambi gli artists
e albums
tabelle che usi puoi usare un INNER JOIN
, LEFT JOIN
o CROSS JOIN
clausola. Ciascuna clausola di join determina in che modo SQLite utilizza i dati di una tabella in modo che corrispondano alle righe di un'altra tabella.
Nota che SQLite non supporta direttamente il RIGHT JOIN
e FULL OUTER JOIN
.
SQLite INNER JOIN
La seguente dichiarazione restituisce i titoli degli album e i nomi degli artisti:
SELECT
Title,
Name
FROM
albums
INNER JOIN artists
ON artists.ArtistId = albums.ArtistId;
Code language: SQL (Structured Query Language) (sql)
Ecco l'output parziale:
In questo esempio, il INNER JOIN
la clausola corrisponde a ogni riga degli albums
tabella con ogni riga degli artists
tabella basata sulla condizione di unione (artists.ArtistId = albums.ArtistId
) specificato dopo il ON
parola chiave.
Se la condizione di unione restituisce true (o 1), le colonne di righe di entrambi gli albums
e artists
le tabelle sono incluse nel set di risultati.
Questa query utilizza alias di tabella (l
per gli albums
tabella e r
per artists
tabella) per abbreviare la query:
SELECT
l.Title,
r.Name
FROM
albums l
INNER JOIN artists r ON
r.ArtistId = l.ArtistId;
Code language: SQL (Structured Query Language) (sql)
Nel caso in cui i nomi delle colonne delle tabelle unite siano gli stessi, ad esempio ArtistId
, puoi usare il USING
sintassi come segue:
SELECT
Title,
Name
FROM
albums
INNER JOIN artists USING(ArtistId);
Code language: SQL (Structured Query Language) (sql)
La clausola USING(ArtistId)
è equivalente alla clausola ON artists.ArtistId = albums.ArtistId
.
SQLite LEFT JOIN
Questa dichiarazione seleziona i nomi degli artisti e i titoli degli album dai artists
e albums
tabelle utilizzando il LEFT JOIN
clausola:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums ON
artists.ArtistId = albums.ArtistId
ORDER BY Name;
Code language: SQL (Structured Query Language) (sql)
Ecco l'output:
Il LEFT JOIN
La clausola seleziona i dati a partire dalla tabella di sinistra (artists
) e le righe corrispondenti nella tabella di destra (albums
) in base alla condizione di unione (artists.ArtistId = albums.ArtistId
).
Il join sinistro restituisce tutte le righe degli artists
tabella (o tabella di sinistra) e le righe corrispondenti dagli albums
tavolo (o tavolo destro).
Se una riga della tabella di sinistra non ha una riga corrispondente nella tabella di destra, SQLite include le colonne delle righe nella tabella di sinistra e NULL
per le colonne della tabella di destra.
Simile a INNER JOIN
clausola, puoi usare la USING
sintassi per la condizione di unione come segue:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums USING (ArtistId)
ORDER BY
Name;
Code language: SQL (Structured Query Language) (sql)
Se vuoi trovare artisti che non hanno album, puoi aggiungere un WHERE
clausola come mostrato nella query seguente:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums ON
artists.ArtistId = albums.ArtistId
WHERE Title IS NULL
ORDER BY Name;
Code language: SQL (Structured Query Language) (sql)
Questa immagine mostra l'output parziale:
In genere, questo tipo di query consente di trovare righe disponibili nella tabella di sinistra ma che non hanno righe corrispondenti nella tabella di destra.
Nota che LEFT JOIN
e LEFT OUTER JOIN
sono sinonimi.
SQLite CROSS JOIN
Il CROSS JOIN
La clausola crea un prodotto cartesiano di righe dalle tabelle unite.
A differenza di INNER JOIN
e LEFT JOIN
clausole, un CROSS JOIN
non ha una condizione di unione. Ecco la sintassi di base di CROSS JOIN
clausola:
SELECT
select_list
FROM table1
CROSS JOIN table2;
Code language: SQL (Structured Query Language) (sql)
Il CROSS JOIN
combina ogni riga della prima tabella (table1
) con ogni riga della seconda tabella (table2
) per formare il set di risultati.
Se la prima tabella ha N
righe, la seconda tabella ha M
righe, il risultato finale avrà NxM
righe.
Un esempio pratico del CROSS JOIN
La clausola consiste nel combinare due serie di dati per formare una serie di dati iniziale per l'ulteriore elaborazione. Ad esempio, hai un elenco di prodotti e mesi e vuoi fare un piano quando puoi vendere quali prodotti.
Il seguente script crea i products
e calendars
tabelle:
CREATE TABLE products(
product text NOT null
);
INSERT INTO products(product)
VALUES('P1'),('P2'),('P3');
CREATE TABLE calendars(
y int NOT NULL,
m int NOT NULL
);
INSERT INTO calendars(y,m)
VALUES
(2019,1),
(2019,2),
(2019,3),
(2019,4),
(2019,5),
(2019,6),
(2019,7),
(2019,8),
(2019,9),
(2019,10),
(2019,11),
(2019,12);
Code language: SQL (Structured Query Language) (sql)
Questa query utilizza il CROSS JOIN
clausola per abbinare i prodotti ai mesi:
SELECT *
FROM products
CROSS JOIN calendars;
Code language: SQL (Structured Query Language) (sql)
Ecco l'output:
In questo tutorial, hai appreso vari tipi di join SQLite che ti consentono di eseguire query da più tabelle.