SQL中的join连接
inner join on,full outer join,left join on,right jion on
1.inner join on 内部连接 两表都满足的组合
2.full outer 全连 两表相同的组合在一起,A表有,B表没有的数据(显示为null),同样B表有,A表没有的显示为(null)
3.A表 left join B表 左连,以A表为基础,A表的全部数据,B表有的组合。没有的为null
4.A表 right join B表 右连,以B表为基础,B表的全部数据,A表的有的组合。没有的为null
一.内连接:inner join on 或 join
只要两个表的公共字段有匹配值,就将这两个表中的记录组合起来。
以一个共同的字段求两个表中符合要求的交集,并将每个表符合要求的记录以共同的字段为准合并起来。其实就是取他们的交集,,内联接是用比较运算符比较要联接列的值的联接
语法
FROM table1 INNER JOIN table2 ON table1 . field1 compopr table2 . field2
INNER JOIN 操作包含以下部分:
部分 说明
table1, table2 要组合其中的记录的表的名称。
field1,field2 要联接的字段的名称。如果它们不是数字,则这些字段的数据类型必须相同,并且包含同类数据,但是,它们不必具有相同的名称。
compopr
任何关系比较运算符:“=”、“<”、“>”、“<=”、“>=”或者“<>”。
sql语句
select * from table1 join table2 on table1.id=table2.id
等价(与下列执行效果相同)
A:select a.*,b.* from table1 a,table2 b where a.id=b.id
B:select * from table1 cross join table2 where table1.id=table2.id (注:cross join后加条件只能用where,不能用on)
说明
1.可以在任何 FROM 子句中使用 INNER JOIN 操作。这是最常用的联接类型。只要两个表的公共字段上存在相匹配的值,Inner 联接就会组合这些表中的记录。
2.可以将 INNER JOIN 用于 Departments 及 Employees 表,以选择出每个部门的所有雇员。而要选择所有部分(即使某些部门中并没有被分配雇员)或者所有雇员(即使某些雇员没有分配到
任何部门),则可以通过 LEFT JOIN 或者 RIGHT JOIN 操作来创建外部联接。
3.如果试图联接包含备注或 OLE 对象数据的字段,将发生错误。
4.可以联接任何两个相似类型的数字字段。例如,可以联接自动编号和长整型字段,因为它们均是相似类型。然而,不能联接单精度型和双精度型类型字段。
下例展示了如何通过 CategoryID 字段联接 Categories 和 Products 表:
SELECT CategoryName, ProductName
FROM Categories INNER JOIN Products
ON Categories.CategoryID = Products.CategoryID;
在前面的示例中,CategoryID 是被联接字段,但是它不包含在查询输出中,因为它不包含在 SELECT 语句中。若要包含被联接字段,请在 SELECT 语句中包含该字段名,在本例中是指
Categories.CategoryID。
也可以在 JOIN 语句中链接多个 ON 子句,请使用如下语法:
SELECT fields
FROM table1 INNER JOIN table2
ON table1.field1 compopr table2.field1 AND
ON table1.field2 compopr table2.field2) OR
ON table1.field3 compopr table2.field3)];
也可以通过如下语法嵌套 JOIN 语句:
SELECT fields
FROM table1 INNER JOIN
(table2 INNER JOIN [( ]table3
[INNER JOIN [( ]tablex [INNER JOIN ...)]
ON table3.field3 compopr tablex.fieldx)]
ON table2.field2 compopr table3.field3)
ON table1.field1 compopr table2.field2;
注意:LEFT JOIN 或 RIGHT JOIN 可以嵌套在 INNER JOIN 之中,但是 INNER JOIN 不能嵌套于 LEFT JOIN 或 RIGHT JOIN 之中。
二、外连接
1.概念:包括左向外联接、右向外联接或完整外部联接
2.左连接:left join 或 left outer join
(1)左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列
均为空值(null)。
(2)sql语句
select * from table1 left join table2 on table1.id=table2.id
注释:包含table1的所有子句,根据指定条件返回table2相应的字段,不符合的以null显示
3.右连接:right join 或 right outer join
(1)右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
(2)sql语句
select * from table1 right join table2 on table1.id=table2.id
注释:包含table2的所有子句,根据指定条件返回table1相应的字段,不符合的以null显示
4.完整外部联接:full join 或 full outer join
(1)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
(2)sql语句
select * from table1 full join table2 on table1.id=table2.id
注释:返回左右连接的和(见上左、右连接)
三、交叉连接(完全)
1.概念:没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉连接产生3*3=9条记录)
2.交叉连接:cross join (不带条件where...)
3.等价(与下列执行效果相同)
A:select * from table1,table2
四.操作实例
表A记录如下:
aID aNum
1 a20050111
2 a20050112
3 a20050113
4 a20050114
5 a20050115
表B记录如下:
bID bName
1 2006032401
2 2006032402
3 2006032403
4 2006032404
8 2006032408
实验如下:
1.left join
sql语句如下:
select * from A
left join B
on A.aID = B.bID
结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
5 a20050115 NULL NULL
(所影响的行数为 5 行)
结果说明:
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
B表记录不足的地方均为NULL.
2.right join
sql语句如下:
select * from A
right join B
on A.aID = B.bID
结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
NULL NULL 8 2006032408
(所影响的行数为 5 行)
结果说明:
仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.
3.inner join
sql语句如下:
select * from A
innerjoin B
on A.aID = B.bID
结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
结果说明:
很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.
转载于:https://www.cnblogs.com/eagle1986/archive/2009/12/28/1634256.html
SQL中的join连接相关推荐
- SQL中cross join,left join,right join ,full join,inner join 的区别
http://blog.csdn.net/sgivee/article/details/5081350 SQL中cross join,left join,right join ,full join,i ...
- 02-SQL语句给表起别名SQL中的表连接
什么情况下需要给表起别名? 1.表名比较长 2.当需要在多个表中进行查询并把查询内容同时输出的时候 3.当需要进行表连接的时候(其实和2一个意思,一般情况下多个表进行连接主要目的就是为了从多个表中查询 ...
- SQL中inner join、left join、right join、outer join之间的区别
SQL中inner join.left join.right join.outer join之间的区别 举个例子你就能知道了! A表(a1,b1,c1) B表(a2,b2) a1 b1 ...
- 简述SQL中的外连接
简述SQL中的"外连接" 1.SQL中外连接分为三种:左外连接.右外连接.全外连接. 2.英文书写格式: 左外连接:LEFT OUTER JOIN(LEFT JOIN): 右外连接 ...
- SQL中inner join、outer join和cross join的区别
对于SQL中inner join.outer join和cross join的区别很多人不知道,我也是别人问起,才查找资料看了下,跟自己之前的认识差不多,如果你使用join连表,缺陷的情况下是inne ...
- SQL 中left join ,inner join,right join的区别
2019独角兽企业重金招聘Python工程师标准>>> sql中存在有左连接 插入 右连接 sql语句 left join ,inner join,right join 进行 wh ...
- mysql语句的左外链接_MySQL中的JOIN连接
一.新手 1+N 模式查询 题目: 查询价格大于 2000 元的商品及其栏目名称 1. 价格大于 2000 元的商品 select goods_id,goods_name,cat_id,shop ...
- SQL 中 left join 的底层原理(各种JOIN的复杂度探究)
01. 前言 写过或者学过 SQL 的人应该都知道 left join,知道 left join 的实现的效果,就是保留左表的全部信息,然后把右表往左表上拼接,如果拼不上就是 null.除了 left ...
- 你知道 Sql 中 left join 的底层原理吗?
总第165篇/张俊红 01.前言 写过或者学过 Sql 的人应该都知道 left join,知道 left join 的实现的效果,就是保留左表的全部信息,然后把右表往左表上拼接,如果拼不上就是 nu ...
最新文章
- Appium+python自动化(八)- 初识琵琶女Appium(千呼万唤始出来,犹抱琵琶半遮面)- 下(超详解)...
- tcp 测试工具_6款免费网络延迟测试工具
- SQL语句对于NUll的筛选
- Linux命令行–基本的bash shell命令
- mysql6.5 操作日志
- docker 批量删除容器和镜像
- SQL Server 2012安装图解
- Shell 获取函数返回结果
- POJ 3177 Redundant Paths POJ 3352 Road Construction(双连接)
- 人工智能十大算法及应用,十大人工智能算法公司
- 【文献阅读】MMQA——基于图像、文本和表格的问答(Alon Talmor等人,ICLR,2021)
- 内存取证-volatility工具的使用 (史上更全教程,更全命令)
- Laravel中pluck的使用——返回指定的字段值信息列表
- 小程序提示:downloadFile:fail 发生了 SSL 错误,无法建立与该服务器的安全连接
- Q3营收利润双降,新作将成Take-Two逆势大爆发的动力?
- 单例模式与反射的攻防之【 道高一尺,魔高一丈 】
- 【软件测试面试】面试技巧,让面试官记住的自我介绍,疯狂收割offer.....
- 乐视电商云的整体架构与技术实现
- Leetcode 1856. Maximum Subarray Min-Product [Python]
- uboot源码分析-启动第一阶段
热门文章
- 高中选的美术将来能考计算机学校吗,北京中考美术考上美术高中以后上考大学一定要考美术专业的大学?好考美术高中...
- 当世界从移动优先变为AI优先,未来企业竞争将赢在“维度”
- TRACERT命令及用法
- 基于Redis的微博的注册
- 计算机软件知识pdf,[计算机软件及应用]PDF基础知识.doc
- php编写半径为4圆的周长,在C++中编写程序输入半径计算圆的周长和面积,来学习吧...
- android content provider线程安全,Android ContentProvider的线程安全(二)
- dbscan论文_重点关注!我校论文被CCF A类人工智能国际顶级学术会议IJCAI录用
- 针织布横条疵点解决方案
- 16、Flutter Widget - PageView;