SQL中的内连接,左外连接,右外连接,全连接,交叉连接

实验用表

为进行实验,作者在SQL Server数据库下共建立了t1、t2两张表,两张表除主键id外均有个两字段stu_id和teacher_id。

t1表

idstu_idteacher_id
1S0001T01
2S0002T01
3S0003T02
4S0004T02
5S0005T03
6S0002T04

t2表

idstu_idteacher_id
1S0002T05
2S0003T03
3S0006T02
4S0007T04
5S0005T03

连接

把两个或多个表根据某一个或多个共同的字段连接起来。连接查询即使用连接后的表进行查询操作。

内连接

以两张表为例,内连接会把两张表连接字段中共有的值连接起来,抛弃只在一个表中出现的值

SQL脚本

SELECT t1.stu_id,t2.stu_id FROM t1
INNER JOIN t2
ON t1.stu_id=t2.stu_id;

/*只使用JOIN关键字,默认为内连接*/
SELECT t1.stu_id,t2.stu_id FROM t1
JOIN t2
ON t1.stu_id=t2.stu_id;

在SQL Server中结果

stu_idteacher_id
S0002S0002
S0003S0003
S0005S0005
S0002S0002

在Mysql中结果

stu_idteacher_id
S0002S0002
S0003S0003
S0005S0005

左外连接

以两张表为例,左外连接会把两张表连接字段中共有的值连接起来,同时会把在左表中出现而右表中未出现的值显示出来,在右表中未出现的值以Null表示。

SQL脚本

SELECT t1.stu_id,t2.stu_id FROM t1
LEFT JOIN t2
ON t1.stu_id=t2.stu_id;

在SQL Server中结果

stu_idteacher_id
S0001Null
S0002S0002
S0003S0003
S0004Null
S0005S0005
S0002S0002

在Mysql中结果

stu_idteacher_id
S0001Null
S0002S0002
S0003S0003
S0004Null
S0005S0005

右外连接

以两张表为例,右外连接会把两张表连接字段中共有的值连接起来,同时会把在右表中出现而左表中未出现的值显示出来,在左表中未出现的值以Null表示。

SQL脚本

SELECT t1.stu_id,t2.stu_id FROM t1
RIGHT JOIN t2
ON t1.stu_id=t2.stu_id;

在SQL Server中结果

stu_idteacher_id
S0002S0002
S0002S0002
S0003S0003
NullS0006
NullS0007
S0005S0005

在Mysql中结果

stu_idteacher_id
S0002S0002
S0003S0003
NullS0006
NullS0007
S0005S0005

全连接

以两张表为例,全连接不仅把两张表连接字段中共有的值连接起来,同时会把在只在左表或只在右表中出现而另一个表中未出现的值显示出来,未出现的值以Null表示。全连接在Mysql中不受支持。

SQL脚本

SELECT t1.stu_id,t2.stu_id FROM t1
FULL JOIN t2
ON t1.stu_id=t2.stu_id;

在SQL Server中结果

stu_idteacher_id
S0001Null
S0002S0002
S0003S0003
S0004Null
S0005S0005
S0002S0002
NullS0006
NullS0007

交叉连接

以两张表为例,交叉连接不需指明连接条件,它把表1中的每一行同表2的全部行连接,如果表1有m行记录,表2有n行记录,则交叉连接会产生m*n行记录

SQL脚本

/*使用CROSS JOIN*/
SELECT t1.stu_id,t2.stu_id FROM t1
CROSS JOIN t2;
/*不使用,查询结果同上*/
SELECT t1.stu_id,t2.stu_id FROM t1,t2;

在SQL Server中结果

stu_idteacher_id
S0001S0002
S0002S0002
S0003S0002
S0004S0002
S0005S0002
S0002S0002
S0001S0003
S0002S0003
S0003S0003
S0004S0003
S0005S0003
S0002S0003
S0001S0006
S0002S0006
S0003S0006
S0004S0006
S0005S0006
S0002S0006
S0001S0007
S0002S0007
S0003S0007
S0004S0007
S0005S0007
S0002S0007
S0001S0005
S0002S0005
S0003S0005
S0004S0005
S0005S0005
S0002S0005

在Mysql中结果

stu_idteacher_id
S0001S0002
S0002S0002
S0003S0002
S0004S0002
S0005S0002
S0001S0003
S0002S0003
S0003S0003
S0004S0003
S0005S0003
S0001S0006
S0002S0006
S0003S0006
S0004S0006
S0005S0006
S0001S0007
S0002S0007
S0003S0007
S0004S0007
S0005S0007
S0001S0005
S0002S0005
S0003S0005
S0004S0005
S0005S0005

注:根据实验结果可知:在任何连接类型下,Mysql都会自动把结果中出现的重复记录合并为一条记录。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值