1.什么是NULL值
NULL值是一种特殊的数据类型,通常表示缺少值或未知的值。在数据库中,NULL值是可能存在的,因为某些列不一定需要具有值。NULL值对于数据分析和应用程序设计而言是重要的,因为它们提供了缺乏数据的灵活性。
1.1.引入NULL值的原因
引入NULL值是出于以下考虑:
NULL表示一个未知的值,而不是任何已知的值。这对于缺乏数据的情况是有帮助的。
一些数据可能在未被赋值或未被定义时被引入。这可能会导致NULL值的存在。
数据库表通常有许多列,不会在每个行中都填满所有列。这些列中的许多可以为空(即NULL)。
2.在SQL中如何处理NULL值
在SQL中,NULL可以用于WHERE子句中的比较,但是必须使用特殊的运算符来告诉DBMS如何处理它们。
2.1.IS NULL和IS NOT NULL
在SQL中进行NULL比较时必须使用IS NULL或IS NOT NULL运算符。这两个运算符不是通常的比较运算符。例如:
SELECT * FROM CUSTOMERS
WHERE AGE IS NULL;
这将选择具有NULL值的记录。或者,要选择非NULL值,可以使用IS NOT NULL:
SELECT * FROM CUSTOMERS
WHERE AGE IS NOT NULL;
2.2.NULL与其他值之间的比较
注意:在具有NULL值的记录中,任何列与其他值的比较都无法确定其结果。
例如:
SELECT * FROM CUSTOMERS
WHERE AGE = 25;
选择所有AGE等于25的记录,但无法选择具有NULL AGE的记录(因为未知的AGE无法与任何其他值进行比较)。
为了选择具有NULL值的记录,必须使用IS NULL运算符:
SELECT * FROM CUSTOMERS
WHERE AGE IS NULL;
2.3.NULL与其他值的算术运算
通常情况下,任何涉及到NULL的算术运算都将返回NULL。例如:
SELECT (NULL + 10);
将返回NULL值。
2.4.使用NVL和COALESCE函数处理NULL值
NVL和COALESCE函数都允许您在语句中使用默认值处理NULL值。
NVL函数:
SELECT NVL(SUM(SALES), 0) FROM ORDERS;
此函数将SUM(SALES)的结果返回。如果结果为NULL,则返回0。
COALESCE函数:
SELECT COALESCE(SUM(SALES), AVG(SALES)) FROM ORDERS;
此函数将SUM(SALES)的结果返回。如果结果为NULL,则返回AVG(SALES)的结果。
2.5.使用NULLIF函数处理NULL值
NULLIF函数允许您比较两个表达式。如果这些表达式相等,则返回NULL。否则,返回第一个表达式的值。例如:
SELECT NULLIF(10, 10);
将返回NULL。
如果它替换了一个列,可以同时处理NULL:
SELECT NULLIF(SALARY, 0) FROM EMPLOYEE;
这将返回具有为零或缺少值的工资的任何员工列表。
2.6.使用CASE语句处理NULL值
CASE语句允许您测试表达式。在条件满足后,您可以执行特定的操作。在CASE语句中,您可以处理NULL值。
例如:
SELECT
(CASE
WHEN AGE IS NULL THEN 'Age is not available'
WHEN AGE > 30 THEN 'Age is more than 30'
ELSE 'Age is less than 30'
END) AS AGE_CATEGORY
FROM CUSTOMERS;
这将返回Age类别,即Age是否可用,是否大于30或是否小于30。
3.NULL值的影响
NULL值可以影响查询结果,特别是聚合计算。假设有如下数据:
ID | Name | Age
-----|-------|------
1 | John | 25
2 | Mary | NULL
3 | Jake | 30
查询平均年龄:
SELECT AVG(AGE) AS AVG_AGE FROM CUSTOMERS;
结果会被影响,因为加权平均数会受到缺少值的影响。在上述例子中,答案将是NULL。
由此可见,NULL值可以对查询结果产生影响,应该谨慎处理。
4.结论
在SQL中处理NULL值是必不可少的,因为NULL是一种特殊的数据类型。使用IS NULL和IS NOT NULL运算符可以解决大多数问题。使用NVL,COALESCE,NULLIF和CASE等函数可以更好地处理NULL值。
在查询结果可能包含NULL值的情况下,必须谨慎处理NULL值。需要注意的是,NULL值可能会对聚合计算产生影响。在查询结果中使用默认值可以更好地控制数据。