SQLShack (Dansk)

Hvis du vil få noget meningsfuldt ud af data , skal du næsten altid deltage i flere tabeller. I denne artikel viser vi, hvordan man gør det ved hjælp af forskellige typer sammenføjninger. For at opnå dette kombinerer vi INNER JOINs og LEFT JOINs. Så lad os starte.

Modellen

På billedet nedenfor kan du se den eksisterende model. Den består af 6 tabeller, og vi har allerede mere eller mindre beskrevet den i de tidligere artikler.

Stadig, selv uden at beskrive, hvis databasen er modelleret og præsenteret på en god måde (valg af navne klogt ved hjælp af navngivningskonvention, efter de samme regler i hele modellen, overlapper linjer / relationer i skema ikke mere end nødvendigt) for at konkludere, hvor du kan finde de data, du har brug for. Dette er afgørende, for før du tilmelder dig flere tabeller, skal du først identificere disse tabeller.

Vi taler om navngivningskonvention og råd om, hvordan du tænker, når du skriver SQL-forespørgsler senere i dette serie. Indtil videre skal vi leve med det faktum, at denne model er ret enkel, og vi kan gøre det ret let.

Hvad ved vi hidtil?

I denne serie har vi omfattet:

  • Grundlæggende relateret til SQL SELECT-sætning og
  • Sammenlignet INNER JOIN og LEFT JOIN

Vi bruger viden fra begge disse artikler og kombiner disse for at skrive mere komplekse SELECT-sætninger, der vil slutte sig til flere tabeller.

Deltag i flere tabeller ved hjælp af INNER JOIN

Det første eksempel, vi analyserer, er hvordan man henter data fra flere tabeller, der kun bruger INNER JOINs. For hvert eksempel går vi med definitionen af det problem, vi skal løse, og den forespørgsel, der udfører jobbet. Så lad os starte med det første problem.

# 1 Vi skal liste alle opkald med deres starttid og sluttid. For hvert opkald vil vi vise, hvad der var resultatet, såvel for- og efternavnet på den medarbejder, der foretog opkaldet. Vi sorterer vores opkald efter stigende starttid.

Før vi skriver forespørgslen, identificerer vi de tabeller, vi skal bruge. For at gøre det skal vi bestemme, hvilke tabeller der indeholder de data, vi har brug for, og inkludere dem. Vi bør også inkludere alle tabeller undervejs mellem disse tabeller – tabeller, der ikke indeholder de nødvendige data, men fungerer som en relation mellem tabeller, der gør det (det er ikke tilfældet her).

Forespørgslen, der udfører jobbet, er angivet nedenfor:

Forespørgselsresultatet er angivet nedenfor:

Der er et par ting, jeg gerne vil påpege her:

  • De tabeller, vi har tilsluttet, er her, fordi dataene vi har brug for findes i disse 3 tabeller
  • Hver gang jeg nævner en hvilken som helst attribut fra en hvilken som helst tabel, bruger jeg formatet tabelnavn.attributnavn (f.eks. medarbejder. første navn). Selvom det ikke er nødvendigt, er det en god praksis, for nogle gange kunne 2 eller flere tabeller i samme forespørgsel bruge de samme attributnavne, og det ville føre til en fejl
  • Vi har brugt INNER JOIN 2 gange i rækkefølge for at deltage i 3 borde. Dette resulterer i, at kun rækker returneres med par i en anden tabel
  • Når du kun bruger INNER JOINs til at slutte sig til flere tabeller, er rækkefølgen af disse tabeller i sammenføjninger ikke vigtig. Det eneste vigtige er, at du bruger passende tilslutningsbetingelser efter “ON” (deltager ved hjælp af udenlandske nøgler)

Da alle opkald havde relateret medarbejder- og opkaldsresultat, ville vi få det samme resultat, hvis vi har brugt LEFT JOIN i stedet for INNER JOIN.

Deltag i flere tabeller ved hjælp af LEFT JOIN

Skriveforespørgsler, der bruger LEFT JOINs, adskiller sig ikke meget sammenlignet med skrivning af forespørgsler ved hjælp af INDRE SAMLER. Resultatet ville naturligvis være anderledes (i det mindste i tilfælde, hvor nogle poster ikke har et par i andre tabeller).

Dette er det problem, vi vil løse.

# 2 Liste over alle amter og kunder, der er relateret til disse lande. For hvert land, der viser sit navn på engelsk, er navnet på byens kunde placeret i såvel som navnet på den pågældende kunde. Returner selv lande uden relaterede byer og kunder.

Tabellerne, der indeholder data, vi har brug for, er på billedet nedenfor:

Lad os først hurtigt kontrollere, hvad der er kont af disse 3 tabeller.

Vi kan bemærke to vigtige ting:

  • Mens hver by har et beslægtet land, har ikke alle lande relaterede byer (Spanien & Rusland har ikke dem)
  • Samme står for kunderne.Hver kunde har defineret city_id-værdien, men kun 3 byer bruges (Berlin, Zagreb & New York)

Lad os først skrive ned forespørgsel ved hjælp af INNER JOIN:

Forespørgselsresultatet vises på billedet nedenfor:

Vi har 7 amter og 6 byer i vores database, men vores forespørgsel returnerer kun 4 rækker. Det er resultatet af det faktum, at vi kun har 4 kunder i vores database. Hver af disse 4 er relateret til sin by, og byen er relateret til landet. Så INNER JOIN eliminerede alle disse lande og byer uden kunder. Men hvordan skal vi også medtage disse i resultatet?

For at gøre det bruger vi LEFT JOIN. Vi erstatter simpelthen alle “INNER” med “VENSTRE”, så vores forespørgsel er som følger:

Resultatet vises på billedet nedenfor:

Du kan let bemærke, at vi nu har alle lande, også lande uden nogen beslægtet by (Rusland & Spanien), samt alle byer, selv de uden kunder (Warszawa, Beograd & Los Angeles). De resterende 4 rækker er de samme som i forespørgslen ved hjælp af INNER JOIN.

VENSTRE JOIN – Tabeller er vigtige

Mens rækkefølgen af JOINs i INNER JOIN ikke er vigtig, er den samme står ikke for LEFT JOIN. Når vi bruger VENSTRE JOIN for at deltage i flere tabeller, er det vigtigt at huske, at denne sammenføjning inkluderer alle rækker fra tabellen på VENSTRE side af JOIN. Lad os omarrangere den forrige forespørgsel:

Først kan du let sige, at denne forespørgsel og den forrige er de samme (dette gælder, når du bruger INNER JOIN). Vi har brugt de samme tabeller, LEFT JOINs og de samme tilslutningsbetingelser. Lad os først se på output:

Så hvad skete der her? Hvorfor har vi 4 rækker (samme 4, som vi havde, da vi har brugt INNER JOIN)?

Svaret er simpelt, og det er relateret til, hvordan LEFT JOIN fungerer. Det tager den første tabel (kunde) og forbinder alle dens rækker (4 af dem) til den næste tabel (by). Resultatet af dette er 4 rækker, fordi kunden kun kunne tilhøre 1 by. Derefter slutter vi os til disse 4 rækker til den næste tabel (land), og igen har vi 4 rækker, fordi byen kun kan tilhøre 1 land.

Årsagen til, at vi ikke ville deltage i disse 3 tabeller i dette måde er givet ved teksten i eksemplet # 2. Forespørgslen er skrevet på en sådan måde, at den returnerer 4 rækker ville være svaret på følgende: Returner navne på alle kunder såvel som byer og lande, de er placeret i. Returner selv kunder uden relaterede byer og lande.

  • Bemærk: Når du bruger LEFT JOIN, er rækkefølgen af tabeller i denne erklæring vigtig, og forespørgslen returnerer et andet resultat, hvis du ændrer denne rækkefølge. Rækkefølgen afhænger faktisk af, hvad du vil returnere som et resultat.

Deltag i flere tabeller ved hjælp af begge dele – INNRE JOIN & VENSTRE JOIN

Dette er også muligt. Lad os igen gå med et eksempel.

# 3 Returner listen over alle lande og byer, der har par (ekskluder lande, som ingen by henviser til). For sådanne par returnerer alle kunder. Returner lige par, der ikke har en enkelt kunde.

Forespørgslen, der udfører jobbet, er:

Resultatet af forespørgslen er vist i billedet nedenfor:

Du kan let bemærke, at vi ikke har lande uden nogen relateret by (disse var Spanien & Rusland). INNER JOIN eliminerede disse rækker. Alligevel har vi citater uden kunder (Beograd, Los Angeles & Warszawa). Dette er resultatet af det faktum, at vi brugte LEFT JOIN mellem tabeller by og kunde.

Konklusion

Når du skal deltage i flere tabeller, har du INNER & VENSTRE JOIN til din rådighed (RIGHT JOIN bruges sjældent og kan let erstattes af LEFT JOIN). Hvilken sammenkædning du bruger afhænger direkte af den opgave, du skal løse, og du får følelsen undervejs. I kommende artikler diskuterer vi, hvordan du tænker og organiserer dig selv, når du har brug for at skrive mere komplekse forespørgsler.

Indholdsfortegnelse

Lær SQL: OPRET DATABASE & OPRET TABELhandlinger

Lær SQL: INDSÆT I TABEL

Lær SQL: Primær nøgle

Lær SQL: Fremmed nøgle

Lær SQL: VÆLG erklæring

Lær SQL: INNER JOIN vs LEFT JOIN

Lær SQL: SQL-scripts

Lær SQL: Typer af relationer

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: Sæt 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 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 *