JOIN联表中ON,WHERE后面跟条件的区别

         对于JOIN的连表操作,这里就不细述了,当我们在对表进行JOIN关联操作时,对于ON和WHERE后面的条件,不清楚大家有没有注意过,有什么区别,可能有的朋友会认为跟在它们后面的条件是一样的,你可以跟在ON后面,如果愿意,也可以跟在WHERE后面。它们在ON和WHERE后面究竟有一个什么样的区别呢?
在JOIN操作里,有几种情况。LEFT JOIN,RIGHT JOIN,INNER JOIN等。

        为了清楚的表达主题所描述的问题,我简要的对LEFT,RIGHT,INNER这几种连接方式作一个说明。

        下面就拿一个普通的博客系统的日志表(post)和分类表(category)来描述吧。

这里我们规定有的日志可能没有分类,有的分类可能目前没有属于它的文章。

1.    LEFT JOIN:

(保证找出左联表中的所有行)

查出所有文章,并显示出他们的分类: 

SELECT p.title,c.category_name FROM post p LEFT JOIN category c ON p.cid = c.cid2.    RIGHT JOIN:

(保证找出右联表中的所有行)

查询所有的分类,并显示出该分类所含有的文章数。 

SELECT COUNT(p.id),c.category_name FROM post p RIGHTJOIN  category c ON p.pid = c.cid3.    INNER JOIN

(找出两表中关联相等的行)查询有所属分类的日志。(即那些没有所性分类的日志文章将不要我们的查询范围之内)。 

SELECT p.title,c.category_name FROM post p INNER JOIN category c ON p.cid = c.cid.

这种情况和直接两表硬关联等价。现在我们回过头来看上面的问题。

对于第一种情况,如果我们所ON 的条件写在WHERE 后面,将会出现什么情况呢?

即: SELECT p.title,c.category_name FROM post p LEFT JOIN category c WHERE  p.cid = c.cid

对于第二种情况,我们同样按照上面的书写方式。 

SELECT COUNT(p.id),c.category_name FROM post p RIGHTJOIN  category c WHERE p.pid = c.cid

        如果运行上面的SQL语句,就会发现,它们已经过滤掉了一些不满足条件的记录,可能在这里,大家会产生疑问了,不是用了LEFT和RIGHT吗?它们可以保证左边或者右边的所有行被全部查询出来,为什么现在不管用了呢?对于出现这种的问题,呵呵!是不是觉得有些不可思议。出现这种的问题,原因就在WHERE和ON这两个关键字后面跟条件。好了,现在我也不调大家味口了,给大家提示答案吧。对于JOIN参与的表的关联操作,如果需要不满足连接条件的行也在我们的查询范围内的话,我们就必需把连接条件放在ON后面,而不能放在WHERE后面,如果我们把连接条件放在了WHERE后面,那么所有的LEFT,RIGHT,等这些操作将不起任何作用,对于这种情况,它的效果就完全等同于INNER连接。对于那些不影响选择行的条件,放在ON或者WHERE后面就可以。记住:所有的连接条件都必需要放在ON后面,不然前面的所有LEFT,和RIGHT关联将作为摆设,而不起任何作用。

你可能感兴趣的:(sql)