Hvad er JOINS?
Joins hjælper med at hente data fra to eller flere databasetabeller. Tabellerne er indbyrdes relaterede ved hjælp af primære og udenlandske nøgler.Bemærk: JOIN er det mest misforståede emne blandt SQL-leanere. Af hensyn til enkelhed og let forståelse bruger vi en ny database til at øve prøve. Som vist nedenfor
id | fornavn | efternavn | film_id |
---|---|---|---|
1 | Adam | Smith | 1 |
2 | Ravi | Kumar | 2 |
3 | Susan | Davidson | 5 |
4 | Jenny | Adrianna | 8 |
6 | Lee | Pong | 10 |
id | titel | kategori |
---|---|---|
1 | MORDDREKKERENS OPRETTELSE: EMBERS | Animationer |
2 | Real Steel (2012) | Animationer |
3 | Alvin og jordegern | Animationer |
4 | Tin Tin's eventyr | Animationer |
5 | Safe (2012) | Handling |
6 | Safe House (2012) | Handling |
7 | GIA | 18+ |
8 | Deadline 2009 | 18+ |
9 | Det beskidte billede | 18+ |
10 | Marley og mig | Romantik |
Typer af sammenføjninger
Kryds JOIN
Cross JOIN er en enkleste form for JOINs, der matcher hver række fra en databasetabel til alle rækker i en anden.
Med andre ord giver det os kombinationer af hver række i første tabel med alle poster i anden tabel.
Antag, at vi ønsker at få alle medlemsoptegnelser mod alle filmoptegnelser, vi kan bruge scriptet vist nedenfor for at få de ønskede resultater.
SELECT * FROM `movies` CROSS JOIN `members`
Udførelse af ovenstående script i MySQL workbench giver os 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 |
INDRE MEDLEM
Den indre JOIN bruges til at returnere rækker fra begge tabeller, der opfylder den givne betingelse.
Antag, at du ønsker at få en liste over medlemmer, der har lejet film sammen med titler på film, der er lejet af dem. Du kan simpelthen bruge en INNER JOIN til det, som returnerer rækker fra begge tabeller, der opfylder de givne betingelser.
SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE movies.`id` = members.`movie_id`
Udførelse af ovenstående script give
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 |
Bemærk ovenstående resultatscript kan også skrives som følger for at opnå de samme resultater.
SELECT A.`first_name` , A.`last_name` , B.`title`FROM `members`AS AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`
Ydre JOINs
MySQL Outer JOINs returnerer alle poster, der matcher fra begge tabeller.
Det kan registrere poster, der ikke matcher i den sammenføjede tabel. Det returnerer NULL- værdier for poster i den sammenføjede tabel, hvis der ikke findes noget match.
Lyder forvirrende? Lad os se på et eksempel -
VENSTRE MEDLEM
Antag nu, at du vil hente titler på alle film sammen med navne på medlemmer, der har lejet dem. Det er klart, at nogle film ikke har været lejet af nogen. Vi kan simpelthen bruge LEFT JOIN til formålet.
VENSTRE JOIN returnerer alle rækkerne fra tabellen til venstre, selvom der ikke er fundet nogen matchende rækker i tabellen til højre. Hvor der ikke er fundet matches i tabellen til højre, returneres NULL.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`
Udførelse af ovenstående script i MySQL-arbejdsbænken giver. Du kan se, at i det returnerede resultat, der er angivet nedenfor, at for film, der ikke lejes, har medlemsnavnfelter NULL-værdier. Det betyder, at intet matchende medlem fandt medlemsbordet til den pågældende film.
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 |
Højre tilslutning
RIGHT JOIN er naturligvis det modsatte af LEFT JOIN. RIGHT JOIN returnerer alle kolonnerne fra tabellen til højre, selvom der ikke er fundet nogen matchende rækker i tabellen til venstre. Hvor der ikke er fundet matches i tabellen til venstre, returneres NULL.
Lad os i vores eksempel antage, at du har brug for at få navne på medlemmer og film lejet af dem. Nu har vi et nyt medlem, der endnu ikke har lejet nogen film
SELECT A.`first_name` , A.`last_name`, B.`title`FROM `members` AS ARIGHT JOIN `movies` AS BON B.`id` = A.`movie_id`
Udførelse af ovenstående script i MySQL workbench giver 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 ovenstående JOIN-forespørgselseksempler har vi brugt ON-klausul til at matche poster mellem tabellen.
USING-klausul kan også bruges til det samme formål. Forskellen med USING er, at det skal have identiske navne til matchede kolonner i begge tabeller.
I "film" -tabellen hidtil brugte vi dens primære nøgle med navnet "id". Vi henviste til det samme i "medlemmer" -tabellen med navnet "movie_id".
Lad os omdøbe "film" -tabeller "id" -feltet for at have navnet "film_id". Vi gør dette for at have identiske matchede feltnavne.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Lad os derefter bruge USING med eksemplet ovenfor til venstre.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )
Bortset fra at bruge ON og USING med JOINs kan du bruge mange andre MySQL-klausuler som GROUP BY, WHERE og endda funktioner som SUM , AVG osv.
Hvorfor skal vi bruge sammenføjninger?
Nu tænker du måske, hvorfor vi bruger JOINs, når vi kan udføre de samme forespørgsler, der kører opgaver. Især hvis du har nogle erfaringer med databaseprogrammering, ved du, at vi kan køre forespørgsler en efter en, brug output af hver i på hinanden følgende forespørgsler. Det er selvfølgelig muligt. Men ved hjælp af JOINs kan du få arbejdet udført ved kun at bruge en forespørgsel med eventuelle søgeparametre. På den anden side kan MySQL opnå bedre ydelse med JOINs, da det kan bruge indeksering. Brug af enkelt JOIN-forespørgsel i stedet for at køre flere forespørgsler reducerer serveroverhead. Brug af flere forespørgsler i stedet, der fører til flere dataoverførsler mellem MySQL og applikationer (software). Yderligere kræver det også flere databehandlinger i slutningen af applikationen.
Det er klart, at vi kan opnå bedre MySQL- og applikationspræstationer ved hjælp af JOINs.
Resumé
- JOINS giver os mulighed for at kombinere data fra mere end en tabel i et enkelt resultatsæt.
- JOINS har bedre ydeevne sammenlignet med underforespørgsler
- INNER JOINS returnerer kun rækker, der opfylder de givne kriterier.
- OUTER JOINS kan også returnere rækker, hvor der ikke er fundet nogen matches. De umatchede rækker returneres med NULL-nøgleordet.
- De vigtigste JOIN-typer inkluderer Inner, Left Outer, Right Outer, Cross JOINS osv.
- Den hyppigt anvendte klausul i JOIN-operationer er "ON". "USING" -klausul kræver, at matchende kolonner skal have samme navn.
- JOINS kan også bruges i andre klausuler som GROUP BY, WHERE, SUB-FORESPØRGSEL, AGGREGATE FUNKTIONER osv.