总结Sybase IQ的使用心得

yu15tian 2012-02-08 04:50:41
加精
现在项目组使用的数据库是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个字符;
    7)REPLACE(o-exp,search-exp,replace-exp):从o-exp搜索search-exp,替换为replace-exp;
    8)SPACE(int_exp):返回int个空格;
    8)UPPER(exp):转为大写字母,等价于UCASE(exp);
    8)LOWER(exp):转为小写字母,
    8)CHARINDEX(exp1,exp2):返回exp2字符串中exp1的位置!定位,exp1 查找的字符,exp2 被查找的字符串;
    8)DATALENGTH(CHAR_EXPR):在char_expr中返回字符的长度值,忽略尾空;
    8)RIGHT(char_expr,int_expr):返回char_expr右边的int_expr个字符;
    8)LEFT(char_expr,int_expr):返回char_expr左边的int_expr个字符;
    8)REPLICATE(char_expr,int_expr):重复char_expr,int_expr次;
    8)STUFF(expr1,start,length,expr2):用expr2代替epxr1中start起始长为length的字符串;
    8)REVERSE(char_expr):反写char_expr中的文本;
    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
    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 table_name(column_name);
...全文
10678 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
很好,很有用
weialee 2014-02-12
  • 打赏
  • 举报
回复
很不错,感谢~
yzyzcao 2013-02-21
  • 打赏
  • 举报
回复
谢谢楼主,谢谢楼主!!!!!
zouhu 2012-07-07
  • 打赏
  • 举报
回复
性能不行
coolmaker02 2012-04-17
  • 打赏
  • 举报
回复
最近开发用到sybaseIQ,谢谢分享
xiaocongzhi 2012-02-24
  • 打赏
  • 举报
回复
收藏下来,有空探索下Sybase
blackkettle 2012-02-23
  • 打赏
  • 举报
回复
Sybase 没用过哎。

顶一下
ijwsoft 2012-02-21
  • 打赏
  • 举报
回复
收藏下先,说不定以后维护别的老项目会用到!
谢谢分享,辛苦了!
cd_gaojun 2012-02-20
  • 打赏
  • 举报
回复
不错 学习到不少东西
richardstar 2012-02-20
  • 打赏
  • 举报
回复
太牛了,学习下
flflflflfls 2012-02-19
  • 打赏
  • 举报
回复
不知道 Sybase IQ这么软件
willweiwei 2012-02-16
  • 打赏
  • 举报
回复
整体都是一样的,差别都是细微的差别
lanhean 2012-02-16
  • 打赏
  • 举报
回复
感谢分享
sharon8259 2012-02-16
  • 打赏
  • 举报
回复
很不错的总结,sybase暂时没怎么用,先收藏了再说!谢谢LZ的分享!
lianshangnidec 2012-02-15
  • 打赏
  • 举报
回复
http://blog.csdn.net/lianshangnidec
路过看看,望大家互踩
sybasebbs 2012-02-15
  • 打赏
  • 举报
回复
IQ是列存储,好像一般用于PB级别的数据处理。几个G的数据的都不好意思用
soloyear 2012-02-14
  • 打赏
  • 举报
回复
<a target='_blank' href='http://www.googlermb.com/?soloyear'><img border='0' src='http://www.googlermb.com/image/ad/728_90_1.gif' alt='http://www.googlermb.com广告任务网'></a>
bancxc 2012-02-14
  • 打赏
  • 举报
回复
想问一下sybase iq 跟oracle 相比效率咋样
fan798304 2012-02-14
  • 打赏
  • 举报
回复
木有过。。。啦啦啦
hao603324 2012-02-14
  • 打赏
  • 举报
回复
感謝分享,沒用過IQ
加载更多回复(6)
PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES,现在已经更名为PostgreSQL. PostgreSQL支持大部分SQL标准并且提供了许多其它现代特性:复杂查询、外键、触发器、视图、事务完整性等。 PostgreSQL 是一个免费的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一种选择。 事实上, PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统(MVCC)、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。 Inprise 的 InterBase 以及SAP等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。最后,PostgreSQL拥有一支非常活跃的开发队伍,而且在许多黑客的努力下,PostgreSQL 的质量日益提高。从技术角度来讲,PostgreSQL 采用的是比较经典的C/S(client/server)结构,也就是一个客户端对应一个服务器端守护进程的模式,这个守护进程分析客户端来的查询请求,生成规划树,进行数据检索并最终把结果格式化输出后返回给客户端。为了便于客户端的程序的编写,由数据库服务器提供了统一的客户端 C 接口。而不同的客户端接口都是源自这个 C 接口,比如ODBC,JDBC,Python,Perl,Tcl,C/C++,ESQL等, 同时也要指出的是,PostgreSQL 对接口的支持也是非常丰富的,几乎支持所有类型的数据库客户端接口。这一点也可以说是 PostgreSQL 一大优点。 本课程作为PostgreSQL数据库管理之三,主要讲解以下内容:1.     PostgreSQL约束讲解和剖析2.     PostgreSQL数据类型3.     PostgreSQL的结构管理4.     PostgreSQL条件表达式和操作5.     PostgreSQL使用小技巧

2,596

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧