---
title: 编组
description: 条件查询 当要查询满足指定条件的数据时，可以通过给 SELECT 查询语句增加一个 WHERE 子句来实现。 条件查询语法 在执行条件查询时，首先通过 FROM 子句之后 WHERE 子句查询出符合指定条件的记录，然后再选取出 SELECT 语句指定的列。 条件查询的 SQL 语句格式如下： SELECT selec…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

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

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

# 条件查询

更新时间：2023-07-18 17:25:59

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

## 条件查询语法

在执行条件查询时，首先通过 `FROM` 子句之后 `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   |     35 |
+---------+--------+
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 |
| ALLEN   |     35 |
| JONES   |     40 |
| SCOTT   |     25 |
| FORD    |     45 |
+---------+--------+
5 rows in set

obclient> SELECT empname, deptno FROM emp WHERE deptno != 30;
+---------+--------+
| EMPNAME | DEPTNO |
+---------+--------+
| SMITH   |     20 |
| ALLEN   |     35 |
| JONES   |     40 |
| SCOTT   |     25 |
| FORD    |     45 |
+---------+--------+
5 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 |
+---------+--------+
| ALLEN   |     35 |
| JONES   |     40 |
| FORD    |     45 |
+---------+--------+
3 rows in set

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

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

obclient> SELECT empname, deptno FROM emp WHERE deptno <= 30;
+---------+--------+
| EMPNAME | DEPTNO |
+---------+--------+
| SMITH   |     20 |
| BLAKE   |     30 |
| SCOTT   |     25 |
+---------+--------+
3 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, sal FROM emp WHERE deptno<=30 AND sal > 1000;
+---------+--------+------+
| EMPNAME | DEPTNO | SAL  |
+---------+--------+------+
| BLAKE   |     30 | 2850 |
| SCOTT   |     25 | 3000 |
+---------+--------+------+
2 rows in set

```

### 或者（OR）

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

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

```

示例如下：

```sql
obclient> SELECT empname, deptno, sal FROM emp WHERE deptno <= 30 OR sal > 1000;
+---------+--------+------+
| EMPNAME | DEPTNO | SAL  |
+---------+--------+------+
| SMITH   |     20 |  800 |
| ALLEN   |     35 | 1600 |
| JONES   |     40 | 2975 |
| BLAKE   |     30 | 2850 |
| SCOTT   |     25 | 3000 |
| FORD    |     45 | 3000 |
+---------+--------+------+
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   |     35 |
+---------+--------+
1 row in set

```

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

```sql
obclient> SELECT empname, deptno FROM emp WHERE empname LIKE 'A%';
+---------+--------+
| EMPNAME | DEPTNO |
+---------+--------+
| ALLEN   |     35 |
+---------+--------+
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 | AGE  |
+-------+---------+---------+------+-----------+------+------+--------+------+
|  1566 | JONES   | MANAGER | 1839 | 02-APR-81 | 2975 | NULL |     40 |   22 |
|  1698 | BLAKE   | MANAGER | 1839 | 01-MAY-81 | 2850 | NULL |     30 |   33 |
+-------+---------+---------+------+-----------+------+------+--------+------+
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 | AGE  |
+-------+---------+---------+------+-----------+------+------+--------+------+
|  1566 | JONES   | MANAGER | 1839 | 02-APR-81 | 2975 | NULL |     40 |   22 |
|  1698 | BLAKE   | MANAGER | 1839 | 01-MAY-81 | 2850 | NULL |     30 |   33 |
+-------+---------+---------+------+-----------+------+------+--------+------+
2 rows in set

```

## NULL 值专用查询（IS NULL/IS NOT 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 | AGE  |
+-------+---------+---------+------+-----------+------+------+--------+------+
|  1369 | SMITH   | CLERK   | 1902 | 17-DEC-80 |  800 | NULL |     20 |   22 |
|  1566 | JONES   | MANAGER | 1839 | 02-APR-81 | 2975 | NULL |     40 |   22 |
|  1698 | BLAKE   | MANAGER | 1839 | 01-MAY-81 | 2850 | NULL |     30 |   33 |
|  1788 | SCOTT   | ANALYST | 1566 | 15-JUL-87 | 3000 | NULL |     25 |   33 |
|  1902 | FORD    | ANALYST | 1566 | 05-DEC-81 | 3000 | NULL |     45 |   22 |
+-------+---------+---------+------+-----------+------+------+--------+------+
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 | AGE  |
+-------+---------+----------+------+-----------+------+------+--------+------+
|  1499 | ALLEN   | SALESMAN | 1698 | 20-FEB-81 | 1600 |  300 |     35 |   22 |
+-------+---------+----------+------+-----------+------+------+--------+------+
1 row 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) 咨询热线
