邏輯數倉功能可以打通不同引擎,不同實例,跨區域,跨存儲的OLAP、OLTP之間的壁壘,基于統一的SQL語法為用戶提供跨庫數據查詢和數據同步的能力。本文介紹邏輯數倉支持的SQL語法。
背景信息
邏輯數倉的查詢語法和函數基本兼容MySQL,因此可以使用MySQL的語法編寫查詢語句和函數,同時,還對邏輯數倉的語法進行擴展,支持創建和刪除邏輯視圖。
邏輯數倉的詳細功能,請參見核心功能。
使用場景
當您需要對業務數據進行快捷分析時,可以在原始數據上(如:MySQL中的庫表)定義一個邏輯視圖并直接查詢。如果需要基于原有分析結果做進一步分析,您還可以基于該邏輯視圖級聯地定義新的邏輯視圖。
邏輯視圖
創建邏輯視圖
創建邏輯視圖的語法結構如下:
CREATE VIEW <db_name>.<view_name> AS <query_statement>;
說明項 | 說明 |
| DBLink名稱。 |
| 自定義邏輯視圖名稱。 |
| SELECT語句:
|
查詢邏輯視圖
所有邏輯視圖均保存在名為public
公共庫的Schema中,因此查詢邏輯視圖時,需要在視圖名稱前帶上前綴public.
。
例如,查詢名為filtered_view
的邏輯視圖,語法結構如下:
SELECT * FROM public.filtered_view;
刪除邏輯視圖
例如,刪除邏輯視圖的語法結構如下:
DROP VIEW public.view_name;
查看所有邏輯視圖
例如,查看public庫下的所有邏輯視圖,語法結構如下:
SHOW VIEWS public;
其他
查看虛擬庫列表
例如,顯示所有已創建的虛擬庫(包括public公共庫),語法結構如下:
SHOW CATALOGS;
運算符
邏輯運算符
函數 | 說明 | 示例 |
AND | 邏輯與 |
|
OR | 邏輯或 |
|
NOT | 邏輯非 |
|
比較運算符
函數 | 說明 | 示例 |
> | 大于。 |
|
< | 小于。 |
|
= | 等于。 |
|
>= | 大于或等于。 |
|
<= | 小于或等于。 |
|
<> | 不等于。 |
|
!= | 不等于。 |
|
is null | 是否為null值。 |
|
is not null | 是否為非null。 |
|
is distinct from | 對比兩個值的null安全運算符,避免返回空結果,返回結果必定為true或false。 |
|
is not distinct from | 對比兩個值的NULL安全運算符,避免返回空結果,返回結果必定為true或false。 |
|
greatest(value1, value2, .., valuen) | 返回所有值中的最大值。 | - |
least(value1, value2, .., valuen) | 返回所有值中的最大值。 | - |
all | 比較單個值與子查詢返回值。 |
|
any/some | 比較單個值與子查詢返回值。 |
|
like | 在where子句中搜索列中的指定模式。 |
說明
|
數值運算符
函數 | 說明 |
+ | 加法 |
- | 減法 |
* | 乘法 |
/ | 除法 |
函數
數學函數
函數 | 返回值類型 | 說明 | 示例 |
mod(x) | 默認與x類型一致 | 取模。 |
|
pow(x,y) | 默認與x類型一致 | 指數運算。 |
|
sqrt(x) | 默認與x類型一致 | 平方根。 |
|
abs(x) | 默認與x類型一致 | 絕對值。 |
|
cbrt(x) | double | 立方根。 |
|
ceil(x) | - | ceiling函數的別名。 | - |
ceiling(x) | 默認與x類型一致 | 返回大于給定數值表達式的最小整數。 |
|
degrees(x) | double | 將弧度轉換為度數。 |
|
e(x) | double | 返回歐拉常數。 | - |
exp(x) | double | 返回取x次冪的歐拉常數。 | - |
floor(x) | 默認與x類型一致 | 返回比x小的最大整數。 |
|
from_base(string, radix) | bigint | 將String的值轉譯成base-radix的數值。 | - |
ln(x) | double | 返回x的自然對數。 | - |
log2(x) | double | 返回以x為底2的對數。 |
|
log10(x) | double | 返回以x為底10的對數。 |
|
pi() | - | 返回常量pi。 | - |
power(x, p) | double | 返回x的p次方。 | - |
rand() | - | random函數的別名。 | - |
random() | double | 返回 | - |
secure_rand() | - | secure_random的別名。 | - |
secure_random() | double | 返回 | - |
secure_random(lower, upper) | - | 返回 | - |
round(x) | 默認與x類型一致 | 返回x四舍五入后最接近的整數。 |
|
round(x, d) | 默認與x類型一致 | 返回x四舍五入到d位小數。 |
|
sign(x) | 默認與x類型一致 | 返回x的符號。
|
|
to_base(x, radix) | varchar | 返回x的以base-radix形式的字符串。 | - |
truncate(x) | double | 返回x刪除小數點后的整數。 |
|
truncate(x, n) | double | 返回截取到小數點后n位的x。n可以為負數,以截取小數點左邊的n位。 |
|
acos(x) | double | 返回x的反余弦。 | - |
asin(x) | double | 返回x的反正弦。 | - |
atan(x) | double | 返回x的反正切。 | - |
atan2(y, x) | double | 返回y/x的反正切。 | - |
cos(x) | double | 返回x的余弦。 | - |
cosh(x) | double | 返回x的雙曲余弦。 | - |
sin(x) | double | 返回x的正弦。 | - |
tan(x) | double | 返回x的正切。 | - |
tanh(x) | double | 返回x的雙曲正切。 | - |
infinity() | double | 返回表示正無窮大的常數。 | - |
is_finite(x) | boolean | 判斷x是否為有限值。 | - |
is_infinite(x) | boolean | 判斷x是否為無限值。 | - |
is_nan(x) | boolean | 判斷x是否為非數字。 | - |
nan() | double | 返回表示非數字的常量。 | - |
字符串函數
函數 | 返回值類型 | 說明 | 示例 |
replace | varchar | 替換 |
|
md5 | varchar | MD5哈希 |
|
|| | varchar | 字符串拼接 |
|
trim | varchar | 移除首尾字符 |
|
lower | varchar | 轉小寫 |
|
upper | varchar | 轉大寫 |
|
char_length | bigint | 字符串長度 |
|
chr(n) | varchar | 以單個字符串形式返回Unicode碼n位。 | - |
codepoint(string) | integer | 返回字符串中唯一字符的Unicode碼。 | - |
concat(string1, ..., stringN) | varchar | 字符串拼接函數,連接兩個或多個字符串,從而組成一個新的字符串。 |
|
hamming_distance(string1, string2) | bigint | 返回string1和string2的漢明距離,即對應字符不同的位置數。 說明 兩字符串的長度必須相同。 | - |
left(string, length) | varchar | 返回從string左側取length個字符后的字符串。 | - |
length(string) | bigint | 返回string的長度。 | - |
levenshtein_distance(string1, string2) | bigint | 返回string1和string2的Levenshtein編輯距離,即將string1改為string2所需的單字符編輯(插入、刪除或替換)的最小數量。 | - |
lower(string) | varchar | 將string轉換為小寫。 |
|
lpad(string, size, padstring) | varchar | 使用padstring在string左側添加字符串,使得string的大小變為size,如果size小于string的長度,結果將被截斷為size大小,size不能為負,padstring必須非空。 | - |
ltrim(string) | varchar | 刪除string的前導空格。 | - |
replace(string, search) | varchar | 從string中刪除所有search。 | - |
replace(string, search, replace) | varchar | 將string中所有的search替換成replace。 |
|
reverse(string) | varchar | 返回string的逆序字符串。 |
|
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的數組。 | - |
strpos(string, substring) | bigint | 返回string中第一個substring的起始位置。從第一個字符開始遍歷,如果未找到,則返回0。 | - |
strpos(string, substring, instance) | bigint | 返回string中第n個子字符串substring的位置。instance必須是一個正數,從第一個字符開始遍歷,如果未找到,則返回0。 | - |
strrpos(string, substring) | bigint | 返回string中最后一個子字符串substring的起始位置。從第一個字符開始遍歷,如果未找到,則返回0。 | - |
strrpos(string, substring, instance) | bigint | 返回string中從末尾開始第n個子字符串substring的位置。instance必須是一個正數,從第一個字符開始遍歷,如果未找到,則返回0。 | - |
position(substring IN string) | bigint | 返回string中第一個子字符串substring的起始位置。從第一個字符開始遍歷,如果未找到,則返回0。 | - |
substring_index(str, delim, count) | varchar | 返回分隔符delim出現次數count前字符串str的子字符串。 |
|
substr | - | substring函數的同名函數。 | - |
substring(string FROM start) | varchar | 返回字符串string從start開始截取的子字符串。 |
|
substring(string, start) | varchar | 返回string從start開始截取的子字符串。 | - |
substring(string, start, length) | varchar | 返回string從start開始截取length長度的子字符串。 | - |
trim(string) | varchar | 刪除字符串string中首尾的空格。 | - |
upper(string) | varchar | 將字符串string中的小寫字母轉換為大寫字母。 | - |
to_utf8(string) | varchar | 將字符串string編譯為UTF-8編碼的二進制。 | - |
from_utf8(binary) | varchar | 將二進制字符串解碼為UTF-8編碼格式,并使用默認字符U+FFFD替換無效的UTF-8字符。 | - |
from_utf8(binary, replace) | varchar | 將二進制字符串解碼為UTF-8編碼格式,并使用自定義字符串替換無效的UTF-8字符。 | - |
key_sampling_percent(Varchar) | varchar | 根據給定字符串的哈希值生成一個在0~1.0之間的值(double類型)。 | - |
聚合函數
聚合函數在GROUP BY語句中使用。
函數 | 返回值類型 | 說明 |
count(*) | bigint | 返回行數 |
avg(x) | double | 返回均值 |
sum(x) | bigint | 返回總和 |
max(x) | bigint | 返回最大值 |
min(x) | bigint | 返回最小值 |
count(x) | bigint | 返回非空值的個數 |
bool_and(boolean) | boolean | 所有輸入值都為true時,返回true,否則返回false。 |
bool_or(boolean) | boolean | 輸入值中有一個為true,則返回true,否則返回false。 |
count_if(x) | boolean | 返回輸入值為true的個數。 |
histogram | - | 返回一個map,包含每個輸入值出現的次數。 |
日期函數
函數 | 返回值類型 | 說明 | 示例 |
current_date | date | 返回查詢開始時的當前日期。 |
|
current_time | time with time zone | 返回查詢開始時的當前時間。 | - |
current_timestamp | timestamp with time zone | 返回當前日期、時間和時區。 | - |
current_timezone() | varchar | 以IANA(例如,America / Los_Angeles)定義的格式返回當前時區,或以UTC的固定偏移量(例如+08:35)返回當前時區。 |
|
date(x) | date | 與 | - |
date_add(date, interval expr unit) | date | 兼容MySQL語法的date_add函數。使用該函數可返回在date后增加interval的日期。 |
|
date_diff(unit, timestamp1, timestamp2) | bigint | 返回timestamp1與timestamp2的差值,該差值的單位為unit。unit的具體單位取值,請參見間隔函數。 | - |
date_trunc(unit, x) | - | 返回x截取到單位unit之后的值。unit的具體單位取值,請參見間隔函數。 | - |
date_format(timestamp, format) | varchar | 使用format指定的格式,將timestamp格式化成字符串。 |
|
date_parse(string, format) | date | 使用format將string解析為時間戳。 | - |
last_day_of_month(x) | date | 返回日期x當月的最后一天。 |
|
from_iso8601_timestamp(string) | timestamp with time zone | 將ISO 8601格式化的字符串解析為具有時區的時間戳。 | - |
from_iso8601_date(string) | date | 將ISO 8601格式的字符串解析為日期。 | - |
from_unixtime(unixtime) | timestamp | 返回unixtime時間戳。 | - |
from_unixtime(unixtime, string) | timestamp with time zone | 返回指定格式的unixtime時間戳。 | - |
from_unixtime(unixtime, hours, minutes) | timestamp with time zone | 返回為hours和minutes對應時區的unixtime時間戳。 | - |
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時間戳。 | - |
day(x) | bigint | 返回指定日期在當月的天數。 | - |
day_of_month(x) |
| ||
day_of_week(x) | 返回指定日期對應的星期值,值范圍從1(星期一)到7(星期天)。 | ||
day_of_year(x) | 返回指定日期對應一年中的第幾天,值范圍從1到366。 | ||
dow(x) | day_of_week函數的別名。 | ||
doy(x) | day_of_year函數的別名 | ||
hour(x) | 返回指定日期對應的小時,值范圍從1到23。 | ||
millisecond(x) | 返回指定時間的毫秒數。 | ||
minute(x) | 返回指定時間的分鐘數。 | ||
month(x) | 返回指定日期對應的月份。 | ||
quarter(x) | 返回指定日期對應的分鐘。 | ||
second(x) | 返回指定日期對應的秒數。 | ||
timezone_hour(timestamp) | 返回從指定時間戳對應時區偏移的小時數。 | ||
timezone_minute(timestamp) | 返回從指定時間戳對應時區偏移的分鐘數。 | ||
week(x) | 返回指定日期對應一年中的ISO week,值范圍從1到53。 | ||
week_of_year(x) | week函數的別名。 | ||
year(x) | 返回指定日期對應的年份。 | ||
year_of_week(x) | 返回指定日期對應的ISO week的年份。 | ||
yow(x) | year_of_week函數的別名。 |
間隔函數支持的間隔單位如下:
單位 | 描述 |
millisecond | Milliseconds |
second | Seconds |
minute | Minutes |
hour | Hours |
day | Days |
week | Weeks |
month | Months |
quarter | Quarters of a year |
year | Years |
條件表達式
標準的CASE表達式有兩種形式。
遍歷搜索每一個value,當valueN與expression的值相等,返回對應條件中的result,否則返回ELSE分支的result。
CASE expression WHEN value1 THEN result1 [WHEN value2 THEN result2] [ELSE result3] END
遍歷搜索每一個condition(條件表達式),返回condition為true的result(返回結果)。
CASE WHEN condition1 THEN result1 [WHEN condition2 THEN result2] [ELSE result3] END
函數
說明
示例
if(condition, true_value)
若condition為true,則返回true_value,否則返回NULL。
if(true, 1)
,返回值為1。if(false, 1),返回值為NULL。
if(condition, true_value, false_value)
若condition為true,則返回true_value,否則返回false_value。
if(true, 1, 2)
,返回值為1。if(false, 1, 2)
,返回值為2。
coalesce(value1, value2[, ...])
返回第一個非NULL值。
coalesce(NULL, NULL, 1)
,返回值為1。ifnull(expr1, expr2)
若expr1不為NULL,則返回expr1,否則返回expr2。
ifnull(1,0)
,返回值為1。ifnull(NULL,10)
,返回值為10。
nullif(expr1, expr2)
若expr1等于expr2,則返回NULL,否則返回expr1。
-
try(expression)
若expression中存在語法報錯,則返回NULL。可以識別的三種報錯:
除數為0
類型轉換(Cast)失敗或函數參數無效
數值越界
coalesce(try(total_cost / packages), 0)
其他函數
函數 | 返回值類型 | 說明 | 示例 |
json_extract(json, json_path) | - | 從JSON中返回json_path指定的值。返回值為JSON類型。 |
|
regexp_like(string, pattern) | boolean | 計算正則表達式pattern并確定其是否包含在string中。 |
|