首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SQL:为什么在这个where子句中过滤掉NULL值?

在 SQL 中,NULL 值表示未知或缺失的数据。在 WHERE 子句中过滤掉 NULL 值的原因是,NULL 不等于任何值,甚至不等于它自己。因此,在 WHERE 子句中使用 NULL 进行比较时,可能会导致不可预测的结果。

例如,假设有一个表格包含员工的姓名和工资信息,其中有些员工的工资为 NULL。如果我们想要查询工资高于某个值的员工,我们可能会使用以下查询:

代码语言:txt
复制
SELECT * FROM employees WHERE salary > 50000;

然而,由于 NULL 不等于任何值,包括它自己,所以这个查询将不会返回工资为 NULL 的员工。为了确保这些员工也被包含在结果中,我们需要使用 IS NULL 运算符来显式地检查 NULL 值:

代码语言:txt
复制
SELECT * FROM employees WHERE salary > 50000 OR salary IS NULL;

这样,我们就可以在 WHERE 子句中过滤掉 NULL 值,并得到我们期望的结果。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MySQL 查询专题

SELECT语句有一个特殊的 WHERE 子句,可用来检查具有 NULL 的列。这个WHERE子句就是 ISNULL 子句。...NULL 与不匹配 通过过滤选择出不具有特定的行时,你可能希望返回具有 NULL 的行。但是,不行。因为未知具有特殊的含义,数据库不知道它们是否匹配,所以匹配过滤或不匹配过滤时不返回它们。...SQL(像多数语言一样)处理OR操作符前,优先处理AND操作符。 WHERE句中使用圆括号 任何时候使用具有 AND 和 OR 操作符的WHERE子句,都应该使用圆括号明确地分组操作符。...这可能会改变计算,从而影响 HAVING 子句中基于这些过滤掉的分组。...where item_price >= 10 ) 列必须匹配 WHERE句中使用查询(如这里所示),应该保证SELECT语句具有与 WHERE句中相同数目的列。

5K30

Oracle查询性能优化

原则一:注意WHERE句中的连接顺序: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE...原则二:SELECT子句中避免使用 ‘ * ‘: ORACLE解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间 。...IS NULL和IS NOT NULL 避 免索引中使用任何可以为空的列,ORACLE性能上将无法使用该索引.对于单列索引,如果列包含空,索引中将不存在此记录....如果至少有一个列不为空,则记录存在于索引中.举例: 如果唯一性索引建立表的A列和B列上, 并且表中存在一条记录的A,B为(123,null) , ORACLE将不接受下一条具有相同A,B(123,...因为空不存在于索引列中,所以WHERE句中对索引列进行空比较将使ORACLE停用该索引.

2.2K20

MySQL(五)汇总和分组数据

,例子如下: select avg_(prod_price) as avg_price from products where vend_id = 1003; 这条SQL语句包含了where语句,仅过滤出...二、分组数据 1、group by创建分组 MySQL中,分组是select语句中的group by子句中建立的,比如: select vend-id,count(*) as num_prods from...中使用表达式,则必须在group by子句中指定相同的表达式(不能使用别名); ④除了聚集计算语句外,select中每个列都必须在group by子句中给出; ⑤如果分组列中具有null,则null将作为一个分组返回...)的那些分组; having和where的区别: where在数据分组前进行过滤,having在数据分组后进行过滤;where排除的行不包括分组中(这可能会改变计算,从而影响having子句中基于这些过滤掉的分组...by vend_id having count(*)>= 2; 这条SQL句中where子句过滤掉所有prod_price至少为10的行,然后按照vend_id分组数据;having子句过滤技术为

4.7K20

【MySQL系列】- MySQL执行计划一览

什么是执行计划 根据表、列、索引和WHERE句中的条件的详细信息,MySQL优化器考虑了许多技术来有效地执行SQL查询中涉及的查找。...如果是使用JSON格式输出的话,执行计划中的NULL将不会展示。 explainable_stmt:必填项,可使用EXPLAIN的SQL语句。...「关联/相关子查询」:查询的执行依赖于外部查询。多数情况下是查询的 WHERE句中引用了外部查询包含的列。 ❞ id SELECT查询的系列号,可以为NULL。...ref_or_null :有时候我们不仅想找出某个二级索引列的等于某个常数的记录,还想把该列的NULL 的记录也找出来,这个时候type就是ref_or_null。...filtered的从100开始变小的同时过滤掉的行数也增加。

71620

oracle数据库sql语句优化(循环语句有几种语句)

4、WHERE句中的连接顺序: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他 WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾...X WHERE X.TEMP_NO = E.TEMP_NO); 10、减少对表的查询: 含有查询的SQL句中,要特别注意减少对表的查询。...如果要涉及到计算的字段,就表示没计算之前,这个字段的是不确定的,where的作用 时间是计算之前就完成的,而having就是计算后才起作用的,所以在这种情况下,两者 的结果会不同。...如果唯一性索引建立表的A列和B列上, 并且表中存在一条记录的A,B为(123,null), ORACLE将不接受下一条具有相同A,B(123,null)的记录(插入)。...因为空不存在于索引列中,所以WHERE句中对索引列进行空 比较将使ORACLE停用该索引。

2.8K10

java面试(3)SQL优化

任何在Order by语句的非索引项或者有计算表达式都将降低查询速度 应尽量避免 where句中对字段进行 null 判断,否则将导致引擎放弃使用索引而进行全表扫描,如select id...任何在where句中使用is null或is not null的语句优化器是不允许使用索引的。...至于in到底会不会走索引,这个众说纷纭,网上有一种说法:(1)A IN(列表)肯定用索引、(2)A in (查询) 是用不到索引的,但是如果子查询的条件是和外层相关的,查询本身用到索引。...order by子句:执行顺序从左到右 避免数据类型不一致 读取适当的记录LIMIT M,N 避免select句中使用查询 对于有联接的列,即使最后的联接为一个静态,优化器是不会使用索引的...减少对表的查询: 含有查询的SQL句中,要特别注意减少对表的查询.例子: SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT

3.2K20

SQL优化法则小记

采用自下而上的顺序解析where子句,根据这个原理,表之间的连接必须写 在其他where条件之前, 那些可以过滤掉最大数量记录的条件必须写在where子句的末尾. 3.select子句中避免使用 ‘...,就表示没计算之前,这个字段的是不确定的,根据上篇写的工作 流程,where 的作用时间是计算之前就完成的,而 having 就是计算后才起作用 的,所以在这种情况下,两者的结果会不同。...由此可见,要想过 滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定,放在那里. 12.减少对表的查询: 含有查询的 SQL句中,要特别注意减少对表的查询.例子:...(123,null)的记录(插入)....因为空不存在于索引列中,所以 where句中对索引列进行空比较将使 oracle停用该索引.

2K90

Java SQL语句优化经验

WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. (3) SELECT子句中避免使用 ‘ * ‘: ORACLE...,这个字段的是不确定的,根据上篇写的工作流程,where的作用时间是计算之前就完成的,而having就是计算后才起作用的,所以在这种情况下,两者的结果会不同。...由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里 (12) 减少对表的查询: 含有查询的SQL句中,要特别注意减少对表的查询.例子: SELECT...(10,20,30); (26) 避免索引列上使用IS NULL和IS NOT NULL 避免索引中使用任何可以为空的列,ORACLE将无法使用该索引.对于单列索引,如果列包含空,索引中将不存在此记录...因为空不存在于索引列中,所以WHERE句中对索引列进行空比较将使ORACLE停用该索引.

2.6K100

MySQL 性能优化总结

,数字类型的字段作为条件查询比字符串的快 8.那些可以过滤掉最大数量记录的条件必须写在WHERE子句的最末尾 Sql语句优化: 1.3.1,:合理使用like模糊查询 关键词 %姜小鱼%,由于姜小鱼前面用到了...IS NULL 或 IS NOT NULL 的优化 where句中使用 IS NULL 或 IS NOT NULL 判断,索引将被放弃使用,会进行全表查询。...1 SELECT id FROM A WHERE num IS NULL --会造全表扫描 2 SELECT id FROM A WHERE num=0 --优化成num上设置默认0,确保表中num没有...null 1.3.4,:where子句使用or的优化   很多时候使用union all 或 nuin(必要的时候)的方式替换“or”会得到更好的效果。...创建空间索引时,使用SPATIAL关键字。要求,引擎为MyISAM,创建空间索引的列,必须将其声明为NOT NULL。可能跟游戏开发有关。 2.6,Mysql索引为什么使用B+树实现: ?

98611

Oracle SQL性能优化

(2)      WHERE句中的连接顺序.: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在...,这个字段的是不确定的,根据上篇写的工作流程,where的作用时间是计算之前就完成的,而having就是计算后才起作 用的,所以在这种情况下,两者的结果会不同。...由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候 起作用,然后再决定放在那里 (12) 减少对表的查询: 含有查询的SQL句中,要特别注意减少对表的查询.例子:     ...  IN (10,20,30); (26) 避免索引列上使用IS NULL和IS NOT NULL 避免索引中使用任何可以为空的列,ORACLE将无法使用该索引.对于单列索引,如果列包含空,索引中将不存在此记录...因为空不存在于索引列中,所以WHERE句中对索引列进行空比较将使ORACLE停用该索引.

2.8K70

SQL 性能调优

阅读目录 (1)选择最有效率的表名顺序(只基于规则的优化器中有效) (2)WHERE句中的连接顺序 (3)SELECT子句中避免使用 ‘ * ‘ (4)减少访问数据库的次数 (5)SQL*Plus...回到顶部 (2)WHERE句中的连接顺序 ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE...,这个字段的是不确定的,根据上篇写的工作流程,where的作用时间是计算之前就完成的,而having就是计算后才起作 用的,所以在这种情况下,两者的结果会不同。...由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里 回到顶部 (12) 减少对表的查询 含有查询的SQL句中,要特别注意减少对表的查询.例子:    ...任何在where句中使用is null或is not null的语句优化器是不允许使用索引的。 回到顶部 (37) 联接列 对于有联接的列,即使最后的联接为一个静态,优化器是不会使用索引的。

3.2K10

高效sql性能优化极简教程

解析(PARSE): 检查语法 检查语义和相关的权限 共享池中查找sql语句 合并(MERGE)视图定义和查询 确定执行计划 绑定(BIND) 句中查找绑定变量 赋值(或重新赋值) 执行(EXECUTE...sql解析过程中,还需要把“*”依次转换为所有的列名,这个工作需要查询数据字典完成!...子句中对列的任何操作结果都是sql运行时逐行计算得到,因此它不得不进行全表扫描,而没有使用上面的索引;如果这些结果在查询编译时就能得到,那么就可以被sql优化器优化,使用索引,避免全表扫描,因此sql...,使索引失效,如果不产生大量重复,可以考虑把子句拆开;拆开的子句中应该包含索引; select count(*) from stuff where id_no in('0','1') 可以拆开为:...update serviceinfo set state=0 where state =1 or state =2 14,避免索引列上使用IS NULL或者NOT 避免索引中使用任何可以为空的列,导致无法使用索引

3.2K50

分享:Oracle sql语句优化

避免索引列上使用IS NULL 和IS NOT NULL 避免索引中使用任何可以为空的列,ORACLE将无法使用该索引.对于单列索引,如果列包含空,索引中将不存在此记录....因为空不存在于索引列中,所以WHERE句中对索引列进行空比较将使ORACLE 停用该索引....WHERE 子句,根据这个原理,表之间的连接必须写在其他WHERE 条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE 子句的末尾. 3、SELECT 子句中避免使用' * ': ORACLE...,这个字段的是不确定的,根据上篇写的工作流程,where的作用时间是计算之前就完成的,而having 就是计算后才起作用的,所以在这种情况下,两者的结果会不同。...由 此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里 12、减少对表的查询: 含有查询的SQL句中,要特别注意减少对表的查询.例子: 1 SELECT

2.8K10

SQL 性能调优

(2)WHERE句中的连接顺序 ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE...,这个字段的是不确定的,根据上篇写的工作流程,where的作用时间是计算之前就完成的,而having就是计算后才起作 用的,所以在这种情况下,两者的结果会不同。...由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里 (12) 减少对表的查询 含有查询的SQL句中,要特别注意减少对表的查询.例子:    ...因为空不存在于索引列中,所以WHERE句中对索引列进行空比较将使ORACLE停用该索引....任何在where句中使用is null或is not null的语句优化器是不允许使用索引的。 (37) 联接列 对于有联接的列,即使最后的联接为一个静态,优化器是不会使用索引的。

2.7K60

详解SQL集合运算

为什么使用集合运算: 1.集合运算中比联接查询和EXISTS/NOT EXISTS更方便。 阅读下面的章节时,我们可以先把环境准备好,以下的SQL脚本可以帮助大家创建数据库,创建表,插入数据。...(7)用内联接或EXISTS谓词可以代替INTERSECT集合运算,但是必须对NULL进行处理,否则这两种方法对NULL进行比较时,比较结果都是UNKNOWN,这样的行会被过滤掉。...其中UK NULL London有四个重复行, 排序函数的OVER字句中使用 ORDER BY ( SELECT )可以告诉SQL Server不必在意行的顺序。...才能用NOT EXISTS进行查询,如果custid或empid其中有null存在,则不能用NOT EXISTS进行查询,因为比较NULL的结果是UNKNOWN,这样的行用NOT EXISTS查询返回的查询的行会被过滤掉...进行查询,如果custid或empid其中有null存在,则不能用EXISTS进行查询,因为比较NULL的结果是UNKNOWN,这样的行用EXISTS查询返回的查询的行会被过滤掉,所以最后的外查询会少

2.2K80

Oracle Sql优化

3.Oracle执行IN查询时,首先执行查询,将查询结果放入临时表再执行主查询。而EXIST则是首先检查主查询,然后运行查询直到找到第一个匹配项。NOT EXISTS比NOT IN效率稍高。...5.Where句中出现IS NULL或者IS NOT NULL时,Oracle会停止使用索引而执行全表扫描。可以考虑设计表时,对索引列设置为NOT NULL。...8.如果索引不是基于函数的,那么当在Where句中对索引列使用函数时,索引不再起作用。 9.Where句中避免索引列上使用计算,否则将导致索引失效而进行全表扫描。...13.Oracle从下到上处理Where句中多个查询条件,所以表连接语句应写在其他Where条件前,可以过滤掉最大数量记录的条件必须写在Where子句的末尾。...NOT NULL; 6.多列索引,但它的第一个列并没有被Where子句引用; Oracle优化器 1.Oracle优化器(Optimizer)是Oracle执行SQL之前分析语句的工具。

1.3K30

mysql(基本的SELECT语句)

空值参与运算 所有运算符或列值遇到null,运算的结果都为null SELECT NULL+1,NULL-1,NULL*1,NULL>1,NULL<1,NULL=1 FROM DUAL MySQL...如果真的相同,请在SQL句中使用一对``(着重号)引起来。(键盘上1数字的旁边那玩意) 补充: SELECT 查询还可以对常数进行查询。对的,就是 SELECT 查询结果中增加一列固定的常数列。...你可能会问为什么我们还要对常数进行查询呢?...SQL 中的 SELECT 语法的确提供了这个功能,一般来说我们只从一个表中查询数据,通常不需要增加一个固定的常数列,但如果我们想整合不同的数据源,用常数列作为这个表的标记,就需要查询常数。...条件查询 语法: SELECT 字段1,字段2 FROM 表名 WHERE 过滤条件  用WHERE 子句,将不满足条件的行过滤掉 WHERE子句紧随 FROM子句 举例 SELECT employee_id

1.6K30

数据库性能优化之SQL语句优化

也就是说如果某列存在空,即使对该列建索引也不会提高性能。任何在where句中使用is null或is not null的语句优化器是不允许使用索引的。...WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. (3) SELECT子句中避免使用 ‘ * ‘: ORACLE...,这个字段的是不确定的,根据上篇写的工作流程,where的作用时间是计算之前就完成的,而having就是计算后才起作 用的,所以在这种情况下,两者的结果会不同。...(12) 减少对表的查询: 含有查询的SQL句中,要特别注意减少对表的查询.例子: SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = (...因为空不存在于索引列中,所以WHERE句中对索引列进行空比较将使ORACLE停用该索引.

5.6K20

重磅:关于hive的join使用必须了解的事情

其中的第一个join是a和b,并缓存a的,同时reducers中流式传输b的。其中第二个作业缓冲了第一个连接的结果,同时通过reducer流式传输c的。...OUTER JOIN语义应该符合标准的SQL规范。 7,连接发生在where之前。因此,如果要限制连接的OUTPUT,则需要在WHERE句中,否则应该在JOIN子句中。...但是,WHERE子句也可以引用连接输出中的a和b的其他列,然后将其过滤掉。但是,每当JOIN的某行为b找到一个键而没有键时,b的所有列都将为NULL,包括ds列。...这就是说,你将过滤掉没有有效的b.key的所有连接输出行,因此你已经超出了你的LEFT OUTER要求。换句话说,如果在WHERE句中引用b的任何一列,则连接的LEFT OUTER部分是无关紧要的。...使用LEFT SEMI JOIN的限制是右边的表只能在连接条件(ON子句)中引用,而不能在WHERE或SELECT子句中引用。

7.2K111
领券