はじめに
この記事は以前の書き方を引き続き踏襲しており、さまざまな結合の違いを誰もが理解できるように、シンプルでわかりやすい例を使用しています。
なぜ結合する必要があるのですか
なぜ結合する必要があるのでしょうか? 中国語で結合とは接続を意味し、接続とは1つのテーブルと複数のテーブルを関連付けるアソシエーションを意味します。データベース テーブルを扱うとき、複数のテーブルから情報を取得し、複数のテーブルから複数のフィールド データを組み立てて、それを呼び出し元に返す必要があることがよくあります。したがって、結合の前提として、これらのテーブル間に関連するフィールドが存在する必要があります。
結合の分類
結合は内部結合と外部結合の2種類に分かれており、外部結合には左外部結合、右外部結合、完全外部結合の3種類があります。これは、左結合と呼ばれます。
結合は内部結合と外部結合の2種類に分かれており、外部結合は左外部結合、右外部結合、完全外部結合の3種類に分けられます。また、左外部結合は左外部結合とも呼ばれます。略して左結合。
さまざまな結合の違い
さまざまな結合の違いを紹介する前に、簡単な例を見てみましょう:
シーンの説明:
インターネット時代では、誰もがオンライン ショッピング、特に淘宝網と JD.com を好みます。 . したがって、私たちが選んだシーンは、オンラインショッピングでも誰もが知っているものです。これは、ある人物とその人物がモールで購入した商品に関する物語です
上記のニーズに応えて、tb_person と tb_order という 2 つのテーブルを作成しました。ここで、tb_person はこの人物の説明であり、tb_order はその人物の購入に関するものです。商品の説明。
tb_person はその人が誰であるかを知る必要があるだけなので、同様に、tb_order も非常に単純です。誰がどの製品を購入したかがわかるため、必要なフィールドは oid、oname (製品名)、pid (購入者番号) の 3 つだけです。
tb_person:
+-----------+-------------+------+-----+---- ----------+----------------+
| フィールド | デフォルト |
--+---------------+-----+-----+-----------+---------- ------+
| いいえ | varchar(50) |はい | --------+----------------+注文:+------+----- ---- ----+------+-----+----------+----------------+| フィールド タイプ | デフォルト | +-----------+------+--- ---+--- -------+----------------+
| いいえ | varchar(11) | はい | -------------+------+-----+----------+--- ---------- ---+
次に、サンプル データを上記 2 つのテーブルに書き込みます:
tb_person のデータ:
+-----+----- ------+---- ------+
| 名 |
+-----+-----------+-- --------+
| 1 | チェン | | 3 | ------+ tb_person テーブルには、andy Chen、irri Wan、abby Sun の 3 人がいます tb_order:+--- --+------- ---+-----+| イド |+-----+----------+ ------+| 1 | 本 1 |
| 4 |
+
tb_order テーブルには 3 つのデータが記録されており、個人番号は 1 です。つまり、アンディ チェンは本と電話という 2 つのアイテムを購入しました。もう 1 つの個人番号 4 があります。ある人は製品、コンピューターを購入しました。これについて疑問があるかもしれませんが、なぜ tb_person テーブルに従業員番号 4 の人物が存在しないのでしょうか?ここでは、登録ユーザーが多いため、ユーザー テーブル戦略を採用していると仮定します。したがって、従業員番号 4 のユーザーは別の従業員テーブルに存在する可能性があります。
前の説明から、テーブル間を結合したい場合は、関連付けられたフィールドが必要であることがわかります。上記の例では、関連付けられたフィールドが pid であることがわかります。
tb_person と tb_order という 2 つのテーブルによると、次の 3 つの状況がわかります:
person テーブルの人が製品を購入した、つまり、order テーブルにユーザーの製品購入の記録があり、クエリを実行できます。このテーブルから、ユーザーが購入した製品を調べます。たとえば、Andy Chen は書籍と電話という 2 つの製品を購入しました。つまり、pid は tb_person テーブルと tb_order テーブルの両方に存在します。 irri Wan と abby Sun などの製品。この 2 人のユーザーは商品を購入しませんでした。つまり、pid は tb_person テーブルにのみ存在します。
商品を購入したユーザーは、order テーブル内にレコードを見つけることができません。たとえば、pid 4 のユーザーがコンピューターを購入しましたが、tb_person テーブルにはユーザーのレコードがありません。つまり、pid は tb_order テーブルにのみ存在します。
上記の 3 つの状況を理解します。は、結合を理解するのに非常に役立ちます。 次に、各結合の違いを詳細に分析します:
INNER JOIN
いわゆる内部結合とは、前述した状況 1 を意味します。pid は両方のテーブル tb_person に存在する必要があります。と tb_order;
MariaDB [demo]> SELECT p.pid, p.firstname, o.oname -> FROM tb_person p -> INNER JOIN tb_order o -> ON p.pid=o.pid;
+-----+----------+-- -----+
| +----------+------+
| 本 |
| --------+------+
LEFT JOIN
tb_person LEFT JOIN tb_order は、上記のケース 1 とケース 2 の結合を意味します。 LEFT JOIN の結果セットには、INNER JOIN の結果だけでなく、商品を購入しなかった tb_person 内のすべてのユーザーのセットも含まれます。
MariaDB [demo]> SELECT p.pid, p.firstname, o.oname -> FROM tb_person p -> LEFT JOIN tb_order o -> ON p.pid=o.pid;
+-----+-----------+------+
| 名前 |
+-----+-- ---------+------+
| 1 |
| 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);