跨库联查 SQL 语法介绍

最近更新时间:2024-11-08 16:29:52

我的收藏

SELECT 查询的基本语法结构

跨库联查目前仅支持 SELECT 查询。
SELECT [ ALL | DISTINCT ] select_expression [, ...]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ]
[ HAVING condition]
[ WINDOW window_definition_list]
[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
[ ORDER BY expression [ ASC | DESC ] [, ...] ]
[ OFFSET count [ ROW | ROWS ] ]
[ LIMIT { count | ALL } ]
[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES } ]

详细解释

SELECT [ ALL | DISTINCT ] select_expression [, ...]
SELECT:指定要检索的列或计算表达式。
ALL:(默认)返回所有记录。
DISTINCT:返回唯一记录,去除重复结果。
select_expression:要选择的列名、表达式或计算结果,可以包含一个或多个,用逗号分隔。
FROM from_item [, ...]
FROM:指定查询的数据源,如表、视图或子查询。
from_item:一个或多个数据源,支持表名、视图、子查询等。
WHERE condition
WHERE:用于筛选记录,condition 是条件表达式,只有满足条件的记录会被包含在结果集中。
GROUP BY [ ALL | DISTINCT ] grouping_element [, ...]
GROUP BY:将结果集按一个或多个列进行分组,通常用于聚合函数。
ALL:(默认)对所有记录进行分组。
DISTINCT:对唯一记录进行分组。
grouping_element:用于分组的列或表达式。
HAVING condition
HAVING:对分组后的结果进行筛选,类似于 WHERE,但作用于聚合结果。
WINDOW window_definition_list
WINDOW:定义窗口函数的窗口,这些窗口可以用于计算复杂的聚合,如移动平均。
{ UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select
UNION:合并多个查询的结果,去重(使用 ALL 保留所有记录)。
INTERSECT:返回所有查询结果的交集,仅包含在所有查询中出现的记录。
EXCEPT:返回第一个查询的结果中存在但其他查询中不存在的记录。
ALLDISTINCT:控制重复记录的处理。
ORDER BY expression [ ASC | DESC ] [, ...]
ORDER BY:对结果集进行排序。
expression:排序依据的列或表达式。
ASC:升序(默认)。
DESC:降序。
OFFSET count [ ROW | ROWS ]
OFFSET:跳过结果集的前 count 行。
ROWROWS:指定跳过的行数,ROWROWS 通常可以互换使用。
LIMIT { count | ALL }
LIMIT:限制返回的记录数量。
count:返回的记录数。
ALL:不限制返回记录数(默认,通常可以省略)。
FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES }
FETCH:控制从结果集中返回的行数,并可以选择是否包含具有相同排序值的行。
FIRST NEXT:获取结果集中的第一行或接下来的行。
count:要返回的行数。
ROWROWS:指定返回的行数。
ONLY:只返回指定数量的行。
WITH TIES:包括与最后一行具有相同排序值的记录。

关键字及标识符

关键字
标识符
下表列出了 MPP 中所有保留的关键字及其在 SQL 标准中的状态。这些保留关键字必须用双引号括起来才能用作标识符。
Keyword
SQL:2016
ALTER
reserved
AND
reserved
AS
reserved
BETWEEN
reserved
BY
reserved
CASE
reserved
CAST
reserved
CONSTRAINT
reserved
CREATE
reserved
CROSS
reserved
CUBE
reserved
CURRENT_CATALOG
reserved
CURRENT_DATE
reserved
CURRENT_PATH
reserved
CURRENT_ROLE
reserved
CURRENT_SCHEMA
reserved
CURRENT_TIME
reserved
CURRENT_TIMESTAMP
reserved
CURRENT_USER
reserved
DEALLOCATE
reserved
DELETE
reserved
DESCRIBE
reserved
DISTINCT
reserved
DROP
reserved
ELSE
reserved
END
reserved
ESCAPE
reserved
EXCEPT
reserved
EXISTS
reserved
EXTRACT
reserved
FALSE
reserved
FOR
reserved
FROM
reserved
FULL
reserved
GROUP
reserved
GROUPING
reserved
HAVING
reserved
IN
reserved
INNER
reserved
INSERT
reserved
INTERSECT
reserved
INTO
reserved
IS
reserved
JOIN
reserved
JSON_ARRAY
reserved
JSON_EXISTS
reserved
JSON_OBJECT
reserved
JSON_QUERY
reserved
JSON_TABLE
reserved
JSON_VALUE
reserved
LEFT
reserved
LIKE
reserved
LISTAGG
reserved
LOCALTIME
reserved
LOCALTIMESTAMP
reserved
NATURAL
reserved
NORMALIZE
reserved
NOT
reserved
NULL
reserved
ON
reserved
OR
reserved
ORDER
reserved
OUTER
reserved
PREPARE
reserved
RECURSIVE
reserved
RIGHT
reserved
ROLLUP
reserved
SELECT
reserved
SKIP
reserved
TABLE
reserved
THEN
reserved
TRIM
reserved
TRUE
reserved
UESCAPE
reserved
UNION
reserved
UNNEST
reserved
USING
reserved
VALUES
reserved
WHEN
reserved
WHERE
reserved
WITH
reserved
标识符是用来识别 DMC 数据源、数据库、表、列、函数或其他对象名称的标记。

标识符命名规范

必须以字母开头,随后可以包括字母数字字符和下划线。包含其他字符的标识符必须用双引号(")括起来。当用双引号括起来时,标识符可以使用任何字符。在带引号的标识符中,用另一个前导双引号转义双引号(")。标识符不区分大小写。

有效的标识符示例

tablename SchemaName example_dmc_resource.a_schema."table$partitions" "identifierWith""double""quotes"

必须使用双引号括起来才能使用的标识符示例

"table-name" "123DbName" "colum$name@field"

运算符

逻辑运算符
比较运算符
数值运算符
函数
说明
示例
AND
如果值都为 true,那么结果为 true
a AND b
OR
只要有一个值为 true,那么结果为 true
a OR b
NOT
如果值为 false,那么返回 true
NOT a
函数
说明
示例
<
小于
a > 1
>
大于
a < 1
<=
小于等于
a = 1
>=
大于等于
a >= 1
=
等于
a <= 1
<>
不等于
a <> 1
!=
不等于
a != 1
函数
说明
+
加法
-
减法
*
乘法
/
除法
%
取模

函数

数学函数
字符串函数
聚合函数
日期函数
开窗函数
函数
返回值类型
说明
示例
mod(n, m)
默认与 x 类型一致
返回 n 除以 m 的余数。
mod(101, 4)
sqrt(x)
double
平方根。
sqrt(9)
abs(x)
默认与 x 类型一致
绝对值。
abs(3)
cbrt(x)
double
立方根。
cbrt(3)
ceil(x)
默认与 x 类型一致
ceiling 函数的别名。
-
ceiling(x)
默认与 x 类型一致
返回大于给定数值表达式的最小整数。
ceiling(5.5),返回值为6。
degrees(x)
double
将弧度转换为度数。
degrees(1),返回值为57。
e(x)
double
返回欧拉常数。
-
exp(x)
double
返回取x次幂的欧拉常数。
-
floor(x)
默认与 x 类型一致
返回比 x 小的最大整数。
floor(5.5),返回值为5。
ln(x)
double
返回 x 的自然对数。
-
log(b, x)
double
返回以 b 为底的x的对数。
-
log2(x)
double
返回以 x 为底2的对数。
log2(2),返回值为1。
log10(x)
double
返回以 x 为底10的对数。
log10(10),返回值为1。
pi()
double
返回常量 pi。
-
pow(x,p)
double
等价于 power()。
pow(3, 2)
power(x, p)
double
返回 x 的 p 次方。
-
radians(x)
double
将角度 x(以度为单位)转换为弧度。
-
round(x)
默认与 x 类型一致
返回 x 四舍五入到最接近的整数。
-
round(x, d)
默认与 x 类型一致
返回 x 四舍五入到小数点后 d 位。
-
sign(x)
默认与 x 类型一致
返回 x 所对应的正负号,x > 0 返回1;x< 0,返回-1;x=0, 返回 0。
-
truncate(x)
double
返回截取小数点后的数。
truncate(4.9),返回值为4
rand()
double
random函数的别名。
-
random()
double
返回[0,1.0)范围内的随机值。
-
random(n)
默认与 x 类型一致
返回[0,n)范围内的随机值。
-
random(m, n)
默认与 x 类型一致
返回[0,m)范围内的随机值。
-
函数
返回值类型
说明
示例
chr(n)
varchar
以单个字符串形式返回 Unicode码 n 位。
-
codepoint(string)
integer
返回字符串中唯一字符的Unicode 码。
-
concat(string1, ..., stringN)
varchar
字符串拼接函数,连接两个或多个字符串,从而组成一个新的字符串。
concat('hello', ' ', 'world')
,拼接后为'hello world'。
concat_ws(string0, string1, ..., stringN)
varchar
使用 string0 作为分隔符返回 string1、string2、...、stringN 的串联。 如果 string0 为 null,则返回值为 null/ 分隔符后面的参数中提供的任何空值都将被跳过。
-
concat_ws(string0, array(varchar))
varchar
使用 string0 作为分隔符返回数组中元素的串联. 如果 string0 为 null,则返回值为 null。数组中的任何空值都会被跳过。
-
format(format, args...)
varchar
查看 format()。

hamming_distance(string1, string2)
bigint
返回 string1和 string2的汉明距离,即对应字符不同的位置数。
说明:
两字符串的长度必须相同。
-
length(string)
bigint
返回 string 的长度。
-
levenshtein_distance(string1, string2)
bigint
返回 string1和 string2的Levenshtein 编辑距离,即将 string1改为 string2所需的单字符编辑(插入、删除或替换)的最小数量。
-
lower(string)
varchar
将 string 转换为小写。
lower('ABC'),返回值为'abc'。
lpad(string, size, padstring)
varchar
使用 padstring 在 string 左侧添加字符串,使得 string 的大小变为 size,如果 size 小于 string 的长度,结果将被截断为 size 大小,size 不能为负,padstring 必须非空。
-
ltrim(string)
varchar
删除 string 的前导空格。
-
position(substring IN string)
bigint
返回 string 中 substring 的第一个出现的位置,位置从1开始。如果未找到,则返回0。
-
replace(string, search)
varchar
从 string 中删除所有 search。
-
replace(string, search, replace)
varchar
将 string 中所有的 search 替换成 replace。
replace('hello old', 'old', 'new'),返回值为'hello new'。
reverse(string)
varchar
返回 string 的逆序字符串。
reverse('abc'),返回值为'cba'。
rpad(string, size, padstring)
varchar
使用 padstring 在 string 右侧添加字符串,使得 string 的大小变为 size。如果 size 小于 string 的长度,结果将被截断为 size 大小。size 不能为负,padstring 必须非空。
-
rtrim(string)
varchar
删除 string 末尾的空格。
-
split(string, delimiter)
-
使用 delimiter 拆分 string 并返回数组。
-
split(string, delimiter, limit)
-
使用 delimiter 拆分 string 并返回大小最大为 limit 的数组。
-
split_part(string, delimiter, index)
varchar
使用 delimiter 切分 string,并返回第 index 个字符串。
-
split_to_map(string, entryDelimiter, keyValueDelimiter)
-
返回 entryDelimiter 和 keyValueDelimiter 拆分字符串后的 map。
select split_to_map('a:1,b:2', ',', ':'),返回值为{'a':'1','b':'2'}。
strpos(string, substring)
bigint
返回 string 中第一个 substring 的起始位置。从第一个字符开始遍历,如果未找到,则返回0。
-
strpos(string, substring, instance)
bigint
返回 string 中第 n 个子字符串substring 的位置。instance 必须是一个正数,从第一个字符开始遍历,如果未找到,则返回0。
-
starts_with(string, substring)
boolean
判断 string 是否是以 substring 开头的字符串。
-
substr(string, start)
varchar
substring 函数的同名函数。
-
substr(string, start, length)
varchar
substring 函数的同名函数。
-
substring(string, start)
varchar
返回 string 从 start 开始截取的子字符串。
-
substring(string, start, length)
varchar
返回 string 从 start 开始截取 length 长度的子字符串。
-
translate(source, from, to)
varchar
把 source 中的所有 from 替换为 to。
-
trim(string)
varchar
删除字符串 string 中首尾的空格。
-
trim([ [ specification ] [ string ] FROM ] source )
varchar
删除 source 中指定的任何前导和/或尾随字符。
-
upper(string)
varchar
将字符串 string 中的小写字母转换为大写字母。
-
聚合函数在 GROUP BY 语句中使用。
函数
返回值类型
说明
any_value(x)
默认与 x 类型一致
返回任意非空值 x(如果存在)。x 可以是任何有效的表达式。 这允许从不直接属于聚合的列返回值,包括在查询中使用这些列表达式。
arbitrary(x)
默认与 x 类型一致
等同于 any_value()。
array_agg(x)
默认与 x 类型一致
返回由输入 x 元素创建的数组。
avg(x)
double
返回均值。
sum(x)
bigint
返回总和。
max(x)
bigint
返回最大值。
max(x, n)
array
返回输入中最大的 n 个值。
max_by(x, y)
默认与 x 类型一致
返回 x 中与 y 的最大值相关连的值。
max_by(x, y, n)
array
按照 y 降序排列,返回 x 中 n 个 与 y 中 n 个最小值相关联的值。
min(x)
bigint
返回最小值。
min(x, n)
min_by(x, y, n)
返回输入中最小的 n 个值。
min_by(x, y)
默认与 x 类型一致
返回 x 中与 y 的最小值相关连的值。
min_by(x, y, n)
array
按照 y 升序排列,返回 x 中 n 个 与 y 中 n 个最小值相关联的值。
checksum(x)
varbinary
返回输入值的校验和。
bool_and(boolean)
boolean
所有输入值都为 true 时,返回 true,否则返回false。
bool_or(boolean)
boolean
输入值中有一个为 true,则返回 true,否则返回 false。
every(boolean)
boolean
等同于 bool_and()。
count(*)
bigint
返回行数。
count(x)
bigint
返回非空值的个数。
count_if(x)
boolean
返回输入值为 true 的个数。
geometric_mean(x)
double
返回几何平均值。
listagg(x, separator)
varchar
返回字符串,由 separator 把每个 x 连接起来。
histogram
-
返回一个 map,包含每个输入值出现的次数。
函数
返回值类型
说明
示例
current_date
date
返回当前 query 启动时的日期
SELECT current_date
current_time
time with time zone
返回当前 query 启动时的时间
-
current_timestamp
timestamp with time zone
返回当前 query 启动时的时间戳,精度为毫秒级。
-
current_timezone()
varchar
以 IANA(例如,America / Los_Angeles)定义的格式返回当前时区,或以 UTC 的固定偏移量(例如+08:35)返回当前时区。
SELECT current_timezone()
date(x)
date
与 CAST(x AS date) 函数功能相同,可实现将x的类型转换为 Date。
-
date_add(unit, value, timestamp)
-
添加一个时间间隔 value 到 timestamp 上,时间间隔的单位为 unit,可以使用负值作为减法
SELECT date_add('second', 86, TIMESTAMP '2020-03-01 00:00:00'),返回值为2020-03-01 00:01:26.000
date_diff(unit, timestamp1, timestamp2)
bigint
返回 timestamp1与 imestamp2的差值,该差值的单位为 unit。unit 的具体单位取值,请参见间隔函数。
SELECT date_diff('hour', TIMESTAMP '2020-03-01 00:00:00 UTC', TIMESTAMP '2020-03-02 00:00:00 UTC')
,返回值为24
human_readable_seconds(double)
varchar
格式化 double 代表的秒数为可读的时间字符串,包括 weeks, days, hours, minutes, 和 seconds。
SELECT human_readable_seconds(3762),返回值为1 hour, 2 minutes, 42 seconds
parse_duration(string)
interval
解析字符串 string 为单位为 value unit 的时间间隔。
-SELECT parse_duration('3.81 d'),返回值为3 19:26:24.000
date_trunc(unit, x)
-
返回x截取到单位 unit 之后的值。unit 的具体单位取值,请参见间隔函数。
-
date_format(timestamp, format)
varchar
使用format指定的格式,将timestamp格式化成字符串。
SELECT date_format(TIMESTAMP '2022-10-20 05:10:00', '%m-%d-%Y %H'),返回值为10-20-2022 05
date_parse(string, format)
date
使用 format 将 string 解析为时间戳。
SELECT date_parse('2022/10/20/05', '%Y/%m/%d/%H'),返回值为2022-10-20 05:00:00.000
last_day_of_month(x)
date
返回日期 x 当月的最后一天。
last_day_of_month(current_date)
from_iso8601_timestamp(string)
timestamp with time zone
将 ISO 8601格式化的字符串解析为具有时区的时间戳。
SELECT from_iso8601_timestamp('2020-05-11'),返回值为2020-05-11 00:00:00.000 America/Vancouver
from_iso8601_timestamp_nanos(string)
timestamp with time zone
将 ISO 8601格式化的字符串解析为具有时区的时间戳,精度为纳秒级。
SELECT from_iso8601_timestamp_nanos('2020-05-11T11:15:05'),返回值为2020-05-11 11:15:05.000000000 America/Vancouver
from_iso8601_date(string)
date
将 ISO 8601格式的字符串解析为日期。
SELECT from_iso8601_date('2020-W10'),返回值为2020-03-02
from_unixtime(unixtime)
timestamp with time zone
返回 unix 时间戳。
from_unixtime(1475996660),返回值为2016-10-09 15:04:20.000
from_unixtime(unixtime, zone)
timestamp with time zone
返回 unixtime 的时间戳,string 指定时区
-
from_unixtime(unixtime, hours, minutes)
timestamp with time zone
返回为 hours 和 minutes 对应时区的unixtime 时间戳。
-
from_unixtime_nanos(unixtime)
timestamp with time zone
返回 unix 时间戳,精度为纳米级。
SELECT from_unixtime_nanos(DECIMAL '1234'),返回值为1970-01-01 00:00:00.000001234 UTC
localtime
time
返回查询开始时的当前时间。
-
localtimestamp
timestamp
返回查询开始时的当前时间戳。
-
now()
timestamp with time zone
current_timestamp 的别名。
-
to_iso8601(x)
varchar
将x格式化为 ISO 8601字符串。x 可以是date、timestamp 或带时区 timestamp。
-
to_milliseconds(interval)
bigint
转换为以毫秒为单位的时间间 interval。
-
to_unixtime(timestamp)
double
转换为 unix 时间戳。
-
extract(field FROM x)
bigint
返回 field 从 x 中。
-
day(x)
bigint
返回指定日期在当月的天数。
-
day_of_month(x)
bigint

day(x) 函数的别名。
-
day_of_week(x)
bigint
返回指定日期对应的星期值,值范围从1(星期一)到7(星期天)。
-
day_of_year(x)
bigint
返回指定日期对应一年中的第几天,值范围从1到366。
-
dow(x)
bigint
day_of_week 函数的别名。
-
doy(x)
bigint
day_of_year 函数的别名
-
hour(x)
bigint
返回指定日期对应的小时,值范围从1到23。
-
millisecond(x)
bigint
返回指定时间的毫秒数。
-
minute(x)
bigint
返回指定时间的分钟数。
-
month(x)
bigint
返回指定日期对应的月份。
-
quarter(x)
bigint
返回指定日期对应的分钟。
-
second(x)
bigint
返回指定日期对应的秒数。
-
timezone_hour(timestamp)
bigint
返回从指定时间戳对应时区偏移的小时数。
-
timezone_minute(timestamp)
bigint
返回从指定时间戳对应时区偏移的分钟数。
-
week(x)
bigint
返回指定日期对应一年中的 ISO week,值范围从1到53。
-
week_of_year(x)
bigint
week 函数的别名。
-
year(x)
bigint
返回指定日期对应的年份。
-
间隔函数支持的间隔单位如下:
单位
描述
millisecond
毫秒
second
minute
分钟
hour
小时
day
week
星期
month
quarter
季度
year

聚合函数

所有的聚合函数都可以通过添加 OVER 子句来作为开窗函数。聚合函数会计算当前窗口的每一行数据。
示例:以下查询生成每个店员每天订单价格的滚动总和
SELECT clerk, orderdate, orderkey, totalprice,
sum(totalprice) OVER (PARTITION BY clerk
ORDER BY orderdate) AS rolling_sum
FROM orders
ORDER BY clerk, orderdate, orderkey

Ranking functions

函数
返回值类型
说明
cume_dist()
bigint
计算某个值在分区中相对于所有值的位置。
dense_rank()
bigint
计算某个值在一组值中的排名,如果出现排名相等,与函数 rank 不同,dense_rank 不会在排名序列中产生空位。
ntile(n)
bigint
将窗口分区的行划分为 n 个桶,返回行所在的桶数,范围从 1 到 n。
percent_rank()
double
计算某个值在一组值中的百分比排名。返回值以 0 到 1 之间的小数表示。
rank()
bigint
计算某个值在一组值中的排名。如果出现排名相等,则在排名序列中留出空位。
ow_number()
bigint
为每一行分配一个唯一的连续编号。

Value functions

函数
返回值类型
说明
first_value(x)
默认与 x 类型一致
返回分区中某列第一条数据的值。
last_value(x)
默认与 x 类型一致
返回分区中某列最后一条数据的值。
nth_value(x, offset)
默认与 x 类型一致
返回距窗口头第 n 行的值。n 从 1 开始。 如果 ignoreNulls=true,查找第 n 行时将跳过 null。否则,每一行都计入 n。 如果不存在这样的第 n 行(例如,当 n 为10时,窗口大小小于10),则返回null。第一个参数为列名,第二个参数为之前第 n 行。
lead(x[, offset[, default_value]])
默认与 x 类型一致
返回窗口中当前行向下第 n 行的值。n 默认值为 1,default 默认值为 null。 如果第 n 行的 值为 null,则返回 null。 如果不存在这样的偏移行(例如,当偏移量为1时,窗口的最后一行没有任何向下行),则返回 default 。第一个参数为列名,第二个参数为之前第 n 行,第三个参数为默认值.
lag(x[, offset[, default_value]])
默认与 x 类型一致
返回窗口中当前行向上第 n 行的值。n 默认值为 1,default 默认值为 null。 如果第 n 行的 值为 null,则返回 null。 如果不存在这样的偏移行(例如,当偏移量为1时,窗口的第一行没有任何向上行),则返回 default。第一个参数为列名,第二个参数为之前第 n 行,第三个参数为默认值。