当前位置:文档之家› sybase常用SQL

sybase常用SQL

现在项目组使用的数据库是Sybase,之前都是用Oralce的,在熟悉Sybase时发现Sybase的资料还是很少的(尤其网上资料),摸索很长时间后才慢慢适应过来,闲余之时,总结了下Sybase IQ的使用心得,由于之前用的的Oralce,所以有的差异也是和Oralce作的比较。
希望能帮到Sybase初学者。
==================================使用总结===========================================
1、字母大小写比对不敏感,也就是在值比对判断时大小写字母都一样;
2、等值,或<>判断,系统默认对等式两边比对值去右边空格再进行比较;
3、GROUP BY 可以根据SELECT字段或表达式的别名来 汇总,在编写时也尽量避免SELECT 语句的别名与FROM表中的字段有重复,不然会出现莫名其妙的错误;
4、FROM后的子查询 要定义别名才可使用;
5、存储过程要返回IQ系统错误信息 SQLCODE || ERRORMSG(*) :(两者都为EXCEPTION后第一条SQL语句才有效果);
6、IQ中若采用 FULL JOIN 连接则不能使用 WHERE 条件,否则FULL JOIN将失效,要筛选条件则用子查询先过滤记录后再FULL JOIN;
7、建表时,字段默认为非空;
8、UPDATE语句,如果与目标表关联的表有多条,则不会报错,而是随机取一条更新(第一条);
9、RANK() OVER(PARTITION BY .. ORDER BY ..) 分组分析函数,相同的ORDER BY值,返回顺序值一样,且PARTITION BY 只支持一个字段或一个字段组(需多个字段分组的则要用 || 拼为一个字段(待确认,该问题以前碰过一次,再次验证却不存在这问题))
10、返回可读的 全局唯一字符:UUIDTOSTR(NEWID())
11、存储过程隐式游标语法:
FOR A AS B CURSOR FOR SELECT ... FROM ...
DO
.... 过程语句
END FOR;
需要注意的时,这边的A 和 B 在 过程语句中都不能引用,所以为避免过程语句其他字段名与FOR SELECT 语句的字段名称重复,FOR SELECT 语句的字段最好都定义别名区分
12、根据SELECT 语句建立[临时]表的方法(ORACLE的CREATE TABLE)为 SELECT ..[*] INTO [#]table_name FROM ..; 其中如果在table_name加前缀#,则为会话级临时表,否则为实体表;
13、因Sybase为列存储模式,在执行上INSERT语句会比UPDATE语句慢,尤其表数据越多INSERT效率就越慢;所以在ETL时建议多用UPDATE而不是INSERT
14、虽说Sybase为列存储模式,每个字段上都有默认索引,但对于经常的两表的关联键还是要建立索引否则会经常报QUERY_TEMP_SPACE_LIMIT不足的错误;
15、存储过程中也可以显示的执行DDL语句,这点与Oracle不同;
16、空字符串''在Sybase中也是个字符而不是null值,这点要注意;
17、调整SESSION的临时空间SET TEMPORARY OPTION QUERY_TEMP_SPACE_LIMIT = '150000'; 15000为大小,如写0则没限制大小
==================================常用函数=====

======================================
字符串函数
1)ISNULL(EXP1,EXP2,EXP3,...) :返回第一个非空值,用法与COALESCE(exp1,exp2[,exp3...])相同
3)TRIM(exp) :去除两边空格
4)DATEFORMAT(date_exp,date_format) :日期型转字符型;
5)STRING(exp):转为字符型;

6)SUBSTRING(exp,int-exp1,[int-exp2]):截取exp从int-exp1开始,截取int-exp2个字符;
eg:select substring(BDHM ,3,10) FROM CK_CKXZ WHERE BDHM ='A220150316450000200001';
输出结果为:20150316
7)REPLACE(o-exp,search-exp,replace-exp):从o-exp搜索search-exp,替换为replace-exp;
eg:update CK_CKXZ SET BDHM= replace(BDHM ,'2015','2016') WHERE BDHM ='A220150316450000200001';
输出结果为:A220160316450000200001
8)SPACE(int_exp):返回int个空格;
8)UPPER(exp):转为大写字母,等价于UCASE(exp);
8)LOWER(exp):转为小写字母,
8)CHARINDEX(exp1,exp2):返回exp2字符串中exp1的位置!定位,exp1 查找的字符,exp2 被查找的字符串;
eg:select CHARINDEX('2015',BDHM) FROM CK_CKXZ WHERE BDHM ='A220150316450000200001';
输出结果为:3
8)DATALENGTH(CHAR_EXPR):在char_expr中返回字符的长度值,忽略尾空;
8)RIGHT(char_expr,int_expr):返回char_expr右边的int_expr个字符;
eg:select right(BDHM,4) FROM CK_CKXZ WHERE BDHM ='A220150316450000200001';
输出结果为:0001,
8)LEFT(char_expr,int_expr):返回char_expr左边的int_expr个字符;
8)REPLICATE(char_expr,int_expr):重复char_expr,int_expr次;
eg:select replicate(BDHM,2) FROM CK_CKXZ WHERE BDHM ='A220150316450000200001';
输出结果为:两遍表单号码
8)STUFF(expr1,start,length,expr2):用expr2代替epxr1中start起始长为length的字符串;
eg:select stuff(BDHM,2,3,'AAA') FROM CK_CKXZ WHERE BDHM ='A220150316450000200001';
输出结果为:AAAA150316450000200001
8)REVERSE(char_expr):反写char_expr中的文本;
eg:select REVERSE(BDHM) FROM CK_CKXZ WHERE BDHM ='A220150316450000200001';
输出结果为表单号码的倒排序
8)LTRIM(char_expr):删除头空;
8)RTRIM(char_expr):删除尾空;
8)STR(float_expr[,length[,decimal]]):进行数值型到字符型转换;
8)PATINDEX("%pattern%",expression):返回指定样式的开始位置,否则为0;
8)NULLIF(exp1,exp1):比较两个表达式,如果相等则返回null值,否则返回exp1
eg:select nullif('a2','a3') from dual ;反馈结果为a2
8)NUMBER(*):返回序号,相当于ORACLE的rowid,但有区别;
其他函数
8)RANK() OVER(PARTITION BY .. ORDER BY ..) 分组分析函数,相同的ORDER BY值,返回顺序值一样,且PARTITION BY 只支持一个字段或一个字段组(需多个字段分组的则要用 || 拼为一个字段(待确认))
8)返回可读的 全局ID UUIDTOSTR(NEWID())
8)COL_LENGTH(tab_name,col_name):返回定义的列长度;兼容性:IQ&ASE
8)LENGTH(exp):返回exp的长度;兼容性:IQ
转换函数
8)CONVERT(datetype,exp[,format-style]):字符

转日期型 或DATE(exp);兼容性:IQ&ASE
format-style值 输出:
112 yyyymmdd
120 yyyy-mm-dd hh:nn:ss
SELECT CONVERT(date,'20101231',112),CONVERT(varchar(10),getdate(),120) ;
--结果
2010-12-31 2011-04-07
8)CAST(exp AS data-type):返回转换为提供的数据类型的表达式的值; 兼容性:IQ
日期函数
8)DAY(date_exp):返回日期天值,DAYS(date_exp,int):返回日期date_exp加int后的日期;MONTH与MONTHS、YEAR与YEARS同理;
8)DATE(exp):将表达式转换为日期,并删除任何小时、分钟或秒;兼容性:IQ
8)DATEPART(date-part,date-exp): 返回日期分量的对应值(整数);
8)GETDATE():返回系统时间;
8)DATENAME(datepart,date_expr):以字符串形式返回date_expr指定部分的值,转换成合适的名字;
8)DATEDIFF(datepart,date_expr1,date_expr2):返回date_expr2-date_expr1,通过指定的datepart度量;
8)DATEADD(date-part,num-exp,date-exp):返回按指定date-part分量加num-exp值后生成的date-exp值;兼容性:IQ&ASE
date-part日期分量代表值:
缩写 值
YY 0001-9999
QQ 1-4
MM 1-12
WK 1-54
DD 1-31
DY 1--366
DW 1-7(周日-周六)
HH 0-23
MI 0-59
SS 0-59
MS 0-999
数值函数
8)CEIL(num-exp):返回大于或等于指定表达式的最小整数;兼容性:IQ&ASE;
8)FLOOR(numeric_expr):返回小于或等于指定值的最大整数;
8)ABS(num-exp):返回数值表达式的绝对值;兼容性:IQ&ASE;
8)TRUNCNUM(1231.1251,2):截取数值;不四舍五入;
8)ROUND(numeric_expr,int_expr):把数值表达式圆整到int_expr指定的精度;
8)RAND([int_expr]):返回0-1之间的随机浮点数,可指定基值;
8)SIGN(int_expr):返回正+1,零0或负-1;
8)SQRT(float_expr):返回指定值的平方根;
8)PI():返回常数3.1415926;
8)POWER(numeric_expr,power):返回numeric_expr的值给power的幂;
8)EXP(float_expr):给出指定值的指数值;

==================================常用DDL语句===========================================
Sybase中DDL语句不能修改字段的数据类型,只能修改空与非空:
1.删除列:
ALTER TABLE table_name DELETE column_name;
2.增加列:
ALTER TABLE table_name ADD (column_name DATA_TYPE [NOT] NULL);
3.修改列的空与非空:
ALTER TABLE table_name MODIFY column_name [NOT] NULL;
4.修改列名:
ALTER TABLE table_name RENAME old_column_name TO new_column_name;
5.快速建立临时表:
SELECT * INTO [#]table_name FROM .....;
6、修改表名:
ALTER TABLE old_table_name RENAME new_table_name
7.增加主键约束:
ALTER TABLE tb_name ADD CONSTRAINT pk_name PRIMARY KEY(col_name,..)
8.删除主键约束:
ALTER TABLE tb_name DROP CONSTRAINT pk_name;
9.建立自增长字段,与Oracle的SEQUENCE类似:
CREATE TABLE TMP_001 (RES_ID INTEGER IDENTITY NOT NULL);
10.添加表注释:
COMMENT ON TABLE table_name IS '....';
11.创建索引:
CREATE INDEX index_name ON t

able_name(column_name);




添加、删除主键和索引

//
//alter table dbo.CK_CKXZ add constraint PK_CK_CKXZ primary key nonclustered (BDHM) ;
create nonclustered index IND_CK_CKXZ_XZDWDM on dbo.CK_CKXZ (XZDWDM ) ;

//alter table CK_CKXZ DROP CONSTRAINT PK_CK_CKXZ ;
//drop index CK_CKXZ.IND_CK_CKXZ_XZDWDM ;







触发器

Create Trigger
触发器名称



On
表名
&&
指定所创建的触发器与某个已存在的表关联。



For

Insert, Delete, Update

&&
指定触发器的类型
(
即插入,删除,更新或它们的任意
组合
)


As


SQL
语句
&&
指定触发器的触发条件或动作



“触发器名称”的格式如
trg-

d


i


u

-xxxxx,
其中
d
表示一个删除类型的触发器,
i
表示一个插入类型的触发器,
u
表示一个更新类型的触发器,
xxxxx
表示触发器所作用的表
的名称。



触发器与触发它的
SQL
语句是作为同一个事件来执行的,因而这里的“
SQL
语句”不能
是任意的
SQL
语句。如果有多个对同一个表进行同一类型操作的触发器,那么新的触发器
将会自动替代旧的触发器。一个触发器只能用于一个表,而一个表可以有最多三个触发器。
只能在当前的数据库中创建触发器,而且对于临时表或者视图不能创建触发器。


create trigger
fordelete_buss

on tma_buss
for delete
as
begin


delete from tma_group2ne where exists


(select * from deleted where buss_id=tma_group2ne.buss_id)
end


CREATE TABLE test (


a
smallint not null,


b

varchar(100) not null,



c
smallint not null
)

sybase
数据库

自增长序列变手动插入

SET IDENTITY_INSERT
表名

ON/OFF

查找外键名称

SELECT USER_NAME(O.uid),OBJECT_NAME(C.tableid),OBJECT_NAME(C.constrid)
FROM sysconstraints C,sysobjects O
WHERE C.constrid=O.id AND C.status=64

ORDER BY USER_NAME(O.uid),OBJECT_NAME(C.tableid),OBJECT_NAME(C.constrid)
删除外键

alter table topo_role drop CONSTRAINT topo_role_1360004845
创建外键
:

alter table topo_user2id add FOREIGN KEY(user_id) REFERENCES topo_user(user_id)

增加一列:

alter table
表名

add
列名

列的类型

修改表中列的默认值
:
alter table
表名

replace
列名

default
默认值

修改表中列的类型
:
alter table
表名

modify
列名

列的类型

修改表名

sp_rename
旧表名
,
新表名

修改表列名

sp_rename '
表名
.
列名
','
新的列名
','column'

添加表非空列

alter table
表名

add
列名

属性

default '' not null
删除表列

alter table
表名

drop
列名



添加删除主键约束

--
删除约束

alter ta

ble
表名

drop constraint
约束
id
--
添加主键约束

alter table
表名

add constraint
主键约束
id primary key(
字段
1,
字段
2,...)
添加
,
删除索引

create index index_name_1 on table_name (id)
drop index table_name.index_name
CREATE UNIQUE INDEX topo_user_index ON topo_user(username)

唯一索引











SELECT CASE X-FIELD
WHEN X-FIELD < 40 THEN 'X-FIELD 小于 40'
WHEN X-FIELD < 50 THEN 'X-FIELD 小于 50'
WHEN X-FIELD < 60 THEN 'X-FIELD 小于 60'
ELSE 'UNBEKNOWN'
END
FROM DUAL



相关主题
文本预览
相关文档 最新文档