Vad är JOINS?
Anslutningar hjälper till att hämta data från två eller flera databastabeller. Tabellerna är ömsesidigt relaterade med primära och främmande nycklar.Obs! JOIN är det mest missförstådda ämnet bland SQL-leaners. För enkelhets skull och förståelse kommer vi att använda en ny databas för att öva på prov. Enligt nedanstående
id | förnamn | efternamn | movie_id |
---|---|---|---|
1 | Adam | Smed | 1 |
2 | Ravi | Kumar | 2 |
3 | Susan | Davidson | 5 |
4 | Jenny | Adrianna | 8 |
6 | Lä | Pong | 10 |
id | titel | kategori |
---|---|---|
1 | LÖRMÖRDARE CREED: EMBERS | Animationer |
2 | Real Steel (2012) | Animationer |
3 | Alvin och gänget | Animationer |
4 | Tin Tin äventyr | Animationer |
5 | Safe (2012) | Handling |
6 | Safe House (2012) | Handling |
7 | GIA | 18+ |
8 | Tidsfrist 2009 | 18+ |
9 | Den smutsiga bilden | 18+ |
10 | Marley och jag | Romantik |
Typer av sammanfogningar
Cross JOIN
Cross JOIN är en enklaste form av JOINs som matchar varje rad från en databastabell till alla andra rader.
Med andra ord ger det oss kombinationer av varje rad i första tabellen med alla poster i andra tabellen.
Antag att vi vill få alla medlemsrekord mot alla filmrekord, vi kan använda manuset som visas nedan för att få våra önskade resultat.
SELECT * FROM `movies` CROSS JOIN `members`
Att utföra ovanstående skript i MySQL-arbetsbänk ger oss följande resultat.
id | title | id | first_name | last_name | movie_id | |
---|---|---|---|---|---|---|
1 | ASSASSIN'S CREED: EMBERS | Animations | 1 | Adam | Smith | 1 |
1 | ASSASSIN'S CREED: EMBERS | Animations | 2 | Ravi | Kumar | 2 |
1 | ASSASSIN'S CREED: EMBERS | Animations | 3 | Susan | Davidson | 5 |
1 | ASSASSIN'S CREED: EMBERS | Animations | 4 | Jenny | Adrianna | 8 |
1 | ASSASSIN'S CREED: EMBERS | Animations | 6 | Lee | Pong | 10 |
2 | Real Steel(2012) | Animations | 1 | Adam | Smith | 1 |
2 | Real Steel(2012) | Animations | 2 | Ravi | Kumar | 2 |
2 | Real Steel(2012) | Animations | 3 | Susan | Davidson | 5 |
2 | Real Steel(2012) | Animations | 4 | Jenny | Adrianna | 8 |
2 | Real Steel(2012) | Animations | 6 | Lee | Pong | 10 |
3 | Alvin and the Chipmunks | Animations | 1 | Adam | Smith | 1 |
3 | Alvin and the Chipmunks | Animations | 2 | Ravi | Kumar | 2 |
3 | Alvin and the Chipmunks | Animations | 3 | Susan | Davidson | 5 |
3 | Alvin and the Chipmunks | Animations | 4 | Jenny | Adrianna | 8 |
3 | Alvin and the Chipmunks | Animations | 6 | Lee | Pong | 10 |
4 | The Adventures of Tin Tin | Animations | 1 | Adam | Smith | 1 |
4 | The Adventures of Tin Tin | Animations | 2 | Ravi | Kumar | 2 |
4 | The Adventures of Tin Tin | Animations | 3 | Susan | Davidson | 5 |
4 | The Adventures of Tin Tin | Animations | 4 | Jenny | Adrianna | 8 |
4 | The Adventures of Tin Tin | Animations | 6 | Lee | Pong | 10 |
5 | Safe (2012) | Action | 1 | Adam | Smith | 1 |
5 | Safe (2012) | Action | 2 | Ravi | Kumar | 2 |
5 | Safe (2012) | Action | 3 | Susan | Davidson | 5 |
5 | Safe (2012) | Action | 4 | Jenny | Adrianna | 8 |
5 | Safe (2012) | Action | 6 | Lee | Pong | 10 |
6 | Safe House(2012) | Action | 1 | Adam | Smith | 1 |
6 | Safe House(2012) | Action | 2 | Ravi | Kumar | 2 |
6 | Safe House(2012) | Action | 3 | Susan | Davidson | 5 |
6 | Safe House(2012) | Action | 4 | Jenny | Adrianna | 8 |
6 | Safe House(2012) | Action | 6 | Lee | Pong | 10 |
7 | GIA | 18+ | 1 | Adam | Smith | 1 |
7 | GIA | 18+ | 2 | Ravi | Kumar | 2 |
7 | GIA | 18+ | 3 | Susan | Davidson | 5 |
7 | GIA | 18+ | 4 | Jenny | Adrianna | 8 |
7 | GIA | 18+ | 6 | Lee | Pong | 10 |
8 | Deadline(2009) | 18+ | 1 | Adam | Smith | 1 |
8 | Deadline(2009) | 18+ | 2 | Ravi | Kumar | 2 |
8 | Deadline(2009) | 18+ | 3 | Susan | Davidson | 5 |
8 | Deadline(2009) | 18+ | 4 | Jenny | Adrianna | 8 |
8 | Deadline(2009) | 18+ | 6 | Lee | Pong | 10 |
9 | The Dirty Picture | 18+ | 1 | Adam | Smith | 1 |
9 | The Dirty Picture | 18+ | 2 | Ravi | Kumar | 2 |
9 | The Dirty Picture | 18+ | 3 | Susan | Davidson | 5 |
9 | The Dirty Picture | 18+ | 4 | Jenny | Adrianna | 8 |
9 | The Dirty Picture | 18+ | 6 | Lee | Pong | 10 |
10 | Marley and me | Romance | 1 | Adam | Smith | 1 |
10 | Marley and me | Romance | 2 | Ravi | Kumar | 2 |
10 | Marley and me | Romance | 3 | Susan | Davidson | 5 |
10 | Marley and me | Romance | 4 | Jenny | Adrianna | 8 |
10 | Marley and me | Romance | 6 | Lee | Pong | 10 |
INRE KOPPLING
Den inre JOIN används för att returnera rader från båda tabellerna som uppfyller det angivna villkoret.
Antag att du vill få en lista över medlemmar som har hyrt filmer tillsammans med titlar på filmer som hyrs av dem. Du kan helt enkelt använda en INNER JOIN för det, som returnerar rader från båda tabeller som uppfyller givna villkor.
SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE movies.`id` = members.`movie_id`
Köra ovanstående skript ge
first_name | last_name | title |
---|---|---|
Adam | Smith | ASSASSIN'S CREED: EMBERS |
Ravi | Kumar | Real Steel(2012) |
Susan | Davidson | Safe (2012) |
Jenny | Adrianna | Deadline(2009) |
Lee | Pong | Marley and me |
Observera att ovanstående resultatskript också kan skrivas enligt följande för att uppnå samma resultat.
SELECT A.`first_name` , A.`last_name` , B.`title`FROM `members`AS AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`
Yttre GÅR MED
MySQL Outer JOINs returnerar alla poster som matchar från båda tabellerna.
Det kan upptäcka poster som inte har någon matchning i den sammanfogade tabellen. Det returnerar NULL- värden för poster för sammanfogad tabell om ingen matchning hittas.
Låter förvirrande? Låt oss titta på ett exempel -
VÄNSTER GÅ MED
Antag att du nu vill få titlar på alla filmer tillsammans med namn på medlemmar som har hyrt dem. Det är uppenbart att vissa filmer inte hyrs av någon. Vi kan helt enkelt använda VÄNSTER JOIN för ändamålet.
VÄNSTER JOIN returnerar alla rader från tabellen till vänster även om inga matchande rader har hittats i tabellen till höger. Om inga matchningar har hittats i tabellen till höger returneras NULL.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`
Att utföra ovanstående skript i MySQL-arbetsbänken ger. Du kan se att i det returnerade resultatet som listas nedan är det för filmer som inte hyrs att medlemsnamnsfält har NULL-värden. Det betyder att ingen matchande medlem hittade medlemstabellen för just den filmen.
title | first_name | last_name |
---|---|---|
ASSASSIN'S CREED: EMBERS | Adam | Smith |
Real Steel(2012) | Ravi | Kumar |
Safe (2012) | Susan | Davidson |
Deadline(2009) | Jenny | Adrianna |
Marley and me | Lee | Pong |
Alvin and the Chipmunks | NULL | NULL |
The Adventures of Tin Tin | NULL | NULL |
Safe House(2012) | NULL | NULL |
GIA | NULL | NULL |
The Dirty Picture | NULL | NULL |
RÄTT GÅ MED
RIGHT JOIN är uppenbarligen motsatsen till LEFT JOIN. RIGHT JOIN returnerar alla kolumner från tabellen till höger även om inga matchande rader har hittats i tabellen till vänster. Om inga matchningar har hittats i tabellen till vänster returneras NULL.
Låt oss i vårt exempel anta att du måste få namn på medlemmar och filmer som hyrs av dem. Nu har vi en ny medlem som inte har hyrt någon film ännu
SELECT A.`first_name` , A.`last_name`, B.`title`FROM `members` AS ARIGHT JOIN `movies` AS BON B.`id` = A.`movie_id`
Att utföra ovanstående skript i MySQL-arbetsbänk ger följande resultat.
first_name | last_name | title |
---|---|---|
Adam | Smith | ASSASSIN'S CREED: EMBERS |
Ravi | Kumar | Real Steel(2012) |
Susan | Davidson | Safe (2012) |
Jenny | Adrianna | Deadline(2009) |
Lee | Pong | Marley and me |
NULL | NULL | Alvin and the Chipmunks |
NULL | NULL | The Adventures of Tin Tin |
NULL | NULL | Safe House(2012) |
NULL | NULL | GIA |
NULL | NULL | The Dirty Picture |
"ON" och "USING" -satser
I ovanstående JOIN-frågeexempel har vi använt ON-satsen för att matcha posterna mellan tabellen.
USING-klausulen kan också användas för samma ändamål. Skillnaden med ANVÄNDNING är att det måste ha identiska namn för matchade kolumner i båda tabellerna.
I "film" -tabellen hittills använde vi dess primära nyckel med namnet "id". Vi hänvisade till samma i "medlemmar" -tabellen med namnet "movie_id".
Låt oss byta namn på "film" -tabeller "id" -fältet för att få namnet "film_id". Vi gör detta för att ha identiska matchade fältnamn.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Låt oss sedan använda USING med ovanstående LEFT JOIN-exempel.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )
Förutom att använda ON och ANVÄNDA med JOINs kan du använda många andra MySQL-klausuler som GROUP BY, WHERE och till och med funktioner som SUM , AVG , etc.
Varför ska vi använda kopplingar?
Nu kanske du tänker, varför vi använder JOINs när vi kan göra samma uppgiftskörande frågor. Speciellt om du har viss erfarenhet av databasprogrammering vet du att vi kan köra frågor en efter en, använd utdata från var och en i på varandra följande frågor. Naturligtvis är det möjligt. Men med hjälp av JOINs kan du göra jobbet genom att bara använda en fråga med alla sökparametrar. Å andra sidan kan MySQL uppnå bättre prestanda med JOINs eftersom det kan använda indexering. Använd bara en enda JOIN-fråga istället för att köra flera frågor minskar serverkostnaderna. Använda flera frågor istället som leder till mer dataöverföringar mellan MySQL och applikationer (programvara). Vidare kräver det också mer dataanvändningar i applikationsänden.
Det är tydligt att vi kan uppnå bättre MySQL- och applikationsprestanda genom att använda JOINs.
Sammanfattning
- JOINS tillåter oss att kombinera data från mer än en tabell till en enda resultatuppsättning.
- JOINS har bättre prestanda jämfört med underfrågor
- INNER JOINS returnerar bara rader som uppfyller givna kriterier.
- OUTER JOINS kan också returnera rader där inga matchningar har hittats. Omatchade rader returneras med nyckelordet NULL.
- De viktigaste JOIN-typerna inkluderar Inner, Left Outer, Right Yuter, Cross JOINS etc.
- Den ofta använda klausulen i JOIN-operationer är "PÅ". "USING" -satsen kräver att matchande kolumner har samma namn.
- JOINS kan också användas i andra klausuler som GROUP BY, WHERE, UNDERFRÅGOR, AGGREGATE FUNCTIONS etc.