SQLShack (Svenska)

Om du vill få något meningsfullt ur data , du behöver nästan alltid gå med i flera tabeller. I den här artikeln visar vi hur man gör det med olika typer av kopplingar. För att uppnå detta kombinerar vi INNER JOINs och LEFT JOINs. Så låt oss börja.

Modellen

På bilden nedan kan du se existerande modell. Den består av 6 tabeller och vi har redan, mer eller mindre, beskrivit den i tidigare artiklar.

Fortfarande, även utan att beskriva, om databasen är modellerad och presenterad på ett bra sätt (att välja namn klokt, använda namngivning, följa samma regler i hela modellen, överlappar inte linjer / relationer i schemat mer än nödvändigt), bör du kunna för att avsluta var du kan hitta den information du behöver. Detta är avgörande för innan du går med i flera tabeller måste du först identifiera dessa tabeller.

Vi pratar om namngivningskonventionen och råd om hur du kan tänka när du skriver SQL-frågor, senare i detta serier. Hittills, låt oss leva med att den här modellen är ganska enkel och att vi kan göra det ganska enkelt.

Vad vet vi hittills?

I den här serien har vi omfattas:

  • Grunderna relaterade till SQL SELECT-uttalande, och
  • Jämfört INNER JOIN och LEFT JOIN

Vi använder kunskapen från båda dessa artiklar och kombinera dessa för att skriva mer komplexa SELECT-satser som kommer att sammanfoga flera tabeller.

Gå med i flera tabeller med INNER JOIN

Det första exemplet vi analyserar är hur man hämtar data från flera tabeller med endast INNER JOINs. För varje exempel går vi med definitionen av problemet vi måste lösa och frågan som gör jobbet. Så, låt oss börja med det första problemet.

# 1 Vi måste lista alla samtal med starttid och sluttid. För varje samtal vill vi visa vad som var resultatet samt för- och efternamnet på den anställde som ringde samtalet. Vi sorterar våra samtal efter stigande starttid.

Innan vi skriver frågan identifierar vi de tabeller vi behöver använda. För att göra det måste vi bestämma vilka tabeller som innehåller den data vi behöver och inkludera dem. Vi borde också inkludera alla tabeller längs vägen mellan dessa tabeller – tabeller som inte innehåller data som behövs men fungerar som en relation mellan tabeller som gör det (så är inte fallet här).

Frågan som utför jobbet ges nedan:

Frågeresultatet ges nedan:

Det finns några saker som jag vill påpeka här:

  • Tabellerna vi har gått med finns här eftersom data vi behöver finns i dessa tre tabeller
  • Varje gång jag nämner något attribut från vilken tabell som helst använder jag formatet tabellnamn.attributnamn (t.ex. anställd.första_namn). Även om detta inte behövs är det en bra praxis, för ibland kan två eller flera tabeller i samma fråga använda samma attributnamn och det skulle leda till ett fel
  • Vi har använt INNER JOIN 2 gånger i ordning för att gå med i 3 bord. Detta resulterar i att endast rader returneras med par i en annan tabell
  • När du bara använder INNER JOINs för att gå med i flera tabeller är ordningen på dessa tabeller i sammanfogningar inte viktig. Det enda viktiga är att du använder lämpliga anslutningsvillkor efter ”PÅ” (gå med utländska nycklar)

Eftersom alla samtal hade relaterat anställd och samtalsresultat, skulle vi få samma resultat om vi har använt LEFT JOIN istället för INNER JOIN.

Gå med i flera tabeller med LEFT JOIN

Skrivfrågor som använder LEFT JOIN skiljer sig inte mycket jämfört med att skriva frågor med INNER JOINS. Resultatet skulle naturligtvis vara annorlunda (åtminstone i de fall då vissa poster inte har ett par i andra tabeller).

Detta är problemet vi vill lösa.

# 2 Lista upp alla län och kunder som är relaterade till dessa länder. För varje land som visar sitt namn på engelska finns stadskundens namn i såväl som namnet på den kunden. Returnera även länder utan närstående städer och kunder.

Tabellerna som innehåller data vi behöver finns på bilden nedan:

Låt oss först kolla snabbt vad som är kont av dessa tre tabeller.

Vi kan märka två viktiga saker:

  • Även om varje stad har ett besläktat land har inte alla länder relaterade städer (Spanien & Ryssland har inte dem)
  • Samma står för kunderna.Varje kund har värdet city_id definierat, men endast 3 städer används (Berlin, Zagreb & New York)

Låt oss först skriva ner fråga med INNER JOIN:

Frågeresultatet visas på bilden nedan:

Vi har 7 län och 6 städer i vår databas, men vår fråga returnerar endast 4 rader. Det är resultatet av det faktum att vi bara har 4 kunder i vår databas. Var och en av dessa 4 är relaterad till sin stad och staden är relaterad till landet. Så INNER JOIN eliminerade alla dessa länder och städer utan kunder. Men hur ska man också inkludera dessa i resultatet?

För att göra det använder vi LEFT JOIN. Vi ersätter helt enkelt alla ”INNER” med ”VÄNSTER” så vår fråga är som följer:

Resultatet visas på bilden nedan:

Du kan lätt märka att nu har vi alla länder, även de utan någon liknande stad (Ryssland & Spanien), samt alla städer, även de utan kunder (Warszawa, Belgrad & Los Angeles). De återstående fyra raderna är desamma som i frågan med INNER JOIN.

VÄNSTER JOIN – Tabellerna är viktiga

Även om ordningen på JOINs i INNER JOIN inte är viktig, är samma står inte för VÄNSTER JOIN. När vi använder VÄNSTER JOIN för att gå med i flera tabeller, är det viktigt att komma ihåg att denna koppling kommer att inkludera alla rader från tabellen på VÄNSTER sidan av JOIN. Låt oss ordna föregående fråga:

Först kan du lätt säga att den här frågan och den förra är desamma (detta gäller när du använder INNER JOIN). Vi har använt samma tabeller, VÄNSTER JOIN och samma anslutningsvillkor. Låt oss först titta på utdata:

Så, vad hände här? Varför har vi fyra rader (samma 4 som vi hade när vi använde INNER JOIN)?

Svaret är enkelt och det är relaterat till hur LEFT JOIN fungerar. Det tar den första tabellen (kund) och förenar alla sina rader (fyra av dem) till nästa tabell (stad). Resultatet av detta är 4 rader eftersom kunden bara kan tillhöra 1 stad. Sedan går vi med dessa fyra rader till nästa tabell (land) och igen har vi fyra rader eftersom staden bara kan tillhöra ett land.

Anledningen till att vi inte skulle gå med i dessa 3 tabeller i detta sätt ges av texten i exemplet # 2. Frågan är skriven på ett sådant sätt att den returnerar 4 rader skulle vara svaret på följande: Returnera namn på alla kunder samt städer och länder de är belägna i. Returnera även kunder utan relaterade städer och länder.

  • Obs! När du använder VÄNSTER JOIN är ordningen på tabellerna i det uttalandet viktig och frågan returnerar ett annat resultat om du ändrar den här ordningen. Beställningen beror faktiskt på vad du vill returnera som ett resultat.

Gå med i flera tabeller med båda – INNRE JOIN & VÄNSTER JOIN

Detta är också möjligt. Låt oss återigen gå med ett exempel.

# 3 Returnera listan över alla länder och städer som har par (exkludera länder som ingen stad refererar till). För sådana par returnerar alla kunder. Returnera även par som inte har en enda kund.

Frågan som gör jobbet är:

Resultatet av frågan ges i bilden nedan:

Du kan lätt märka att vi inte har länder utan någon relaterad stad (dessa var Spanien & Ryssland). INNER JOIN eliminerade dessa rader. Vi har ändå citat utan några kunder (Belgrad, Los Angeles & Warszawa). Detta är resultatet av det faktum att vi använde VÄNSTER JOIN mellan tabeller stad och kund.

Slutsats

När du behöver gå med i flera tabeller har du INNER & VÄNSTER JOIN till ditt förfogande (RIGHT JOIN används sällan och kan enkelt ersättas med VÄNSTER JOIN). Vilken anslutning du använder beror direkt på uppgiften du behöver lösa och du får känslan på vägen. I kommande artiklar diskuterar vi hur du kan tänka och organisera dig själv när du behöver skriva mer komplexa frågor.

Innehållsförteckning

Lär dig SQL: SKAPA DATABAS & SKAPA TABELLåtgärder

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: VÄLJ 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 med 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 Server-export 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: Non-Equi-anslutningar i SQL Server

Lär dig SQL: SQL-injektion

  • Författare
  • Senaste inlägg
Emil är en databasproffs 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 *