SELECT
描述
该语句用于从一个或多个表中查询数据。
本节主要介绍通用的 SELECT 语法结构。其他 SELECT 相关的语法,参见:
权限要求
执行 SELECT 语句,需要当前用户拥有 SELECT 权限。有关 seekdb 权限的详细介绍,参见 seekdb 的权限分类。
语法
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]
| GROUP BY [group_by_condition_list] group_by_summary_option (expression_list)]
[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
| { location_url | table_function }
location_url:
'<string>'
(
{FORMAT = (
TYPE = 'CSV',
LINE_DELIMITER = '<string>' | <expr>,
FIELD_DELIMITER = '<string>' | <expr>,
ESCAPE = '<character>' | <expr>,
FIELD_OPTIONALLY_ENCLOSED_BY = '<character>' | <expr>,
ENCODING = 'charset',
NULL_IF = ('<string>' | <expr>, '<string>' | <expr> ...),
SKIP_HEADER = <int>,
SKIP_BLANK_LINES = { TRUE | FALSE },
PARSE_HEADER = { TRUE | FALSE },
TRIM_SPACE = { TRUE | FALSE },
EMPTY_FIELD_AS_NULL = { TRUE | FALSE }
)
| FORMAT = ( TYPE = 'PARQUET' | 'ORC' )
}
[PATTERN = '<regex_pattern>']
)
table_function:
{
FILES (
LOCATION = '<string>',
{
FORMAT = (
TYPE = 'CSV',
LINE_DELIMITER = '<string>' | <expr>,
FIELD_DELIMITER = '<string>' | <expr>,
ESCAPE = '<character>' | <expr>,
FIELD_OPTIONALLY_ENCLOSED_BY = '<character>' | <expr>,
ENCODING = 'charset',
NULL_IF = ('<string>' | <expr>, '<string>' | <expr> ...),
SKIP_HEADER = <int>,
SKIP_BLANK_LINES = { TRUE | FALSE },
PARSE_HEADER = { TRUE | FALSE },
TRIM_SPACE = { TRUE | FALSE },
EMPTY_FIELD_AS_NULL = { TRUE | FALSE }
)
| FORMAT = ( TYPE = 'PARQUET' | 'ORC' )
},
[PATTERN = '<regex_pattern>']
)
| SOURCE (
TYPE = 'ODPS',
ACCESSID = '<string>',
ACCESSKEY = '<string>',
ENDPOINT = '<string>',
TUNNEL_ENDPOINT = '<string>',
PROJECT_NAME = '<string>',
SCHEMA_NAME = '<string>',
TABLE_NAME = '<string>',
QUOTA_NAME = '<string>',
COMPRESSION_CODE = '<string>'
)
}
where_condition:
expression
group_by_condition_list:
group_by_condition [, group_by_condition ...]
group_by_condition:
expression [ASC | DESC]
group_by_summary_option:
GROUPING SETS
| ROLLUP
| CUBE
expression_list:
expression [, expression ...]
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
| SKIP LOCKED
参数解释
| 参数 | 描述 |
|---|---|
| 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 子句中所列出的顺序连接表。调优命令,不影响执行结果。:::tip seekdb 并不完全兼容 MySQL 中的 STRAIGHT_JOIN 语法。当 STRAIGHT_JOIN 能够明确指定表连接的顺序时,seekdb 会按照这个命令执行。如果 STRAIGHT_JOIN 无法确定唯一的连接顺序,seekdb 将会忽略这个命令。 ::: |
| select_expr_list | 指定要在查询结果中显示的列或表达式列表。查询出列或表达式的详细介绍可参见下文 select_expr。 |
| column_name | 列名称。 |
| FROM from_list | 可选项,指定查询的数据源,可以是表、视图或者子查询。数据源的详细介绍可参见下文 from_list。 |
| { table_function | location_url } | 可选项,当前 URL 外表支持两种语法形式,详细介绍可参见下文:
|
| WHERE where_condition | 可选项,指定查询的筛选条件。详细介绍可参见下文 where_condition。 |
| GROUP BY group_by_condition_list | 可选项,用于按照指定的列对结果进行分组。通常与聚合函数一起使用。详细介绍可参见下文 group_by_condition。 |
| WITH ROLLUP | 可选项,将各分组进行汇总以表示更高级的聚合(也称为超聚合),并产生额外的行。 |
| GROUP BY [group_by_condition_list] group_by_summary_option (expression_list) | 可选项,用于高级分组汇总操作。
|
| 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 (0.022 sec)
-
-
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 (0.025 sec)
-
-
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 (0.027 sec) -
from_list
-
DUAL:表示虚拟表名。通常用于在没有实际表的情况下执行一些计算或函数。示例如下:
SELECT 1+1, SYSDATE() FROM DUAL;返回结果如下:
+------+---------------------+
| 1+1 | SYSDATE() |
+------+---------------------+
| 2 | 2024-08-28 15:20:59 |
+------+---------------------+
1 row in set (0.009 sec) -
table_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 (0.003 sec)
table_function
-
LOCATION 子句用于指定外表文件存放的路径。通常外表的数据文件存放于单独一个目录中,文件夹中可以包含子目录,在创建表时,外表会自动收集该目录中的所有文件。
- 本地
LOCATION格式为LOCATION = '[file://] local_file_path',其中local_file_path可以为相对路径,也可以为绝对路径。如果填写的是相对路径,则当前目录必须为 seekdb 的安装目录;secure_file_priv用于配置 seekdb 节点有权限访问的文件路径。local_file_path只能是secure_file_priv路径的子路径。 - 远程
LOCATION格式为:LOCATION = '{oss\|s3}://$ACCESS_ID:$ACCESS_KEY@$HOST:s3_region/remote_file_path',其中$ACCESS_ID、$ACCESS_KEY和$HOST为访问阿里云 OSS、AWS S3 以及兼容 S3 协议的对象存储所需配置的访问信息,s3_region为使用 S3 时选择的区域信息,这些敏感的访问信息会以加密的方式存放在数据库的系统表中。LOCATION = hdfs://localhost:port/PATH,其中localhost指的是 HDFS 的地址,port指的是 HDFS 的端口号,PATH指 HDFS 中的目录路径。- 带 kerberos 认证:
LOCATION = 'hdfs://localhost:port/user?principal=xxx&keytab=xxx&krb5conf=xxx&configs=xxx'。 其中:principal: 指登录认证用户。keytab:指定用户认证的密钥文件路径。krb5conf:指定用户使用 kerberos 环境的描述文件路径。configs: 指定额外的 HDFS 配置项,默认为空,但是如果是 kerberos 环境,则通常该配置项有值,需要进行配置,例如:dfs.data.transfer.protection=authentication,privacy,指定数据传输保护级别为authentication和privacy。
- 带 kerberos 认证:
- 本地
-
FORMAT 子句用于指定读取文件格式相关的属性,支持 CSV/PARQUET/ORC 三种文件格式。
- TYPE = 'CSV' 时,包含以下字段:
LINE_DELIMITER:指定 CSV 文件的行分隔符,默认为LINE_DELIMITER='\n'。FIELD_DELIMITER:可选项,指定 CSV 文件的列分隔符,默认为FIELD_DELIMITER='\t'。ESCAPE:指定 CSV 文件的转义符号,只能为 1 个字节,默认为ESCAPE ='\'。FIELD_OPTIONALLY_ENCLOSED_BY:可选项,指定 CSV 文件中包裹字段值的符号,默认为空。使用此选项表示只对部分类型的字段(如 CHAR, VARCHAR, TEXT, JSON 等)加包裹符。ENCODING:指定文件的字符集编码格式,如果不指定,默认值为UTF8MB4。NULL_IF:指定被当作NULL处理的字符串。默认值为空。SKIP_HEADER:跳过文件头,并指定跳过的行数。SKIP_BLANK_LINES:指定是否跳过空白行。默认值为FALSE,表示不跳过空白的行。TRIM_SPACE:指定是否删除文件中字段的头部和尾部空格。默认值为FALSE,表示不删除文件中字段头尾的空格。EMPTY_FIELD_AS_NULL:指定是否将空字符串当作NULL处理。默认值为FALSE,表示不将空字符串当做NULL处理。PARSE_HEADER:指定该配置后直接获取 CSV 文件第一行信息,将其作为每列的列名。注意
PARSE_HEADER不能和SKIP_HEADER同时使用,语意上会有冲突。
- TYPE = 'PARQUET/ORC' 时,无其他额外字段。
- TYPE = 'CSV' 时,包含以下字段:
-
PATTERN子句指定一个正则模式串,用于过滤LOCATION目录下的文件。对于每个 LOCATION 目录下的文件路径,如果能够匹配该模式串,外表会访问这个文件,否则外表会跳过这个文件。如果不指定该参数,则默认可以访问LOCATION目录下的所有文件。
对于 ODPS 格式,因为获取数据的方式不是通过文件,并且不存在有意义的 URL 路径,所以只支持 source 这一种 table_function 的形式。
- TYPE = 'ODPS' 包含以下字段:
ACCESSID:指定 ODPS 用户的 ID。ACCESSKEY:指定 ODPS 用户的密码。ENDPOINT:指定 ODPS 服务的连接地址。TUNNEL_ENDPOINT:指定 Tunnel 数据传输服务的连接地址。PROJECT_NAME:指定需要查询的表所在的 Project。SCHEMA_NAME:可选项,指定需要查询表的 SCHEMA。TABLE_NAME:指定需要查询的表名。QUOTA_NAME:可选项,选择是否使用指定的 Quota。COMPRESSION_CODE:可选项,指定数据源的压缩格式,支持 ZLIB、ZSTD、LZ4、ODPS_LZ4 四种压缩格式,不设置表示不开启压缩。
示例如下:
读取 odps 格式数据。
SELECT * FROM
source (
type = 'ODPS',
accessid = '$ODPS_ACCESSID',
accesskey = '$ODPS_ACCESSKEY',
endpoint= '$ODPS_ENDPOINT',
project_name = 'example_project',
schema_name = '',
table_name = 'example_table',
quota_name = '',
compression_code = ''
);
location_url
- FORMAT 子句用于指定读取件格式相关的属性,支持 CSV/PARQUET/ORC 三种文件格式:
- CSV 格式:配置 parse_header=true/false:指定是否解析文件首行为列标题(默认为 false)。另外,需要使用 TYPE=CSV 声明文件格式(导出时需指定)。
- PARQUET/ORC 格式:自动识别文件结构,无需额外配置标题行。
示例如下:
SELECT * FROM
FILES( location = '/data/',
format (TYPE = 'csv', field_delimiter = ',', parse_header = true),
pattern = 'datafiles$';
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 (0.017 sec)
group_by_summary_option
seekdb 支持高级分组汇总操作。
-
GROUPING SETS:表示自定义分组方式,允许指定多个分组组合。具有以下特点:- 用户可以灵活定义需要的分组组合。
- 生成的结果集仅包括用户指定的分组组合。
信息GROUP BY GROUPING SETS ((col1), (col2), (col3))等价于GROUP BY GROUPING SETS (col1, col2, col3)。示例如下:
SELECT col1, col2, col3, COUNT(*)
FROM tbl1
GROUP BY GROUPING SETS ((col1), (col2), (col3));返回结果如下:
+------+------+------+----------+
| col1 | col2 | col3 | COUNT(*) |
+------+------+------+----------+
| 1 | NULL | NULL | 1 |
| 2 | NULL | NULL | 1 |
| 3 | NULL | NULL | 1 |
| NULL | A1 | NULL | 1 |
| NULL | A2 | NULL | 1 |
| NULL | A3 | NULL | 1 |
| NULL | NULL | 1 | 1 |
| NULL | NULL | 2 | 1 |
| NULL | NULL | 3 | 1 |
+------+------+------+----------+
9 rows in set (0.016 sec) -
ROLLUP:表示分层汇总方式,按照分组列的顺序逐层减少分组列的数量,生成多层次的汇总结果。具有以下特点:-
按照
expression_list中的列顺序,依次减少分组列,直到只保留总计行。 -
生成的结果集包括:
- 每个分组的明细数据。
- 每个分组的子汇总数据。
- 总计行。
ROLLUP可以看作特殊的GROUPING SETS。例如:GROUP BY ROLLUP(col1, col2, col3)
等价于
GROUP BY GROUPING SETS ((col1, col2, col3), (col1, col2), (col1), ())ROLLUP也可以与GROUPING SETS组合使用。例如:GROUP BY GROUPING SETS((col2), (col3), ROLLUP(col1, col2, col3))
等价于
GROUP BY GROUPING SETS((col2), (col3), (col1, col2, col3), (col1, col2), (col1), ())示例如下:
SELECT col1, col2, col3, COUNT(*)
FROM tbl1
GROUP BY ROLLUP (col1, col2, col3);返回结果如下:
+------+------+------+----------+
| col1 | col2 | col3 | COUNT(*) |
+------+------+------+----------+
| 1 | A1 | 1 | 1 |
| 1 | A1 | NULL | 1 |
| 1 | NULL | NULL | 1 |
| 2 | A2 | 2 | 1 |
| 2 | A2 | NULL | 1 |
| 2 | NULL | NULL | 1 |
| 3 | A3 | 3 | 1 |
| 3 | A3 | NULL | 1 |
| 3 | NULL | NULL | 1 |
| NULL | NULL | NULL | 3 |
+------+------+------+----------+
10 rows in set (0.109 sec) -
-
CUBE:表示多维汇总方式,用于生成所有可能的分组组合。具有以下特点:- 每个分组的明细数据。
- 所有可能的分组组合的汇总数据。
- 总计行。
CUBE可以看作特殊的GROUPING SETS。例如:GROUP BY CUBE(col1, col2, col3)
等价于
GROUP BY GROUPING SETS ((col1, col2, col3), (col1, col2), (col1, col3), (col2, col3), (col1), (col2), (col3), ())CUBE也可以与GROUPING SETS组合使用。例如:GROUP BY col1, CUBE(col2, col3), GROUPING SETS((col4), (col5))
等价于
GROUP BY GROUPING SETS(
(col1, col2, col3, col4), (col1, col2, col3, col5),
(col1, col2, col4), (col1, col2, col5),
(col1, col3, col4), (col1, col3, col5),
(col1, col4), (col1, col5))示例如下:
SELECT col1, col2, col3, COUNT(*)
FROM tbl1
GROUP BY CUBE (col1, col2, col3);返回结果如下:
+------+------+------+----------+
| col1 | col2 | col3 | COUNT(*) |
+------+------+------+----------+
| NULL | NULL | NULL | 3 |
| NULL | NULL | 1 | 1 |
| NULL | NULL | 2 | 1 |
| NULL | NULL | 3 | 1 |
| NULL | A1 | NULL | 1 |
| NULL | A2 | NULL | 1 |
| NULL | A3 | NULL | 1 |
| NULL | A1 | 1 | 1 |
| NULL | A2 | 2 | 1 |
| NULL | A3 | 3 | 1 |
| 1 | NULL | NULL | 1 |
| 2 | NULL | NULL | 1 |
| 3 | NULL | NULL | 1 |
| 1 | NULL | 1 | 1 |
| 2 | NULL | 2 | 1 |
| 3 | NULL | 3 | 1 |
| 1 | A1 | NULL | 1 |
| 2 | A2 | NULL | 1 |
| 3 | A3 | NULL | 1 |
| 1 | A1 | 1 | 1 |
| 2 | A2 | 2 | 1 |
| 3 | A3 | 3 | 1 |
+------+------+------+----------+
22 rows in set (0.113 sec)
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 (0.010 sec)