65.9K
CodeProject 正在变化。 阅读更多。
Home

掌握 SQL Server 中的 NULL 值

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2024年10月8日

CPOL

6分钟阅读

viewsIcon

1162

本文解释了 SQL Server 中与 NULL 值相关的关键概念和最佳实践,有助于掌握 SQL Server 中的 NULL 值。文章《在 SQL Server 中掌握 NULL 值》首次发布于 Technology with Vivek Johari。

在 SQL Server 中掌握 NULL 值

目录

  • 引言
  • 什么是 SQL NULL?
  • 本文中使用的表
  • 处理 SQL NULL 值的函数
  • IsNull()
  • Coalesce()
  • 使用 NULL 值聚合数据
  • 在报告中处理 NULL 值
  • SQL NULL 值示例
  • 处理 NULL 值的最佳实践
  • 摘要

引言

SQL 中的 NULL 被认为是缺失或未知的值,它不等于 0 或空格('')。如果开发者对 NULL 概念没有很好的了解,处理 SQL NULL 会有点复杂。

本文将解释 SQL Server 中与 NULL 值相关的一些关键概念和最佳实践。本文还包含有助于掌握 SQL Server 中 NULL 值的示例。

什么是 SQL NULL?

在 SQL 中,NULL 被定义为未知值或待定义值。正确处理 NULL 值对于确保数据完整性并避免查询中出现意外结果非常重要。例如,如果一个用户参加了 5 门考试,他收到了 4 门考试的结果,但最后一门考试的结果仍在等待中。因此,我们不能在最后一门考试列中放置 0 值。在这种情况下,我们在最后一列中放置 NULL 值,稍后用实际分数替换它。

此外,由于 NULL 值被认为是未知的,我们不能将一个 NULL 值与另一个 NULL 值进行比较。

检查 NULL 值

使用 IS NULL 和 IS NOT NULL 运算符检查 NULL 值。此外,涉及 NULL 值的比较会产生 UNKNOWN 结果。

SELECT * FROM Employees WHERE ProjectID = NULL; -- Incorrect
SELECT * FROM Employees WHERE ProjectID IS NULL; -- Correct

同样,

SELECT * FROM Employees WHERE ProjectID <> NULL; -- Incorrect
SELECT * FROM Employees WHERE ProjectID IS NOT NULL; -- Correct

本文中使用的表:–

在本文中,我们将使用包含以下记录的表 tbl_nulldemo

col_id

5

5

5

5

5

NULL

处理 SQL NULL 的函数

我们可以使用 2 个函数来处理 SQL NULL 值

1) ISNull()

ISNULL() 函数在表达式返回 NULL 值时返回指定值,否则返回表达式值。

例如:-

Select ISNULL( col_id ,0) FROM tbl_nulldemo

上述 SQL 查询将给出以下输出。

col_id

5

5

5

5

5

0

它将用 0 值替换 NULL 值。

2) COALESCE()

COALESCE() 函数将返回列表中第一个非 NULL 表达式。

例如,

SELECT COALESCE(NULL, NULL, 5, NULL, 6)

将返回输出 5,因为它是第一个非空值。

使用 NULL 值聚合数据

COUNT、SUM、AVG、MAX 和 MIN 等聚合函数对 NULL 值的处理方式不同。

  • COUNT (*) 包含 NULL 值,而 COUNT(column_name) 不包含。
  • SUM、AVG、MAX 和 MIN 忽略 NULL 值。

在报告中处理 NULL 值。

假设我们正在创建一个列出员工及其项目的报告,但有些员工没有项目。您可以处理 NULL 值,以确保报告为这些员工显示“无项目”。

SELECT EmployeeID, COALESCE (ProjectName, 'No Project') AS ProjectName FROM Employees e

在此示例中,COALESCE 函数用于处理 NULL 值,当员工没有项目时显示“无项目”。这确保了报告清晰且用户友好。

SQL NULL 值示例

在第一部分,我解释了 SQL Server 中的 NULL 值。现在,在本节中,我将尝试通过示例进行解释。

在所有以下问题中,我将使用我在“使用的表”部分中提到的表 tbl_nulldemo。所有示例都将使用相同的表 tbl_nulldemo 数据。

示例 1:– 以下查询的结果是什么?

SELECT COUNT (1) FROM tbl_nulldemo

答案 - 6 解释 - 即使 NULL 被认为是未知值,Count() 函数也会考虑包含 NULL 值的任何行。因此,上述查询返回 6

示例 2:–

SELECT COUNT (*) FROM tbl_nulldemo

答案 – 6

解释 - 即使 NULL 被认为是未知值,Count() 函数也会考虑包含 NULL 值的任何行。因此,上述查询返回 6

示例 3:–

 SELECT COUNT (col_id) FROM tbl_nulldemo

答案 – 5

解释 - 当我们在 Count 函数中传递列名时,它只考虑非 NULL 值。因此,在这种情况下,它将返回结果 5

示例 4:

 SELECT AVG (col_id) FROM tbl_nulldemo

答案 -5

解释 - AVG 函数在计算 AVG 值时将包含所有非 NULL 值。因此,在这种情况下,我们有 5 个非 NULL 值:5,5,5,5,5。因此,AVG 函数将返回 25/5=5。

示例 5:–

SELECT col_id, COUNT (col_id) as cnt   FROM tbl_nulldemo GROUP BY col_id HAVING (COUNT(col_id)>1)

答案 - 此查询将给出以下结果

col_id cnt

————————-

5                   5

解释 - 由于表格包含值 5(5 次),因此我们得到了上述结果。现在出现一个问题,如果我们再有一个 NULL 值会发生什么?即使那样,结果也保持不变,因为 NULL 是一个未知值,所以即使列中有多个 NULL 值,这些 NULL 值也无法进行比较。因此,每个 NULL 值都将单独处理。

示例 7:–

SELECT DISTINCT col_id FROM tbl_nulldemo

答案 -

col_id

———–

NULL

解释 - 由于表格包含值 5(5 次)和 1 个 NULL 值,因此 DISTINCT 命令将返回上述结果。

示例 8:–

SELECT MIN(col_id)  as min, MAX(col_id) as max FROM tbl_nulldemo

答案 -

min max

———– ———–

5                     5

解释 - 由于 Null 值是未知的,因此无法进行比较。因此,Min 和 Max 函数不考虑 Null 值。所以,由于除了 Null 值之外,表中只剩下 5 个值,Min 和 Max 函数返回 5 作为结果。

示例 9:–

SELECT SUM(col_id) as Total FROM tbl_nulldemo

答案 -

总计

———–

25

解释 - 与上述 SQL 查询解释类似,Sum 值不考虑 NULL 值,因此 SUM () 函数将返回 25 作为结果。

示例 10:–

SELECT 5+5+5+5+5+NULL as totalvalue

答案 -

totalvalue

———–

NULL

解释 - 这里我们尝试将 5 与 Null(一个未知值)相加。因此,结果将是 NULL,一个未知值。

示例 11:–

SELECT * FROM tbl_nulldemo WHERE col_id != NULL

答案 -

col_id

———–

解释 - 由于无法将列的值与 NULL(一个未知值)进行比较。因此,我们不能将比较运算符(如 =、< 或 <>)与 NULL 值一起使用。所以,如果你想获得不包含 NULL 值的输出,我们必须使用 is NOT NULL 命令,如下所示

SELECT * FROM tbl_nulldemo WHERE col_id is not NULL

col_id

———–

5

5

5

5

5

示例 12:–

SELECT * FROM tbl_nulldemo WHERE col_id = NULL

答案 -

col_id

———–

解释 - 类似于第 10 个示例的解释,由于无法将列的值与 NULL(一个未知值)进行比较。因此,我们不能将比较运算符(如 =、< 或 <>)与 NULL 值一起使用。所以,如果你想获得包含 NULL 值的输出,我们必须使用 is NULL 命令,如下所示

SELECT * FROM tbl_nulldemo WHERE col_id is NULL

col_id

———–

NULL

处理 NULL 值的最佳实践

  1. 明确处理 NULL 值: 始终考虑您的应用程序应如何处理 NULL 值,并在 SQL 查询中明确说明。
  2. 避免在关键列中使用 NULL: 避免在主键、外键和唯一约束中使用 NULL 值,因为它们可能导致数据完整性问题。
  3. 记录 NULL 处理: 记录数据库架构和应用程序逻辑中 NULL 值的处理方式,以确保一致性。
  4. 使用默认值: 在适当的情况下,使用默认值以避免数据库中出现 NULL 条目。

总结:–

本文解释了 SQL Server 中 NULL 值的关键概念。它还提到了用于 NULL 值的 SQL 函数以及如何进行比较。它还通过示例解释了聚合 SQL 函数如何处理 NULL 值。

NULL 值也会影响 SQL JOIN 查询的结果。有关详细信息,请参阅 这篇 SQL JOIN 文章

最后,它还提到了在 SQL Server 中处理 NULL 值的最佳实践。

 

文章 在 SQL Server 中掌握 NULL 值 最初发布于 Technology with Vivek Johari

© . All rights reserved.