1、創建一個數據庫的命令舉例:
Create database testbase as perm=200000000,spool=100000000;
2、修改數據庫的命令舉例:
Modify database testbase as perm=300000000;
注釋:該命令將testbase的永久表空間修改為300mb,spool空間定義不變。
3、創建用戶的命令實例:
Create user testuser as perm=200000000,spool=100000000,password=testpassword;
4、修改一個用戶的命令實例:
Modify user testuser as password=newpassword;
5、轉讓擁有權的命令實例:
Give appl1 to admin2;
注釋:通過DBC或ADMIN登錄系統,可以將appl1的擁有權從admin1轉讓給admin2。
擁有權可以轉讓,創建者是不可以改變的,一旦一個用戶A創建了一個用戶B或者數據庫B,那么A就永遠是B的創建者。
6、檢查一個用戶或數據庫具有哪些父輩或后代的命令實例:
Select parent from dbc.children where child=’APPL1’;
注釋:檢查用戶APPL1的所有父輩。
Select child from dbc.children where parent=’USERADMIN’;
注釋:檢查用戶USERADMIN的所有后代。
7、
Grant select on usera to userb with grant option;
注釋:表示將usera中對象的select權限授予給userb,這樣userb就可以讀usera中的表、視圖等對象了。由於帶有with grant option,因此userb還可以把它接收的權限再轉授給其他用戶或數據庫。
8、
revoke select on usera from userb;
9、擁有權
用戶DBC擁有用戶ADMIN,ADMIN中有一個表TABLEC,那么,ADMIN是TABLEC的直接擁有者,而DBC則是TABLEC的間接擁有者,ADMIN和DBC均具有對TABLEC的擁有權。當以DBC登陸系統時,它可以授予它自己對TABLEC的任何權限。在未顯示地授予之前,DBC不能對TABLEC執行類似SELECT、INSERT之類的操作。
DBC對TABLEC隱含地具有CHECKPOINT、DUMP和RESTORE的權限,但是,隱含權不包括執行任何形式的CREATE命令,例如:DBC不能在ADMIN中創建用戶、數據庫或其他對象。 事實上,如果DBC不將CREATE USER的權限授予ADMIN,則ADMIN登陸后也不能在它自己的空間上創建用戶。
一個用戶並不擁有它自己,ADMIN創建用戶USERA,USERA不能對它自己執行GRANT/REVOKE命令,以及執行CHECKPOINT、DUMP和RESTORE命令。
10、自動權限:
自動權限是指創建一個用戶或其他對象時,由系統自動授予的權限。
自動權限並不包括:1、GRANT權限(通過WITH GRANT OPTION來完成),2、對被創建者而言,它在它自己空間CREATE/DROP用戶或數據庫的權限。
11、檢查用戶有具有的任何權限:
1 Select databasename (format ‘x(10)’), 2 Tablename (format’x(10)’), 3 Accessright, 4 Allnessflag from dbc.allrights 5 Where username=’USERA’;
注釋:檢查用戶USERA所具有的任何權限。
12、大小寫規范:
1)所有的SQL語句中的保留字均采用全部大寫,表別名也要大寫。例如:
ALL AS CASE CREATE OUT DATABASE DELETE FROM IN INSERT JOIN LEFT NO NOT NULL SELECT TABLE TITLE UPDATE VIEW WHERE等。
2)表名、視圖名、宏和存儲過程名:全部小寫。
3)字段名:每個單詞的首字母大寫,其余部分小寫,如:Acct_Id,Type_Id等。
13、獲取表的字段列表:
Select columnname,trim(columntitle) from dbc.columns Where databasename=’數據庫名’ and tablename=’表名’ Order by columnid;
14、常用的歷史表取數方法:
1)提取某日數據
Select * from tablea Where start_dt<=’某日日期’ And end_dt>’某日日期’
2)提取某日之前的所有數據
Select * from tablea Where start_dt<=’某日日期’
3)提取某日之后的所有數據
Select * from tablea Where end_dt>’某日日期’
4)提取甲日和乙日之間的所有數據
Select * from tablea Where start_dt<’乙日日期’ And end_dt>’甲日日期’
5)提取當前有效數據
Select * from tablea Where end_dt=’20111013’
15:Help
HELP DATABASE databasename;可以顯示一個指定數據庫所包含的所有對象。 HELP USER username;顯示某個用戶中所包含對象的信息。 HELP TABLE tablename;顯示某張表的信息。 HELP VIEW viewname;顯示某個視圖的信息。 HELP MACRO macroname;顯示某個宏的信息。 HELP COLUMN table or viewname.*; 顯示表/視圖的各列的信息。 HELP COLUMN table or viewname.colname……,colname;顯示表/視圖的某幾列的信息。 HELP INDEX tablename;顯示某個表中的所有索引定義。 HELP STATISTICS tablename;顯示表的統計。 HELP CONSTRAINT table or viewname.constraintname; 顯示定義在某個表/視圖上的約束定義 HELP JOIN INDEX join_indexname; 顯示連接索引的定義 HELP TRIGGER triggername; 顯示觸發器的信息 HELP PROCEDURE procedurename; 顯示存儲過程的信息 HELP PROCEDURE procedurename ATTRIBUTES; HELP 'SQL'; 得到所有SQL命令的列表信息 HELP 'SQL sqlcommand'; 得到某個特定SQL命令的使用方法
16:SHOW 如果知道一些數據庫對象是用什么樣的DDL命令創建的,則要使用SHOW命令。
SHOW TABLE tablename; SHOW VIEW viewname; SHOW MACRO macroname; SHOW INDEX Tablename; SHOW JOIN INDEX join_indexname; SHOW TRIGGER Triggername; SHOW PROCEDURE Procedurename;
17:EXLPLAIN
EXPLAIN SELECT * FROM department;
注釋:利用EXPLAIN命令,可以了解Teradata執行一個SQL交易請求的詳細過程和計划,這對於更進一步地理解Teradata的查詢處理機制有很大的幫助。另一方面,對於復雜SQL交易的調試來說,這也是不可或缺的一個工具。
利用EXPLAIN解釋一個SQL交易的方法很簡單,就是在原來SQL語句的前面加上EXPLAIN即可,其他完全不變。
18:日期函數
SELECT DATE; SELECT EXTRACT(YEAR FROM DATE); SELECT EXTRACT(MONTH FROM DATE+30); SELECT EXTRACT(DAY FROM DATE+2); SELECT TIME; SELECT EXTRACT(HOUR FROM TIME); SELECT EXTRACT(MINUTE FROM TIME); SELECT EXTRACT(SECOND FROM TIME); SELECT ADD_MONTHS(DATE,2); SELECT ADD_MONTHS(DATE,12*8); SELECT ADD_MONTHS('2002-03-19',12);
19、在LIKE結構的字符串中,‘%’和‘_’可以作為通配符使用,但是如果需要匹配這些字符本省(比如查詢96%),即把它們作為一般字符使用,我們可以通過定義ESCAPE字符來達到這個目的,緊跟在EXCAPE字符后的‘%’和‘_’作為一般字符看待。
例:
LIKE ''%A%%AAA__'' ESCAPE ''A''
在這個表達式中,將字母A定義為ESCAPE字符,其中:
! 第一個%為通配符;
! 第一個A和其后的%聯合表示字符%;
! 第三個%為通配符;
! 第二個A和其后的A聯合表示字符A;
! 第四個A和其后的’_’聯合表示字符_;
! 最后一個’_’為通配符。
20、宏
CREATE MACRO macroname AS ( . . . ); 定義宏 EXECUTE macroname; 執行宏語句 SHOW MACRO macroname; 顯示宏定義 REPLACE MACRO macroname AS ( . . . ); 改變宏定義 DROP MACRO macroname; 從字典中刪除宏定義 EXPLAIN EXEC macroname; 顯示宏執行的解釋
21、CHARACTERS函數
CHARACTERS函數也是Teradata的擴展,用於計算VARCHAR型數據字段的實際字符串長度。
22、TRIM函數
ANSI標准的TRIM函數用於去除字符數據中前頭或后端的空格或者二進制數據中前頭或后端的零。
在Teradata中,日期數據的缺省輸出格式是:YY/MM/DD,這和ANSI標准是一樣的。而ANSI標准建議的日期顯示格式是:YYYY-MM-DD。
下面是一些對日期進行格式化的例子。
句法 結果
FORMAT 'YYYY/MM/DD' 1996/03/27 FORMAT 'DDbMMMbYYYY' 27 Mar 1996 FORMAT 'mmmBdd,Byyyy' Mar 27, 1996 FORMAT 'DD.MM.YYYY' 27.03.1996 FORMAT 'MM/DD/YY' 03/27/96 FORMAT 'MMM.DD.YY' Mar.27.96 FORMAT 'yy -- mm -- dd' 96 -- 03 -- 27 FORMAT 'DDDYY' 08696 SELECT last_name,first_name,hire_date (FORMAT 'mmmBdd,Byyyy') FROM employee ORDER BY last_name;
利用FORMAT短語,可以將字符字段或表達式進行截取處理,這種處理只影響顯示格式,而不會影響數據的內部存儲格式。
24、建表
帶結構的建表方法:
Create volatile multiset table duebill_agmt,no log( Agmt_num varchar(40) not null,--‘借據號’ ) Primary index(Agmt_num,Agmt_modifier_num) On commit preserve rows;
Teradata DDL允許在創建表時指定表的物理屬性,包括:
A. SET 不允許記錄重復,例:CREATE SET TABLE table1 ...
B. MULTISET 允許記錄重復,例:CREATE MULTISET TABLE table1 ...
C. 數據保護要結合FALLBACK和JOURNAL (流水或日志)。
FALLBACK是Teradata的一種數據保護機制,數據表的每一條記錄都同時存放兩份,而且位於不同的AMP所控制的存儲單元中;當數據發生問題或者AMP失敗時,可以利用存放在其他AMP上的數據保證對數據表的訪問。
- FALLBACK 使用FALLBACK保護機制
- NO FALLBACK 不使用FALLBACK保護機制
日志有BEFORE和AFTER兩種,分別保存了一條記錄變化前后的狀態。當系統出錯時,可以利用日志進行恢復。
D. 存儲空間選項
DATABLOCKSIZE用來指定數據塊大小,最小的數據塊為6144字節,最大的數據塊是32256字節。
FREESPACE用來定義在每個磁盤柱面上保留的空間(0-75%)。
例:
CREATE MULTISET TABLE table_1 , FALLBACK, NO JOURNAL , FREESPACE = 10 PERCENT , DATABLOCKSIZE = 16384 BYTES (field1 INTEGER);
新建一張表TB1,表結構與TB2一樣,不需要數據。
Create table TB1 as TB2 with no data;
使用子查詢創建表,並選擇所需的列。
CREATE TABLE emp1 AS(SELECT employee_number, department_number, salary_amount FROM employee) WITH NO DATA;
往TB1表中裝入TB2表的數據(也可以是有選擇性的,需指定字段)
INSERT INTO TB1 SELECT * from TB2;
25、交易完整性
在Teradata中,系統將保證一個交易的完整。怎樣才算是一個交易呢,在Teradata中,根據其所處方式的不同在處理時也有所不同。在 Teradata缺省模式下,以分號結束的每個SQL語句都是一個完整的交易,也可以使用BT (Begin Transaction)和ET (End Transaction)來顯示地定義一個交易。下面看一個例子:
例:
缺省方式 .LOGON INSERT row1; (txn #1) INSERT row2; (txn #2) .LOGOFF 用BT和ET顯示定義交易 .LOGON BT; INSERT row1; (txn #1) INSERT row2; COMMIT WORK; ET; .LOGOFF
第一部分中有兩個SQL語句,用分號結束,表示兩個交易,任何一個失敗不會影響另一個的執行。而第二部分用BT和ET顯示地規定:在BT和ET之間的所有 SQL是一個交易,只有最后的COMMIT WORK執行成功后,才會真正地更新數據庫。執行過程中任何一個SQL語句失敗,都會使整個交易失敗,系統將自動進行恢復(Rollback)處理。
26、WITH BY進行數據小計
WITH BY的主要特點包括:
A. 它為明細數據表創建分類小計。
B. 跟GROUP BY不同的是,WITH BY沒有剔除明細記錄,而是在明細記錄后面按照分類增加小計行。
C. 可以允許多於一個字段進行小計,即小計當中可以嵌套小計。
D. 輸出結果將根據BY后面的所有字段自動進行排序。
E. 它是Teradata的一個擴展特性。
舉例:
1. WITH BY, WITH和ORDER BY的聯合使用:
SELECT last_name AS NAME ,salary_amount AS SALARY ,department_number AS DEPT FROM employee WITH SUM (SALARY) BY DEPT WITH SUM (SALARY) (TITLE 'GRAND TOTAL') ORDER BY NAME;
結果如下:
NAME SALARY DEPT
Kanieski 29250.00 301
Stein 29450.00 301
-------------
Sum (SALARY) 58700.00
Johnson 36300.00 401
Trader 37850.00 401
-------------
Sum (SALARY) 74150.00
Ryan 31200.00 403
Villegas 49700.00 403
-------------
Sum (SALARY) 80900.00
-------------
GRAND TOTAL 213750.00
2. WITH和GROUP BY的聯合使用:
SELECT department_number (TITLE 'dept_no') ,SUM (salary_amount) ,AVG (salary_amount) FROM employee GROUP BY department_number WITH SUM (salary_amount) (TITLE 'GRAND TOTAL') ,AVG (salary_amount) (TITLE '') ORDER BY department_number;
結果如下:
dept_no SUM (salary_amount) AVG (salary_amount)
301 58700.00 29350.00
401 74150.00 37075.00
403 80900.00 40450.00
--------------------- ----------------------
GRAND TOTAL 213750.00 35635.00
27、SUBSTRING函數
SUBSTRING函數:用來從字符串中析取一個子字符串,其格式為:
SUBSTRING(<字符串表達式>FROM<開始位置>[FOR <長度>])
例如:SELECT SUBSTRING('catalog' FROM 5 FOR 3);
結果為log。
28、字符串合並:字符串合並的符號是“||”,它把兩個字符串串聯成一個字符串。其格式為:<字符串1>||<字符串2>
29、INDEX函數:index用來在一個字符串中定位一個子串的開始位置。如下面的例子:
SELECT INDEX(‘ABC’,’B’);返回結果為2。
30、CASE語句
基於搜索(Searched)的CASE語句,例如:
SELECT last_name, CASE WHEN salary_amount < 30000 THEN 'Under $30K' WHEN salary_amount < 40000 THEN 'Under $40K' WHEN salary_amount < 50000 THEN 'Under $50K' ELSE 'Over $50K' END FROM employee ORDER BY salary_amount;
31、COALESCE表達式
COALESC實際上也是CASE語句在某種特殊情況下的縮寫。COALESCE將返回第一個非NULL表達式的值。其格式為COALESCE(<expression1>,<expression2>[,<expressionX>])
例:從phone_table表中,列出姓名和電話號碼,如果辦公室電話存在則列出辦公室電話,否則列出家里電話。
SELECT name ,COALESCE (office_phone, home_phone) FROM phone_table;
32、簡單排隊RANK
排隊函數(RANK)的語法是:RANK(colname)。
這里,colname表示排隊的列明,其結果降序排列。
問題
顯示商店1001的產品銷售額排隊。
解答
SELECT storeid, prodid, sales, RANK(sales) FROM salestbl WHERE storeid = 1001;
結果
storeid prodid sales Rank
1001 F 150000.00 1
1001 A 100000.00 2
1001 C 60000.00 3
1001 D 35000.00 4
如上所示,列Rank的最大值代表最低的銷售額。
帶限定的排隊
QUALIFY子句限制排隊輸出的最終結果。QUALIFY子句與HAVING子句類似,使輸出限制在一定范圍內。
問題
按商店得到銷售前3名的產品。
解答
SELECT storeid, prodid, sales, rank(sales) FROM salestbl GROUP BY storeid QUALIFY rank(sales) <= 3;
結果
storeid prodid sales Rank
1001 A 100000.00 1
1001 C 60000.00 2
1001 D 35000.00 3
1002 A 40000.00 1
1002 C 35000.00 2
1002 D 25000.00 3
1003 B 65000.00 1
1003 D 50000.00 2
1003 A 30000.00 3
