《Oracle SQL疑难解析》——.13 在语句中找到和消除空值

1.13 在语句中找到和消除空值

Oracle SQL疑难解析

1.13.1 要解决的问题

我们需要统计出公司中,有多少员工的薪酬里含销售提成(commission percentage),有多少员工的薪酬是固定工资。我们可以用HR.EMPLOYEES表中的COMMISSION_PCT字段来获得数据。

1.13.2 解决方法

HR.EMPLOYEES表的结构允许COMMISSION_PCT字段为空值。有两个查询语句可以分别查找commission percent为空值的人和为非空值的人。首先,查找commission percentage为空值的员工:

select first_name, last_name
from hr.employees
where commission_pct is null;
FIRST_NAME      LAST_NAME
-------------------- -------------------------
Donald        OConnell
Douglas        Grant
Jennifer        Whalen
Michael        Hartstein
Pat          Fay
…

72 rows selected.

现在查找commission percentage为非空值的人员:

select first_name, last_name
from hr.employees
where commission_pct is not null;
FIRST_NAME      LAST_NAME
-------------------- -------------------------
John          Russell
Karen        Partners
Alberto        Errazuriz
Gerald        Cambrault
Eleni        Zlotkey
…
35 rows selected.

1.13.3 数据库如何工作

第一个SELECT语句用“COMMISSION_PCT IS NULL”子句测试NULL项。这只会出现两个结果:要么字段为空,即没有值,满足查询条件;要么字段有值。

第二个语句用“COMMISSION_PCT IS NOT NULL”子句,这将找出COMMISSION_PCT 实际值对应的所有EMPLOYEE。

Oracle对空字符串的非标准处理

SQL标准做法是用空或零长度的字符串来代表NULL值,而Oracle并非如此。其中历史的、地域的原因我们无需深究,但一定要记住,Oracle对NULL的规定和用法。对于几乎所有的其他数据库,SQL都把空字符串当作一个独立的、已知的值。

有编程背景的人会发现一些类似的规定,一个0长度的字符串只有一个字符串终结符(\0)作为其内容。相反,一个加密的字符串没有确定的状态……即使是一个终结符。我们不能把0长度和未知状态的字符串进行互换,这类似于Oracle如何对待NULL。

1.13.4 NULL不跟任何值相等

在SQL中涉及NULL值的使用诀窍,也是每天必须面对的功课,这经常让人不知所措。每个SQL表达式的结果都是三个值选一:“真”、“假”或“空”。在各种比较、逻辑操作和判断中都是如此。但为避免偶尔的遗忘,我们还是要一再地强调:NULL不跟任何值相等,任何值不跟NULL相等,NULL不等于NULL。试着运行下面的语句,看看你能预猜到答案吗?

select first_name, last_name
from hr.employees
where commission_pct = NULL;

结果是没有任何行返回。即使从前面的SELECT查询中看到EMPLOYEE_ID是72的员工的COMMISSION_PCT为NULL,但因为NULL不等于NULL,所以COMMISSION_PCT=NULL是不成立的,所以查询的结果是没有记录返回。记住,不要用“=”号,而是永远用“IS NULL”或“IS NOT NULL”来寻找或排除NULL值。

时间: 2024-09-23 08:07:15

《Oracle SQL疑难解析》——.13 在语句中找到和消除空值的相关文章

《Oracle SQL疑难解析》导读

前言 Oracle SQL疑难解析 欢迎阅读本书.现在你手中的这本书,对在Oracle数据库中编写SQL时经常碰到的问题提供了现成的解决方法.这本书写给那些迫切需要解决某个特定问题的人.本书每一节讨论一个特定的问题,并为这一问题提供了一个有效的解决方法.对于解决方法感兴趣的人,每一节还扩展讨论了解决方法,有些还提供了替代解决方法. 我们精心编写了这本书,是为了让你掌握如何为Oracle编写SQL,至少可以让你了解Oracle的SQL.虽然我们把内容分割成有逻辑的章节,例如,数据类型或生成报表,但

《Oracle SQL疑难解析》——1.8 在一个语句中修改多个字段值

1.8 在一个语句中修改多个字段值 Oracle SQL疑难解析 1.8.1 要解决的问题 需要在一个表中修改一行或多行的多个字段值. 1.8.2 解决方法 UPDATE语句可以让我们轻松地修改一行或多行的数据,我们也可以在UPDATE语句中用多个"column=value"子句来修改多个字段的值.例如,我们可以用下面的单个UPDATE语句来修改James Marlow(其EMPLOYEE_ID为131)的电话号码.工作角色和薪水: update hr.employees set jo

《Oracle SQL疑难解析》——1.1 从表中查询数据

1.1 从表中查询数据 Oracle SQL疑难解析 1.1.1 要解决的问题 如何从一个表中查询特定行和列的数据. 1.1.2 解决方法 用包含WHERE子句的SELECT语句.下面的SELECT 语句可以从数据库表中查询符合条件的行的列值: select employee_id, first_name, last_name, hire_date, salary from hr.employees where department_id = 50 and salary < 7500; 上述SE

《Oracle SQL疑难解析》——1.2 把表中所有字段都列出来

1.2 把表中所有字段都列出来 Oracle SQL疑难解析 1.2.1 要解决的问题 我们要把表中所有的字段数据都列出来,但并不想把每个字段名都在SELECT后面输入一遍. 1.2.2 解决方法 使用星号(*)占位符,即可代表所有表中字段,例如: select * from hr.employees where department_id = 50 and salary < 7500; ``` 因为列多页窄,查询结果换行显示,为节省空间,我们也仅仅在下面列了几行,但相信你已经能看出来用"

《Oracle SQL疑难解析》——1.6 批量地从一个表中复制数据到另一个表

1.6 批量地从一个表中复制数据到另一个表 Oracle SQL疑难解析 1.6.1 要解决的问题 如何从一个表中一次性复制多行记录到另一个表. 1.6.2 解决方法 INSERT INTO... SELECT... 方法可以插入多行记录,关键是用SELECT语句选择多行记录时一定要用对选择条件.我们把以前的SELECT语句做一点修改,就可以选择多行记录了: 当然,前提是存在HR.CANDIDATES表,在做练习前,应确保你的HR.CANDIDATES表和例子中的表是一致的. 1.6.3 数据库

《Oracle SQL疑难解析》——1.10 删除表中的所有行

1.10 删除表中的所有行 Oracle SQL疑难解析 1.10.1 要解决的问题 从指定的表中删除所有数据. 1.10.2 解决方法 如果用DELETE语句来删除所有行,则Oracle会完整地把删除行为记入日志,以便如果是误操作,我们还有机会将数据回滚.但正是因为要记日志,所以需要花一定的时间,有时达不到我们希望的速度. 作为补充,Oracle提供了一个TRUNCATE(截断)语句来删除表中的所有数据.可以用下面的语句来截断HR.EMPLOYEES表: truncate table hr.e

《Oracle SQL疑难解析》——1.11 从其他查询结果中再次进行查询

1.11 从其他查询结果中再次进行查询 Oracle SQL疑难解析 1.11.1 要解决的问题 如何把一个查询的结果当作表,对此表进行再次的查询.当然,我们并不想把中间结果存在表里面,因为每次运行查询,中间内容都需要刷新. 1.11.2 解决方法 Oracle内联视图(inline view)的特性让我们可以在FROM子句中放置一个子查询,然后给子查询结果取一个表别名: select d.department_name from (select department_id, departmen

《Oracle SQL疑难解析》——1.12 查询的WHERE子句基于另一个查询的结果

1.12 查询的WHERE子句基于另一个查询的结果 Oracle SQL疑难解析 1.12.1 要解决的问题 我们要从某张表中查询数据,但查询条件依赖当时另一张表中的数据情况,所以不能直接把条件固定到语句中.具体地说,我们现在要做一个报告,把所有办公场所在北美的部门列出来. 1.12.2 解决方法 在HR SCHEMA中,DEPARTMENT表中有部门的信息,LOCATIONS表中有办公场所的信息: select department_name from hr.departments where

《Oracle SQL疑难解析》——1.15 启用其他排序和比较选项

1.15 启用其他排序和比较选项 Oracle SQL疑难解析 1.15.1 要解决的问题 文本数据由大.小写字母和句子(英文句子,指第一个字母大写,后续字母小写)组成,我们希望对之进行不区分大小写的比较.排序等操作. 1.15.2 解决方法激活Oracle的语言比较逻辑,就能按人类的习惯来查询数据,摆脱大小写负担: alter session set NLS_COMP='LINGUISTIC'; select first_name, last_name from hr.employees wh