SQLShack (Dansk)

INNER JOIN vs LEFT JOIN, det vil sige spørgsmålet. I dag forklarer vi kort hvordan begge disse to sammenføjningstyper bruges, og hvad der er forskellen. Vi gennemgår dette emne igen senere, når vi udvider vores model og kan skrive meget mere komplekse forespørgsler.

Ændringer i data

Før vi sammenligner INNER JOIN vs VENSTRE BLIVER, lad os se, hvad vi i øjeblikket ved. Indtil videre har vi i denne serie forklaret grundlæggende database – hvordan man opretter database og tabeller, hvordan man udfylder tabeller med data og kontrollerer, hvad der er gemt i dem ved hjælp af enkle forespørgsler. Vi har endda tilsluttet to tabeller i den forrige artikel. Nu er vi klar til næste trin.

Men inden vi går videre til det, lad os bare foretage en mindre ændring til vores data. Vi tilføjer 2 rækker i landetabellen ved hjælp af følgende INSERT INTO-kommandoer:

Nu kontrollerer vi indholdet af begge tabeller:

Du kan let bemærke, at vi har 2 nye rækker i tabellandet, en til Spanien og en til Rusland. Deres ider er 6 og 7. Bemærk også, at der i bytabellen ikke er noget land_id med værdi 6 eller 7. Dette betyder simpelthen, at vi ikke har en by fra Rusland eller Spanien i vores database. Vi bruger denne kendsgerning senere.

INDRE MEDLEM

Lad os diskutere disse to forespørgsler:

Resultatet, de returnerer, præsenteres på nedenstående billede:

Begge forespørgsler returnerer nøjagtigt det samme resultat. Dette er ikke ved et uheld, men resultatet af det faktum, at dette er den samme forespørgsel skrevet på to forskellige måder. Begge måder er korrekte, og du kan bruge en hvilken som helst af dem.

I den første forespørgsel oplistede vi alle tabeller, vi bruger i FROM-delen af forespørgslen (FRA land, by) og gik derefter med join tilstand i WHERE-delen af forespørgslen (WHERE city.country_id = country.id). Hvis vi glemte at skrive denne sammenføjningsbetingelse ned, ville vi have det kartesiske produkt fra begge tabeller.

I den anden forespørgsel har vi kun en tabel i FROM-delen af forespørgslen (FRA land) og så har vi anden tabel og JOIN-tilstanden i JOIN-delen af forespørgslen (INNER JOIN city ON city.country_id = country.id).

Mens begge forespørgsler er velskrevne, vil jeg foreslå, at du bruger altid INNER JOIN i stedet for at angive tabeller og sammenføje dem i WHERE-delen af forespørgslen. Der er et par grunde til det:

  • Læsbarhed er meget bedre, fordi den anvendte tabel og relaterede JOIN-tilstand er i den samme linje. Du kan nemt se, om du har udeladt JOIN-tilstanden eller ikke
  • Hvis du vil bruge andre JOINs senere (VENSTRE eller HØJRE), kunne du ikke gøre det (let), medmindre du har brugt INNER JOIN før at

Lad os nu kommentere, hvilke forespørgsler der faktisk returnerede:

  • Alle par af lande og byer, der er beslægtede (via udenlandsk nøgle)
  • Vi har ikke 2 lande på listen (Spanien og Rusland), fordi de ikke har nogen beslægtet by i bytabellen

VENSTRE MEDLEM

Jeg gentager dette – “Vi har ikke 2 lande på listen (Spanien og Rusland), fordi de ikke har nogen beslægtet by i bytabellen”. Dette skal vise sig at være afgørende, når man sammenligner INNER JOIN vs LEFT JOIN.

I nogle tilfælde vil vi have selv disse poster i vores resultater. For eksempel vil du blot se i resultatet, at disse lande ikke har relaterede poster i en anden tabel. Dette kunne være en del af en vis kontrol eller måske bare tælle sager osv. Uanset hvad motivationen bag dette ønske er, skal vi være teknisk i stand til at gøre det. Og det er vi også. I databaser gør LEFT JOIN nøjagtigt det.

Resultatet af LEFT JOIN skal være det samme som resultatet af INNER JOIN + vi har rækker fra “venstre” -tabellen uden et par i “rigtigt” bord. Vi bruger den samme INNER JOIN-forespørgsel og erstatter bare ordet INNER med VENSTRE. Dette er resultatet:

Du kan let bemærke, at vi har 2 flere rækker sammenlignet med resultatet af INNER Deltag i forespørgsel. Disse er rækker for Rusland og Spanien. Da de begge ikke har nogen relateret by, har alle byattributter i disse to rækker NULL-værdier (er ikke defineret). Det er den største forskel, når man sammenligner INNER JOIN vs LEFT JOIN.

RIGHT JOIN

Du vil i det mindste høre om RIGHT JOIN. Det bruges sjældent, fordi det returnerer det samme resultat som LEFT JOIN. På den anden side er forespørgsler, der bruger LEFT JOIN, meget lettere at læse, fordi vi blot viser tabeller efter hinanden.

Dette svarer til den forrige forespørgsel ved hjælp af RIGHT JOIN:

Du kan bemærke, at returnerede værdier er de samme, kun i dette tilfælde er værdier fra bytabellen i de første 5 kolonner, og land- relaterede værdier kommer efter dem.

INNER JOIN vs LEFT JOIN

INNER JOIN vs LEFT JOIN?Faktisk er det slet ikke spørgsmålet. Du bruger INNER JOIN, når du kun vil returnere poster, der har par på begge sider, og du vil bruge LEFT JOIN, når du har brug for alle poster fra “venstre” -tabellen, uanset om de har par i “højre” -tabellen eller ikke. Hvis du har brug for alle poster fra begge tabeller, uanset om de har par, skal du bruge CROSS JOIN (eller simulere det ved hjælp af LEFT JOINs og UNION). Mere om det i de kommende artikler.

Indholdsfortegnelse

Lær SQL: CREATE DATABASE & CREATE TABLE Operations

Lær SQL: INDSÆT I TABEL

Lær SQL: Primær nøgle

Lær SQL: Fremmed nøgle

Lær SQL: SELECT-sætning

Lær SQL: INNER JOIN vs LEFT JOIN

Lær SQL: SQL-scripts

Lær SQL: Relationstyper

Lær SQL: Deltag i flere tabeller

Lær SQL: Samlede funktioner

Lær SQL: Sådan skriver du en kompleks SELECT-forespørgsel

Lær SQL: INFORMATION_SCHEMA-databasen

Lær SQL: SQL-datatyper

Lær SQL: Indstil teori

Lær SQL: Brugerdefinerede funktioner

Lær SQL: Brugerdefinerede lagrede procedurer

Lær SQL: SQL-visninger

Lær SQL: SQL-udløsere

Lær SQL: Øv SQL-forespørgsler

Lær SQL: SQL-forespørgselseksempler

Lær SQL: Opret en rapport manuelt ved hjælp af SQL-forespørgsler

Lær SQL: SQL Server-dato- og tidsfunktioner

Lær SQL: Opret SQL Server-rapporter ved hjælp af dato- og tidsfunktioner

Lær SQL: SQL Server-pivottabeller

Lær SQL: SQL Server-eksport til Excel

Lær SQL: Introduktion til SQL Server-sløjfer

Lær SQL: SQL Server-markører

Lær SQL: SQL Bedste fremgangsmåder til sletning og opdatering af data

Lær SQL: Navngivningskonventioner

Lær SQL: SQL-relaterede job

Lær SQL: Ikke-Equi-tilslutninger i SQL Server

Lær SQL: SQL Injektion

  • Forfatter
  • Seneste indlæg
Emil er databaseprofessionel med mere end 10 års erfaring inden for alt relateret til databaser. I årenes løb arbejdede han i IT- og finansbranchen og arbejder nu som freelancer.
Hans tidligere og nuværende opgaver varierer fra databasedesign og kodning til undervisning, konsulentarbejde og skrivning om databaser. Også for ikke at glemme, BI, oprettelse af algoritmer, skak, filateli, 2 hunde, 2 katte, 1 kone, 1 baby …
Du kan finde ham på LinkedIn
Se alle indlæg af Emil Drkusic

Seneste indlæg af Emil Drkusic (se alle)
  • Lær SQL: SQL Injection – 2. november 2020
  • Lær SQL: Non-Equi-tilslutninger i SQL Server – 29. september 2020
  • Lær SQL: SQL-relaterede job – 1. september 2020

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *