You need to enable JavaScript to run this app.
导航

SQL 语法参考

最近更新时间2024.03.11 16:10:24

首次发布时间2024.03.11 16:10:24

本文介绍一些常用的的 SQL 语法,以帮助您更方便的使用 SQL 查询分析。

连接数据库服务

在本地命令行工具中,执行以下命令,连接数据库服务。

mysql -h{HOST} -P{PORT} -uadmin -p{PASSWORD}
  • HOST:SQL 分析节点的访问地址域名,按需选择私网访问地址或公网访问地址。
  • PORT:SQL 分析节点的访问端口
  • PASSWORD:admin 用户的登录密码。如果您忘记了登录密码,您可以选择重置密码,具体操作请参见重置登录密码

创建数据库

CREATE DATABASE IF NOT EXISTS sqlDemo_DB;

创建外表

通过创建 ES 外表,将分布式查询和全文检索相结合,实现查询分析实例中的索引数据。

CREATE EXTERNAL TABLE `es_table` (
  `k1` bigint(20) COMMENT "",
  `k2` datetime COMMENT "",
  `k3` varchar(20) COMMENT "",
  `k4` varchar(100) COMMENT "",
  `k5` varchar(20) COMMENT ""
) ENGINE=ELASTICSEARCH 
PROPERTIES (
  "hosts" = "https://es-data-svc-0080c**.o-0080c**:9200",
  "index" = "sql-demo",
  "user" = "admin",
  "password" = "qaPwxxx",
  "http_ssl_enabled" = "true"
);

参数

说明

hosts

与 ES 实例构建连接的服务地址,需要自主进行构建。服务地址的格式为http(s)://es-data-svc-{实例ID后缀}.{完整的实例ID}:9200,示例值为https://es-data-svc-0081**.o-0081**:9200

index

目标索引的名称。

user

连接 ES 实例的用户。
您可以直接使用 admin 用户,但更建议您使用自建的低权限、只读用户。如何自建 SQL 用户,请参见SQL 服务用户管理

password

用户的密码。

http_ssl_enabled

是否启用 HTTPS 访问模式,默认为 false。

注意

如果实例切换传输协议,已经在 SQL 分析节点中创建的外表将无法继续使用,您需要重新创建外表才可以继续查询分析索引数据。

enable_docvalue_scan

是否开启通过 ES 列式存储获取查询字段的值,默认为 true。
在查询中是否使用列式存储进行查询,遵循以下规则:只有当所有要获取的字段都有列存时,才会从列式存储中进行查询,否则通过行式存储获取所需的所有列。

说明

  • text类型的字段在 ES 中没有列式存储,因此如果所需字段有text类型会自动降级为从_source中获取。
  • 在获取的字段数量过多的情况下,读列存和行存(_source)的性能基本一样。

enable_keyword_sniff

是否对 ES 中text类型进行fields探测,获取额外的未分词(keyword)字段名,默认为 true。
ES 的 milti fields 特性可以为一个字段同时创建text类型和keyword类型的字段,对于text字段 ES 会对其按照规则进行分词处理,相对的keyword字段则会将文本以一个完整的 term 进行存储。

nodes_discovery

是否开启 ES 节点发现,默认为 true。
新建的外表需要同步 ES 节点和 Shard 信息,立即查询新建的外表,可能出现EsShardRouting cannot be null!错误提示。

DROP

当库表无需存在时,您可以选择删除库表。

DROP DATABASE [IF EXISTS] db_name;

示例

  • 删除数据库 db_test:DROP DATABASE db_test;

SELECT

SELECT 命令用于从数据库中选取数据。

SELECT
[hint_statement, ...]
[ALL | DISTINCT]
select_expr [, select_expr ...]
[FROM table_references]
[WHERE where_condition]
[GROUP BY [GROUPING SETS | ROLLUP | CUBE] {col_name | expr | position}]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]

语法说明

  • hint_statement:在 selectlist 前面使用 hint 表示可以通过 hint 去影响优化器的行为以期得到想要的执行计划。
  • ALL | DISTINCT :对结果集进行筛选,all为全部,distinct/distinctrow将筛选出重复列,默认为all
  • ALL EXCEPT:对全部结果集进行筛选,except 指定要从全部结果集中排除的一个或多个列的名称。输出中将忽略所有匹配的列名称。
  • select_expr, ... :检索并在结果中显示的列,使用别名时,as为自选。
  • table_references 检索的目标表,可以是一个或者多个表(包括子查询产生的临时表)。
  • where_definition:WHERE 条件子句,用于对行数据进行筛选。where_condition 是一个表达式,对于要选择的每一行,其计算结果为true。如果没有 WHERE 子句,该语句将选择所有行。在 WHERE 表达式中,您可以使用除聚合函数之外的任何 MySQL 支持的函数和运算符。
  • INTO OUTFILE 'file_name' :保存结果至新文件(之前不存在)中。
  • Group by:对结果集进行分组。
  • Having:Having 从句不是过滤表中的行数据,而是过滤聚合函数产出的结果。通常要和聚合函数( COUNT()SUM()AVG()MIN()、MAX())以及Group by从句一起使用。
  • Order by :对结果集进行排序。Order by 通过比较一列或者多列的大小来对结果集进行排序,DESC表示降序,ASC表示升序。
    如果需要返回前 N 个排序结果,需要使用LIMIT从句。Order by 是比较耗时耗资源的操作,为了限制内存的使用,如果用户没有指定 LIMIT 从句,则默认返回前 65535 个排序结果。
  • Limit n: 限制输出结果中的行数。limit m,n 表示从第 m 行开始输出 n 条记录。,

    说明

    使用limit m,n时,需要和order by结合使用,否则每次执行的数据可能会不一致。

示例

  • 查询年龄分别是 18,20,25 的学生姓名:select Name from student where age in (18,20,25);
  • GROUP BY 示例。计算每类图书的平均价格,并按 type 分组:select type,avg(price) from tb_book group by type;
  • ALL EXCEPT 示例。查询除了学生年龄的所有信息:select * except(age) from student;
  • DISTINCT 示例。查询 tb_book 表,除去重复的 type 数据:select distinct type from tb_book;
  • ORDER BY 示例。查询数据并按照 id 降序排列,仅显示 3 条数据:select * from tb_book order by id desc limit 3;
  • LIKE 模糊查询。查询第二个字符是 h 的所有图书:select * from tb_book where name like('_h%');
    支持%_两种通配符。%可以匹配一个或多个字符,_可以匹配一个字符。
  • 使用函数和表达式。计算各类图书的总价格:select sum(price) as total,type from tb_book group by type;

SHOW

展示当前可见的 Database。

SHOW DATABASES [FROM catalog] [filter expr];
  • SHOW DATABASES 会展示当前所有的数据库名称。
  • SHOW DATABASES FROM catalog 会展示catalog中所有的数据库名称。
  • SHOW DATABASES filter_expr 会展示经过过滤后的数据库名称。
  • SHOW DATABASES FROM catalog filter_expr 这种语法不支持。

示例

  • 展示当前所有的数据库名称:SHOW DATABASES;
  • 展示emr_catalog中所有的数据库名称:SHOW DATABASES from emr_catalog;
  • 展示经过表示式like 'doc%'过滤后的数据库名称:SHOW DATABASES like 'doc%';

USE

USE 命令用来选择使用的数据库。

USE [CATALOG_NAME].DATABASE_NAME

说明

使用USE CATALOG_NAME.DATABASE_NAME, 会先将当前的 Catalog 切换为CATALOG_NAME, 然后再将当前的 Database 切换为DATABASE_NAME

示例

  • 如果 demo 数据库存在,尝试使用它:use demo;
  • 如果 demo 数据库存在于 emr-catalog,尝试切换到 emr-catalog 并使用它:use emr_catalog.demo;

SET

SET 命令主要用来修改系统变量,支持为全局或会话级别设置系统变量。您可以通过 SHOW VARIABLES 命令查看系统变量。

SET variable_assignment [, variable_assignment] ...

说明

  • 如果需要同时修改多个变量,需要使用英文逗号(,)分隔。
  • 只有 ADMIN 用户可以修改全局变量。修改全局变量,会影响当前会话和此后的新会话,不影响当前已经存在的会话。

示例
设置时区:SET time_zone = "Asia/Shanghai";