一般情况下,SQL语句的执行顺序如下所示:

(1)from(2)on(3)join(4)where(5)group by(6)having(7)select(8)distinct(9)union(10)order by

从SQL语句执行顺序的这个角度,我们可以很好的理解left join on and的用法。

以SQL Server为例,先创建两个测试表ta和tb:

--创建测试表ta
create table ta(
ida int);--向测试表ta中插入测试数据
insert into ta
values
(1),
(2),
(3),
(4);--创建测试表tb
create table tb(
idb int,
state nvarchar(10)
);--向测试表tb中插入测试数据
insert into tb
values
(1,'001'),
(2,'001'),
(3,'002'),
(4,'003');

比较on后有无and的查询结果:

--on后无and
select * from
ta left join tb
on ta.ida=tb.idb

--on后有and
select * from
ta left join tb
on ta.ida=tb.idb
and tb.state='001'

因为tb表中没有idb等于3且state为'001'的行,和idb等于4且state为'001'的行,所以ta表中ida等于3的行和ida等于4的行会匹配到两行NULL值。

下面,我们再创建一个测试表tc:

--创建测试表tc
create table tc(
idc int,
state nvarchar(10)
)--向测试表tc中插入测试数据
insert into tc
values
(1,'001'),
(1,'002'),
(1,'003'),
(2,'002'),
(3,'001'),
(3,'002');

再次比较on后有无and的查询结果:

--on后无and
select * from
ta left join tc
on ta.ida=tc.idc

--on后有and
select * from
ta left join tc
on ta.ida=tc.idc
and tc.state='001'

如果ta表和tc表是一对多的关系,即ta表中的一行可能对应着tc表的多行,此时left join on后的and可以对tc表中满足on条件匹配的行做进一步的筛选。但由于是左连接,所以当on条件和and条件不能同时满足时,ta表中的行会匹配到列值全为NULL的行,如上述查询结果中,ta表ida等于2的行。

如果我们不想让ta表中的行匹配到NULL值行,可以使用where子句,或者将left join换成inner join:

使用where子句:where子句是对ta表和tc表left join后的结果做进一步的筛选

select * from
ta left join tc
on ta.ida=tc.idc
where tc.state='001'

使用inner join:inner join on 后的and是对tc表中满足on条件的行做进一步的筛选,然后ta表再与筛选结果进行inner join

select * from
ta inner join tc
on ta.ida=tc.idc
and tc.state='001'

关于SQL Server中left join on and 用法的介绍相关推荐

  1. 游标sql server_了解游标并将其替换为SQL Server中的JOIN

    游标sql server Relational database management systems including SQL Server are very good at processing ...

  2. SQL Server 中 with tmp 临时表的用法

    SQL Server 中 with tmp 临时表的用法 ----------with临时表用法,有时候采用临时表比采用in的效率更高,避免了全表扫描. 实例中实现了查询普通题.大题.子题目的sql ...

  3. 在SQL Server中使用JOIN更新表?

    我想更新在其他表上进行联接的表中的列,例如: UPDATE table1 a INNER JOIN table2 b ON a.commonfield = b.[common field] SET a ...

  4. SQL Server中的锁类型及用法(转载)

    一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新  A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏读  ...

  5. SQL Server中LIKE和PATINDEX的用法

    在SQL Server中,能使用通配符的只有2个:LIKE.PATINDEX. 不过LIKE支持2种通配符转义,无限制最全面:而PATINDEX只支持最简单的通配符转义([]转义),限制较多. LIK ...

  6. MS SQL SERVER 中merge join合并连接介绍(转)

    1概述 Merge join 合并连接.两个集合进行merge join,需要有一个等值的条件,然后需要两个已排序好的集合. 2 one-to-many与many-to-many 2.1 One-to ...

  7. Sql Server中 master.dbo.spt_values 的用法

    master.dbo.spt_values是一个数据库常量表,表里都是一些枚举数据. 我们可以先查询一下看表里都有什么☞ select * from master.dbo.spt_values 查询得 ...

  8. SQL Server中Rowcount与@@Rowcount的用法 和set nocount on 也会更新@@Rowcount

    rowcount的用法: rowcount的作用就是用来限定后面的sql在返回指定的行数之后便停止处理,比如下面的示例, set rowcount 10 select * from 表A 这样的查询只 ...

  9. sql server 中 SET ROWCOUNT 的具体用法

    SET ROWCOUNT 使 Microsoft® SQL Server™ 在返回指定的行数之后停止处理查询. 语法 SET ROWCOUNT{ number | @number_var } 参数 n ...

  10. SQL Server中osql/sqlcmd的基本用法

    [转自] http://www.cnblogs.com/wontonJ/archive/2011/06/18/2084400.html 这段时间在做项目的时候,遇到一个问题,客户的程序要架设在自己的服 ...

最新文章

  1. 为什么我启动哪一个tomcat都是启动同一个tomcat(tomcat7)
  2. 面试重点:设计模式(二)——创建模式
  3. [CentOS Python系列] 六.阿里云搭建Django网站详解
  4. 前端学习(1452):表格案例--效果演示
  5. 苏州为什么只能做二线中游?
  6. gdalwarp:变形工具
  7. Unity3d发布web版无法连接数据库
  8. ernie和Bert的参数理解
  9. 吴恩达-coursera-机器学习-week8
  10. Twitter数据非API采集方法
  11. php的敏感词过滤类库,敏感词过滤的php类库
  12. 视频帧数,普清,高清,超清,分辨率
  13. C语言移动营业厅程序设计,C语言程序设计 陈锐主编,清华大学出版社)例题代码 前7章.doc...
  14. 网络工程师学习Linux的亲身历程
  15. 并联机器人开题报告怎么写_华东交通大学机械工程专硕培养方案怎么样?
  16. 三相同步电机怎么接线图_三相异步电动机接线图
  17. 「Corn #12」梦回高中
  18. 数据挖掘相关岗位分析及规划
  19. python 挂起_Python Killing挂起函数
  20. UE4 error C7525: 内联变量至少需要 “/std:c++17“

热门文章

  1. passenger安装nginx
  2. 【Watir Webdriver】自动化上传照片到百度相册
  3. 四、Spyder 下使用 Scrapy 开发爬虫之腾讯视频抓取
  4. 24券的“天才”创始人如何打坏一手好牌(转载)
  5. Reflector、ReflectorFactory的前世
  6. Linux驱动——mmc bus浅析(五)
  7. Ubuntu16.04下cuda9.0+cudnn7.0安装指南
  8. letsencrypt证书-管理工具certbot
  9. VBS word/excel 转 PDF
  10. 各种光纤接口类型介绍