En av de største fordelene ved å bruke relasjonsdatabaser som MySQL er at dens relasjonsstruktur lar deg enkelt lagre og spørre informasjon på tvers av flere tabeller.

La oss undersøke hvordan du kan hente nøyaktig dataene du vil ha fra flere databasetabeller, og de forskjellige sammenføyningene som er tilgjengelige, som lar deg trekke de nøyaktige resultatene du ønsker.

Initialiser eksempeldatabase

Dette er ikke nødvendig, men hvis du ønsker å følge eksemplene i denne artikkelen, kan du initialisere en eksempeldatabase lokalt med terminalterminalene nedenfor:

git klon https://github.com/mdizak/sample-select-db.git
cd sample-select-db
sudo mysql sudo mysql sampletb
mysql> VELG TELL (*) FRA kunder;

Du bør få et resultat om at det er 2000 rader i kunder bord.

Standard / INNER Bli med

Standard sammenføyning brukes i MySQL-databaser kalles INNER join, og er den vanligste og rett frem. Denne sammenføyningen returnerer alle poster som det er samsvarende poster i begge tabellene, og avviser alle andre poster.

Hvordan koble til en MySQL-database med Java

Java gir JDBC som en del av Java SDK. I denne artikkelen, la oss se på detaljene for å koble til en MySQL-database og utføre spørsmål med den.

Hvis du for eksempel vil se kundens for- og etternavn, pluss ordresum og dato for alle bestillinger større enn $ 1000, kan du bruke følgende SQL-setning:


Å VELGE
c.id, c.first_name, c.last_name, o.mount, o.created_at
FRA
kunder c, bestillinger o
HVOR
o.customer_id = c.id OG o.beløp> = 1000;

Noen få merknader angående ovennevnte spørsmål:

  • Fem forskjellige kolonner velges, tre fra kundetabellen og to fra ordretabellen.
  • Innenfor FROM-paragrafen er de to tabellene definert, men etterfulgt av bokstavene "c" og "o". Disse spesifiserer ganske enkelt aliaser i SQL, kan være hva du måtte ønske, og brukes til å forkorte SQL-spørringen.
  • De o.customer_id = c.id er tilknytningsaspektet i spørringen, og sørger for riktig korrelasjon mellom kunder og bestillinger.

En annen og teknisk mer syntaktisk riktig måte å skrive den samme spørringen på er nedenfor:


Å VELGE
c.id, c.first_name, c.last_name, o.mount, o.created_at
FRA
kunder c INNRE JOIN bestillinger o

kunde_id = c.id
HVOR
o.beløp> = 1000;

Ovenstående spørsmål har en tendens til å være litt lettere å lese, ettersom du enkelt kan se sammenføyningen mellom kundene og ordretabellen. For alle formål er imidlertid disse to spørsmålene de samme, og vil produsere nøyaktig de samme postene.

VENSTRE blir med

Venstre sammenføyninger returnerer alle poster fra venstre tabell som også samsvarer med poster fra høyre tabell, og avviser alle andre poster. For eksempel, kanskje du vil se den totale mengden salg for hvert produkt i databasen, kan du prøve å bruke et spørsmål som:


Å VELGE
p.navn, sum (vare.beløp) SOM beløp
FRA
orders_items element LEFT JOIN produkter s

item.product_id = p.id
GRUPPER PÅ item.product_id Bestill etter mengde DESC

Dette resulterer i en fin to kolonnevisning som viser produktnavnet med det totale salgsbeløpet, og fungerer som forventet. Forespørselen gikk gjennom alle produktene i ordren_items-tabellen, ble med i postene i produkttabellen og returnerte det totale salgsbeløpet for hver.

RIKTIG blir med

Bruk eksemplet ovenfor, og legg merke til det faktum at spørringen ovenfor bare returnerte 19 poster mens det totalt er 22 produkter i databasen. Dette er fordi spørringen begynte med ordren_items-tabellen og la den bli med i produkttabellen, og siden noen produkter aldri har blitt bestilt, eksisterer det ingen registreringer av disse produktene innenfor ordreproduktene bord.

Hva skjer hvis du vil få en liste over alle produkter med salgsbeløp, inkludert produkter som ikke er bestilt? Prøv en rett sammenkobling med følgende spørsmål:


Å VELGE
p.navn, sum (vare.beløp) SOM beløp
FRA
orders_items element RIGHT JOIN produkter s

item.product_id = p.id
GRUPPER P.id BESTILLING AV TAMONT DESC

Det er bedre, og spørringen returnerer nå hele 22 produktene, hvorav tre av dem har et beløp på null. Dette er fordi i stedet for å bruke orders_items som den primære tabellen som blir med i produkttabellen, vender høyre join ordren og kobler produkttabellen til orders_items-tabellen.

Flere sammenføyninger i en spørring

Noen ganger har du behov for å slå sammen tre eller flere tabeller for å få et spesifikt sett med resultater.

For eksempel, kanskje du vil ha en liste over alle kunder som har kjøpt mikrobølgeovnen (produkt-ID nr. 1), inkludert navn og bestillingsdato. Dette krever et SELECT på tvers av tre tabeller som kan gjøres ved å bruke to sammenføyninger med følgende spørsmål:


Å VELGE
c.first_name, c.last_name, o.mount, o.created_at
FRA
kunder c INNRE JOIN bestillinger o

c.id = o.customer_id INNER JOIN orders_items item

item.order_id = o.id
HVOR
item.product_id = 1 BESTILL AV BY.created_at;

Dette spørsmålet returnerer alle 426 bestillingene av mikrobølgeovnen, og fungerer som forventet. Det samsvarer først med alle kunder med deres respektive bestillinger, deretter ytterligere spørsmål som resultatet er satt av samsvarer alle bestillinger med bare de innen ordren_items-tabellen som inneholder mikrobølgeovnproduktet (id # 1).

Bruk aldri underspørringer med IN-klausuler

Som en rask sidenote, for enhver pris, bør du alltid unngå å bruke underspørringer med i SQL-spørsmålene dine, for eksempel:

SELECT first_name, last_name FROM customers WHERE id IN (SELECT customer_id FROM orders WHERE status = 'approved' AND amount <100);

Spørringer som ovenfor er svært ineffektive, bruker et stort antall ressurser og bør unngås så mye som mulig. Bruk i stedet skikkelige skjøter som beskrevet i avsnittene ovenfor. For eksempel bør spørringen ovenfor skrives om som:

VELG c.first_name, c.last_name FRA kunder c VENSTRE JOIN-bestillinger o PÅ o.customer_id = c.id WHERE o.status = 'godkjent' OG o.beløp <100;

Spar tid med SQL-sammenkoblinger

Denne artikkelen har forhåpentligvis bidratt til å vise deg kraften i relasjonsdatabaser som MySQL, og hvordan du bygger SQL-spørsmål som henter poster fra flere tabeller i ett spørsmål ved hjelp av sammenføyninger, slik at du kan hente de nøyaktige resultatene du ønsker.

Du har lært tre forskjellige sammenføyninger i SQL, hvordan du alias kolonne- og tabellnavn, bruker flere sammenføyninger i ett spørsmål, og hvorfor du bør unngå underspørsler. Aldri kryp rundt igjen og prøv å kompilere forskjellige datasett manuelt til ett, og begynn å bruke koblinger for å imponere arbeidskollegaene dine og spare tid.

E-post
10 fine måter å lage vakre Google-dokumenter

Google Docs er nå et kraftverk på kontoret. Ved hjelp av disse tilleggene kan du få Google Docs til å se pen og stilig ut.

Relaterte temaer
  • Programmering
  • SQL
  • database
Om forfatteren
Matt Dizak (13 artikler publisert)Mer fra Matt Dizak

Abonner på vårt nyhetsbrev

Bli med på nyhetsbrevet vårt for tekniske tips, anmeldelser, gratis e-bøker og eksklusive tilbud!

Ett steg til…!

Bekreft e-postadressen din i e-posten vi nettopp sendte deg.

.