1、基本规则
(1)注释
添加注释,可以增加SQL语句的可读性和可维护性。
HANA SQL 中注释有以下两种方式:
| 方式 |
说明 |
| --(双横线) |
单行注释 |
| /* */ |
范围内多行注释 |
select current_date from dummy; --(单行注释)获取系统当前日期
/*
(范围注释,多行注释)
current_date 用于获取系统当前日期
*/
(2)标识符
标识符表示各种数据库对象的名称,如数据库、SCHEMA、表、视图、字段、函数、存储过程、用户、角色名等。
HANA SQL 中标识符有以下两种形式:
| 形式 |
说明 |
举例 |
| 不加双引号 |
必须以字母开头,不能包含除数字和下划线以外的符号,HANA内部自动转为大写 |
newuser |
| 加双引号 |
可以包含任何字符,包括特殊字符,空格,区分大小写 |
"@New#_User" |
其他限制:
① “SYS”专门为数据库引擎保留,不能用于有些对象命名的前缀,如表名。
② 标识符最大长度为127个字符。
(3)引号
| 形式 |
说明 |
举例 |
| 单引号 |
表示字面量,使用两个单引号就可以代表单引号本身 |
'abc' |
| 双引号 |
表示对象名,使用两个双引号可以代表双引号本身 |
"abc" |
select 'abc' as "abc" from dummy;
/*
说明:
'abc',自定义字符串值,不转换大小写,保持双引号内的大小写;
"abc",自定义字段别名,不转换大小写,保持双引号内的大小写。
*/
select carrid, "CARRNAME", 'abc' from "SAPHANADB"."SCARR" where mandt = 300;
/*
说明:
carrid,hana会自动转为CARRID,对应SCARR表里的字段;
"CARRNAME",双引号内字母必须大写,否则无法对应SCARR表里的字段;
'abc',自定义字符串值,不对应SCARR表里的字段,系统自送生成字段别名:'abc';
"SAPHANADB"."SCARR",双引号内字母必须大写,否则无法对应SCHEMA及表对象。
*/

(4)保留字
保留字对于 SAP HANA 数据库的 SQL 解析器有着特殊含义,不能成为用户自定义的名字。保留字不能在 SQL 语句中使用为集合对象名。如果有必要,你可以使用双引号限定表或列名绕过这个限制。
| SAP HANA 数据库的保留字 |
| ALL、ALTER、AS、BEFORE、BEGIN、BOTH、CASE、CHAR、CONDITION、CONNECT、CROSS、CUBE、CURRENT_CONNECTION、CURRENT_DATE、 CURRENT_SCHEMA、CURRENT_TIME、CURRENT_TIMESTAMP、CURRENT_USER、CURRENT_UTCDATE、CURRENT_UTCTIME、CURRENT_UTCTIMESTAMP、CURRVAL、CURSOR、DECLARE、DISTINCT、ELSE、ELSEIF、ELSIF、END、EXCEPT、EXCEPTION、EXEC、FOR、FROM、FULL、GROUP、HAVING、IF、IN、INNER、INOUT、INTERSECT、INTO、IS、JOIN、LEADING、LEFT、LIMIT、LOOP、MINUS、NATURAL、NEXTVAL、NULL、ON、ORDER、OUT、PRIOR、RETURN、RETURNS、REVERSE、RIGHT、ROLLUP、ROWID、SELECT、SET、SQL、START、SYSDATE、SYSTIME、SYSTIMESTAMP、SYSUUID、TOP、TRAILING、UNION、USING、UTCDATE、UTCTIME、UTCTIMESTAMP、VALUES、WHEN、WHERE、WHILE、WITH。 |
2、数据类型
(1)日期时间类型
| 数据类型 |
说明 |
默认格式 |
值范围 |
其他 |
| DATE |
日期 |
YYYY-MM-DD |
从 0001-01-01 至 9999-12-31 |
其他格式有:'YYYY/MM/DD'、'YYYY/MM-DD'、'YYYY-MM/DD'、'YYYYMMDD'(其中MM还可以有:MON三位月份英文缩写,MONTH月份英文全名,RM月份罗马数字)、'YYYY-DDD'(其中DDD为一年中的第几天1-366)。 |
| TIME |
时间 |
HH24:MI:SS |
从 00:00:01到 24:00:00 |
HH24 表示从 0 至 23 的小时数, MI 代表 0 至 59 的分钟值而 SS 表示 0 至 59的秒。 |
| SECONDDATE |
日期和时间 |
YYYY-MM-DD HH24:MI:SS |
从 0001-01-01 00:00:01 至 9999-12-31 24:00:00 。 |
|
| TIMESTAMP |
时戳 |
YYYY-MM-DD HH24:MI:SS.FF7 |
从 0001-01-01 00:00:00.0000000 至 9999-12-31 23:59:59.9999999 |
FFn 代表含有小数的秒,其中 n 表示小数部分的数字位数,1-7位。 |
(2)数字类型
| 数据类型 |
说明 |
值范围 |
其他 |
| TINYINT |
8 位(1个字节)无符号整数 |
0 ~ 256(2^8 -1) |
|
| SMALLINT |
16位(2个字节)位无符号整数 |
-32768(215) ~ 35767(215-1) |
|
| INTEGER |
32位(4个字节)位有符号整数 |
-2,147,483,648 至 2,147,483,647 |
|
| BIGINT |
64位(8个字节)位有符号整数 |
-9,223,372,036,854,775,808,至 9, 223,372,036,854,775,807 |
|
| DECIMAL (p, s) |
精度为 p 小数位数为 s 的定点小数 |
|
p:1 - 34(默认),s 默认 0 |
| SMALLDECIMAL |
浮点十进制数 |
精度和小数位数可以在范围有所不同,根据存储的数值, 1-16 的精度以及-369-368的小数位数 |
SMALLDECIMAL 只支持列式存储。 |
| REAL |
32 位(4个字节)单精度浮点数 |
|
|
| DOUBLE |
64 位(8个字节)的双精度浮点数 |
最小值为-1.79769 x 10308,最大值为1.79769x10308, DOUBLE 最小的正数为 2.2207x10-308,最大的负数为-2.2207x10-308。 |
|
| FLOAT( n ) |
32 位或 64 位的实数 |
n 指定有效数字的个数,范围可以从 1 至53。如果 n 比 25 小,其会变成 32 位的实数类型;如果 n 大于等于 25,则会成为 64 的 DOUBLE 数据类型。如果 n 没有声明,默认变成 64 位的double 数据类型。 |
|
(3)字符串类型
字符类型用来存储包含字符串的值。 VARCHAR类型包含 ASCII字符串,而 NVARCHAR用来存储 Unicode字符串。
| 数据类型 |
说明 |
其他 |
| CHAR (n) |
不可变长度的 ASCII 字符串 |
n 表示最大长度,是一个 1 至5000的整数值 |
| NCHAR (n) |
不可变长度的 Unicode 字符串 |
n 表示最大长度,是一个1 至 5000的整数值 |
| VARCHAR (n) |
可变长度的 ASCII 字符串 |
n 表示最大长度,是一个 1 至5000的整数值 |
| NVARCHAR (n) |
可变长度的 Unicode 字符串 |
n 表示最大长度,是一个1 至 5000的整数值 |
| ALPHANUM (n) |
可变长度的包含字母数字的字符串 |
n 表示最大长度,是一个 1 至 127的整数值 |
| SHORTTEXT (n) |
可变长度的字符串 |
支持文本搜索和字符搜索功能。这不是一个标准的 SQL 类型。选择一列 SHORTTEXT (n) 列会生成一个 NVARCHAR (n)类型的列。 |
(4)二进制类型
| 数据类型 |
说明 |
其他 |
| VARBINARY |
二进制数据类型 |
以字节为单位, n 代表最大长度,是一个 1 至 5000的整数 |
(5)大对象类型
|
|
| BLOB |
数据类型用来存储大二进制数据 |
| CLOB |
数据类型用来存储大 ASCII 字符数据 |
| NCLOB |
数据类型用来存储大 Unicode 字符对象 |
| TEXT |
数据类型指定支持文本搜索功能,这不是一个独立的 SQL 类型。 选择一列 TEXT 列会生成一个 NCLOB 类型的列。 |
LOB(大对象)数据类型, CLOB, NCLOB 和 BLOB,用来存储大量的数据例如文本文件和图像。
一个 LOB 的最大大小为 2GB。
LOB 类型用于存储和检索大量的数据。
LOB 类型支持以下操作:
- Length(n)以字节形式返回 LOB 的长度。
- LIKE 可以用来搜索 LOB 列。
LOB 类型有如下限制:
- LOB 列不能出现在 ORDER BY 或 GROUP BY 子句中。
- LOB 列不能出现在 FROM 子句作为联接谓词。
- 不能作为谓词出现在 WHERE 子句中,除了 LIKE, CONTAINS, =或<>。
- LOB 列不能出现在 SELECT 子句作为一个聚合函数的参数。
- LOB 列不能出现在 SELECT DISTINCT 语句中。
- LOB 列不能用于集合操作,除了 EXCEPT, UNION ALL 是个例外。
- LOB 列不能作为主键。
- LOB 列不能使用 CREATE INDEX 语句。
- LOB 列不能使用统计信息更新语句。
3、操作符
你可以在表达式中使用操作符进行算术运算。操作符可以用来计算、比较值或者赋值。
(1)一元和二元操作符
① 一元操作符适用于单个操作数或者单值表达式
| 名称 |
操作符 |
描述 |
| 正 |
+ |
|
| 负 |
- |
对一个数取反 |
| 逻辑非 |
NOT |
对一个逻辑取反 |
② 二元操作符适用于两个操作数或者两个值的表达式
| 名称 |
操作符 |
描述 |
| 乘除 |
*,/ |
|
| 加减 |
+,- |
|
| 比较 |
=,!=,<,>,<=,>= |
|
| 逻辑与或 |
AND,OR |
|
(2)算术操作符
(3)字符串操作符
(4)比较操作符
| = |
!=或<> |
< |
> |
<= |
>= |
| 等于 |
不等于 |
小于 |
大于 |
小于等于 |
大于等于 |
(5)逻辑操作符
(6)合并操作符
| 操作符 |
说明 |
| UNION |
并集、去重 |
| UNION ALL |
并集,包括重复 |
| INTERSECT |
交集 |
| EXCEPT |
差集 |
(7)操作符优先级
一个表达式可以使用多个操作符。如果操作符大于一个,则 SAP HANA 数据库会根据操作符优先级评估它们。你可以通过使用括号改变顺序,因为在括号内的表达式会第一个评估。
如果没有使用括号,则操作符优先级将根据下表。请注意, SAP HANA 数据库对于优先级相同的操作符将从左至右评估操作符。
优先级由高到低:
| 优先级 |
名称 |
操作符 |
描述 |
| 高 |
括号 |
() |
|
| ↑ |
正负 |
+,- |
|
| | |
乘除 |
*,/ |
|
| | |
加减 |
+,- |
|
| | |
级联 |
|| |
|
| | |
比较、匹配 |
=,!=或<>,<,>,<=,>=,IS NULL,LIKE,BETWEEN |
|
| | |
逻辑取反 |
NOT |
|
| ↓ |
逻辑与 |
AND |
|
| 低 |
逻辑或 |
OR |
|
4、表达式
(1)常量
| 常量类型 |
说明 |
示例 |
| 字符串常量(ASCII码) |
字符串常量括在单引号中 |
如:'Brian','100'。 |
| 字符串常量(Unicode码) |
Unicode 字符串的格式与字符串相似,但前面有一个 N 标识符( N 代表 SQL-92 标准中的国际语言)。 N 字母前缀必须是大写 |
如:N'abc'" |
| 数字常量 |
数字常量用没有括在单引号中的数字字符串表示。数字可能包含小数点或者科学计数 |
如:123,123.4,1.234e2 |
| 十六进制数字常量 |
十六进制数字常量是十六进制数的字符串,含有前缀 0x |
如:0x0abc |
| 二进制字符串常量 |
二进制字符串有前缀 X,是一个括在单引号中的十六进制数字字符串 |
如:X'00abcd' |
| 日期、时间、时间戳常量 |
日期、时间、时间戳各自有前缀 |
如:date'2010-01-01',time'11:00:00.001', timestamp'2011-12-31 23:59:59' |
(2)CASE表达式
select
case field
when value1 then result1
when value2 then result2
else result3
end as fieldalias
from dummy;
(3)聚合函数
| 函数 |
说明 |
| count() |
统计数量 |
| sum() |
求和 |
| avg() |
求平均 |
| max() |
求最大值 |
| min() |
求最小值 |
原创文章,转载请注明来源-X档案