查询加速 SQL 语言参考
查询加速支持使用类似 ANSI SQL 的语言表示对 blob 内容的查询。 查询加速 SQL 方言是 ANSI SQL 的一个子集,支持的数据类型、运算符等有限,但它也在 ANSI SQL 上扩展以支持对层次结构半结构化数据格式(如 JSON)的查询。
SELECT 语法
查询加速支持的唯一 SQL 语句是 SELECT 语句。 此示例返回表达式为其返回 true 的每一行。
SELECT * FROM table [WHERE expression] [LIMIT limit]
对于 CSV 格式的数据,表必须为 。 这意味着,将针对 REST 调用中指定的任何 blob 运行查询。 对于 JSON 格式的数据,表是“表描述符”。请参阅本文中的表描述符部分。
在以下示例中,对于 WHERE 表达式为其返回 true 的每一行,此语句将返回通过计算每个投影表达式而得到的新行。
SELECT expression [, expression ...] FROM table [WHERE expression] [LIMIT limit]
可以将一个或多个特定列指定为 SELECT 表达式的一部分(例如:SELECT Title, Author, ISBN
)。
注意
可在 SELECT 表达式中使用的特定列的最大数目为 49。 如果需要 SELECT 语句返回超过 49 列,请为 SELECT 表达式使用通配符 (*
)(例如:SELECT *
)。
以下示例在表达式返回 true 的每一行上返回聚合计算(例如特定列的平均值)。
SELECT aggregate_expression FROM table [WHERE expression] [LIMIT limit]
以下示例为拆分 CSV 格式的 blob 返回合适的偏移量。 请参阅本文的 Sys.Split部分。
SELECT sys.split(split_size)FROM BlobStorage
数据类型
数据类型 | 说明 |
---|---|
INT | 64 位带符号整数。 |
FLOAT | 64 位(双精度)浮点。 |
STRING | 可变长度的 Unicode 字符串。 |
TIMESTAMP | 时间点。 |
BOOLEAN | True 或 False。 |
从 CSV 格式的数据读取值时,所有值都作为字符串读取。 使用 CAST 表达式可以将字符串值转换为其他类型。 根据上下文,值可以隐式强制转换为其他类型。 有关详细信息,请参阅数据类型优先级 (transact-SQL)。
表达式
引用字段
对于 JSON 格式的数据或带有标题行的 CSV 格式的数据,可以按名称引用字段。 字段名称可以带引号或不带引号。 带引号的字段名称将用双引号字符 ("
) 括起来,可以包含空格,并且区分大小写。 未加引号的字段名称不区分大小写,并且不能包含任何特殊字符。
在 CSV 格式的数据中,字段也可以按序号引用,并以下划线 (_
) 字符作为前缀。 例如,第一个字段可引用为 _1
,或者第 11 个字段可引用为 _11
。 按序号引用字段适用于不包含标题行的 CSV 格式的数据,在这种情况下,按序号引用是引用特定字段的唯一方法。
运算符
支持以下标准 SQL 运算符:
运算符 | 说明 |
---|---|
= |
比较两个表达式的等价性(比较运算符)。 |
!= |
测试某个表达式是否不等于另一个表达式(比较运算符)。 |
<> |
比较两个表达式,表示不等于(比较运算符)。 |
< |
比较两个表达式,表示小于(比较运算符)。 |
<= |
比较两个表达式,表示小于或等于(比较运算符)。 |
> |
比较两个表达式,表示大于(比较运算符)。 |
>= |
比较两个表达式以得出大于或等于的结果(比较运算符)。 |
+ |
两个数相加。 这个加法算术运算符也可以将一个以天为单位的数字加到日期中。 |
- |
将两个数相减(减法算术运算符)。 |
/ |
用一个数除以另一个数(算术除法运算符)。 |
* |
两个表达式相乘(算术乘法运算符)。 |
% |
返回两数相除后的余数。 |
AND |
在两个整数值之间执行“逻辑位与”运算。 |
OR |
将两个指定的整数值转换为二进制表达式后执行逻辑位或运算。 |
NOT |
对布尔型输入取反。 |
CAST |
将一种数据类型的表达式转换为另一种。 |
BETWEEN |
指定测试范围。 |
IN |
确定指定的值是否与子查询或列表中的值相匹配。 |
NULLIF |
如果两个指定的表达式相等,则返回空值。 |
COALESCE |
按顺序计算变量并返回最初不等于 NULL 的第一个表达式的当前值。 |
如果运算符左侧和右侧的数据类型不同,则将根据此处指定的规则执行自动转换:数据类型优先级 (Transact-SQL) 。
查询加速 SQL 语言仅支持本文中讨论的数据类型的一小部分。 请参阅本文的数据类型部分。
转换
根据此处的规则:数据类型转换(数据库引擎),查询加速 SQL 语言支持 CAST 运算符。
查询加速 SQL 语言仅支持本文中讨论的数据类型的很小一部分。 请参阅本文的数据类型部分。
字符串函数
查询加速 SQL 语言支持以下标准 SQL 字符串函数:
函数 | 说明 |
---|---|
CHAR_LENGTH | 如果字符串表达式是字符数据类型,则按字符返回字符串表达式的长度;否则,按字节返回字符串表达式的长度(最小整数不小于位数除以 8)。 (此函数与 CHARACTER_LENGTH 函数相同。) |
CHARACTER_LENGTH | 如果字符串表达式是字符数据类型,则按字符返回字符串表达式的长度;否则,按字节返回字符串表达式的长度(最小整数不小于位数除以 8)。 (此函数与 CHAR_LENGTH 函数相同) |
LOWER | 将大写字符数据转换为小写字符数据后返回字符表达式。 |
UPPER | 返回小写字符数据转换为大写的字符表达式。 |
SUBSTRING | 返回 SQL Server 中的字符、二进制文件、文本或图像表达式的一部分。 |
TRIM | 删除字符串开头和结尾的空格字符 char(32) 或其他指定字符。 |
LEADING | 删除字符串开头的空格字符 char(32) 或其他指定字符。 |
TRAILING | 删除字符串结尾的空格字符 char(32) 或其他指定字符。 |
下面是几个示例:
函数 | 示例 | 结果 |
---|---|---|
CHARACTER_LENGTH | SELECT CHARACTER_LENGTH('abcdefg') from BlobStorage |
7 |
CHAR_LENGTH | SELECT CHAR_LENGTH(_1) from BlobStorage |
1 |
LOWER | SELECT LOWER('AbCdEfG') from BlobStorage |
abcdefg |
UPPER | SELECT UPPER('AbCdEfG') from BlobStorage |
ABCDEFG |
SUBSTRING | SUBSTRING('123456789', 1, 5) |
23456 |
TRIM | TRIM(BOTH '123' FROM '1112211Microsoft22211122') |
Microsoft |
日期函数
支持以下标准 SQL 日期函数:
DATE_ADD
DATE_DIFF
EXTRACT
TO_STRING
TO_TIMESTAMP
目前,所有标准 IS08601 的日期格式都会被转换。
DATE_ADD 函数
对于 DATE_ADD
函数,查询加速 SQL 语言支持年、月、日、小时、分钟和秒。
示例:
DATE_ADD(datepart, quantity, timestamp)
DATE_ADD('minute', 1, CAST('2017-01-02T03:04:05.006Z' AS TIMESTAMP)
DATE_DIFF 函数
对于 DATE_DIFF
函数,查询加速 SQL 语言支持年、月、日、小时、分钟和秒。
DATE_DIFF(datepart, timestamp, timestamp)
DATE_DIFF('hour','2018-11-09T00:00+05:30','2018-11-09T01:00:23-08:00')
EXTRACT 函数
对于 EXTRACT,除 DATE_ADD
函数支持的日期部分外,查询加速 SQL 语言还支持将 timezone_hour 和 timezone_minute 作为日期部分。
示例:
EXTRACT(datepart FROM timestampstring)
EXTRACT(YEAR FROM '2010-01-01T')
TO_STRING 函数
示例:
TO_STRING(TimeStamp , format)
TO_STRING(CAST('1969-07-20T20:18Z' AS TIMESTAMP), 'MMMM d, y')
下表描述了可用于指定 TO_STRING
函数的输出格式的字符串。
格式字符串 | 输出 |
---|---|
yy | 以 2 位数格式表示年份 - 1999 年为“99” |
y | 以 4 位数格式表示年份 |
yyyy | 以 4 位数格式表示年份 |
M | 年度月份 - 1 |
MM | 零填充月份 - 01 |
MMM | 缩写 年度月份 - JAN |
MMMM | 全拼月份 - May |
d | 月份日期 (1-31) |
dd | 零填充月份日期 (01-31) |
a | 上午或下午 |
h | 一天的小时时段 (1-12) |
hh | 零填充的一天的小时时段 (01-12) |
H | 一天的小时时段 (0-23) |
HH | 零填充的一天的小时时段 (00-23) |
m | 分钟 (0-59) |
mm | 零填充分钟 (00-59) |
s | 秒 (0-59) |
ss | 零填充秒 (00-59) |
S | 秒的小数部分 (0.1-0.9) |
SS | 秒的小数部分 (0.01-0.99) |
SSS | 秒的小数部分 (0.001-0.999) |
X | 偏移量(小时) |
XX 或 XXXX | 偏移量(小时和分钟)(+0430) |
XXX 或 XXXXX | 偏移量(小时和分钟)(-07:00) |
x | 偏移量(小时) (7) |
xx 或 xxxx | 偏移量(小时和分钟)(+0530) |
Xxx 或 xxxxx | 偏移量(小时和分钟)(+05:30) |
TO_TIMESTAMP 函数
仅支持 IS08601 格式。
示例:
TO_TIMESTAMP(string)
TO_TIMESTAMP('2007T')
注意
还可以使用 UTCNOW
函数获取系统时间。
聚合表达式
SELECT 语句可能包含一个或多个投影表达式或单个聚合表达式。 支持以下聚合表达式:
表达式 | 说明 |
---|---|
COUNT(*) | 返回与谓词表达式匹配的记录数。 |
COUNT(expression) | 返回表达式为非 null 的记录数。 |
AVG(expression) | 返回表达式非 null 值的平均值。 |
MIN(expression) | 返回表达式的最小非 null 值。 |
MAX(expression | 返回表达式的最大非 null 值。 |
SUM(expression) | 返回表达式的所有非 null 值的总和。 |
MISSING
IS MISSING
运算符是查询加速 SQL 语言支持的唯一非标准用法。 对于 JSON 数据,如果特定输入记录中缺少某个字段,则表达式字段 IS MISSING
将计算为布尔值 true。
表描述符
对于 CSV 数据,表名称始终为 BlobStorage
。 例如:
SELECT * FROM BlobStorage
对于 JSON 数据,可以使用其他选项:
SELECT * FROM BlobStorage[*].path
这允许对 JSON 数据的子集进行查询。
对于 JSON 查询,你可以在 FROM 子句中的某部分提及路径。 这些路径将帮助分析 JSON 数据的子集。 这些路径可以引用 JSON 数组和对象值。
我们来看一个示例,以便更详细地了解这一点。
这是示例数据:
{
"id": 1,
"name": "mouse",
"price": 12.5,
"tags": [
"wireless",
"accessory"
],
"dimensions": {
"length": 3,
"width": 2,
"height": 2
},
"weight": 0.2,
"warehouses": [
{
"latitude": 41.8,
"longitude": -87.6
}
]
}
你可能只对上述数据的 warehouses
JSON 对象感兴趣。 warehouses
对象是一个 JSON 数组类型,因此你可以在 FROM 子句中提及它。 示例查询将如下所示:
SELECT latitude FROM BlobStorage[*].warehouses[*]
查询将获取所有字段,但仅选择纬度。
如果只想访问 dimensions
JSON 对象的值,则可以在查询中使用引用该对象。 例如:
SELECT length FROM BlobStorage[*].dimensions
这还限制了对 dimensions
对象成员的访问。 如果要访问 json 字段的其他成员和 JSON 对象的内部值,则可以使用如下面的示例中所示的查询:
SELECT weight,warehouses[0].longitude,id,tags[1] FROM BlobStorage[*]
注意
BlobStorage 和 BlobStorage[*] 均引用整个对象。 但是,如果在 FROM 子句中有路径,则需要使用 BlobStorage [*].path
Sys.Split
这是 SELECT 语句的一种特殊形式,仅适用于 CSV 格式的数据。
SELECT sys.split(split_size) FROM BlobStorage
如果要成批下载并批处理 CSV 数据记录,请使用此语句。 通过这种方式,你可以并行处理记录,而无需一次下载所有记录。 此语句不从 CSV 文件返回记录。 而是返回批大小的集合。 然后,可以使用每个批大小检索一批数据记录。
使用 split_size 参数可指定每个批包含的字节数。 例如,如果希望一次只处理 10 MB 的数据,则语句将如下所示:SELECT sys.split(10485760)FROM BlobStorage
,因为 10 MB 等于 10,485,760 字节。 每个批最多可容纳 10 MB 的记录。
在大多数情况下,每个批的大小将略高于你指定的数字。 这是因为批不能包含部分记录。 如果批中的最后一条记录在阈值结束之前开始,则该批需要更大的容量才能包含完整记录。 最后一个批的大小可能小于指定的大小。
备注
split_size 必须至少为 10 MB (10485760)。