select first_name,last_name from employee where last_name like all('%E%','%S%');
select first_name,last_name from employee where last_name like any/some('%E%','%S%');
Teradata缺省不区分大小写,如果要区分,可以使用其扩展参数CASESPECIFIC
select first_name,last_name from employee where last_name(CASESPECIFIC) like '%Ra%';
通配符作为一般字符使用
例:
LIKE "%A%%AAA__" ESCAPE"A"
在这个表达式中,讲字母A定义为ESCAPE字符,其中:
第一个%为通配符:
第一个A和其后的%联合表示字符%
第三个%为通配符
第二个A和其后的A联合表示字符A;
第四个和其后的'_'联合表示字符_
最后一个'_'为通配符
当进行升序排列时,NULL在数字列排列在负数前,在字符排列在空格前
优先级和括号
逻辑运算符的缺省优先级顺序从高到低为:NOT.AND.OR
NOT既可以否定操作符,也可以否定条件表达式
否定操作符:
select first_name,last_name,employee_number from employee where department_number not =301;
否定条件:
SELECT first_name,last_name,employee_number FROM employee WHERE NOT(department_number=301);
在ANSI标准中关于字符型数据定义了两类:CHAE和VARCHAR,Teradata除了上述两类基本字符数据外,还扩展了LONG VARCHAR类型,它等同于VARCHAR(64000),是最长的字符串
char(size)固定长度的字符串最大长度:64000字节
varchar(size)
char varying(size)
character varying(size) 这三个是可变长度字符串,最大长度:64000字节
long varchar 等同于varchar(64000)
二进制数据类型是Teradata的扩展,ANSI标准没有此类型
BYTE(size) 固定长度的二进制串默认值:(1)最大值:64000字节
varbyte(size) 可变长的二进制串默认值:(1)最大值:64000字节
数字型数据
在ANSI标准中关于数字型数据定义了四类:SMALLINT.INTEGER.FLOAT.DECIMAL,Teradata还扩展了BYTEINT和DATE
smallint 整数 范围:-32768~32767
integer 整数 范围:-2147483648~2147483647
decimal(size,dec) 小数 最大:18位
numeric(precision,dec) decimal的同义词
float 表示浮点数
float[(precision)] 通float
real 同float
double precision 双精度浮点数
byteint 有符号整数 范围-128~127
date 特殊整数,格式为YYMMDD或yyymmdd表示日期
graphic[(n)] 固定长度的图形字符串默认长度:1
vargraphic(n) 可变长的图形字符串
long vargraphic 可变长的图形字符串
**(求幂)
mod(取模)
date当前系统日期
time系统时间
user当前登陆的用户
database当前缺省的数据库
字符文字在ANSI方式下区分大小写,而在Teradata缺省模式下不区分大小写
数字型常量最多可以包含15个数字,数字前面的零是无意义的
计算模式是指在SQL的SELECT语句中直接进行数学计算,如下:
select 2*2593;
例:1997年3月31日的表达方式
year=(1997-1900)*10000=970000
month=(3*100)=300
day=31
date=970331
1.EXTRACT
ANSI标准中EXTRACT函数允许选取日期和时间中任意段或任意间隔的值,Teradata中EXTRACT函数支持日期数据中选取年.月.日.从时间数据中选取小时.分钟和秒
SELECT DATE; 96/11/07
SELECT EXTRACT(YEAR FROM DATE); 1996
SELECT EXTRACT(MONTH FROM DATE+30); 12
SLEECT EXTRACT(DAY FROM DATE+2); 09
SELECT TIME; 14:52:32
SELECT EXTRACT(HOUR FROM TIME); 14
SELECT EXTRACT(SECOND FROM TIME+30); INVALID TIME
2.ADD_MONTHS
1. ANSI标准中利用CAST函数将一种数据类型转换成另一种数据类型
select cast(salary_amount as integer) from employee;
select cast(salary_amount as dec(6,0)) from employee;
select cast(last_name as char(5)) from employee where department_number=401;
Teradata也可以利用CAST函数来完成上面的操作,另外,它也作了扩充.为了完成上面相同的操作,也可以使用下面的表达方式
select salary_amount(integer);
select salary_amount(dec(6,0));
select last_name(char(5));
Teradata对CAST函数本身也作了扩展,比如为了将显示结果以大写表示,可以使用下面的SQL语句
select cast(last_name as char(5) uppercase) from employee where department_number=401;
宏(Macro)的基本特征是:
可以包含一条或多条SQL语句
可以包含多个BETQ语句
可以包含注解
存储在数据字典中
宏的定义
create macro birthday_list as
(select last_name,first_name,birthdate from employee where department_number=201 order by birthdate;
);
宏的执行
exec birthday_list;
宏的删除
drop macro birthday_list;
宏的显示和改变
show macro birthday_list
使用replace macro命令可以改变宏的定义
子查询
基本子查询
复杂子查询
在子查询中可以使用一些限制符,如下所示:
=any 等于 in
not=all 等于 not in
=some 等于 in
EXISTS在子查询中的使用
EXISTS可以使用在自查询中,用来表示查询至少返回一行.如果前面加上否定词not,则表示查询时无记录存在.exists可以代替in,而not exists可以代替not in
select 'YES' where exists(select department_number from department where department_number not in(select department_number from employee));
select true where exists(select * from employee where department_number=600);
关于子查询的一些基本规则
子查询必须用括号括起来
子查询可以是in或not in字句的操作目标
也可以是exists或not exists字句的操作目标
支持限定词all.any.some
支持like或not like
子查询中可以指定匹配多个字段
子查询结果均为唯一值,即自动去除重复记录,相当于自动加上distinct关键词
order by不能用于子查询内
子查询最多可以指定64个表或视图
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/challwang/archive/2008/08/31/2856138.aspx
在命令行:注意最前点。
.SET SESSION TRANSACTION ANSI (在登陆之前设置)
可以将下述写入一个文件中:.run file 文件名
.SET SESSION TRANSACTION ANSI
LOGON demo/poc_bdsp,POC_BDSP;
? ALTER PROCEDURE
? CALL
? CREATE PROCEDURE
? DATABASE
? EXPLAIN modifier
? HELP
? OPEN
? PREPARE
? REPLACE PROCEDURE
? SELECT
? SET ROLE
? SET SESSION ACCOUNT
? SET SESSION COLLATION
? SET SESSION DATEFORM
? SET TIME ZONE
? SHOW
? Cursor statements, including:
? CLOSE
? FETCH
? OPEN
对ORACLE的锁理解的还可以,但是好象TERADATA的锁是反过来的,比如WRITE LOCK是可写的,READ LOCK是可读的.而官方教材上的介绍我越看越糊涂,谁能详细的给解惑一下呢?
Exclusive– prevents any other type of concurrent access
Write– prevents other reads, writes, exclusives
Read– prevents writes and exclusives
Access– prevents exclusive onlyThere
Exclusive排他锁,阻止其他任何并发访问
Write–写锁,阻止其他任何读,写或者排他锁
--(这里理解为阻止创建排他锁的语句执行,如执行write的时候,在其他用户端是不支持表结构修改的)
Read-读锁,阻止其他写锁和排他锁,但不阻止其他读锁
Access-访问锁,只阻止排他锁
四种类型的锁:
Exclusive–prevents any other type of concurrent access
Write–prevents other reads, writes, exclusives
Read–prevents writes and exclusives
Access–prevents exclusive only
锁被应用的级别:
Database–applies to all tables/views in the database
Table/View–applies to all rows in the table/views
Row Hash–applies to all rows with same row hash
基于 SQL 命令自动获得的锁类型:
SELECT–applies a Read lock
UPDATE–applies a Write lock
CREATE TABLE–applies an Exclusive lock
程序中经常用的就是三种锁
锁类型 |
创建该锁操作类型 |
排他类型 |
支持并发操作 |
Exclusive lock |
DDL,如drop,create,alter |
任何其它操作 |
无 |
Read lock |
Dml , 如select |
Write,创建exclusive lock 的操作 |
Read |
Write lock |
Dml, 如insert,update,delete |
Write,read, 创建exclusive lock 的操作 |
基本无 |
具体说明可参考《1093.pdf》
Bteq 模式下,基本采用的是隐式事物提交,即一个”;”作为一次事务提交了。所以这些加锁机制就显现不出了,但如果调整为 “use manual commit mode for ansi session”,效果就明显了。
可以通过下面命令降低或者提高锁等级,可以提高所有等级的锁,降低锁等级只可以把Read 降为Access,其它等级不能降低,例,
LOCKING ROW FOR ACCESS SELECT * FROM Table_A;
LOCKING TABLE Table_B FOR EXCLUSIVE UPDATE Table_B SET A = 2007;
LOCKING TABLE Table_C FOR WRITE NOWAIT UPDATE Table_C SET A = 2008;
总之:针对 update ,insert ,delete等SQL语句一定要及进commit。
针对表的查询尽量用视图屏蔽其锁机制。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fanxiaoliang83/archive/2009/10/20/4705205.aspx
A FOR CURSOR loop does not permit a COMMIT, ROLLBACK, or ABORT within the
FOR loop. If the system detects a COMMIT, ROLLBACK, or ABORT during compile
time, it returns an error and does not create the stored procedure.