sql >> Database teknologi >  >> RDS >> SQLite

SQLite Join

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.


  1. Ydeevne af tabelvariabler i SQL Server

  2. Hvorfor siger Postgres, at kolonnen ikke eksisterer?

  3. Hvordan lister jeg alle tabeller i alle databaser i SQL Server i et enkelt resultatsæt?

  4. DATEADD-ækvivalent i PostgreSQL