SQL 概要__SQL_大数据计算服务-阿里云
MaxCompute SQL适用于海量数据(TB级别),实时性要求不高的场合,它的每个作业的准备,提交等阶段要花费较长时间,因此要求每秒处理几千至数万笔事务的业务是不能用 MaxCompute 完成的。
MaxCompute SQL采用的是类似于SQL的语法,可以看作是标准SQL的子集,但不能因此简单的把MaxCompute 等价成一个数据库,它在很多方面并不具备数据库的特征,如事务、主键约束、索引等。目前在 MaxCompute 中允许的最大SQL长度是2MB。
关键字
MaxCompute 将SQL语句的关键字作为保留字。在对表、列或是分区命名时请不要使用,否则会报错。保留字不区分大小写。下面只给出常用的保留字列表,完整的保留字列表请参阅 MaxCompute SQL保留字。
% & && ( ) * +
- . / ; < <= <>
= > >= ? ADD ALL ALTER
AND AS ASC BETWEEN BIGINT BOOLEAN BY
CASE CAST COLUMN COMMENT CREATE DESC DISTINCT
DISTRIBUTE DOUBLE DROP ELSE FALSE FROM FULL
GROUP IF IN INSERT INTO IS JOIN
LEFT LIFECYCLE LIKE LIMIT MAPJOIN NOT NULL
ON OR ORDER OUTER OVERWRITE PARTITION RENAME
REPLACE RIGHT RLIKE SELECT SORT STRING TABLE
THEN TOUCH TRUE UNION VIEW WHEN WHERE
MaxCompute SQL允许数据类型之间的转换,类型转换方式包括:显式类型转换及隐式类型转换。
类型转换说明
显式类型转换
显式类型转换是用cast将一种数据类型的值转换为另一种类型的值的行为,在MaxCompute SQL中支持的显式类型转换如下:
From/To | Bigint | Double | String | Datetime | Boolean | Decimal |
---|---|---|---|---|---|---|
Bigint | – | Y | Y | N | N | Y |
Double | Y | – | Y | N | N | Y |
String | Y | Y | – | Y | N | Y |
Datetime | N | N | Y | – | N | N |
Boolean | N | N | N | N | – | N |
Decimal | Y | Y | Y | N | N | - |
其中,’Y’表示可以转换,’N’表示不可以转换,’–’表示不需要转换。
比如:
select cast(user_id as double) as new_id from user;
select cast('2015-10-01 00:00:00' as datetime) as new_date from user;
备注:
- 将double类型转为bigint类型时,小数部分会被截断,例如:cast(1.6 as bigint) = 1;
- 满足double格式的string类型转换为bigint时,会先将string转换为double,再将double转换为bigint,因此,小数部分会被截断,例如cast(“1.6” as bigint) = 1;
- 满足bigint格式的string类型可以被转换为double类型,小数点后保留一位,例如:cast(“1” as double) = 1.0;
- 不支持的显式类型转换会导致异常;
- 如果在执行时转换失败,报错退出;
- 日期类型转换时采用默认格式yyyy-mm-dd hh:mi:ss,详细说明信息请参考String类型与Datetime类型之间的转换;
- 部分类型之间不可以通过显式的类型转换,但可以通过SQL内建函数进行转换,例如:从boolean类型转换到string类型,可使用函数to_char,详细介绍请参考 TO_CHAR ,而to_date函数同样支持从string类型到datetime类型的转换,详细介绍请参考 TO_DATE ;
- 关于cast的介绍请参阅 CAST ;
- DECIMAL超出值域,CAST STRING TO DECIMAL可能会出现最高位溢出报错,最低位溢出截断等情况。
隐式类型转换及其作用域
隐式类型转换是指在运行时,由 MaxCompute 依据上下文使用环境及类型转换规则自动进行的类型转换。MaxCompute 支持的隐式类型转换规则与显式转换相同:
From/To | Bigint | Double | String | Datetime | Boolean | Decimal |
---|---|---|---|---|---|---|
Bigint | – | Y | Y | N | N | Y |
Double | Y | – | Y | N | N | Y |
String | Y | Y | – | Y | N | Y |
Datetime | N | N | Y | – | N | N |
Boolean | N | N | N | N | – | N |
Decimal | Y | Y | Y | N | N | - |
其中,’Y’表示可以转换,’N’表示不可以转换,’–’表示不需要转换。
常见用法如下:
select user_id+age+'12345',
concat(user_name,user_id,age)
from user;
备注:
- 不支持的隐式类型转换会导致异常;
- 如果在执行时转换失败,也会导致异常;
- 由于隐式类型转换是 MaxCompute 依据上下文使用环境自动进行的类型转换,因此,我们推荐在类型不匹配时显式的用cast进行转换;
- 隐式类型转换规则是有发生作用域的。在某些作用域中,只有一部分规则可以生效。详细信息请参考隐式类型转换的作用域;
关系运算符
关系运算符包括:=, <>, <, <=, >, >=, IS NULL, IS NOT NULL, LIKE, RLIKE和IN。由于LIKE, RLIKE和IN的隐式类型转换规则不同于其他关系运算符,将单独拿出章节对这三种关系运算符做出说明。本小节的说明不包含这三种特殊的关系运算符。当不同类型的数据共同参与关系运算时,按照下述原则进行隐式类型转换。
From/To | Bigint | Double | String | Datetime | Boolean | Decimal |
---|---|---|---|---|---|---|
Bigint | – | Double | Double | N | N | Decimal |
Double | Double | – | Double | N | N | Decimal |
String | Double | Double | – | Datetime | N | Decimal |
Datetime | N | N | Datetime | – | N | N |
Boolean | N | N | N | N | – | N |
Decimal | Decimal | Decimal | Decimal | N | N | - |
备注:
- 如果待比较的两个类型间不能进行隐式类型转换,则该关系运算不能完成,报错退出;
- 关系运算符介绍,请参阅 关系操作符 ;
特殊的关系运算符(LIKE, RLIKE, IN)
LIKE及RLIKE的使用方式形如:
source like pattern;
source rlike pattern;
此二者在隐式类型转换中的注意事项:
- LIKE和RLIKE的source和pattern参数均仅接受string类型;
- 其他类型不允许参与运算,也不能进行到string类型的隐式类型转换;IN的使用方式形如:
key in (value1, value2, …)
In的隐式转换规则:
- In右侧的value值列表中的数据类型必须一致;
- 当key与values之间比较时,若bigint, double, string之间比较,统一转double,若datetime和string之间比较,统一转datetime。除此之外不允许其它类型之间的转换。
算术运算符
算术运算符包括:+, -, * , /, %, +, -,其隐式转换规则:
只有string、bigint、double和Decimal才能参与算术运算。String在参与运算前会进行隐式类型转换到double。Bigint和double共同参与计算时,会将bigint隐式转换为double。日期型和布尔型不允许参与算数运算。
备注:
- 算术运算符的相关章节 算术操作符。
逻辑运算符
逻辑运算符包括:and, or和not,其隐式转换规则:
- 只有boolean才能参与逻辑运算。
- 其他类型不允许参与逻辑运算,也不允许其他类型的隐式类型转换。
备注:
- 逻辑运算符的相关章节 逻辑操作符。
MaxCompute SQL内建函数
MaxCompute SQL提供了大量的系统函数,方便用户对任意行的一列或多列进行计算,输出任意种的数据类型。其隐式转换规则:
- 在调用函数时,如果输入参数的数据类型与函数定义的参数数据类型不一致,把输入参数的数据类型转换为函数定义的数据类型。
- 每个ODPS SQL内建函数的参数对于允许的隐式类型转换的要求不同,详见 内建函数 部分的说明。
CASE WHEN
Case when的隐式转换规则:
- 如果返回类型只有bigint,double,统一转double;
- 如果返回类型中有string类型,统一转string,如果不能转则报错(如boolean类型);
- 除此之外不允许其它类型之间的转换;
备注:
- Case when的详细介绍请参阅 [CASE WHEN表达式]
分区表
MaxCompute SQL支持分区表。指定分区表会对用户带来诸多便利,例如:提高SQL运行效率,减少计费等。在如下场景下使用分区表将会带来较大的收益:
- 在Select语句的Where条件过滤中使用分区列作为过滤条件;
create table src (key string, value bigint) partitioned by (pt string); -- 目前,MaxCompute 仅承诺String类型分区
select * from src where pt='20151201'; -- 正确使用方式。MaxCompute 在生成查询计划时只会将'20151201'分区的数据纳入输入中
select * from src where pt = 20151201; -- 错误的使用方式。在这样的使用方式下,MaxCompute并不能保障分区过滤机制的有效性。pt是String类型,当String类型与Bigint(20151201)比较时,MaxCompute会将二者转换为Double类型,此时有可能会有精度损失。
与此同时,部分对分区操作的SQL的运行效率则较低,给您带来较高的计费,例如:
- 使用动态分区
对于部分 MaxCompute 操作命令,处理分区表和非分区表时的语法有差别,详细情况请参考DDL语句 及 DML语句 部分的说明 。目前,ODPS分区仅支持string类型,不承诺其他分区类型的正确性,不支持其他任意类型的隐式类型转换。
UNION ALL
参与 UNION ALL 运算的所有列的数据类型、列个数、列名称必须完全一致,否则抛异常。
String类型与Datetime类型之间的转换
MaxCompute 支持string类型和datetime类型之间的相互转换。转换时使用的格式为yyyy-mm-dd hh:mi:ss,其中:
单位 | 字符串(忽略大小写) | 有效值域 |
---|---|---|
年 | yyyy | 0001 ~ 9999 |
月 | mm | 01 ~ 12 |
日 | dd | 01 ~ 28,29,30,31 |
时 | hh | 00 ~ 23 |
分 | mi | 00 ~ 59 |
秒 | ss | 00 ~ 59 |
备注:
- 各个单位的值域中,如果首位为0,不可省略,例如:”2014-1-9 12:12:12”就是非法的datetime格式,无法从这个string类型数据转换为datetime类型,必须写为”2014-01-09 12:12:12”。
- 只有符合上述格式描述的string类型才能够转换为datetime类型,例如:cast(“2013-12-31 02:34:34” as datetime),将会把string类型”2013-12-31 02:34:34”转换为datetime类型。同理,datetime转换为string时,默认转换为yyyy-mm-dd hh:mi:ss的格式。
类似于下面的转换尝试,将会失败导致异常,例如:
cast("2013/12/31 02/34/34" as datetime)
cast("20131231023434" as datetime)
cast("2013-12-31 2:34:34" as datetime)
值得注意的是,”dd”部分的阈值上限取决于月份实际拥有的天数,如果超出对应月份实际拥有的天数,将会导致异常退出,例如:
cast("2013-02-29 12:12:12" as datetime) -- 异常返回,2013年2月没有29日
cast("2013-11-31 12:12:12" as datetime) -- 异常返回,2013年11月没有31日
MaxCompute 提供了to_date函数,用以将不满足日期格式的string类型数据转换为datetime类型。详细信息请参阅 TO_DATE 。
最后更新:2016-11-23 17:16:04
上一篇:
多线程下载示例__SDK示例_批量数据通道_大数据计算服务-阿里云
下一篇:
运算符__SQL_大数据计算服务-阿里云
图片鉴黄同步调用接口__智能图片鉴黄API_内容检测API文档_阿里绿网-阿里云
更多__解决方案_平台介绍_数加平台介绍-阿里云
添加截图配置__直播流操作接口_API 手册_CDN-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
弹性Web托管如何绑定域名__产品相关问题_使用问题_弹性 Web 托管-阿里云
阿里云栖大会上 “达摩院”吸睛了!
堡垒机__使用金融云产品_金融云-阿里云
阿里云异构计算产品集结完毕 覆盖全场景AI与高性能计算需求
管理文件系统__文件系统和挂载点_用户指南_文件存储-阿里云
Docker使用方法__软件镜像_高性能计算-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云