MySQL BLITT MED Opplæring: INDRE, YTRE, VENSTRE, HØYRE, KORS
Hva er JOINS?
Sammenføyninger hjelper til med å hente data fra to eller flere databasetabeller.
Tabellene er gjensidig relatert ved bruk av primær- og fremmednøkler.
Merk: JOIN er det mest misforståtte emnet blant SQL-lesere. For enkelhets skyld og lette forståelsen, vil vi bruke en ny database for å øve eksempel. Som vist nedenfor
id | fornavn | etternavn | movie_id |
---|---|---|---|
1 | Adam | Smith | 1 |
2 | Ravi | Kumar | 2 |
3 | Susan | Davidson | 5 |
4 | Jenny | Adrianna | 8 |
5 | Lee | Pong | 10 |
id | tittel | kategori |
---|---|---|
1 | ASSASSIN'S CREED: EMBERS | animasjoner |
2 | Ekte stål (2012) | animasjoner |
3 | Alvin og gjengen | animasjoner |
4 | Eventyrene til Tin Tin | animasjoner |
5 | Trygg (2012) | Handling |
6 | Safe House (2012) | Handling |
7 | GIA | 18 + |
8 | Frist 2009 | 18 + |
9 | Det skitne bildet | 18 + |
10 | Marley og meg | Romanse |
Typer sammenføyninger
Kryss BLI MED
Cross JOIN er en enkleste form for JOINs som matcher hver rad fra en databasetabell til alle rader i en annen.
Med andre ord gir det oss kombinasjoner av hver rad i første tabell med alle poster i andre tabell.
Anta at vi ønsker å få alle medlemsrekordene mot alle filmrekordene, kan vi bruke skriptet vist nedenfor for å få de ønskede resultatene.
SELECT * FROM `movies` CROSS JOIN `members`
Utfører skriptet ovenfor i MySQL arbeidsbenk gir oss følgende resultater.
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 |
INNER JOIN
Den indre JOIN brukes til å returnere rader fra begge tabellene som tilfredsstiller den gitte betingelsen.
Anta at du ønsker å få en liste over medlemmer som har leid filmer sammen med titler på filmer leid av dem. Du kan ganske enkelt bruke en INNER JOIN for det, som returnerer rader fra begge tabellene som tilfredsstiller gitte betingelser.
SELECT members.`first_name` , members.`last_name` , movies.`title` FROM members ,movies WHERE movies.`id` = members.`movie_id`
Utførelse av skriptet ovenfor gi
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 |
Merk at resultatskriptet ovenfor også kan skrives som følger for å oppnå de samme resultatene.
SELECT A.`first_name` , A.`last_name` , B.`title` FROM `members`AS A INNER JOIN `movies` AS B ON B.`id` = A.`movie_id`
Ytre JOINs
MySQL Ytre JOINs returnerer alle poster som samsvarer fra begge tabellene.
Den kan oppdage poster som ikke samsvarer i sammenføyd tabell. Den kommer tilbake NULL verdier for poster for sammenføyd tabell hvis ingen samsvar er funnet.
Høres forvirrende ut? La oss se på et eksempel –
VENSTRE BLI MED
Anta at du nå ønsker å få titler på alle filmer sammen med navn på medlemmer som har leid dem. Det er tydelig at noen filmer ikke har blitt leid av noen. Vi kan rett og slett bruke VENSTRE BLI MED for formålet.
LEFT JOIN returnerer alle radene fra tabellen til venstre selv om ingen samsvarende rader er funnet i tabellen til høyre. Der det ikke er funnet treff i tabellen til høyre, returneres NULL.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B ON B.`movie_id` = A.`id`
Utfører skriptet ovenfor i MySQL arbeidsbenk gir.Du kan se at i det returnerte resultatet som er oppført nedenfor at for filmer som ikke er leid, har medlemsnavnfelt NULL-verdier. Det betyr at ingen matchende medlemstabell for den aktuelle 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 |
RIKTIG MEDLEM
RIGHT JOIN er åpenbart det motsatte av LEFT JOIN. RIGHT JOIN returnerer alle kolonnene fra tabellen til høyre selv om ingen samsvarende rader er funnet i tabellen til venstre. Der det ikke er funnet treff i tabellen til venstre, returneres NULL.
I vårt eksempel, la oss anta at du trenger å få navn på medlemmer og filmer leid av dem. Nå har vi et nytt medlem som ikke har leid noen film ennå
SELECT A.`first_name` , A.`last_name`, B.`title` FROM `members` AS A RIGHT JOIN `movies` AS B ON B.`id` = A.`movie_id`
Utfører skriptet ovenfor i MySQL arbeidsbenk gir følgende resultater.
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" og "USING" klausuler
I JOIN-spørringseksemplene ovenfor har vi brukt ON-klausulen for å matche postene mellom tabellene.
USING-klausulen kan også brukes til samme formål. Forskjellen med VED HJELP AV er det må ha identiske navn for samsvarende kolonner i begge tabellene.
I "filmer"-tabellen har vi så langt brukt primærnøkkelen med navnet "id". Vi refererte til det samme i "members"-tabellen med navnet "movie_id".
La oss gi nytt navn til «movies»-tabeller «id»-feltet for å få navnet «movie_id». Vi gjør dette for å ha identiske samsvarende feltnavn.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
La oss deretter bruke USING med eksempelet ovenfor LEFT JOIN.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B USING ( `movie_id` )
Bortsett fra å bruke ON og BRUK med JOINs du kan bruke mange andre MySQL klausuler som GRUPPE ETTER, HVOR og til og med funksjoner som SUM, AVGOsv
Hvorfor skal vi bruke sammenføyninger?
Nå tenker du kanskje hvorfor vi bruker JOINs når vi kan utføre den samme oppgaven som kjører spørringer. Spesielt hvis du har litt erfaring med databaseprogrammering vet du at vi kan kjøre spørringer én etter én, bruk utdata fra hver i påfølgende spørringer. Selvfølgelig er det mulig. Men ved å bruke JOINs, kan du få arbeidet gjort ved å bruke bare ett søk med alle søkeparametere. På den annen side MySQL kan oppnå bedre ytelse med JOINs da den kan bruke indeksering. Bare bruk av enkelt JOIN-spørring i stedet for å kjøre flere spørringer reduserer serveroverhead. Bruker flere spørringer i stedet som fører til flere dataoverføringer mellom MySQL og applikasjoner (programvare). Videre krever det mer datamanipulasjoner i applikasjonsenden også.
Det er klart at vi kan oppnå bedre MySQL og applikasjonsytelser ved bruk av JOINs.
Sammendrag
- JOINS lar oss kombinere data fra mer enn én tabell til et enkelt resultatsett.
- JOINS har bedre ytelse sammenlignet med undersøk
- INNER JOINS returnerer kun rader som oppfyller de gitte kriteriene.
- OUTER JOINS kan også returnere rader der ingen treff er funnet. De umatchede radene returneres med nøkkelordet NULL.
- De viktigste JOIN-typene inkluderer Inner, Left Ytre, Høyre Ytre, Cross JOINS etc.
- Den ofte brukte klausulen i JOIN-operasjoner er "ON". «USING»-klausulen krever at samsvarende kolonner har samme navn.
- JOINS kan også brukes i andre klausuler som GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS etc.