MySQL JOINS Vejledning: INNER, YDRE, VENSTRE, HØJRE, Kors

Anonim

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
Note: Null is returned for non-matching rows on right

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
Note: Null is returned for non-matching rows on left

"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.