`

Oracle SQL查询时NULL字段对查询结果的影响

 
阅读更多

    今天在做一些oracle sql查询练习,突然遇到如下问题:

    查询使用的实例表结构是oracle内置用户hr下的employees表,我的目标是查出哪些员工跟Pat(FIRST_NAME)、Fay(LAST_NAME)不在同一个部门(非关联子查询)。


我使用如下关联查询语句(1号):

 

SELECT e.first_name || ' ' || e.last_name AS 姓名,
       e.department_id AS 部门号
  FROM employees e
 WHERE NOT EXISTS (SELECT 1
          FROM employees e1
         WHERE e1.department_id = e.department_id
           AND e1.first_name = 'Pat'
           AND e1.last_name = 'Fay');

 

 查询结果如下图:


而当我使用如下查询语句时(2号):

 

SELECT e.first_name || ' ' || e.last_name AS 姓名,
       e.department_id AS 部门号
  FROM employees e
 WHERE EXISTS
 (SELECT 1
          FROM employees e1
         WHERE e1.first_name = 'Pat'
           AND e1.last_name = 'Fay'
           AND e1.department_id <> e.department_id);

 查询结果却是这样:

 




逻辑并没有错,可为什么差了一条,将两个结果进行minus,得出相差的那条记录为


这条记录部门号为NULL,终于明白是有NULL参与比较导致的。

又使用如下代码进行了实验:

 

SELECT CASE
         WHEN NULL = NULL OR NULL <> NULL OR NULL = 'a' OR 'a' > NULL OR
              'a' < NULL THEN
          'a'
         WHEN 'b' is not null and '' is NULL THEN
          'b'
         ELSE
          'c'
       END
  FROM dual;

 

 得出结果为:b,说明有NULL参与的比较运算得到的都是false。


于是最终2号将代码改为:

 

SELECT e.first_name || ' ' || e.last_name AS 姓名,
       e.department_id AS 部门号
  FROM employees e
 WHERE EXISTS
 (SELECT 1
          FROM employees e1
         WHERE e1.first_name = 'Pat'
           AND e1.last_name = 'Fay'
           AND NVL(e1.department_id,0) <> NVL(e.department_id,0));

 

 得到的记录数与1号代码一致。


结论:对存在NULL字段的进行比较时,应该注意去空。
 

  • 大小: 10.9 KB
  • 大小: 11 KB
  • 大小: 1.6 KB
分享到:
评论

相关推荐

    Oracle数据库表中字段顺序的修改方法

    在修改顺序之前,我们先来看看Oracle数据库表中如何增加字段。 新增字段: 添加字段的语法:alter table tablename add (column datatype [default value][null/not null],….); 实例 创建表结构: create table ...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    他认为对于SQL的学习是永无止境的,相信每一个查询Oracle数据库的人都需要精通SQL语言,才能写出高效的查询。他参与本书的编写就是为了帮助别人实现这一目标。 目录 封面 -11 封底 -10 扉页 -9 版权 -8 版权声明 -7...

    oracle删除表字段和oracle表增加字段

    添加字段的语法:alter table tablename add (column datatype [default value][null/not null],….); 修改字段的语法:alter table tablename modify (column datatype [default value][null/not null],….); 删除...

    精通SQL 结构化查询语言详解

    5.3 排序查询结果 5.3.1 单列排序  5.3.2 多列排序 5.3.3 采用序号进行多列排序 5.3.4 反向排序  5.4 使用WHERE子句定义搜索条件查询  5.4.1 WHERE子句单条件查询 5.4.2 单值比较运算符 5.4.3 BETWEEN...

    MySQL中使用SQL语句对字段进行重命名

    MySQL中,如何使用SQL语句来对表中某一个字段进行重命名呢?我们将使用alter table 这一SQL语句。 重命名字段的语法为:alter table &lt;表名&gt; change &lt;字段名&gt; &lt;字段新名称&gt; &lt;字段的类型&gt;。 现在我们来...

    oracle使用sql语句增加字段示例(sql删除字段语句)

    添加字段的语法:alter table tablename add (column datatype [default value][null/not null],….); 修改字段的语法:alter table tablename modify (column datatype [default value][null/not null],….); 删除...

    精通SQL--结构化查询语言详解

    5.3 排序查询结果 89 5.3.1 单列排序 89 5.3.2 多列排序 90 5.3.3 采用序号进行多列排序 91 5.3.4 反向排序 92 5.4 使用where子句定义搜索条件查询 93 5.4.1 where子句单条件查询 93 5.4.2 单值比较运算符 94...

    关于oracle clob 类型字段重建索引SQL及修复用户表空间索引空间的存储过程

    NULL 博文链接:https://hackpro.iteye.com/blog/1845366

    oracle查表字段

    下面为您介绍的是查询表的字段名的sql语句写法,sql语句可以实现许多的功能,希望可以您在学习sql语句使用方面获得启示。 1. select name from syscolumns where id = (select id from sysobjects where type = 'u' ...

    精通sql结构化查询语句

    6.2.4 使用别名 6.3 排序与分组 6.3.1 升序排序与降序排序 6.3.2 多列字段排序 6.3.3 使用GROUPBY子句对查询结果进行分组 6.3.4 HAVING子句的应用 6.4 条件查询 6.4.1 WHERE单条件语句查询 6.4.2 运算符查询 6.4.3 ...

    Oracle数据库学习指南

    27.如何对CLOB行字段执行全文检索 28.如何让你的SQL运行得更快 29.如何使‘CREATE TABLE AS SELECT’能支持ORDER BY 30.删除表内重复记录的方法 31.数据库安全性策略 32.数据库的查询优化技术. 33.提高...

    程序员的SQL金典.rar

     本书特色:主要介绍SQL的语法规则及在实际开发中的应用,并且对SQL在MySQL、MS SQL Server、Oracle和DB2中的差异进行了分析;详细讲解数据库对增、删、改、查等SQL的支持并给出了相应的SQL应用案例;透彻分析函数...

    经典SQL脚本大全

    │ │ 6.1.1 NULL对IN的查询的影响及解决示例.sql │ │ 6.1.2 各种联接的使用示例.sql │ │ 6.1.2 多表联结导致记录重复的示例.sql │ │ 6.1.3 使用UNION实现库存报表的示例.sql │ │ 6.1.5 按指定上下限区间...

    问题:oracle中插入分割时间的sql语句

    NULL 博文链接:https://googledave.iteye.com/blog/326706

    程序员的SQL金典4-8

     3.1.3 非空约束对数据插入的影响  3.1.4 主键对数据插入的影响  3.1.5 外键对数据插入的影响  3.2 数据的更新  3.2.1 简单的数据更新  3.2.2 带WHERE子句的UPDATE语句  3.2.3 非空约束对数据更新的影响  ...

    SQL性能优化

    说明:对查询结果进行排序会大大的降低系统的性能,group与union都会对数据作排序,要耗费较多的内存,视状况用union all既可,不然有时数据太大又要进行union的排序,会导致Oracle数据库SORT_AREA_SIZE不足发生系统...

    oracle通过1条语句插入多个值的方法示例

    insert into 表1 (字段1,字段2) values (1,2),(2,3),(3,4); 这条语句在mysql中执行的话,语法一点毛病都没有,但是,在oracle上执行一直报错: ORA-00933: SQL 命令未正确结束 后来有了如下的解决办法: /* --一...

    最全的oracle常用命令大全.txt

    如果我们想查询跟索引有关的数据字典时,可以用下面这条SQL语句: SQL&gt;select * from dictionary where instr(comments,'index')&gt;0; 如果我们想知道user_indexes表各字段名称的详细含义,可以用下面这条SQL语句:...

    Sqlserver2000经典脚本

    第06章 │ │ 6.1.1 NULL对IN的查询的影响及解决示例.sql │ │ 6.1.2 各种联接的使用示例.sql │ │ 6.1.2 多表联结导致记录重复的示例.sql │ │ 6.1.3 使用UNION实现库存报表的示例.sql │ ...

Global site tag (gtag.js) - Google Analytics