SQL JSONの簡単な紹介

伊谢尔伦
リリース: 2016-11-24 11:26:23
オリジナル
1509 人が閲覧しました

はじめに

この記事は以前の書き方を引き続き踏襲しており、さまざまな結合の違いを誰もが理解できるように、シンプルでわかりやすい例を使用しています。

なぜ結合する必要があるのですか

なぜ結合する必要があるのでしょうか? 中国語で結合とは接続を意味し、接続とは1つのテーブルと複数のテーブルを関連付けるアソシエーションを意味します。データベース テーブルを扱うとき、複数のテーブルから情報を取得し、複数のテーブルから複数のフィールド データを組み立てて、それを呼び出し元に返す必要があることがよくあります。したがって、結合の前提として、これらのテーブル間に関連するフィールドが存在する必要があります。

結合の分類

結合は内部結合と外部結合の2種類に分かれており、外部結合には左外部結合、右外部結合、完全外部結合の3種類があります。これは、左結合と呼ばれます。

SQL JSONの簡単な紹介

結合は内部結合と外部結合の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);
ログイン後にコピー


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート