Vorwort
Dieser Artikel bleibt dem bisherigen Schreibstil treu und verwendet einfache und leicht verständliche Beispiele, um jedem die Unterschiede zwischen verschiedenen Verknüpfungen verständlich zu machen.
Warum müssen wir beitreten?
Warum müssen wir beitreten? Beim Umgang mit Datenbanktabellen müssen wir häufig Informationen aus mehreren Tabellen abrufen, mehrere Felddaten aus mehreren Tabellen zusammenstellen und diese dann an den Aufrufer zurückgeben. Daher besteht die Voraussetzung für die Verknüpfung darin, dass zwischen diesen Tabellen verwandte Felder vorhanden sein müssen.
Klassifizierung von Joins
Joins werden in zwei Typen unterteilt: Inner Join und Outer Join. Der Outer Join ist in drei Typen unterteilt: Left Outer Join, Right Outer Join. Der vollständige Outer-Join und der Left-Outer-Join werden auch als Left-Join bezeichnet, bei dem es sich um den bekannten Left-Join handelt.
Der Join ist in zwei Typen unterteilt: Inner Join und Outer Join. Der Outer Join ist in drei Typen unterteilt: Left Outer Join, Right Outer Join, Full Outer Join und Left Der äußere Join wird auch als linker Join bezeichnet, der bekannte linke Join.
Die Unterschiede zwischen verschiedenen Joins
Bevor wir die Unterschiede zwischen verschiedenen Joins vorstellen, werfen wir einen Blick auf ein einfaches Beispiel:
Szenariobeschreibung:
In Im Internet-Zeitalter kauft jeder gerne online ein, insbesondere Taobao und JD.com, daher ist die von uns gewählte Szene auch jedem bekannt. Dies ist eine Geschichte über eine Person und welche Produkte sie im Einkaufszentrum gekauft hat.
Als Reaktion auf die oben genannten Anforderungen haben wir zwei Tabellen erstellt, tb_person und tb_order, wobei tb_person eine Beschreibung der Person und tb_order A ist Beschreibung des Artikels, den er gekauft hat.
Unsere Tabellenstruktur ist sehr einfach. tb_person muss nur wissen, wer diese Person ist, daher gibt es nur drei Felder: id, firstname (Vorname) und lastname (Nachname). Ebenso ist tb_order sehr einfach Nur benötigt Um zu wissen, wer welches Produkt gekauft hat, sind nur drei Felder erforderlich, nämlich oid, oname (Produktname) und pid (Käufernummer).
tb_person:
+-----------+-------------+------+-- ---+------+---+
| Feld |
+----------+-------------+------+-----+---- - ----+----------------+
|. pid(11) | |. varchar(50) |. ------------+------+-----+---------+--------- ----- --+
tb_order:
+-------+-------------+----- -+--- -------+----+
| Feld | 🎜>
+-------+-------------+------+-----+---- ----- +----------------+|. NULL |. varchar(50) |. pid( 11) JA |. NULL |.
+------------+-------+----- +--- ------+----------------+
Als nächstes schreiben wir einige Beispieldaten in die beiden oben genannten Tabellen:
Daten in tb_person:
+----------+----------+
|. pid | Nachname |
+----------+----------+
| |
|. irri |
+----------- -+---------+
Es gibt drei Personen in der tb_person-Tabelle, nämlich Andy Chen, Irri Wan, Abby Sun;
Daten in tb_order:
+-----+---------+------+
| oid |
+- ----+---------+------+
| 1 |
|. 3 |. 4 |
+-----+------+
Da In der Tabelle tb_order sind 3 Daten erfasst. Die Personennummer ist 1, d. h. Andy Chen hat zwei Produkte gekauft, nämlich ein Buch und ein Telefon. Es gibt auch eine Person mit der Personennummer 4, die ein Produkt gekauft hat. Sie haben vielleicht Fragen dazu, warum gibt es in der Tabelle tb_person keine Person mit der Personalnummer 4? Hier gehen wir davon aus, dass wir aufgrund der vielen registrierten Benutzer die Benutzertabellenstrategie übernommen haben, sodass sich der Benutzer mit der Personalnummer 4 möglicherweise in einer anderen Personaltabelle befindet.
Aus der vorherigen Beschreibung wissen wir, dass es verknüpfte Felder geben muss, wenn Sie Tabellen verknüpfen möchten. Im obigen Beispiel sehen wir, dass das verknüpfte Feld pid ist.
Basierend auf den beiden Tabellen tb_person und tb_order können wir drei Situationen erkennen:
Die Person in der Personentabelle hat das Produkt gekauft, d. h. die Bestelltabelle enthält den Kaufdatensatz des Benutzers Produkt, können wir aus dieser Tabelle abfragen, welche Produkte der Benutzer gekauft hat, zum Beispiel hat Andy Chen zwei Produkte gekauft, Buch und Telefon, das heißt, die PID ist sowohl in der Tabelle tb_person als auch in der Tabelle tb_order vorhanden Beispielsweise haben zwei Benutzer, Irri Wan und Abby Sun, keine Waren gekauft, d Beispiel: Ein Benutzer mit einer PID von 4 hat einen Computer gekauft, aber es gibt keinen Datensatz des Benutzers in der Tabelle tb_person, das heißt, die PID ist nur in der Tabelle tb_order vorhanden Für uns ist es sehr wichtig, den Join zu verstehen. Als nächstes analysieren wir den Unterschied zwischen den einzelnen Joins im Detail:
INNER JOIN
Der sogenannte Inner Join bedeutet die Situation 1, die wir zuvor erwähnt haben , die PID muss zwischen tb_person und tb_order liegen. Existiert in beiden Tabellen
+-----+-----------+-------+ |. pid |. oname |+-----+-------+|. 1 |+---------+---- ---+LEFT JOIN tb_person LEFT JOIN tb_order bedeutet die Vereinigung von Fall 1 und Fall 2 oben. Die Ergebnismenge von LEFT JOIN enthält nicht nur die Ergebnisse von INNER JOIN, sondern auch die Menge aller Benutzer in tb_person, die keine Waren gekauft haben.MariaDB [demo]> SELECT p.pid, p.firstname, o.oname -> FROM tb_person p -> INNER JOIN tb_order o -> ON p.pid=o.pid;+-----+----------+-------+|. vorname |+-----+----------+------+| andy |
| 1 | andy | phone |
| 2 | irri | NULL |
| 3 | abby | NULL |
+-----+-----------+-------+
RIGHT JOIN
tb_person RIGHT JOIN tb_order的意思是上述情形1和情形3的并集。RIGHT JOIN的结果集不仅包含INNER JOIN的结果,而且还包含所有tb_order中所有已经购买商品的用户但该用户记录不存在于tb_person表。
MariaDB [demo]> SELECT p.pid, p.firstname, o.oname -> FROM tb_person p -> RIGHT JOIN tb_order o -> ON p.pid=o.pid;
+------+-----------+----------+
| pid | firstname | oname |
+------+-----------+----------+
| 1 | andy | book |
| 1 | andy | phone |
| NULL | NULL | computer |
+------+-----------+----------+
FULL JOIN
故名思议,FULL JOIN就是上述情形1,2,3的并集了,但是mysql数据库不支持full join查询,所以我们只能LEFT JOIN union RIGHT JOIN,才能得到FULL JOIN的结果。
MariaDB [demo]> SELECT p.pid, p.firstname, o.oname -> FROM tb_person p -> LEFT JOIN tb_order o -> ON p.pid=o.pid -> UNION -> SELECT p.pid, p.firstname, o.oname -> FROM tb_person p -> RIGHT JOIN tb_order o -> ON p.pid=o.pid;
+------+-----------+----------+
| pid | firstname | oname |
+------+-----------+----------+
| 1 | andy | book |
| 1 | andy | phone |
| 2 | irri | NULL |
| 3 | abby | NULL |
| NULL | NULL | computer |
+------+-----------+----------+
注:我们上述的sql语句全部基于mysql数据库执行。
总结
本文主要描述了sql join的分类以及各种join的区别,通过简单的示例,让大家更清晰的去了解他们。至于什么时候使用join要视具体的情况而定,根据不同的需求采用不同的策略。
非常感谢大家的热心回复,可能有些问题的探讨超出了本文的范畴,但是非常乐意大家提出问题,然后大家一起去探索去发现。
引用
NULL
附件
demo.sql文件
create database demo; use demo; create table tb_person ( pid int(11) auto_increment, firstname varchar(50), lastname varchar(50), primary key(pid) ); create table tb_order ( oid int(11) auto_increment, oname varchar(50), pid int(11), primary key(oid) ); insert into tb_person(firstname, lastname) values('andy','chen'); insert into tb_person(firstname, lastname) values('irri','wan'); insert into tb_person(firstname, lastname) values('abby','sun'); insert into tb_order(oname, pid) values('book', 1); insert into tb_order(oname, pid) values('phone', 1); insert into tb_order(oname, pid) values('computer', 4);