TERADATA数据库操作

1、创建一个数据库的命令举例:

Create database testbase as perm=200000000,spool=100000000; 
注释:该命令创建了一个测试数据库testbase,其永久表空间为200mb,spool空间不能超过100mb。在teradata数据库系统的缺省方式下,是不区分大小写字母的。
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; 

注释:表示把对usera的select权限从userb收回,这样userb就不能读取usera中的各种对象了。
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、检查用户有具有的任何权限:

 Select databasename (format ‘x(10)’),
Tablename (format’x(10)’),
Accessright,
Allnessflag from dbc.allrights
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型数据字段的实际字符串长度。

CHARACTERS函数也可以简写成CHARACTER、CHARS或者CHAR。
22、TRIM函数
ANSI标准的TRIM函数用于去除字符数据中前头或后端的空格或者二进制数据中前头或后端的零。
在Teradata缺省模式下,TRIM(<expression>)只能去除后端的空格或二进制零。
 
23、日期格式
在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

上一篇:委托、回调 Lambda表达式书写方式


下一篇:Interview Check If n Is A Perfect Square