一、连接类型简介

在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. mxnet导入图像数据

    图像的标签在一个json文件中. %matplotlib inline import json import gluonbook as gb import mxnet as mx from mxnet ...

  2. thinkPHP输出sql语句(3.2和5.0通用)

    //5.0$qwe = db::table('think_user')->where('id',1)->fetchsql()->column('name'); dump($qwe); ...

  3. C#中Form的Paint事件响应方法与重载虚方法OnPaint()的区别

    Form_Paint()方法是Paint事件的响应方法,OnPaint是可重载的虚方法,OnPaint方法是调用Paint事件的,用哪一个,效果是一样,就看那一个方便了内部是这样实现的: protec ...

  4. ssm分页

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

  5. HDU 1016 Prime Ring Problem(素数环问题)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1016 Prime Ring Problem Time Limit: 4000/2000 MS (Jav ...

  6. 如何设置ASP.NET页面的运行超时时间 (转载)

    全局超时时间 服务器上如果有多个网站,希望统一设置一下超时时间,则需要设置 Machine.config 文件中的 ExecutionTimeout 属性值.Machine.config 文件位于 % ...

  7. 轻量ORM-SqlRepoEx (十一)扩展

    以下为 SqlRepoEx.MsSql.ServiceCollection 代码 public static IServiceCollection AddSqlRepo(this IServiceCo ...

  8. iOS:CALayer(17-12-06更)

    目录 1.CALayer(父类) 2.CAShapeLayer(形状/画布) 3.CAEmitterLayer(粒子发射层) 4.CAGradientLayer(渐变层) 5.CATransformL ...

  9. UIPanGestureRecognizer 拖动TableView改变其高度

    需求:项目中要求tableView的高度随着手拖动的位置而改变如下图: 关键代码如下: - (void)viewDidLoad{ panGestureRecognizer = [[UIPanGestu ...

  10. 数据库函数(Left、Right)

    MySQL 字符串截取函数:left(), right(), substring(), substring_index().还有 mid(), substr().其中,mid(), substr()  ...