SQL夯实基础(一):inner join、outer join和cross join的区别

一、数据构建

先建表,再说话

create database Test
use Test
create table A
(
AID int identity(1,1) primary key,
name nvarchar(50),
age int
)
create table B
(
BID int identity(1,1) primary key,
name nvarchar(50),
gender  int
)

创建完之后,插入数据

insert A(name,age)values(‘张三‘,35)
insert A(name,age)values(‘李四‘,25)
insert A(name,age)values(‘XXX‘,35)
insert A(name,age)values(‘YYY‘,35)

insert B(name,gender)values(‘张三‘,1)
insert B(name,gender)values(‘李四‘,1)
insert B(name,gender)values(‘AAA‘,2)
insert B(name,gender)values(‘BBB‘,2)

二、对比测试

  缺省情况下是inner join(也就是你直接输入join),开发中使用的left join和right join属于outer join,另外outer join还包括full join.下面我通过图标让大家认识它们的区别。

  现有两张表,Table A,Table B其各有四条记录,其中有两条记录name是相同的:

1.INNER JOIN 产生的结果是AB的交集

SELECT * FROM A INNER JOIN B ON A.name = B.name

2.LEFT [OUTER] JOIN 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。

SELECT * FROM A LEFT OUTER JOIN B ON A.name = B.name

3.RIGHT [OUTER] JOIN 产生表B的完全集,而A表中匹配的则有值,没有匹配的则以null值取代。

SELECT * FROM A RIGHT OUTER JOIN B ON A.name = B.name

4.FULL [OUTER] JOIN 产生A和B的并集。对于没有匹配的记录,则会以null做为值。

SELECT * FROM A FULL OUTER JOIN B ON A.name = B.name

你可以通过is NULL将没有匹配的值找出来:

SELECT * FROM A FULL OUTER JOIN B ON A.name = B.name

WHERE A.id IS null OR B.id IS null

5. CROSS JOIN 把表A和表B的数据进行一个N*M的组合,即笛卡尔积。如本例会产生4*4=16条记录,在开发过程中我们肯定是要过滤数据,所以这种很少用。

SELECT * FROM A CROSS JOIN B

相信大家对inner join、outer join和cross join的区别一目了然了。

补充一点:按照sql标准CROSS JOIN是笛卡尔积。但对于mysql来说,CROSS JOIN 相当于 INNER JOIN。

原文地址:https://www.cnblogs.com/qixinbo/p/8313088.html

时间: 2024-08-01 21:45:52

SQL夯实基础(一):inner join、outer join和cross join的区别的相关文章

SQL夯实基础(二):连接操作中使用on与where筛选的差异

一.on筛选和where筛选 在连接查询语法中,另人迷惑首当其冲的就要属on筛选和where筛选的区别了,如果在我们编写查询的时候, 筛选条件的放置不管是在on后面还是where后面, 查出来的结果总是一样的, 既然如此,那为什么还要多此一举的让sql查询支持两种筛选器呢?  事实上, 这两种筛选器是存在差别的,只是如果不深挖不容易发现而已. sql中的连接查询分为3种, cross join,inner join,和outer join, 在 cross join和inner join中,筛选

SQL夯实基础(六):MqSql Explain

关系型数据库中,互联网相关行业使用最多的无疑是mysql,虽然我们C# Developer很多用的都是sql server ,但是学习一些mysql方面的知识也是必要的,他山之石么. 先上一个explain的实例,以下我会通过我自己的理解,逐个解释表中每列的含义.(上图仅供示例使用,实际项目不建议如此写sql). id 这个字段是用来确定查询语句执行的优先级的. 这个值会有三种情况: id值相同:这种情况意味着查询语句按照explain结果中的id自上而下执行 id值不相同:这种情况下,id值会

Sql的各种连接用法(cross join、inner join、full join)

1.名词解释: 笛卡尔乘积:笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积,又称直积,表示X x Y ,第一个对象是X的成员,而第二个对象       是Y的所有可能有序列的其中的一个成员.假设集合A={a,b},集合B={0,1, 2},则两个笛卡尔积为{(a,0),(a,1),(a,2),         (b,0),(b,1),(b,2)} 2.原址参考:http://ashui.net/archives/2013/552.html 1> 交叉连接CROSS JOIN SELECT *

SQL 快速新增权限数据表(使用cross join)

摘要:SQL 快速新增权限数据表(使用cross join) 1.因为设计系统的时候 将角色 权限 系统都做了分开处理 偏偏交集起来相当多数据 2.决定不自己打 使用cross join 先练习一下一般的语法 --use 数据库 --select a.浏览,a.修改,a.删除,b.系统名称,c.角色名称 --from 角色权限 as a --cross join 系统 as b --cross join 角色 as c --go 像这样 3.开始改写 使用cross join --先清空表单 已

翻译:Gregory Larsen,2016/02/19(第一版:2014年12月17日)高级T-SQL阶梯1级:使用CROSS JOIN介绍高级T-SQL

原文链接:http://www.sqlservercentral.com/articles/Stairway+Series/119933/ 原文作者:Gregory Larsen,2016/02/19(第一版:2014年12月17日) 系列 本文是"Stairway Series:Stairway to Advanced T-SQL"的一部分 这个阶梯将包含一系列文章,这些文章将在前面两个T-SQL阶梯,T-SQL DML和T-SQL超越基础知识的T-SQL基础上进行扩展. 这个楼梯应

高级T-SQL进阶系列 (一):使用 CROSS JOIN 介绍高级T-SQL

这是一个新进阶系列的第一篇文章,我们将浏览Transact-SQL(T-SQL)的更多高级特性.这个进阶系列将会包含一系列的文章,它们会扩展你在之前的两个TSQL进阶系列所掌握的TSQL的基础. TSQL DML 进阶 TSQL进阶:超越基础 本系列“高级Transact-SQL”将会包含如下T-SQL主题: 使用CROSS JOIN 操作符 使用APPLY操作符 理解通用表表达式(CTE's) 使用TSQL游标的记录级别处理 使用UNPIVOT实现列转行 使用排序函数对数据进行排序 使用相关函

sql的基础知识之执行顺序

总结sql的执行顺序: (8)SELECT (9)DISTINCT  (11)<Top Num> <select list> (1)FROM [left_table] (3)<join_type> JOIN <right_table> (2)ON <join_condition> (4)WHERE <where_condition> (5)GROUP BY <group_by_list> (6)WITH <CUBE 

高级T-SQL进阶系列 (一)【下篇】:使用 CROSS JOIN 介绍高级T-SQL

[译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 性能考虑产生了笛卡尔积的这个CROSS JOIN操作符具有一些性能方面的问题需要考虑.因为SQL引擎需要将一个数据集的每一行与另一个数据集的每一行进行关联,其结果集合将会非常巨大.如果我将一个具有 1,000,000行数据的表与另一张具有 1,000,000行数据的表进行CROSS JOIN,那么我的结果集将会包含 1,000,000* 1,000,000行数据,也就是100,000,000,000行数据.这是一个非常巨大结果集

MySQL的几种连接 join/inner join/cross join/逗号/left join/right join/natural join

转载请注明出处!! 之前数据表连接操作多使用逗号或者join,对几种连接的概念一直浑浑噩噩,最近研究了一波,把这些连接的区别搞明白了. 连接:A xjoin B(主表 操作 关联表) select过程:from->where->group by->having->order by->limit 在不使用on语法时,join.inner join.逗号.cross join结果相同,都是取2个表的笛卡尔积.逗号与其他操作符优先级不同,所以有可能产生语法错误,尽量减少用逗号 jo