前言
本文仍是秉持以前一向的写做风格,以简单易懂的示例帮助你们了解各类join的区别。mysql
为何须要join
为何须要join?join中文意思为链接,链接意味着关联即将一个表和多个表之间关联起来。在处理数据库表的时候,咱们常常会发现,须要从多个表中获取信息,将多个表的多个字段数据组装起来再返回给调用者。因此join的前提是这些表之间必须有关联字段。sql
join的分类
join分为两种,inner join和outer join,其中outer join分为三种,left outer join, right outer join, full outer join,另外left outer join又简称为left join即你们所熟知的左链接。数据库
各类join的区别
在介绍各类join的区别以前,咱们先来看一个简单的示例:spa
场景描述:
互联网时代,你们都喜欢在网上购物,尤为是淘宝和京东,因此咱们选择的场景也是你们熟悉的网上购物。这是一个关于一我的和他在商城买了什么商品的一个故事;blog
针对上述需求,咱们创建了两张表,tb_person和tb_order,其中tb_person是关于这我的的描述,tb_order是关于他购买的商品的一个描述。rem
咱们的表结构很简单,tb_person只须要知道这我的是谁就能够了,因此只有三个字段id,firstname(名)和lastname(姓),一样tb_order也很简单,咱们只要知道谁买了什么商品,因此只须要3个字段,分别是oid, oname(商品名称), pid(购买者编号)。get
tb_person:it
+-----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+----------------+ | pid | int(11) | NO | PRI | NULL | auto_increment | | firstname | varchar(50) | YES | | NULL | | | lastname | varchar(50) | YES | | NULL | | +-----------+-------------+------+-----+---------+----------------+
tb_order:io
+-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | oid | int(11) | NO | PRI | NULL | auto_increment | | oname | varchar(50) | YES | | NULL | | | pid | int(11) | YES | | NULL | | +-------+-------------+------+-----+---------+----------------+
接下来,咱们向上述两张表中写入一些示例数据:table
data in tb_person:
+-----+-----------+----------+ | pid | firstname | lastname | +-----+-----------+----------+ | 1 | andy | chen | | 2 | irri | wan | | 3 | abby | sun | +-----+-----------+----------+
tb_person表中有三位人员,分别是andy Chen, irri Wan, abby Sun;
data in tb_order:
+-----+----------+------+ | oid | oname | pid | +-----+----------+------+ | 1 | book | 1 | | 2 | phone | 1 | | 3 | computer | 4 | +-----+----------+------+
tb_order表中记录了3条数据,人员编号为1也就是andy Chen买了两件商品分别是book和phone,另外还有一我的员编号为4的人买了一件商品computer。关于这个你们可能会产生疑问,为何tb_person表中没有人员编号为4的人呢?这里咱们姑且认为因为注册用户较多,咱们采用了用户分表策略,因此人员编号为4的用户可能在另一张人员表中。
从以前的描述咱们知道,表与表之间若是要join则必需要有关联的字段,上述示例咱们看到这个关联的字段就是pid。
根据tb_person和tb_order两张表,咱们能够看到有三种情形:
-
person表中的人购买了商品,也就是order表中有关于该用户的商品购买记录,咱们能够从该表中查询到该用户买了哪些商品,如andy Chen购买了book和phone两种商品,即pid在tb_person和tb_order两种表中都存在;
-
person表中的人未购买商品,如irri Wan和abby Sun两位用户并未购买任何商品,即pid只存在于tb_person表;
-
order表中购买商品的用户在person表中找不到记录,如pid为4的用户购买了一台computer但在tb_person表中没有该用户的记录,即pid只存在于tb_order表;
理解上述三种情形对于咱们理解join有很是大的帮助,接下来咱们将具体的分析每种join的区别:
INNER JOIN
所谓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;
+-----+-----------+-------+ | pid | firstname | oname | +-----+-----------+-------+ | 1 | andy | book | | 1 | andy | phone | +-----+-----------+-------+
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;
+-----+-----------+-------+ | pid | firstname | oname | +-----+-----------+-------+ | 1 | andy | book | | 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);