-分量
SQL
中
ON
和
WHERE
的区别
数据库在通过连接两张或多张表来返回记录时,
都会生成一张中
间的临时表,
然后再将这张
临时表返回给用户。
在使用
left jion
时,
on
和
where
p>
条件的区别如下:
1
、
on
条
件是在生成临时表时使用的条件,它不管
on
中的条件是否为真
,都会返回左边表
中的记录。
2<
/p>
、
where
条件是在临时表生成好后,
再对临时表进行过滤的条件。这时已经没有
left
join
的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
假设有两张表:
p>
表
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
(
=
)
where
=
< br>’
AAA
’
2
、
select
*
form
tab1
left
join
tab2
on
(
=
and
=
’
AAA
’
)
第一条
SQL
的过程:
1
p>
、
中间表
on
条件
:
=
1 10 10 AAA
2 20 20 BBB
2 20 20 CCC
3 30 (null)
(null)
2
、
再对中间表过滤
where
条件:
=
’
AAA
’
1 10 10 AAA
第二条
SQL
的过程:
1
、中间表
on
条件
: = and =
’
AAA
’
(
条
件不为真也会返回左
表中的记录
)
1 10 10 AAA
2 20 (null) (null)
3 30
(null) (null)
其实以上结果的关键原因就是
left
join,right
join,full
join
的特殊性,不管
on
上的条
件是否为真都会返回
left
或
right
表中的记录,
full
p>
则具有
left
和
right
的特性的并集。
而
inner join
没这个特殊性
,则条件放在
on
中和
where
p>
中,返回的结果集是相同的。
on
为了反映
外连接中一方的全连接,而
where
没有这个功能,内连接配
对是可以的。
=======
==================================================
=========
on
、
p>
where
、
having
的区别
on
、
where
、
hav
ing
这三个都可以加条件的子句中,
on
是最先执行,
where
次之,
h
aving
最后。有时候如果这先后顺序不影响中间结果的话,那最终结果是相同的。但
因为
on
是先
把不符合条件的记录过滤
后才进行统计,
它就可以减少中间运算要处理的数据,
按理说应
该
速度是最快的。
根据上面的分析,可以知道
wh
ere
也应该比
having
快点的,
因为它过滤数据后才进行
sum
,
所以
having
是最慢的。
但也不是说<
/p>
having
没用,
因为有时在步骤
p>
3
还没出来都不知道
那个记录才符合要求时
,就要用
having
了。
在两个表联接时才用
on
的,所以在一个表的时候,就剩下
where
跟
having
比较了。在
这单表查询统计的情况下,
如果要过滤的条件没有涉及到要计算
字段,
那它们的结果是一样
的,只是
w
here
可以使用
rushmore
技
术,而
having
就不能,在速度上后者要慢。
如果要涉及
到计算的字段,就表示在没计算之前,这个字段的值是不确定的,根据上篇
写的工作流程
,
where
的作用时间是在计算之前就完成的,而
having
就是在计算后才起作
用的,所以在这
种情况下,两者的结果会不同。
在多表联接查询时,
on
比
where
更早起作用。系统首先根据各个
表之间的联接条件,把
多个表合成一个临时表后,再由
wher
e
进行过滤,然后再计算,计算完后再由
having
进行
过滤。
由此可见,
要想过滤条件起到正确的作用,
首先要明白这个条件应该在什幺时候起作
用,然后再决定放在那里
JOIN
联表中
ON,WHERE
后面跟条件的区别
对于
JOIN
的连表操作,这里就不细述了,当我们在对表进行
JOIN
关联操作时,对于
ON
< br>和
WHERE
后面的条件,不清楚大家有没有注意过,有
什幺区别,可能有的朋友会认为跟在它们
后面的条件是一样的,你可以跟在
ON
后面,如果愿意,也可以跟在
WHERE
后面。它们在
ON
和
WHERE
后面究竟有一个什幺样的区别呢?
在
JOIN
操作里,有几种情况。
< br>LEFT JOIN,RIGHT JOIN,INNER JOIN
等。
为了清楚的表达主题所描述的问题,我简要的对
LEFT,RIGHT,INN
ER
这几种连接方式作一个
说明。
下面就拿一个普通的博客系统的日志表
(post)
和分类表
(category)
来描述吧。
这里我
们规定有的日志可能没有分类,有的分类可能目前没有属于它的文章。
JOIN:
(保证找出左联表中的所有行)
查出所有文章,并显示出他们的分类:
SELECT ,ry_name
FROM post p
LEFT JOIN category c ON = 2.
RIGHT
JOIN:
(保证找出右联表中的所有行)
查询所有的分类,并显示出该分类所含有的文章数。
SELECT COUNT(),ry_name
FROM
post p
RIGHT JOIN category c ON = 3.