I denne artikel lærer vi det grundlæggende i at forbinde tabeller i SQL. Vi vil lære om venstre, højre, indre og ydre JOINs og give eksempler på, hvordan man bruger dem.
Data i et RDBMS (Relational Database Management System) er grupperet i tabeller. Disse tabeller har en rigid definition af den type data, der kan lagres i dem. For at forbinde forskellige tabeller, og dermed forskellige typer data, der kan relatere til hinanden, vil vi bruge JOIN-klausulen.
Typer af JOINs
Der er fire grundlæggende typer JOINs:INNER, OUTER, LEFT og RIGHT. Når to tabeller forbindes, returnerer de hver især en anden delmængde af de tilsvarende tabeller baseret på betingelsen i ON-sætningen.
- LEFT og RIGHT JOINs udfører en lignende opgave. De returnerer begge hele en enkelt tabel med information, der er relateret til den anden tabel.
- INNER og OUTER JOINs udfører meget forskellige opgaver. INNER JOINs giver et meget begrænset resultat, mens OUTER returnerer et komplet datasæt.
I dette eksempel bruger vi eksemplet med en salgsafdeling til denne øvelse, der anvender tre tabeller:sælgere, ordrer og kunder.
Sælgertabellen vil have tre kolonner:id, navn og provisionssats.
Dernæst vil ordretabellen indeholde fire kolonner:ordre-id'et, den samlede pris for ordren, kunden og, hvis tilgængelig, sælgeren.
Kundetabellen vil indeholde to kolonner:id og grundlæggende kontaktoplysninger.
Så vi har nu flere tabeller med information, der er nyttige for forskellige mennesker på forskellige måder. Ved at bruge disse tre tabeller (sælgere, ordrer og kunder) vil vi give eksempler på, hvordan hver af JOIN'erne kan være nyttige.
VENSTRE JOIN
Den formentlig mest brugte type JOIN er en LEFT JOIN. Hvis du tænker på, at de to tabeller bliver forbundet, er den nævnte i FROM-sætningen til venstre. Den nævnte i JOIN-klausulen er til højre. I en LEFT JOIN returneres hver række fra LEFT (eller FROM) tabellen i resultatet og er forbundet med tilsvarende rækker fra RIGHT (eller JOIN) tabellen, der matcher ON-sætningen.
Husk, at nogle rækker til VENSTRE muligvis ikke har matchende data til HØJRE. I så fald vil de felter, der ville være blevet udfyldt fra den HØJRE tabel i resultatet, blive udfyldt med en NULL-værdi.
Hvis flere rækker i RIGHT-tabellen matcher rækkerne fra VENSTRE-tabellen, vil flere rækker også blive inkluderet i resultatsættet. Et Venn-diagram viser, hvordan en LEFT JOIN ville se visualiseret ud:
Marketingdirektøren beder dig om en rapport om alle ordrer fordelt på kunde. Du kan bruge en LEFT JOIN til dette:
SELECT *
FROM orders
LEFT JOIN customer
ON orders.customer_id = customer.id;
Denne forespørgsel beder om alle data i "ordrer"-tabellen forbundet med rækkerne i "kunde"-tabellen, hvor kundens id er lig med customer_id i rækkefølge. Resultatet ville se sådan ud:
Bemærk, at for Widgets LLC-kunden er der tre poster, fordi de havde tre ordrer. Jolly Inc. afgav to ordrer, og Acme Inc. afgav en. Cheapo dukker ikke op på denne liste, fordi der ikke blev afgivet nogen ordrer.
RET JOIN
RIGHT JOIN er meget lig LEFT JOIN, bortset fra at den returnerer hver række fra RIGHT (JOIN) tabellen og kun tilsvarende rækker fra LEFT (FROM) tabellen. Igen, hvis der ikke er data i LEFT-tabellen, vil disse kolonner blive udfyldt med NULL-værdier.
Hvis der er flere rækker i VENSTRE-tabellen, vil der være flere rækker i resultatsættet. Dens Venn-diagram ville se sådan ud:
Hvis ledelsen ønsker en rapport med HVER kunde; selvom de ikke afgav en ordre, kunne vi bruge et RIGHT JOIN.
SELECT *
FROM orders
RIGHT JOIN customer
ON orders.customer_id = customer.id;
Igen starter vi med "ordre"-bordet og JOIN det til kundebordet. Fordi vi brugte en RIGHT JOIN, får vi mindst én række for hver post i RIGHT (JOIN) tabellen, kunde. Når der er et match mellem customer.id og orders.customer_id, udfyldes oplysningerne. Resultaterne inkluderer Cheapo Co med NULL-værdier i ordrekolonnerne:
INDRE JOIN
En INNER JOIN returnerer kun rækkerne fra hver kolonne, der matcher ON-sætningen. Hvis der ikke er et match til HØJRE, er rækkerne fra VENSTRE udelukket og omvendt. Venn-diagrammet for en INNER JOIN ser således ud:
Det er lønningsdag, og lønafdelingen skal vide, hvor meget provision der skal udbetales. Til dette skal de kende de ordrer, der blev afgivet gennem hver sælger. Bemærk, at ikke alle ordrer gik gennem en sælger, så dem er vi ligeglade med. Til dette kan vi bruge en INNER JOIN:
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
INNER JOIN salespeople
ON orders.salesperson_id = salespeople.id;
Igen starter vi med ordretabellen. Denne gang slutter vi os til sælgerbordet. Hvis der er en post i ordretabellen, der matcher en post i sælgertabellen, vil rækken blive inkluderet. I stedet for at udfylde umatchede rækker med NULL-værdier, ignoreres disse rækker i resultaterne.
Bemærk venligst, at vi beder databasen om ikke kun at returnere salgsbeløbet og provisionssatsen, men også den beregnede kommission. Resultaterne ville se sådan ud:
YDRE JOIN
En OUTER JOIN returnerer alt, uanset om der er et match. Hvis du skulle kombinere resultaterne af en LEFT og RIGHT JOIN, ville du få en OUTER JOIN. Venn-diagrammet for en YDRE JOIN ser således ud:
Nu er det slutningen af måneden, og salgschefen vil gerne vide ALLE salgene samt alle de provisioner, der blev udbetalt. Til dette vil vi bruge en OUTER JOIN:
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
FULL OUTER JOIN salespeople
ON orders.salesperson_id = salespeople.id;
Ligesom lønrapporten starter vi med bestillinger og JOIN til sælgere. Forskellen er, at med en OUTER JOIN vil du få resultater fra både VENSTRE og HØJRE tabeller med NULL udfyldt, hvor der ikke er et tilsvarende match. Resultaterne ser således ud:
Husk nu, at vi sagde, at MariaDB og MySQL ikke understøtter OUTER JOIN. Vi sagde også, at hvis du tilføjer en LEFT JOIN til en RIGHT JOIN, vil du få en OUTER JOIN. Tricket i de to systemer er at gøre netop det. Vi opnår dette med UNION-klausulen. Den føjer resultaterne af en forespørgsel til en anden:
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
UNION
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
RIGHT JOIN salespeople
ON orders.salesperson_id = salespeople.id;
Resultaterne ville se sådan ud:
FLERE JOIN
JOIN giver dig også mulighed for at forbinde mere end to borde. Hvis vi ønsker en komplet salgsrapport med kunde- og sælgeroplysninger, laver vi blot endnu et JOIN til sidst.
SELECT *
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
LEFT JOIN customer
ON customer.id = orders.customer_id;
I dette eksempel starter vi med ordretabellen og forbinder den med sælgertabellen, ligesom vi gjorde før. Det næste trin er at JOIN bordet til kundebordet. Dette vil udfylde alle de oplysninger, der kan linkes til ordretabellen.
Denne artikel er en kort introduktion og er ikke ment som en udtømmende diskussion af, hvordan JOIN kan bruges i SQL.
Klik nedenfor for at bruge denne praktiske kupon i dag!
Liquid Web har nogle af de mest kraftfulde databaseservere i branchen. Disse servere kan bruges til at drive den mindste hjemmevirksomhed op til de største multidatabaseklynger for virksomheder i virksomhedsskala.
Ring til os på 800.580.4985, eller åben en chat eller billet med os for at tale med en af vores erfarne løsninger eller hostingrådgivere for at lære, hvordan du kan drage fordel af disse teknikker i dag!