MySQL - NULL 值

各位好,有志於數據庫的愛好者們!今天,我們將要深入探討 MySQL 中令人著迷的 NULL 值世界。作為你們親切友善的鄰居計算機老師,我非常興奮能夠帶領你們踏上這次旅程。所以,拿起你們最喜歡的飲料,我們開始吧!

MySQL - NULL Values

MySQL 的 NULL 值

什麼是 NULL 值?

在我們深入細節之前,讓我們先了解 NULL 實際上是什麼意思。在 MySQL 中,NULL 代表一個遺失或未知的值。這就像當你問你的朋友他們早餐吃了什麼,而他們說:"我不記得了。" 這就是現實生活中的 NULL 值!

NULL 不是零、空字符串或假。它是任何值的缺失。把它當作一個佔位符,說:"嘿,這裡應該有東西,但我們還不知道它是什麼!"

什麼是 NULL 值的重要性?

NULL 值在數據庫管理中扮演著關鍵角色。它們允許我們:

  1. 表示缺失的信息
  2. 區分零和未知值
  3. 执行特定的操作和比較

讓我們看一個簡單的例子:

CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
grade FLOAT
);

INSERT INTO students (id, name, age, grade) VALUES
(1, 'Alice', 20, 85.5),
(2, 'Bob', 21, NULL),
(3, 'Charlie', NULL, 92.0);

在這個例子中,我們不知道 Bob 的成績或 Charlie 的年齡。我們不會猜測或填入不正確的信息,而是使用 NULL。

創建不允許 NULL 值的表

現在,如果我們想要確保某些列始終有值,那麼 NOT NULL 約束就派上用場了。這就像告訴你們的學生:"沒有借口不交作業!"

讓我們創建一個要求所有字段都有值的表:

CREATE TABLE employees (
id INT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
hire_date DATE NOT NULL
);

在這個表中,每個列都有 NOT NULL 約束。如果我們嘗試插入一行而不提供所有值,MySQL 將會有禮貌地拒絕我們的請求並抛出錯誤。

-- 這將會成功
INSERT INTO employees VALUES (1, 'John', 'Doe', '[email protected]', '2023-01-15');

-- 這將會失敗
INSERT INTO employees (id, first_name, last_name) VALUES (2, 'Jane', 'Smith');

第二個插入將會失敗,因為我們沒有為 emailhire_date 提供值,這些是 NOT NULL 字段。

在表中更新 NULL 值

有時候,我們可能想要更新表中的 NULL 值。也許我們從我們之前的例子中終於找到了 Charlie 的年齡。這是我們如何操作的:

UPDATE students SET age = 22 WHERE name = 'Charlie';

但如果我們想要將一個值設為 NULL 呢?只要列允許 NULL 值,我們也可以這樣做:

UPDATE students SET grade = NULL WHERE name = 'Alice';

記住,你不能將 NOT NULL 列設為 NULL。這就像試圖擦除永久的記號筆——它就是不起作用!

刪除含有 NULL 值的記錄

有時候,我們可能想要刪除在某些列中具有 NULL 值的記錄。這是我們如何操作的:

DELETE FROM students WHERE grade IS NULL;

注意我們使用 IS NULL 而不是 = NULL。這是因為 NULL 不是一個值,所以我們不能用等於運算符與它一起使用。這是使 NULL 特殊的一個怪癖!

在客戶端程序中使用 NULL 值

當在客戶端程序(如連接到 MySQL 的 PHP 腳本)中處理 NULL 值時,正確地處理它們非常重要。這裡是一個簡單的 PHP 示例:

<?php
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";

// 創建連接
$conn = new mysqli($servername, $username, $password, $dbname);

// 檢查連接
if ($conn->connect_error) {
die("連接失敗: " . $conn->connect_error);
}

$sql = "SELECT * FROM students";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "Name: " . $row["name"]. " - Age: " .
($row["age"] === NULL ? "Unknown" : $row["age"]) .
" - Grade: " . ($row["grade"] === NULL ? "Not graded" : $row["grade"]) . "<br>";
}
} else {
echo "0 results";
}
$conn->close();
?>

在這個腳本中,我們使用三元運算符來檢查年齡或成績是否為 NULL,並相應地顯示 "Unknown" 或 "Not graded"。

結論

好了,各位!我們已經一起穿越了 MySQL 中 NULL 值的土地。記住,NULL 不是什麼都沒有——它是已知的未知,是你數據庫中的問號,是拼圖中缺失的片段。擁抱 NULL,理解它,並在數據庫冒險中明智地使用它!

在我們分道揚镳之前,這裡有一個方便的表格,總結了我們討論過的方法:

方法 描述 示例
創建 NOT NULL 列 確保列始終有值 CREATE TABLE employees (id INT PRIMARY KEY, name VARCHAR(50) NOT NULL);
插入 NULL 值 在允許的情況下添加帶有 NULL 值的行 INSERT INTO students (id, name, age) VALUES (1, 'Alice', NULL);
更新為 NULL 在允許的情況下將值設為 NULL UPDATE students SET grade = NULL WHERE name = 'Bob';
從 NULL 更新 將 NULL 替換為值 UPDATE students SET age = 22 WHERE name = 'Charlie';
刪除 NULL 記錄 刪除指定列中具有 NULL 值的行 DELETE FROM students WHERE grade IS NULL;
檢查 NULL 在查詢中使用 IS NULL 或 IS NOT NULL SELECT * FROM students WHERE age IS NOT NULL;

祝編程愉快,願你的數據庫永遠對 NULL 有警覺!

Credits: Image by storyset