I den forrige del af denne MySQL-serie demonstrerede jeg, hvordan du kan hente data ved hjælp af MySQL-klausuler. I denne del vil vi lære om Joins-funktionen i MySQL, hvorfor de bruges og hvordan man bruger dem. Lad os komme i gang.
Hvordan kan jeg sammenkæde to tabeller i MySQL
MySQL Joins giver dig adgang til data fra flere tabeller. En MySQL Join udføres, når to eller flere tabeller er forbundet i en SQL-sætning. MySQL Joins inkluderer:MySQL Inner Join (også kendt som Simple Join), MySQL Left Outer Join (også kaldet Left Join, det returnerer matchende poster fra den venstre tabel), Right Join (dette returnerer de matchende poster fra højre tabel), og Full Join (dette returnerer matchende poster fra alle tabeller). Ved at bruge MySQL JOINs, vil du være i stand til at deltage i mere end to borde.
I MySQL er Inner Join Standard Join. På givne søgeord på det tidspunkt vælger den alle rækker fra begge tabeller, så længe der er en koordinat mellem kolonnerne i begge tabeller.
I modsætning til SQL betragter MySQL ikke Outer Join som en separat Join-type. For at få de samme resultater som Outer Join, skal du slutte dig til Left Outer Join og Right Outer Join.
Hvor mange borde kan samles i MySQL
Ifølge den officielle dokumentation for MySQL 8.0 er det maksimale antal tabeller i en JOIN-sætning 61. Bemærk dog, at JOIN-sætninger kan kræve mange serverressourcer, efterhånden som antallet af tabeller stiger. Hvis dette er tilfældet med din forespørgsel, anbefaler jeg stærkt at dele den op i flere forespørgsler for at reducere belastningen på serveren.
Lad os starte med at tilføje en ny tabel i vores database, som vil indeholde meddelelsen sammen med bruger-id'et, som har sendt denne meddelelse, vi vil navngive den meddelelser. Skemaet for vores tabel er:
OPRET TABEL `meddelelser` (
`id` int(11) IKKE NULL,
`meddelelse` varchar(255) IKKE NULL
)
Vi vil bruge den samme selectdata-funktion som vi har oprettet i vores crud.php fil. Lad os nu komme i gang med at samle disse to borde. Du kan også fylde dit bord, så du kan øve det.
Stop med at spilde tid på servere
Cloudways håndterer serveradministration for dig, så du kan fokusere på at skabe fantastiske apps og holde dine kunder glade.
Start gratisIndre deltagelse
Inner Join forbinder tabellen på en sådan måde, at den kun viser de resultater, der matcher den betingelse, der er givet, og skjuler andre. Strukturen af Inner Join-forespørgsler er:
VÆLG kolonnenavn(e)
FRA tabel 1
INNER JOIN tabel2
ON table1.column_name=table2.column_name;
Inner Join og simple join er begge ens. Du kan også skrive din forespørgsel sådan her:
VÆLG kolonnenavn(e)
FRA tabel 1
JOIN table2
ON table1.column_name=table2.column_name;
Lad os nu hente navnet og beskeden fra vores database ved hjælp af Inner join. Forespørgslen vil være sådan her
$sql = "SELECT CONCAT(myguests.firstname,' ',myguests.lastname) AS name, myguests.email, messages.message From myguests INNER JOIN messages ON myguests.id = messages.id";
CONCAT funktion bruges til at forbinde to strenge kolonner i MySQL. Åbn nu din index.php, som vi tidligere har oprettet, kopier følgende kode i den.
<table> <tr> <td> Name</td> <td> Email</td> <td> Message</td> <!-- <td> Message</td> <td> Date</td>!--> </tr> <?php include 'crud.php'; $sql = "SELECT CONCAT(myguests.firstname,' ',myguests.lastname) AS name, myguests.email, messages.message From myguests INNER JOIN messages ON myguests.id = messages.id"; $result = selectdata($sql); if($result != "zero") { while($row = $result->fetch_assoc()) { echo "<tr>"; echo "<td>" . $row['name'] . "</td>"; echo "<td>" . $row['email'] . "</td>"; if($row['message'] === null){echo "<td>" . 'null'. "</td>";} else { echo "<td>" . $row['message']. "</td>"; } ; echo "</tr>"; } } else { echo $result; } ?> </table> ?>
Når du kører denne side på din PHP-webhostingserver, vil dit resultat se sådan ud:
Som du tydeligt kan se, har det kun returneret de resultater, der matcher user_id og hvor meddelelser er ikke nul.
RET JOIN
RIGHT JOIN forbinder de to tabeller på en sådan måde, at den returnerer al værdien fra højre og matchende værdi fra venstre tabeller og også returnerer null på venstre tabel, når der ikke er nogen match fundet. Strukturen for RIGHT JOIN er:
VÆLG kolonnenavn(e)
FRA tabel 1
HØJRE JOIN tabel2
ON table1.column_name=table2.column_name;
Lad os nu hente navnet og beskeden fra vores database og lave meddelelser i vores højre tabel og mine gæster i vores venstre tabel.
$sql = "SELECT CONCAT(myguests.firstname,' ',myguests.lastname) AS name, myguests.email, messages.message From myguests RIGHT JOIN messages ON messages.id = myguests.id";
Åbn nu index.php og erstat $sql forespørgsel med ovenstående. Når du kører det, vil dit resultat være:
Hvis du kigger på beskeder tabel, vil du se nogle id'er, som ikke matcher nogen bruger-id'er, det er derfor denne forespørgsel returnerer null i navn og e-mail-kolonne, hvor den ikke finder nogen match i venstre kolonne.
LEFT JOIN
LEFT Joins forbinder de to tabeller på en sådan måde, at den returnerer al værdien fra venstre og matchende værdi fra højre tabeller og også returnerer null på højre tabel, når der ikke er nogen match fundet. Strukturen for LEFT JOIN er:
VÆLG kolonnenavn(e)
FRA tabel 1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
Lad os nu hente navnet og beskeden fra vores database og lave beskeder i vores højre bord og mine gæster i vores venstre bord.
$sql = "SELECT CONCAT(myguests.firstname,' ',myguests.lastname) AS name, myguests.email, messages.message From myguests LEFT JOIN messages ON messages.id = myguests.id";
Åbn nu index.php og forespørg i stedet for $sql med ovenstående. Når du kører det, vil dit resultat være:
Hvis du kigger på beskeder tabel, vil du finde nogle id'er, der ikke matcher nogen bruger-id'er, derfor returnerer denne forespørgsel null i kolonnen Besked, hvor den ikke finder nogen match i højre kolonne.
UNION
UNION i MySQL bruges til at samle flere kolonner fra forskellige tabeller til en enkelt kolonne. Strukturen af UNION-forespørgslen til valg af unikke værdier er:
VÆLG kolonnenavn(e) FRA tabel1
UNION
VÆLG kolonnenavn(e) FRA tabel2;
Og for at vælge gentagne værdier fra kolonner er:
VÆLG kolonnenavn(e) FRA tabel1
UNION ALLE
VÆLG kolonnenavn(e) FRA tabel2;
Lad os nu hente ID'erne fra vores borde.
$sql = "SELECT id FROM myguests UNION SELECT id FROM messages";
Åbn nu index.php og erstat $sql forespørgsel med ovenstående. Når du kører det, vil dit resultat være:
Forespørgslen har hentet os alle de unikke ID'er, som findes i begge tabeller.
Cross JOIN eller kartesisk produkt
Denne type JOIN returnerer det kartesiske produkt af rækker fra tabellerne i Join. Det vil returnere en tabel, der består af poster, der kombinerer hver række fra den første tabel med hver række i den anden tabel.
Cross JOIN-syntaks er,
SELECT column-name-list from table-name1 CROSS JOIN table-name2;
Selv JOIN
En self JOIN er en regulær joinforbindelse, men bordet er forbundet med sig selv.
SELECT column_name(s) FROM table1 T1, table1 T2 WHERE condition;
FULD YDRE JOIN
Nøgleordet FULL OUTER JOIN returnerer alle poster, når der er et match i enten venstre (tabel1) eller højre (tabel2) tabelposter.
Bemærk:FULD YDRE JOIN kan potentielt returnere meget store resultatsæt!
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
Deltag flere tabeller
I de tidligere blogs har du lært, hvordan du forbinder to tabeller ved hjælp af forskellige SQL join-forespørgsler. Men hvis du arbejder på en stor applikation, det vil sige at bygge en e-handelsbutik og oprette flere tabeller i den, såsom kunder, ordrer og produkter, kan kompleksiteten i at samle tabeller helt sikkert opstå. For at ordne dette, skal du få alle produkterne bestilt af specifikke kunder. Skemaet er det samme, så jeg erklærer det ikke her. Lad os se forespørgslen:
SELECT * FROM table1 LEFT JOIN table2 ON table2.id = table1.id LEFT JOIN table3 ON table3.id = table1.id
Vi forbinder først tabel 1 og tabel 2, som leverer en midlertidig tabel med kombinerede data fra tabel1 og tabel2, som på det tidspunkt er forbundet med tabel3. Denne ligning kan udvides til mere end 3 tabeller til N tabeller. Du skal blot sørge for, at SQL-forespørgslen skal have N-1 join-sætning til at forbinde N tabeller.
Ovenstående forespørgsel giver dig mulighed for at matche rækkerne fra tabel1 (i alle tilfælde) med rækkerne i de to andre tabeller. Brug af LEFT JOIN giver dig mulighed for at forbinde tabel2 og tabel3 med tabel1 (ikke kun tabel2 med tabel1 og tabel3 med tabel2).
Du kan også tilføje betingelser som WHERE, AND og ORDERBY
SELECT * FROM table1 LEFT JOIN table2 ON table2.id = table1.id LEFT JOIN table3 ON table3.id = table2.id WHERE month = 'numberHere' AND (table2.email IS NOT NULL OR table3.email IS NOT NULL) ORDER BY submitdate DESC
Konklusion:
I denne tutorial lærte vi om joinforbindelser, som bruges meget i relationelle databaser. Sammenføjninger bruges ikke kun til to borde, og du kan tilslutte mere end to borde ved hjælp af den samme teknik. I den otte og sidste del af denne MySQL-serie vil jeg diskutere, hvordan man bruger Regular Expressions (REGEX) til at hente og sortere data i MySQL. For det, abonner på vores blog-nyhedsbrev, og du kan også tilmelde dig vores Managed PHP Stack og begynde at teste disse tutorials på vores PHP-optimerede servere.
Ofte stillede spørgsmålSp. Hvordan forbinder jeg to borde?
Svar: Sammenkædning af to tabeller i SQL kan gøres på fire hovedmåder:Inner Join (returnerer rækker med matchende kolonner), Left Join (ALLE poster i venstre tabel og matchende poster i højre tabel), Right Join (ALLE poster i højre tabel). og matchende poster i den venstre tabel) og Union (fjerner dubletter).
Sp. Hvilken SQL-kommando kan du bruge til at forbinde to tabeller?
Svar: To tabeller kan sammenføjes ved hjælp af INNER JOIN-sætningen, der returnerer matchende poster fra begge tabeller.
Sp. Hvordan forbinder jeg to tabeller i SQL uden joinforbindelser?
Svar: Du kan bruge følgende sætning til at forbinde tabeller uden faktisk at bruge JOIN-sætningen
SELECT * FROM TableA a, TableB b