SQL语句Left join 中On和Where的用法区别

原文地址:点击打开链接

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的表有过滤作用。

时间: 2024-12-06 10:40:39

SQL语句Left join 中On和Where的用法区别的相关文章

sql语句中left join、inner join中的on与where的区别

原文:sql语句中left join.inner join中的on与where的区别 table a(id, type): id     type ---------------------------------- 1      1         2      1          3      2          table b(id, class): id    class --------------------------------- 1      1 2      2 sql语

MySQL SQL语句之join过滤注意事项

对于SQL语句的JOIN语句,大家并不陌生.关于其中的where语句中进行内容过滤还是在 On 语句中或者having进行过滤,这个是值得注意的. 案例:找出某段时间内注册的新用户,没有通过新手任务当中具体哪一步任务,统计 其中涉及到两张表 用户基础表:user_base,  user_id, 注册时间 created_at 任务表: user_id,task_id,task_status A 语句: select  min(b.task_id) life,task_status,  a.use

sql语句查询数据库中的表名/列名/主键/自动增长值实例_MsSql

sql语句查询数据库中的表名/列名/主键/自动增长值 ----查询数据库中用户创建的表 ----jsj01 为数据库名 select name tablename from jsj01..sysobjects where type='U' and name not in ('dtproperties') --查询表里的字段信息 ---docs为表名 ---- select * from syscolumns where id = object_id('docs') ----查询数据库中所有类型

sql 语句在sqlite 中重复执行

问题描述 sql 语句在sqlite 中重复执行 alter table TL_Init add BalYear FLOAT NOT NULL DEFAULT (0.00); 语句在sqlite 中怎么重复执行 解决方案 你的意思是在表TL_Init中有两列BalYear? 解决方案二: 只能多次调用exec();我之前试过,类似 String sql = ""alter table TL_Init add BalYear FLOAT NOT NULL DEFAULT (0.00);a

数据-用sql语句在access中如何删除自动编号的那一行

问题描述 用sql语句在access中如何删除自动编号的那一行 今天又遇到了一个新问题:我尝试着用sql语句删除access中自动编号的一行,可是出错了,提示我数据类型不匹配.请问我应该怎么改写sql语句? String id=request.getParameter("ID");//从上个页面获取的ID int index=Integer.parseInt(id);//将id转换成字符串类型 . . String sql = "delete from tb_poll whe

sql语句在c#中不能运行,但是在数据库中可以。

问题描述 usingSystem;usingSystem.Collections.Generic;usingSystem.Data.SqlClient;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApplication2{classProgram{staticvoidMain(string[]args){string[]TradingName={"CU0","AL0

SQL语句实现表中字段的组合累加排序

有表如下: id in out index 1 10 12 2 2 9 8 2 3 12 8 3 1 9 9 3 1 12 0 3 2 5 18 2 2 20 0 2 这三个字段均为integer类型 现要求如下: 1.按index=2查找 2.将所有id相同的和在一起,数据要加在一起 3.最后呈现的数据要按in+out进行排序,按由大到小 为满足以上的要求:设计的SQL语句如下(假设表名为tab) 复制代码 代码如下:select id,sum(in) as in,sum(out) as ou

数据库SQL中having和where的用法区别_MsSql

"Where" 是一个约束声明,使用Where来约束来之数据库的数据,Where是在结果返回之前起作用的,且Where中不能使用聚合函数. "Having"是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having中可以使用聚合函数.  聚合函数,SQL基本函数,聚合函数对一组值执行计算,并返回单个值.除了 COUNT 以外,聚合函数都会忽略空值. 聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用. Transact-SQL编

数据库SQL中having和where的用法区别

"Where" 是一个约束声明,使用Where来约束来之数据库的数据,Where是在结果返回之前起作用的,且Where中不能使用聚合函数. "Having"是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having中可以使用聚合函数. 聚合函数,SQL基本函数,聚合函数对一组值执行计算,并返回单个值.除了 COUNT 以外,聚合函数都会忽略空值. 聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用. Transact-SQL编程