154
人物
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-阿裏雲