SQLShack (Norsk)

INNER JOIN vs LEFT JOIN, altså spørsmålet. I dag vil vi kort forklare hvordan begge disse to sammenføyningstyper brukes og hva som er forskjellen. Vi vil gå gjennom dette emnet igjen senere når vi utvider modellen og kan skrive mye mer komplekse spørsmål.

Endringer i dataene

Før vi sammenligner INNER JOIN vs. VENSTRE MEDLEM, la oss se hva vi for øyeblikket vet. Så langt har vi i denne serien forklart det grunnleggende om databaser – hvordan du lager database og tabeller, hvordan du fyller ut tabeller med data og sjekker hva som er lagret i dem ved hjelp av enkle spørsmål. Vi har til og med blitt med i to tabeller i forrige artikkel. Nå er vi klare for neste trinn.

Men før vi går videre til det, la oss bare gjøre en mindre endring til våre data. Vi legger til to rader i landstabellen ved å bruke følgende INSERT INTO-kommandoer:

Nå sjekker vi innholdet i begge tabellene:

Du kan enkelt merke at vi har to nye rader i tabelllandet, en for Spania og en for Russland. IDene deres er 6 og 7. Legg også merke til at det i bytabellen ikke er noe land_id med verdi 6 eller 7. Dette betyr ganske enkelt at vi ikke har en by fra Russland eller Spania i databasen vår. Vi vil bruke dette faktum senere.

INNER JOIN

La oss diskutere disse to spørsmålene:

Resultatet de returnerer er presentert på bildet nedenfor:

Begge spørsmålene gir nøyaktig samme resultat. Dette er ikke ved et uhell, men resultatet av det faktum at dette er det samme spørsmålet skrevet på to forskjellige måter. Begge måtene er riktige, og du kan bruke hvilken som helst av dem.

I den første spørringen listet vi opp alle tabellene vi bruker i FROM-delen av spørringen (FRA land, by) og gikk deretter med join tilstand i WHERE-delen av spørringen (WHERE city.country_id = country.id). Hvis vi glemte å skrive ned denne sammenkoblingsbetingelsen, ville vi ha det kartesiske produktet av begge tabellene.

I den andre spørringen har vi bare en tabell i FROM-delen av spørringen (FRA land) og så har vi den andre tabellen og JOIN-tilstanden i JOIN-delen av spørringen (INNER JOIN city ON city.country_id = country.id).

Mens begge spørsmålene er velskrevne, vil jeg foreslå at du bruker alltid INNER JOIN i stedet for å liste opp tabeller og bli med i WHERE-delen av spørringen. Det er noen grunner til det:

  • Lesbarhet er mye bedre fordi tabellen som brukes og tilhørende JOIN-tilstand er i den samme linje. Du kan enkelt se om du har utelatt JOIN-tilstanden eller ikke
  • Hvis du vil bruke andre JOIN-er senere (VENSTRE eller HØYRE), kunne du ikke gjøre det (enkelt) med mindre du har brukt INNER JOIN før det

La oss nå kommentere hvilke spørsmål som faktisk returnerte:

  • Alle par av land og byer som er relatert (via utenlandsk nøkkel)
  • Vi har ikke to land på listen (Spania og Russland), fordi de ikke har noen beslektet by i bytabellen

VENSTRE MEDLEM

Jeg skal gjenta dette – «Vi har ikke 2 land på listen (Spania og Russland) fordi de ikke har noen beslektet by i bytabellen». Dette skal være avgjørende når vi sammenligner INNER JOIN vs LEFT JOIN.

I noen tilfeller ønsker vi å ha til og med disse postene i resultatene våre. For eksempel vil du bare se i resultatet at disse landene ikke har relaterte poster i en annen tabell. Dette kan være en del av en eller annen kontroll, eller bare telle saker osv. Uansett motivasjonen bak dette ønsket, bør vi være teknisk i stand til å gjøre det. Og det er vi. I databaser gjør LEFT JOIN akkurat det.

Resultatet av LEFT JOIN skal være det samme som resultatet av INNER JOIN + vi har rader fra «venstre» tabellen, uten et par i «riktig» bord. Vi bruker den samme INNER JOIN-spørringen og erstatter bare ordet INNER med VENSTRE. Dette er resultatet:

Du kan enkelt merke at vi har to rader til, sammenlignet med resultatet av INNER BLI MED Dette er rekker for Russland og Spania. Siden begge ikke har noen relatert by, har alle byattributter i disse to radene NULL-verdier (er ikke definert). Det er den største forskjellen når man sammenligner INNER JOIN vs LEFT JOIN.

RIGHT JOIN

Du vil i det minste høre om RIGHT JOIN. Den brukes sjelden fordi den returnerer det samme resultatet som LEFT JOIN. På den annen side er spørsmål som bruker LEFT JOIN mye lettere å lese fordi vi ganske enkelt lister opp tabeller etter hverandre.

Dette tilsvarer forrige spørsmål ved å bruke RIGHT JOIN:

Du kan legge merke til at returnerte verdier er de samme, bare i dette tilfellet er verdier fra bytabellen i de første 5 kolonnene, og land- relaterte verdier kommer etter dem.

INNER JOIN vs LEFT JOIN

INNER JOIN vs LEFT JOIN?Egentlig er det ikke spørsmålet i det hele tatt. Du bruker INNER JOIN når du bare vil returnere poster som har par på begge sider, og du vil bruke LEFT JOIN når du trenger alle poster fra «venstre» tabellen, uansett om de har par i «høyre» tabellen. eller ikke. Hvis du trenger alle poster fra begge tabeller, uansett om de har par, må du bruke CROSS JOIN (eller simulere det ved hjelp av LEFT JOINs og UNION). Mer om det i de kommende artiklene.

Innholdsfortegnelse

Lær SQL: CREATE DATABASE & CREATE TABLE Operations

Lær SQL: INSERT IN TABLE

Lær SQL: Primær nøkkel

Lær SQL: Fremmed nøkkel

Lær SQL: SELECT-setning

Lær SQL: INNER JOIN vs LEFT JOIN

Lær SQL: SQL-skript

Lær SQL: Typer relasjoner

Lær SQL: Bli med i flere tabeller

Lær SQL: Aggregerte funksjoner

Lær SQL: Hvordan skrive en kompleks SELECT-spørring

Lær SQL: INFORMASJON_SCHEMA-databasen

Lær SQL: SQL-datatyper

Lær SQL: Sett teori

Lær SQL: Brukerdefinerte funksjoner

Lær SQL: Brukerdefinerte lagrede prosedyrer

Lær SQL: SQL-visninger

Lær SQL: SQL-utløsere

Lær SQL: Øv SQL-spørsmål

Lær SQL: SQL-spørringseksempler

Lær SQL: Opprett en rapport manuelt ved hjelp av SQL-spørringer

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

Lær SQL: Opprett SQL Server-rapporter ved hjelp av dato- og tidsfunksjoner

Lær SQL: SQL Server-pivottabeller

Lær SQL: SQL Server-eksport til Excel

Lær SQL: Introduksjon til SQL Server-sløyfer

Lær SQL: SQL Server-markører

Lær SQL: SQL beste fremgangsmåter for sletting og oppdatering av data

Lær SQL: Navngivningskonvensjoner

Lær SQL: SQL-relaterte jobber

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

Lær SQL: SQL Injeksjon

  • Forfatter
  • Nylige innlegg
Emil er databaseprofessor med 10+ års erfaring innen alt relatert til databaser. Gjennom årene jobbet han i IT- og finansbransjen og jobber nå som frilanser.
Hans tidligere og nåværende engasjement varierer fra databasedesign og koding til undervisning, rådgivning og skriving om databaser. Ikke å glemme, BI, å lage algoritmer, sjakk, filateli, 2 hunder, 2 katter, 1 kone, 1 baby …
Du finner ham på LinkedIn
Vis alle innlegg av Emil Drkusic

Siste innlegg av Emil Drkusic (se alle)
  • Lær SQL: SQL Injection – 2. november 2020
  • Lær SQL: Non-Equi-sammenkoblinger i SQL Server – 29. september 2020
  • Lær SQL: SQL-relaterte jobber – 1. september 2020

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *