SQLShack (Svenska)

INNER JOIN vs LEFT JOIN, det vill säga frågan. Idag förklarar vi kort hur båda dessa två kopplingstyper används och vad som är skillnaden. Vi går igenom det här ämnet igen senare när vi utökar vår modell och kan skriva mycket mer komplexa frågor.

Ändringar i data

Innan vi jämför INNER JOIN vs VÄNSTER GÅ MED, låt oss se vad vi för närvarande vet. Hittills har vi i denna serie förklarat grunderna i databaser – hur man skapar databas och tabeller, hur man fyller i tabeller med data och kontrollerar vad som finns lagrat i dem med enkla frågor. Vi har till och med gått med i två tabeller i föregående artikel. Nu är vi redo för nästa steg.

Men innan vi går vidare till det, låt oss bara göra en mindre ändring till våra uppgifter. Vi lägger till två rader i landstabellen med följande INSERT INTO-kommandon:

Nu ska vi kontrollera innehållet i båda tabellerna:

Du kan lätt märka att vi har två nya rader i tabelllandet, en för Spanien och en för Ryssland. Deras id är 6 och 7. Lägg också märke till att i stadstabellen finns inget land_id med värde 6 eller 7. Detta betyder helt enkelt att vi inte har en stad från Ryssland eller Spanien i vår databas. Vi kommer att använda detta faktum senare.

INNER JOIN

Låt oss diskutera dessa två frågor:

Resultatet de returnerar presenteras på bilden nedan:

Båda frågorna ger exakt samma resultat. Detta är inte av misstag utan resultatet av det faktum att detta är samma fråga skriven på två olika sätt. Båda vägarna är korrekta och du kan använda vilken som helst av dem.

I den första frågan listade vi alla tabeller vi använder i FRÅN-delen av frågan (FRÅN land, stad) och gick sedan med gå tillstånd i WHERE-delen av frågan (WHERE city.country_id = country.id). Om vi glömde att skriva ner detta kopplingsvillkor skulle vi ha den kartesiska produkten från båda tabellerna.

I den andra frågan har vi bara en tabell i FROM-delen av frågan (FROM country) och då har vi den andra tabellen och JOIN-villkoret i JOIN-delen av frågan (INNER JOIN city ON city.country_id = country.id).

Medan båda frågorna är välskrivna skulle jag föreslå att du använder alltid INNER JOIN istället för att lista tabeller och gå med i WHERE-delen av frågan. Det finns några anledningar till det:

  • Läsbarheten är mycket bättre eftersom tabellen som används och relaterat JOIN-tillstånd är i samma linje. Du kan enkelt se om du har utelämnat JOIN-villkoret eller inte
  • Om du vill använda andra JOINs senare (VÄNSTER eller HÖGER) kunde du inte göra det (enkelt) om du inte har använt INNER JOIN tidigare det

Låt oss nu kommentera vilka frågor som faktiskt returnerade:

  • Alla par av länder och städer som är relaterade (via utländsk nyckel)
  • Vi har inte två länder i listan (Spanien och Ryssland), eftersom de inte har någon relaterad stad i stadstabellen

VÄNSTER GÅ MED

Jag upprepar detta – ”Vi har inte två länder på listan (Spanien och Ryssland) eftersom de inte har någon relaterad stad i stadstabellen”. Detta ska visa sig vara avgörande när man jämför INNER JOIN vs LEFT JOIN.

I vissa fall vill vi ha även dessa poster i våra resultat. Till exempel vill du helt enkelt se i resultatet att dessa länder inte har relaterade poster i en annan tabell. Detta kan vara en del av en viss kontroll, eller kanske bara räkna fall etc. Oavsett motivationen bakom den önskan, vi borde kunna vara tekniskt kapabla att göra det. Och det är vi. I databaser gör LEFT JOIN exakt det.

Resultatet av LEFT JOIN ska vara detsamma som resultatet av INNER JOIN + vi kommer att ha rader från tabellen ”vänster”, utan ett par i ”rätt” bord. Vi använder samma INNER JOIN-fråga och ersätter bara ordet INNER med VÄNSTER. Detta är resultatet:

Du kan lätt märka att vi har ytterligare två rader jämfört med resultatet av INNER GÅ MED i frågan. Det här är rader för Ryssland och Spanien. Eftersom de båda inte har någon relaterad stad har alla stadsattribut i dessa två rader NULL-värden (definieras inte). Det är den största skillnaden när man jämför INNER JOIN vs LEFT JOIN.

RIGHT JOIN

Du hör åtminstone om RIGHT JOIN. Det används sällan eftersom det ger samma resultat som LEFT JOIN. Å andra sidan är frågor som använder LEFT JOIN mycket lättare att läsa eftersom vi helt enkelt listar tabeller efter varandra.

Detta motsvarar föregående fråga med RIGHT JOIN:

Du kan se att returnerade värden är desamma, bara i detta fall är värden från stadstabellen i de första 5 kolumnerna och land- relaterade värden kommer efter dem.

INNER JOIN vs LEFT JOIN

INNER JOIN vs LEFT JOIN?Egentligen är det inte alls frågan. Du använder INNER JOIN när du bara vill returnera poster med par på båda sidor, och du kommer att använda VÄNSTER JOIN när du behöver alla poster från ”vänster” -tabellen, oavsett om de har par i ”rätt” -tabellen eller inte. Om du behöver alla poster från båda tabellerna, oavsett om de har par, måste du använda CROSS JOIN (eller simulera det med VÄNSTER JOINs och UNION). Mer om det i de kommande artiklarna.

Innehållsförteckning

Lär dig SQL: CREATE DATABASE & CREATE TABLE Operations

Lär dig SQL: INSÄTTA I TABELL

Lär dig SQL: Primär nyckel

Lär dig SQL: Utländsk nyckel

Lär dig SQL: SELECT-uttalande

Lär dig SQL: INNER JOIN vs LEFT JOIN

Lär dig SQL: SQL-skript

Lär dig SQL: Typer av relationer

Lär dig SQL: Gå med i flera tabeller

Lär dig SQL: Aggregerade funktioner

Lär dig SQL: Hur man skriver en komplex SELECT-fråga

Lär dig SQL: INFORMATION_SCHEMA-databasen

Lär dig SQL: SQL-datatyper

Lär dig SQL: Ställ in teori

Lär dig SQL: Användardefinierade funktioner

Lär dig SQL: Användardefinierade lagrade procedurer

Lär dig SQL: SQL-vyer

Lär dig SQL: SQL-utlösare

Lär dig SQL: Öva SQL-frågor

Lär dig SQL: SQL-frågeexempel

Lär dig SQL: Skapa en rapport manuellt använda SQL-frågor

Lär dig SQL: SQL Server-datum- och tidsfunktioner

Lär dig SQL: Skapa SQL Server-rapporter med datum- och tidsfunktioner

Lär dig SQL: SQL Server-pivottabeller

Lär dig SQL: SQL-serverexport till Excel

Lär dig SQL: Introduktion till SQL Server-slingor

Lär dig SQL: SQL Server-markörer

Lär dig SQL: SQL bästa metoder för att radera och uppdatera data

Lär dig SQL: Namngivningskonventioner

Lär dig SQL: SQL-relaterade jobb

Lär dig SQL: Icke-Equi-anslutningar i SQL Server

Lär dig SQL: SQL Injektion

  • Författare
  • Senaste inlägg
Emil är databasprofessionell med 10+ års erfarenhet av allt som rör databaser. Under åren arbetade han inom IT- och finansbranschen och arbetar nu som frilansare.
Hans tidigare och nuvarande uppdrag varierar från databasdesign och kodning till undervisning, konsultation och skrivning om databaser. För att inte glömma, BI, skapa algoritmer, schack, filateli, 2 hundar, 2 katter, 1 fru, 1 bebis …
Du hittar honom på LinkedIn
Visa alla inlägg av Emil Drkusic

Senaste inlägg av Emil Drkusic (se alla)
  • Lär dig SQL: SQL-injektion – 2 november 2020
  • Lär dig SQL: Non-Equi-anslutningar i SQL Server – 29 september 2020
  • Lär dig SQL: SQL-relaterade jobb – 1 september 2020

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *