SQL - 空值:理解未知
你好,未来的数据库大师们!今天,我们将深入探讨SQL中一个常常让新手们感到困惑的有趣方面——空值(NULL)。如果你之前从未编写过一行代码,也不用担心;我会一步步引导你理解这个概念,就像我过去几年里教过无数学生一样。那么,拿起你最喜欢的饮料,让我们一起踏上这个SQL的冒险之旅吧!
空值是什么?
在我们深入细节之前,先来理解一下在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”的表。让我们分解一下发生了什么:
-
StudentID
、FirstName
、LastName
和Age
都被声明为NOT NULL
。这意味着这些字段必须有值;它们不能留空。 -
Email
字段没有NOT NULL
,这意味着如果一个学生没有提供电子邮件地址,这是可以接受的。
通过使用NOT NULL
,我们是在告诉数据库,“嘿,我们绝对需要每个学生的这些信息。没有借口!”
更新表中的空值
有时,你可能会发现表中的空值需要更新。让我们看看如何操作。
示例2:更新空电子邮件地址
假设我们意识到我们需要所有学生的电子邮件地址,并且我们想要更新当前为空的那些。
UPDATE Students
SET Email = '[email protected]'
WHERE Email IS NULL;
这个查询做了以下操作:
- 它查看
Students
表。 - 对于任何
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