---
title: "SELECT - OceanBase 数据库 V4.2.1 | OceanBase 文档中心"
description: SELECT 描述 该语句用于从一个或多个表中查询数据。 本节主要介绍通用的 SELECT 语法结构。其他 SELECT 相关的语法，参见： JOIN 子句 OVER 子句 UNION 子句 SELECT INTO 权限要求 执行 SELECT 语句，需要当前用户拥有 SELECT 权限。有关 OceanBase 数…
---
切换语言

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

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

# SELECT

更新时间：2026-07-15 20:56:55

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.2.1/zh-CN/700.reference/500.sql-reference/100.sql-syntax/200.common-tenant-of-mysql-mode/600.sql-statement-of-mysql-mode/8100.select-of-mysql-mode/100.select-of-mysql-mode.md)  

## 描述

该语句用于从一个或多个表中查询数据。

本节主要介绍通用的 `SELECT` 语法结构。其他 `SELECT` 相关的语法，参见：

- [JOIN 子句](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000222203)
 - [OVER 子句](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000222206)
 - [UNION 子句](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000222204)
 - [SELECT INTO](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000221375)

## 权限要求

执行 `SELECT` 语句，需要当前用户拥有 `SELECT` 权限。有关 OceanBase 数据库权限的详细介绍，参见 [MySQL 模式下的权限分类](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220876)。

## 语法

```sql
select_stmt:
    SELECT [hint_options]
        [{DISTINCT | UNIQUE} | ALL]
        [SQL_CACHE | SQL_NO_CACHE]
        [SQL_CALC_FOUND_ROWS]
        select_expr_list
        [FROM from_list]
        [WHERE where_condition]
        [GROUP BY group_by_condition_list [WITH ROLLUP]]
        [HAVING having_condition]
        [window_clause]
        [ORDER BY order_by_condition_list]
        [LIMIT limit_clause]
        [lock_option];

select_expr_list:
    select_expr [, select_expr ...]

select_expr:
    *
    | table_name.{* | column_name}
    | table_alias_name.{* | column_name}
    | expr [[AS] column_alias_name]

from_list:
    DUAL
    | table_references

where_condition:
    expression

group_by_condition_list:
    group_by_condition [, group_by_condition ...]

group_by_condition:
    expression [ASC | DESC]

having_condition:
    expression

order_by_condition_list:
    order_by_condition [, order_by_condition ...]

order_by_condition:
    expression [ASC | DESC]

limit_clause:
    [offset,] row_count
    | row_count OFFSET offset

lock_option:
    FOR UPDATE [opt_for_update_wait]
    | LOCK IN SHARE MODE

opt_for_update_wait:
    WAIT {decimal | intnum}
    | NOWAIT
    | NO_WAIT

```

## 参数解释

| 参数 | 描述 |
| --- | --- |
| select_stmt | 用来指定要从数据库中检索哪些数据的 SQL 语句部分。 |
| hint_options | 可选项，用于指定 `hint` 选项。有关 Hint 的介绍信息，参见 [Optimizer Hint](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220955)。 |
| {DISTINCT \| UNIQUE} \| ALL | 可选项，用于控制返回的结果集中是否包含重复的行。   - `DISTINCT`/`UNIQUE`：表示返回的结果集中不包含重复行。 - `ALL`：表示查询结果中包含所有的行，包括重复的行。缺省为 `ALL`。 |
| SQL_CACHE \| SQL_NO_CACHE | 可选项，用于控制查询结果是否被缓存。   - `SQL_CACHE`：表示查询结果会被缓存。 - `SQL_NO_CACHE`：表示查询结果不会被缓存。 |
| SQL_CALC_FOUND_ROWS | 可选项，用于在带有 `LIMIT` 子句的查询中，记录全部返回的行数，并可以在接下来执行的 `FOUND_ROWS()` 函数获取全部行数。 |
| select_expr_list | 指定要在查询结果中显示的列或表达式列表。查询出列或表达式的详细介绍可参见下文 [select_expr](#select_expr)。 |
| column_name | 列名称。 |
| FROM from_list | 可选项，指定查询的数据源，可以是表、视图或者子查询。数据源的详细介绍可参见下文 [from_list](#from_list)。 |
| WHERE where_condition | 可选项，指定查询的筛选条件。详细介绍可参见下文 [where_condition](#where_condition)。 |
| GROUP BY group_by_condition_list | 可选项，用于按照指定的列对结果进行分组。通常与聚合函数一起使用。详细介绍可参见下文 [group_by_condition](#group_by_condition)。 |
| WITH ROLLUP | 可选项，将各分组进行汇总以表示更高级的聚合（也称为超聚合），并产生额外的行。 |
| HAVING having_condition | 可选项，用于对分组后的结果进行条件过滤。`HAVING` 字句与 `WHERE` 字句类似，但是 `HAVING` 字句可以使用聚合函数（如 `SUM`，`AVG` 等）。详细介绍可参见下文 [having_condition](#having_condition)。 |
| window_clause | 可选项，用于指定分析函数（某些数据库下也叫做窗口函数）的窗口定义。`window_clause` 的详细语法信息，参见 [WINDOW 子句](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000222206)。 |
| ORDER BY order_by_condition_list | 可选项，用于对结果集进行排序。可以指定一个或多个列进行排序。详细介绍可参见下文 [order_by_condition](#order_by_condition)。 |
| LIMIT limit_clause | 可选项，用于指定限制返回结果的数量（行数）。详细介绍可参见下文 [limit_clause](#limit_clause)。 |
| lock_option | 可选项，用于对查询结果加锁。详细介绍可参见下文 [lock_option](#lock_option)。 |

### select_expr

`select_expr`：表示查询结果中包含的列或表达式，多个表达式或列名间以英文逗号（`,`）分隔。取值如下：

- `*`：表示选择所有列。

  **示例如下：**

     1. 创建表 `tbl1` 和 `tbl2`。

       ```sql
       CREATE TABLE tbl1(col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT)
         PARTITION BY HASH(col1)
         PARTITIONS 5;

       ```

       ```sql
       CREATE TABLE tbl2(col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT);

       ```
     2. 向表 `tbl1` 中插入测试数据。

       ```sql
       INSERT INTO tbl1 VALUES (1, 'A1', 1),(2, 'A2', 2),(3, 'A3', 3);

       ```

       ```sql
       INSERT INTO tbl2 VALUES (1, 'A1', 1),(2, 'A2', 22),(3, 'A3', 33);

       ```
     3. 查看表 `tbl1` 中的数据。

       ```sql
       SELECT * FROM tbl1;

       ```

       返回结果如下：

       ```shell
       +------+------+------+
       | col1 | col2 | col3 |
       +------+------+------+
       |    1 | A1   |    1 |
       |    2 | A2   |    2 |
       |    3 | A3   |    3 |
       +------+------+------+
       3 rows in set

       ```
 - `table_name.{* | column_name}`：表示选择指定表中的所有列或者指定列。

     - `table_name.*`：表示选择指定表中的所有列。
     - `table_name.column_name`：表示选择指定表中的某一列。

      **示例如下：**

      从表 `tbl1` 中读取 `col1` 数据。

      ```sql
      SELECT tbl1.col1 FROM tbl1;

      ```

      返回结果如下：

      ```shell
      +------+
      | col1 |
      +------+
      |    1 |
      |    2 |
      |    3 |
      +------+
      3 rows in set

      ```
 - `table_alias_name.{* | column_name}`: 和上面的格式类似，只是在选择列的时候使用了表的别名。
 - `expr [[AS] column_alias_name]`：表示选择一个表达式，并可以给这个选中的表达式起一个别名作为列的名称。

     - `expr`：表示一个列名、函数、计算表达式等。

           - `expr AS column_alias_name`/`expr column_alias_name`：表示选择这个表达式，并将其命名为`column_alias_name`。

  **示例如下：**

  从表 `tbl1` 中读取 `col1` 的数据，并计算得出新列 `col1_add`，其值为 `col1+1`。另外还通过计算 `col3*2` 得出新列 `col3_mul`。

  ```sql
  SELECT col1, col1+1 AS col1_add, col3*2 col3_mul FROM tbl1;

  ```

  返回结果如下：

  ```shell
  +------+----------+----------+
  | col1 | col1_add | col3_mul |
  +------+----------+----------+
  |    1 |        2 |        2 |
  |    2 |        3 |        4 |
  |    3 |        4 |        6 |
  +------+----------+----------+
  3 rows in set

  ```

### from_list

- `DUAL`：表示虚拟表名。通常用于在没有实际表的情况下执行一些计算或函数。

  **示例如下：**

  ```sql
  SELECT 1+1, SYSDATE() FROM DUAL;

  ```

  返回结果如下：

  ```shell
  +------+---------------------+
  | 1+1  | SYSDATE()           |
  +------+---------------------+
  |    2 | 2024-08-28 15:20:59 |
  +------+---------------------+
  1 row in set

  ```
 - `table_references`：表引用列表，可以包括多个表引用，多个表引用间使用英文逗号（`,`）分隔。即指定查询的数据源表列表，可以是一个或多个表的组合。`table_references` 的详细语法信息，参见 [JOIN 子句](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000222203)。

### where_condition

`expression`：表示可用于过滤要更新的行的条件表达式。

**示例如下：**

从 `tbl1` 表中选取满足条件 `col1 > 1` 并且 `col2 = 'A3'` 的所有行数据。

```sql
SELECT *
  FROM tbl1
  WHERE col1 > 1
    AND col2 = 'A3';

```

返回结果如下：

```shell
+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
|    3 | A3   |    3 |
+------+------+------+
1 row in set

```

### group_by_condition

`expression [ASC | DESC]`：表示分组的条件表达式。加入升序（`ASC`）或者降序（`DESC`）可以控制分组后的结果集中，各个分组的顺序是升序还是降序。

**示例如下：**

从表 `tbl1` 中查询 `col1`、`col2`，按照 `col2` 分组对 `col3` 求和，并输出。

```sql
SELECT col1, col2, SUM(col3)
  FROM tbl1
  GROUP BY col2 DESC;

```

返回结果如下：

```shell
+------+------+-----------+
| col1 | col2 | SUM(col3) |
+------+------+-----------+
|    3 | A3   |         3 |
|    2 | A2   |         2 |
|    1 | A1   |         1 |
+------+------+-----------+
3 rows in set

```

### having_condition

`expression`：表示对分组后的结果进行条件过滤的条件表达式。

**示例如下：**

从表 `tbl1` 中查询 `col1`、`col2`，按照 `col2` 分组对 `col3` 求和，查询 `col3` 总和小于 `3` 的行，并输出。

```sql
SELECT col1, col2, SUM(col3)
  FROM tbl1
  GROUP BY col2
  HAVING SUM(col3) < 3;

```

返回结果如下：

```shell
+------+------+-----------+
| col1 | col2 | SUM(col3) |
+------+------+-----------+
|    1 | A1   |         1 |
|    2 | A2   |         2 |
+------+------+-----------+
2 rows in set

```

### order_by_condition

`expression [ASC | DESC]`：表示对结果集排序的条件表达式。

`ASC | DESC`：可选参数，用于指定排序的顺序。`ASC` 表示升序（默认），`DESC` 表示降序。

**示例如下：**

查询表 `tbl1` 的数据，根据 `col3` 按降序（`DESC`）输出查询结果。

```sql
SELECT *
  FROM tbl1
  ORDER BY col3 DESC;

```

返回结果如下：

```shell
+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
|    3 | A3   |    3 |
|    2 | A2   |    2 |
|    1 | A1   |    1 |
+------+------+------+
3 rows in set

```

### limit_clause

- `[offset,] row_count`：参数取值必须是整数常量，解释如下：

     - `offset`：可选项，表示从结果集的起始位置开始跳过的行数（偏移量）。默认初始记录行的偏移量是 0。
     - `row_count`：表示要返回的行数。如果只使用 `row_count` 参数，则返回结果集的前 `row_count` 行。
 - `row_count OFFSET offset`：表示从结果集的起始位置跳过 `offset` 行，然后返回接下来的 `row_count` 行。

**示例如下：**

查询表 `tbl1` 的数据，使用 `LIMIT` 强制从第 2 行开始，返回表 `tbl1` 的两行结果。

```sql
SELECT *
  FROM tbl1
  LIMIT 1, 2;

```

返回结果如下：

```shell
+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
|    2 | A2   |    2 |
|    3 | A3   |    3 |
+------+------+------+
2 rows in set

```

### lock_option

- `FOR UPDATE [opt_for_update_wait]`：表示对查询结果所有行加上排他锁，以阻止其他事务的并发修改，或阻止在某些事务隔离级别时的并发读取。有关使用排他锁的介绍信息，参见 [锁定查询结果 SELECT FOR UPDATE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000218838)。

     - `opt_for_update_wait`：可选项，用于指定获取锁的行为。具体如下：

           - `WAIT {decimal | intnum}`：表示等待其他事务释放资源的时间，如果超过该时间，则返回无法获得资源，单位为秒。
           - `NOWAIT`/`NO_WAIT`：表示不等待其他事务释放资源，直接返回无法获得资源。

**示例如下：**

- 可以通过 `SELECT ... FOR UPDATE` 为表加行级锁。如果使用了 `LIMIT 1` 子句，则会在查询优化中将算子下压到表扫描的步骤中，只为 `LIMIT` 返回的行加锁。

  ```sql
  SELECT *
    FROM tbl1
    LIMIT 1
    FOR UPDATE;

  ```
 - 如果您使用了 `ORDER BY` 子句对查询结果进行排序，则会先对结果进行排序，然后再执行 `LIMIT 1`，因此这种情况下，会为选择的所有行加锁。

  ```sql
  SELECT *
    FROM tbl1
    ORDER BY col1
    LIMIT 1
    FOR UPDATE;

  ```
 - `LOCK IN SHARE MODE`：用于在查询数据时获取共享锁，防止其他事务对数据进行写操作，但允许其他事务对数据进行读操作。有关使用共享锁的介绍信息，参见 [锁定查询结果 LOCK IN SHARE MODE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000218846)。

## 示例

### 简单的表查询示例

1. 创建表 `test_tbl1`。

   ```sql
   CREATE TABLE test_tbl1(col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT);

   ```
 2. 向表 `test_tbl1` 中插入测试数据。

   ```sql
   INSERT INTO test_tbl1 VALUES (1, 'A1', 10),(2, 'A2', 15),(3, 'A1', 8);

   ```
 3. 查看表 `test_tbl1` 中列 `col2` 的数据并进行去重处理。

   ```sql
   SELECT DISTINCT col2
     FROM test_tbl1;

   ```

   返回结果如下：

   ```shell
   +------+
   | col2 |
   +------+
   | A1   |
   | A2   |
   +------+
   2 rows in set

   ```

### 使用 dblink 查询数据的示例

- 读取远端 `test` 库中的 `number_t` 表

  ```sql
  SELECT *
    FROM number_t@ob_dblink;

  ```

  返回结果如下：

  ```shell
  +--------+-------------+---------+---------------------+--------------------------------+
  | c_int  | c_bigint    | c_float |    c_double         |   c_decimal                    |
  +--------+-------------+---------+---------------------+--------------------------------+
  | 214748 | 92233720368 | 3.40282 | 1.7976931348623157  | 123456789123456789.1234567890  |
  +--------+-------------+---------+---------------------+--------------------------------+
  1 row in set

  ```
 - 读取远端 `test` 库中的 `number_t` 表，并和本地的 `number_t` 表做 JOIN 操作。

  ```sql
  SELECT a.c_decimal, b.c_double
    FROM number_t a, number_t@ob_dblink b
    WHERE a.c_int = b.c_int;

  ```

  返回结果如下：

  ```shell
  +--------------------------------+---------------------+
  |   c_decimal                    |    c_double         |
  +---------------------+--------------------------------+
  | 123456789123456789.1234567890  |  1.7976931348623157 |
  +---------------------+--------------------------------+
  1 row in set

  ```
 - 读取远端 `mysql` 库中的 `datetime_t` 表。

  ```sql
  SELECT *
    FROM mysql.datetime_t@ob_dblink;

  ```

  返回结果如下：

  ```shell
  +-------------+------------+---------+----------------------+----------------------+
  | c_date      | c_time     | c_year  | c_datetime           |  c_timestamp         |
  +-------------+------------+---------+-----------------------+---------------------+
  |  2023-04-13 | 12:12:12   |  2078   | 2100-11-01 12:12:13  | 2100-12-01 21:14:15  |
  +-------------+------------+---------+----------------------+----------------------+
  1 row in set

  ```

## 相关文档

[单表查询](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000218449)

 上一篇 下一篇 ![有帮助](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) 咨询热线
