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搭配使用,否则语法错误