首批通过分布式安全可靠测评,为关键业务系统打造
SELECT
更新时间:2024-11-30 23:00:00
描述
该语句用于从一个或多个表中查询数据。
本节主要介绍通用的 SELECT 语法结构。其他 SELECT 相关的语法,参见:
权限要求
执行 SELECT 语句,需要当前用户拥有 SELECT 权限。有关 OceanBase 数据库权限的详细介绍,参见 MySQL 模式下的权限分类。
语法
select_stmt:
SELECT [hint_options]
[{DISTINCT | UNIQUE} | ALL]
[SQL_CALC_FOUND_ROWS]
[STRAIGHT_JOIN]
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。 |
| {DISTINCT | UNIQUE} | ALL | 可选项,用于控制返回的结果集中是否包含重复的行。
|
| SQL_CACHE | SQL_NO_CACHE | 可选项,用于控制查询结果是否被缓存。
|
| SQL_CALC_FOUND_ROWS | 可选项,用于在带有 LIMIT 子句的查询中,记录全部返回的行数,并可以在接下来执行的 FOUND_ROWS() 函数获取全部行数。 |
| STRAIGHT_JOIN | 可选项,强制优化器按照 FROM 子句中所列出的顺序连接表。调优命令,不影响执行结果。
注意OceanBase 数据库并不完全兼容 MySQL 中的 |
| select_expr_list | 指定要在查询结果中显示的列或表达式列表。查询出列或表达式的详细介绍可参见下文 select_expr。 |
| column_name | 列名称。 |
| FROM from_list | 可选项,指定查询的数据源,可以是表、视图或者子查询。数据源的详细介绍可参见下文 from_list。 |
| WHERE where_condition | 可选项,指定查询的筛选条件。详细介绍可参见下文 where_condition。 |
| GROUP BY group_by_condition_list | 可选项,用于按照指定的列对结果进行分组。通常与聚合函数一起使用。详细介绍可参见下文 group_by_condition。 |
| WITH ROLLUP | 可选项,将各分组进行汇总以表示更高级的聚合(也称为超聚合),并产生额外的行。 |
| HAVING having_condition | 可选项,用于对分组后的结果进行条件过滤。HAVING 字句与 WHERE 字句类似,但是 HAVING 字句可以使用聚合函数(如 SUM,AVG 等)。详细介绍可参见下文 having_condition。 |
| window_clause | 可选项,用于指定分析函数(某些数据库下也叫做窗口函数)的窗口定义。window_clause 的详细语法信息,参见 WINDOW 子句。 |
| ORDER BY order_by_condition_list | 可选项,用于对结果集进行排序。可以指定一个或多个列进行排序。详细介绍可参见下文 order_by_condition。 |
| LIMIT limit_clause | 可选项,用于指定限制返回结果的数量(行数)。详细介绍可参见下文 limit_clause。 |
| lock_option | 可选项,用于对查询结果加锁。详细介绍可参见下文 lock_option。 |
select_expr
select_expr:表示查询结果中包含的列或表达式,多个表达式或列名间以英文逗号(,)分隔。取值如下:
*:表示选择所有列。示例如下:
创建表
tbl1和tbl2。CREATE TABLE tbl1(col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT) PARTITION BY HASH(col1) PARTITIONS 5;CREATE TABLE tbl2(col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT);向表
tbl1中插入测试数据。INSERT INTO tbl1 VALUES(1, 'A1', 1),(2, 'A2', 2),(3, 'A3', 3);INSERT INTO tbl2 VALUES(1, 'A1', 1),(2, 'A2', 22),(3, 'A3', 33);查看表
tbl1中的数据。SELECT * FROM tbl1;返回结果如下:
+------+------+------+ | 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数据。SELECT tbl1.col1 FROM tbl1;返回结果如下:
+------+ | 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。SELECT col1, col1+1 AS col1_add, col3*2 col3_mul FROM tbl1;返回结果如下:
+------+----------+----------+ | col1 | col1_add | col3_mul | +------+----------+----------+ | 1 | 2 | 2 | | 2 | 3 | 4 | | 3 | 4 | 6 | +------+----------+----------+ 3 rows in set
from_list
DUAL:表示虚拟表名。通常用于在没有实际表的情况下执行一些计算或函数。示例如下:
SELECT 1+1, SYSDATE() FROM DUAL;返回结果如下:
+------+---------------------+ | 1+1 | SYSDATE() | +------+---------------------+ | 2 | 2024-08-28 15:20:59 | +------+---------------------+ 1 row in settable_references:表引用列表,可以包括多个表引用,多个表引用间使用英文逗号(,)分隔。即指定查询的数据源表列表,可以是一个或多个表的组合。table_references的详细语法信息,参见 JOIN 子句。
where_condition
expression:表示可用于过滤要更新的行的条件表达式。
示例如下:
从 tbl1 表中选取满足条件 col1 > 1 并且 col2 = 'A3' 的所有行数据。
SELECT * FROM tbl1
WHERE col1 > 1
AND col2 = 'A3';
返回结果如下:
+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
| 3 | A3 | 3 |
+------+------+------+
1 row in set
group_by_condition
expression [ASC | DESC]:表示分组的条件表达式。加入升序(ASC)或者降序(DESC)可以控制分组后的结果集中,各个分组的顺序是升序还是降序。
示例如下:
从表 tbl1 中查询 col1、col2,按照 col2 分组对 col3 求和,并输出。
SELECT col1, col2, SUM(col3)
FROM tbl1
GROUP BY col2 DESC;
返回结果如下:
+------+------+-----------+
| 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 的行,并输出。
SELECT col1, col2, SUM(col3)
FROM tbl1
GROUP BY col2
HAVING SUM(col3) < 3;
返回结果如下:
+------+------+-----------+
| 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)输出查询结果。
SELECT * FROM tbl1
ORDER BY col3 DESC;
返回结果如下:
+------+------+------+
| 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 的两行结果。
SELECT * FROM tbl1
LIMIT 1, 2;
返回结果如下:
+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
| 2 | A2 | 2 |
| 3 | A3 | 3 |
+------+------+------+
2 rows in set
lock_option
FOR UPDATE [opt_for_update_wait]:表示对查询结果所有行加上排他锁,以阻止其他事务的并发修改,或阻止在某些事务隔离级别时的并发读取。有关使用排他锁的介绍信息,参见 锁定查询结果 SELECT FOR UPDATE。opt_for_update_wait:可选项,用于指定获取锁的行为。具体如下:WAIT {decimal | intnum}:表示等待其他事务释放资源的时间,如果超过该时间,则返回无法获得资源,单位为秒。NOWAIT/NO_WAIT:表示不等待其他事务释放资源,直接返回无法获得资源。
示例如下:
可以通过
SELECT ... FOR UPDATE为表加行级锁。如果使用了LIMIT 1子句,则会在查询优化中将算子下压到表扫描的步骤中,只为LIMIT返回的行加锁。SELECT * FROM tbl1 LIMIT 1 FOR UPDATE;如果您使用了
ORDER BY子句对查询结果进行排序,则会先对结果进行排序,然后再执行LIMIT 1,因此这种情况下,会为选择的所有行加锁。SELECT * FROM tbl1 ORDER BY col1 LIMIT 1 FOR UPDATE;LOCK IN SHARE MODE:用于在查询数据时获取共享锁,防止其他事务对数据进行写操作,但允许其他事务对数据进行读操作。有关使用共享锁的介绍信息,参见 锁定查询结果 LOCK IN SHARE MODE。
示例
简单的表查询示例
创建表
test_tbl1。CREATE TABLE test_tbl1(col1 INT PRIMARY KEY, col2 VARCHAR(20), col3 INT);向表
test_tbl1中插入测试数据。INSERT INTO test_tbl1 VALUES (1, 'A1', 10),(2, 'A2', 15),(3, 'A1', 8);查看表
test_tbl1中列col2的数据并进行去重处理。SELECT DISTINCT col2 FROM test_tbl1;返回结果如下:
+------+ | col2 | +------+ | A1 | | A2 | +------+ 2 rows in set
使用 dblink 查询数据的示例
读取远端
test库中的number_t表SELECT * FROM number_t@ob_dblink;返回结果如下:
+--------+-------------+---------+---------------------+--------------------------------+ | 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 操作。SELECT a.c_decimal, b.c_double FROM number_t a, number_t@ob_dblink b WHERE a.c_int = b.c_int;返回结果如下:
+--------------------------------+---------------------+ | c_decimal | c_double | +---------------------+--------------------------------+ | 123456789123456789.1234567890 | 1.7976931348623157 | +---------------------+--------------------------------+ 1 row in set读取远端
mysql库中的datetime_t表。SELECT * FROM mysql.datetime_t@ob_dblink;返回结果如下:
+-------------+------------+---------+----------------------+----------------------+ | 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