MySQL基础教程
01、MySQLMariaDB 基础教程
02、MySQL 简介
03、MySQL MariaDB 安装
04、MySQL 管理
05、MySQL 日常管理
06、MySQL PHP 语法
07、MySQL 创建连接
08、MySQL 获取数据库列表
09、MySQL 创建数据库
10、MySQL 删除数据库
11、MySQL 选择数据库
12、MySQL 数据类型
13、MySQL 列出数据表
14、MySQL 创建数据表
15、MySQL 删除表
16、MySQL 插入数据
17、MySQL 获取插入数据的 ID
18、MySQL SELECT FROM 查询数据
19、MySQL WHERE 子句有条件的查询数据
20、MySQL UPDATE 更新数据
21、MySQL DELETE FROM 语句删除数据
22、MySQL 返回删改查受影响的行数
23、MySQL LIKE 子句模糊查询数据
24、MySQL UNION 操作符查询多张表
25、MySQL ORDER BY 排序
26、MySQL GROUP BY 分组查询数据
27、MySQL JOIN 进行多表查询
28、MySQL NULL 值处理
29、MySQL REGEXP 子句正则表达式查询
30、MySQL 数据库事务
31、MySQL ALTER 命令
32、MySQL 索引
33、CREATE TEMPORARY TABLE 创建临时表
34、MySQL DROP TABLE 删除临时表
35、MySQL INSERT INTO SELECT 复制表
36、MySQL 获取服务器元数据
37、MySQL 自增序列 AUTO_INCREMENT
38、MySQL 处理重复数据
39、MySQL 安全及防止 SQL 注入攻击
40、MySQL 导出数据
41、MySQL 导入数据
本文档使用 MrDoc 发布
-
+
首页
28、MySQL NULL 值处理
我们在创建表的时候可以让某个字段为空,比如下面的创建 `tbl_language` 的语句 ```python CREATE TABLE IF NOT EXISTS tbl_language( id INT UNSIGNED AUTO_INCREMENT, name VARCHAR(64) NOT NULL, url VARCHAR(128) NOT NULL, founded_at DATE, PRIMARY KEY ( id ) )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 因为 `founded_at` 没有明确指明 `NOT NULL` ,所以它是可以为空的 然后我们运行下面的语句插入数据 ```python truncate tbl_language; INSERT INTO tbl_language VALUES (1,'Python','https://baidu.com','1991-2-20'), (2,'PHP','http://www.php.net','1994-1-1'), (3,'Ruby','https://www.ruby-lang.org/','1996-12-25'), (4,'Kotlin','http://kotlinlang.org/','2016-02-17'); INSERT INTO tbl_language (name,url) VALUES ('Perl','http://www.perl.org/'), ('Scala','http://www.scala-lang.org/'); ``` 使用不带 `WHERE` 的 `SELECT` 语句可以看到 6 条记录 ```python MariaDB [souyunku]>` SELECT * FROM tbl_language; +----+--------+----------------------------+------------+ | id | name | url | founded_at | +----+--------+----------------------------+------------+ | 1 | Python | https://baidu.com | 1991-02-20 | | 2 | PHP | http://www.php.net | 1994-01-01 | | 3 | Ruby | https://www.ruby-lang.org/ | 1996-12-25 | | 4 | Kotlin | http://kotlinlang.org/ | 2016-02-17 | | 5 | Perl | http://www.perl.org/ | NULL | | 6 | Scala | http://www.scala-lang.org/ | NULL | +----+--------+----------------------------+------------+ ``` 使用下面的语句查找 `founded_at` 为 `NULL` 的数据 ```python SELECT * FROM tbl_language WHERE founded_at = NULL; ``` 运行结果显示 0 条记录 ```python MariaDB [souyunku]>` SELECT * FROM tbl_language WHERE founded_at = NULL; Empty set (0.01 sec) ``` 我们要怎么把 `founded_at` 为 `NULL` 的查找出来呢? ### **MYSQL NULL** `WHERE` 子句中的 `NULL` 值时比较特殊的 我们不能使用 `= NULL` 或 `!= NULL` 在列中查找 `NULL` 值 MySQL 中,`NULL` 值与任何其它值的比较 ( 即使是 `NULL` ) 永远返回 `false`,即 `NULL = NULL` 返回 `false` 为了处理这种情况,MySQL 提供了三大运算符用来处理 `NULL` 值的情况 | 运算符 | 说明 | | --- | --- | | IS NULL | 当列的值是 NULL,此运算符返回 true | | IS NOT NULL | 当列的值不为 NULL, 运算符返回 true | | <=> | 比较操作符(不同于 = 运算符),当比较的的两个值为 NULL 时返回 true | 我们经常使用的就是 `IS NULL` 和 `IS NOT NULL` 运算符 ### **在命令提示符中使用 NULL 值** 既然我们已经掌握了 MySQL 中如何使用 `NULL`,那么查询 `founded_at` 为 `NULL` 的记录就非常简单了 ```python SELECT * FROM tbl_language WHERE founded_at is NULL; ``` 运行结果如下 ```python MariaDB [souyunku]>` SELECT * FROM tbl_language WHERE founded_at is NULL; +----+-------+----------------------------+------------+ | id | name | url | founded_at | +----+-------+----------------------------+------------+ | 5 | Perl | http://www.perl.org/ | NULL | | 6 | Scala | http://www.scala-lang.org/ | NULL | +----+-------+----------------------------+------------+ 2 rows in set (0.00 sec) ``` 哇,查出来了,查出来了,有两条 然后可以使用下面的语句查找 `founded_at` 不是 `NULL` 的记录 ```python SELECT * FROM tbl_language WHERE founded_at is NOT NULL; ``` 运行结果如下 ```python MariaDB [souyunku]>` SELECT * FROM tbl_language WHERE founded_at is NOT NULL; +----+--------+----------------------------+------------+ | id | name | url | founded_at | +----+--------+----------------------------+------------+ | 1 | Python | https://baidu.com | 1991-02-20 | | 2 | PHP | http://www.php.net | 1994-01-01 | | 3 | Ruby | https://www.ruby-lang.org/ | 1996-12-25 | | 4 | Kotlin | http://kotlinlang.org/ | 2016-02-17 | +----+--------+----------------------------+------------+ 4 rows in set (0.00 sec) ``` 注意: 因为 `NULL` 只有简单的判断操作,所以在日常开发中,创建字段时应该使用 `NOT NULL` 来避免数据为 `NULL` 的情况 ### **在 PHP 脚本中使用处理 NULL 值** 在PHP 脚本中使用处理 NULL 值有两种方法: 1、 把所有的数据查找出来,然后一条一条去判断是否为null; 2、 在SQL语句中使用isNULL或者isNOTNULL来筛选; PHP可以使用 `PDO::query()` 函数来查询某个表中的数据 **PDO::query() 函数原型** PDO::query() 有四个函数重载 ```python PDOStatement PDO::query ( string $statement ) PDOStatement PDO::query ( string $statement , int $PDO::FETCH_COLUMN , int $colno ) PDOStatement PDO::query ( string $statement , int $PDO::FETCH_CLASS , string $classname , array $ctorargs ) PDOStatement PDO::query ( string $statement , int $PDO::FETCH_INTO , object $object ) ``` 如果成功,`PDO::query()` 返回 PDOStatement 对象,如果失败返回 FALSE | 参数 | 说明 | | --- | --- | | statement | 要被预处理和执行的 SQL 语句,查询中的数据应该被妥善地转义 | 第二个参数有以下几个可选值,默认为 `PDO::FETCH_BOTH` | 值 | 说明 | | --- | --- | PDO::FETCH_ASSOC |返回一个索引为结果集列名的数组 PDO::FETCH_BOTH |默认,返回一个索引为结果集列名和以0开始的列号的数组 PDO::FETCH_BOUND |返回 TRUE ,并分配结果集中的列值给 PDOStatement::bindColumn() 方法绑定的 PHP 变量 PDO::FETCH_CLASS |返回一个请求类的新实例,映射结果集中的列名到类中对应的属性名。如果 fetch_style 包含PDO::FETCH_CLASSTYPE,(例如:PDO::FETCH_CLASS,PDO::FETCH_CLASSTYPE),则类名由第一列的值决定 PDO::FETCH_INTO |更新一个被请求类已存在的实例,映射结果集中的列到类中命名的属性 PDO::FETCH_LAZY| 结合使用 PDO::FETCH_BOTH 和 PDO::FETCH_OBJ,创建供用来访问的对象变量名 PDO::FETCH_NUM |返回一个索引为以0开始的结果集列号的数组 PDO::FETCH_OBJ |返回一个属性名对应结果集列名的匿名对象 我们使用默认的` PDO::FETCH_BOTH` 获取所有数据 ```php <?php $dbh = new PDO('mysql:host=127.0.0.1;dbname=souyunku', 'root', ''); // 把所有的数据查出来 $sql= "SELECT * FROM tbl_language"; $stmt = $dbh->query($sql); foreach($stmt as $row) // 判断是否为空,如果为空则输出数据 if ( $row['founded_at'] === NULL ) { print_r($row); } echo "\n------------------------------------------\n"; // 只查找 founded_at 为 NULL 的数据 $sql= "SELECT * FROM tbl_language WHERE founded_at is NULL"; $stmt = $dbh->query($sql); foreach($stmt as $row) print_r($row); ``` 输出结果如下 ```php $ php main.php Array [id] => 5 [0] => 5 [name] => Perl [1] => Perl [url] => http://www.perl.org/ [2] => http://www.perl.org/ [founded_at] => [3] => Array [id] => 6 [0] => 6 [name] => Scala [1] => Scala [url] => http://www.scala-lang.org/ [2] => http://www.scala-lang.org/ [founded_at] => [3] => ------------------------------------------ Array [id] => 5 [0] => 5 [name] => Perl [1] => Perl [url] => http://www.perl.org/ [2] => http://www.perl.org/ [founded_at] => [3] => Array [id] => 6 [0] => 6 [name] => Scala [1] => Scala [url] => http://www.scala-lang.org/ [2] => http://www.scala-lang.org/ [founded_at] => [3] => ``` 两者数据的记录一模一样
李智
2025年3月17日 13:31
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码