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 值
大多数聚合函数(如
SUM、AVG、MIN、MAX、COUNT)会自动忽略 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 判断,以确保查询结果的准确性和性能。
浙公网安备 33010602011771号