SQL NULL(空值)

例表:

tbl
idusernamepasswordage
1wanghao12345618
2xiaomingNULL18

NULL (空)值代表遗漏的未知数据。表的列 默认 可以存放 NULL 值。

如果表中的某个列是可选的,那么可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。

NULL 值的处理方式与其他值不同。NULL 用作未知的或不适用的值的占位符。无法使用比较运算符来测试 NULL 值,比如 =、< 或 <>(!=)。无法比较 NULL 和 0,因为它们是不等价的。

MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据时,当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。

					
...
mysql> INSERT INTO tbl_name (col1_name, col2_name) VALUES ('string1', NULL);
mysql> INSERT INTO tbl_name (col1_name, col2_name) VALUES ('string2', 'string3');
...
mysql> SELECT * FROM tbl_name WHERE col2_name = NULL;         //Empty set (0.00 sec)
mysql> SELECT * FROM tbl_name WHERE col2_name != NULL;        //Empty set (0.00 sec)
					
				

说明:

为了处理这种情况,MySQL 提供了三种运算符:

可以使用 IS NULL 和 IS NOT NULL 操作符。因此,NULL 值不参加统计,不参加计算,只能用 IS... 判断。

要认真对待 NULL 值,最好在使用统计函数时,都加上 IS NULL 判断,以防出现意外。

IS NULL 运算符

选取在 "Address" 列中带有 NULL 值的记录:

					
SELECT * FROM table_name WHERE column IS NULL;
					
				
					
<?php
  $conn = mysqli_connect('localhost', 'root', 'brAZFUFNpAGCYB35', 'demo') or die("数据库连接失败" . mysqli_connect_error());
  
  $sql = "SELECT * FROM `tbl` WHERE `username` IS NULL";
  $result = mysqli_query($conn, $sql) or die("查询失败" . mysqli_error($conn));
  var_dump($result);
  if ($result->num_rows == 0) {
    echo "没有 NULL";
  } else {
    echo "有 NULL";
  }

  $sql = "SELECT * FROM `tbl` WHERE `password` IS NULL";
  $result = mysqli_query($conn, $sql) or die("查询失败" . mysqli_error($conn));
  var_dump($result);
  if ($result->num_rows == 0) {
    echo "没有 NULL";
  } else {
    echo "有 NULL";
  }
 ?>
					
				

输出:

					
object(mysqli_result)#2 (5) {
  ["current_field"]=>
  int(0)
  ["field_count"]=>
  int(4)
  ["lengths"]=>
  NULL
  ["num_rows"]=>
  int(0)
  ["type"]=>
  int(0)
}
没有 NULL

object(mysqli_result)#3 (5) {
  ["current_field"]=>
  int(0)
  ["field_count"]=>
  int(4)
  ["lengths"]=>
  NULL
  ["num_rows"]=>
  int(1)
  ["type"]=>
  int(0)
}
有 NULL
					
				

IS NOT NULL

选取在 "Address" 列中不带有 NULL 值的记录:

					
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL
					
				

使用 PHP 处理 NULL 值

					
<?php
  $conn = mysqli_connect('localhost', 'root', '123456') or die('连接失败: ' . mysqli_error($conn));
  //设置数据库编码,防止中文乱码
  mysqli_query($conn , "set names utf8");
  //设置了 col2_name 列的值时
  if( isset($col2_name) ) {
   $sql = "SELECT col1_name, col2_name
           FROM  tbl_name
           WHERE col2_name = $col2_name";
  }
  //未设置 col2_name 列的值时
  else {
   $sql = "SELECT runoob_author, runoob_count
           FROM  runoob_test_tbl
           WHERE runoob_count IS NULL";
  }
mysqli_select_db( $conn, 'RUNOOB' );
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
    die('无法读取数据: ' . mysqli_error($conn));
}

mysqli_close($conn);
 ?>