En af de største fordele ved at bruge relationsdatabaser som MySQL er, at dens relationelle struktur giver dig mulighed for nemt at gemme og spørge information på tværs af flere tabeller.
Lad os undersøge, hvordan du henter nøjagtigt de data, du ønsker fra flere databasetabeller, og de forskellige sammenføjninger, der er tilgængelige, som giver dig mulighed for at trække de nøjagtige resultater, du ønsker.
Initialiser eksempeldatabase
Dette er ikke påkrævet, men hvis du vil følge eksemplerne i denne artikel, kan du initialisere en eksempeldatabase lokalt med nedenstående terminalkommandoer:
git klon https://github.com/mdizak/sample-select-db.git
cd sample-select-db
sudo mysql sudo mysql sampletb
mysql> VÆLG TÆLL (*) FRA kunder;
Du skal få et resultat om, at der er 2000 rækker inden for kunder bord.
Standard / INNER Deltag
Standardtilslutningen bruges inden for MySQL-databaser kaldes INNER join, og er den mest almindelige og ligetil. Denne sammenføjning returnerer alle poster, for hvilke der er matchende poster, i begge tabeller og afviser alle andre poster.
Java leverer JDBC som en del af Java SDK. I denne artikel skal vi se på detaljerne i at oprette forbindelse til en MySQL-database og udføre forespørgsler med den.
For eksempel, hvis du vil se kundens for- og efternavne plus ordrebeløb og dato for alle ordrer større end $ 1000, kan du bruge følgende SQL-sætning:
VÆLG
c.id, c.first_name, c.last_name, o.beløb, o.created_at
FRA
kunder c, ordrer o
HVOR
o.customer_id = c.id OG o.beløb> = 1000;
Et par noter vedrørende ovenstående forespørgsel:
- Der vælges fem forskellige kolonner, tre fra kundetabellen og to fra ordretabellen.
- Inden for FROM-klausulen er de to tabeller defineret, men efterfulgt af bogstaverne "c" og "o". Disse angiver simpelthen aliaser inden for SQL, kan være alt hvad du ønsker og bruges til at forkorte SQL-forespørgslen.
- Det o.customer_id = c.id er forbindelsesaspektet af forespørgslen og sikrer korrekt sammenhæng mellem kunder og ordrer.
En anden og teknisk mere syntaktisk korrekt måde at skrive den samme forespørgsel på er nedenfor:
VÆLG
c.id, c.first_name, c.last_name, o.beløb, o.created_at
FRA
kunder c INNER JOIN ordrer o
PÅ
kunde_id = c.id
HVOR
o.beløb> = 1000;
Ovenstående forespørgsel har tendens til at være lidt lettere at læse, da du let kan se sammenføjningen mellem kunderne og ordretabellen. I alle henseender er disse to forespørgsler de samme og vil producere nøjagtigt de samme poster.
VENSTRE sammenføjninger
Venstre sammenføjninger returnerer alle poster fra venstre tabel, der også matcher poster fra højre tabel, og afviser alle andre poster. For eksempel, måske vil du se det samlede salgsmængde for hvert produkt i databasen, du kan prøve at bruge en forespørgsel såsom:
VÆLG
p.navn, sum (artikel.beløb) SOM beløb
FRA
orders_items item LEFT JOIN produkter s
PÅ
item.product_id = p.id
GRUPP VED item.product_id BESTIL EFTER beløb DESC
Dette resulterer i en flot visning med to kolonner, der viser produktnavnet med det samlede salgsbeløb og fungerer som forventet. Forespørgslen gik gennem alle produkter i ordren_items-tabellen, sluttede dem til poster i produkttabellen og returnerede det samlede salgsbeløb for hver.
HØJRE sammenføjninger
Brug ovenstående eksempel til at bemærke, at ovenstående forespørgsel kun returnerede 19 poster, mens der i alt er 22 produkter i databasen. Dette skyldes, at forespørgslen begyndte med ordren_items-tabellen og forlod den sammen med produkttabellen, og da nogle produkter aldrig er blevet bestilt, findes der ingen fortegnelser over disse produkter inden for ordrer bord.
Hvad sker der, hvis du ønsker at få en liste over alle produkter med salgsbeløb, inklusive produkter, der ikke er bestilt? Prøv en ret tilslutning med følgende forespørgsel:
VÆLG
p.navn, sum (artikel.beløb) SOM beløb
FRA
orders_items vare RIGHT JOIN produkter s
PÅ
item.product_id = p.id
GRUPP VED p.id BESTIL EFTER MULTI DESC
Det er bedre, og forespørgslen returnerer nu hele 22 produkter, hvoraf tre har et beløb på nul. Dette skyldes, at i stedet for at bruge orders_items som den primære tabel, der slutter sig til produkttabellen, vender det højre join ordren og forbinder produkttabellen til ordren_items-tabellen.
Flere sammenføjninger i en forespørgsel
Nogle gange har du et behov for at forbinde tre eller flere tabeller for at få et specifikt sæt resultater.
For eksempel vil du måske have en liste over alle kunder, der har købt mikrobølgeovnen (produkt-id nr. 1), inklusive deres navn og ordredato. Dette kræver en VÆLG på tværs af tre tabeller, som kan gøres ved at bruge to sammenføjninger med følgende forespørgsel:
VÆLG
c.first_name, c.last_name, o.beløb, o.created_at
FRA
kunder c INNER JOIN ordrer o
PÅ
c.id = o.customer_id INNER JOIN orders_items-vare
PÅ
item.order_id = o.id
HVOR
item.product_id = 1 ORDER AF o.created_at;
Denne forespørgsel returnerer alle 426 ordrer i mikrobølgeovnen og fungerer som forventet. Det matcher først alle kunder med deres respektive ordrer, derefter yderligere forespørgsler, der er resultatet indstillet af at matche alle ordrer med kun dem inden for ordren_items-tabellen, der indeholder mikrobølgeproduktet (id # 1).
Brug aldrig underforespørgsler med IN-klausuler
Som en hurtig sidenote skal du for enhver pris altid undgå at bruge underforespørgsler inden for dine SQL-forespørgsler som:
VÆLG fornavn, efternavn FRA kunder HVOR id I (VÆLG kunde_id FRA ordrer HVOR status = 'godkendt' OG beløb <100);
Forespørgsler som ovenfor er meget ineffektive, bruger et stort antal ressourcer og bør undgås så meget som muligt. Brug i stedet de rette sammenføjninger som beskrevet i ovenstående afsnit. For eksempel skal ovenstående forespørgsel omskrives som:
VÆLG c.first_name, c.last_name FRA kunder c VENSTRE JOIN-ordrer o PÅ o.customer_id = c.id WHERE o.status = 'godkendt' OG o.beløb <100;
Spar tid med SQL-tilslutninger
Denne artikel har forhåbentlig hjælp til at vise dig styrken i relationsdatabaser som MySQL, og hvordan man bygger SQL-forespørgsler der henter poster fra flere tabeller inden for en forespørgsel ved hjælp af sammenføjninger, så du kan hente de nøjagtige resultater, du ønsker.
Du har lært tre forskellige sammenføjninger inden for SQL, hvordan man alias kolonne- og tabelnavne, bruger flere sammenføjninger i en forespørgsel, og hvorfor du skal undgå underforespørgsler. Gå aldrig rundt igen og forsøg at samle forskellige datasæt manuelt til et, og begynd at bruge sammenføjninger til at imponere dine arbejdskolleger og spare tid.
Google Docs er nu et kraftværk på kontoret. Ved hjælp af disse tilføjelser kan du få dine Google Docs til at se smukke og stilfulde ud.
- Programmering
- SQL
- database
Abonner på vores nyhedsbrev
Deltag i vores nyhedsbrev for tekniske tip, anmeldelser, gratis e-bøger og eksklusive tilbud!
Et trin mere !!!
Bekræft din e-mail-adresse i den e-mail, vi lige har sendt dig.