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
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
- 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