SQL JOIN 简单介绍
转自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两张表,我们可以看到有三种情形:
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两张表中同时存在;
1
2
3
4
|
MariaDB[demo]> SELECT p.pid,p.firstname,o.oname
-> FROM tb_personp
-> INNER JOIN tb_ordero
-> ON p.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]> SELECT p.pid,p.firstname,o.oname
-> FROM tb_personp
-> LEFT JOIN tb_ordero
-> ON p.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]> SELECT p.pid,p.firstname,o.oname
-> FROM tb_personp
-> RIGHT JOIN tb_ordero
-> ON p.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]> SELECT p.pid,p.firstname,o.oname
-> FROM tb_personp
-> LEFT JOIN tb_ordero
-> ON p.pid=o.pid
-> UNION
-> SELECT p.pid,p.firstname,o.oname
-> FROM tb_personp
-> RIGHT JOIN tb_ordero
-> ON p.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
|
create database demo;
usedemo;
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);
|
SQL JOIN 简单介绍相关推荐
- SQL SERVER 简单介绍
一.四个系统数据库的介绍 1.Master数据库 Master数据库记录了Sqlserver所有的服务器级系统信息,所有的注册帐户和密码,以及所有的系统设置信息,还记录了所有用户定义数据库的存 ...
- Oracle10g SQL tune adviser简单介绍【转自ITPUB zhouwf0726】
Oracle10g SQL tune adviser Oracle10g SQL tune adviser简单介绍 本文简单介绍下SQL Tuning Adviser的配置使用方法和一些相关知识点,如 ...
- php使用mysql预处理语句防止sql注入 简单讲解及代码实现
目录 前言 sql注入简单介绍 一个例子 使用预处理语句 简介 预处理语句的查询 预处理语句获取查询结果 总结 前言 最近在做一个小项目的后台,牵扯到登录等等需要操作数据库的地方,为了安全起见,特地来 ...
- 2021年大数据ELK(十五):Elasticsearch SQL简单介绍
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch SQL简单介绍 一.SQL与Elasticsear ...
- 简单介绍下我使用了一年多还不知道的Sql server 2005 组件知识
简介 Microsoft SQL Server 2005 是用于大规模联机事务处理 (OLTP).数据仓库和电子商务应用的数据库平台:也是用于数据集成.分析和报表解决方案的商业智能平台. SQL Se ...
- sql limit 子句_SQL Join子句介绍和概述
sql limit 子句 The SQL Join clause is one of the major components of the Select statement, which is us ...
- SQL盲注攻击的简单介绍
SQL盲注攻击的简单介绍 1 简介 1.1 普通SQL注入技术概述 目前没有对SQL注入技术的标准定义,微软中国技术中心从2个方面进行了描述[1]: (1) 脚本注入式的 ...
- php 自动安装sql,JSP_实现自动安装SQLServer数据库,下面简单介绍一下如何在工程 - phpStudy...
实现自动安装SQLServer数据库 下面简单介绍一下如何在工程中添加Microsoft SQL Server 2000 Desktop Engine (MSDE)的自动安装合并模块MSM: 1. ...
- 通往SQL Server复制的阶梯:一级- SQL服务器复制介绍
链接:http://www.sqlservercentral.com/articles/Stairway+Series/72274/ 文章:Stairway to SQL Server Replica ...
最新文章
- linux内核链表以及list_entry--linux内核数据结构(一)
- Struts2异常| 页面写入s:debug/标签报错, 去掉此标签后正常显示
- 【DEMO 0074】进程创建与消亡
- 晨读打卡(2018.1)
- 使用 Boost.Lambda 库创建并存储在 Boost.Function 对象中的函子中使用 Boost.Units 的数量、单位和绝对类型
- Linux下redis安装与使用
- 突破领域边界,探索文创文保新趋势
- centos7.5部署ELk
- 掘金浏览器插件安装图文教程
- 【推导】【DFS】Codeforces Round #429 (Div. 1) B. Leha and another game about graph
- 叶面积指数(LAI)数据、NPP数据、GPP数据、植被覆盖度数据获取
- java 铁路管理信息系统_基于Java铁路售票系统的设计与实现(含录像)(SqlServer)
- oneno浏览器插件_谷歌浏览器插件Send to OneNote 让Chrome也拥有OneNote的快捷保存功能...
- 致敬!百里煤海战斗在第二战线上的人们
- 教你如何用java开发Alexa语音设备。全程详细介绍。
- 算法Training——数学规律
- 图像处理(十一)高斯差分算法(边缘检测)
- 【DP1】钢条分割详解
- EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP 寄存器详解
- Tensorflow中实现leakyRelu操作(高效)