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