如何正确在数据库查询中使用WHERE子句排除空值?详细写法揭晓!
- 数据库
- 2025-11-14
- 5
在SQL查询中,我们经常需要根据某个字段的值来过滤记录,当这个字段可以包含空值时,我们通常需要使用WHERE子句来指定条件,以确保查询结果只包含非空值的记录,下面我将详细介绍如何在WHERE子句中使用<>(不等于)运算符来过滤非空值,并提供一个示例。
使用<>运算符过滤非空值
在SQL中,<>运算符用于表示“不等于”的关系,当你在WHERE子句中使用<>运算符时,你可以指定一个字段不等于某个特定值,如果你想要过滤掉那些字段值为空的记录,你可以将<>运算符与NULL值结合使用。
以下是一个简单的例子,假设我们有一个名为employees的表,其中包含以下字段:
- employee_id:员工ID
- first_name:员工姓名
- last_name:员工姓氏
- email:员工邮箱地址
如果我们想要查询所有邮箱地址不为空的员工信息,我们可以这样写:

SELECT employee_id, first_name, last_name, email FROM employees WHERE email <> NULL;
上述查询实际上不会返回任何结果,因为NULL不是一个有效的值,你不能直接用<>来比较,为了正确地过滤掉空值,我们需要使用IS NOT NULL语句。
使用IS NOT NULL过滤非空值
要正确地过滤掉字段中的空值,你应该使用IS NOT NULL语句,以下是如何修改上面的查询来正确地获取邮箱地址不为空的员工信息:
SELECT employee_id, first_name, last_name, email FROM employees WHERE email IS NOT NULL;
这个查询会返回所有邮箱地址不为空的员工记录。

示例
假设我们有一个名为orders的表,其中包含以下字段:
- order_id:订单ID
- customer_id:客户ID
- order_date:订单日期
- status:订单状态
如果我们想要查询所有订单状态不是“已取消”的订单,我们可以这样写:
SELECT order_id, customer_id, order_date, status FROM orders WHERE status <> '已取消';
或者,使用IS NOT NULL来过滤掉状态为空的订单:
SELECT order_id, customer_id, order_date, status FROM orders WHERE status IS NOT NULL AND status <> '已取消';
表格示例
下面是一个表格,展示了如何使用<>和IS NOT NULL来过滤不同字段的非空值:

| 字段名 | 查询条件 | 说明 |
|---|---|---|
| email <> NULL | 获取所有邮箱地址不为空的员工信息 | |
| status | status <> ‘已取消’ | 获取所有订单状态不是“已取消”的订单 |
| phone | phone IS NOT NULL | 获取所有电话号码不为空的客户信息 |
| address | address <> ” | 获取所有地址不为空的客户信息(注意:这里假设地址字段不包含NULL) |
FAQs
Q1:为什么不能直接使用<> NULL来过滤空值?
A1: 在SQL中,NULL不是一个有效的值,你不能直接用<>来比较。NULL表示未知或不确定的值,因此<> NULL是一个无效的比较操作。
Q2:如果字段中既有空值也有非空值,如何同时过滤掉空值和非空值?
A2: 如果你需要同时过滤掉字段中的空值和非空值,你可以使用AND运算符将多个条件组合起来,如果你想获取所有订单状态不是“已取消”且订单日期不为空的订单,你可以这样写:
SELECT order_id, customer_id, order_date, status FROM orders WHERE status <> '已取消' AND order_date IS NOT NULL;