Oversigt :i denne øvelse vil du lære om forskellige slags SQLite-joins for at forespørge data fra to eller flere tabeller.
Til demonstrationen vil vi bruge artists
og albums
tabeller fra eksempeldatabasen.
En kunstner kan have nul eller mange album, mens et album tilhører én kunstner.
For at forespørge data fra begge artists
og albums
tabeller, du bruger kan bruge en INNER JOIN
, LEFT JOIN
, eller CROSS JOIN
klausul. Hver join-klausul bestemmer, hvordan SQLite bruger data fra én tabel til at matche med rækker i en anden tabel.
Bemærk, at SQLite ikke direkte understøtter RIGHT JOIN
og FULL OUTER JOIN
.
SQLite INNER JOIN
Følgende erklæring returnerer albumtitlerne og deres kunstnernavne:
SELECT
Title,
Name
FROM
albums
INNER JOIN artists
ON artists.ArtistId = albums.ArtistId;
Code language: SQL (Structured Query Language) (sql)
Her er det delvise output:
I dette eksempel er INNER JOIN
klausul matcher hver række fra albums
tabel med hver række fra artists
tabel baseret på join-betingelsen (artists.ArtistId = albums.ArtistId
) angivet efter ON
søgeord.
Hvis sammenføjningsbetingelsen evalueres til sand (eller 1), rækker kolonnerne fra begge albums
og artists
tabeller er inkluderet i resultatsættet.
Denne forespørgsel bruger tabelaliasser (l
for albums
tabel og r
for artists
tabel) for at forkorte forespørgslen:
SELECT
l.Title,
r.Name
FROM
albums l
INNER JOIN artists r ON
r.ArtistId = l.ArtistId;
Code language: SQL (Structured Query Language) (sql)
I tilfælde af at kolonnenavnene på sammenkoblede tabeller er de samme, f.eks. ArtistId
, kan du bruge USING
syntaks som følger:
SELECT
Title,
Name
FROM
albums
INNER JOIN artists USING(ArtistId);
Code language: SQL (Structured Query Language) (sql)
Klausulen USING(ArtistId)
svarer til klausulen ON artists.ArtistId = albums.ArtistId
.
SQLite LEFT JOIN
Denne erklæring vælger kunstnernavne og albumtitler fra artists
og albums
tabeller ved hjælp af LEFT JOIN
klausul:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums ON
artists.ArtistId = albums.ArtistId
ORDER BY Name;
Code language: SQL (Structured Query Language) (sql)
Her er outputtet:
LEFT JOIN
klausul vælger data fra den venstre tabel (artists
) og matchende rækker i den højre tabel (albums
) baseret på join-betingelsen (artists.ArtistId = albums.ArtistId
).
Venstre join returnerer alle rækker fra artists
tabel (eller venstre tabel) og de matchende rækker fra albums
tabel (eller højre tabel).
Hvis en række fra den venstre tabel ikke har en matchende række i den højre tabel, inkluderer SQLite kolonner af rækkerne i den venstre tabel og NULL
for kolonnerne i den højre tabel.
Svarende til INNER JOIN
klausul, kan du bruge USING
syntaks for join-betingelsen som følger:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums USING (ArtistId)
ORDER BY
Name;
Code language: SQL (Structured Query Language) (sql)
Hvis du vil finde kunstnere, der ikke har nogen album, kan du tilføje en WHERE
klausul som vist i følgende forespørgsel:
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)
Dette billede viser det delvise output:
Generelt giver denne type forespørgsel dig mulighed for at finde rækker, der er tilgængelige i den venstre tabel, men som ikke har tilsvarende rækker i den højre tabel.
Bemærk at LEFT JOIN
og LEFT OUTER JOIN
er synonymer.
SQLite CROSS JOIN
CROSS JOIN
klausul opretter et kartesisk produkt af rækker fra de sammenføjede tabeller.
I modsætning til INNER JOIN
og LEFT JOIN
klausuler, en CROSS JOIN
har ikke en sammenføjningsbetingelse. Her er den grundlæggende syntaks for CROSS JOIN
klausul:
SELECT
select_list
FROM table1
CROSS JOIN table2;
Code language: SQL (Structured Query Language) (sql)
CROSS JOIN
kombinerer hver række fra den første tabel (table1
) med hver række fra den anden tabel (table2
) for at danne resultatsættet.
Hvis den første tabel har N
rækker, har den anden tabel M
rækker, vil det endelige resultat have NxM
rækker.
Et praktisk eksempel på CROSS JOIN
klausul er at kombinere to sæt data for at danne et indledende datasæt til yderligere behandling. For eksempel har du en liste over produkter og måneder, og du vil lægge en plan for, hvornår du kan sælge hvilke produkter.
Følgende script opretter products
og calendars
tabeller:
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)
Denne forespørgsel bruger CROSS JOIN
klausul for at kombinere produkterne med månederne:
SELECT *
FROM products
CROSS JOIN calendars;
Code language: SQL (Structured Query Language) (sql)
Her er outputtet:
I denne øvelse har du lært forskellige slags SQLite-joins, der giver dig mulighed for at forespørge fra flere tabeller.