---
title: "条件查询 | OceanBase 文档中心"
description: 条件查询 当要查询满足特定条件的数据时，可以通过给 SELECT 查询语句增加一个 WHERE 子句来实现。 条件查询语法 在执行条件查询时，首先通过 WHERE 子句查询出符合指定条件的记录，然后再通过 SELECT 语句选取指定的列。 条件查询的 SQL 语句格式如下： SELECT select_list FR…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.0.0 企业版

# 条件查询

更新时间：2026-05-27 12:34:28

当要查询满足特定条件的数据时，可以通过给 SELECT 查询语句增加一个 WHERE 子句来实现。

## 条件查询语法

在执行条件查询时，首先通过 `WHERE` 子句查询出符合指定条件的记录，然后再通过 `SELECT` 语句选取指定的列。

条件查询的 SQL 语句格式如下：

```sql
SELECT select_list FROM table_list
WHERE query_condition

```

关键字 `WHERE` 后面可以带有一个或者多个条件。条件是对前面数据的筛选，只有满足 `WHERE` 条件的数据才会被返回。

## 常用的查询条件

`WHERE` 子句常用的查询条件如下表所示。

| 查询条件类型 | 谓词 |
| --- | --- |
| 比较查询 | =，>，<，>=，<=，!=，<> |
| 逻辑查询（多重条件） | AND，OR，NOT |
| 模糊查询（字符匹配） | LIKE，NOT LIKE |
| 区间查询（确定范围） | BETWEEN AND，NOT BETWEEN AND |
| 指定集合查询 | IN，NOT IN |
| NULL 值查询 | IS NULL，IS NOT NULL |

## 比较条件查询

比较条件查询运算符包括 `=`，`>`，`<`，`>=`，`<=`，`!=`，`<>`。

### 等于（=）

查询出指定列中和目标值相等的数据。如果值是字符串类型，需要用单引号或者双引号括起来。一般格式为：

```sql
SELECT column_name [,column_name...] FROM table_name WHERE column_name = const_value;

```

示例如下：

```sql
obclient> SELECT empname, deptno FROM emp WHERE deptno = 30;
+---------+--------+
| empname | deptno |
+---------+--------+
| ALLEN   |     30 |
| BLAKE   |     30 |
+---------+--------+
2 rows in set

obclient> SELECT empname, deptno FROM emp WHERE deptno = '30';
+---------+--------+
| empname | deptno |
+---------+--------+
| ALLEN   |     30 |
| BLAKE   |     30 |
+---------+--------+
2 rows in set

obclient> SELECT empname, deptno FROM emp WHERE empname = 'ALLEN';
+---------+--------+
| empname | deptno |
+---------+--------+
| ALLEN   |     30 |
+---------+--------+
1 row in set

```

### 不等于（<> 和 !=）

不等于包括 `<>` 和 `!=` 两种写法。一般格式为：

```sql
SELECT column_name [,column_name...] FROM table_name WHERE column_name <> const_value;
SELECT column_name [,column_name...] FROM table_name WHERE column_name != const_value;

```

示例如下：

```sql
obclient> SELECT empname, deptno FROM emp WHERE deptno <> 30;
+---------+--------+
| empname | deptno |
+---------+--------+
| SMITH   |     20 |
| JONES   |     40 |
| SCOTT   |     20 |
| FORD    |     40 |
+---------+--------+
4 rows in set

obclient> SELECT empname, deptno FROM emp WHERE deptno != 30;
+---------+--------+
| empname | deptno |
+---------+--------+
| SMITH   |     20 |
| JONES   |     40 |
| SCOTT   |     20 |
| FORD    |     40 |
+---------+--------+
4 rows in set

```

### 大于（>）和小于（<）

大于（`>`）和小于（`<`）将数值按照大小比较。如果比较的是字符，则按照 ASCII 码对应的值进行比较，比较时按照字符对应的位置逐一进行比较。一般格式为：

```sql
SELECT column_name [,column_name...] FROM table_name WHERE column_name < const_value;
SELECT column_name [,column_name...] FROM table_name WHERE column_name > const_value;

```

> **说明**
>
>  
>
> 大于等于（>=）和小于等于（<=）与之类似。

示例如下：

```sql
obclient> SELECT empname, deptno FROM emp WHERE deptno > 30;
+---------+--------+
| empname | deptno |
+---------+--------+
| JONES   |     40 |
| FORD    |     40 |
+---------+--------+
2 rows in set

obclient> SELECT empname, deptno FROM emp WHERE deptno >= 30;
+---------+--------+
| empname | deptno |
+---------+--------+
| ALLEN   |     30 |
| JONES   |     40 |
| BLAKE   |     30 |
| FORD    |     40 |
+---------+--------+
4 rows in set

obclient> SELECT empname, deptno FROM emp WHERE deptno < 30;
+---------+--------+
| empname | deptno |
+---------+--------+
| SMITH   |     20 |
| SCOTT   |     20 |
+---------+--------+
2 rows in set

obclient> SELECT empname, deptno FROM emp WHERE deptno <= 30;
+---------+--------+
| empname | deptno |
+---------+--------+
| SMITH   |     20 |
| ALLEN   |     30 |
| BLAKE   |     30 |
| SCOTT   |     20 |
+---------+--------+
4 rows in set

```

## 逻辑条件查询

逻辑查询运算符并且（`AND`）和或者（`OR`）支持多个条件的查询。

### 并且（AND）

返回同时满足 `AND` 两个条件的数据。一般格式为：

```sql
SELECT column_name [,column_name...] FROM table_name WHERE
query_condition AND query_condition;

```

示例如下：

```sql
obclient> SELECT empname, deptno FROM emp WHERE deptno <=30 AND sal>1000;
+---------+--------+---------+
| empname | deptno | sal     |
+---------+--------+---------+
| ALLEN   |     30 | 1600.00 |
| BLAKE   |     30 | 2850.00 |
| SCOTT   |     20 | 3000.00 |
+---------+--------+---------+
3 rows in set

```

### 或者（OR）

只要满足其中一个条件的数据都会被返回。一般格式为：

```sql
SELECT column_name [,column_name...] FROM table_name WHERE
query_condition OR query_condition;

```

示例如下：

```sql
obclient> SELECT empname, deptno FROM emp WHERE deptno<=30 OR sal>1000;
+---------+--------+---------+
| empname | deptno | sal     |
+---------+--------+---------+
| SMITH   |     20 |  800.00 |
| ALLEN   |     30 | 1600.00 |
| JONES   |     40 | 2975.00 |
| BLAKE   |     30 | 2850.00 |
| SCOTT   |     20 | 3000.00 |
| FORD    |     40 | 3000.00 |
+---------+--------+---------+
6 rows in set

```

## 模糊查询（LIKE）

谓词 `LIKE` 可以用来进行字符串的匹配。一般格式如下：

```sql
[NOT] LIKE pattern

```

语法含义是查找对应列值与 `pattern` 相匹配的数据。`pattern` 可以是完整的字符串，也可以包含通配符 `%` 和 `_` 。其中：

- 下划线 (_) 表示匹配任意一个字符。
 - 百分号 (%) 表示可以匹配值中的零个或多个字符。模式"%"不能匹配 `NULL`。

如下示例为查询员工名前四个字母为"ALLE"，最后一个为任意字符的数据。

```sql
obclient> SELECT empname, deptno FROM emp WHERE empname LIKE 'ALLE_';
+---------+--------+
| empname | deptno |
+---------+--------+
| ALLEN   |     30 |
+---------+--------+
1 row in set

```

如下示例为查询员工姓名首字母为"A"的数据。

```sql
obclient> SELECT empname, deptno FROM emp WHERE empname LIKE 'A%';
+---------+--------+
| empname | deptno |
+---------+--------+
| ALLEN   |     30 |
+---------+--------+
1 row in set

```

> **注意**
>
>  
>
> 当数据库字集为 ASCII 时一个汉字需要两个 `_`；当字符集为 GBK 时只需要一个 `_`。

## 区间查询（BETWEEN AND）

操作符 `BETWEEN ... AND` 会选取介于两个值之间的数据。这些值可以是数值、文本或者日期。一般格式为：

```sql
SELECT column_name [,column_name...] FROM table_name WHERE
[NOT] BETWEEN min_const_value AND max_const_value;

```

> **注意**
>
>  
>
> 区间查询的两个临界值不要调换位置，只能是大于等于左边的值，并且小于等于右边的值。

示例如下：

```sql
obclient> SELECT * FROM emp WHERE sal BETWEEN 2000 AND 2999;
+-------+---------+---------+------+------------+---------+------+--------+
| empno | empname | job     | mgr  | hiredate   | sal     | comm | deptno |
+-------+---------+---------+------+------------+---------+------+--------+
|  1566 | JONES   | MANAGER | 1839 | 1981-04-02 | 2975.00 | NULL |     40 |
|  1698 | BLAKE   | MANAGER | 1839 | 1981-05-01 | 2850.00 | NULL |     30 |
+-------+---------+---------+------+------------+---------+------+--------+
2 rows in set

```

## 指定集合查询（IN）

操作符 `IN` 在 `WHERE` 子句指定的多个值，称之为一个集合。`IN` 表示指定列中的数据只要满足集合中任意一个都会被返回。`NOT IN` 表示和集合中都不匹配的数据才会被返回。一般格式为：

```sql
SELECT column_name [,column_name...] FROM table_name WHERE
column_name [NOT] IN (const_value,const_value,const_value...);

```

> **注意**
>
>  
>
> - `[NOT] IN` 集合中的值类型必须一致或相互兼容。
>  - `[NOT] IN` 集合中的值不支持通配符。

示例如下：

```sql
obclient> SELECT * FROM emp WHERE deptno IN (30,40,50,60);
+-------+---------+----------+------+------------+---------+--------+--------+
| empno | empname | job      | mgr  | hiredate   | sal     | comm   | deptno |
+-------+---------+----------+------+------------+---------+--------+--------+
|  1499 | ALLEN   | SALESMAN | 1698 | 1981-02-20 | 1600.00 | 300.00 |     30 |
|  1566 | JONES   | MANAGER  | 1839 | 1981-04-02 | 2975.00 |   NULL |     40 |
|  1698 | BLAKE   | MANAGER  | 1839 | 1981-05-01 | 2850.00 |   NULL |     30 |
|  1902 | FORD    | ANALYST  | 1566 | 1981-12-05 | 3000.00 |   NULL |     40 |
+-------+---------+----------+------+------------+---------+--------+--------+
4 rows in set

```

## NULL 值专用查询

由于比较运算符、`LIKE`、`BETWEEN AND`、`IN`、`NOT IN` 对 `NULL` 值的查询结果不准确，所以建议使用 NULL 值专用查询语句 `IS NULL` 和 `IS NOT NULL`。

### IS NULL

`IS NULL` 用于查询指定的列的值为 `NULL` 的数据。一般格式为：

```sql
SELECT column_name [,column_name...] FROM table_name WHERE
column_name IS NULL;

```

示例如下：

```sql
obclient> SELECT * FROM emp WHERE comm IS NULL;
+-------+---------+---------+------+------------+---------+------+--------+
| empno | empname | job     | mgr  | hiredate   | sal     | comm | deptno |
+-------+---------+---------+------+------------+---------+------+--------+
|  1369 | SMITH   | CLERK   | 1902 | 1980-12-17 |  800.00 | NULL |     20 |
|  1566 | JONES   | MANAGER | 1839 | 1981-04-02 | 2975.00 | NULL |     40 |
|  1698 | BLAKE   | MANAGER | 1839 | 1981-05-01 | 2850.00 | NULL |     30 |
|  1788 | SCOTT   | ANALYST | 1566 | 1987-07-15 | 3000.00 | NULL |     20 |
|  1902 | FORD    | ANALYST | 1566 | 1981-12-05 | 3000.00 | NULL |     40 |
+-------+---------+---------+------+------------+---------+------+--------+
5 rows in set

```

### IS NOT NULL

`IS NOT NULL` 用于查询指定的列的值为非 `NULL` 的数据。一般格式为：

```sql
SELECT column_name [,column_name...] FROM table_name WHERE
column_name IS NOT NULL;

```

示例如下：

```sql
obclient> SELECT * FROM emp WHERE comm IS NOT NULL;
+-------+---------+----------+------+------------+---------+--------+--------+
| empno | empname | job      | mgr  | hiredate   | sal     | comm   | deptno |
+-------+---------+----------+------+------------+---------+--------+--------+
|  1499 | ALLEN   | SALESMAN | 1698 | 1981-02-20 | 1600.00 | 300.00 |     30 |
+-------+---------+----------+------+------------+---------+--------+--------+
1 row in set

```

除此之外，还可以使用安全等于（`<=>`），其既可以判断普通的数值，也可以判断 `NULL` 值。示例如下：

```sql
obclient> SELECT empname, comm FROM emp WHERE comm <=> NULL;
+---------+------+
| empname | comm |
+---------+------+
| SMITH   | NULL |
| JONES   | NULL |
| BLAKE   | NULL |
| SCOTT   | NULL |
| FORD    | NULL |
+---------+------+
5 rows in set

```

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
