一、连接类型简介

在sql中单表查询的几率相对来说比较少,随着数据库的日益复杂,多表关联的情况越来越多,在多表关联的情况下存在多种关联的类型,

1、自关联(join或inner join)

2、左外关联(left join或left outer join)

3、右外关联(right join或right outer join)

4、全关联(full join)

二、各种关联的使用

为了更形象的说明这几种连接类型的使用场景及用法,下面以学生表(student)和学生选课表(course)表来演示,其表结构及数据如下图,

上面是两张表的结构及数据。

1、自关联

有时需要得到完整的数据,我们需要关联两个或两个以上的表,这时候便用到了自关联,其中自关联可以有下面两种写法,其一,

select s.s_id,s_name,c.c_name from student s,course c where s.s_id=c.s_id

运行上面的语句得到的结果如下,

其二的sql语句写法如下,

select s.s_id,s_name,c.c_name from student s join course c on s.s_id=c.s_id;

运行上面的语句得到的结果如下,

从上面的结果,可以看到两种写法的结果是一样的,同时也可以得出这样一个结论:自关联过滤出的数据必须满足在左表和右表都符合条件,这里的条件只的s.s_id=c.s_id,也就是说s_id必须同时存在于两个表中才会出现在结果中。

那么针对上面的两种写法哪种更好,这里认为哪种最好,适合的就是最好的。

对于自关联来说,有个重要的问题需要注意那就是笛卡尔积,自关联如果忘记写关联条件就会出现笛卡尔积的情况 ,关于笛卡尔积的情况,可以自查资料,这里以第二种sql写法演示笛卡儿积的出现,

select s.s_id,s_name,c.c_name from student s   join course c ;

结果如下,

写法即未加过滤条件(未加on或where条件),这样出来的结果为两个表中的数据行数的乘积,即4X5=20行,这就是笛卡儿积。

2、左外关联/右外关联

左外关联和右外关联其实可以看作同一种写法,在使用上可以相互转化。左外关联即以左表为基本表,会展示所有的左表中的数据,如果在右表中没有匹配的数据便为null,右外关联刚好相反,

左外关联,

select s.s_id,s_name,c.c_name from student s left  join course c
on s.s_id=c.s_id;

运行结果如下,

可以看到结果数据集只有4行即为左表中的数据,但可以看到c_name列为null,这是因为在右表中没有匹配的s_id为1004的记录,所以此列为null。

右关联

select s.s_id,s_name,c.c_name,c.s_id as c_s_id from student s right  join course c
on s.s_id=c.s_id;

运行的结果如下,

可以看出结果集为5行数据,即为右表中的数据,以右表为基本表。结果中的为null的数据列是因为在左表中没有匹配的记录,所以为null。

3、全关联

全关联是只要其中某个表存在匹配的记录,便会返回行。

这里是mysql的环境,暂无法给出实例。

有不当之处请指正,感谢!

由于这里的环境是mysql,mysql不支持full join的方式,这里暂不给出实例。

sql中的几种连接类型的更多相关文章

  1. SQL中的四种连接方式

    转自:http://www.cnblogs.com/afirefly/archive/2010/10/08/1845906.html 联接条件可在FROM或WHERE子句中指定,建议在FROM子句中指 ...

  2. SQL中的5种聚集函数

    作为一个刚毕业进入这行的菜鸟,婶婶的觉的那种大神.大牛到底是怎样炼成的啊,我这小菜鸟感觉这TMD要学的东西这多啊,然后就给自己定了许多许多要学习的东西,可是有人又不停地给你灌输:东西不在多而要精通!我 ...

  3. .net连接sql server的几种连接字符串的写法

    .net连接sql server的几种连接字符串的写法 1, 混合验证模式登录 server=电脑名 或 电脑IP;database=数据库名;uid=数据库登录名;password=数据库登录密码 ...

  4. Java中的两种异常类型及其区别?

    Java中的两种异常类型是什么?他们有什么区别? Throwable包含了错误(Error)和异常(Excetion两类) Exception又包含了运行时异常(RuntimeException, 又 ...

  5. Sort merge join、Nested loops、Hash join(三种连接类型)

    目前为止,典型的连接类型有3种: Sort merge join(SMJ排序-合并连接):首先生产driving table需要的数据,然后对这些数据按照连接操作关联列进行排序:然后生产probed ...

  6. SQL中字符串截取、连接、替换等函数的用法

    一.SQL中SUBSTRING函数的用法1.功能:返回字符.二进制.文本或图像表达式的一部分2.语法:SUBSTRING ( expression, start, length )3.QL 中的 su ...

  7. SQL 中的日期和时间类型

    在我们SQL中一般支持三种数据类型. date:日历日期,包括年(四位),月和日. time: 一天中的时间,包括小时,分和秒.可以用变量time(p)来表示秒的小数点后的数字位数(默认是0). 通过 ...

  8. SQL语句的四种连接

    SQL的四种连接查询 内连接 inner join 或者 join 外连接 左连接   left join 或者 left outer join 右连接  right join 或者 right ou ...

  9. 【SQL】SQL中笛卡尔积、内连接、外连接的数据演示

    SQL的查询语句中,常使用到内连接.外连接,以及连接的基础--笛卡尔积运算. 在简单的SQL中,也许我们还分辨清楚数据如何连接,一旦查询复杂了,脑子也犯浆糊了,迷迷糊糊的. 本文,简单以数据形式记录连 ...

随机推荐

  1. Pollard_rho 因数分解

    Int64以内Rabin-Miller强伪素数测试和Pollard 因数分解的算法实现 选取随机数\(a\) 随机数\(b\),检查\(gcd(a - b, n)\)是否大于1,若大于1则\(a - ...

  2. 关于mysql 出现 1264 Out of range value for column 错误的解决办法

    今天给客服恢复mysql数据的时候.本来测试好的数据.但是到了客户那里却死活不干活了.老报错! INSERT INTO ka_tan4 set num='716641385999', username ...

  3. 1、ClassLoader.getResourceAsStream() 与Class.getResourceAsStream()的区别

    1.ClassLoader.getResourceAsStream() 与Class.getResourceAsStream()的区别 例如你写了一个MyTest类在包com.test.mycode ...

  4. ESlint 语法检测配置说明

    部分vue-cli脚手架创建的默认eslint规则: 代码末尾不能加分号 ; 代码中不能存在多行空行 tab键不能使用,必须换成两个空格 代码中不能存在声明了但未使用的变量 关闭eslint 这里只说 ...

  5. webpack-cli解决办法

    错误信息:Error Cannot find module 'webpack-cli 出现这个错误的原因是因为只全局安装了webpack,没有安装对应的webpack-cli.再打包时是需要webpa ...

  6. jQuery中append()、prepend()与after()、before()的区别

    转载 未曾见海  https://www.cnblogs.com/afei-qwerty/p/6682963.html 在jQuery中,添加元素有append(),prepend() 和 after ...

  7. mybatis框架的核心配置Mapper.xml

    映射管理器resultMap:映射管理器,是Mybatis中最强大的工具,使用其可以进行实体类之间的关系,并管理结果和实体类间的映射关系 需要配置的属性:<resultMap id=" ...

  8. ssm分页

    pom.xml配置文件中增加相关的插件. <dependency> <groupId>com.github.pagehelper</groupId> <art ...

  9. PAT——1001. 害死人不偿命的(3n+1)猜想

    卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到n=1.卡拉兹在1950年的世界数 ...

  10. PAT——1055. 集体照 (比较comparable和comparator的区别)

    拍集体照时队形很重要,这里对给定的N个人K排的队形设计排队规则如下: 每排人数为N/K(向下取整),多出来的人全部站在最后一排: 后排所有人的个子都不比前排任何人矮: 每排中最高者站中间(中间位置为m ...