sql >> Databasteknik >  >> RDS >> Mysql

MySQL Performance:Introduktion till JOINs i SQL

I den här artikeln kommer vi att lära oss grunderna för att sammanfoga tabeller i SQL. Vi kommer att lära oss om vänster-, höger-, inre- och yttre JOIN-kopplingar och ge exempel på hur man använder dem.

Data i ett RDBMS (Relational Database Management System) grupperas i tabeller. Dessa tabeller har en stel definition av vilken typ av data som kan lagras i dem. För att koppla ihop olika tabeller, och därmed olika typer av data som kan relatera till varandra, kommer vi att använda JOIN-klausulen.

Typer av JOINs

Det finns fyra grundläggande typer av JOIN:INNER, OUTTER, LEFT och RIGHT. När två tabeller kopplas samman kommer de att returnera en annan delmängd av motsvarande tabeller baserat på villkoret i ON-satsen.

  • LEFT och RIGHT JOIN utför en liknande uppgift. De returnerar båda hela en enskild tabell med information som är relaterad till den andra tabellen.
  • INNER och OUTER JOINs utför mycket olika uppgifter. INNER JOINs ger ett mycket begränsat resultat, medan OUTER returnerar en komplett datauppsättning.
Obs:Vid tidpunkten för skrivningen av denna artikel stöder MariaDB och MySQL inte OUTER JOINs. Vi kommer dock att ge ett exempel på ett sätt att producera denna produktion på ett annat sätt.

I det här exemplet använder vi exemplet med en försäljningsavdelning för den här handledningen, som använder tre tabeller:säljare, beställningar och kunder.

Säljartabellen kommer att ha tre kolumner:id, namn och provisionssats.

Därefter kommer beställningstabellen att innehålla fyra kolumner:order-id, den totala kostnaden för beställningen, kunden och, om tillgänglig, säljaren.

Kundtabellen kommer att innehålla två kolumner:id och grundläggande kontaktinformation.

Så vi har nu flera tabeller med information som är användbara för olika människor på olika sätt. Med hjälp av dessa tre tabeller (säljare, beställningar och kunder) kommer vi att ge exempel på hur var och en av JOINerna kan vara användbara.

LEFT JOIN

Förmodligen den vanligaste typen av JOIN är en LEFT JOIN. Om du tänker på att de två tabellerna sammanfogas, är den som nämns i FROM-satsen till vänster. Den som nämns i JOIN-klausulen är till höger. I en LEFT JOIN returneras varje rad från LEFT (eller FROM) tabellen i resultatet och länkas till motsvarande rader från RIGHT (eller JOIN) tabellen som matchar ON-satsen.

Tänk på att vissa rader till VÄNSTER kanske inte har matchande data till HÖGER. I så fall kommer fälten som skulle ha fyllts i från HÖGER-tabellen i resultatet att fyllas i med ett NULL-värde.

Dessutom, om flera rader i den HÖGER-tabellen matchar raderna från den VÄNSTER-tabellen, kommer flera rader att inkluderas i resultatuppsättningen. Ett Venn-diagram visar hur en LEFT JOIN skulle se visualiserad ut:

Marknadsdirektören ber dig om en rapport över alla beställningar uppdelade per kund. Du kan använda en LEFT JOIN för detta:

SELECT *
FROM orders
LEFT JOIN customer
ON orders.customer_id = customer.id;

Denna fråga frågar efter all data i "order"-tabellen kopplad till raderna i "customer"-tabellen, där kundens id är lika med customer_id i ordningen. Resultatet skulle se ut så här:

Observera att för Widgets LLC-kunden finns det tre poster eftersom de hade tre beställningar. Jolly Inc. lade två beställningar och Acme Inc lade en. Cheapo dyker inte upp på den här listan eftersom inga beställningar gjordes.

RÄTT GÅ MED

RIGHT JOIN är mycket lik LEFT JOIN, förutom att den returnerar varje rad från RIGHT (JOIN) tabellen och endast motsvarande rader från LEFT (FROM) tabellen. Återigen, om det inte finns några data i VÄNSTER-tabellen, kommer dessa kolumner att fyllas med NULL-värden.

Om det finns flera rader i VÄNSTER-tabellen kommer det att finnas flera rader i resultatuppsättningen. Dess Venn-diagram skulle se ut så här:

Om ledningen vill ha en rapport med VARJE kund; även om de inte gjorde en beställning kunde vi använda RIGHT JOIN.

SELECT *
FROM orders
RIGHT JOIN customer
ON orders.customer_id = customer.id;

Återigen börjar vi med "order"-tabellen och ansluter den till kundbordet. Eftersom vi använde en RIGHT JOIN kommer vi att få minst en rad för varje post i RIGHT (JOIN) tabellen, kund. När det finns en matchning mellan customer.id och orders.customer_id fylls informationen i.  Resultaten inkluderar Cheapo Co med NULL-värden i orderkolumnerna:

INRE JOIN

En INNER JOIN returnerar endast de rader från varje kolumn som matchar ON-satsen. Om det inte finns en match till HÖGER så exkluderas raderna från VÄNSTER och vice versa. Venn-diagrammet för en INNER JOIN ser ut så här:

Det är lönedag och löneavdelningen måste veta hur mycket provision som ska betalas ut. För detta måste de känna till beställningarna som gjordes genom varje säljare. Observera att inte alla beställningar gick via en säljare, så vi bryr oss inte om dem. För detta kan vi använda en INNER JOIN:

SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
INNER JOIN salespeople
ON orders.salesperson_id = salespeople.id;

Återigen börjar vi med ordertabellen. Den här gången ansluter vi oss till säljarbordet. Om det finns en post i ordertabellen som matchar en post i säljartabellen kommer raden att inkluderas. Istället för att fylla i omatchade rader med NULL-värden ignoreras dessa rader i resultaten.

Observera att vi säger åt databasen att inte bara returnera försäljningsbeloppet och provisionssatsen utan även den beräknade provisionen. Resultaten skulle se ut så här:

YTTRE JOIN

En OUTTER JOIN returnerar allt oavsett om det finns en matchning. Om du skulle kombinera resultaten av en LEFT och RIGHT JOIN skulle du få en OUTTER JOIN. Venn-diagrammet för en OUTTER JOIN ser ut så här:

Nu är det slutet på månaden och försäljningschefen vill veta ALLA försäljningar samt alla provisioner som betalats ut. För detta kommer vi att använda en OUTTER JOIN:

SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
FULL OUTER JOIN salespeople
ON orders.salesperson_id = salespeople.id;

Liksom lönerapporten börjar vi med beställningar och GÅR MED till säljare. Skillnaden är att med en OUTTER JOIN kommer du att få resultat från både VÄNSTER och HÖGER tabeller med NULL ifyllt där det inte finns en motsvarande matchning. Resultaten ser ut så här:

Kom nu ihåg att vi sa att MariaDB och MySQL inte stöder OUTER JOIN. Vi sa också att om du lägger till en LEFT JOIN till en RIGHT JOIN så får du en OUTTER JOIN. Tricket i de två systemen är att göra just det. Vi åstadkommer detta med UNION-klausulen. Den lägger till resultaten av en fråga till en annan:

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;

Resultaten skulle se ut så här:

FLERA JOININGS

JOIN låter dig också ansluta fler än två bord. Om vi ​​vill ha en fullständig försäljningsrapport med kund- och säljarinformation gör vi helt enkelt ytterligare en JOIN i slutet.

SELECT *
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
LEFT JOIN customer
ON customer.id = orders.customer_id;

I det här exemplet börjar vi med ordertabellen och kopplar den till säljartabellen ungefär som vi gjorde tidigare. Nästa steg är att FÖRENA bordet till kundbordet. Detta kommer att fylla i all information som är länkbar till ordertabellen.

Den här artikeln är en kort introduktion och är inte avsedd att vara en uttömmande diskussion om hur JOIN kan användas i SQL.

Klicka nedan för att använda den här praktiska kupongen idag!

Liquid Web har några av de mest kraftfulla databasservrarna i branschen. Dessa servrar kan användas för att driva de minsta hemföretagen upp till de största multi-databasklustren för företag i stor skala.

Ring oss på 800.580.4985, eller öppna en chatt eller en biljett med oss ​​för att prata med en av våra erfarna lösningar eller värdrådgivare för att lära dig hur du kan dra nytta av dessa tekniker idag!

Serienavigering<
  1. Skapa flera Postgres-instanser på samma maskin

  2. Boolean Field i Oracle

  3. Användarkontohantering, roller, behörigheter, autentisering PHP och MySQL - Del 3

  4. Hur man beräknar en kvadratrot i SQL