Hva er JOINS?
Joins hjelper med å hente data fra to eller flere databasetabeller. Tabellene er gjensidig relatert ved hjelp av primære og utenlandske nøkler.Merk: JOIN er det mest misforståtte emnet blant SQL-leanere. For enkelhets skyld og forståelse vil vi bruke en ny database for å øve på eksempler. Som vist under
id | fornavn | etternavn | movie_id |
---|---|---|---|
1 | Adam | Smith | 1 |
2 | Ravi | Kumar | 2 |
3 | Susan | Davidson | 5 |
4 | Jenny | Adrianna | 8 |
6 | Lee | Pong | 10 |
id | tittel | kategori |
---|---|---|
1 | MORDERENS OPPRETTELSE: EMBERS | Animasjoner |
2 | Real Steel (2012) | Animasjoner |
3 | Alvin and the Chipmunks | Animasjoner |
4 | Tinnblikkens eventyr | Animasjoner |
5 | Safe (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 av sammenføyninger
Kryss JOIN
Cross JOIN er en enkleste form for JOINs som samsvarer med hver rad fra en databasetabell til alle radene i en annen.
Med andre ord gir det oss kombinasjoner av hver rad av første tabell med alle poster i andre tabell.
Anta at vi ønsker å få alle medlemsoppføringer mot alle filmoppføringene, vi kan bruke manuset vist nedenfor for å få de ønskede resultatene.
SELECT * FROM `movies` CROSS JOIN `members`
Å utføre ovennevnte skript 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 |
INNRE MEDLEM
Den indre JOIN brukes til å returnere rader fra begge tabeller som tilfredsstiller den gitte tilstanden.
Anta at du vil 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 tabeller som tilfredsstiller med gitte betingelser.
SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE movies.`id` = members.`movie_id`
Å utføre ovenstående skript gir
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 kan også skrives som følger for å oppnå de samme resultatene.
SELECT A.`first_name` , A.`last_name` , B.`title`FROM `members`AS AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`
Ytre JOINs
MySQL Outer JOINs returnerer alle samsvarende poster fra begge tabeller.
Den kan oppdage poster som ikke samsvarer i den sammenføyde tabellen. Den returnerer NULL- verdier for poster av sammenføyet tabell hvis ingen samsvar blir funnet.
Høres forvirrende ut? La oss se på et eksempel -
VENSTRE BLI MEDLEM
Anta at du nå vil ha titler på alle filmer sammen med navn på medlemmer som har leid dem. Det er klart at noen filmer ikke har blitt leid av noen. Vi kan ganske enkelt bruke LEFT JOIN til formålet.
VENSTRE JOIN returnerer alle radene fra tabellen til venstre, selv om det ikke er funnet samsvarende rader i tabellen til høyre. Der ingen treff er funnet i tabellen til høyre, returneres NULL.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`
Å utføre det ovennevnte skriptet i MySQL-arbeidsbenken gir. Du kan se at i det returnerte resultatet som er oppført nedenfor, at for filmer som ikke leies, har medlemsnavnfelt NULL-verdier. Det betyr at ingen matchende medlemmer fant medlemstabellen 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 BLI MED
RIGHT JOIN er åpenbart motsatt av LEFT JOIN. RIGHT JOIN returnerer alle kolonnene fra tabellen til høyre, selv om det ikke er funnet noen samsvarende rader i tabellen til venstre. Der ingen treff er funnet i tabellen til venstre, returneres NULL.
La oss i vårt eksempel anta at du trenger å få navn på medlemmer og filmer leid av dem. Nå har vi fått et nytt medlem som ikke har leid noen film ennå
SELECT A.`first_name` , A.`last_name`, B.`title`FROM `members` AS ARIGHT JOIN `movies` AS BON B.`id` = A.`movie_id`
Å utføre 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 ovennevnte JOIN spørringseksempler har vi brukt ON-ledd for å matche postene mellom tabellen.
USING-klausul kan også brukes til samme formål. Forskjellen med å BRUKE er at det må ha identiske navn for samsvarende kolonner i begge tabeller.
I "film" -tabellen så langt brukte vi den primære nøkkelen med navnet "id". Vi refererte til det samme i "medlemmer" -tabellen med navnet "movie_id".
La oss gi nytt navn til "filmer" -tabeller "id" -feltet for å ha navnet "film_id". Vi gjør dette for å ha identiske matchede feltnavn.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
La oss deretter bruke BRUKE med eksemplet ovenfor LEFT JOIN.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )
Bortsett fra å bruke ON og USING med JOINs, kan du bruke mange andre MySQL-klausuler som GROUP BY, WHERE og til og med funksjoner som SUM , AVG , etc.
Hvorfor skal vi bruke koblinger?
Nå kan du tenke, hvorfor vi bruker JOINs når vi kan gjøre de samme oppgaveløpende spørsmålene. Spesielt hvis du har litt erfaring med databaseprogrammering, vet du at vi kan kjøre spørringer en etter en, bruk utdata fra hver i påfølgende spørsmål. Selvfølgelig er det mulig. Men ved å bruke JOINs kan du få jobben gjort ved å bruke bare ett søk med alle søkeparametere. På den annen side kan MySQL 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 serverkostnadene. Bruke flere spørsmål i stedet som fører til mer dataoverføring mellom MySQL og applikasjoner (programvare). Videre krever det flere datamanipulasjoner i slutten av applikasjonen også.
Det er klart at vi kan oppnå bedre MySQL- og applikasjonsytelse ved å bruke JOINs.
Sammendrag
- JOINS tillater oss å kombinere data fra mer enn en tabell til et enkelt resultatsett.
- JOINS har bedre ytelse sammenlignet med underspørringer
- INNER JOINS returnerer bare rader som oppfyller de gitte kriteriene.
- YTRE JOINS kan også returnere rader der ingen treff er funnet. De umatchede radene returneres med NULL-nøkkelordet.
- De viktigste JOIN-typene inkluderer Inner, Left Outer, Right Outer, Cross JOINS etc.
- Den ofte brukte klausulen i JOIN-operasjoner er "PÅ". "BRUKER" klausul krever at samsvarende kolonner skal ha samme navn.
- JOINS kan også brukes i andre klausuler som GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS etc.