博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL各种连接——自连接、内连接、外连接、交叉连接的使用
阅读量:6962 次
发布时间:2019-06-27

本文共 1860 字,大约阅读时间需要 6 分钟。

首先准备了两个表 (Student 和 Course),其中 Student 表中的 C_S_Id 字段为外键列,关联的是 Course 表的 C_Id 主键列。

 

内连接(inner join):满足on条件表达式,内连接是取满足条件表达式的两个表的交集(即两个表都有的数据)。

1 select * from Student s2 inner join Course c on s.C_S_Id=c.C_Id

外连接(outer join)分为:左外连接(left join / left outer join)、右外连接(right join / right outer join)和全外连接(full join / full outer join)

左外连接(left join / left outer join): 满足on条件表达式,左外连接是以左表为准,返回左表所有的数据,与右表匹配的则有值,没有匹配的则以空(null)取代。

1 select * from Student s2 left join Course c on s.C_S_Id=c.C_Id

右外连接(right join / right outer join):满足on条件表达式,右外连接是以右表为准,返回右表所有的数据,与左表匹配的则有值,没有匹配的则以空(null)取代。

1 select * from Student s2 right join Course c on s.C_S_Id=c.C_Id

全外连接(full join / full outer join):满足on条件表达式,返回两个表符合条件的所有行,a表没有匹配的则a表的列返回null,b表没有匹配的则b表的列返回null,即返回的是左连接和右连接的并集。

1 select * from Student s2 full join Course c on s.C_S_Id=c.C_Id

交叉连接(cross join):交叉连接将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积。

不加条件返回两个表行数的乘积:

1 select * from Student s2 cross join Course c

加上条件返回满足条件表达式的两个表的行:

1 select * from Student s2 cross join Course c 3 where s.C_S_Id=c.C_Id

PS:cross join后加条件只能用where,不能用on,这一点跟后面的自连接一样。

自连接自连接,连接的两个表都是同一个表,即自己连接自己。

1 -- 查询出男生身高比女生身高矮的学生信息2 select s1.S_Name,s1.S_Sex,s1.S_Height,s2.S_Name,s2.S_Sex,s2.S_Height  3 from Student s1,4 Student s2 5 where s1.S_BirthDate=s2.S_BirthDate6 and s1.S_Height

1 --查询出学生身高一样但是学号不一样的学生信息2 select * from Student s1,Student s23 where s1.S_Height=s2.S_Height4 and s1.S_StuNo<>s2.S_StuNo

由于表的数据的原因,所以自连接的示例可能不太容易理解。可以看下面这个示例,根据表名查询出表的主外键约束名,示例如下:

1 select a.Name as 表名,b.Xtype as 键类型,b.Name as 键名2 from sysobjects a,sysobjects b3 where a.ID=b.parent_obj and a.name='Student'4 and b.Xtype in('F','PK')

内连接如果没有指定连接条件的话,和笛卡尔积的交叉连接结果一样,但是不同于笛卡尔积的地方是,没有笛卡尔积那么复杂要先生成行数乘积的数据表,内连接的效率要高于笛卡尔积的交叉连接。

最后说明一下,交叉连接如果有WHERE子句的话,往往会先生成两个表行数乘积的行的数据表然后再根据WHERE条件从中选择。 

因此,如果两个表数据量太大,将会非常非常慢,不建议使用。

转载于:https://www.cnblogs.com/Brambling/p/6691760.html

你可能感兴趣的文章
QCon所见和所得:杭州QCon热门技术话题分享
查看>>
图表(Chart & Graph)你真的用对了吗?
查看>>
做好软件项目验收管理4步走
查看>>
有关dubbo线程池溢出
查看>>
springmvc框架
查看>>
安装Spket插件到Eclipse
查看>>
学习笔记(四)——目录命令、rm 等常用命令、查看文本命令、文件属性
查看>>
Vue知识点整理
查看>>
python笔试题---实践知识点
查看>>
spring boot 2.x data redis 使用也太简单了吧
查看>>
php超时时间说明
查看>>
spring cron表达式及解析过程
查看>>
MyBatis(二)-----注解方式crud
查看>>
navicat连接腾讯云MySQL
查看>>
嵌入式Linux加快物联网开发速度的方案研究
查看>>
java程序员如何拿到2万月薪
查看>>
redis常用命令总结
查看>>
ActiveMQ —— <一> 概述
查看>>
SylixOS内核打印调试方法.
查看>>
加号+和减号-
查看>>