数据库管理 跨库联查 SQL 语法介绍

SELECT [ ALL | DISTINCT ] select_expression [, …][ FROM from_item [, …] ][ WHERE condition ][ GROUP BY [ ALL | DISTINCT ] grouping_element [, …] ][ HAVING condition][ WINDOW window_definition_list][ { UNI。

相关产品
数据库管理 产品页,含版本规格、价格与购买入口。

一、SELECT 查询的基本语法结构

跨库联查目前仅支持 SELECT 查询。

二、详细解释

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:返回第一个查询的结果中存在但其他查询中不存在的记录。

·ALL 和 DISTINCT:控制重复记录的处理。

ORDER BY expression [ ASC | DESC ] [, …]

·ORDER BY:对结果集进行排序。

·expression:排序依据的列或表达式。

·ASC:升序(默认)。

·DESC:降序。

OFFSET count [ ROW | ROWS ]

·OFFSET:跳过结果集的前 count 行。

·ROW 和 ROWS:指定跳过的行数,ROW 和 ROWS 通常可以互换使用。

LIMIT { count | ALL }

·LIMIT:限制返回的记录数量。

·count:返回的记录数。

·ALL:不限制返回记录数(默认,通常可以省略)。

FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES }

·FETCH:控制从结果集中返回的行数,并可以选择是否包含具有相同排序值的行。

·FIRST 或 NEXT:获取结果集中的第一行或接下来的行。

·count:要返回的行数。

·ROW和 ROWS:指定返回的行数。

·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 必须非空。 SELECT rpad('123', 5, '0');
rtrim(string) varchar 删除 string 末尾的空格。 –
split(string, delimiter) – 将字符串 string 按照指定的分隔符 delimiter 拆分为多个子字符串,并返回一个数组。 –
split(string, delimiter, limit) – 使用 delimiter 拆分 string 并返回大小最大为 limit 的数组。 –
split_part(string, delimiter, index) varchar 将字符串 string 按照指定的分隔符 delimiter 拆分为多个部分,并返回第 index 个部分。索引从 1 开始。 –
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,并返回截断后的结果。 –
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 返回指定日期 x 对应的 ISO 周数,取值范围为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_sumFROM ordersORDER 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 行,第三个参数为默认值。
赞 (0)
上一篇 4天前
下一篇 4天前