2019独角兽企业重金招聘Python工程师标准>>>

sql内外连接(重点)

在oracle的SQL语句常用的连接有内连接(inner join),外连接(outer join)等,内连接又包括等值连接,非等值连接,自连接;而外连接又分为左连接和右连接全连接。其中默认的是内连接的等值连接。

为了方便我们创建两张最简易的表A、B,具体的表结构参看下面,来分析内连接与外连接的区别

          

图1                                                                      图2

两个表要做连接,必须要有连接字段,而在表A和表B中连接字段是Aid和Bnamid,下图说明了连接之间关系图3

图3

(1) 内连接:利用内连接(等值)就可获取蓝色的公共部分C,即图3中的数据集C,结果集为如下:

图4

其实select * from A join B on A.Aid=B.Bnamid;等价于select * from A,B where A.Aid=B.Bnamid;
       注:非等值连接主要的话是针对一个范围来查询数据,自连接主要就是把1张表看成两张表来用                        
   (2)外连接:分为左外连接(left join)与右外连接(right join)
      
      左外连接即公共显示的蓝色部分C1+显示黄色的记录集A1,显示语句等价于

select * from A,B where A.Aid=B.Bnamid(+);

注:sql中(+),表示外连接 可以省略 left/right join 。。and。。等关键字,其中(+)在等号左边表示右外连接,在等号右边表示左外连接。

图  5

右外连接即公共显示的蓝色部分C1+显示绿色的B1,显示语句等价于

select * from A,B where A.Aid(+)=B.Bnamid;

图6

表A和表B情况是相对的,以上实验都是A在左边的情况,其实A left join B与B right join A的情况的结果集是一样的。

另外,全连接 full   join表示三个部分全部包含到结果集,彼此没有与之匹配的数据行填充null。

连接条件子语句where和on的区别

测试表环境:

drop table if exists join_a;
create table  join_a(
f1 int not null comment '字段1',
f2 int not null comment '字段2'
)engine=innodb default charset=utf8 comment '连接测试A表';insert into join_a(f1,f2) value(1,1);
insert into join_a(f1,f2) value(1,1);
insert into join_a(f1,f2) value(1,2);
insert into join_a(f1,f2) value(1,2);
insert into join_a(f1,f2) value(2,3);
insert into join_a(f1,f2) value(2,3);
insert into join_a(f1,f2) value(2,4);
insert into join_a(f1,f2) value(2,4);drop table if exists join_b;
create table  join_b(
f1 int not null comment '字段1',
f2 int not null comment '字段2'
)engine=innodb default charset=utf8 comment '连接测试B表';insert into join_b(f1,f2) value(1,5);
insert into join_b(f1,f2) value(1,5);
insert into join_b(f1,f2) value(1,6);
insert into join_b(f1,f2) value(1,6);
insert into join_b(f1,f2) value(2,7);
insert into join_b(f1,f2) value(2,7);
insert into join_b(f1,f2) value(2,8);
insert into join_b(f1,f2) value(2,8);

左外连接

左外连接(无条件):

select t1.* ,t2.* from join_a t1 left join join_b t2 on t1.f1=t2.f1;

运行结果:

+----+----+----+----+
| f1 | f2 | f1 | f2 |
+----+----+----+----+
|  1 |  1 |  1 |  5 |
|  1 |  1 |  1 |  5 |
|  1 |  2 |  1 |  5 |
|  1 |  2 |  1 |  5 |
|  1 |  1 |  1 |  5 |
|  1 |  1 |  1 |  5 |
|  1 |  2 |  1 |  5 |
|  1 |  2 |  1 |  5 |
|  1 |  1 |  1 |  6 |
|  1 |  1 |  1 |  6 |
|  1 |  2 |  1 |  6 |
|  1 |  2 |  1 |  6 |
|  1 |  1 |  1 |  6 |
|  1 |  1 |  1 |  6 |
|  1 |  2 |  1 |  6 |
|  1 |  2 |  1 |  6 |
|  2 |  3 |  2 |  7 |
|  2 |  3 |  2 |  7 |
|  2 |  4 |  2 |  7 |
|  2 |  4 |  2 |  7 |
|  2 |  3 |  2 |  7 |
|  2 |  3 |  2 |  7 |
|  2 |  4 |  2 |  7 |
|  2 |  4 |  2 |  7 |
|  2 |  3 |  2 |  8 |
|  2 |  3 |  2 |  8 |
|  2 |  4 |  2 |  8 |
|  2 |  4 |  2 |  8 |
|  2 |  3 |  2 |  8 |
|  2 |  3 |  2 |  8 |
|  2 |  4 |  2 |  8 |
|  2 |  4 |  2 |  8 |
+----+----+----+----+
32 rows in set

说明:取t1表的第一行,扫瞄t2表,按条件做对比,如果满足条件,就加入返回结果表.
            然后取t1表的第二行,扫瞄t2表,按条件做对比,如果满足条件,就加入返回结果表.

。。。。。。。。。。。。。
           重复以上过程,直到t1表扫描结束。

左表条件(on+and条件):

select t1.* ,t2.* from join_a t1 left join join_b t2 on t1.f1=t2.f1 and t1.f2=1;

说明:给左表加条件的时候,左表满足条件的,按上面的过程返回值,左表不满足条件的,直接输出,右表的列补null。

以下三种语句查询结果一样:

--左外连接(where条件),不完整的数据不显示
select t1.* ,t2.* from join_a t1 left join join_b t2 on t1.f1=t2.f1 where t1.f2=1;
--内连接(on+and条件),不完整的数据不显示
select t1.* ,t2.* from join_a t1 inner join join_b t2 on t1.f1=t2.f1 and t1.f2=1;
--使用where条件来连接表(and条件),不完整的数据不显示
select t1.* ,t2.* from join_a t1 , join_b t2 where t1.f1=t2.f1 and t1.f2=1;--其中后两种效率更高

说明:如果有where子语句,先执行where后连接查询,执行where的时候已经把不满足条件的直接去除,所以最后的结果没有填充null的行。效果同inner join。

当外连接使用where条件语句的时候,可以把left join(或者right join) 改为inner jin, 因为inner join比left join 要快!

右表条件(on+and条件):

select t1.* ,t2.* from join_a t1 left join join_b t2 on t1.f1=t2.f1 and t2.f2=5;

以下三种语句查询结果一样:

--on+where,不完整的数据不显示
select t1.* ,t2.* from join_a t1 left join join_b t2 on t1.f1=t2.f1 where t2.f2=5;
--inner+on+and,不完整的数据不显示
select t1.* ,t2.* from join_a t1 inner join join_b t2 on t1.f1=t2.f1 and t2.f2=5;
--where+and,不完整的数据不显示
select t1.* ,t2.* from join_a t1 , join_b t2 where t1.f1=t2.f1 and t2.f2=5;--其中后两种效率更高

转载于:https://my.oschina.net/iyinghui/blog/778866

SQL学习精粹之内外连接以及where和on条件的区别相关推荐

  1. spark代码连接hive_spark SQL学习(spark连接hive)

    spark 读取hive中的数据 scala> import org.apache.spark.sql.hive.HiveContext import org.apache.spark.sql. ...

  2. mybatis学习(四)连接池、事务、动态SQL、多表查询

    目录 连接池 事务 动态SQL 1.if标签 2.where标签 3.foreach标签 4.sql标签 多表操作 (一)一对多.多对一 .一对一 1.查询所有账户,在账户信息后显示所属的用户的用户名 ...

  3. SQL学习(2):大厂真题实例-视频平均播放进度

    SQL学习(2):大厂真题实例-视频平均播放进度 题目来源:<牛客题霸:SQL大厂真题>: 01 某音短视频 SQL2 平均播放进度大于60%的视频类别 文章目录 SQL学习(2):大厂真 ...

  4. aws rds监控慢sql_如何将AWS RDS SQL Server与AWS Glue连接

    aws rds监控慢sql This article gives you an overview of configuring AWS RDS SQL Server with AWS Glue ser ...

  5. python与SQL学习比较

    目录:python与SQL比较学习 数据字段包含:自增id,订单时间ts,用户id,订单id,订单金额 1.limit 查看全部数据或前n行数据 1.查看全部数据或前n行数据 查看全部数据,panda ...

  6. 【LittleXi】sql学习笔记

    [LittleXi]sql学习笔记 数据类型 INT 整数型 VARCHAR 字符串 DECIMAL(a,b) 浮点型(a代表位数,b代表小数位位数) BLOB 图片.影片.档案 DATA 日期 XX ...

  7. Sql 学习查询多种条件(记录自己常用一些方法,本人学习用)

    Sql 学习查询多种条件(记录自己常用一些方法,本人学习用) 根据 PROCDEFID 对表 BO_ACT_MPDL_PROCESS 最后就行查重 查出多余重复的数据 1.in和exists 方式二: ...

  8. 数据库作业:SQL练习4 - SELECT(连接查询、嵌套查询)

    学习了连接查询和嵌套查询. 今天启动SQL server,显示无法连接到服务器,重新打开软件还是一样,后来通过搜索重新启动了SQL server的服务,就可以了. 此电脑右键-管理-展开服务与应用程序 ...

  9. Kettle学习之记录集连接

    Kettle学习之记录集 在kettle的表输入中,作数据的抽取往往会用到JOIN条件,即LEFT JOIN ,RIGHT JOIN等.在kettle中,记录集组件可以当作JOIN条件使用,特别是当两 ...

最新文章

  1. 实现一个简单的投票功能
  2. Linux 编程经典书籍推荐
  3. vs2015添加vc助手
  4. SpringBoot配置Druid
  5. Pytorch使用Vision Transformer做肺癌和结肠癌组织病理学图像分类
  6. 聊聊阿里面试的三个层次!
  7. Silverlight:CreateFromXAMLDownloader
  8. 阿里云免费试用之体验——阿里云serverECS试用心得
  9. canvas 压缩图片上传
  10. IOS 中description 和 debugDescription的区别
  11. python 删除文件_lt;python笔记gt;点击工具架,删除filechache的文件
  12. CCF CSP 20190301解答
  13. 【Linux 中国】尝试 Nitrux 系统的六大理由
  14. 使用清华源镜像安装pytorch
  15. uoj 30 tourists
  16. Vue + qiankun框架 样式混乱问题的解决办法
  17. 设计并编写代码自动格斗类游戏
  18. 软件安装时出现Command line option syntax error?
  19. Java pcm文件与wav文件互转
  20. Redis-SETNX命令简介

热门文章

  1. C#启动前为所有的Form设置统一的Icon
  2. Java基础篇:finalize( )方法的使用
  3. 学习Oracle分析函数(Analytic Functions)
  4. 第三堂:Java程序流程控制
  5. thinkphp解决分页后序列号自增的问题
  6. WordPress配置
  7. ROM制作,专属个性的亮光点
  8. 【翻转整数考虑溢出】LeetCode 7. Reverse Integer
  9. 随机访问介质控制协议
  10. NVIDIA驱动本来好好的,过几天就无法连接NVIDIA,出现NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA