你能夠給你的 SQL 語句添加註釋來增長可讀性和可維護性。 SQL 語句中註釋的分隔以下:
l 雙連字符「--」。全部在雙連字符以後直到行尾的內容都被 SQL 解析器認爲是註釋。
l 「/*」和「*/」。這種類型的註釋用來註釋多行內容。全部在引號符「/*」和關閉符「*/」之間 的文字都會被 SQL 解析器忽略。
標識符用來表示 SQL 語句中的名字,包括表名、視圖名、同義字、列名、索引名、函數名、存儲過程名、用戶名、角色名等等。有兩種類型的標識符:未分隔標識符和分隔標識符(指用空間分開字符串)。
l 未分隔的表名和列名必須以字母開頭,不能包含除數字或者下劃線之外的符號。
l 分隔標識符用分隔符、雙引號關閉,而後標識符能夠包含任何字符包括特殊字符。例如,"AB$%CD" 是一個有效的標識符。
l 限制:
o "_SYS_"專門爲數據庫引擎保留,所以不容許出如今集合對象的名字開頭。
o 角色名和用戶名必須以未分隔符指定。
o 標識符最大長度爲 127 字母。
單引號是用來分隔字符串,使用兩個單引號就能夠表明單引號自己。
用雙引號分隔標識符,使用兩個雙引號能夠表明雙引號自己。
保留字對於 SAP HANA 數據庫的 SQL 解析器有着特殊含義,不能成爲用戶自定義的名字。保留字不能在 SQL 語句中使用爲集合對象名。若是有必要,你能夠使用雙引號限定表或列名繞過這個限制。
下表列出了全部如今和將來 SAP HANA 數據庫的保留字:
DATE 數據類型由年、月、日信息組成,表示一個日期值。 DATA 類型的默認格式爲‘YYYY-MM-DD’。 YYYY 表示年, MM 表示月而 DD 表示日。時間值的範圍從 0001-01-01 至 9999-12-31。
select to_date('365','DDD') from dummy;
select to_date('2015/365','YYYY/ddd') from dummy;
select to_date('2015-january','YYYY-month') from dummy;
select to_date('2015-February/28','yyyy-moNth/dd') from dummy;
select to_date('2015-Jan/31','yyyy-mon/dd') from dummy;
select to_date('2015/2-1','yyyy/mM-dd') from dummy;
select to_date('2015/02-01','yyyy/mM-dd') from dummy;
select to_date('2015+02=01','yyyy+mM=dd') from dummy;
select to_date('20150201','yyyymmdd') from dummy;
TIME 數據類型由小時、分鐘、秒信息組成,表示一個時間值。 TIME 類型的默認格式爲‘HH24:MI:SS’。 HH24 表示從 0 至 24 的小時數, MI 表明 0 至 59 的分鐘值而 SS 表示 0 至 59的秒。
select to_time('1:1:1 PM','HH:MI:SS PM') from dummy;
select to_time('1:1:1','HH:MI:SS') from dummy;
select to_time('1:1:1','HH24:MI:SS') from dummy;
SECONDDATE 數據類型由年、月、日、小時、分鐘和秒來表示一個日期和時間值。
SECONDDATE 類型的默認格式爲‘YYYY-MM-DD HH24:MI:SS’。 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’。 FFn 表明含有小數的秒,其中 n 表示小數部分的數字位數。時間戳的範圍從 0001-01-01 00:00:00.0000000 至 9999-12-31 23:59:59.9999999。
select to_timestamp('2015/1/2 1:1:1','YYYY/MM/DD HH:MI:SS') from dummy;
select to_timestamp('2015/1/2 1:1:1.999','YYYY/MM/DD HH:MI:SS.FF3') from dummy;
select to_timestamp('2015/1/2 1:1:1.9999999','YYYY/MM/DD HH:MI:SS.FF7') from dummy;
selectcurrent_timestampfrom dummy;--2015-6-12 16:50:26.349
select to_char(current_timestamp,'D') from dummy;--5 注:這個應該是星期幾
select to_char(current_timestamp,'DD') from dummy;--12
select to_char(current_timestamp,'DDD') from dummy;--163
select to_char(current_timestamp,'Day') from dummy;--Friday
select to_char(current_timestamp,'Dy') from dummy;--Fri
select to_char(current_timestamp,'mon') from dummy;--jun
select to_char(current_timestamp,'month') from dummy;--june
select to_char(current_timestamp,'rm') from dummy;--vi
select to_char(current_timestamp,'q') from dummy;--2
select to_char(current_timestamp,'w') from dummy;--2
select to_char(current_timestamp,'ww') from dummy;--24
select to_char(current_timestamp,'FF7') from dummy;--1260000
select to_char(current_timestamp,'YY') from dummy;--15
TINYINT 數據類型存儲一個 8 位(1個字節)無符號整數。 TINYINT 的最小值是 0,最大值是 255。
SMALLINT 數據類型存儲一個 16 (2個字節)位無符號整數。 SMALLINT 的最小值爲-32,768 ,最大值爲32, 767。
INTEGER 數據類型存儲一個 32 (4個字節)位有符號整數。 INTEGER 的最小值爲-2,147,483,648 ,最大值爲 2,147,483,647。
BIGINT 數據類型存儲一個 64 (8個字節)位有符號整數。 INTEGER 的最小值爲-9,223,372,036,854,775,808,最大值爲 9, 223,372,036,854,775,807。
DECIMAL (p, s) 數據類型指定了一個精度爲 p 小數位數爲 s 的定點小數。精度是有效位數的總數,範圍從 1 至 34。
小數位數是從小數點到最小有效數字的數字個數,範圍從-6,111 到 6,176,這表示位數指定了十進制小數的指數範圍從 10-6111 至 106176。若是沒有指定小數位數,則默認值爲 0。
當數字的有效數字在小數點的右側(後面)時,小數位數爲正;有效數字在小數點左側(前面)時,小數位數爲負。
例子:
0.0000001234 (1234 x 10-10) 精度爲 4,小數位數 10。
1.0000001234(10000001234 x 10-10) 精度爲 11,小數位數爲 10。
1234000000 (1234x106) 精度爲 4,小數位數爲-6。
當未指定精度和小數位數, DECIMAL 成爲浮點小數。這種狀況下,精度和小數位數能夠在上文描述的範圍內不一樣,根據存儲的數值, 1-34 的精度和 6111-6176 的小數位數。
SMALLDECIMAL 是一個浮點十進制數。精度和小數位數能夠在範圍有所不一樣,根據存儲的數值, 1-16 的精度以及-369-368的小數位數。 SMALLDECIMAL 只支持列式存儲。
DECIMAL 和 SMALLDECIMAL 都是浮點十進制數。舉例來講,一個十進制列能夠存儲 3.14,3.1415, 3.141592 同時保持它們的精度。
DECIMAL(p, s) 是 SQL 對於定點十進制數的標準標記。例如, 3.14, 3.1415,3.141592 存儲在 decimal(5, 4)列中爲 3.1400, 3.1415, 3.1416,各自保持其精度( 5)和小數位數( 4)。
REAL 數據類型定義一個 32 位(4個字節)單精度浮點數。
DOUBLE 數據類型定義一個 64 位(8個字節)的雙精度浮點數,最小值爲-1.79769 x 10308,最大值爲
1.79769x10308, DOUBLE 最小的正數爲 2.2207x10-308,最大的負數爲-2.2207x10-308。
FLOAT 數據類型定義一個 32 位或 64 位的實數, n 指定有效數字的個數,範圍能夠從 1 至53。
當你使用 FLOAT( n )數據類型時,若是 n 比 25 小,其會變成 32 位的實數類型;若是 n 大於等於 25,則會成爲 64 的 DOUBLE 數據類型。若是 n 沒有聲明,默認變成 64 位的double 數據類型。
字符類型用來存儲包含字符串的值。 VARCHAR類型包含 ASCII字符串,而 NVARCHAR用來存儲 Unicode字符串。
VARCHAR (n) 數據類型定義了一個可變長度的 ASCII 字符串, n 表示最大長度,是一個 1 至5000的整數值。
NVARCHAR (n) 數據類型定義了一個可變長度的 Unicode 字符串, n 表示最大長度,是一個1 至 5000的整數值。
ALPHANUM (n) 數據類型定義了一個可變長度的包含字母數字的字符串, n 表示最大長度,是一個 1 至 127的整數值。
SHORTTEXT (n) 數據類型定義了一個可變長度的字符串,支持文本搜索和字符搜索功能。
這不是一個標準的 SQL 類型。選擇一列 SHORTTEXT (n) 列會生成一個 NVARCHAR (n)類型的列。
二進制類型用來存儲二進制數據的字節。
VARBINARY 數據類型用來存儲指定最大長度的二進制數據,以字節爲單位, n 表明最大長度,是一個 1 至 5000的整數。
LOB(大對象)數據類型, CLOB, NCLOB 和 BLOB,用來存儲大量的數據例如文本文件和圖像。 一個 LOB 的最大大小爲 2GB。
BLOB 數據類型用來存儲大二進制數據。
CLOB 數據類型用來存儲大 ASCII 字符數據。
NCLOB 數據類型用來存儲大 Unicode 字符對象。
TEXT 數據類型指定支持文本搜索功能,這不是一個獨立的 SQL 類型。 選擇一列 TEXT 列會
生成一個 NCLOB 類型的列。
LOB 類型用於存儲和檢索大量的數據。 LOB 類型支持如下操做:
lLength(n)以字節形式返回 LOB 的長度。
lLIKE 能夠用來搜索 LOB 列。
LOB 類型有以下限制:
lLOB 列不能出如今 ORDER BY 或 GROUP BY 子句中。
lLOB 列不能出如今 FROM 子句做爲聯接謂詞。
l不能做爲謂詞出如今 WHERE 子句中,除了 LIKE, CONTAINS, =或<>。
lLOB 列不能出如今 SELECT 子句做爲一個聚合函數的參數。
lLOB 列不能出如今 SELECT DISTINCT 語句中。
lLOB 列不能用於集合操做,除了 EXCEPT, UNION ALL 是個例外。
lLOB 列不能做爲主鍵。
lLOB 列不能使用 CREATE INDEX 語句。
lLOB 列不能使用統計信息更新語句。
本節描述 SAP HANA 數據庫中容許的類型轉換。
表達式結果的類型,例如一個字段索引,一個字段函數或者文字可使用以下函數進行轉換: CAST, TO_ALPHANUM, TO_BIGINT, TO_VARBINARY,TO_BLOB, TO_CLOB, TO_DATE, TO_DATS, TO_DECIMAL, TO_DOUBLE, TO_INTEGER, TO_INT,TO_NCLOB, TO_NVARCHAR, TO_REAL, TO_SECONDDATE, TO_SMALLINT, TO_TINYINT, TO_TIME,TO_TIMESTAMP, TO_VARCHAR。
當給定的一系列運算符/參數類型不符合其所指望的類型, SAP HANA 數據庫就會執行類型轉換。這種轉換僅僅發生在相關的轉換可供使用,而且使得運算符/參數類型可執行。
舉例來講, BIGINT 和 VARCHAR 之間的比較是經過把 VARCHAR 隱式轉換成 BIGINT 進行的。
顯式轉換能夠所有用於隱式轉換,除了 TIME 和 TIMESTAMP 數據類型。 TIME 和TIMESTAMP 可使用 TO_TIME(TIMESTAMP)以及 TO_TIMESTAMP(TIME)相互轉換。
例子
在下表中:
方框中「OK」表示容許的數據類型轉換,沒有任何檢查。
方框中」CHK」表示數據類型轉換隻有在數據是有效的目標類型時才執行。
方框中」-」表示不容許該數據類型轉換。
以下顯示的規則同時適用於隱式和顯示轉換,除了 TIME 至 TIMESTAMP 的轉換。 TIME 類型只能經過顯示轉換 TO_TIMESTAMP 或者 CAST 函數執行。
本節介紹 SAP HANA 數據庫實施的數據類型的優先級。數據類型優先級指定較低優先級的類型轉換爲較高優先級的類型。
常量是表示一個特定的固定數值的符號。
字符串常量括在單引號中。
o 'Brian'
o '100'
Unicode 字符串的格式與字符串類似,但前面有一個 N 標識符( N 表明 SQL-92 標準中的國際語言)。 N 字母前綴必須是大寫。
o N'abc'
SELECT'Brian'"character string 1", '100'"character string 2", N'abc'"unicode string"FROM DUMMY;
數字常量用沒有括在單引號中的數字字符串表示。數字可能包含小數點或者科學計數。
o 123
o 123.4
o 1.234e2
十六進制數字常量是十六進制數的字符串,含有前綴 0x。
o 0x0abc
SELECT 123 "integer", 123.4 "decimal1", 1.234e2 "decimal2", 0x0abc "hexadecimal"FROM DUMMY;
二進制字符串有前綴 X,是一個括在單引號中的十六進制數字字符串。
o X'00abcd'
o x'dcba00'
SELECT X'00abcd'"binary string 1", x'dcba00'"binary string 2"FROM DUMMY;
日期、時間、時間戳各自有以下前綴:
o date'2010-01-01'
o time'11:00:00.001'
o timestamp'2011-12-31 23:59:59'
SELECT date'2010-01-01' "date", time'11:00:00.001' "time", timestamp'2011-12-31 23:59:59' "timestamp" FROM DUMMY;
SELECTdate'2010-01-01'"date", time'11:00:00.001'"time", timestamp'2011-12-31 23:59:59'"timestamp"FROM DUMMY;
謂詞由組合的一個或多個表達式,或者邏輯運算符指定,並返回如下邏輯 /真值中的一個:
TRUE、 FALSE、或者 UNKNOW。
兩個值使用比較謂詞進行比較,並返回 TRUE, FALSE 或 UNKNOW。
語法:
<comparison_predicate> ::=<expression> { = | != | <> | > | < | >= | <= } [ ANY | SOME| ALL ] { <expression_list> | <subquery> }
<expression_list> ::= <expression>, ...
表達式能夠是簡單的表達式如字符、日期或者數字,也能夠是標量(只有一條結果)子查詢,這種子查詢的SELECT從句中只有一個表字段或者是一個統計列
若是子查詢的結果只有一條數據時,能夠省略[ALL|ANY|SOME]選項
若是子查詢返回的是多條,則可須要帶上[ALL|ANY|SOME]選項
² ALL:若是子查詢返回的全部行都知足比較條件時,才爲真
² ANY|SOME:若是子查詢返回的全部行中只要有一條知足比較條件時,就會爲真
² =等號與ANY|SOME一塊兒使用時,與IN操做符具備同樣的效果
值將在給定範圍中進行比較。
語法:
<range_predicate> ::= <expression1> [NOT] BETWEEN <expression2> AND <expression3>
BETWEEN …AND … - 當指定了範圍謂詞時,若是 expression1 在 expression2 和 expression3 指定的範圍內時,結果返回真;若是 expression2 比 expression3 小,則只返回真。
一個值與一組指定的值比較。若是 expression1 的值在 expression_list(或子查詢)中,結果返回真。
語法:
<in_predicate> ::= <expression> [NOT] IN { <expression_list> | <subquery> }
... WHERE CITY IN ('BERLIN', 'NEW YORK', 'LONDON').
若是CITY爲IN後面列表中的任何一個時返回true
IN後面也能夠根子查詢:
SELECT SINGLE city latitude longitude
INTO (city, lati, longi)
FROM sgeocity
WHERE city IN ( SELECT cityfrom FROM spfli
WHERE carrid = carr_id
AND connid = conn_id ).
若是子查詢返回非空結果集,結果爲真;返回空結果集,結果則爲假。
這類子查詢沒有返回值,也不要求SELECT從句中只有一個選擇列,選擇列能夠任意個數,WHERE or HAVING從句來根據該子查詢的是否查詢到數據來決定外層主查詢語句來選擇相應數據
DATA: name_tab TYPE TABLE OF scarr-carrname,
name LIKE LINE OF name_tab.
SELECT carrname INTO TABLE name_tab FROM scarr
WHERE EXISTS ( SELECT * FROM spfli
WHERE carrid = scarr~carrid
AND cityfrom = 'NEW YORK' ).
LOOP AT name_tab INTO name.
WRITE: / name.
ENDLOOP.
此子查詢又爲相關子查詢:
若是某個子查的WHERE條件中引用了外層查詢語句的列,則稱此子查詢爲相關子查詢。相關子查詢對外層查詢結果集中的每條記錄都會執行一次,因此儘可能少用相關子查詢
Like 用來比較字符串, Expression1 與包含在 expression2 中的模式比較。通配符( %)和( _)能夠用在比較字符串 expression2 中。
「_」用於替代單個字符,「%」用於替代任意字符串,包括空字符串。
可使用ESCAPE選項指定一個忽略符號h,若是通配符「_」、「%」前面有符號<h>,那麼通配符失去了它在模式中的功能,而指字符自己了:
... WHERE FUNCNAME LIKE'EDIT#_%'ESCAPE'#';
以「EDIT_」開頭的字符串
當指定了謂詞 IS NULL,值能夠與 NULL 比較。若是表達式值爲 NULL, 則 IS NULL 返回值爲真;若是指定了謂詞 IS NOT NULL,值不爲 NULL 時返回值爲真。
語法:
null_predicate> ::= <expression> IS [NOT] NULL
CONTAINS 謂詞用來搜索子查詢中文本匹配的字符串。
語法:
<contains_function> ::= CONTAINS '(' <contains_columns> ',' <search_string>')'| CONTAINS '(' <contains_columns> ',' <search_string> ',' <search_specifier> ')'
<contains_columns> ::= '*' | <column_name> | '(' <columnlist> ')'
<search_string> ::= <string_const>
<search_specifier> ::= <search_type> <opt_search_specifier2_list>| <search_specifier2_list>
<opt_search_specifier2_list> ::= empty| <search_specifier2_list>
<search_type> ::= <exact_search> | <fuzzy_search> | <linguistic_search>
<search_specifier2_list> ::= <search_specifier2>| <search_specifier2_list> ',' <search_specifier2>
<search_specifier2> := <weights> | <language>
<exact_search> ::= EXACT
<fuzzy_search> ::= FUZZY| FUZZY '(' <float_const> ')' | FUZZY '(' <float_const> ',' <additional_params> ')'
<linguistic_search> ::= LINGUISTIC
<weights> ::= WEIGHT '(' <float_const_list> ')'
<language> :: LANGUAGE '(' <string_const> ')'
<additional_params> ::= <string_const>
search_string:使用自由式字符串搜索格式(例如, Peter "Palo Alto"或 Berlin -"SAP LABS")。
search_specifier:若是沒有指定 search_specifier, EXACT 爲默認值。
EXACT:對於那些在 search_attributes 中精確匹配 searchterms 的記錄, EXACT 返回真。
FUZZY:對於那些在 search_attributes 類似匹配 searchterms 的記錄, FUZZY 返回真(例如,以某種程度忽略拼寫錯誤)。
Float_const:若是省略 float_const,則默認值爲 0.8。能夠經過定義列式存儲聯接視圖支持的參數FUZZINESSTHRESHOLD 來覆蓋默認值。
WEIGHT:若是定義了 weights 列表,則必須與<contains_columns>中的列數量同樣。
LANGUAGE:LANGUAGE 在搜索字符串的預處理中使用,而且做爲搜索前的過濾。只返回匹配搜索字符串的文檔和定義的語言。
LINGUISTIC:對於那些在 searchattribute 中出現的 searchterms 字符變量, LINGUISTIC 返回真。
限制:若是在 where 條件中定義了多個 CONTAINS,那麼只有其中的一個由<contains_columns>列表中的不止一列組成。
CONTAINS 只對列式存儲表適用(簡單表和聯接視圖)。
例子:
精確搜索:
select * from T where contains(column1, 'dog OR cat') -- EXACT is implicit
select * from T where contains(column1, 'dog OR cat', EXACT)
select * from T where contains(column1, '"cats and dogs"') -- phrase search
模糊搜索:
select * from T where contains(column1, 'catz', FUZZY(0.8))
語言搜索:
select * from T where contains(column1, 'catz', LINGUISTIC)
自由式搜索:自由式搜索是對於多列的搜索。
select * from T where CONTAINS( (column1,column2,column3), 'cats OR dogz', FUZZY(0.7))
select * from T where CONTAINS( (column1,column2,column3), 'cats OR dogz', FUZZY(0.7))
你能夠在表達式中使用操做符進行算術運算。操做符能夠用來計算、比較值或者賦值。
一個表達式可使用多個操做符。若是操做符大於一個,則 SAP HANA 數據庫會根據操做符優先級評估它們。你能夠經過使用括號改變順序,由於在括號內的表達式會第一個評估。
若是沒有使用括號,則操做符優先級將根據下表。請注意, SAP HANA 數據庫對於優先級相同的操做符將從左至右評估操做符。
你可使用算術操做符來執行數學運算,如加法、減法、乘法和除法,以及負數。
對於 VARCHAR 或者 NVARCHAR 類型字符串,前導或者後置空格將保留。若是其中一字符串類型爲 NVARCHAR,則結果也爲 NVARCHAR 而且限制在 5000 個字母, VARCHAR 聯接的最大長度也限制在 5000 個字母。
語法:
<comparison_operation> ::= <expression1> <comparison_operator> <expression2>
搜索條件可使用 AND 或者 OR 操做符結合,你也可使用 NOT 操做符否認條件。
對兩個或更多個查詢的結果執行合併操做
UNION:並集,去重
UNION ALL:並集,包括重複
INTERSECT:交集
EXCEPT:差集
表達式是能夠用來計算並返回值的子句。
語法:
<expression> ::=<case_expression>
| <function_expression>
| <aggregate_expression>
| (<expression> )
| ( <subquery> )
| - <expression>
| <expression> <operator> <expression>
| <variable_name>
| <constant>
| [<correlation_name>.]<column_name>
Case 表達式容許用戶使用 IF ... THEN ... ELSE邏輯,而不用在 SQL 語句中調用存儲過程。
語法:
<case_expression> ::=
CASE <expression>
WHEN <expression> THEN <expression>, ...
[ ELSE <expression>]
{ END | END CASE }
若是位於 CASE 語句後面的表達式和 WHEN 後面的表達式相等,則 THEN 以後的表達式將做爲返回值;不然返回 ELSE 語句以後的表達式,若是存在的話。
CASE後面還能夠省略,省略後以下:
BEGIN
OUTTAB = SELECT CARRID, CONNID, FLDATE, BOOKID, CUSTOMID
FROM "SFLIGHT"."SBOOK"
WHERE (CASE WHEN CARRID = :IV_CARRID THEN '1'
ELSE '2' END) = '2';
END;
因爲CASE WHEN性能很差,因此能夠改寫成下面這樣:
SELECT CARRID, CONNID, FLDATE, BOOKID, CUSTOMID
FROM "SFLIGHT"."SBOOK"
WHERE CARRID <> :IV_CARRID or carrid is null
SQL 內置的函數能夠做爲表達式使用。
語法:
<function_expression> ::= <function_name> ( <expression>, ... )
Aggregate 表達式利用 aggregate 函數計算同一列中多行值。
語法:
<aggregate_expression> ::= COUNT(*) | <agg_name> ( [ ALL | DISTINCT ] <expression>)
<agg_name> ::= COUNT | MIN | MAX | SUM | AVG | STDDEV | VAR
子查詢是在括號中的 SELECT 語句。 SELECT 語句能夠包含一個,有且僅有一個選擇項。看成爲表達式使用時,標量(只有一條結果)子查詢容許返回零個或一個值。
語法:
<scalar_subquery_expression> ::= (<subquery>)
在最高級別的 SELECT 中的 SELECT 列表,或者 UPDATE 語句中的 SET 條件中,你能夠在任何能使用列名的地方使用標量子查詢。不過, scalar_subquery 不能夠在 GROUP BY 條件中使用。
例子:
如下語句返回每一個部門中的員工數,根據部門名字分組:
SELECT DepartmentName, COUNT(*), 'out of',(SELECTCOUNT(*) FROM Employees)
FROM Departments AS D, Employees AS E WHERE D.DepartmentID = E.DepartmentID
GROUPBY DepartmentName;
數據類型轉換函數用來把參數從一個數據類型轉換爲另外一個數據類型,或者測試轉換是否可行。
語法:
CAST (expression AS data_type)
語法元素:
Expression – 被轉換的表達式。
Data type – 目標數據類型。 TINYINT | SMALLINT |INTEGER | BIGINT | DECIMAL | SMALLDECIMAL | REAL | DOUBLE | ALPHANUM | VARCHAR |NVARCHAR | DAYDATE | DATE | TIME | SECONDDATE | TIMESTAMP。
例子:
SELECTCAST (7 ASVARCHAR) "cast"FROM DUMMY;--7
語法:
TO_ALPHANUM (value)
描述:
將給定的 value 轉換爲 ALPHANUM 數據類型。
例子:
SELECT TO_ALPHANUM ('10') "to alphanum"FROM DUMMY;--10
語法:
TO_BIGINT (value)
描述:
將 value 轉換爲 BIGINT 類型。
例子:
SELECT TO_BIGINT ('10') "to bigint"FROM DUMMY;--10
語法:
TO_BINARY (value)
描述:
將 value 轉換爲 BINARY 類型。
例子:
SELECT TO_BINARY ('abc') "to binary"FROM DUMMY;--616263 顯示時倒是以十六進制顯示,而不是二進制?
語法:
TO_BLOB (value)
描述:
將 value 轉換爲 BLOB 類型。參數值必須是二進制字符串。
例子:
SELECT TO_BLOB (TO_BINARY('abcde')) "to blob"FROM DUMMY;--abcde
語法:
TO_CHAR (value [, format])
描述:
將 value 轉換爲 CHAR 類型。若是省略 format 關鍵字,轉換將會使用 Date Formats 中說明的日期格式模型。
例子:
SELECT TO_CHAR (TO_DATE('2009-12-31'), 'YYYY/MM/DD') "to char"FROM DUMMY;--2009/12/31
SELECT TO_CHAR (TO_DATE('2009-12-31')) "to char"FROM DUMMY;--2009-12-31
語法:
TO_CLOB (value)
描述:
將 value 轉換爲 CLOB 類型。
例子:
SELECT TO_CLOB ('TO_CLOB converts the value to a CLOB data type') "to clob"FROM DUMMY;--TO_CLOB converts the value to a CLOB data type
語法:
TO_DATE (d [, format])
描述:
將日期字符串 d 轉換爲 DATE 數據類型。若是省略 format 關鍵字,轉換將會使用 Date Formats 中說明的日期格式模型。
例子:
SELECT TO_DATE('2010-01-12', 'YYYY-MM-DD') "to date"FROM DUMMY;--2010-1-12
語法:
TO_DATS (d)
描述:
將字符串 d 轉換爲 ABAP 日期字符串,格式爲」YYYYMMDD」。
例子:
SELECT TO_DATS ('2010-01-12') "abap date"FROM DUMMY;--20100112
語法:
TO_DECIMAL (value [, precision, scale])
描述:
將 value 轉換爲 DECIMAL 類型。
精度是有效數字的總數,範圍爲 1 至 34。小數位數是從小數點到最小有效數字的數字個數,範圍從-6,111 到 6,176,這表示位數指定了十進制小數的指數範圍從 10-6111 至 106176。若是沒有指定小數位數,則默認值爲 0。
當數字的有效數字在小數點的右側時,小數位數爲正;有效數字在小數點左側時,小數位數爲負。
當未指定精度和小數位數, DECIMAL 成爲浮點小數。這種狀況下,精度和小數位數能夠在上文描述的範圍內不一樣,根據存儲的數值,精度爲 1-34 以及小數位數爲 6111-6176。
例子:
SELECTTO_DECIMAL(7654321.888888, 10, 3) "to decimal"FROM DUMMY--7,654,321.888
語法:
TO_DOUBLE (value)
描述:
將 value 轉換爲 DOUBLE(雙精度)數據類型。
例子:
SELECT 3*TO_DOUBLE ('15.12') "to double"FROM DUMMY;--45.36
語法:
TO_INT (value)
描述:
將 value 轉換爲 INTEGER 類型。
例子:
SELECT TO_INT('10') "to int"FROM DUMMY;--10
語法:
TO_INTEGER (value)
描述:
將 value 轉換爲 INTEGER 類型。
例子:
SELECT TO_INTEGER ('10') "to int"FROM DUMMY;--10
語法:
TO_NCHAR (value [, format])
描述:
將 value 轉換爲 NCHAR Unicode 字符類型。若是省略 format 關鍵字,轉換將會使用 Date Formats中說明的日期格式模型。
例子:
SELECT TO_NCHAR (TO_DATE('2009-12-31'), 'YYYY/MM/DD') "to nchar"FROM DUMMY;--2009/12/31
語法:
TO_NCLOB (value)
描述:
將 value 轉換爲 NCLOB 數據類型。
例子:
SELECT TO_NCLOB ('TO_NCLOB converts the value to a NCLOB data type') "to nclob"FROM DUMMY;--TO_NCLOB converts the value to a NCLOB data type
語法:
TO_NVARCHAR (value [,format])
描述:
將 value 轉換爲 NVARCHAR Unicode 字符類型。若是省略 format 關鍵字,轉換將會使用 DateFormats 中說明的日期格式模型。
例子:
SELECT TO_NVARCHAR(TO_DATE('2009/12/31'), 'YY-MM-DD') "to nchar"FROM DUMMY;--09-12-31
語法:
TO_REAL (value)
描述:
將 value 轉換爲實數(單精度)數據類型。
例子:
SELECT 3*TO_REAL ('15.12') "to real"FROM DUMMY;--45.36000061035156
語法:
TO_SECONDDATE (d [, format])
描述:
將 value 轉換爲 SECONDDATE 類型。若是省略 format 關鍵字,轉換將會使用 Date Formats 中說明的日期格式模型。
例子:
SELECT TO_SECONDDATE ('2010-01-11 13:30:00', 'YYYY-MM-DD HH24:MI:SS') "to seconddate"FROM DUMMY;--2010-1-11 13:30:00.0
語法:
TO_SMALLDECIMAL (value)
描述:
將 value 轉換爲 SMALLDECIMAL 類型。
例子:
SELECT TO_SMALLDECIMAL(7654321.89) "to smalldecimal"FROM DUMMY;--7,654,321.89
語法:
TO_SMALLINT (value)
描述:
將 value 轉換爲 SMALLINT 類型。
例子:
SELECT TO_SMALLINT ('10') "to smallint"FROM DUMMY;--10
語法:
TO_TIME (t [, format])
描述:
將時間字符串 t 轉換爲 TIME 類型。若是省略 format 關鍵字,轉換將會使用 Date Formats 中說明的日期格式模型。
例子:
SELECT TO_TIME ('08:30 AM', 'HH:MI AM') "to time"FROM DUMMY;--8:30:00
語法:
TO_TIMESTAMP (d [, format])
描述:
將時間字符串 t 轉換爲 TIMESTAMP 類型。若是省略 format 關鍵字,轉換將會使用 Date Formats中說明的日期格式模型。
例子:
SELECT TO_TIMESTAMP ('2010-01-11 13:30:00', 'YYYY-MM-DD HH24:MI:SS') "to timestamp"FROM DUMMY;--2010-1-11 13:30:00.0
語法:
TO_TINYINT (value)
描述:
將 value 轉換爲 TINYINT 類型。
例子:
SELECT TO_TINYINT ('10') "to tinyint"FROM DUMMY;--10
語法:
TO_VARCHAR (value [, format])
描述:
將給定 value 轉換爲 VARCHAR 字符串類型。若是省略 format 關鍵字,轉換將會使用 Date Formats中說明的日期格式模型。
例子:
SELECT TO_VARCHAR (TO_DATE('2009-12-31'), 'YYYY/MM/DD') "to char"FROM DUMMY;--2009/12/31
語法:
ADD_DAYS (d, n)
描述:
計算日期 d 後 n 天的值。
例子:
SELECT ADD_DAYS (TO_DATE ('2009-12-05', 'YYYY-MM-DD'), 30) "add days"FROM DUMMY;--2010-1-4
語法:
ADD_MONTHS (d, n)
描述:
計算日期 d 後 n 月的值。
例子:
SELECT ADD_MONTHS (TO_DATE ('2009-12-05', 'YYYY-MM-DD'), 1) "add months"FROM DUMMY--2010-1-5
語法:
ADD_SECONDS (t, n)
描述:
計算時間 t 後 n 秒的值。
例子:
SELECT ADD_SECONDS (TO_TIMESTAMP ('2012-01-01 23:30:45'), 15) "add seconds"FROM DUMMY;--2012-1-1 23:31:00.0
語法:
ADD_YEARS (d, n)
描述:
計算日期 d 後 n 年的值。
例子:
SELECT ADD_YEARS (TO_DATE ('2009-12-05', 'YYYY-MM-DD'), 1) "add years"FROM DUMMY;--2010-12-5
語法:
CURRENT_DATE
描述:
返回當前本地系統日期。
例子:
selectcurrent_date from dummy;--2015-6-12
語法:
CURRENT_TIME
描述:
返回當前本地系統時間。
例子:
select current_time from dummy;--16:58:11
語法:
CURRENT_TIMESTAMP
描述:
返回當前本地系統的時間戳信息。
例子:
selectcurrent_timestamp from dummy;--2015-6-12 16:58:11.471
語法:
CURRENT_UTCDATE
描述:
返回當前 UTC 日期。 UTC 表明協調世界時,也被稱爲格林尼治標準時間( GMT)。
例子:
SELECT CURRENT_UTCDATE "Coordinated Universal Date"FROM DUMMY;--2015-6-12
語法:
CURRENT_UTCTIME
描述:
返回當前 UTC 時間。
例子:
SELECTCURRENT_TIMESTAMP,CURRENT_UTCTIME "Coordinated Universal Time"FROM DUMMY;--2015-6-12 23:25:49.721;15:25:49
語法:
CURRENT_UTCTIMESTAMP
描述:
返回當前 UTC 時間戳。
例子:
SELECTCURRENT_TIMESTAMP,CURRENT_UTCTIMESTAMP "Coordinated Universal Timestamp"FROM DUMMY;-2015-6-12 23:28:07.62;2015-6-12 15:28:07.62
語法:
DAYNAME (d)
描述:
返回一週中日期 d 的英文名。
例子:
SELECTDAYNAME ('2011-05-30') "dayname"FROM DUMMY;--MONDAY
語法:
DAYOFMONTH (d)
描述:
返回一個月中日期 d 的整數數字(即一個月中的幾號)。
例子:
SELECT DAYOFMONTH ('2011-05-30') "dayofmonth"FROM DUMMY;--30
語法:
DAYOFYEAR (d)
描述:
返回一年中表明日期 d 的整數數字(即一年中的第幾天)。
例子:
SELECTDAYOFYEAR ('2011-02-01') "dayofyear"FROM DUMMY;--32
語法:
DAYS_BETWEEN (d1, d2)
描述:
計算 d1 和 d2 之間的天數(只包括一端:[d1,d2)或者(d1,d2])。
例子:
SELECTDAYS_BETWEEN (TO_DATE ('2015-01-01', 'YYYY-MM-DD'), TO_DATE('2015-02-02', 'YYYY-MM-DD')) "days between"FROM DUMMY;--32
SELECTDAYS_BETWEEN ('2015-01-01','2015-02-02') "days between"FROM DUMMY;--32 類型隱式轉換(字符轉日期)
SELECTDAYS_BETWEEN ('2015-02-01','2015-03-01') "days between"FROM DUMMY;--28
語法:
EXTRACT ({YEAR | MONTH | DAY | HOUR | MINUTE | SECOND} FROM d)
描述:
返回日期 d 中指定的時間日期字段的值(年、月、日、時、分、秒)。
例子:
SELECTEXTRACT(YEARFROM TO_DATE('2010-01-04', 'YYYY-MM-DD')) "年",EXTRACT(MONTHFROM'2010-01-04') "月" ,EXTRACT(DAYFROM'2010-01-04') "日" ,EXTRACT(HOURFROM'2010-01-04 05') "時",EXTRACT(MINUTEFROM'2010-01-04 05') "分",EXTRACT(SECONDFROM'2010-01-04 05:06:07') "秒"FROM DUMMY;
語法:
HOUR (t)
描述:
返回時間 t 中表示小時的整數。
例子:
SELECTHOUR ('12:34:56') "hour"FROM DUMMY;--12
語法:
ISOWEEK (d)
描述:
返回日期 d 的 ISO 年份和星期數。星期數前綴爲字母 W。另請閱 WEEK。
例子:
SELECT ISOWEEK (TO_DATE('2011-05-30', 'YYYY-MM-DD')) "isoweek"FROM DUMMY;--2011-W22
語法:
LAST_DAY (d)
描述:
返回包含日期 d 的月的最後一天日期。
例子:
SELECT LAST_DAY (TO_DATE('2010-01-04', 'YYYY-MM-DD')) "last day"FROM DUMMY;--2010-1-31
語法:
LOCALTOUTC (t, timezone)
描述:
將 timezone 下的本地時間 t 轉換爲 UTC 時間(UTC:通用協調時, Universal Time Coordinated。北京時區是東八區,領先UTC 8個小時,UTC + 時區差=本地時間)。
例子:
SELECT LOCALTOUTC (TO_TIMESTAMP('2012-01-01 01:00:00', 'YYYY-MM-DD HH24:MI:SS'), 'EST') "localtoutc"FROM DUMMY;--2012-1-1 6:00:00.0
語法:
MINUTE(t)
描述:
返回時間 t 中表示分鐘的數字。
例子:
SELECTMINUTE ('12:34:56') "minute"FROM DUMMY;--34
語法:
MONTH(d)
描述:
返回日期 d 所在月份的數字。
例子:
SELECTMONTH ('2011-05-30') "month"FROM DUMMY;--5
語法:
MONTHNAME(d)
描述:
返回日期 d 所在月份的英文名。
例子:
SELECTMONTHNAME ('2011-05-30') "monthname"FROM DUMMY;--MAY
語法:
NEXT_DAY (d)
描述:
返回日期 d 的次日。
例子:
SELECT NEXT_DAY (TO_DATE ('2009-12-31', 'YYYY-MM-DD')) "next day"FROM DUMMY;--2010-1-1
語法:
NOW ()
描述:
返回當前時間戳。
例子:
SELECT NOW () "now"FROM DUMMY;--2015-6-12 17:23:01.773
語法:
QUARTER (d, [, start_month ])
描述:
返回日期 d 的年份,季度。第一季度由 start_month 定義的月份開始,若是沒有定義start_month,第一季度假設爲從一月開始。
例子:
SELECTQUARTER (TO_DATE('2012-01-01', 'YYYY-MM-DD'), 2) "quarter"FROM DUMMY;--2011-Q4
語法:
SECOND (t)
描述:
返回時間 t 表示的秒數。
例子:
SELECTSECOND ('12:34:56') "second"FROM DUMMY;--56
語法:
SECONDS_BETWEEN (d1, d2)
描述:
計算日期參數 d1 和 d2 之間的秒數,語義上等同於 d2-d1。
例子:
SELECT SECONDS_BETWEEN ('2015-01-01 01:01:01', '2015-01-01 02:01:01') "seconds between"FROM DUMMY;--3600
SELECT SECONDS_BETWEEN ('2015-01-01 01:01:01', '2015-01-01 01:02:02') "seconds between"FROM DUMMY;--61
SELECT SECONDS_BETWEEN ('2015-01-01 01:01:01', '2015-01-01 01:01:02') "seconds between"FROM DUMMY;--1
語法:
UTCTOLOCAL (t, timezone)
描述:
將 UTC 時間值轉換爲時區 timezone 下的本地時間。
例子:
SELECT UTCTOLOCAL(TO_TIMESTAMP('2012-01-01 01:00:00', 'YYYY-MM-DD HH24:MI:SS'), 'EST') "utctolocal"FROM DUMMY;--2011-12-31 20:00:00.0
語法:
WEEK (d)
描述:
返回日期 d 所在星期的整數數字。另請參閱 ISOWEEK。
例子:
SELECTWEEK(TO_DATE('2011-05-30', 'YYYY-MM-DD')) "week"FROM DUMMY;--23
語法:
WEEKDAY (d)
描述:
返回表明日期 d 所在星期的日期數字(星期幾)。返回值範圍爲 0 至 6,表示 Monday(0)至 Sunday(6)。
例子:
SELECTWEEKDAY (TO_DATE ('2011-01-02', 'YYYY-MM-DD')) "week day"FROM DUMMY;--6
SELECTWEEKDAY (TO_DATE ('2011-01-03', 'YYYY-MM-DD')) "week day"FROM DUMMY;--0
語法:
YEAR (d)
描述:
返回日期 d 所在的年份數。
例子:
SELECTYEAR (TO_DATE ('2011-05-30', 'YYYY-MM-DD')) "year"FROM DUMMY;--2011
數字函數接受數字或者帶有數字的字符串做爲輸入,返回數值。 當數字字符的字符串做爲輸入時,在計算結果前,自動執行字符串到數字的隱式轉換。
語法:
ABS (n)
描述:
返回數字參數 n 的絕對值。
例子:
SELECTABS (-1) "absolute"FROM DUMMY;--1
語法:
ACOS (n)
描述:
返回參數 n 的反餘弦,以弧度爲單位,值爲-1 至 1。
例子:
SELECTACOS (0.5) "acos"FROM DUMMY;--1.0471975511965979
語法:
ASIN (n)
描述:
返回參數 n 的反正弦值,以弧度爲單位,值爲-1 至 1。
例子:
SELECTASIN (0.5) "asin"FROM DUMMY;--0.5235987755982989
語法:
ATAN (n)
描述:
返回參數 n 的反正切值,以弧度爲單位, n 的範圍爲無限。
例子:
SELECTATAN (0.5) "atan"FROM DUMMY;--0.4636476090008061
語法:
ATAN2 (n, m)
描述:
返回兩數 n 和 m 比率的反正切值,以弧度爲單位。這和 ATAN(n/m)的結果一致。
例子:
SELECTATAN2 (1.0, 2.0) "atan2"FROM DUMMY;--0.4636476090008061
語法:
BINTOHEX (expression)
描述:
將二進制值轉換爲十六進制。
例子:
SELECT BINTOHEX('AB') "bintohex"FROM DUMMY;--4142 先會將「AB」字符串隱式轉換爲二進制??
SELECT TO_BINARY ('AB') "to binary"FROM DUMMY;--4142 顯示時倒是以十六進制顯示,而不是二進制?
語法:
BITAND (n, m)
描述:
對參數 n 和 m 的位執行 AND 操做(即按位與)。 n 和 m 都必須是非負整數。 BITAND 函數返回 BIGINT 類型的結果。
例子:
SELECT BITAND (255, 123) "bitand"FROM DUMMY;--123
語法:
CEIL(n)
描述:
返回大於或者等於 n 的第一個整數(大小它的最小整數)
例子:
SELECT CEIL (14.5) "ceiling"FROM DUMMY;--15
語法:
COS (n)
描述:
返回參數 n 的餘弦值,以弧度爲單位。
例子:
SELECTCOS (0.0) "cos"FROM DUMMY;--1
語法:
COSH (n)
描述:
返回參數 n 的雙曲餘弦值。
例子:
SELECT COSH (0.5) "cosh"FROM DUMMY;--1.1276259652063807
語法:
COT (n)
描述:
計算參數 n 的餘切值,其中 n 以弧度表示。
例子:
SELECTCOT (40) "cot"FROM DUMMY;-- -0.8950829176379128
語法:
EXP (n)
描述:
返回以 e 爲底, n 爲指數的計算結果。
例子:
SELECTEXP (1.0) "exp"FROM DUMMY;--2.718281828459045
語法:
FLOOR (n)
描述:
返回不大於參數 n 的最大整數。
例子:
SELECTFLOOR (14.5) "floor"FROM DUMMY;--14
語法:
GREATEST (n1 [, n2]...)
描述:
返回參數 n1,n2,…最大數。
例子:
SELECT GREATEST ('aa', 'ab', 'bb', 'ba') "greatest"FROM DUMMY;--bb
語法:
HEXTOBIN (value)
描述:
將十六進制數轉換爲二進制數。
例子:
SELECTHEXTOBIN ('1a') "hextobin"FROM DUMMY;--1A 仍是以十六進制來顯示?
語法:
LEAST (n1 [, n2]...)
描述:
返回參數 n1,n2,…最小數。
例子:
SELECT LEAST('aa', 'ab', 'ba', 'bb') "least"FROM DUMMY;--aa
語法:
LN (n)
描述:
返回參數 n 的天然對數。
例子:
SELECTLN (9) "ln"FROM DUMMY;--2.1972245773362196
語法:
LOG (b, n)
描述:
返回以 b 爲底, n 的天然對數值。底 b 必須是大於 1 的正數,且 n 必須是正數。
例子:
SELECTLOG (10, 2) "log"FROM DUMMY;--0.30102999566398114
語法:
MOD (n, d)
描述:
返回 n 整除 b 的餘數值。
當 n 爲負時,該函數行爲不一樣於標準的模運算。
如下列舉了 MOD 函數返回結果的例子
若是 d 爲零,返回 n。
若是 n 大於零,且 n 小於 d,則返回 n。
若是 n 小於零,且 n 大於 d,則返回 n。
在上文提到的其餘狀況中,利用 n 的絕對值除以 d 的絕對值來計算餘數。若是 n 小於 0,則 MOD返回的餘數爲負數;若是 n 大於零, MOD 返回的餘數爲正數。
例子:
SELECTMOD (15, 4) "modulus"FROM DUMMY;--3
SELECTMOD (-15, 4) "modulus"FROM DUMMY;-- -3
語法:
POWER (b, e)
描述:
計算以 b 爲底, e 爲指數的值。
例子:
SELECTPOWER (2, 10) "power"FROM DUMMY;--1024
語法:
ROUND (n [, pos])
描述:
返回參數 n 小數點後 pos 位置的值(四捨五入)。
例子:
SELECTROUND (16.16, 1) "round"FROM DUMMY;--16.2
SELECTROUND (16.16, -1) "round"FROM DUMMY;--20
語法:
SIGN (n)
描述:
返回 n 的符號(正或負)。若是 n 爲正,則返回 1; n 爲負,返回-1, n 爲 0 返回 0。
例子:
SELECTSIGN (-15) "sign"FROM DUMMY;-- -1
語法:
SIN (n)
描述:
返回參數 n 的正弦值,以弧度爲單位。
例子:
SELECTSIN(3.141592653589793/2) "sine"FROM DUMMY;--1
語法:
SINH (n)
描述:
返回 n 的雙曲正弦值,以弧度爲單位。
例子:
SELECT SINH (0.0) "sinh"FROM DUMMY;--0
語法:
SQRT (n)
描述:
返回 n 的平方根。
例子:
SELECTSQRT (2) "sqrt"FROM DUMMY;--1.4142135623730951
語法:
TAN (n)
描述:
返回 n 的正切值,以弧度爲單位。
例子:
SELECTTAN (0.0) "tan"FROM DUMMY;--0
語法:
TANH (n)
描述:
返回 n 的雙曲正切值,以弧度爲單位。
例子:
SELECT TANH (1.0) "tanh"FROM DUMMY;--0.7615941559557649
語法:
UMINUS (n)
描述:
返回 n 的負值。
例子:
SELECT UMINUS(-765) "uminus"FROM DUMMY;--756
SELECT UMINUS(765) "uminus"FROM DUMMY;-- -756
語法:
ASCII(c)
描述:
返回字符串 c 中第一個字節的 ASCII 值。
SELECTASCII('Ant') "ascii"FROM DUMMY;--65
語法:
CHAR (n)
描述:
返回 ASCII 值爲數字 n 的字符。
例子:
SELECTCHAR (65) || CHAR (110) || CHAR (116) "character"FROM DUMMY;--Ant
語法:
CONCAT (str1, str2)
描述:
返回位於 str1 後的 str2 聯合組成的字符串。級聯操做符(||)與該函數做用相同。
例子:
SELECTCONCAT ('C', 'at') "concat"FROM DUMMY;--Cat
語法:
LCASE(str)
描述:
將字符串 str 中全部字符轉換爲小寫。
注意: LCASE 函數做用與 LOWER 函數相同。
例子:
SELECTLCASE ('TesT') "lcase"FROM DUMMY;--test
語法:
LEFT (str, n)
描述:
返回字符串 str 開頭 n 個字符/位的字符。
例子:
SELECTLEFT ('Hello', 3) "left"FROM DUMMY;--Hel
語法:
LENGTH(str)
描述:
返回字符串 str 中的字符數。對於大對象(LOB)類型,該函數返回對象的字節長度。
例子:
SELECTLENGTH ('length in char') "length"FROM DUMMY;--14
語法:
LOCATE (haystack, needle)
描述:
返回字符串 haystack 中子字符串 needle 所在的位置。若是未找到,則返回 0。
例子:
SELECTLOCATE ('length in char', 'char') "locate"FROM DUMMY;--11
SELECTLOCATE ('length in char', 'length') "locate"FROM DUMMY;--1
SELECTLOCATE ('length in char', 'zchar') "locate"FROM DUMMY;--0
語法:
LOWER (str)
描述:
將字符串 str 中全部字符轉換爲小寫。
注意: LOWER 函數做用與 LCASE 相同。
例子:
SELECTLOWER ('AnT') "lower"FROM DUMMY;--ant
語法:
LPAD (str, n [, pattern])
描述:
從左邊開始對字符串 str 使用空格進行填充,達到 n 指定的長度。若是指定了 pattern 參數,字符串 str 將按順序填充直到知足 n 指定的長度。
例子:
SELECT LPAD ('end', 15, '12345') "lpad"FROM DUMMY;--123451234512end
語法:
LTRIM (str [, remove_set])
描述:
返回字符串 str 截取全部前導空格後的值。若是定義了 remove_set, LTRIM 從起始位置移除字符串str 包含該集合中的字符,該過程持續至到達不在 remove_set 中的字符。
注意: remove_set 被視爲字符集合,而非搜索字符。
例子:
SELECTLTRIM ('babababAabend','ab') "ltrim"FROM DUMMY;--Aabend
語法:
NCHAR (n)
描述:
返回整數 n 表示的 Unicode 字符。
例子:
SELECT UNICODE ('江') "unicode"FROM DUMMY;--27743
SELECTNCHAR (27743) "nchar"FROM DUMMY;--江
語法:
REPLACE (original_string, search_string, replace_string)
描述:
搜索 original_string 全部出現的 search_string,並用 replace_string 替換。
若是 original_string 爲空, 則返回值也爲空。
若是 original_string 中兩個重疊的子字符串與 search_string 匹配,只有第一個會被替換:
SELECTREPLACE ('abcbcb','bcb', '') "replace"FROM DUMMY;--acb
若是 original_string 未出現 search_string,則返回未修改的 original_string。
若是 original_string, search_string 或者 replace_string 爲 NULL,則返回值也爲 NULL。
例子:
SELECTREPLACE ('DOWNGRADE DOWNWARD','DOWN', 'UP') "replace"FROM DUMMY;--UPGRADE UPWARD
語法:
RIGHT(str, n)
描述:
返回字符串 str 中最右邊的 n 字符/字節。
例子:
SELECTRIGHT('HI0123456789', 3) "right"FROM DUMMY;--789
語法:
RPAD (str, n [, pattern])
描述:
從尾部開始對字符串 str 使用空格進行填充,達到 n 指定的長度。若是指定了 pattern 參數,字符串 str 將按順序填充直到知足 n 指定的長度。
例子:
SELECT RPAD ('end', 15, '12345') "right padded"FROM DUMMY;--end123451234512
語法:
RTRIM (str [,remove_set ])
描述:
返回字符串 str 截取全部後置空格後的值。若是定義了 remove_set, RTRIM 從尾部位置移除字符串 str 包含該集合中的字符,該過程持續至到達不在 remove_set 中的字符。
注意: remove_set 被視爲字符集合,而非搜索字符。
例子:
SELECTRTRIM ('endabAabbabab','ab') "rtrim"FROM DUMMY;--endabA
語法:
SUBSTR_AFTER (str, pattern)
描述:
返回 str 中位於 pattern 第一次出現位置後的子字符串。
若是 str 不包含 pattern 子字符串,則返回空字符串。
若是 pattern 爲空字符串,則返回 str。
若是 str 或者 pattern 爲 NULL,則返回 NULL。
例子:
SELECT SUBSTR_AFTER ('Hello My Friend','My') "substr after"FROM DUMMY;-- ' Friend'
語法:
SUBSTR_BEFORE (str, pattern)
描述:
返回 str 中位於 pattern 第一次出現位置前的子字符串。
若是 str 不包含 pattern 子字符串,則返回空字符串。
若是 pattern 爲空字符串,則返回 str。
若是 str 或者 pattern 爲 NULL,則返回 NULL。
例子:
SELECT SUBSTR_BEFORE ('Hello My Friend','My') "substr before"FROM DUMMY;--'Hello '
語法:
SUBSTRING (str, start_position [, string_length])
描述:
返回字符串 str 從 start_position 開始的子字符串。 SUBSTRING 能夠返回 start_position 起的剩餘部分字符或者做爲可選,返回由 string_length 參數設置的字符數。
若是 start_position 小於 0,則被視爲 1。
若是 string_length 小於 1,則返回空字符串。
例子:
SELECTSUBSTRING ('1234567890',4,2) "substring"FROM DUMMY;--45
語法:
TRIM ([[LEADING | TRAILING | BOTH] trim_char FROM] str )
描述:
返回移除前導和後置空格後的字符串 str。截斷操做從起始(LEADING)、結尾(TRAILING)或者兩端(BOTH)執行。
若是 str 或者 trim_char 爲空,則返回 NULL。
若是沒有指定可選項, TRIM 移除字符串 str 中兩端的子字符串 trim_char。
若是沒有指定 trim_char,則使用單個空格(就是去空格)。
例子:
SELECTTRIM ('a'FROM'aaa123456789aa') "trim both"FROM DUMMY;--123456789
SELECTTRIM (LEADING'a'FROM'aaa123456789aa') "trim leading"FROM DUMMY;--123456789aa
語法:
UCASE (str)
描述:
將字符串 str 中全部字符轉換爲大寫。
注意: UCASE 函數做用與 UPPER 函數相同。
例子:
SELECTUCASE ('Ant') "ucase"FROM DUMMY;--ANT
語法:
UNICODE(c)
描述:
返回字符串中首字母的 UnIcode 字符碼數字;若是首字母不是有效編碼,則返回 NULL。
例子:
SELECT UNICODE ('江') "unicode"FROM DUMMY;--27743
SELECTNCHAR (27743) "nchar"FROM DUMMY;--江
語法:
UPPER (str)
描述:
將字符串 str 中全部字符轉換爲大寫。
注意: UPPER 函數做用與 UCASE 相同。
例子:
SELECTUPPER ('Ant') "uppercase"FROM DUMMY;--ANT
語法:
COALESCE (expression_list)
描述:
返回 list 中非 NULL 的表達式。 Expression_list 中必須包含至少兩個表達式,而且全部表達式都是可比較的。若是全部的參數都爲 NULL,則結果也爲 NULL。
例子:
CREATETABLE coalesce_example (ID INTPRIMARYKEY, A REAL, B REAL);
INSERTINTO coalesce_example VALUES(1, 100, 80);
INSERTINTO coalesce_example VALUES(2, NULL, 63);
INSERTINTO coalesce_example VALUES(3, NULL, NULL);
SELECT id, a, b, COALESCE (a, b*1.1, 50.0) "coalesce"FROM coalesce_example
語法:
CURRENT_CONNECTION
描述:
返回當前鏈接 ID。
例子:
SELECT CURRENT_CONNECTION "current connection"FROM DUMMY;--400,038
語法:
CURRENT_SCHEMA
描述:
返回當前Schema名。
例子:
SELECT CURRENT_SCHEMA "current schema"FROM DUMMY;--SYSTEM
語法:
CURRENT_USER
描述:
返回當前語句上下文的用戶名,即當前受權堆棧頂部的用戶名。
例子:
--使用SYSTEM用戶執行基礎SQL
SELECT CURRENT_USER "current user"FROM DUMMY;--SYSTEM
-- USER_A用戶建立存儲過程
CREATEPROCEDUREUSER_A.PROC1 LANGUAGE SQLSCRIPT SQL SECURITY DEFINER AS
BEGIN
SELECT CURRENT_USER "current user"FROM DUMMY;
END;
-- USER_A用戶調用
CALL USER_A.PROC1;--USER_A
--受權予USER_B執行USER_A.PROC1的權限後調用
CALL USER_A.PROC1;--USER_A
--將Schema USER_A受權予USER_B用戶後,經過USER_B用戶建立存儲過程
CREATEPROCEDUREUSER_A.PROC2 LANGUAGE SQLSCRIPT SQL SECURITY INVOKER AS
BEGIN
SELECT CURRENT_USER "current user"FROM DUMMY;
END;
-- USER_A用戶調用
CALL USER_A.PROC2;-- USER_A
-- USER_B用戶調用
CALL USER_A.PROC2;-- USER_B
語法:
GROUPING_ID(column_name_list)
描述:
GROUPING_ID 函數可使用 GROUPING SETS 返回單個結果集中的多級彙集。 GROUPING_ID 返回一個整數識別每行所在的組集合。 GROUPING_ID 每一列必須是 GROUPING SETS 中的元素。
經過把生成的位矢量從 GROUPING SETS 轉換爲十進制數,將位矢量視做二進制數,分配GROUPING_ID。組成位矢量後,0 分配給 GROUPING SETS 指定的每一列,不然根據 GROUPING SETS 出現的順序分配 1。經過將位矢量做爲二進制數處理,該函數返回一個整型值做爲輸出。
例子:
SELECT customer, year, product, SUM(sales),GROUPING_ID(customer, year, product)
FROM guided_navi_tab
GROUPBYGROUPING SETS ((customer, year, product),(customer, year),(customer, product),(year, product),(customer),(year),(product));
CUSTOMER YEAR PRODUCT SUM(SALES) GROUPING_ID(CUSTOMER,YEAR,PRODUCT)
1 C1 2009 P1 100 0
2 C1 2010 P1 50 0
3 C2 2009 P1 200 0
4 C2 2010 P1 100 0
5 C1 2009 P2 200 0
6 C1 2010 P2 150 0
7 C2 2009 P2 300 0
8 C2 2010 P2 150 0
9 C1 2009 a 300 1
10 C1 2010 a 200 1
11 C2 2009 a 500 1
12 C2 2010 a 250 1
13 C1 a P1 150 2
14 C2 a P1 300 2
15 C1 a P2 350 2
16 C2 a P2 450 2
17 a 2009 P1 300 4
18 a 2010 P1 150 4
19 a 2009 P2 500 4
20 a 2010 P2 300 4
21 C1 a a 500 3
22 C2 a a 750 3
23 a 2009 a 800 5
24 a 2010 a 450 5
25 a a P1 450 6
26 a a P2 800 6
語法:
IFNULL (expression1, expression2)
描述:
返回輸入中第一個不爲 NULL 的表達式。
若是 expression1 不爲 NULL,則返回 expression1。
若是 expression2 不爲 NULL,則返回 expression2。
若是輸入表達式都爲 NULL,則返回 NULL。
例子:
SELECTIFNULL ('diff', 'same') "ifnull"FROM DUMMY;--diff
SELECTIFNULL (NULL, 'same') "ifnull"FROM DUMMY;--same
SELECTIFNULL (NULL, NULL) "ifnull"FROM DUMMY;--null
語法:
MAP (expression, search1, result1 [, search2, result2] ... [, default_result])
描述:
在搜索集合中搜索 expression,並返回相應的結果。
若是未找到 expression 值,而且定義了 default_result,則 MAP 返回 default_result。
若是未找到 expression 值,而且未定義 default_result,MAP 返回 NULL。
注意:
搜索值和相應的結果老是以搜索-結果方式提供。
例子:
SELECTMAP(2, 0, 'Zero', 1, 'One', 2, 'Two', 3, 'Three', 'Default') "map"FROM DUMMY;--Two
SELECTMAP(99, 0, 'Zero', 1, 'One', 2, 'Two', 3, 'Three', 'Default') "map"FROM DUMMY;--Default
SELECTMAP(99, 0, 'Zero', 1, 'One', 2, 'Two', 3, 'Three') "map"FROM DUMMY;--null
語法:
NULLIF (expression1, expression2)
描述:
NULLIF 比較兩個輸入表達式的值,若是第一個表達式等於第二個,NULLIF 返回 NULL。
若是 expression1 不等於 expression2,NULLIF 返回 expression1。
若是 expression2 爲 NULL,NULLIF 返回 expression1。
第一個參數不能是NULL
例子:
SELECTNULLIF ('diff', 'same') "nullif"FROM DUMMY;--diff
SELECTNULLIF('same', 'same') "nullif"FROM DUMMY;--null
SELECTNULLIF('same', null) "nullif"FROM DUMMY;--same
語法:
SESSION_CONTEXT(session_variable)
描述:
返回分配給當前用戶的 session_variable 值。
訪問的 session_variable ,能夠是預約義或者用戶自定義。預約義的會話變量能夠經過客戶端設置的有'APPLICATION', 'APPLICATIONUSER'以及'TRACEPROFILE'。
會話變量能夠定義或者修改經過使用命令 SET [SESSION] <variable_name> = <value>,使用 UNSET [SESSION] <variable_name>取消設置。
SESSION_CONTEXT 返回最大長度爲 512 字符的 NVARCHAR 類型。
例子:
讀取會話變量:
SELECT SESSION_CONTEXT('APPLICATION') "session context"FROM DUMMY;--HDBStudio
語法:
SESSION_USER
描述:
返回當前會話的用戶名。
例子:
-- example showing basic function operation using SYSTEM user
SELECT SESSION_USER "session user"FROM DUMMY;--SYSTEM
SYSUUID
語法:
描述:
返回 SAP HANA 鏈接實例的 SYSUUID。
例子:
SELECT SYSUUID FROM DUMMY;--557A323598FE12F4E20036775F49B32D
本章描述 SAP HANA 數據庫支持的 SQL 語句。
Schema Definition and Manipulation Statements Schema操縱語句
Data Manipulation Statements 數據操縱語句
System Management Statements 系統管理語句
Session Management Statements 會話管理語句
Transaction Management Statements 事務管理語句
Access Control Statements 訪問控制語句
Data Import Export Statements 數據導入導出語句
語法:
ALTER AUDIT POLICY <policy_name> <audit_mode>
語法元素:
<policy_name> ::= <identifier>
被改變的審計策略名:
<audit_mode> ::= ENABLE | DISABLE
Audit_mode 啓用或禁用審計策略。
ENABLE:啓用審計策略。
DISABLE:禁用審計策略。
描述:
ALTER AUDIT POLICY 語句啓用或禁用審計策略。 <policy_name>必須定義一個已存在的審計策略名。
只有擁有系統權限 AUDIT ADMIN 的數據庫用戶容許改變審計策略。每一個擁有該權限的數據庫用戶能夠修改任意的審計策略,不管是否由該用戶建立。
新建的審計策略默認爲禁用,而且不會發生任何審計。所以,必須啓動該審計策略來執行審計。
審計策略能夠視須要禁用和啓用。
配置參數:
如下審計的配置參數存儲在文件 global.ini,在審計配置部分:
global_auditing_state ( 'true' / 'false' )
不管啓動的審計策略數量多少,審計只會在配置參數 global_auditing_state 設置爲 true 時啓用,默認值 false。
default_audit_trail_type ( 'SYSLOGPROTOCOL' / 'CSVTEXTFILE' ) 指定如何存儲審計結果。
SYSLOGPROTOCOL:使用系統 syslog。
CSVTEXTFILE:審計信息值以逗號分隔存儲在一個文本文件中。
default_audit_trail_path
指定 CSVTEXTFILE 存儲的文件路徑。
若是用戶擁有須要的系統權限,參數能夠在監控視圖 M_INIFILE_CONTENTS 中選擇。這些只有在顯示設置的狀況下才可見。
系統表和監控視圖:
AUDIT_POLICY:顯示全部審計策略和狀態。
M_INIFILE_CONTENTS:顯示數據庫系統配置參數。
只有擁有系統權限 CATALOG READ, DATA ADMIN 或 INIFILE ADMIN 的用戶能夠查看
M_INIFILE_CONTENTS 視圖中的內容,對於其餘用戶則爲空。
例子:
該例子中你須要先利用以下語句建立名爲 priv_audit 的審計權限:
CREATE AUDIT POLICY priv_audit AUDITING SUCCESSFUL GRANT PRIVILEGE, REVOKE PRIVILEGE, GRANT ROLE, REVOKE ROLE LEVEL CRITICAL;
如今你能夠啓用審計策略:
ALTER AUDIT POLICY priv_audit ENABLE;
你也能夠禁用該審計策略:
ALTER AUDIT POLICY priv_audit DISABLE;
語法:
ALTER FULLTEXT INDEX <index_name> <alter_fulltext_index_option>
語法元素:
<index_name> ::= <identifier>
被修改的全文索引標識符:
<alter_fulltext_index_option> ::= <fulltext_parameter_list> | <queue_command> QUEUE
定義了全文索引的參數或者全文索引隊列的狀態是否應該修改。後者只對異步顯式全文索引可見。
<fulltext_parameter_list> ::= <fulltext_parameter> [, ...]
修改的全文索引參數列表:
<fulltext_parameter> ::= FUZZY SEARCH INDEX <on_off>
| PHRASE INDEX RATIO <index_ratio>
| <change_tracking_elem>
<on_off> ::= ON | OFF
FUZZY SEARCH INDEX
使用模糊搜索索引。
PHRASE INDEX RATIO
定義短語索引比率。
<index_ratio> ::= <float_literal>
定義短語索引比率的百分比,值必須爲 0.0 與 1.0 之間。
SYNC[HRONOUS]
改變全文索引至同步模式。
ASYNC[HRONOUS]
改變全文索引至異步模式。
<flush_queue_elem> ::= EVERY <integer_literal> MINUTES
| AFTER <integer_literal> DOCUMENTS
| EVERY <integer_literal> MINUTES OR AFTER <integer_literal>
DOCUMENTS
當使用異步索引時,你能夠利用 flush_queue_elem 定義更新全文索引的時間。
<queue_command> ::= FLUSH | SUSPEND | ACTIVATE
FLUSH
利用正在處理隊列的文件更新全文索引。
SUSPEND
暫停全文索引處理隊列。
ACTIVATE
激活全文索引處理隊列。
描述:
使用該命令,你能夠修改全文索引的參數或者索引處理隊列的狀態。隊列是用來激活全文索引以
異步方式工做的機制,例如插入操做被阻塞,直到文件處理完。
ALTER FULLTEXT INDEX <index_name> <fulltext_elem_list>語句修改全文索引的參數。
ALTER FULLTEXT INDEX <index_name> <queue_parameters>語句修改異步全文索引的處理隊列狀
態。
例子:
ALTER FULLTEXT INDEX i1 PHRASE INDEX RATIO 0.3 FUZZY SEARCH INDEX ON
在上述例子中,對於全文索引’i1’,短文索引比率設爲 30,,而且啓用了模糊搜索索引。
ALTER FULLTEXT INDEX i2 SUSPEND QUEUE
暫停全文索引’i2’的隊列
ALTER FULLTEXT INDEX i2 FLUSH QUEUE
利用隊列中已處理的文件更新全文索引’i2’。
ALTER INDEX <index_name> REBUILD
語法元素:
<index_name>::= <identifier>
定義重建的索引名。
描述:
ALTER INDEX 語句重建索引。
例子:
如下例子重建索引 idx。
ALTER INDEX idx REBUILD;
語法:
ALTER SEQUENCE <sequence_name> [<alter_sequence_parameter_list>]
[RESET BY <reset_by_subquery>]
語法元素:
<sequence_name> ::= <identifier>
被修改的序列名。
<alter_sequence_parameter_list> ::= <alter_sequence_parameter>, ...
<alter_sequence_parameter> ::= <sequence_parameter_restart_with>
| <basic_sequence_parameter>
<sequence_parameter_restart_with> ::= RESTART WITH <restart_value>
<basic_sequence_parameter> ::= INCREMENT BY <increment_value>
| MAXVALUE <maximum_value>
| NO MAXVALUE
| MINVALUE <minimum_value>
| NO MINVALUE
| CYCLE
| NO CYCLE
RESTART WITH
序列的起始值。若是你沒有指定 RESTART WITH 子句的值,將使用當前序列值。
<restart_value> ::= <integer_literal>
由序列生成器提供的第一個值爲 0 至 4611686018427387903 之間的整數。
INCREMENT BY
序列增量值。
<increment_value> ::= <integer_literal>
利用一個整數增長或者減小序列的值。
MAXVALUE
定義序列生成的最大值。
<maximum_value> ::= <integer_literal>
一個正整數定義序列可生成的最大數值,必須爲 0 至 4611686018427387903 之間。
NO MAXVALUE
使用 NO MAXVALUE 指令,遞增序列的最大值將爲 4611686018427387903,遞減序列的最大值爲-1。
MINVALUE
定義序列生成的最小值。
<minimum_value> ::= <integer_literal>
一個正整數定義序列可生成的最小數值,必須爲 0 至 4611686018427387903 之間。
NO MINVALUE
使用 NO MINVALUE 指令,遞增序列的最小值將爲 1,遞減序列的最小值爲-
4611686018427387903。
CYCLE
使用 CYCLE 指令,序列在到達最大值或最小值後將會從新開始。
NO CYCLE
使用 NO CYCLE 指令,序列在到達最大值或最小值後將不會從新開始。
<reset_by_subquery> ::= <subquery>
系統重啓期間,系統自動執行 RESET BY 語句,而且將用 RESET BY 子查詢肯定的值重啓序列。
關於子查詢的詳情,請參閱 Subquery。
描述:
ALTER SEQUENCE 語句用來修改序列生成器的參數。
例子:
在下面的例子中,你把序列 seq 的起始序列值改成 2。
ALTER SEQUENCE seq RESTART WITH 2;
在下面的例子中,你把序列 seq 的最大值改成 100,而且沒有最小值。
ALTER SEQUENCE seq MAXVALUE 100 NO MINVALUE;
在下面的例子中,你把序列 seq 的增量改成 2,而且限制爲"no cycle"。
ALTER SEQUENCE seq INCREMENT BY 2 NO CYCLE;
在下面的例子中,你首先建立表 r,有一列 a。而後你將序列 seq 的 reset-by 子查詢修改成列 a 包
含的最大值。
CREATE TABLE r (a INT);
ALTER SEQUENCE seq RESET BY SELECT MAX(a) FROM r;
語法:
ALTER TABLE [<schema_name>.]<table_name>{
<add_column_clause>
| <drop_column_clause>
| <alter_column_clause>
| <add_primary_key_clause>
| <drop_primary_key_clause>
| <preload_clause>
| <table_conversion_clause>
| <move_clause>
| <add_range_partition_clause>
| <move_partition_clause>
| <drop_range_partition_clause>
| <partition_by_clause>
| <disable_persistent_merge_clause>
| <enable_persistent_merge_clause>
| <enable_delta_log>
| <disable_delta_log>
| <enable_automerge>
| <disable_automerge>
}
語法元素:
<add_column_clause> ::= ADD ( <column_definition> [<column_constraint>], ...)
<drop_column_clause> ::= DROP ( <column_name>, ... )
<alter_column_clause> ::= ALTER ( <column_definition> [<column_constraint>], ... )
<column_definition> ::= <column_name> <data_type> [<column_store_data_type>][<ddic_data_type>] [DEFAULT <default_value>] [GENERATED ALWAYS AS <expression>]
<column_constraint> ::= NULL| NOT NULL| UNIQUE [BTREE | CPBTREE]| PRIMARY KEY [BTREE | CPBTREE]
<data_type> ::= DATE | TIME | SECONDDATE | TIMESTAMP | TINYINT | SMALLINT | INTEGER | BIGINT |SMALLDECIMAL | DECIMAL | REAL | DOUBLE| VARCHAR |
NVARCHAR | ALPHANUM | SHORTTEXT |VARBINARY | BLOB| CLOB | NCLOB | TEXT
<column_store_data_type> ::= CS_ALPHANUM | CS_INT | CS_FIXED | CS_FLOAT | CS_DOUBLE |CS_DECIMAL_FLOAT | CS_FIXED(p-s, s) | CS_SDFLOAT| CS_STRING |
CS_UNITEDECFLOAT | CS_DATE | CS_TIME| CS_FIXEDSTRING | CS_RAW | CS_DAYDATE | CS_SECONDTIME | CS_LONGDATE | CS_SECONDDATE
<ddic_data_type> ::= DDIC_ACCP | DDIC_ALNM | DDIC_CHAR | DDIC_CDAY | DDIC_CLNT | DDIC_CUKY| DDIC_CURR | DDIC_D16D | DDIC_D34D | DDIC_D16R |
DDIC_D34R | DDIC_D16S | DDIC_D34S| DDIC_DATS | DDIC_DAY | DDIC_DEC | DDIC_FLTP | DDIC_GUID| DDIC_INT1 | DDIC_INT2 | DDIC_INT4 | DDIC_INT8 | DDIC_LANG | DDIC_LCHR | DDIC_MIN|DDIC_MON| DDIC_LRAW | DDIC_NUMC | DDIC_PREC | DDIC_QUAN | DDIC_RAW| DDIC_RSTR | DDIC_SEC | DDIC_SRST | DDIC_SSTR | DDIC_STRG | DDIC_STXT | DDIC_TIMS| DDIC_UNIT| DDIC_UTCM | DDIC_UTCL | DDIC_UTCS | DDIC_TEXT | DDIC_VARC | DDIC_WEEK
<default_value> ::= NULL | <string_literal> | <signed_numeric_literal> | <unsigned_numeric_literal>
DEFAULT:DEFAULT 定義了 INSERT 語句沒有爲列提供值狀況下,默認分配的值。
GENERATED ALWAYS AS:指定在運行時生成的列值的表達式。
<column_constraint> ::= NULL| NOT NULL| UNIQUE [BTREE | CPBTREE]| PRIMARY KEY [BTREE | CPBTREE]
NULL | NOT NULL:NOT NULL 禁止列的值爲 NULL。若是指定了 NULL,將不被認爲是常量,其表示一列可能含有空值,默認爲 NULL。
UNIQUE:指定爲惟一鍵的列。一個惟一的複合鍵指定多個列做爲惟一鍵。有了 unique 約束,多行不能在同一列中具備相同的值。
PRIMARY KEY:主鍵約束是 NOT NULL 約束和 UNIQUE 約束的組合,其禁止多行在同一列中具備相同的值。
BTREE | CPBTREE:指定索引類型。當列的數據類型爲字符串、二進制字符串、十進制數或者約束是一個組合鍵,或非惟一鍵,默認的索引類型爲 CPBTREE,不然
使用 BTREE。
爲了使用 B+-樹索引,必須使用 BTREE 關鍵字;對於 CPB+-樹索引,需使用 CPBTREE 關鍵字。
B+-樹是維護排序後的數據進行高效的插入、刪除和搜索記錄的樹。
CPB+-樹表示壓縮前綴 B+-樹,是基於 pkB-tree 樹。 CPB+樹是一個很是小的索引,由於它使用「部分鍵」,只是索引節點所有鍵的一部分。對於更大的鍵,
CPB+-樹展示出比 B+-樹更好的性能。
若是省略了索引類型, SAP HANA 數據庫將考慮列的數據類型選擇合適的索引。
ALTER時,增長一列的長度是能夠作到的。當在列式存儲中嘗試修改列的定義,不會返回錯誤,由於在數據庫中沒有作任何的檢查。錯誤可能發生在選擇列時,數據不符合新定義的數據類型。 ALTER 仍未遵守數據類型轉換規則。
將 NOT NULL 約束添加到已存在的列是能夠的,若是表爲空或者表有數據時定義了默認值
<add_primary_key_clause> ::= ADD [CONSTRAINT <constraint_name>] PRIMARY KEY( <column_name>, ... )
ADD PRIMARY KEY:增長一列主鍵。
PRIMARY KEY:主鍵約束是 NOT NULL 約束和 UNIQUE 約束的組合,其禁止多行在同一列中具備相同的值。
CONSTRAINT:指定約束名。
<drop_primary_key_clause> ::= DROP PRIMARY KEY
DROP PRIMARY KEY:刪除主鍵約束。
<preload_clause> ::= PRELOAD ALL | PRELOAD ( <column_name> ) | PRELOAD NONE
PRELOAD:設置/移除給定表或列的預載標記。 PRELOAD ALL 爲表中全部列設置預載標記, PRELOAD( <column_name> )爲指定的列設置標記, PRELOAD NONE 移除
全部列的標記。其結果是這些表在索引服務器啓動後自動加載至內存中。預載標記的當前狀態在系統表 TABLES,列 PRELOAD 中可見, 可能值爲('FULL', 'PARTIALLY',
'NO');在系統表 TABLE_COLUMNS,列 PRELOAD,可能值爲('TRUE','FALSE')。
<table_conversion_clause> ::= [ALTER TYPE] {ROW [THREADS <number_of_threads>] | COLUMN[THREADS <number_of_threads> [BATCH <batch_size>]]}
ALTER TYPE ROW | COLUMN:該命令用於將表存儲類型從行轉換爲列或從列轉換爲行。
THREADS <number_of_threads>:指定進行錶轉換的並行線程數。線程數目的最佳值應設置爲可用的 CPU 內核的數量。
Default:默認值爲 param_sql_table_conversion_parallelism,即在 ndexserver.ini 文件中定義的 CPU內核數。
BATCH <batch_size>:指定批插入的行數,默認值爲最佳值 2,000,000。插入表操做在每一個<batch_size>記錄插入後當即提交,能夠減小內存消耗。 BATCH 可選項只
能夠在表 從行轉換爲列時使用。然而,大於 2,000,000的批大小可能致使高內存消耗,所以不建議修改該值。經過複製現有的表中的列和數據,能夠從現有的表
建立一個不一樣存儲類型的新表。該命令用來把表從行轉換爲列或從列轉換爲行。若是源表是行式存儲,則新建的表爲列式存儲。
<move_clause> ::= MOVE [PARTITION <partition_number>] TO [LOCATION ]<host_port> [PHYSICAL] |MOVE [PARTITION <partition_number>] PHYSICAL
MOVE 將表移動至分佈式環境中的另外一個位置。 端口號是內部索引服務器的端口號, 3xx03。若是你有一個分區表,你能夠經過指定可選的分區號只移動個別部
分,移動分區表時,沒有指定分區號會致使錯誤。
PHYSICAL 關鍵字只適用列式存儲表。行式存儲表老是物理移動。若是指定了可選關鍵字 PHYSICAL,持久存儲當即移動至目標主機。不然,此舉將建立一個新主機
裏面的持久層連接指向舊主機持久層。該連接若是沒有 TO<host_port>部分,將在下次合併或者移 動中刪除。PHYSICAL 移動操做沒有指定 TO <host_port>時,將移
除從上次移動中仍然存在的持久層連接。
LOCATION 僅支持向後兼容
<add_range_partition_clause> ::= ADD PARTITION <lower_value> <= VALUES < <upper_value>| PARTITION <value_or_values> = <target_value>| PARTITION OTHERS
ADD PARTITION:爲一個分區表添加分區,使用 RANGE, HASH RANGE, ROUNDROBIN RANGE 關鍵字。當添加分區至一張按範圍分區的表時,若是須要的話,能夠對
其他分區進行從新分區。
<drop_range_partition_clause> ::= DROP PARTITION <lower_value> <= VALUES < <upper_value>| PARTITION <value_or_values> = <target_value>| PARTITION OTHERS
DROP PARTITION:刪除根據 RANGE, HASH RANGE, ROUNDROBIN RANGE 分區的表的分區。
<partition_clause> ::= PARTITION BY <hash_partition> [,<range_partition> | ,<hash_partition>]| PARTITION BY <range_partition>| PARTITION BY <roundrobin_partition>
[,<range_partition>]
<hash_partition> ::=HASH (<partition_expression>[, ...]) PARTITIONS { <num_partitions> |GET_NUM_SERVERS() }
<range_partition> ::= RANGE ( <partition_expression> ) ( <range_spec> )
<roundrobin_partition> ::= ROUNDROBIN PARTITIONS {<num_partitions> |GET_NUM_SERVERS()}
<range_spec> ::= {<from_to_spec> | <single_spec>[,...] } [, PARTITION OTHERS]
<from_to_spec> ::= PARTITION <lower_value> <= VALUES < <upper_value>
<single_spec> ::= PARTITION VALUE <single_value>
<partition_expression> ::= <column_name>| YEAR(<column_name>) | MONTH(<column_name>)
PARTITION BY:使用 RANGE, HASH RANGE, ROUNDROBIN RANGE 對錶進行分區。關於表分區自居,請參見 CREATE TABLE。
<merge_partition_clause> ::= MERGE PARTITIONS
MERGE PARTITIONS:合併分區表的全部部分至非分區表。
<disable_persistent_merge_clause> ::= DISABLE PERSISTENT MERGE
DISABLE PERSISTENT MERGE:指導合併管理器對於給定表,使用內存進行合併而非持久合併。
<enable_persistent_merge_clause> ::= ENABLE PERSISTENT MERGE
ENABLE PERSISTENT MERGE:指導合併管理器對於給定表使用持久合併。
<enable_delta_log> ::= ENABLE DELTA LOG
啓動表日誌記錄。啓用以後,你必須執行一個保存點以確保全部的數據都保存,而且你必須執行數據備份,不然你不能恢復這些數據。
<enable_delta_log> ::= DISABLE DELTA LOG
DISABLE DELTA LOG:禁用表日誌記錄。若是禁用,不會記錄該表的日誌。當完成一個保存點對於該表的修改只會寫到數據域,這會致使當索引服務器終止時,提
交的事務丟失。
僅在初次加載中使用該命令!
<enable_delta_log> ::= ENABLE AUTOMERGE
指導合併管理器處理表。
<enable_delta_log> ::= DISABLE AUTOMERGE
DISABLE AUTOMERGE:指導合併管理器忽略該表。
例子:
表 t 已建立,列 b 的默認值設爲 10。
CREATETABLE t (a INT, b INT);
ALTERTABLE t ALTER (b INTDEFAULT 10);
列 c 添加至表 t。
ALTERTABLE t ADD (c NVARCHAR(10) DEFAULT'NCHAR');
建立表 t 的主鍵約束 prim_key。
ALTERTABLE t ADDCONSTRAINT prim_key PRIMARYKEY (a, b);
表 t 類型轉換爲列式 (COLUMN)。
ALTERTABLE t COLUMN;
設置列 b 和 c 的預載標記
ALTERTABLE t PRELOAD (b, c);
表 t 使用 RANGE 分區,而且添加另外一分區。
ALTERTABLE t PARTITIONBY RANGE (a) (PARTITIONVALUE = 1, PARTITION OTHERS);
ALTERTABLE t ADDPARTITION 2 <= VALUES < 10;
表 t 的會話類型改成 HISTORY
ALTERTABLE t CREATEHISTORY;
禁用表 t 的日誌記錄。
ALTERTABLE t DISABLEDELTALOG;
語法:
CREATE AUDIT POLICY <policy_name> AUDITING <audit_status_clause> <audit_action_list> LEVEL <audit_level>
語法元素:
<audit_status_clause> ::= SUCCESSFUL | UNSUCCESSFUL | ALL
<audit_action_list> ::= <audit_action_name>[,<audit_action_name>]...
<audit_action_name> ::=GRANT PRIVILEGE | REVOKE PRIVILEGE| GRANT STRUCTURED PRIVILEGE | REVOKE STRUCTURED PRIVILEGE| GRANT ROLE | REVOKE ROLE| GRANT
ANY | REVOKE ANY| CREATE USER | DROP USER| CREATE ROLE | DROP ROLE| ENABLE AUDIT POLICY | DISABLE AUDIT POLICY| CREATE STRUCTURED PRIVILEGE| DROP STRUCTURED PRIVILEGE| ALTER STRUCTURED PRIVILEGE| CONNECT| SYSTEM CONFIGURATION CHANGE| SET SYSTEM LICENSE| UNSET SYSTEM LICENSE
<audit_level> ::=EMERGENCY| ALERT| CRITICAL| WARNING| INFO
描述:
CREATE AUDIT POLICY 語句建立新的審計策略。該審計策略能夠稍後啓動,並將致使指定的審計活動發生的審計。
只有擁有系統權限 AUDIT ADMIN 用戶才能夠新建審計策略。
指定的審計策略名必須和已有的審計策略名不一樣。
審計策略定義將被審計的審計活動。現有的審計策略須要被激活,從而進行審計。
<audit_status_clause>定義, 成功或不成功或執行指定的審計活動進行審覈。
如下的審計活動是可供使用的。它們被分在不一樣的組裏。一組審計活動能夠組合成一個審計策略,不一樣組的審計行動不能組合成審計策略。
GRANT PRIVILEGE 1 審計授予用戶或角色的權限
REVOKE PRIVILEGE 1 審計撤銷用戶或角色的權限
GRANT STRUCTURED PRIVILEGE 1 審計授予用戶的結構/分析權限
REVOKE STRUCTURED PRIVILEGE 1 審計撤銷用戶的結構/分析權限
GRANT ROLE 1 審計授予用戶或角色的角色
REVOKE ROLE 1 審計撤銷用戶或角色的角色
GRANT ANY 1 審計授予用戶或角色的權限、結構/分析權限或角色
REVOKE ANY 1 審計撤銷用戶或角色的權限、結構/分析權限或角色
CREATE USER 2 審計用戶建立
DROP USER 2 審計用戶刪除
CREATE ROLE 2 審計角色建立
DROP ROLE 2 審計角色刪除
CONNECT 3 審計鏈接到數據庫的用戶
SYSTEM CONFIGURATION CHANGE 4 審計系統配置的更改(e.g. INIFILE)
ENABLE AUDIT POLICY 5 審計審覈策略激活
DISABLE AUDIT POLICY 5 審計審覈策略停用
CREATE STRUCTURED PRIVILEGE 6 審計結構化/分析權限建立
DROP STRUCTURED PRIVILEGE 6 審計結構化/
ALTER STRUCTURED PRIVILEGE 6 審計結構化/分析權限更改
SET SYSTEM LICENSE 7 審計許可證安裝
UNSET SYSTEM LICENSE 7 審計許可證刪除
每個審計分配分配至審計級別,可能的值按照重要性遞減有:EMERGENCY, ALERT, CRITICAL, WARNING, INFO
爲了使得審計活動發生,審計策略必須創建並啓動, global_auditing_state(見下文)必須設置爲true。
配置參數:
目前,審計的配置參數存儲在 global.ini,部分審計配置以下:
global_auditing_state ( 'true' / 'false' )激活/關閉全部審計,不管有多少審計策略可用和啓動。默認爲 false,表明沒有審計會發生。
default_audit_trail_type ( 'SYSLOGPROTOCOL' / 'CSVTEXTFILE' )定義如何存儲審計結果。
SYSLOGPROTOCOL 爲默認值。
CSVTEXTFILE 應只用於測試目的。
default_audit_trail_path 指定 存儲文件的位置, CSVTEXTFILE 已經選定的狀況下。
對於全部的配置參數,能夠在視圖 M_INIFILE_CONTENTS 中選擇,若是當前用戶具備這樣作所需的權限。可是目前這些參數只有在被顯式設置後纔可見。這意味着,它們將對新安裝的數據庫實例不可見。
系統和監控視圖
AUDIT_POLICY:顯式全部審計策略和其狀態
M_INIFILE_CONTENTS:顯示審計有關的配置參數
只有數據庫用戶具備 CATALOG READ, DATA ADMIN 或 INIFILE ADMIN 權限能夠在視圖M_INIFILE_CONTENTS 查看任意信息,對於其餘用戶,該視圖爲空。
例子
新建的名爲 priv_audit 的審計策略將審計有關成功授予和撤銷權限和角色的命令,該審計策略有中等審計級別 CRITICAL.。
該策略必須顯式啓動(見 alter_audit_policy),使得審計策略的審計發生。
CREATEAUDIT POLICY priv_audit AUDITING SUCCESSFUL GRANT PRIVILEGE, REVOKE PRIVILEGE, GRANT ROLE, REVOKE ROLE LEVEL CRITICAL;
語法:
CREATE FULLTEXT INDEX <index_name> ON <tableref> '(' <column_name> ')' [<fulltext_parameter_list>]
定義全文索引名:
<fulltext_parameter_list> ::= <fulltext_parameter> [, ...]
<fulltext_parameter> ::= LANGUAGE COLUMN <column_name>
| LANGUAGE DETECTION '(' <string_literal_list> ')'
| MIME TYPE COLUMN <column_name>
| <change_tracking_elem>
| FUZZY SEARCH INDEX <on_off>
| PHRASE INDEX RATIO <on_off>
| CONFIGURATION <string_literal>
| SEARCH ONLY <on_off>
| FAST PREPROCESS <on_off>
<on_off> ::= ON | OFF
LANGUAGE COLUMN:指定文件語言的列
LANGUAGE DETECTION:語言檢測設置的語言集合。
MIME TYPE COLUMN:指定文件 mime-type 的列
FUZZY SEARCH INDEX:指定是否使用模糊搜索
PHRASE INDEX RATIO:指定短語索引比率的百分比,值必須爲 0.0 和 1.0 之間。
CONFIGURATION:自定義配置文件的文本分析路徑。
SEARCH ONLY:若是設爲 ON,將不存儲原始文件內容。
FAST PREPROCESS:若是設爲 ON,將使用快速處理,例如語言搜索將不可用。
<change_tracking_elem> ::= SYNC[HRONOUS]| ASYNC[HRONOUS] [FLUSH [QUEUE]<flush_queue_elem>]
SYNC:指定是否建立同步全文索引
ASYNC:指定是否建立異步全文索引
<flush_queue_elem> ::= EVERY <integer_literal> MINUTES| AFTER <integer_literal> DOCUMENTS| EVERY <integer_literal> MINUTES OR AFTER <integer_literal> DOCUMENTS
指定若是使用異步索引,更新全文索引的時機。
描述:
CREATE FULLTEXT INDEX 語句對給定表建立顯式全文索引。
例子:
CREATE FULLTEXT INDEX i1 ON A(C) FUZZY SEARCH INDEXOFF
SYNC
LANGUAGE DETECTION ('EN','DE','KR')
上面的例子在表 A 的列 C 建立名爲‘i1’的全文索引,未使用模糊搜索索引, 語言檢測設置的語言集合由'EN','DE' 和 'KR'組成。
語法:
CREATE [UNIQUE] [BTREE | CPBTREE] INDEX [<schema_name>.]<index_name> ON <table_name>(<column_name_order>, ...) [ASC | DESC]
語法元素:
<column_name_order> ::= <column_name> [ASC | DESC]
UNIQUE:用來建立惟一性索引。當建立索引和記錄添加到表中將進行重複檢查。
BTREE | CPBTREE:用來選擇使用的索引類型。當列的數據類型爲字符串、二進制字符串、十進制數或者約束是一個組合鍵,或非惟一鍵,默認的索引類型爲 CPBTREE,不然使用 BTREE。
爲了使用 B+-樹索引,必須使用 BTREE 關鍵字;對於 CPB+-樹索引,需使用 CPBTREE 關鍵字。
B+-樹是維護排序後的數據進行高效的插入、刪除和搜索記錄的樹。
CPB+-樹表示壓縮前綴 B+-樹,是基於 pkB-tree 樹。 CPB+樹是一個很是小的索引,由於它使用「部分鍵」,只是索引節點所有鍵的一部分。對於更大的鍵, CPB+-樹展示出比 B+-樹更好的性能。
若是省略了索引類型, SAP HANA 數據庫將考慮列的數據類型選擇合適的索引。
ASC | DESC:指定以遞增或遞減方式建立索引。
這些關鍵字只能在 btree 索引使用,而且對每一列只能使用一次。
描述:
CREATE INDEX 語句建立索引。
例子:
表 t 建立後,以遞增方式對錶 t 的 b 列建立 CBPTREE 索引 idx。
CREATETABLE t (a INT, b NVARCHAR(10), c NVARCHAR(20));
CREATEINDEX idx ON t(b);
以遞增方式對錶 t 的 a 列建立 CBPTREE 索引 idx,以遞減順序對 b 列建立:
CREATE CPBTREE INDEX idx1 ON t(a, b DESC);
以遞減方式對錶 t 的 a 列和 c 列建立 CPBTREE 索引 idx2。
CREATEINDEX idx2 ON t(a, c) DESC;
以遞增順序對錶 t 的 b 列和 c 列建立惟一性 CPBTREE 索引 idx3。
CREATEUNIQUEINDEX idx3 ON t(b, c);
以遞增順序對錶 t 的 a 列建立惟一性 BTREE 索引 idx4。
CREATEUNIQUEINDEX idx4 ON t(a);
語法:
CREATE SCHEMA <schema_name> [OWNED BY <user_name>]
OWNED BY:指定Schema全部者名字。若是省略,當前用戶將爲Schema全部者。
描述:
CREATE SCHEMA 語句在當前數據庫建立Schema。
例子:
CREATESCHEMA my_schema OWNED BYsystem;
語法:
CREATE SEQUENCE <sequence_name> [<common_sequence_parameter_list>] [RESET BY <subquery>]
語法元素:
<common_sequence_parameter_list> ::= <common_sequence_parameter>, ...
<common_sequence_parameter> ::= START WITH n | <basic_sequence_parameter>
<basic_sequence_parameter> ::= INCREMENT BY n| MAXVALUE n| NO MAXVALUE| MINVALUE n| NO MINVALUE| CYCLE| NO CYCLE
INCREMENT BY:定義上個分配值遞增到下一個序列值的量(即遞增遞減間隔值),默認值爲 1。指定一個負的值來生成一個遞減的序列。 INCREMENT BY 值爲 0,將返回錯誤。
START WITH:定義起始序列值。若是未定義 START WITH 子句值,遞增序列將使用 MINVALUE,遞減序列將使用MAXVALUE。
MAXVALUE:定義序列可生成的最大數值,必須爲 0 至 4611686018427387903 之間。
NO MAXVALUE:使用 NO MAXVALUE 指令,遞增序列的最大值將爲 4611686018427387903,遞減序列的最大值爲-1。
MINVALUE:定義序列可生成的最小數值,必須爲 0 至 4611686018427387903 之間。
NO MINVALUE:使用 NO MINVALUE 指令,遞增序列的最小值將爲 1,遞減序列的最小值爲-4611686018427387903。
CYCLE:使用 CYCLE 指令,序列在到達最大值或最小值後將會從新開始。
NO CYCLE:使用 NO CYCLE 指令,序列在到達最大值或最小值後將不會從新開始。
RESET BY:系統重啓期間,系統自動執行 RESET BY 語句,而且將用 RESET BY 子查詢肯定的值重啓序列。
若是未指定 RESET BY,序列值將持久地存儲在數據庫中。在數據庫重啓過程當中,序列的下一個值將由已保存的序列值生成。
描述:
CREATE SEQUENCE 語句用來建立序列。
序列用來爲多個用戶生成惟一整數。 CURRVAL 用來獲取序列的當前值,NEXTVAL 則用來獲取序列的下一個值。 CURRVAL 只有在會話中調用 NEXTVAL 纔有效。
例子:
例子 1:
序列 seq 已建立,使用 CURRVAL 和 NEXTVAL 從序列中讀取值。
CREATESEQUENCE seq START WITH 11;
NEXTVAL 返回 11:
SELECT seq.NEXTVAL FROM DUMMY;--11
CURRVAL 返回 11:
SELECT seq.CURRVAL FROM DUMMY;--11
例子 2:
若是序列用來在表 R 的 A 列上建立惟一鍵,在數據庫重啓後,經過自動分配列 A 的最大值到序列,建立一個惟一鍵值,語句以下:
CREATETABLE r (a INT);
CREATESEQUENCE s RESETBYSELECTIFNULL(MAX(a), 0) + 1 FROM r;
SELECT s.NEXTVAL FROM DUMMY;--1
語法:
CREATE [PUBLIC] SYNONYM <synonym_name> FOR <object_name>
語法元素:
<object_name> ::= <table_name>| <view_name>| <procedure_name>| <sequence_name>
描述:
CREATE SYNONYM 爲表、視圖、存儲過程或者序列建立備用名稱。
你可使用同義詞把函數和存儲過程從新指向不一樣的表、視圖或者序列,而不須要重寫函數或者過程。
可選項 PUBLIC 容許建立公用同義詞。任何用戶能夠訪問公用同義詞,但只有擁有基本對象合適權限的用戶能夠訪問基本對象。
例子:
CREATESYNONYM t_synonym FOR t;
語法:
CREATE [<table_type>] TABLE [<schema_name>.]<table_name> <table_contents_source>[<logging_option> | <auto_merge_option> | <partition_clause> | <location_clause>]
語法元素:
<table_type> ::= COLUMN| ROW| HISTORY COLUMN| GLOBAL TEMPORARY| LOCAL TEMPORARY
COLUMN, ROW:若是大多數的訪問是經過大量元組,而只選擇少數幾個屬性,應使用基於列的存儲。若是大多數訪問選擇一些記錄的所有屬性,使用基於行的存儲是最好的。 SAP HANA 數據庫使用組合啓用兩種方式的的存儲和解釋。你能夠爲每張表指定組織類型,默認值爲 ROW。
HISTORY COLUMN:利用特殊的事務會話類型稱爲’HISTORY’建立表。具備會話類型’HISTORY’的表支持「時間旅行」, 對歷史狀態的數據庫查詢的執行是可能的。
時間旅行能夠以以下方式完成:
會話級別時間旅行:
SET HISTORY SESSION TO UTCTIMESTAMP = <utc_timestamp>
SET HISTORY SESSION TO COMMIT ID = <commit_id>
<utc_timestamp> ::= <string_literal>
<commit_id> ::= <unsigned_integer>
數據庫會話能夠設置回到一個特定時間點。該語句的 COMMIT ID 變量接受 commitid 做爲參數。commitid 參數的值必須存在系統表 SYS.TRANSACTION_HISTORY 的 COMMIT_ID 列,不然將拋出異常。 COMMIT_ID 在使用用戶定義的快照時是有用的。用戶自定義的快照能夠經過存儲在提交階段分配至事務的 commitid 來得到。 Commitid 能夠經過在事務提交後執行如下查詢來讀取:
SELECT LAST_COMMIT_ID FROM M_TRANSACTIONS WHERE CONNECTION_ID = CURRENT_CONNECTION;
該語句的 TIMESTAMP 變量接受時間戳做爲參數。在系統內部,時間戳用來在系統表SYS.TRANSACTION_HISTORY,commit_time 接近給定的時間戳的地方,查詢一對(commit_time,commit_id),準確的說,選擇最大 COMMIT_TIME 小於等於給定時間戳的對;若是沒有找到這樣的對,將會拋出異常。而後會話將使用 COMMIT_ID 變量肯定的 commit-id 恢復。 要終止恢復會話切換到當前會話中,必須在數據庫鏈接上執行明確的 COMMIT 或 ROLLBACK。
語句級別時間旅行:
<subquery> AS OF UTCTIMESTAMP <utc_timestamp>
<subquery> AS OF COMMIT ID <commit_id>
爲了能使 commitid 與提交時間關聯,需維護系統表 SYS.TRANSACTION_HISTORY,存儲每一個爲歷史表提交數據的事務的額外信息。有關設置會話級別時間旅行的詳細信息,請參閱 SET HISTORY SESSION,關於<subquery>的信息,請參閱 Subquery。
注意:
當會話恢復時,自動提交必須關閉(不然會拋出包含相應錯誤消息的異常)。
非歷史表在恢復會話中總顯示其當前快照。
只有數據查詢語句(select)能夠在恢復會話中使用。
歷史表必須有主鍵。
會話類型能夠經過系統表 SYS.TABLES 的 SESSION_TYPE 列檢查。
GLOBAL TEMPORARY:
表定義全局可見,但數據只在當前會話中可見。表在會話結束後截斷。
全局臨時表的元數據是持久的,表示該元數據一直存在直到表被刪除,元數據在會話間共享。臨時表中的數據是會話特定的,表明只有全局臨時表的全部者才容許插入、讀取、刪除數據,存在於會話持續期間,而且當會話結束時,全局臨時表中的數據會自動刪除。全局臨時表只有當表中沒有任何數據才能被刪除。全局臨時表支持的操做:
1. Create without a primary key
2. Rename table
3. Rename column
4. Truncate
5. Drop
6. Create or Drop view on top of global temporary table
7. Create synonym
8. Select
9. Select into or Insert
10. Delete
11. Update
12. Upsert or Replace
LOCAL TEMPORARY:
表的定義和數據只在當前會話可見,該表在會話結束時被截斷。
元數據在會話間共享,而且是會話特定的,表明只有本地臨時表的全部者才容許查看。臨時表中的數據是會話特定的,表明只有本地臨時表的全部者才容許插入、讀取、刪除數據,存在於會話持續期間,而且當會話結束時,本地臨時表中的數據會自動刪除。
本地臨時表支持的操做:
1. Create without a primary key
2. Truncate
3. Drop
4. Select
5. Select into or Insert
6. Delete
7. Update
8. Upsert or Replace
<table_contents_source> ::= (<table_element>, ...)| <like_table_clause> [WITH [NO] DATA]| [(<column_name>, ...)] <as_table_subquery> [WITH [NO] DATA]]
<table_element> ::= <column_definition> [<column_constraint>]| <table_constraint> (<column_name>, ... )
<column_definition> ::= <column_name> <data_type> [<column_store_data_type>] [<ddic_data_type>][DEFAULT <default_value>] [GENERATED ALWAYS AS
<expression>]
<data_type> ::= DATE | TIME | SECONDDATE | TIMESTAMP | TINYINT | SMALLINT | INTEGER | BIGINT |SMALLDECIMAL | DECIMAL | REAL | DOUBLE|
VARCHAR | NVARCHAR | ALPHANUM | SHORTTEXT |VARBINARY |BLOB | CLOB | NCLOB | TEXT
<column_store_data_type> ::= S_ALPHANUM | CS_INT | CS_FIXED | CS_FLOAT| CS_DOUBLE |CS_DECIMAL_FLOAT | CS_FIXED(p-s, s) | CS_SDFLOAT|
CS_STRING | CS_UNITEDECFLOAT | CS_DATE |CS_TIME | CS_FIXEDSTRING | CS_RAW | CS_DAYDATE | CS_SECONDTIME | CS_LONGDATE |CS_SECONDDATE
<ddic_data_type> ::= DDIC_ACCP | DDIC_ALNM | DDIC_CHAR | DDIC_CDAY | DDIC_CLNT | DDIC_CUKY| DDIC_CURR | DDIC_D16D | DDIC_D34D | DIC_D16R
| DDIC_D34R | DDIC_D16S | DDIC_D34S| DDIC_DATS | DDIC_DAY | DDIC_DEC | DDIC_FLTP | DDIC_GUID | DDIC_INT1 | DDIC_INT2 | DDIC_INT4| DDIC_INT8 | DDIC_LANG | DDIC_LCHR | DDIC_MIN | DDIC_MON| DDIC_LRAW | DDIC_NUMC |DDIC_PREC |DDIC_QUAN | DDIC_RAW | DDIC_RSTR | DDIC_SEC | DDIC_SRST | DDIC_SSTR |DDIC_STRG | DDIC_STXT | DDIC_TIMS | DDIC_UNIT| DDIC_UTCM | DDIC_UTCL | DDIC_UTCS |DDIC_TEXT | DDIC_VARC | DDIC_WEEK
<default_value> ::= NULL | <string_literal> | <signed_numeric_literal>| <unsigned_numeric_literal>
DEFAULT:DEFAULT 定義了 INSERT 語句沒有爲列提供值狀況下,默認分配的值。
GENERATED ALWAYS AS:指定在運行時生成的列值的表達式。
<column_constraint> ::= NULL| NOT NULL| UNIQUE [BTREE | CPBTREE]| PRIMARY KEY [BTREE | CPBTREE]
NULL | NOT NULL:NOT NULL 禁止列的值爲 NULL。若是指定了 NULL,將不被認爲是常量,其表示一列可能含有空值,默認爲 NULL。
UNIQUE:指定爲惟一鍵的列。一個惟一的複合鍵指定多個列做爲惟一鍵。有了 unique 約束,多行不能在同一列中具備相同的值。
PRIMARY KEY:主鍵約束是 NOT NULL 約束和 UNIQUE 約束的組合,其禁止多行在同一列中具備相同的值。
BTREE | CPBTREE:指定索引類型。當列的數據類型爲字符串、二進制字符串、十進制數或者約束是一個組合鍵,或非惟一鍵,默認的索引類型爲 PBTREE,
不然使用 BTREE。爲了使用 B+-樹索引,必須使用 BTREE 關鍵字;對於 CPB+-樹索引,需使用 CPBTREE 關鍵字。B+-樹是維護排序後的數據進行高效的插入、刪除和搜索記錄的樹。CPB+-樹表示壓縮前綴 B+-樹,是基於 pkB-tree 樹。 CPB+樹是一個很是小的索引,由於它使用「部分鍵」,只是索引節點所有鍵的一部分。對於更大的鍵, CPB+-樹展示出比 B+-樹更好的性能。若是省略了索引類型, SAP HANA 數據庫將考慮列的數據類型選擇合適的索引。
<table_constraint> ::= UNIQUE [BTREE | CPBTREE]| PRIMARY KEY [BTREE | CPBTREE]
定義了表約束可使用在表的一列或者多列上。
<like_table_clause> ::= LIKE <table_name>
建立與 like_table_name 定義相同的表。表中全部列的定義和默認值拷貝自 like_table_name。當提供了可選項 WITH DATA,數據將從指定的表填充,不過,默認值爲 WITH NO DATA。
<as_table_subquery> ::= AS '(<subquery>)
建立表而且用<subquery>計算的數據填充。使用該子句只拷貝 NOT NULL 約束。若是指定了column_names,該指定的 column_names 將覆蓋<subquery>中的列名。WITH [NO] DATA 指定數據拷貝自<subquery> 或 <like_table_clause>。
<logging_option> ::= LOGGING| NO LOGGING [RETENTION <retention_period>]
<retention_period> ::= <unsigned_integer>
LOGGING | NO LOGGING:LOGGING (默認值)指定激活記錄表日誌。NO LOGGING 指定停用記錄表日誌。一張 NO LOGGING 表意味表定義是持久的且全局可見的,數據則爲臨時和全局的。
RETENTION:指定以秒爲單位,NO LOGGING 列式表的保留時間。在指定的保留期限已過,若是使用物理內存的主機達到 80%,上述表將被刪除。
<auto_merge_option> ::= AUTO MERGE | NO AUTO MERGE
AUTO MERGE | NO AUTO MERGE:AUTO MERGE (默認值)指定觸發自動增量合併。
<partition_clause> ::= PARTITION BY <hash_partition> [, <range_partition> | , <hash_partition>]| PARTITION BY <range_partition>| PARTITION BY <roundrobin_partition>
[,<range_partition>]
<hash_partition> ::= HASH (<partition_expression> [, ...]) PARTITIONS {<num_partitions> |GET_NUM_SERVERS()}
<range_partition> ::= RANGE (<partition_expression>) (<range_spec>, ...)
<roundrobin_partition> ::= ROUNDROBIN PARTITIONS {<num_partitions> | GET_NUM_SERVERS()} [,<range_partition>]
<range_spec> ::= {<from_to_spec> | <single_spec>} [, ...] [, PARTITION OTHERS]
<from_to_spec> ::= PARTITION <lower_value> <= VALUES < <upper_value>
<single_spec> ::= PARTITION VALUE <target_value>
<lower_value> ::= <string_literal> | <numeric_literal>
<upper_value> ::= <string_literal> | <numeric_literal>
<target_value> ::= <string_literal> | <numeric_literal>
<partition_expression> ::= <column_name> | YEAR(<column_name>) | MONTH(<column_name>)
<num_partitions> ::= <unsigned_integer>
GET_NUM_SERVERS()函數返回服務器數量。
PARTITION OTHERS 表示分區定義中未指定的其他值成爲一個分區。
肯定分區建立所在的索引服務器是可能的。若是你指定了 LOCATION,在這些實例中循環建立分區。列表中的重複項將被移除。若是你在分區定義中精確指定實例數爲分區數,則每一個分區將分配至列表中各自實例。全部索引列表中的服務器必須屬於同一個實例。若是指定了 no location,將隨機建立分區。若是分區數與服務器數匹配-例如使用
GET_NUM_SERVERS()-能夠確保多個 CREATE TABLE 調用以一樣的方式分配分區。對於多級別分區的狀況,其適用於第一級的分區數。這個機制是頗有用的,若是建立彼此語義相關的多張表。
<location_clause> ::= AT [LOCATION] {'<host>:<port>' | ('<host>:<port>', ...)}
AT LOCATION:表能夠建立在 host:port 指定的位置,位置列表能夠在建立分配至多個實例的分區表時定義。當位置列表沒有提供<partition_clause>,表將建立至指定的第一個位置中。若是沒有提供位置信息,表將自動分配到一個節點中。此選項可用於在分佈式環境中的行存儲和列存儲表
描述:
CREATE TABLE 建立一張表。表中未填充數據,除了當<as_table_subquery> 或 <like_table_clause>和WITH DATA 可選項一塊兒使用。
例子:
建立了表 A,整數列 A 和 B。列 A 具備主鍵約束。
CREATETABLE A (A INTPRIMARYKEY, B INT);
建立了分區表 P1,日期列 U。列 U 具備主鍵約束而且做爲 RANGE 分區列使用。
CREATECOLUMNTABLE P1 (U DATEPRIMARYKEY) PARTITIONBY RANGE (U) (PARTITION'2010-02-03'<= VALUES < '2011-01-01', PARTITIONVALUE = '2011-05-01');
建立了分區表 P2,整數列 I,J 和 K。列 I,J 組成鍵約束,而且做爲哈希分區列使用。列 K 則爲子哈希分區列。
CREATECOLUMNTABLE P2 (I INT, J INT, K INT, PRIMARYKEY(I, J)) PARTITIONBY HASH (I, J) PARTITIONS 2, HASH (K) PARTITIONS 2;
建立表 C1,與表 A 的定義相同,記錄也相同。
CREATECOLUMNTABLE C1 LIKE A WITH DATA;
建立表 C2,與表 A 的列數據類型和 NOT NULL 約束相同。表 C2 沒有任何數據。
CREATETABLE C2 AS (SELECT * FROM A) WITHNO DATA;
語法:
CREATE TRIGGER <trigger_name> <trigger_action_time> <trigger_event> ON <subject_table_name> [REFERENCING <transition_list>][<for_each_row>]
BEGIN
[<trigger_decl_list>]
[<proc_handler_list>]
<trigger_stmt_list>
END
語法元素:
<trigger_name> ::= <identifier> 你建立的觸發器名稱。
<subject_table_name> ::= <identifier> 你建立的觸發器所在表的名稱。
<trigger_action_time> ::= BEFORE | AFTER 指定觸發動做發生的 時間。
BEFORE:操做主題表以前執行觸發。
AFTER:操做主題表以後執行觸發。
<trigger_event> ::= INSERT | DELETE | UPDATE 定義激活觸發器活動的數據修改命令
<transition_list> ::= <transition> | <transition_list> , <transition>
<transition> ::= <trigger_transition_old_or_new> <trigger_transition_var_or_table> <trans_var_name>|<trigger_transition_old_or_new> <trigger_transition_var_or_table> AS <trans_var_name>
當聲明瞭 觸發器轉變變量,觸發器能夠訪問 DML 正在修改的記錄。
當執行了行級別觸發器, <trans_var_name>.<column_name>表明觸發器正在修改的記錄的相應列。
這裏, <column_name>爲主題表的列名。參見轉換變量的例子。
<trigger_transition_old_or_new> ::= OLD | NEW
<trigger_transition_var_or_table> ::= ROW
OLD
你能夠訪問觸發器 DML 的舊記錄,取而代之的是更新的舊記錄或刪除的舊記錄。
UPDATE 觸發器和 DELETE 觸發器能夠有 OLD ROW 事務變量。
NEW
你能夠訪問觸發器 DML 的新記錄,取而代之的是插入的新記錄或更新的新記錄。
UPDATE 觸發器和 DELETE 觸發器能夠有 NEW ROW 事務變量。
只支持事務變量。
事務表不被支持。
若是你將’TABLE’做爲<trigger_transition_var_or_table>,你將看到不支持功能錯誤。
<for_each_row> ::= FOR EACH ROW
觸發器將以逐行方式調用。
默認模式爲執行行級別觸發器,沒有 FOR EACH ROW 語法。
目前,逐語句觸發不被支持。
<trigger_decl_list> ::= DECLARE <trigger_decl>| <trigger_decl_list> DECLARE <trigger_decl>
<trigger_decl> ::= <trigger_var_decl> | <trigger_condition_decl>
<trigger_var_decl> ::= <var_name> CONSTANT <data_type> [<not_null>] [<trigger_default_assign>] ;| <var_name> <data_type> [NOT NULL] [<trigger_default_assign>] ;
<data_type> ::= DATE | TIME | SECONDDATE | TIMESTAMP | TINYINT | SMALLINT | INTEGER| BIGINT |SMALLDECIMAL | DECIMAL | REAL | DOUBLE| VARCHAR | NVARCHAR | ALPHANUM | SHORTTEXT|VARBINARY | BLOB | CLOB| NCLOB | TEXT
<trigger_default_assign> ::= DEFAULT <expression>| := <expression>
<trigger_condition_decl> ::= <condition_name> CONDITION ;| <condition_name> CONDITION FOR <sql_error_code> ;
<sql_error_code> ::= SQL_ERROR_CODE <int_const>
trigger_decl_list
你能夠聲明觸發器變量或者條件。
聲明的變量能夠在標量賦值中使用或者在 SQL 語句觸發中引用。
聲明的條件名能夠在異常處理中引用。
CONSTANT
當指定了 CONSTANT 關鍵字,你不能夠在觸發器執行時修改變量。
<proc_handler_list> ::= <proc_handler>| <proc_handler_list> <proc_handler>
<proc_handler> ::= DECLARE EXIT HANDLER FOR <proc_condition_value_list> <trigger_stmt>
<proc_condition_value_list> ::= <proc_condition_value>| <proc_condition_value_list> , <proc_condition_value>
<proc_condition_value> ::= SQLEXCEPTION
| SQLWARNING
| <sql_error_code>
| <condition_name>
異常處理能夠聲明捕捉已存的 SQL 異常,特定的錯誤代碼或者條件變量聲明的條件名稱。
<trigger_stmt_list> ::= <trigger_stmt>| <trigger_stmt_list> <trigger_stmt>
<trigger_stmt> ::= <proc_block>
| <proc_assign>
| <proc_if>
| <proc_loop>
| <proc_while>
| <proc_for>
| <proc_foreach>
| <proc_signal>
| <proc_resignal>
| <trigger_sql>
觸發器主體的語法是過程體的語法的一部分。
參見 SAP HANA Database SQLScript guide 中的 create procedure 定義。
觸發器主體的語法遵循過程體的語法,即嵌套塊(proc_block),標量變量分配(proc_assign), if 塊
(proc_if),, loop 塊(proc_loop), for 塊(proc_for), for each 塊(proc_foreach), exception
signal(proc_signal), exception resignal(proc_resignal),和 sql 語句(proc_sql)。
<proc_block> ::= BEGIN
[<trigger_decl_list>]
[<proc_handler_list>]
<trigger_stmt_list>
END ;
你能夠以嵌套方式添加另外的'BEGIN ... END;'塊。
<proc_assign> ::= <var_name> := <expression> ;
var_name 爲變量名,應該事先聲明。
<proc_if> ::= IF <condition> THEN <trigger_stmt_list>
[<proc_elsif_list>]
[<proc_else>]
END IF ;
<proc_elsif_list> ::= ELSEIF <condition> THEN <trigger_stmt_list>
<proc_else> ::= ELSE <trigger_stmt_list>
關於 condition 的說明,參見 SELECT 的<condition>。
你可使用 IF ... THEN ... ELSEIF... END IF 控制執行流程與條件。
<proc_loop> ::= LOOP <trigger_stmt_list> END LOOP ;
<proc_while> ::= WHILE <condition> DO <trigger_stmt_list> END WHILE ;
<proc_for> ::= FOR <column_name> IN [<reverse>] <expression> <DDOT_OP> <expression>
DO <trigger_stmt_list>
END FOR ;
<column_name> ::= <identifier>
<reverse> ::= REVERSE
<DDOT_OP> ::= ..
<proc_foreach> ::= FOR <column_name> AS <column_name> [<open_param_list>] DO
<trigger_stmt_list>
END FOR ;
<open_param_list> ::= ( <expr_list> )
<expr_list> ::= <expression> | <expr_list> , <expression>
<proc_signal> ::= SIGNAL <signal_value> [<set_signal_info>] ;
<proc_resignal> ::= RESIGNAL [<signal_value>] [<set_signal_info>] ;
<signal_value> ::= <signal_name> | <sql_error_code>
<signal_name> ::= <identifier>
<set_signal_info> ::= SET MESSEGE_TEXT = '<message_string>'
<message_string> ::= <identifier>
SET MESSEGE_TEXT
若是你爲本身的消息設置 SET MESSEGE_TEXT,當觸發器執行時指定的錯誤被拋出,消息傳遞給用
戶。
SIGNAL 語句顯式拋出一個異常。
用戶定義的範圍( 10000〜19999)將被容許發行錯誤代碼。
RESIGNAL 語句在異常處理中對活動語句拋出異常。
若是沒有指定錯誤代碼, RESIGNAL 將拋出已捕捉的異常。
<trigger_sql> ::= <select_into_stmt>
| <insert_stmt>
| <delete_stmt>
| <update_stmt>
| <replace_stmt>
| <upsert_stmt>
對於 insert_stmt 的詳情,參見 INSERT。
對於 delete_stmt 的詳情,參見 DELETE。
對於 update_stmt 的詳情,參見 UPDATE。
對於 replace_stmt 和 upsert_stmt 的詳情,參見 REPLACE | UPSERT。
<select_into_stmt> ::= SELECT <select_list> INTO <var_name_list>
<from_clause >
[<where_clause>]
[<group_by_clause>]
[<having_clause>]
[{<set_operator> <subquery>, ... }]
[<order_by_clause>]
[<limit>]
<var_name_list> ::= <var_name> | <var_name_list> , <var_name>
<var_name> ::= <identifier>
關於 select_list, from_clause, where_clause, group_by_clause, having_clause,set_operator, subquery,
order_by_clause, limit 的詳情,參見 SELECT。
var_name 是預先聲明的標量變量名。
你能夠分配選中項至標量變量中。
描述:
CREATE TRIGGER 語句建立觸發器。
觸發器是一種特殊的存儲過程,在對錶發生事件時自動執行。
CREATE TRIGGER 命令定義一組語句,當給定操做(INSERT/UPDATE/DELETE)發生在給定對象(主題表)
上執行。
只有對於給定的<subject_table_name>擁有 TRIGGER 權限的數據庫用戶容許建立表的觸發器。
當前觸發器限制描述以下:
l不支持 INSTEAD_OF 觸發器。
l訪問觸發器定義的主題表在觸發器主體中是不容許的,這表明對於觸發器所在的表的任何
insert/update/delete/replace/select
l只支持行級別觸發器,不支持語句級別觸發器。行級別觸發器表示觸發活動只有在每次行改
變時執行。語句級別觸發器表明觸發活動在每次語句執行時運行。語法'FOR EACH ROW’表示
行式執行觸發,爲默認模式;即時沒有指定'FOR EACH ROW’,仍然爲行級別觸發器。
l不支持事務表(OLD/NEW TABLE)。當觸發 SQL 語句想要引用正在被觸發器觸發事件如
insert/update/delete 修改的數據,事務變量/表將是觸發器主體中 SQL 語句訪問新數據和舊數
據的方式。事務變量只在行級別觸發器中使用,而事務表則在語句級別觸發器中使用。
l不支持從節點到多個主機或表中的分區表上執行觸發器。
l表只能爲每一個 DML 操做有一個觸發器,多是插入觸發器、更新觸發器和刪除觸發器,而且
它們三個能夠一塊兒激活。
所以,一張表總共最多有三個觸發器。
l不支持的觸發器動做(而存儲過程支持):
resultset assignment(select resultset assignment to tabletype),
exit/continue command(execution flow control),
cursor open/fetch/close(get each record data of search result by cursor and access record in loop),
procedure call(call another proecedure),
dynomic sql execution(build SQL statements dynamically at runtime of SQLScript),
return(end SQL statement execution)
系統和監控視圖:
TRIGGER 爲觸發器的系統視圖:
系統視圖 TRIGGER 顯示:
SCHEMA_NAME, TRIGGER_NAME, TRIGGER_OID, OWNER_NAME,
OWNER_OID,SUBJECT_TABLE_SCHEMA,SUBJECT_TABLE_NAME, TRIGGER_ACTION_TIME,
TRIGGER_EVENT, TRIGGERED_ACTION_LEVEL,DEFINITION
例子:
你先須要觸發器定義的表:
CREATETABLE TARGET ( A INT);
你也須要表觸發訪問和修改:
CREATETABLE SAMPLE ( A INT);
如下爲建立觸發器的例子:
CREATE TRIGGER TEST_TRIGGER AFTERINSERTON TARGET FOR EACH ROW
BEGIN
DECLARE SAMPLE_COUNT INT;
SELECTCOUNT(*) INTO SAMPLE_COUNT FROM SAMPLE;
IF :SAMPLE_COUNT = 0 THEN
INSERTINTO SAMPLE VALUES(5);
ELSEIF :SAMPLE_COUNT = 1 THEN
INSERTINTO SAMPLE VALUES(6);
ENDIF;
END;
觸發器 TEST_TRIGGER 將在任意記錄插入至 TARGET 表後執行。因爲在第一次插入中,表 SAMPLE 記錄數爲 0,觸發器 TEST_TRIGGER 將插入 5 至表中。
在第二次插入 TARGET 表時,觸發器插入 6,由於其計數爲 1。
INSERTINTO TARGET VALUES (1);
SELECT * FROM SAMPLE;--5
INSERTINTO TARGET VALUES (2);
SELECT * FROM SAMPLE;--5 6
語法:
CREATE VIEW [<schema_name>.]<view_name> [(<column_name>, ... )] AS <subquery>
描述:
CREATE VIEW 能夠有效地根據 SQL 結果建立虛擬表,這不是真正意義上的表,由於它自己不包含數據。
當列名一塊兒做爲視圖的名稱,查詢結果將以列名顯示。若是列名被省略,查詢結果自動給出一個適當的列名。列名的數目必須與從<subquery>返回的列數目相同。
支持視圖的更新操做,若是知足如下條件:
視圖中的每一列必須映射到單個表中的一列。
若是基表中的一列有 NOT NULL 約束,且沒有默認值,該列必須包含在可插入視圖的列中。更新操做沒有該條件。
例如在 SELECT 列表,必須不包含聚合或分析的功能,如下是不容許的:
. 在 SELECT 列表中的 TOP, SET, DISTINCT 操做
. GROUP BY, ORDER BY 子句
在 SELECT 列表中必須不能含有子查詢。
必須不能包含序列值(CURRVAL, NEXTVAL)。
必須不能包含做爲基視圖的列視圖。
若是基視圖或表是可更新的,符合上述條件的基礎上,基視圖或表的視圖是可更新的。
例子:
選擇表 a 中的全部數據建立視圖 v:
CREATEVIEW v ASSELECT * FROM a;
語法:
DROP AUDIT POLICY <policy_name>
描述:
DROP AUDIT POLICY 語句刪除審計策略。 <policy_name>必須指定已存在的審計策略。
只有擁有系統權限 AUDIT ADMIN 的數據庫用戶容許刪除審計策略。每一個擁有該權限的數據庫用戶能夠刪除任意的審計策略,不管是否由該用戶建立。
即便審計策略被刪除了,可能發生的是,定義在已刪除的審計策略中的活動將被進一步審計;若是也啓用了其餘審計策略和定義了審計活動。
暫時關閉審計策略時,能夠禁用而不用刪除。
系統和監控視圖:
AUDIT_POLICY:顯示全部審計策略和狀態。
M_INIFILE_CONTENTS:顯示數據庫系統配置參數。
只有擁有系統權限 CATALOG READ, DATA ADMIN 或 INIFILE ADMIN 的用戶能夠查看M_INIFILE_CONTENTS 視圖中的內容,對於其餘用戶則爲空。
例子:
假設使用以下語句前,審計策略已建立:
CREATEAUDIT POLICY priv_audit AUDITING SUCCESSFUL GRANT PRIVILEGE, REVOKE PRIVILEGE, GRANT ROLE, REVOKE ROLE LEVEL CRITICAL;
如今,該審計策略必須刪除:
DROPAUDIT POLICY priv_audit;
語法:
DROP FULLTEXT INDEX <fulltext_index_name>
描述:
DROP FULLTEXT INDEX 語句移除全文索引。
例子:
DROP FULLTEXT INDEX idx;
語法:
DROP INDEX <index_name>
描述:
DROP INDEX 語句移除索引。
例子:
DROPINDEX idx;
語法:
DROP SCHEMA <schema_name> [<drop_option>]
語法元素:
<drop_option> ::= CASCADE | RESTRICT
Default = RESTRICT
有限制的刪除操做將刪除對象當其沒有依賴對象時。若是存在依賴對象,將拋出錯誤。
CASCADE級聯刪除:將刪除對象以及其依賴對象。
描述:
DROP SCHEMA 語句移除schema。
例子:
建立集合 my_schema,表 my_schema.t,而後 my_schema 將使用 CASCADE 選項刪除。
CREATESCHEMA my_schema;
CREATETABLE my_schema.t (a INT);
DROPSCHEMA my_schema CASCADE;
語法:
DROP SEQUENCE <sequence_name> [<drop_option>]
語法元素:
<drop_option> ::= CASCADE | RESTRICT
Default = RESTRICT
級聯刪除將刪除對象以及其依賴對象。當未指定 CASCADE 可選項,將執行非級聯刪除對象,不會刪除依賴對象,而是使依賴對象 (VIEW, PROCEDURE) 無效。
無效的對象能夠從新驗證當一個對象有一樣的集合,而且已建立了對象名。對象 ID,集合名以及對象名爲從新驗證依賴對象而保留。
有限制的刪除操做將刪除對象當其沒有依賴對象時。若是存在依賴對象,將拋出錯誤。
描述:
DROP SEQUENCE 語句移除序列。
例子:
DROPSEQUENCE s;
語法:
DROP [PUBLIC] SYNONYM <synonym_name> [<drop_option>]
語法元素:
<drop_option> ::= CASCADE | RESTRICT
Default = RESTRICT
級聯刪除將刪除對象以及其依賴對象。當未指定 CASCADE 可選項,將執行非級聯刪除操做,不會刪除依賴對象,而是使依賴對象 (VIEW, PROCEDURE) 無效。
無效的對象能夠從新驗證當一個對象有一樣的集合,而且已建立了對象名。對象 ID,集合名以及對象名爲從新驗證依賴對象而保留。
有限制的刪除操做將刪除對象當其沒有依賴對象時。若是存在依賴對象,將拋出錯誤。
描述:
DROP SYNONYM 刪除同義詞。可選項 PUBLIC 容許刪除公用同義詞。
例子:
表 a 已建立,而後爲表 a 建立同義詞 a_synonym 和公用同義詞 pa_synonym:
CREATETABLE a (c INT);
CREATESYNONYM a_synonym FOR a;
CREATEPUBLICSYNONYM pa_synonym FOR a;
刪除同義詞 a_synonym 和公用同義詞 pa_synonym
DROPSYNONYM a_synonym;
DROPPUBLICSYNONYM pa_synonym;
語法:
DROP TABLE [<schema_name>.]<table_name> [<drop_option>]
語法元素:
<drop_option> ::= CASCADE | RESTRICT
Default = RESTRICT
級聯刪除將刪除對象以及其依賴對象。當未指定 CASCADE 可選項,將執行非級聯刪除操做,不會刪除依賴對象,而是使依賴對象 (VIEW, PROCEDURE) 無效。
無效的對象能夠從新驗證當一個對象有一樣的集合,而且已建立了對象名。對象 ID,集合名以及對象名爲從新驗證依賴對象而保留。
有限制的刪除操做將刪除對象當其沒有依賴對象時。若是存在依賴對象,將拋出錯誤。
描述:
DROP TABLE 語句刪除表。
例子:
建立表 A,而後刪除。
CREATETABLE A(C INT);
DROPTABLE A;
DROP TRIGGER <trigger_name>
描述:
DROP TRIGGER 語句刪除一個觸發器。
只有在觸發器所做用表上有 TRIGGER 權限的數據庫用戶才容許刪除該表的觸發器。
例子:
對於這個例子,你須要先建立一個名爲 test_trigger 的觸發器,以下:
CREATETABLE TARGET ( A INT);
CREATETABLE SAMPLE ( A INT);
CREATE TRIGGER TEST_TRIGGER AFTERUPDATEON TARGET
BEGIN
INSERTINTO SAMPLE VALUES(3);
END;
如今你能夠刪除觸發器:
DROP TRIGGER TEST_TRIGGER;
語法:
DROP VIEW [<schema_name>.]<view_name> [<drop_option>]
語法元素:
<drop_option> ::= CASCADE | RESTRICT
Default = RESTRICT
級聯刪除將刪除對象以及其依賴對象。當未指定 CASCADE 可選項,將執行非級聯刪除操做,不會刪除依賴對象,而是使依賴對象 (VIEW, PROCEDURE) 無效。
無效的對象能夠從新驗證當一個對象有一樣的集合,而且已建立了對象名。對象 ID,集合名以及對象名爲從新驗證依賴對象而保留。
有限制的刪除操做將刪除對象當其沒有依賴對象時。若是存在依賴對象,將拋出錯誤。
描述:
DROP VIEW 語句刪除視圖。
例子:
表 t 已建立,而後選擇表 a 中的全部數據建立視圖 v:
CREATETABLE t (a INT);
CREATEVIEW v ASSELECT * FROM t;
刪除視圖 v:
DROPVIEW v;
語法:
RENAME COLUMN <table_name>.<old_column_name> TO <new_column_name>
描述:
RENAME COLUMN 語句修改列名:
例子:
建立表 B:
CREATETABLE B (A INTPRIMARYKEY, B INT);
顯示錶 B 中列名的列表:
SELECT COLUMN_NAME, POSITION FROM TABLE_COLUMNS WHERE SCHEMA_NAME =CURRENT_SCHEMA AND TABLE_NAME = 'B'ORDERBYPOSITION;
列 A 重名爲 C:
RENAMECOLUMN B.A TO C;
語法:
RENAME INDEX <old_index_name> TO <new_index_name>
描述:
RENAME INDEX 語句重命名索引名。
例子:
表 B 已建立,而後索引 idx 創建在表 B 的列 B:
CREATETABLE B (A INTPRIMARYKEY, B INT);
CREATEINDEX idx on B(B);
顯示錶 B 的索引名列表:
SELECT INDEX_NAME FROM INDEXES WHERE SCHEMA_NAME = CURRENT_SCHEMA AND TABLE_NAME='B';
索引 idx 重名爲 new_idx:
RENAMEINDEX idx TO new_idx;
語法:
RENAME TABLE <old_table_name> TO <new_table_name>
描述:
RENAME TABLE 語句在同一個Schema下,將表名修改成 new_table_name。
例子:
在當前集合建立表 A:
CREATETABLE A (A INTPRIMARYKEY, B INT);
顯示當前集合下表名的列表:
SELECT TABLE_NAME FROM TABLES WHERE SCHEMA_NAME = CURRENT_SCHEMA;
表 A 重命名爲 B:
RENAMETABLE A TO B;
SCHEMA mySchema 已建立,而後建立表 mySchema.A:
CREATESCHEMA mySchema;
CREATETABLE mySchema.A (A INTPRIMARYKEY, B INT);
顯示模式 mySchema 下表名的列表:
SELECT TABLE_NAME FROM TABLES WHERE SCHEMA_NAME = 'MYSCHEMA';
表 mySchema.A 重命名爲 B:
RENAMETABLE mySchema.A TO B;注:修改後B仍是在mySchema裏
語法:
<table_conversion_clause> ::= [ALTER TYPE] { ROW [THREADS <number_of_threads>] | COLUMN [THREADS <number_of_threads> [BATCH <batch_size>]] }
語法元素:
<number_of_threads> ::= <numeric_literal>
指定進行錶轉換的並行線程數。線程數目的最佳值應設置爲可用的 CPU 內核的數量。
<batch_size> ::= <numeric_literal>
指定批插入的行數,默認值爲最佳值 2,000,000。插入表操做在每一個<batch_size>記錄插入後當即提交,能夠減小內存消耗。 BATCH 可選項只能夠在表 從行轉換爲列時使用。然而,大於 2,000,000的批大小可能致使高內存消耗,所以不建議修改該值。
描述:
經過複製現有的表中的列和數據,能夠從現有的表建立一個不一樣存儲類型的新表。該命令用來把表從行轉換爲列或從列轉換爲行。若是源表是行式存儲,則新建的表爲列式存儲。
配置參數:
用於錶轉換的默認線程數在 indexserver.ini 的[sql]部分定義, table_conversion_parallelism =<numeric_literal> (初始值爲 8)。
例子:
對於這個例子,你須要先建立欲進行轉換的表:
CREATECOLUMNTABLE col_to_row (col1 INT, col2 INT)
CREATEROWTABLE row_to_col (col1 INT, col2 INT)
表 col_to_row 將以列式存儲方式建立,表 row_to_col 則爲行式存儲。
如今你能夠將表 col_to_row 的存儲類型從列轉爲行:
ALTERTABLE col_to_row ALTERTYPEROW
你也能夠將表 row_to_col 的存儲類型從行轉爲列:
ALTERTABLE row_to_col ALTERTYPECOLUMN
爲了使用批量轉換模式,你須要在語句結尾處添加批選項:
ALTERTABLE row_to_col ALTERTYPECOLUMN BATCH 10000
語法:
TRUNCATE TABLE <table_name>
描述:
刪除表中全部記錄。當從表中刪除全部數據時, TRUNCATE 比 DELETE FROM 快,可是 TRUNCATE沒法回滾。要回滾刪除的記錄,應使用"DELETE FROM <table_name>"。
HISTORY 表能夠經過執行該語句像正常表同樣刪除。歷史表的全部部分(main, delta, history main and history delta)將被刪除而且內容會丟失。
語法:
DELETE [HISTORY] FROM [<schema_name>.]<table_name> [WHERE <condition>]
<condition> ::= <condition> OR <condition>| <condition> AND <condition>| NOT <condition>| ( <condition> )| <predicate>
關於謂詞的詳情,請參閱 Predicates。
描述:
DELETE 語句當知足條件時,從表中刪除全部記錄。若是省略了 WHERE 子句,將刪除表中全部記錄。
DELETE HISTORY
DELETE HISTORY 將標記選中的歷史表中歷史記錄進行刪除。這表示執行完該語句後,引用已刪除記錄的時間旅行查詢語句可能仍然能夠查看這些數據。 爲了在物理上刪除這些記錄,必須執行下面的語句:
ALTER SYSTEM RECLAIM VERSION SPACE; MERGE HISTORY DELTA of <table_name>;
請注意:在某些狀況中,即便執行了上述兩條語句,仍沒法從物理上刪除。
欲檢查記錄是否已從物理上刪除,如下語句會有幫助:
SELECT * FROM <table_name> WHERE <condition> WITH PARAMETERS ('REQUEST_FLAGS'=('ALLCOMMITTED','HISTORYONLY'));
注意: 「WITH PARAMETERS ('REQUEST_FLAGS'= ('ALLCOMMITTED','HISTORYONLY'))」子句可能只適用於驗證 DELETE HISTORY 語句的執行結果。
例子:
CREATETABLE T (KEYINTPRIMARYKEY, VAL INT);
INSERTINTO T VALUES (1, 1);
INSERTINTO T VALUES (2, 2);
INSERTINTO T VALUES (3, 3);
在下面的例子中,將刪除一條記錄:
DELETEFROM T WHEREKEY = 1;
語法:
EXPLAIN PLAN [SET STATEMENT_NAME = <statement_name>] FOR <sql_subquery>
語法元素:
<statement_name> ::= string literal used to identify the name of a specific executi on plan in the output table for a given SQL statement.
若是未指定 SET STATEMENT_NAME,則將設爲 NULL。
描述:
EXPLAIN PLAN 語句用來評估 SAP HANA 數據庫遵循的執行 SQL 語句的執行計劃。評估的結果存在視圖 EXPLAIN_PLAN_TABLE,以便稍後的用戶檢查。
SQL 語句必須是數據操縱語句,所以Schema定義語句不能在 EXPLAIN STATEMENT 中使用。
你能夠從 EXPLAIN_PLAN_TABLE 視圖中獲得 SQL 計劃,該視圖爲全部用戶共享。這裏是從視圖讀取 SQL 計劃的例子:
SELECT * FROM EXPLAIN_PLAN_TABLE;
EXPLAIN_PLAN_TABLE 視圖中的列:表 1:列名和描述
EXPLAIN_PLAN_TABLE 視圖中的 OPERATOR_NAME 列。 表 2: OPERATOR_NAME 列顯示的列式引擎操做符列表:
COLUMN SEARCH 爲列式引擎操做符起始位置標記, ROW SEARCH 爲行式引擎操做符起始位置標記。在如下的例子中, COLUMN SEARCH (ID 10)生成的中間結果被 ROW SEARCH (ID 7)使用, ROWSEARCH (ID 7) 被另外一個 COLUMN SEARCH (ID 1)使用。位於 COLUMN SEARCH (ID 10) 最底層的操做符解釋了 COLUMN SEARCH (ID 10) 是如何執行的。 ROW SEARCH (ID 7) 和 COLUMN SEARCH (ID 10) 之間的操做符說明了 ROW SEARCH (ID 7) 如何處理由 COLUMN SEARCH (ID 10) 生成的中間結果。位於COLUMN SEARCH (ID 1) 和 ROW SEARCH (ID 7)頂層的操做符解釋了頂層 COLUMN SEARCH (ID 1) 是如何處理由 ROW SEARCH (ID 7)生成的中間結果。
SQL 計劃解釋例子。
該語句來自語 TPC-H 基準。例子中的全部表都是行式存儲。
setschema hana_tpch;
DELETEFROM explain_plan_table WHERE statement_name = 'TPC-H Q10';
EXPLAINPLANSET STATEMENT_NAME = 'TPC-H Q10'FOR
SELECT TOP 20 c_custkey,c_name,SUM(l_extendedprice * (1 - l_discount)) AS revenue,
c_acctbal,
n_name,
c_address,
c_phone,
c_comment
FROM
customer,
orders ,
lineitem,
nation
WHERE
c_custkey = o_custkey
AND l_orderkey = o_orderkey
AND o_orderdate >= '1993-10-01'
AND o_orderdate < ADD_MONTHS('1993-10-01',3)
AND l_returnflag = 'R'
AND c_nationkey = n_nationkey
GROUPBY
c_custkey,
c_name,
c_acctbal ,
c_phone,
n_name,
c_address ,
c_comment
ORDERBY revenue DESC;
SELECT operator_name, operator_details , table_name FROM explain_plan_table WHERE statement_name = 'TPC-H Q10';
如下是對這個查詢語句的計劃解釋:
語法:
INSERT INTO [ <schema_name>. ]<table_name> [ <column_list_clause> ] { <value_list_clause> | <subquery> }
語法元素:
<column_list_clause> ::= ( <column_name>, ... )
<value_list_clause> ::= VALUES ( <expression>, ... )
描述:
INSERT 語句添加一條到表中。返回記錄的子查詢能夠用來插入表中。若是子查詢沒有返回任何結果,數據庫將不會插入任何記錄。可使用 INSERT 語句指定列的列表。不在列表中的列將顯示默認值。若是省略了列的列表,數據庫插入全部記錄到表中。
例子:
CREATETABLE T (KEYINTPRIMARYKEY, VAL1 INT, VAL2 NVARCHAR(20));
在如下的例子中,你能夠插入值:
INSERTINTO T VALUES (1, 1, 'The first');
你能夠將值插入到指定的列:
INSERTINTO T (KEY) VALUES (2);
你也可使用子查詢:
INSERTINTO T SELECT 3, 3, 'The third'FROM DUMMY;
語法:
LOAD <table_name> {DELTA | ALL | (<column_name>, ...)}
描述:
LOAD 語句明確地加載列式(注:Load只支持列式存儲,對於行式存儲不能使用)存儲表的數據至內存中,而非第一次訪問時加載。
DELTA
使用 DELTA,列式表的一部分將加載至內存。因爲列式存儲對於讀操做作了優化和壓縮,增量用來優化插入或更新。 全部的插入被傳遞給一個增量。
ALL
主要的和增量的列存儲表中全部數據加載到內存中。
例子:
如下的例子加載整張表 a_table 至內存中。
LOAD a_table all;
如下的例子加載列 a_column 和表 a_table 列 another_column 至內存中。
LOAD a_table (a_column,another_column);
表加載狀態能夠查詢:
select loaded from m_cs_tables where table_name = '<table_name>'
語法:
MERGE [HISTORY] DELTA OF [<schema_name>.]<table_name> [PART n] [WITH PARAMETERS (<parameter_key_value>, ...)]
語法元素:
WITH PARAMETERS (<parameter_list>):
<parameter_list> ::= <parameter>,<parameter_list>
<parameter> ::= <parameter_name> = <parameter_setting>
<parameter_name> ::= 'SMART_MERGE' | 'MEMORY_MERGE'
<parameter_setting> ::= 'ON' | 'OFF'
當前參數: 'SMART_MERGE' = 'ON' | 'OFF'。當 SMART_MERGE 爲 ON,數據庫執行智能合併,這表明數據庫基於 Indexserver 配置中定義的合併條件來決定是否合併。'MEMORY_MERGE' = 'ON' | 'OFF' 數據庫只合並內存中表的增量部分,不會被持久化。
描述:
使用 DELTA,列式表的一部分將加載至內存。因爲列式存儲對於讀操做作了優化和壓縮,增量用來優化插入或更新。 全部的插入被傳遞至一個增量部分。
HISTORY 能夠指定合併歷史表增量部分到臨時表的主要歷史部分。
PART-能夠指定合併歷史表增量部分到臨時表的主要歷史部分,該表已分區。
例子:
MERGEDELTAOF A;
Merges the column store table delta part to its main part.
MERGEDELTAOF A WITH PARAMETERS('SMART_MERGE' = 'ON');
Smart merges the column store table delta part to its main part.
MERGEDELTAOF A WITH PARAMETERS('SMART_MERGE' = 'ON', 'MEMORY_MERGE' = 'ON');
Smart merges the column store table delta part to its main part non-persistent, in memory only.
MERGEDELTAOF A PART 1;
Merge the delta of partition no. 1 of table with name "A" to main part of partion no. 1.
MERGEHISTORYDELTAOF A;
Merge the history delta part of table with name "A" into its history main part.
MERGEHISTORYDELTAOF A PART 1;
Merges the column store table delta part of the history of table with name "A" to its history main part.
語法:
UPSERT [ <schema_name>. ]<table_name> [ <column_list_clause> ] { <value_list_clause> [ WHERE <condition> | WITH PRIMARY KEY ] | <subquery> }
REPLACE [ <schema_name>. ]<table_name> [ <column_list_clause> ] { <value_list_clause> [ WHERE <condition> | WITH PRIMARY KEY ] | <subquery> }
語法元素:
<column_list_clause> ::= ( <column_name>, ... )
<value_list_clause> ::= VALUES ( <expression>, ... )
<condition> ::= <condition> OR <condition>| <condition> AND <condition>| NOT <condition>| ( <condition> )| <predicate>
有關謂詞的詳情,請參閱 Predicates。
描述:
沒有子查詢的 UPSERT 或者 REPLACE 語句與 UPDATE 類似。惟一的區別是當 WHERE 子句爲假(或沒有Where子句)時,該語句像 INSERT 同樣添加一條新的記錄到表中。
對於表有 PRIMARY KEY 的狀況,主鍵列必須包含在列的列表中。沒有默認設定,由 NOT NULL 定義的列也必須包含在列的列表中。
有子查詢的 UPSERT 或者 REPLACE 語句與 INSERT 同樣,除了若是表中舊記錄與主鍵的新記錄值相同,則舊記錄將被子查詢返回的記錄所修改。除非表有一個主鍵,不然就變得等同於 INSERT(即若是表沒有設定主鍵,則爲INSERT?),由於沒有使用索引來判斷新記錄是否與舊記錄重複。
有'WITH PRIMARY KEY'的 UPSERT 或 REPLACE 語句與有子查詢的語句相同。其在 PRIMARY KEY 基礎上工做。
例子:
CREATETABLE T (KEYINTPRIMARYKEY, VAL INT);
你能夠插入一條新值:
UPSERT T VALUES (1, 1);--沒有Where與子查詢,直接插入
若是 WHERE 子句中的條件爲假,將插入一條新值:
UPSERT T VALUES (2, 2) WHEREKEY = 2; --沒有就插入
你能夠更新列"VAL"的第一條記錄
UPSERT T VALUES (1, 9) WHEREKEY = 1;--有就更新
或者你可使用"WITH PRIMARY KEY" 關鍵字
UPSERT T VALUES (1, 8) WITHPRIMARYKEY;--根據主鍵進行更新,若是不存在,則插入
你可使用子查詢插入值:
UPSERT T SELECTKEY + 2, VAL FROM T;--將子查詢的結果插入,若是存在,則更新
UPSERT T VALUES (5, 1) WITHPRIMARYKEY;--根據主鍵查詢時不存在,則插入
UPSERT T SELECT 5,3 from dummy;--存在,則更新
語法:
<select_statement> ::= <subquery> [ <for_update> | <time_travel> ]| ( <subquery> ) [ <for_update> | <time_travel> ]
<subquery> ::= <select_clause> <from_clause> [<where_clause>] [<group_by_clause>] [<having_clause>] [{<set_operator> <subquery>, ... }] [<order_by_clause>] [<limit>]
語法元素:
SELECT 子句:
SELECT 子句指定要返回給用戶或外部的 select 子句一個輸出,若是存在的話。
<select_clause> ::= SELECT [TOP <integer>] [ ALL | DISTINCT ] <select_list>
<select_list> ::= <select_item>[, ...]
<select_item> ::= [<table_name>.] *| <expression> [ AS <column_alias> ]
TOP n:TOP n 用來返回 SQL 語句的前 n 條記錄。
DISTINCT 和 ALL:可使用 DISTINCT 返回重複的記錄,每一組選擇只有一個副本。使用 ALL 返回選擇的全部記錄,包括全部重複記錄的拷貝。默認值爲 ALL。
Select_list:select_list 容許用戶定義他們想要從表中選擇的列。
*:*能夠從 FROM 子句中列出的表或視圖中選擇全部列。若是集合名和表名或者表名帶有星號(*),其用來限制結果集至指定的表。
column_alias:column_alias 能夠用於簡單地表示表達式。
FROM:FROM 子句中指定輸入值,如表、視圖、以及將在 SELECT 語句中使用的子查詢。
<from_clause> ::= FROM {<table>, ... }
<table> ::= <table_name> [ [AS] <table_alias> ] | <subquery> [ [AS] <table_alias> ] | <joined_table>
<joined_table> ::= <table> [<join_type>] JOIN <table> ON <predicate> | <table> CROSS JOIN <table> | <joined_table>
<join_type> ::= INNER | { LEFT | RIGHT | FULL } [OUTER]
table alias:表別名能夠用來簡單地表示表或者子查詢。
join_type 定義了將執行的聯接類型, LEFT 表示左外聯接, RIGHT 表示右外聯接, FULL 表示全外聯接。執行聯接操做時, OUT 可能或者可能不使用。
ON <predicate>:ON 子句定義聯接謂詞。
CROSS JOIN:CROSS 表示執行交叉聯接,交叉聯接生成兩表的交叉積結果。
WHERE 子句
WHERE 子句用來指定 FROM 子句輸入的謂詞, 使用戶能夠檢索所需的記錄。
<where_clause> ::= WHERE <condition>
<condition> ::=<condition> OR <condition> | <condition> AND <condition> | NOT <condition> | ( <condition> ) | <predicate>
<predicate> ::= <comparison_predicate> | <range_preciate> | <in_predicate> | <exist_predicate> | <like_predicate> | <null_predicate>
<comparison_predicate> ::= <expression> { = | != | <> | > | < | >= | <= } [ ANY | SOME | ALL ] ({<expression_list> | <subquery>})
<range_predicate> ::= <expression> [NOT] BETWEEN <expression> AND <expression>
<in_predicate> ::= <expression> [NOT] IN ( { <expression_list> | <subquery> } )
<exist_predicate> ::= [NOT] EXISTS ( <subquery> )
<like_predicate> ::= <expression> [NOT] LIKE <expression> [ESCAPE <expression>]
<null_predicate> ::= <expression> IS [NOT] NULL
<expression_list> ::= {<expression>, ... }
GROUP BY 子句
<group_by_clause> ::=GROUP BY { { <expression>, ... } | <grouping_set> }
<grouping_set> ::= { GROUPING SETS | ROLLUP | CUBE }[BEST <integer>] [LIMIT <integer>[OFFSET <integer>] ] [WITH SUBTOTAL] [WITH BALANCE] [WITH TOTAL]
[TEXT_FILTER <filterspec> [FILL UP [SORT MATCHES TO TOP]]] [STRUCTURED RESULT [WITH OVERVIEW] [PREFIX <string_literal>] | MULTIPLE RESULTSETS] ( <grouping_expression_list> )
<grouping_expression_list> ::= { <grouping_expression>, ... }
<grouping_expression> ::=<expression>| ( <expression>, ... ) | ( ( <expression>, ... ) <order_by_clause> )
GROUP BY 用來對基於指定列值選定的行進行分組。
GROUPING SETS
在一條語句中, 生成多個特定數據分組結果。若是沒有設置例如 best 和 limit 的可選項,結果將和 UNION ALL 每一個指定組的聚合值相同。例如:
"select col1, col2, col3, count(*) from t groupbygrouping sets ( (col1, col2), (col1, col3) )"與" select col1, col2, NULL, count(*) from t groupby col1, col2 unionallselect col1, NULL, col3,count(*) from t groupby col1, col3"相同。在 grouping-sets 語句中,
每一個(col1, col2) 和(col1, col3)定義了分組。
ROLLUP
在一條語句中,生成多級聚合結果。例如, "rollup (col1, col2,col3)"與有額外 聚合,但沒有分組的"grouping sets ( (col1, col2, col3), (col1, col2), (col1) )"結果相同。所以,結果集所包含的分組的數目是 ROLLUP 列表中的列加上一個最後聚合的數目,若是沒有額外的選項。
CUBE
在一條語句中,生成多級聚合的結果。例如, "cube (col1, col2,col3)" 與有額外聚合,但沒有分組的"grouping sets ( (col1, col2, col3), (col1, col2), (col1, col3), (col2, col3), (col1), (col2),(col3) )"結果相同。所以,結果集所包含分組的數目與全部可能排列在 CUBE 列表的列加上一個最後聚合的數目是相同的,若是沒有附加的選項。
BEST n
返回每一個以行聚合數降序排列的分組集中前 n 個分組集(返回的是某個分組裏的全部記錄,而不是某幾條)。 n 能夠是任意零,正數或負數。當 n 爲零時,做用和沒有 BEST 選項同樣。當 n 爲負數表示以升序排序。
LIMIT n1 [OFFSET n2]
返回每一個分組集中(取每一個組中的部分行)第一個 N1 分組記錄跳過 N2 個後的結果。
WITH SUBTOTAL
返回每一個分組集中由 OFFSET 或者 LIMIT 控制的返回結果的分類彙總。除非設置了 OFFSET 和LIMIT,返回值將和 WITH TOTAL 相同。
WITH BALANCE
返回每一個分組集中 OFFSET 或者 LIMIT 沒有返回的其他結果值。
WITH TOTAL
返回每一個分組集中額外的合計總值行。 OFFSET 和 LIMIT 選項不能修改該值。
TEXT_FILTER <filterspec>
執行文本過濾或者用<filterspec>高亮分組列, <filterspec>爲單引號字符串,語法以下:
<filterspec> ::= '[<prefix>]<element>{<subsequent>, ...}'
<prefix> ::= + | - | NOT
<element> ::= <token> | <phrase>
<token> ::= !! Unicode letters or digits
<phrase> ::= !! double-quoted string that does not contain double quotations inside
<subsequent> ::= [<prefix_subsequent>]<element>
<prefix_subsequent> ::= + | - | NOT | AND | AND NOT | OR
<filterspec>定義的過濾是由與邏輯操做符 AND, OR 和 NOT 鏈接的標記/詞組或者短語組成。 一個標記相匹配的字符串,其中包含對應不區分大小寫的單詞, 'ab' 匹配 'ab cd' 和 'cd Ab' ,但不匹配'abcd'。一個標記能夠包含通配字符’,匹配任何字符串, ’匹配任意字母。可是在詞組內, ’和’不是通配符。邏輯運算符 AND, OR 和 NOT 能夠與標記,詞組一塊兒使用。因爲 OR 是默認操做符, 'ab cd' 和'ab OR cd'意義同樣。注意,邏輯運算符應該大寫。做爲一種邏輯運算符,前綴'+' 和 '-'各自表示包含(AND) 和不包含 (AND NOT)。例如, 'ab -cd' 和 'ab AND NOT cd'意義相同。若是沒有 FILL UP 選項,只返回含有匹配值的分組記錄。 須要注意的是一個過濾器僅被運用到每一個分組集的第一個分組列。
FILL UP
不只返回匹配的分組記錄,也包含不匹配的記錄。 text_filter 函數對於識別哪個匹配是頗有用的。參閱下面的'Related Functions’。
SORT MATCHES TO TOP
返回匹配值位於非匹配值前的分組集。該選項不能和 SUBTOTAL, BALANCE 和 TOTAL 一塊兒使用。
STRUCTURED RESULT
結果做爲臨時表返回。 對於每個分組集建立一個臨時表,若是設置 WITH OVERVIEW 選項,將爲分組集的總覽建立額外的臨時表,該臨時表的名字由 PREFIX 選項定義。
WITH OVERVIEW
將總覽返回至單獨的額外一張表中。
PREFIX 值
使用前綴命名臨時表。必須以"#"開始,表明是臨時表。若是省略,默認前綴爲"#GN", 而後,鏈接該前綴值和一個非負整數,用做臨時表的名稱,好比"#GN0", "#GN1" 和 "#GN2"。
MULTIPLE RESULTSETS
返回多個結果集中的結果。
相關函數
grouping_id ( <grouping_column1, ..., grouping_columnn> )函數返回一個整數,判斷每一個分組記錄屬於哪一個分組集。 text_filter ( <grouping_column> ) 函數與 TEXT_FILTER, FILL UP, 和 SORT MATCHES TO TOP 一塊兒使用,顯示匹配值或者 NULL。當指定了 FILL UP 選項時,未匹配值顯示爲 NULL。
返回格式
若是 STRUCTURED RESULT 和 MULTIPLE RESULTSETS 都沒有設置,返回全部分組集 的聯合,以及對於沒有包含在指定分組集中的屬性填充的 NULL 值。使用 STRUCTURED RESULT,額外的建立臨時表,在同一會話中用"SELECT * FROM <table name>"能夠查詢。表名遵循的格式:
<PREFIX>0:若是定義了 WITH OVERVIEW,該表將包含總覽。
<PREFIX>n: 由 BEST 參數從新排序的第 n 個分組集。
使用 MULTIPLE RESULTSETS,將返回多個結果集。每一個分組集的分組記錄都在單個結果集中。
HAVING 子句:
HAVING 子句用於選擇知足謂詞的特定分組。若是省略了該子句,將選出全部分組。
<having_clause> ::= HAVING <condition>
SET OPERATORS
SET OPERATORS 使多個 SELECT 語句相結合,並只返回一個結果集。
<set_operator> ::= UNION [ ALL | DISTINCT ] | INTERSECT [DISTINCT] | EXCEPT [DISTINCT]
UNION ALL
選擇全部 select 語句中的全部(並集)記錄。重複記錄將不會刪除。
UNION [DISTINCT]
選擇全部 SELECT 語句中的惟一記錄,在不一樣的 SELECT 語句中刪除重複記錄。 UNION 和 UNION DISTINCT 做用相同。
INTERSECT [DISTINCT]
選擇全部 SELECT 語句中共有(交集)的惟一記錄。
EXCEPT [DISTINCT]
在位於後面的 SELECT 語句刪除(差集)重複記錄後,返回第一個 SELECT 語句中全部惟一的記錄。
ORDER BY 子句
<order_by_clause> ::= ORDER BY { <order_by_expression>, ... }
<order_by_expression> ::= <expression> [ ASC | DESC ]| <position> [ ASC | DESC]
<position> ::= <integer>
ORDER BY 子句用於根據表達式或者位置對記錄排序。位置表示選擇列表的索引。對"select col1,col2 from t order by 2", 2 表示 col2 在選擇列表中使用的第二個表達式。 ASC 用於按升序排列記錄,DESC 用於按降序排列記錄。默認值爲 ASC。
LIMIT
LIMIT 關鍵字定義輸出的記錄數量。
<limit> ::= LIMIT <integer> [ OFFSET <integer> ]
LIMIT n1 [OFFSET n2]:返回跳過 n2 條記錄後的最早 n1 條記錄。
FOR UPDATE
FOR UPDATE 關鍵字鎖定記錄,以便其餘用戶沒法鎖定或修改記錄,直到本次事務結束。
<for_update> ::= FOR UPDATE
TIME TRAVEL
該關鍵字與時間旅行有關,用於語句級別時間旅行回到 commit_id 或者時間指定的快照。
<time_travel> ::= AS OF { { COMMIT ID <commit_id> } | { UTCTIMESTAMP <timestamp> }}時間旅行只對歷史列表適用。 <commit_id>在每次提交後能夠從 m_history_index_last_commit_id 得到,其相關的<timestamp>能夠從 sys.m_transaction_history 讀取。
createhistorycolumntable x ( a int, b int ); // after turnning off auto commit
insertinto x values (1,1);
commit;
select last_commit_id from m_history_index_last_commit_id where session_id = current_connection;// e.g., 10
insertinto x values (2,2);
commit;
select last_commit_id from m_history_index_last_commit_id where session_id = current_connection; // e.g., 20
deletefrom x;
commit;
select last_commit_id from m_history_index_last_commit_id where session_id = current_connection; // e.g., 30
select * from x asofcommit id 30; // return nothing
select * from x asofcommit id 20; // return two records (1,1) and (2,2)
select * from x asofcommit id 10; // return one record (1,1)
select commit_time from sys.transaction_history where commit_id = 10; // e.g., '2012-01-01 01:11:11'
select commit_time from sys.transaction_history where commit_id = 20; // e.g., '2012-01-01 02:22:22'
select commit_time from sys.transaction_history where commit_id = 30; // e.g., '2012-01-01 03:33:33'
select * from x asof utctimestamp '2012-01-02 02:00:00'; // return one record (1,1)
select * from x asof utctimestamp '2012-01-03 03:00:00'; // return two records (1,1) and (2,2)
select * from x asof utctimestamp '2012-01-04 04:00:00'; // return nothing
例子:
表 t1:
droptable t1;
createcolumntable t1 ( id intprimarykey, customer varchar(5), yearint, product varchar(5), sales int );
insertinto t1 values(1, 'C1', 2009, 'P1', 100);
insertinto t1 values(2, 'C1', 2009, 'P2', 200);
insertinto t1 values(3, 'C1', 2010, 'P1', 50);
insertinto t1 values(4, 'C1', 2010, 'P2', 150);
insertinto t1 values(5, 'C2', 2009, 'P1', 200);
insertinto t1 values(6, 'C2', 2009, 'P2', 300);
insertinto t1 values(7, 'C2', 2010, 'P1', 100);
insertinto t1 values(8, 'C2', 2010, 'P2', 150);
如下的 GROUPING SETS 語句和第二個 group-by 查詢相等。 須要注意的是,兩組在第一個查詢的分組集內指定的各組在第二個查詢。
select customer, year, product, sum(sales) from t1 groupbyGROUPING SETS((customer, year),(customer, product));
select customer, year, NULL, sum(sales) from t1 groupby customer, year
unionall
select customer, NULL, product, sum(sales) from t1 groupby customer, product;
注:Union時,兩個Select語句的字段個數,對應字段的類型要相同。BW中的MultiCube是將多個InfoProvider的記錄插入到MultiCube所對應的物理表中,這一過程並非經過Union SQL語句來完成的,而是一個個將InfoProvider的數據插入到MultiCube中,因此來自InfoProvider的字段個數能夠不一樣,只是在報表展現時,經過 Group進行了合併
ROLLUP 和 CUBE 常用的分組集的簡明表示。 下面的 ROLLUP 查詢與第二個 group-by 查詢相等。
select customer, year, sum(sales) from t1 groupby ROLLUP(customer, year);
select customer, year, sum(sales) from t1 groupbygrouping sets((customer, year),(customer))
unionall
selectNULL, NULL, sum(sales) from t1;
selectNULL, NULL, sum(sales) from t1;
select customer, year, sum(sales) from t1 groupbygrouping sets((customer, year),(customer))
select customer, year, sum(sales) from t1 groupbygrouping sets((customer, year),(customer),())
如下的 CUBE 查詢與第二個 group-by 查詢相等。
select customer, year, sum(sales) from t1 groupby CUBE(customer, year);
select customer, year, sum(sales) from t1 groupbygrouping sets((customer, year),(customer),(year))
unionall
selectNULL, NULL, sum(sales) from t1;
select customer, year, sum(sales) from t1 groupbygrouping sets((customer, year),(customer),(year))
select customer, year, sum(sales) from t1 groupbygrouping sets((customer, year),(customer),(year),())
BEST 1 指定如下查詢語句只能返回最上面的 1 個 best 組。在該個例子中,對於(customer, year)組存在 4 條記錄,而(product)組存在 2 條記錄,所以返回以前的 4 條記錄。對於 'BEST -1' 而非 'BEST 1',返回後 2 條記錄。
select customer, year, product, sum(sales) from t1 groupbygrouping sets ((customer, year),(product));
select customer, year, product, sum(sales) from t1 groupbygrouping sets BEST 1((customer, year),(product));
select customer, year, product, sum(sales) from t1 groupbygrouping sets BEST 2((customer, year),(product));
select customer, year, product, sum(sales) from t1 groupbygrouping sets BEST -1((customer, year),(product));
LIMIT2 限制每組最大記錄數爲 2。對於(customer, year) 組,存在 4 條記錄,只返回前 2 條記錄;(product)組的記錄條數爲 2,所以返回全部結果。
select customer, year, product, sum(sales) from t1 groupbygrouping sets LIMIT 2((customer, year),(product));
WITH SUBTOTAL 爲每一組生成額外的一條記錄,顯示返回結果的分類彙總(沒有顯示出來的不會被統計,這與With Total是不同的,請參考後面的With Total)。這些記錄的彙總對customer, year, product 列返回 NULL,選擇列表中 sum(sales)的總和。
select customer, year, product, sum(sales) from t1 groupbygrouping sets LIMIT 2 WITH SUBTOTAL((customer, year),(product));
WITH BALNACE 爲每一組生成額外的一條記錄,顯示未返回結果的分類彙總(若是未返回結果行不存在,則以分類彙總行仍是會顯示,只不過都是問號,而不是不顯示)。
select customer, year, product, sum(sales) from t1 groupbygrouping sets WITH BALANCE((customer, year),(product));
select customer, year, product, sum(sales) from t1 groupbygrouping sets LIMIT 2 WITH BALANCE((customer, year),(product));
select customer, year, product, sum(sales) from t1 groupbygrouping sets LIMIT 1 WITH BALANCE((customer, year),(product));
WITH TOTAL爲每一組生成額外的一條記錄,顯示全部分組記錄的彙總,不考慮該分組記錄是否返回(即沒有顯示在分組裏的數據也會彙總起來,以下面的 300 + 500 <> 1250,由於使用了Limit限制了每組返回的條數,但那些未顯示出來的數據也會被一塊兒統計,這與 With SubTotal不同)。
select customer, year, product, sum(sales) from t1 groupbygrouping sets LIMIT 2 WITH TOTAL((customer, year),(product))
TEXT_FILTER 容許用戶得到有指定的<filterspec>的分組的第一列。如下查詢將搜索以’2’結尾的列:對於第一個分組集爲 customers, 第二個爲 products。只返回三條匹配的記錄。在 SELECT 列表中的 TEXT_FILTER 對於查看哪些值匹配是頗有用的。
select customer, year, product, sum(sales), text_filter(customer), text_filter(product) from t1
groupbygrouping sets TEXT_FILTER '*2'((customer, year),(product));--只是去搜索每一個分組裏裏的第一列,如這裏的customer與product,但不搜索Year列,由於不是分組中的首列
FILL UP 用於返回含有<filterspec>的匹配和不匹配的記錄。 所以,下面的查詢返回 6 條記錄,而先前的查詢返回 3 條。
select customer, year, product, sum(sales), text_filter(customer), text_filter(product)
from t1 groupbygrouping sets TEXT_FILTER '*2' FILL UP ((customer, year),(product));
SORT MATCHES TO TOP 用於提升匹配記錄。對於每一個分組集,將對其分組記錄進行排序。
select customer, year, product, sum(sales), text_filter(customer), text_filter(product)
from t1 groupbygrouping sets TEXT_FILTER '*2' FILL UP SORT MATCHES TO TOP((customer, year),(product));
STRUCTURED RESULT 爲每一個分組集建立一張臨時表,而且可選地,爲總覽表也建立一張。表"#GN1" 爲 分組集(customer, year),表"#GN2" 爲分組集(product)。注意,每張表只含有一列相關列。也就是說,表"#GN1"不包含列"product",而表"#GN2"不包含列"customer" and "year"。
select customer, year, product, sum(sales) from t1 groupbygrouping sets STRUCTURED RESULT((customer, year),(product));
select * from"#GN1";
select * from"#GN2";
WITH OVERVIEW 爲總覽表建立臨時表"#GN0"。
select customer, year, product, sum(sales)
from t1 groupbygrouping sets structured result WITH OVERVIEW((customer, year),(product));
select * from"#GN0";
select * from"#GN1";
select * from"#GN2";
用戶能夠經過使用 PREFIX 關鍵字修改臨時表的名字。注意,名字必須以臨時表的前綴'#'開始,下面與上面結果是同樣,只是臨時表名不同而已:
select customer, year, product, sum(sales)
from t1
groupbygrouping sets STRUCTURED RESULT WITH OVERVIEW PREFIX '#MYTAB'((customer, year),(product));
select * from"#MYTAB0";
select * from"#MYTAB1";
select * from"#MYTAB2";
當相應的會話被關閉或用戶執行 drop 命令,臨時表被刪除。 臨時列表是顯示在m_temporary_tables。
select * from m_temporary_tables;
MULTIPLE RESULTSETS 返回多個結果的結果集。在 SAP HANA Studio 中,如下查詢將返回三個結果集:一個爲總覽表,兩個爲分組集。
select customer, year, product, sum(sales) from t1 groupbygrouping sets MULTIPLE RESULTSETS((customer, year),(product));
語法:
UNLOAD <table_name>
描述:
UNLOAD 語句從內存中卸載列存儲表, 以釋放內存。表將在下次訪問時從新加載。
例子:
在下面的例子中,表 a_table 將從內存中卸載。
UNLOAD a_table;
卸載表的狀態能夠經過如下語句查詢:
select loaded from m_cs_tables where table_name = 't1';
語法
UPDATE [<schema_name>.]<table_name> [ AS <alias_name> ] <set_clause> [ WHERE <condition> ]
<set_clause> ::= SET {<column_name> = <expression>},...
關於表達式的詳情,請參見 Expressions。
<condition> ::= <condition> OR <condition> | <condition> AND <condition> | NOT <condition> | ( <condition> ) | <predicate>
關於謂詞的詳情,請參見 Predicates。
描述:
UPDATE 語句修改知足條件的表中記錄的值。若是 WHERE 子句中條件爲真,將分配該列至表達式的結果中。若是省略了 WHERE 子句,語句將更新表中全部的記錄。
例子:
CREATETABLE T (KEYINTPRIMARYKEY, VAL INT);
INSERTINTO T VALUES (1, 1);
INSERTINTO T VALUES (2, 2);
若是 WHERE 條件中的條件爲真,記錄將被更新。
UPDATE T SET VAL = VAL + 1 WHEREKEY = 1;
若是省略了 WHERE 子句,將更新表中全部的記錄。
UPDATE T SET VAL = KEY + 10;
語法:
SET SYSTEM LICENSE '<license key>'
描述:
安裝許可證密鑰的數據庫實例。許可證密鑰(<license key>="">) 將從許可證密鑰文件中複製黏貼。
執行該命令須要系統權限 LICENSE ADMIN。
例子:
SETSYSTEM LICENSE '----- Begin SAP License -----
SAPSYSTEM=HD1
HARDWARE-KEY=K4150485960
INSTNO=0110008649
BEGIN=20110809
EXPIRATION=20151231
LKEY=...
SWPRODUCTNAME=SAP-HANA
SWPRODUCTLIMIT=2147483647
SYSTEM-NR=00000000031047460'
語法:
ALTER CONFIGURATION (<filename>, <layer>[, <layer_name>]) SET | UNSET <parameter_key_value_list> [ WITH RECONFIGURE]
語法元素:
<filename> ::= <string_literal>
行存儲引擎配置的狀況下,文件名是'indexserver.ini'。 所使用的文件名必須是一個位於’DEFAULT’層的 ini 文件。若是選擇文件的文件名在所需的層不存在,該文件將用 SET 命令建立。
<layer> ::= <string_literal>
設置配置變化的目標層。 該參數能夠是'SYSTEM'或'HOST'。 SYSTEM 層爲客戶設置的推薦層。 HOST層應該通常僅可用於少許的配置,例如, daemon.ini 包含的參數。
<layer_name> ::= <string_literal>
若是上述的層設爲’HOST’, layer_name 將用於設置目標 tenant 名或者目標主機名。例如,
'selxeon12' 爲目標 'selxeon12' 主機名。
SET
SET 命令更新鍵值,若是該鍵已存在,或者須要的話插入該鍵值。
UNSET
UNSET 命令刪除鍵及其關聯值。
<parameter_key_value_list> ::={(<section_name>,<parameter_name>) = <parameter_value>},...
指定要修改的 ini 文件的段、鍵和值語句以下:
<section_name> ::= <string_literal>
將要修改的參數段名:
<parameter_name> ::= <string_literal>
將要修改的參數名:
<parameter_value> ::= <string_literal>
將要修改的參數值。
WITH RECONFIGURE
當指定了 WITH RECONFIGURE,配置的修改將直接應用到 SAP HANA 數據庫實例。
當未指定 WITH RECONFIGURE,新的配置將寫到文件 ini 中,然而,新的值將不會應用到當前運行系統中,只在數據庫下次的啓動時應用。這意味 ini 文件中的�