sql >> Databáze >  >> RDS >> Mysql

Jak spojit dvě tabulky v MySQL

V předchozím díle této série MySQL jsem předvedl, jak můžete načítat data pomocí klauzulí MySQL. V tomto díle se seznámíme s funkcí Joins v MySQL, proč se používají a jak je používat. Začněme.

Jak mohu propojit dvě tabulky v MySQL

MySQL Joins vám umožní přístup k datům z více tabulek. Spojení MySQL se provádí vždy, když jsou dvě nebo více tabulek spojeny v příkazu SQL. MySQL spojení zahrnují:MySQL Inner Join (také známé jako jednoduché spojení), MySQL Left Outer Join (také nazývané Left Join, vrací odpovídající záznamy z levé tabulky), Right Join (toto vrací odpovídající záznamy z pravá tabulka) a Úplné spojení (to vrátí odpovídající záznamy ze všech tabulek). Pomocí připojení MySQL JOIN budete moci spojit více než dva stoly.

V MySQL je vnitřní spojení výchozí spojení. Pro daná klíčová slova v tomto okamžiku vybere všechny řádky z obou tabulek, pokud je mezi sloupci v obou tabulkách souřadnice.

Na rozdíl od SQL MySQL nepovažuje vnější spojení za samostatný typ spojení. Chcete-li získat stejné výsledky jako vnější spojení, musíte se připojit k levému vnějšímu spojení a pravému vnějšímu spojení.

Kolik tabulek lze v MySQL spojit

Podle oficiální dokumentace MySQL 8.0 je maximální počet tabulek v příkazu JOIN 61. Pamatujte však, že příkazy JOIN mohou vyžadovat mnoho serverových zdrojů, protože počet tabulek se zvyšuje. Pokud je to případ vašeho dotazu, důrazně doporučuji rozdělit jej do více dotazů, abyste snížili zatížení serveru.

Začněme přidáním nové tabulky do naší databáze, která bude obsahovat zprávu spolu s ID uživatele, který tuto zprávu odeslal, pojmenujeme ji zprávy. Schéma naší tabulky je:

VYTVOŘTE TABULKU „zprávy“ (

 `id` int(11) NOT NULL,

 `zpráva` varchar(255) NOT NULL

)

Budeme používat stejnou funkci selectdata který jsme vytvořili v našem crud.php soubor. Nyní začněme spojením těchto dvou stolů. Můžete také zaplnit svůj stůl, abyste si to mohli procvičit.


Přestaňte plýtvat časem na serverech

Cloudways za vás spravují správu serverů, takže se můžete soustředit na vytváření skvělých aplikací a zajištění spokojenosti vašich klientů.

Začněte zdarma

Vnitřní spojení

Vnitřní spojení spojuje tabulku takovým způsobem, že zobrazuje pouze ty výsledky, které odpovídají dané podmínce, a ostatní skrývá. Struktura dotazů Inner Join je:

VYBERTE názvy sloupců

Z tabulky 1

Tabulka INNER JOIN2

ON table1.column_name=table2.column_name;

Vnitřní spojení a jednoduché spojení jsou stejné. Svůj dotaz můžete také napsat takto:

VYBERTE názvy sloupců

Z tabulky 1

JOIN table2

ON table1.column_name=table2.column_name;

Nyní načteme jméno a zprávu z naší databáze pomocí vnitřního spojení. Dotaz bude vypadat takto

$sql = "SELECT CONCAT(myguests.firstname,' ',myguests.lastname) AS name, myguests.email, messages.message 
From myguests 
INNER JOIN messages 
ON myguests.id = messages.id";

CONCAT Funkce se používá ke spojení dvou sloupců řetězců v MySQL. Nyní otevřete svůj index.php, který jsme předtím vytvořili, zkopírujte do něj následující kód.

<table>

	<tr>

		<td> &nbsp;&nbsp;Name</td>

		<td> &nbsp;&nbsp;Email</td>

		<td> &nbsp;&nbsp;Message</td>

		<!-- <td> &nbsp;&nbsp;Message</td>

		<td> &nbsp;&nbsp;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>" . &nbsp;'null'. "</td>";} else { echo "<td>" . &nbsp;$row['message']. "</td>"; } ;

			echo "</tr>";

		}

	}

	else

		{

			echo $result;

	}

?>

</table>

?>

Když spustíte tuto stránku na vašem PHP webhostingovém serveru, váš výsledek bude vypadat takto:

Jak můžete jasně vidět, vrátil pouze ty výsledky, které odpovídají user_id a kde zprávy není null.

SPRÁVNÉ PŘIPOJENÍ

RIGHT JOIN spojí dva stoly takovým způsobem, že vrátí všechny hodnoty z pravého a odpovídající hodnoty z levého stolu a také vrátí hodnotu null na levém stole, když není nalezena žádná shoda. Struktura pro RIGHT JOIN je:

VYBERTE názvy sloupců

Z tabulky 1

RIGHT JOIN table2

ON table1.column_name=table2.column_name;

Nyní pojďme načíst Jméno a zprávu z naší databáze, která vytváří zprávy v naší pravé tabulce a moji hosté v naší levé tabulce.

$sql = "SELECT CONCAT(myguests.firstname,' ',myguests.lastname) AS name, myguests.email, messages.message 
From myguests 
RIGHT JOIN messages 
ON messages.id = myguests.id";

Nyní otevřete index.php a nahraďte $sql dotaz s výše uvedeným. Když jej spustíte, váš výsledek bude:

Pokud se podíváte na zprávy tabulky, uvidíte některá ID, která se nebudou shodovat s žádným ID uživatele, proto tento dotaz vrátí hodnotu null ve sloupci jméno a e-mail, kde nenajde žádnou shodu v levém sloupci.

VLEVO PŘIPOJIT SE

LEFT Joins spojí dva stoly takovým způsobem, že vrátí všechny hodnoty z levého a odpovídající hodnoty z pravých stolů a také vrátí hodnotu null na pravém stole, když není nalezena žádná shoda. Struktura pro LEFT JOIN je:

VYBERTE názvy sloupců

Z tabulky 1

LEFT JOIN table2

ON table1.column_name=table2.column_name;

Nyní pojďme načíst Jméno a zprávu z naší databáze, která vytváří zprávy v náš pravý stůl a moje hosté v náš levý stůl.

$sql = "SELECT CONCAT(myguests.firstname,' ',myguests.lastname) AS name, myguests.email, messages.message 
From myguests 
LEFT JOIN messages 
ON messages.id = myguests.id";

Nyní otevřete index.php a dotazujte se místo $sql s výše uvedeným. Když jej spustíte, váš výsledek bude:

Pokud se podíváte na zprávy v tabulce najdete některá ID, která se nebudou shodovat s žádným ID uživatele, a proto tento dotaz vrátí hodnotu null ve sloupci Zpráva, kde v pravém sloupci žádnou shodu nenajde.

UNION

UNION v MySQL se používá ke sjednocení více sloupců z různých tabulek do jednoho sloupce. Struktura dotazu UNION pro výběr jedinečných hodnot je:

VYBERTE názvy sloupců FROM tabulka1

UNIE

SELECT name_sloupce(s) FROM table2;

A pro výběr opakovaných hodnot ze sloupců je:

VYBERTE názvy sloupců FROM tabulka1

UNIE VŠE

SELECT name_sloupce(s) FROM table2;

Nyní pojďme získat ID z našich tabulek.

$sql = "SELECT id FROM myguests 
UNION 
SELECT id FROM messages";

Nyní otevřete index.php a nahraďte $sql dotaz s výše uvedeným. Když jej spustíte, váš výsledek bude:

Dotaz nám přinesl všechna jedinečná ID, která se nacházejí v obou tabulkách.

Cross JOIN nebo kartézský produkt

Tento typ JOIN vrací kartézský součin řádků z tabulek v Join. Vrátí tabulku, která se skládá ze záznamů, které kombinují každý řádek z první tabulky s každým řádkem druhé tabulky.

Syntaxe Cross JOIN je,

SELECT column-name-list

from table-name1

CROSS JOIN

table-name2;

Vlastní připojení

Vlastní JOIN je běžné spojení, ale stůl je spojen sám se sebou.

SELECT column_name(s)

FROM table1 T1, table1 T2

WHERE condition;

ÚPLNÉ VNĚJŠÍ PŘIPOJENÍ

Klíčové slovo FULL OUTER JOIN vrátí všechny záznamy, pokud existuje shoda v levém (tabulka1) nebo pravém (tabulka2) záznamech tabulky.

Poznámka:FULL OUTER JOIN může potenciálně vrátit velmi velké sady výsledků!

SELECT column_name(s)

FROM table1

FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;

Připojit více stolů

V předchozích blozích jste se naučili, jak spojit dvě tabulky dohromady pomocí různých SQL spojovacích dotazů. Pokud ale pracujete na velké aplikaci, tj. budujete e-shop a vytváříte v něm více tabulek, jako jsou zákazníci, objednávky a produkty, může se složitost spojování tabulek určitě objevit. Chcete-li to vyřešit, musíte získat všechny produkty objednané konkrétními zákazníky. Schéma je stejné, takže to zde neuvádím. Podívejme se na dotaz:

SELECT * FROM table1

LEFT JOIN table2

ON table2.id = table1.id

LEFT JOIN table3

ON table3.id = table1.id

Nejprve spojíme tabulku 1 a tabulku 2, které doručí dočasnou tabulku s kombinovanými daty z tabulky1 a tabulky2, která je v tomto bodě spojena s tabulkou3. Tato rovnice může být rozšířena na více než 3 tabulky až N tabulek. Jen se musíte ujistit, že SQL dotaz by měl obsahovat příkaz N-1 join v uspořádání pro spojení N tabulek.

Výše uvedený dotaz vám umožní porovnat řádky z tabulky1 (v každém případě) s řádky dalších dvou tabulek. Použití LEFT JOIN vám umožní spojit tabulku2 a tabulku3 s tabulkou1 (nejen tabulku2 s tabulkou1 a tabulku3 s tabulkou2).
Můžete také přidat podmínky jako WHERE, AND a 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

Závěr:

V tomto tutoriálu jsme se dozvěděli o spojeních, která se v relačních databázích hodně používají. Spojení se nepoužívají pouze pro dva stoly a stejnou technikou můžete spojit více než dva stoly. V osmém a posledním pokračování této série MySQL se budu zabývat tím, jak používat regulární výrazy (REGEX) pro načítání a třídění dat v MySQL. Za tímto účelem se přihlaste k odběru našeho blogového zpravodaje a můžete se také přihlásit do našeho Managed PHP Stack a začít testovat tyto návody na našich serverech optimalizovaných pro PHP.

Často kladené otázky

O. Jak spojím dva stoly?

Odpověď: Spojení dvou tabulek v SQL lze provést čtyřmi hlavními způsoby:Inner Join (vrací řádky se shodnými sloupci), Left Join (VŠECHNY záznamy v levé tabulce a odpovídající záznamy v pravé tabulce), Right Join (VŠECHNY záznamy v pravé tabulce). a odpovídající záznamy v levé tabulce) a Union (odstraní duplikáty).

O. Jaký příkaz SQL můžete použít ke spojení dvou tabulek?

Odpověď: Dvě tabulky lze spojit pomocí příkazu INNER JOIN, který vrátí odpovídající záznamy z obou tabulek.

O. Jak mohu spojit dvě tabulky v SQL bez spojení?

Odpověď: Následující příkaz můžete použít ke spojení tabulek bez použití příkazu JOIN

SELECT *

FROM TableA a, TableB b


  1. Jak replikovat databázi MySQL na jiný server

  2. Co je schéma v SQL a jak jej vytvořit?

  3. Konfigurace Puma Cluster na Heroku

  4. Způsoby přístupu k databázi Oracle v PostgreSQL