今天在做一些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数据库表中如何增加字段。 新增字段: 添加字段的语法:alter table tablename add (column datatype [default value][null/not null],….); 实例 创建表结构: create table ...
他认为对于SQL的学习是永无止境的,相信每一个查询Oracle数据库的人都需要精通SQL语言,才能写出高效的查询。他参与本书的编写就是为了帮助别人实现这一目标。 目录 封面 -11 封底 -10 扉页 -9 版权 -8 版权声明 -7...
添加字段的语法:alter table tablename add (column datatype [default value][null/not null],….); 修改字段的语法:alter table tablename modify (column datatype [default value][null/not null],….); 删除...
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语句来对表中某一个字段进行重命名呢?我们将使用alter table 这一SQL语句。 重命名字段的语法为:alter table <表名> change <字段名> <字段新名称> <字段的类型>。 现在我们来...
添加字段的语法:alter table tablename add (column datatype [default value][null/not null],….); 修改字段的语法:alter table tablename modify (column datatype [default value][null/not null],….); 删除...
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...
NULL 博文链接:https://hackpro.iteye.com/blog/1845366
下面为您介绍的是查询表的字段名的sql语句写法,sql语句可以实现许多的功能,希望可以您在学习sql语句使用方面获得启示。 1. select name from syscolumns where id = (select id from sysobjects where type = 'u' ...
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 ...
27.如何对CLOB行字段执行全文检索 28.如何让你的SQL运行得更快 29.如何使‘CREATE TABLE AS SELECT’能支持ORDER BY 30.删除表内重复记录的方法 31.数据库安全性策略 32.数据库的查询优化技术. 33.提高...
本书特色:主要介绍SQL的语法规则及在实际开发中的应用,并且对SQL在MySQL、MS SQL Server、Oracle和DB2中的差异进行了分析;详细讲解数据库对增、删、改、查等SQL的支持并给出了相应的SQL应用案例;透彻分析函数...
│ │ 6.1.1 NULL对IN的查询的影响及解决示例.sql │ │ 6.1.2 各种联接的使用示例.sql │ │ 6.1.2 多表联结导致记录重复的示例.sql │ │ 6.1.3 使用UNION实现库存报表的示例.sql │ │ 6.1.5 按指定上下限区间...
NULL 博文链接:https://googledave.iteye.com/blog/326706
3.1.3 非空约束对数据插入的影响 3.1.4 主键对数据插入的影响 3.1.5 外键对数据插入的影响 3.2 数据的更新 3.2.1 简单的数据更新 3.2.2 带WHERE子句的UPDATE语句 3.2.3 非空约束对数据更新的影响 ...
说明:对查询结果进行排序会大大的降低系统的性能,group与union都会对数据作排序,要耗费较多的内存,视状况用union all既可,不然有时数据太大又要进行union的排序,会导致Oracle数据库SORT_AREA_SIZE不足发生系统...
insert into 表1 (字段1,字段2) values (1,2),(2,3),(3,4); 这条语句在mysql中执行的话,语法一点毛病都没有,但是,在oracle上执行一直报错: ORA-00933: SQL 命令未正确结束 后来有了如下的解决办法: /* --一...
如果我们想查询跟索引有关的数据字典时,可以用下面这条SQL语句: SQL>select * from dictionary where instr(comments,'index')>0; 如果我们想知道user_indexes表各字段名称的详细含义,可以用下面这条SQL语句:...
第06章 │ │ 6.1.1 NULL对IN的查询的影响及解决示例.sql │ │ 6.1.2 各种联接的使用示例.sql │ │ 6.1.2 多表联结导致记录重复的示例.sql │ │ 6.1.3 使用UNION实现库存报表的示例.sql │ ...