teradataSQL学习笔记

  • 格式:docx
  • 大小:54.95 KB
  • 文档页数:20

13.15.23.24.25.26.28.29

什么时候要在表名前加数据库的名字,为什么要加

不加的时候当前默认数据库为什么是DWMART_BWCM

A:这是可以设置的。

FORMAT不好用

A:这是可以设置的。

TITLE vs AS

A:能用哪个用哪个。

单引号 vs 双引号

A:都用单引号,保险。

P118.数据存储属性。包括下面各项:

COMPRESS 压缩值为NULL的字段存储空间为0

COMPRESS NULL 同上

COMPRESS 压缩值为NULL和指定值的字段存储空间为0

A:压缩比如10000条记录某一属性都为1,字符型,那么所占存储空间就应该是1000字节;经过compress之后,可能就变成2字节,或者远远比原来所占存储空间更小的内存。

但是!compress的过程是消耗系统资源的,也就是会对执行效率有一定的影响。

所以是否使用compress就是效率和空间的一个权衡过程。

-Ch 10 内连接-

 INNER JOIN。。。ON 后面的条件应该用主键连接,为避免连接结果中数据重复。

eg.

sel

b.DIVIDEID,b.REPASSETTYPEID_ON,b.REPASSETTYPEID_ON_DESC ,count(*)

from dwmart_bwcm.N_exposures a

inner join dwmart_rwa.fc_check_exposure_divide_315 b

on a.ACCOUNTREFCD=b.ACCOUNTREFCD

where a.timeid=20130630

and a.SOURCEID=9

and a.ASSETTYPEID=20

and a.ACCOUNTING_SUBJECT in ('3125','3126')

and b.timeid=20130630

and b.DIVIDEID=9

group by 1,2,3

order by 1,2,3;

sel

ab.DIVIDEID,ab.REPASSETTYPEID_ON,ab.REPASSETTYPEID_ON_DESC

,count(*)

from dwmart_rwa.fc_check_exposure_divide_315 ab

where timeid=20130630

and ab.ACCOUNTREFCD in

(sel A. ACCOUNTREFCD

from dwmart_bwcm.N_exposures a

where a.timeid=20130630

and a.SOURCEID=9

and a.ASSETTYPEID=20

and a.ACCOUNTING_SUBJECT in ('3125','3126')

group by 1)

and ab.DIVIDEID=9

group by 1,2,3

order by 1,2,3;

解释:两个查询结果的COUNT(*)不一样,因为第一个语句块中的内连接字段ACCOUNTREFCD不是表的主键,该字段内存在重复数据,所以内连接的结果有重复数据,导致计数结果不一致。

 SELF JOIN

什么时候要用自连接?

【一般能看到的例子就是以下两种】

1. 要把所有姓Brown的雇员及其经理找出来

SELECT emp.first_name (TITLE 'Emp//First Name')

,st_name (TITLE 'Emp//Last Name')

,mgr.first_name (TITLE 'Mgr//First Name')

,st_name (TITLE 'Mgr//Last Name')

FROM employee emp

INNER JOIN employee mgr

ON emp.manager_employee_number = mgr.employee_number

WHERE st_name = 'Brown';

2. 查找所有在1978年1月1日以前加入公司的雇员,显示其雇员编号、部门代码以及其部门经理的姓名,将结果按部门编号排序

SEL e.employee_number,

e.department_number,

st_name

FROM employee e

INNER JOIN employee m

ON e.manager_employee_number = m.employee_number

WHERE e.hire_date < 780101

ORDER BY 2;

思考:当一个表内存在两列属性性质相同的时候(如员工号和经理的员工号都是员工号),可能需要将该属性作为连接条件对表进行自连接。

-Ch 11 数据定义DDL-

1.定义------------------------------------------------------------------------------------------------------------

具有主键(Primary Key)约束的字段一定要定义为非空(NOT NULL)。

表级约束与字段级约束的主要区别是:在表级约束中可以指定当前表的多个字段或其组合,而字段级约束只能引用当前字段。

字段级约束必须写在每个字段定义的后面,而表级约束是在字段定义结束后再进行的。

在原来的DDL中有关主键和UNIQUE的约束在Teradata内部表示为主索引和次索引。

当定义好约束后,可以使用

HELP CONSTRAINT database_name.table_name.contraint_came

的方法来观察约束的有关信息。

索引可以在CREATE TABLE时就加以定义,同时还可以定义主键。如果创建表时不定义主索引,Teradata就按照下面的规则缺省来建立主索引,因为没有主索引的话,Teradata就无法进行数据的分配。

CREATE TABLE时没有指定PI

 IF 定义了PK,THEN PK = UPI

 ELSE IF 存在定义为UNIQUE的字段,THEN 第一个NIQUE的字段为UPI

 ELSE 表中定义的第一个字段作为NUPI

CREATE TABLE时指定了PI

 IF 定义了PK,THEN PK作为USI

 AND为每一个定义为UNIQUE的字段建立一个USI

2.删除------------------------------------------------------------------------------------------------------------

DROP TABLE table_name; --删除表定义

DELETE FROM table_name; --删除表数据

DELETE table_name;

3.修改------------------------------------------------------------------------------------------------------------

ALTER修改表定义、约束定义

删除FALLBACK的方法

ALTER TABLE table_name, NO FALLBACK;

表中已有数据如果不符合新的约束条件,约束的增加或修改不能成功。

4.索引------------------------------------------------------------------------------------------------------------ 创建表时就应定义主索引,同时也可以定义次索引。

主索引只能在CREATE TABLE时定义,而次索引既可以在创建表时定义,也可以使用CREATE INDEX来定义。

次索引可以命名,也可以不命名。

定义好索引或次索引后,可以利用HELP INDEX 来显示指定表的所有索引定义,如果索引是未命名的,索引名称显示为NULL。

当次索引创建后,也可以利用DROP INDEX来删除它们。注意,只有次索引可以被删除,主索引是不能被删除的。

当删除命名索引时,可以只指定索引名称,也可以指定索引定义。而删除未命名索引时,必须指定索引定义。

--删除命名索引

DROP INDEX FullName ON emp_data;

--删除未命名索引

DROP INDEX (job_code) ON emp_data;

-------------------╮(╯_╰)╭ 偶系面无表情的分割线 -------------------

代码块1:

SEL XXX, XXX, XXX

FROM table_1

INNER JOIN table_2

ON conditions;

代码块2:

SEL XXX, XXX, XXX

FROM table_1

CROSS JOIN table_2

WHERE conditions;

1.CROSS JOIN 不可以和ON搭配使用,只能用WHERE或者不用;

2.当conditions与两表连接无关的时候,代码块1 == 代码块2;

3.INNER JOIN一定要和ON搭配使用,否则语法错误