一、连接类型简介

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

1、自关联(join或inner join)

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

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

4、全关联(full join)

二、各种关联的使用

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

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

1、自关联

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

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

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

其二的sql语句写法如下,

  1. 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写法演示笛卡儿积的出现,

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

结果如下,

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

2、左外关联/右外关联

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

左外关联,

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

运行结果如下,

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

右关联

  1. select s.s_id,s_name,c.c_name,c.s_id as c_s_id from student s right join course c
  2. 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. Loj#572. 「LibreOJ Round #11」Misaka Network 与求和

    题目 有生之年我竟然能\(A\) 这个题求的是这个 \[\sum_{i=1}^n\sum_{j=1}^nf(gcd(i,j))^k\] \(f(i)\)定义为\(i\)的次大质因子,其中\(f(p)= ...

  2. php 处理微信账单

    最近要做支付对账,即检查第三方支付与数据库中账单是否一一对应,涉及到微信对账单的处理,微信账单接口返回为一个字符串类似如下结果: 交易时间,公众账号ID,商户号,子商户号,设备号,微信订单号,商户订单 ...

  3. Linux学习总结(三)之 putty,xshell远程连接及密钥认证篇

     一:putty 下载 1:认准两个地方 a. Download putty b. chiark greenend 2:下载32位的zip包,这是一个工具包合集,不单是一个终端工具 二:putty设置 ...

  4. MacType 文字之美 – 让 Windows 字体更漂亮

    苹果的Mac系统总能让人眼前一亮,除了其精美的软件界面设计外,最重要是其文字显示效果(渲染方式)比 Windows 更加清晰锐利,阅读起来更加舒服.于是就有高手开发了一款叫 GDI++ 的字体渲染引擎 ...

  5. 记录一下xcode9 添加文件夹的顺序

    右击->Add Files to YourProject->弹出文件对话框,点击Options->选择:Copy Items if needed和Create Groups 要选择O ...

  6. java中io创建文件和读取文件

    简单了解IO流:https://www.cnblogs.com/weibanggang/p/10034325.html package com.wbg.iodemo1128; import java. ...

  7. tensorflow节点布放(device assignment of node)算法:simpler_placer

    tensorflow v0.9中目前在用的devcie assignment算法是simple placer算法,相比于白皮书中cost model算法实现简单.simpler placer算法优先选 ...

  8. oracle database 9i/10g/11g 编程艺术 源代码下载

    背景 在找这本书的源码,搜到提供的都是需要C币下载的.比较固执(其实是穷). 在这本书的前言中提到源代码可以在 www.appress.com 上下载. 下面是该书在该网站上的链接: https:// ...

  9. iOS读取info.plist中的值

    在app运行的时候,需要读取info.plist中的信息,用以下代码可获取整个info.plist的信息 [[NSBundle mainBundle] infoDictionary] 以下为根据 ke ...

  10. 分享一个在js中判断数据是undefined,NaN,null,的技巧

    教大家如何在js中判断一个值是否是undefined,null,NaN,以及如何单独判断 平常开发过程中大家可能遇到一种问题,就是取页面某个值的时候获取不到这个var就是undefined了,如果是数 ...