Oracle NULL判断对SQL的影响

 
 
在 Oracle 数据库中,NULL 判断对 SQL 语句的执行和结果有着多方面的影响,下面从查询条件、聚合函数、排序、连接操作等角度详细阐述:

1. 查询条件中的 NULL 判断

IS NULL 和 IS NOT NULL

在 Oracle 里,NULL 代表未知值,不能使用普通的比较运算符(如 =<>)来判断一个值是否为 NULL,而要使用 IS NULL 或 IS NOT NULL
 
-- 创建示例表
CREATE TABLE employees (
    id NUMBER,
    name VARCHAR2(100),
    manager_id NUMBER
);

-- 插入包含 NULL 的数据
INSERT INTO employees (id, name, manager_id) VALUES (1, 'Alice', NULL);
INSERT INTO employees (id, name, manager_id) VALUES (2, 'Bob', 1);

-- 查询 manager_id 为 NULL 的员工
SELECT * FROM employees WHERE manager_id IS NULL;

-- 查询 manager_id 不为 NULL 的员工
SELECT * FROM employees WHERE manager_id IS NOT NULL;

普通比较运算符与 NULL

若使用普通比较运算符和 NULL 比较,结果永远是 NULL,而不是 TRUE 或 FALSE。例如:

-- 此查询不会返回任何结果,因为 manager_id = NULL 的结果是 NULL
SELECT * FROM employees WHERE manager_id = NULL;

2. 聚合函数与 NULL

忽略 NULL 值

大多数聚合函数(如 SUMAVGMINMAXCOUNT)会自动忽略 NULL 值。

-- 创建示例表
CREATE TABLE sales (
    product_id NUMBER,
    sales_amount NUMBER
);

-- 插入包含 NULL 的数据
INSERT INTO sales (product_id, sales_amount) VALUES (1, 100);
INSERT INTO sales (product_id, sales_amount) VALUES (2, NULL);

-- SUM 函数忽略 NULL 值
SELECT SUM(sales_amount) FROM sales;

-- AVG 函数忽略 NULL 值
SELECT AVG(sales_amount) FROM sales;

COUNT 函数对 NULL 的处理

COUNT(*) 会统计所有行,包括包含 NULL 值的行;而 COUNT(column_name) 只统计指定列不为 NULL 的行。
 
-- 统计所有行
SELECT COUNT(*) FROM sales;

-- 统计 sales_amount 不为 NULL 的行
SELECT COUNT(sales_amount) FROM sales;

3. 排序中的 NULL

NULL 值的排序规则

在 Oracle 中,NULL 值在排序时有特定规则。默认情况下,升序排序时 NULL 值排在最前面,降序排序时 NULL 值排在最后面。
 
-- 升序排序,NULL 值在最前面
SELECT * FROM employees ORDER BY manager_id ASC;

-- 降序排序,NULL 值在最后面
SELECT * FROM employees ORDER BY manager_id DESC;
 

修改 NULL 值的排序位置

可以使用 NULLS FIRST 或 NULLS LAST 来明确指定 NULL 值的排序位置。

-- 升序排序,NULL 值在最后面
SELECT * FROM employees ORDER BY manager_id ASC NULLS LAST;

-- 降序排序,NULL 值在最前面
SELECT * FROM employees ORDER BY manager_id DESC NULLS FIRST;
 

4. 连接操作中的 NULL

外连接与 NULL

在进行外连接(左连接、右连接、全连接)时,可能会产生 NULL 值。例如,左连接中,如果右表中没有匹配的行,那么右表的列值会显示为 NULL

-- 创建示例表
CREATE TABLE departments (
    department_id NUMBER,
    department_name VARCHAR2(100)
);

-- 插入数据
INSERT INTO departments (department_id, department_name) VALUES (1, 'HR');
INSERT INTO departments (department_id, department_name) VALUES (2, 'IT');

-- 左连接,若 employees 表中没有匹配的部门,department 列会显示为 NULL
SELECT e.id, e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;
 

5. NULL 对索引的影响

索引通常不包含 NULL 值

Oracle 的索引一般不会包含 NULL 值。这意味着在查询中使用 IS NULL 条件时,索引可能无法被有效利用,从而导致全表扫描。
 
-- 若 manager_id 列上有索引,此查询可能会进行全表扫描
SELECT * FROM employees WHERE manager_id IS NULL;

综上所述,在编写 Oracle SQL 语句时,需要充分考虑 NULL 值的影响,正确使用 NULL 判断,以确保查询结果的准确性和性能。
 

posted on 2025-03-24 10:31  数据派  阅读(102)  评论(0)    收藏  举报