zoukankan      html  css  js  c++  java
  • Sybase 常用SQL

    添加、删除、修改使用db.Execute(Sql)命令执行操作 

    ╔--------------------╗ 
    ☆ 数据记录筛选 ☆ 
    ╚--------------------╝ 
    注意:单双引号的用法可能有误(没有测式) 

    Sql = "Select Distinct 字段名 From 数据表" 
    Distinct函数,查询数据库存表内不重复的记录 

    Sql = "Select Count(*) From 数据表 where 字段名1>#18:0:0# and 字段名1< #19:00# " 
    count函数,查询数库表内有多少条记录,“字段名1”是指同一字段 
    例: 
    set rs=conn.execute("select count(id) as idnum from news") 
    response.write rs("idnum") 

    sql="select * from 数据表 where 字段名 between 值1 and 值2" 
    Sql="select * from 数据表 where 字段名 between #2003-8-10# and #2003-8-12#" 
    在日期类数值为2003-8-10 19:55:08 的字段里查找2003-8-10至2003-8-12的所有记录,而不管是几点几分。 

    select * from tb_name where datetime between #2003-8-10# and #2003-8-12# 
    字段里面的数据格式为:2003-8-10 19:55:08,通过sql查出2003-8-10至2003-8-12的所有纪录,而不管是几点几分。 

    Sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]" 

    Sql="select * from 数据表 where 字段名 like '%字段值%' order by 字段名 [desc]" 
    模糊查询 

    Sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]" 
    查找数据库中前10记录 

    Sql="select top n * form 数据表 order by newid()" 
    随机取出数据库中的若干条记录的方法 
    top n,n就是要取出的记录数 

    Sql="select * from 数据表 where 字段名 in ('值1','值2','值3')" 

    ╔--------------------╗ 
    ☆ 添加数据记录 ☆ 
    ╚--------------------╝ 
    sql="insert into 数据表 (字段1,字段2,字段3 …) valuess (值1,值2,值3 …)" 

    sql="insert into 数据表 valuess (值1,值2,值3 …)" 
    不指定具体字段名表示将按照数据表中字段的顺序,依次添加 

    sql="insert into 目标数据表 select * from 源数据表" 
    把源数据表的记录添加到目标数据表 

    ╔--------------------╗ 
    ☆ 更新数据记录 ☆ 
    ╚--------------------╝ 
    Sql="update 数据表 set 字段名=字段值 where 条件表达式" 

    Sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式" 

    Sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n " 
    没有条件则更新整个数据表中的指定字段值 

    ╔--------------------╗ 
    ☆ 删除数据记录 ☆ 
    ╚--------------------╝ 
    Sql="delete from 数据表 where 条件表达式" 

    Sql="delete from 数据表" 
    没有条件将删除数据表中所有记录) 

    ╔--------------------------╗ 
    ☆ 数据记录统计函数 ☆ 
    ╚--------------------------╝ 
    AVG(字段名) 得出一个表格栏平均值 
    COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计 
    MAX(字段名) 取得一个表格栏最大的值 
    MIN(字段名) 取得一个表格栏最小的值 
    SUM(字段名) 把数据栏的值相加 

    引用以上函数的方法: 
    sql="select sum(字段名) as 别名 from 数据表 where 条件表达式" 
    set rs=conn.excute(sql) 
    用 rs("别名") 获取统的计值,其它函数运用同上。 

    ╔-----------------------------╗ 
    ☆ 数据表的建立和删除 ☆ 
    ╚-----------------------------╝ 
    CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… ) 
    例:CREATE TABLE tab01(name varchar(50),datetime default now()) 
    DROP TABLE 数据表名称 (永久性删除一个数据表) 

    ╔--------------------------╗ 
    ☆ 记录集对象的方法 ☆ 
    ╚--------------------------╝ 
    rs.movenext 将记录指针从当前的位置向下移一行 
    rs.moveprevious 将记录指针从当前的位置向上移一行 
    rs.movefirst 将记录指针移到数据表第一行 
    rs.movelast 将记录指针移到数据表最后一行 
    rs.absoluteposition=N 将记录指针移到数据表第N行 
    rs.absolutepage=N 将记录指针移到第N页的第一行 
    rs.pagesize=N 设置每页为N条记录 
    rs.pagecount 根据 pagesize 的设置返回总页数 
    rs.recordcount 返回记录总数 
    rs.bof 返回记录指针是否超出数据表首端,true表示是,false为否 
    rs.eof 返回记录指针是否超出数据表末端,true表示是,false为否 
    rs.delete 删除当前记录,但记录指针不会向下移动 
    rs.addnew 添加记录到数据表末端 
    rs.update 更新数据表记录

    14.查询数据库死进程
    select * from master..syslogshold

    sybase ase中没有类似mysq的 insert into table values(xxxx) (xxxxx) 那样的语法。

    sybase向一个表使用insert into 插入数据的时候,有2种方式:

    一、insert into table select from另外的表 ---- 这种方式根据你写的select语句,可以一次插入多条记录。

    二、insert into table values(......) --- 这种方式没插入一条记录,必须写一次 insert into values(...) 语句。

    你可以在执行go之前提供多个insert into values(...)语句,这样可以实现你说的一次插入多条记录:比如:

    1>insert into t values(1,'a')

    2>insert into t values(2,'b')

    3>insert into t values(3,'c')

    4>go

    另外在ASE15.x版本的isql工具中,你可以使用:1> insert into t values(1,'a')2> go 10实现一次插入10条相同的记录!

    错误提示:implict conversion from datatype 'int' to 'char' is。。。

    一般是插入值与其对应的数据类型不匹配

    http://blog.chinaunix.net/uid-200142-id-3073894.html

    ===========================使用总结======================================
    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);

  • 相关阅读:
    简单实现vue列表点击某个高亮显示
    vue中子组件直接修改父组件prop属性bug
    Java基础——关于接口和抽象类的几道练习题
    Eclipse中导入外部jar包步骤
    Java基础——关于jar包的知识
    Java基础——关于访问权限的一道例题
    Java基础——抽象类和接口
    Java基础——多态
    Java基础——继承
    三个案例,解读静态代码块和构造代码块
  • 原文地址:https://www.cnblogs.com/IDRI/p/6113755.html
Copyright © 2011-2022 走看看