转自http://www.admin10000.com/ 

join分为两种,inner join和outer join,其中outer join分为三种,left outer join, right outer join, full outer join,另外left outer join又简称为left join即大家所熟知的左连接。

 各种join的区别

  在介绍各种join的区别之前,我们先来看一个简单的示例:

  场景描述:

  互联网时代,大家都喜欢在网上购物,尤其是淘宝和京东,所以我们选择的场景也是大家熟悉的网上购物。这是一个关于一个人和他在商城买了什么商品的一个故事;

  针对上述需求,我们建立了两张表,tb_person和tb_order,其中tb_person是关于这个人的描述,tb_order是关于他购买的商品的一个描述。

  我们的表结构很简单,tb_person只需要知道这个人是谁就可以了,所以只有三个字段id,firstname(名)和lastname(姓),同样tb_order也很简单,我们只要知道谁买了什么商品,所以只需要3个字段,分别是oid, oname(商品名称), pid(购买者编号)。

  tb_person:

1
2
3
4
5
6
7
+-----------+-------------+------+-----+---------+----------------+
|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:

1
2
3
4
5
6
7
+-------+-------------+------+-----+---------+----------------+
|Field|Type|Null|Key|Default|Extra|
+-------+-------------+------+-----+---------+----------------+
|oid|int(11)|NO|PRI|NULL|auto_increment|
|oname|varchar(50)|YES||NULL||
|pid|int(11)|YES||NULL||
+-------+-------------+------+-----+---------+----------------+

  接下来,我们向上述两张表中写入一些示例数据:

  data in tb_person:

1
2
3
4
5
6
7
+-----+-----------+----------+
|pid|firstname|lastname|
+-----+-----------+----------+
|1|andy|chen|
|2|irri|wan|
|3|abby|sun|
+-----+-----------+----------+

  tb_person表中有三位人员,分别是andy Chen, irri Wan, abby Sun;

  data in tb_order:

1
2
3
4
5
6
7
+-----+----------+------+
|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两张表,我们可以看到有三种情形:

  1. person表中的人购买了商品,也就是order表中有关于该用户的商品购买记录,我们可以从该表中查询到该用户买了哪些商品,如andy Chen购买了book和phone两种商品,即pid在tb_person和tb_order两种表中都存在;

  2. person表中的人未购买商品,如irri Wan和abby Sun两位用户并未购买任何商品,即pid只存在于tb_person表;

  3. order表中购买商品的用户在person表中找不到记录,如pid为4的用户购买了一台computer但在tb_person表中没有该用户的记录,即pid只存在于tb_order表;

  理解上述三种情形对于我们理解join有非常大的帮助,接下来我们将具体的分析每种join的区别:

  INNER JOIN

  所谓inner join的意思就是我们前面提到的情形1,pid必须在tb_person和tb_order两张表中同时存在;

1
2
3
4
MariaDB[demo]>SELECTp.pid,p.firstname,o.oname
->FROMtb_personp
->INNERJOINtb_ordero
->ONp.pid=o.pid;

1
2
3
4
5
6
+-----+-----------+-------+
|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中没有购买任何商品的用户集。

1
2
3
4
MariaDB[demo]>SELECTp.pid,p.firstname,o.oname
->FROMtb_personp
->LEFTJOINtb_ordero
->ONp.pid=o.pid;

1
2
3
4
5
6
7
8
+-----+-----------+-------+
|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表。

1
2
3
4
MariaDB[demo]>SELECTp.pid,p.firstname,o.oname
->FROMtb_personp
->RIGHTJOINtb_ordero
->ONp.pid=o.pid;

1
2
3
4
5
6
7
+------+-----------+----------+
|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的结果。

1
2
3
4
5
6
7
8
9
MariaDB[demo]>SELECTp.pid,p.firstname,o.oname
->FROMtb_personp
->LEFTJOINtb_ordero
->ONp.pid=o.pid
->UNION
->SELECTp.pid,p.firstname,o.oname
->FROMtb_personp
->RIGHTJOINtb_ordero
->ONp.pid=o.pid;

1
2
3
4
5
6
7
8
9
+------+-----------+----------+
|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文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
createdatabasedemo;
usedemo;
createtabletb_person(
pidint(11)auto_increment,
firstnamevarchar(50),
lastnamevarchar(50),
primarykey(pid)
);
createtabletb_order(
oidint(11)auto_increment,
onamevarchar(50),
pidint(11),
primarykey(oid)
);
insertintotb_person(firstname,lastname)values('andy','chen');
insertintotb_person(firstname,lastname)values('irri','wan');
insertintotb_person(firstname,lastname)values('abby','sun');
insertintotb_order(oname,pid)values('book',1);
insertintotb_order(oname,pid)values('phone',1);
insertintotb_order(oname,pid)values('computer',4);

SQL JOIN 简单介绍相关推荐

  1. SQL SERVER 简单介绍

    一.四个系统数据库的介绍   1.Master数据库   Master数据库记录了Sqlserver所有的服务器级系统信息,所有的注册帐户和密码,以及所有的系统设置信息,还记录了所有用户定义数据库的存 ...

  2. Oracle10g SQL tune adviser简单介绍【转自ITPUB zhouwf0726】

    Oracle10g SQL tune adviser Oracle10g SQL tune adviser简单介绍 本文简单介绍下SQL Tuning Adviser的配置使用方法和一些相关知识点,如 ...

  3. php使用mysql预处理语句防止sql注入 简单讲解及代码实现

    目录 前言 sql注入简单介绍 一个例子 使用预处理语句 简介 预处理语句的查询 预处理语句获取查询结果 总结 前言 最近在做一个小项目的后台,牵扯到登录等等需要操作数据库的地方,为了安全起见,特地来 ...

  4. 2021年大数据ELK(十五):Elasticsearch SQL简单介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch SQL简单介绍 一.SQL与Elasticsear ...

  5. 简单介绍下我使用了一年多还不知道的Sql server 2005 组件知识

    简介 Microsoft SQL Server 2005 是用于大规模联机事务处理 (OLTP).数据仓库和电子商务应用的数据库平台:也是用于数据集成.分析和报表解决方案的商业智能平台. SQL Se ...

  6. sql limit 子句_SQL Join子句介绍和概述

    sql limit 子句 The SQL Join clause is one of the major components of the Select statement, which is us ...

  7. SQL盲注攻击的简单介绍

    SQL盲注攻击的简单介绍 1 简介      1.1 普通SQL注入技术概述      目前没有对SQL注入技术的标准定义,微软中国技术中心从2个方面进行了描述[1]:      (1) 脚本注入式的 ...

  8. php 自动安装sql,JSP_实现自动安装SQLServer数据库,下面简单介绍一下如何在工程 - phpStudy...

    实现自动安装SQLServer数据库 下面简单介绍一下如何在工程中添加Microsoft SQL Server  2000 Desktop Engine (MSDE)的自动安装合并模块MSM: 1. ...

  9. 通往SQL Server复制的阶梯:一级- SQL服务器复制介绍

    链接:http://www.sqlservercentral.com/articles/Stairway+Series/72274/ 文章:Stairway to SQL Server Replica ...

最新文章

  1. linux内核链表以及list_entry--linux内核数据结构(一)
  2. Struts2异常| 页面写入s:debug/标签报错, 去掉此标签后正常显示
  3. 【DEMO 0074】进程创建与消亡
  4. 晨读打卡(2018.1)
  5. 使用 Boost.Lambda 库创建并存储在 Boost.Function 对象中的函子中使用 Boost.Units 的数量、单位和绝对类型
  6. Linux下redis安装与使用
  7. 突破领域边界,探索文创文保新趋势
  8. centos7.5部署ELk
  9. 掘金浏览器插件安装图文教程
  10. 【推导】【DFS】Codeforces Round #429 (Div. 1) B. Leha and another game about graph
  11. 叶面积指数(LAI)数据、NPP数据、GPP数据、植被覆盖度数据获取
  12. java 铁路管理信息系统_基于Java铁路售票系统的设计与实现(含录像)(SqlServer)
  13. oneno浏览器插件_谷歌浏览器插件Send to OneNote 让Chrome也拥有OneNote的快捷保存功能...
  14. 致敬!百里煤海战斗在第二战线上的人们
  15. 教你如何用java开发Alexa语音设备。全程详细介绍。
  16. 算法Training——数学规律
  17. 图像处理(十一)高斯差分算法(边缘检测)
  18. 【DP1】钢条分割详解
  19. EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP 寄存器详解
  20. Tensorflow中实现leakyRelu操作(高效)

热门文章

  1. Haystack-全文搜索框架
  2. Mybatis中Mapper.xml文件sql中动态获取----#{}和${}区别
  3. JQuery的click、bind、delegate、off、unbind
  4. ArchLinux借助Winetricks-zh安裝WineQQ8.1
  5. NUAGENETWORKS第二代SDN方案推企业云服务
  6. 【转】php需要掌握的东西
  7. Ruby游戏开发-BMXP介绍
  8. Java SQL注入学习笔记
  9. MySQL---主从复制
  10. LINUX系统一一CentOS6.5之固化Ip