Sammanfattning :i den här handledningen kommer du att lära dig om olika typer av SQLite-kopplingar för att söka efter data från två eller flera tabeller.
För demonstrationen kommer vi att använda artists
och albums
tabeller från exempeldatabasen.
En artist kan ha noll eller många album medan ett album tillhör en artist.
För att fråga data från båda artists
och albums
tabeller, kan du använda en INNER JOIN
, LEFT JOIN
, eller CROSS JOIN
klausul. Varje join-sats bestämmer hur SQLite använder data från en tabell för att matcha med rader i en annan tabell.
Observera att SQLite inte direkt stöder RIGHT JOIN
och FULL OUTER JOIN
.
SQLite INNER JOIN
Följande påstående returnerar albumtitlarna och deras artistnamn:
SELECT
Title,
Name
FROM
albums
INNER JOIN artists
ON artists.ArtistId = albums.ArtistId;
Code language: SQL (Structured Query Language) (sql)
Här är den partiella utmatningen:
I det här exemplet är INNER JOIN
klausul matchar varje rad från albums
tabell med varje rad från artists
tabell baserad på kopplingsvillkoret (artists.ArtistId = albums.ArtistId
) som anges efter ON
nyckelord.
Om sammanfogningsvillkoret utvärderas till sant (eller 1), kolumnerna med rader från båda albums
och artists
tabeller ingår i resultatuppsättningen.
Den här frågan använder tabellalias (l
för albums
tabell och r
för artists
tabell) för att förkorta frågan:
SELECT
l.Title,
r.Name
FROM
albums l
INNER JOIN artists r ON
r.ArtistId = l.ArtistId;
Code language: SQL (Structured Query Language) (sql)
Om kolumnnamnen för sammanfogade tabeller är desamma, t.ex. ArtistId
, kan du använda USING
syntax enligt följande:
SELECT
Title,
Name
FROM
albums
INNER JOIN artists USING(ArtistId);
Code language: SQL (Structured Query Language) (sql)
Klausulen USING(ArtistId)
är likvärdig med klausulen ON artists.ArtistId = albums.ArtistId
.
SQLite LEFT JOIN
Detta uttalande väljer artistnamn och albumtitlar från artists
och albums
tabeller med 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)
Här är resultatet:
LEFT JOIN
satsen väljer data från den vänstra tabellen (artists
) och matchande rader i den högra tabellen (albums
) baserat på anslutningsvillkoret (artists.ArtistId = albums.ArtistId
).
Den vänstra kopplingen returnerar alla rader från artists
tabell (eller vänster tabell) och de matchande raderna från albums
tabell (eller höger tabell).
Om en rad från den vänstra tabellen inte har en matchande rad i den högra tabellen, inkluderar SQLite kolumner av raderna i den vänstra tabellen och NULL
för kolumnerna i den högra tabellen.
Liknar INNER JOIN
sats, kan du använda USING
syntax för joinvillkoret enligt följande:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums USING (ArtistId)
ORDER BY
Name;
Code language: SQL (Structured Query Language) (sql)
Om du vill hitta artister som inte har några album kan du lägga till en WHERE
klausul som visas i följande fråga:
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)
Den här bilden visar den partiella utmatningen:
I allmänhet låter den här typen av fråga dig hitta rader som är tillgängliga i den vänstra tabellen men som inte har motsvarande rader i den högra tabellen.
Observera att LEFT JOIN
och LEFT OUTER JOIN
är synonymer.
SQLite CROSS JOIN
CROSS JOIN
sats skapar en kartesisk produkt av rader från de sammanfogade tabellerna.
Till skillnad från INNER JOIN
och LEFT JOIN
satser, en CROSS JOIN
har inget anslutningsvillkor. Här är den grundläggande syntaxen för CROSS JOIN
klausul:
SELECT
select_list
FROM table1
CROSS JOIN table2;
Code language: SQL (Structured Query Language) (sql)
CROSS JOIN
kombinerar varje rad från den första tabellen (table1
) med varje rad från den andra tabellen (table2
) för att bilda resultatuppsättningen.
Om den första tabellen har N
rader har den andra tabellen M
rader kommer det slutliga resultatet att ha NxM
rader.
Ett praktiskt exempel på CROSS JOIN
är att kombinera två uppsättningar data för att bilda en initial datauppsättning för vidare bearbetning. Du har till exempel en lista över produkter och månader, och du vill göra en plan när du kan sälja vilka produkter.
Följande skript skapar products
och 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)
Den här frågan använder CROSS JOIN
klausul för att kombinera produkterna med månaderna:
SELECT *
FROM products
CROSS JOIN calendars;
Code language: SQL (Structured Query Language) (sql)
Här är resultatet:
I den här handledningen har du lärt dig olika typer av SQLite-kopplingar som låter dig fråga från flera tabeller.