SQL - 空值:理解未知

你好,未来的数据库大师们!今天,我们将深入探讨SQL中一个常常让新手们感到困惑的有趣方面——空值(NULL)。如果你之前从未编写过一行代码,也不用担心;我会一步步引导你理解这个概念,就像我过去几年里教过无数学生一样。那么,拿起你最喜欢的饮料,让我们一起踏上这个SQL的冒险之旅吧!

SQL - NULL Values

空值是什么?

在我们深入细节之前,先来理解一下在SQL中NULL究竟意味着什么。想象你正在填写一份表格,上面有一个要求填写你中间名的字段。但是如果你没有中间名呢?你不能写“没有中间名”,因为这不准确——你并不是说你的中间名是“没有中间名”。你只是留空。这个空白,我的朋友们,在SQL中本质上就是NULL所代表的。

在SQL中,NULL是一个特殊的标记,用来表示数据库中不存在数据值。它不是零,也不是空字符串,而是没有任何值。把它看作是SQL在说,“我不知道”或者“这个信息不可用。”

创建不允许空值的表

现在我们理解了NULL是什么,让我们看看如何创建一个不允许空值的表。当每条记录中你绝对需要某些数据时,这特别有用。

示例1:创建学生表

CREATE TABLE Students (
StudentID INT NOT NULL,
FirstName VARCHAR(50) NOT NULL,
LastName VARCHAR(50) NOT NULL,
Age INT NOT NULL,
Email VARCHAR(100)
);

在这个例子中,我们正在创建一个名为“Students”的表。让我们分解一下发生了什么:

  1. StudentIDFirstNameLastNameAge都被声明为NOT NULL。这意味着这些字段必须有值;它们不能留空。
  2. Email字段没有NOT NULL,这意味着如果一个学生没有提供电子邮件地址,这是可以接受的。

通过使用NOT NULL,我们是在告诉数据库,“嘿,我们绝对需要每个学生的这些信息。没有借口!”

更新表中的空值

有时,你可能会发现表中的空值需要更新。让我们看看如何操作。

示例2:更新空电子邮件地址

假设我们意识到我们需要所有学生的电子邮件地址,并且我们想要更新当前为空的那些。

UPDATE Students
SET Email = '[email protected]'
WHERE Email IS NULL;

这个查询做了以下操作:

  1. 它查看Students表。
  2. 对于任何Email IS NULL的记录(记住,我们不能使用= NULL!),它将电子邮件设置为'[email protected]'。

这就像是在说,“对于任何没有给我们电子邮件的学生,让我们暂时使用这个占位符电子邮件地址。”

删除具有空值的记录

有时,你可能想要删除某些字段具有空值的记录。让我们看看如何操作。

示例3:删除没有年龄信息的学生

DELETE FROM Students
WHERE Age IS NULL;

这个查询将删除Age字段为NULL的任何学生记录。就像是在说,“如果我们不知道一个学生的年龄,让我们从数据库中删除他们的记录。”

小心这样的操作!在运行这样的查询之前,总是确保你真的想要删除这些记录。

在WHERE子句中处理空值

关于NULL值的一个棘手问题是,你不能用普通的比较运算符与它们进行比较。让我们看看如何在WHERE子句中正确检查空值。

示例4:查找缺少电子邮件地址的学生

SELECT FirstName, LastName
FROM Students
WHERE Email IS NULL;

这个查询将给我们提供所有没有提供电子邮件地址的学生的列表。注意我们使用的是IS NULL而不是= NULL。这是一个即使是经验丰富的程序员有时也会犯的常见错误!

空值与聚合函数

NULL值也会影响聚合函数的工作方式。让我们看一个例子。

示例5:计算平均年龄

SELECT AVG(Age) AS AverageAge
FROM Students;

这个查询计算所有学生的平均年龄。这里有趣的部分是:NULL值在这个计算中被完全忽略。所以如果你有10个学生,但只有8个填写了年龄,平均年龄将基于这8个值来计算。

结论

好了,各位!我们已经穿越了SQL中的空值领域。我们看到了如何创建不允许空值的表,如何更新和删除具有空值的记录,以及如何在查询中处理空值。

记住,NULL不是零,不是空字符串,它是值的缺失。它是SQL在耸肩说,“我不知道。”现在,你知道如何像专业人士一样处理这些“我不知道”的情况了!

继续练习这些概念,在你意识到之前,你将自信地导航数据库的世界。愉快的查询!

Credits: Image by storyset