SQLShack (Norsk)

Hvis du vil få noe meningsfylt ut av data , må du nesten alltid delta i flere tabeller. I denne artikkelen viser vi hvordan du gjør det ved hjelp av forskjellige typer koblinger. For å oppnå det kombinerer vi INNER JOINs og LEFT JOINs. Så la oss starte.

Modellen

På bildet nedenfor kan du se eksisterende modell. Den består av seks tabeller, og vi har allerede, mer eller mindre, beskrevet den i de forrige artiklene.

Likevel, selv om det ikke er beskrevet, hvis databasen er modellert og presentert på en god måte (valg av navn med omhu, bruk av navngivningskonvensjon, etter de samme reglene gjennom hele modellen, overlapper ikke linjer / relasjoner i skjema mer enn nødvendig) for å konkludere hvor du kan finne dataene du trenger. Dette er avgjørende fordi før du blir med i flere tabeller, må du først identifisere disse tabellene.

Vi vil snakke om navngivningskonvensjonen og råd om hvordan du kan tenke når du skriver SQL-spørsmål, senere i dette serie. Så langt, la oss leve med det faktum at denne modellen er ganske enkel, og vi kan gjøre det ganske enkelt.

Hva vet vi så langt?

I denne serien har vi dekket:

  • Grunnleggende om SQL SELECT-setning, og
  • Sammenlignet INNER JOIN og LEFT JOIN

Vi bruker kunnskapen fra begge disse artiklene og kombiner disse for å skrive mer komplekse SELECT-setninger som vil knytte seg til flere tabeller.

Bli med i flere tabeller ved hjelp av INNER JOIN

Det første eksemplet vi analyserer er hvordan du henter data fra flere tabeller som bare bruker INNER JOINs. For hvert eksempel følger vi definisjonen av problemet vi må løse, og spørringen som gjør jobben. Så la oss starte med det første problemet.

# 1 Vi må liste opp alle samtaler med starttid og sluttid. For hver samtale vil vi vise hva som ble resultatet, så vel for- og etternavnet til den ansatte som ringte. Vi sorterer samtalene etter starttid stigende.

Før vi skriver spørringen, identifiserer vi tabellene vi trenger å bruke. For å gjøre det må vi bestemme hvilke tabeller som inneholder dataene vi trenger, og inkludere dem. Vi bør også inkludere alle tabeller underveis mellom disse tabellene – tabeller som ikke inneholder data som trengs, men fungerer som en sammenheng mellom tabeller som gjør det (det er ikke tilfelle her).

Søket som gjør jobben er gitt nedenfor:

Spørringsresultatet er gitt nedenfor:

Det er noen få ting jeg vil påpeke her:

  • Tabellene vi har blitt med er her fordi dataene vi trenger ligger i disse tre tabellene
  • Hver gang jeg nevner noe attributt fra hvilken som helst tabell, bruker jeg formatet tabellnavn.attributtnavn (f.eks. ansatt.forste_navn). Selv om det ikke er nødvendig, er det en god praksis, for noen ganger kan to eller flere tabeller i samme spørring bruke de samme attributtnavnene, og det vil føre til en feil
  • Vi har brukt INNER JOIN 2 ganger i rekkefølge å bli med på 3 bord. Dette vil resultere i at du bare returnerer rader som har par i en annen tabell
  • Når du bare bruker INNER JOINs til å bli med i flere tabeller, er ikke rekkefølgen på disse tabellene i join viktig. Det eneste viktige er at du bruker passende tilknytningsbetingelser etter «PÅ» (bli med utenlandske nøkler)

Siden alle samtaler hadde relatert ansatt og samtaleutfall, ville vi få det samme resultatet hvis Vi har brukt LEFT JOIN i stedet for INNER JOIN.

Bli med i flere tabeller ved hjelp av LEFT JOIN

Skrivespørsmål som bruker LEFT JOINs skiller seg ikke mye ut sammenlignet med å skrive spørsmål ved å bruke INNER BLIR MED. Resultatet vil selvfølgelig være annerledes (i det minste i tilfeller der noen poster ikke har et par i andre tabeller).

Dette er problemet vi vil løse.

# 2 Liste over alle fylker og kunder relatert til disse landene. For hvert land som viser navnet sitt på engelsk, ligger navnet på bykunden i samt navnet på den aktuelle kunden. Returner selv land uten beslektede byer og kunder.

Tabellene som inneholder data vi trenger er på bildet nedenfor:

Først, la oss sjekk raskt hva som er kont av disse tre tabellene.

Vi kan legge merke til to viktige ting:

  • Selv om hver by har et beslektet land, har ikke alle land relaterte byer (Spania & Russland har ikke dem)
  • Samme står for kundene.Hver kunde har definert city_id-verdien, men bare 3 byer blir brukt (Berlin, Zagreb & New York)

La oss først skrive ned spørring ved hjelp av INNER JOIN:

Spørreresultatet vises på bildet nedenfor:

Vi har 7 fylker og 6 byer i databasen vår, men forespørselen vår returnerer bare 4 rader. Det er resultatet av det faktum at vi bare har 4 kunder i databasen vår. Hver av disse 4 er relatert til byen sin, og byen er relatert til landet. Så INNER JOIN eliminerte alle disse landene og byene uten kunder. Men hvordan kan vi inkludere disse i resultatet også?

For å gjøre det bruker vi LEFT JOIN. Vi vil ganske enkelt erstatte alt «INNER» med «VENSTRE», så spørsmålet vårt er som følger:

Resultatet vises på bildet nedenfor:

Du kan enkelt merke at nå har vi alle landene, også de uten noen relatert by (Russland & Spania), samt alle byer, også de uten kunder (Warszawa, Beograd & Los Angeles). De resterende 4 radene er de samme som i spørringen ved bruk av INNER JOIN.

LEFT JOIN – Tabeller bestiller saker

Mens rekkefølgen på JOINs i INNER JOIN ikke er viktig, er den samme står ikke for VENSTRE JOIN. Når vi bruker VENSTRE JOIN for å bli med i flere tabeller, er det viktig å huske at denne sammenføyningen inkluderer alle rader fra tabellen på VENSTRE side av JOIN. La oss omorganisere forrige spørring:

Først kan du enkelt si at dette spørsmålet og det forrige er det samme (dette gjelder når du bruker INNER JOIN). Vi har brukt de samme tabellene, VENSTRE MEDLEM og de samme tilknytningsbetingelsene. La oss ta en titt på utgangen først:

Hva skjedde her? Hvorfor har vi 4 rader (samme 4 som vi hadde da vi har brukt INNER JOIN)?

Svaret er enkelt, og det er relatert til hvordan LEFT JOIN fungerer. Den tar første tabell (kunde) og kobler alle radene (4 av dem) til neste tabell (by). Resultatet av dette er 4 rader fordi kunden bare kan tilhøre 1 by. Så slutter vi oss til disse 4 radene til neste tabell (land), og igjen har vi 4 rader fordi byen bare kan tilhøre ett land. måte er gitt av teksten i eksempel 2. Spørsmålet er skrevet på en slik måte at det returnerer 4 rader som vil være svaret på følgende: Returner navn på alle kunder, samt byer og land de befinner seg i. Returner selv kunder uten relaterte byer og land.

  • Merk: Når du bruker LEFT JOIN, er rekkefølgen på tabellene i denne setningen viktig, og spørringen vil gi et annet resultat hvis du endrer denne rekkefølgen. Bestillingen avhenger faktisk av hva du vil returnere som et resultat.

Bli med i flere tabeller ved hjelp av begge – INNER JOIN & VENSTRE JOIN

Dette er også mulig. La oss igjen gå med et eksempel.

# 3 Returner listen over alle land og byer som har par (ekskluder land som det ikke refereres til av noen by). For slike par returnerer alle kunder. Returner selv par som ikke har en eneste kunde.

Spørringen som gjør jobben er:

Resultatet av spørringen er gitt i bildet nedenfor:

Du kan enkelt merke at vi ikke har land uten noen relatert by (dette var Spania & Russland). INNER JOIN eliminerte disse radene. Likevel har vi sitater uten kunder (Beograd, Los Angeles & Warszawa). Dette er resultatet av det faktum at vi brukte LEFT JOIN mellom tabeller by og kunde.

Konklusjon

Når du trenger å bli med i flere tabeller, har du INNER & VENSTRE JOIN til din disposisjon (RIGHT JOIN brukes sjelden og kan enkelt erstattes av LEFT JOIN). Hvilken sammenføyning du vil bruke, avhenger direkte av oppgaven du trenger å løse, og du får følelsen underveis. I kommende artikler vil vi diskutere hvordan du kan tenke og organisere deg når du trenger å skrive mer komplekse spørsmål.

Innholdsfortegnelse

Lær SQL: OPPRETT DATABASE & OPPRETT TABELLoperasjoner

Lær SQL: INSERT IN TABLE

Lær SQL: Primær nøkkel

Lær SQL: Fremmed nøkkel

Lær SQL: SELECT uttalelse

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 et komplekst VELG Spørring

Lær SQL: INFORMATION_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ørreeksempler

Lær SQL: Opprett en rapport manuelt ved hjelp av SQL-spørsmål

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: Ikke-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 *