SQL中JOIN ON WHERE的执行过程
2012-12-06 19:01
375 查看
SQL语句如下:SELECT *
FROM 表1
LEFT JOIN 表2 ON 表1.id = 表2.id AND 表2.Name != 'ff'
WHERE 表1.NAME != 'aa' 步骤1:返回笛卡尔积(SELECT * FROM 表1 CROSS JOIN 表2) 步骤2:应用ON筛选器(当前的条件为 表1.id = 表2.id AND 表2.Name != 'ff') 步骤3:添加外部行 这一步只对OUTER JOIN起作用,如果是LEFT JOIN会以左边的表为保留表,如果是RIGHT JOIN会以右边的表为保留表。所谓外部行是指,保留表中的行。即使第二步的ON过滤掉了一些行,在这一步,会根据保留表添加第二步过滤掉的行。当前的例子,不存在这种情况。 步骤4.应用WHERE筛选器(当前是Name != ‘aa’)过滤前三步所生成虚拟表的数据。 总结:如果SQL用的是Left Join ,On后面的条件对Left的表没有作用,只对Right的表有过滤作用,Where语句可以对Left的表有过滤作用 如果SQL用的是Right Join ,On后面的条件对Right的表没有作用,只对Left的表有过滤作用,Where语句可以对Right的表有过滤作用
FROM 表1
LEFT JOIN 表2 ON 表1.id = 表2.id AND 表2.Name != 'ff'
WHERE 表1.NAME != 'aa' 步骤1:返回笛卡尔积(SELECT * FROM 表1 CROSS JOIN 表2) 步骤2:应用ON筛选器(当前的条件为 表1.id = 表2.id AND 表2.Name != 'ff') 步骤3:添加外部行 这一步只对OUTER JOIN起作用,如果是LEFT JOIN会以左边的表为保留表,如果是RIGHT JOIN会以右边的表为保留表。所谓外部行是指,保留表中的行。即使第二步的ON过滤掉了一些行,在这一步,会根据保留表添加第二步过滤掉的行。当前的例子,不存在这种情况。 步骤4.应用WHERE筛选器(当前是Name != ‘aa’)过滤前三步所生成虚拟表的数据。 总结:如果SQL用的是Left Join ,On后面的条件对Left的表没有作用,只对Right的表有过滤作用,Where语句可以对Left的表有过滤作用 如果SQL用的是Right Join ,On后面的条件对Right的表没有作用,只对Left的表有过滤作用,Where语句可以对Right的表有过滤作用
相关文章推荐
- sql(join on 和where的执行顺序)
- SQL各个子句: outer join,on,where,group by,having,select case子句执行
- SQL各个子句: outer join,on,where,group by,having,select case子句执行
- sql(join on 和where的执行顺序)
- sql(join on 和where的执行顺序)
- sql(join on和where的执行顺序)
- sql(join on 和where的执行顺序)
- Ruby on Rails中执行存储过程和指定SQL语句的方法
- 解析sql语句中left_join、inner_join中的on与where的区别
- sql(join中on与where区别)
- sql执行效率——on 和 where
- sql(join中on与where区别)
- SQL 查询条件放在LEFT OUTER JOIN 的ON语句后与放在WHERE中的区别
- SQL中join on ...and 和join on ... where
- 尽可能避免在where条件或者join时的on条件中使用case函数(T-SQL)
- sql执行顺序以及on和where的区别
- sql(join中on与where区别)
- sql(join中on与where区别)
- sql(join中on与where区别)
- 解析sql语句中left_join、inner_join中的on与where的区别