SQL中on和where的区别

这篇博客参考了网上的,具体哪一篇是原稿,不知道,特此声明。

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

下面以使用left jion时,on和where条件的区别如下:

1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

假设有两张表:

表1:tab2


id


size


1


10


2


20


3


30

表2:tab2


size


name


10


AAA


20


BBB


20


CCC

两条SQL:

1、select * form tab1 left join tab2 on (tab1.size =
tab2.size) where tab2.name=’AAA’

2、select * form tab1 left join tab2 on (tab1.size =
tab2.size and tab2.name=’AAA’)


第一条SQL的过程:


1、中间表

on条件:

tab1.size = tab2.size


tab1.id


tab1.size


tab2.size


tab2.name


1


10


10


AAA


2


20


20


BBB


2


20


20


CCC


3


30


(null)


(null)


|


|


2、再对中间表过滤

where 条件(此时不为真的行会被过滤掉):

tab2.name=’AAA’


tab1.id


tab1.size


tab2.size


tab2.name


1


10


10


AAA


第二条SQL的过程:


1、中间表

on条件:

tab1.size = tab2.size and tab2.name=’AAA’

(条件不为真也会返回左表中的记录)


tab1.id


tab1.size


tab2.size


tab2.name


1


10


10


AAA


2


20


(null)


(null)


3


30


(null)


(null)

其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回leftright表中的记录,full则具有left和right的特性的并集。 而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的

总结:

总的来说,就是where语句会过滤掉含NULL的行数(条件为假的行数)。所以在FULL JOIN语句中where语句和on语句的结果差别最大;在JOIN/INNER JOIN 语句中没有差别;在LEFT JOIN 和 RIGHT JOIN中差别大小取决于表达式和表中的数据。

 

时间: 2024-11-19 15:58:36

SQL中on和where的区别的相关文章

面试问题 - SQL 中存储过程与函数的区别

SQL 中的存储过程与函数没有本质上的区别 函数 -> 只能返回一个变量. 函数可以嵌入到sql中使用, 可以在select 中调用, 而存储过程不行.  但函数也有着更多的限制,比如不能使用临时表 存储过程 -> 可以返回多个变量. 存储过程的定义如下: 存储过程可以使得对数据库的管理.以及显示关于数据库及其用户信息的工作容易得多.存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量

SQL中存储过程和函数的区别

本质上没区别.只是函数有如:只能返回一个变量的限制.而存储过程可以返回多个.而函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行.执行的本质都一样.      函数限制比较多,比如不能用临时表,只能用表变量.还有一些函数都不可用等等.而存储过程的限制相对就比较少       1.    一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强.       2.    对于存储过程来说可以返回参数,而函数只能返回值或者表对象.       3.    存储过程

SQL中INEXISTS和IN 的区别和联系

SET NOCOUNT ON , SET NOCOUNT OFF当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数).当 SET NOCOUNT 为 OFF 时,返回计数.如果存储过程中包含的一些语句并不返回许多实际的数据, 则该设置由于大量减少了网络流量,因此可显著提高性能. SQL 中 IN 和 EXISTS 用法的区别: NOT IN SELECT DISTINCT MD001 FROM BOMMD WHERE MD001 NOT IN

SQL中Where与Having的区别

"Where" 是一个约束声明,使用Where来约束来之数据库的数据,Where是在结果返回之前起作用的,且Where中不能使用聚合函数. "Having"是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having中可以使用聚合函数. 在说区别之前,得先介绍GROUP BY这个子句,而在说GROUP子句前,又得先说说"聚合函数"--SQL语言中一种特殊的函数.例如SUM, COUNT, MAX, AVG等.这些函数和其它函数的

sql中,In和where的区别

SQL 语句中In 和 Where 的含义不同.应用解释如下: 1.如需有条件地从表中选取.删除.更新数据时,使用Where:2.In只作为Where条件子句下的一个运算符,除了In之外还有Between.Like.=.>.>=.<.<=等运算符.下面举例说明:1.查询名字为A和B的学生,则语句为Select * from student where name in('A','B');.................................................

SQl中drop与truncate的区别

在对SQL的表操作时,我们因不同的需求做出相应的操作. 我来对比一下truncate table '表明'与drop table '表格名'的区别,跟大家一起学习. drop table '表格名'----我们不在需要此表,或是此表作废了,就把此表delete,删除,drop truncate table '表名' ---我不需要此表的信息,但是我要用此表的表结构,就用truncate. 这是本人的理解,如有错误,希望大家丢砖啊!!!!!!

SQL中datetime和timestamp的区别

初学PHP+MySQL,在开发一个简单的报名程序时,要求在每一条新插入的记录后面添加一个日期字段,方便日后查询和排序.于是立即百度,发现可以使用 datetime或timestamp两种日期类型来实现.这对于爱纠结的我来说是不被允许的,于是立即去找它们的区别.但是搜出来的要么是长篇大论,要么没有重点,于是自己总结了下这些文章的精华部分,以求精益求精. datetime 1.允许为空值,可以自定义值,系统不会自动修改其值. 2.不可以设定默认值,所以在不允许为空值的情况下,必须手动指定dateti

SQL中select与set的区别-转载

下表列出 SET 与 SELECT 的区别   SELECT SET 同时对多个变量同时赋值时 支持 不支持 表达式返回多个值时 将返回的最后一个值赋给变量 出错 表达式未返回值时 变量保持原值 变量被赋null值 (1).同时对多个变量同时赋值时 declare @a varchar(128), @b varchar(128) SET @a='ABC',@b='EFG' GO --报错:消息 102,级别 15,状态 1,第 3 行 ',' 附近有语法错误. declare @a varcha

SQL 中 Date 与Datetime的区别

Date是SQL Server 2008新引进的数据类型.它表示一个日子,不包含时间部分,可以表示的日期范围从公元元年1月1日到9999年12月31日.只需要3个字节的存储空间. DateTime 日期和时间部分,可以表示的日期范围从公元1753年1月1日00:00:00.000 到9999年12月31日23:59:59.997 ,精确到3.33毫秒,它需要8个字节的存储空间.