Oracle、MySQL、PostGreSQL、SQL Server-空值

Oracle、MySQL、PostGreSQL、SQL Server-null value

最近几年数据库市场百花齐放,在做跨数据库迁移的数据库选型时,除了性能、稳定、安全、运维、功能、可扩展外,像开发中对于值的处理往往容易被人忽视, 之前写过一篇关于PG区别Oracle在SQL解析缓存的笔记《PostgreSQL 12 : Prepare statement和plan_cache_mode 参数》,这里记录一下null 值在这几个数据库中的区别。

软件版本:Oracle 21c 、SQL Server 2019 、MySQL 8.0 、Mariadb 10.6 、PostGreSQL 13、OpenGauss 2.0

创建测试用例表

CREATE TABLE tab_null(id int, name char(10));
 
INSERT INTO tab_null VALUES(1,'anbob');
INSERT INTO tab_null VALUES(2,NULL);

测试数据过滤

# oracle
SQL> select * from tab_null where name is null;
        ID NAME
---------- ----------
         2

SQL> select * from tab_null where name is not null;
        ID NAME
---------- ----------
         1 anbob

SQL> select * from tab_null where name=null;
no rows selected

SQL> select * from tab_null where null=null;
no rows selected

# postgresql
postgres=# select * from tab_null where name is null;
 id | name
----+------
  2 |
(1 row)

postgres=# select * from tab_null where name is not null;
 id |    name
----+------------
  1 | anbob
(1 row)

postgres=# select * from tab_null where name=null;
 id | name
----+------
(0 rows)

postgres=# select * from tab_null where null=null;
 id | name
----+------
(0 rows)

# MySQL/MariaDB
mysql> select * from tab_null where name is null;
+------+------+
| id   | name |
+------+------+
|    2 | NULL |
+------+------+
1 row in set (0.00 sec)

mysql> select * from tab_null where name is not null;
+------+-------+
| id   | name  |
+------+-------+
|    1 | anbob |
+------+-------+
1 row in set (0.00 sec)

mysql> select * from tab_null where name=null;
Empty set (0.00 sec)

mysql> select * from tab_null where null=null;
Empty set (0.00 sec)

# SQL Server

select * from tab_null where name is null;
        ID NAME
---------- ----------
         2

select * from tab_null where name is not null;
        ID NAME
---------- ----------</
<think>首先,用户的问题是:“我想在SQL中如何表示空值 请问SQL 中表示空值的语法”。这直接询问SQL中表示空值的语法。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式。但这个问题是关于SQL的,没有数学表达式,所以可能不需要。 - 独立公式必须使用$$...$$格式并单独成段。同样,这里可能不适用。 - LaTeX语法正确:确保任何数学部分正确使用LaTeX。 - 使用中文回答:整个回答必须用中文。 - 生成相关问题:在回答结束后,生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识:例如[^1]。参考提供的引用,我需要引用相关内容。 提供的引用是: - 引用[1]: 关于SQL中IS NULL和IS NOT NULL语法。 - 引用[2]: 关于SQL处理空值的函数如CASE WHEN、COALESCE等。 - 引用[3]: 关于MyBatis-Plus中isNull的用法。 用户的问题是关于SQL中表示空值的语法,所以我应该基于这些引用构建回答。 关键点: -SQL中,空值用NULL表示。 - 要检查一个字段是否为NULL,使用IS NULL或IS NOT NULL。 - 引用[1]直接给出了语法:SELECT column_names FROM table_name WHERE column_name IS NULL; - 引用[2]提到了其他处理空值的函数。 - 引用[3]强调了在MyBatis-Plus中正确使用isNull。 回答结构: 1. **清晰介绍**:解释SQL空值的概念。 2. **语法说明**:详细说明如何表示和检查空值。 3. **引用相关内容**:自然地融入引用。 4. **结束生成相关问题**:根据指令。 回答大纲: - 开头:用中文解释SQL空值的表示。 - 主体:描述语法,包括IS NULL和IS NOT NULL,以及可能的例子。 - 引用:在描述时添加引用标识。 - 结尾:生成相关问题。 相关问题生成:基于主题,如SQL处理空值的最佳实践、常见错误等。 最终回答格式: - 结构清晰,逐步解决问题。 - 使用中文。 - 添加相关问题。</think>### SQL 中表示空值的语法 在 SQL 中,空值表示一个字段没有值或值未知,它用关键字 `NULL` 来表示。`NULL` 不同于空字符串或零值,它代表缺失或未定义的数据。以下我将逐步解释 SQL 中表示和处理空值的基本语法,确保回答基于可靠参考。关键点包括如何检查空值、使用 `IS NULL` 和 `IS NOT NULL` 语法,以及一些相关函数。这些内容参考了 SQL 标准实践和常见数据库系统(如 MySQLPostgreSQL 等)。 #### 1. **表示空值的基本语法** -SQL 查询中,直接使用 `NULL` 关键字来表示空值。例如: - 在 `WHERE` 子句中检查字段是否为空:`WHERE column_name IS NULL;` - 在 `WHERE` 子句中检查字段是否不为空:`WHERE column_name IS NOT NULL;` - 注意:不能使用等号(如 `= NULL`)来比较空值,因为 `NULL` 代表未知值,任何与 `NULL` 的比较都会返回 `NULL`(即假),这可能导致错误结果[^1][^3]。 - 示例查询: ```sql -- 查询 table_name 表中 column_name 字段为空的记录 SELECT column_names FROM table_name WHERE column_name IS NULL; ``` 这个语法会返回所有 `column_name` 为 `NULL` 的行。类似地,`IS NOT NULL` 用于过滤非空值。 #### 2. **插入或更新空值** - 在 `INSERT` 或 `UPDATE` 语句中,可以直接将字段设置为 `NULL`: ```sql -- 插入记录时设置字段为空 INSERT INTO table_name (column1, column2) VALUES ('value1', NULL); -- 更新记录时设置字段为空 UPDATE table_name SET column_name = NULL WHERE condition; ``` 这表示将 `column_name` 显式设置为空值。 #### 3. **处理空值的相关函数** - SQL 提供了多个函数来处理空值,以避免逻辑错误: - **`COALESCE()` 函数**:返回第一个非空值。例如,`COALESCE(column_name, 'default')` 会在 `column_name` 为空时返回 'default'。 - **`CASE WHEN` 语句**:用于条件处理,如 `CASE WHEN column_name IS NULL THEN 'Missing' ELSE column_name END`。 - **`IFNULL()` 或 `NVL()`(数据库特定)**:在 MySQL 中,`IFNULL(column_name, 'backup')` 类似 `COALESCE`;在 Oracle 中,使用 `NVL()`。 - 这些函数帮助在查询中优雅地处理空值,防止意外行为[^2]。 #### 4. **注意事项** - **常见错误**:使用 `= NULL` 而不是 `IS NULL` 会导致查询不返回任何结果,因为 `NULL` 不能通过等号比较。这在 MyBatis-Plus 等 ORM 框架中也常见,需要使用 `isNull()` 方法而非等号[^3]。 - **性能影响**:空值可能影响索引使用,建议在数据库设计时考虑默认值或约束(如 `NOT NULL`)来优化。 - **数据库兼容性**:语法在大多数 SQL 数据库(如 MySQLPostgreSQLSQL Server)中通用,但函数名称可能略有差异(例如,MySQL 的 `IFNULL` vs. PostgreSQL 的 `COALESCE`)。 总之,SQL 中表示空值的关键是使用 `NULL` 关键字,并结合 `IS NULL` 或 `IS NOT NULL` 进行查询。通过函数如 `COALESCE` 可以简化空值处理。如果您有具体数据库系统或场景,我可以提供更针对性的建议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值