sybase基础知识(3)

类别:编程语言 点击:0 评论:0 推荐:
sybase基础知识 [ 作者:陈苏文    转贴自:http://www.chinaunix.net    点击数:9525    文章录入:sdccf ] 下面通过实例来对Select的通常用法加以介绍。
例1:选择所有的列,语法为select * from table_list
如:select * from publishers
例2:选择指定的列,语法为
select column_name[,column_name]…
from table_name
如:select pub_id,pub_name from publishers
例3:重命名查询结果中的列,语法为
select column_heading= column_name
from table_name
如:select Publisher=pub_name,pub_id
from publishers
例4:select列表中的计算值,可以对select列表中的数值数据进行计算,下面列出了算术运算符。

符号运算
+加
-减
/除
*乘
%取模
如select title_id,total_sales,total_sales*2 from titles
例5:使用distinct消除重复的查询结果
可选的关键词消除select语句的结果中的重复行。若不指定distinct,缺省值为all,将检索出包含重复行的所有行数据。
如:select distinct au_id from titleauthor
例6:选择行——where语句
select语句中的确切指定要检索哪些行的准则,其一般格式为:
select select_list from table_list where search_conditions
where子句中的搜索条件(或称限制)包括:
·比较运算符(=,<,>,!=等=
如:where advance*2>total_sales*price
·范围(between和not between)
如:where total_sales between 5000 and 10000
·列表(in和not in)
如:where state in(“CA”,”IN”,”MD”)
·匹配字符(like和not like)
如:where phone like “0535%”
·未知值(is null和is not null)
如:where advance is null
·以上各项的组合(and, or)
如:where advance<5000 or total_sales between 500 and 1000
例7:用集合函数小结查询结果
集合函数用特定列的数据来计算小结值。
集合函数结 果
Sum([all|distinct]expression)数值列中(不重复)值的总和
Avg([all|distinct]expression)数值列中(不重复)值的平均
count([all|distinct]expression)列中(不重复)非空值的数目
Count(*)选定的行数
Max(expression)Expression的最大值
Min(expression)Expression的最小值
如:select avg(advance),sum(total_sales)
from titles
where type=”as”
select count(*) from titles
select avg(distinct price) from titles
select max(price) from books
例8:分组组织查询结果——group by 子句
group by 子句用在select语句中将一张表分成若干组。
如:select type, advance from titles group by type
例9:选择分组数据——having子句
having为group by 子句设置条件,与where为select语句设置条件一样。Having搜索条件与where相同,但having可包括集合函数,而where不能包括。
下列语句使用带集合函数having子句的例子。它把title表中的行按类型分组,但去掉了那只包含一本书的分组。
Select type from titles group by type having count(*)>1
下面是一个不带集合函数的having子句的例子。它把title表中的行按类型分组,但去掉了那些不以字母“p”开头的类型。
Select type from titles group by type having type like “p%”
例10:查询结果排序——order by子句
Order by子句允许按一列或多列对查询结果排序。每个排序可以是升序的(asc)或降序的(desc)。若不特别指明,则按升序进行。下列查询返回按pub_id排序的结果:
Select pub_id,type,title_id from titles order by pub_id
例11:连接——从多张表中检索数据
连接两张或两张以上的表是这样一个过程:比较指定字段中的数据,根据比较结果用符合条件的行组成一张新表。
举例:
select publishers.pub_id,publishers.pub_name,authors.*
from publishers,authors
where publishers.city=authors.city
例12:分组计算子句
Compute是Sybase对SQL标准中Group子句的扩充,可以将其看作带聚集计算的Group子句。例如:
Select type,price,advance
From titles
Order by type
Compute sum(price),sum(advance) by type
2.Insert语句
用Insert命令向数据库中添加行有两种方法:使用关键词values或使用select语句。
Insert语句的基本语法为:
Insert[into]表名[(字段列表)]
{values(值列表)|select_statement}
举例:insert into publishers
values(‘1622’,’Jardin,Inc.’,’Camden’,’NJ’)
Insert into publishers(pub_id,pub_name)
values(‘1756’,’The Health Center’)
Insert authors select * from newauthors
Insert authors(au_id,address,au_lname,au_fname)
Select * from newauthors
3.Delect语句
Delect可以对一行或多行进行操作。
Delect语句的基本语法为:
Delect 表名
[from 表名列表]
[where条件表达式]
举例:Delect publishers
where pub_name=”Jardin,Inc.”
Delect titles
From authors, titles
Where titles.title_id=authors.title_id
4.Update语句
可以使用Update命令来改动表中的单个行、一组行或所有行。
Update语句的基本语法为:
Update表名
Set column_name1={expression1|null|(select_statement)}
[,column_name2={expression2|null|(select_statement)}]
[……]
[from 表名列表]
[where 条件表达式]
举例:
update authors set_au_lname=”Health”,aufname=”Goodbody”
where au_lname=”Bloth”
update titles
set total_sales=total_sales + qty
from titles,sales
where titles.title_id=sales.title_id
六、Sybase预定义函数
1.聚集函数
sum([all|distinct]表达式)
avg([all|distinct]表达式)
count([all|distinct]表达式)
count(*)
max(表达式)
min(表达式)
2.字符串函数
upper(字符表达式)
lower(字符表达式)
char(整型表达式)
char_length(字符表达式)
ltrim(字符表达式)
rtrim(字符表达式)
……
3.数学函数
abs(精确小数型表达式)
floor(精确小数型表达式)求小于或等于给定表达式值的最大整数(取底)
rand([整数型]
round(精确小数型表达式,整数)
sign(精确小数型表达式)
power(精确小数型表达式,整数幂)
……
4.日期函数
getdate()
datepart(日期部分,日期)
datediff(日期部分,日期1,日期2)
dateadd(日期部分,数值表达式,日期)
5.类型转换函数
convert(数据类型,表达式[,格式])
6.系统函数
db_name([数据库ID])
host_name()
isnull(表达式1,表达式2)
……
七、数据控制语言
用来控制数据的安全性,如权限控制语句GRANT和REVOKE等。


第七讲 数据库编程基础

一、批处理
SQL Server可以处理作为一批而提交的多个SQL语句,既可以是交互式的,也可以是一个文件。批处理SQL语句由批结束标志终止,该标志指示SQL Server从前面开始执行该批处理语句,对于独立的SQL实用程序isql而言,其批结束标志为单独占一行的“go”。
举例:选择表title及表authors的行数
select count(*) from titles
select count(*) from authors
go
二、流程控制语言
1.变量声明与赋值
全局变量由系统预定义,以符号@@打头。
局部变量声明使用Declare语句,这个变量必须以符号@开头,后跟一个标识符。
Declare @变量名 数据类型[,@变量名 数据类型,……]
变量赋值使用Select语句,未赋值的变量其值为Null。
举例:
Declare @msg char(50)
Select @msg=’How are you?’
Select @msg=emp_name from employee
Where emp_id=12345678
2.SQL语句块
Begin
Statement Block/*多个顺序执行的SQL 语句*/
End
3.条件语句
If 条件表达式
语句(块)
Else
语句(块)
举例:
if(select max(id) from sysobjects)<50
print ‘数据库里没有用户创建的对象‘
else
select name,type,id from sysobjects where id>50
4.循环语句
While 条件表达式
语句(块)
●两个特殊的循环控制语句:
Continue 执行下一次循环
Break 退出当前循环
举例:
While(select avg(price) from titles)>$20
Begin
Update titles set price=price/2
If(select avg(price) from titles)<$40
Break
Else
Continue
End
5.其它控制语句
◇Return语句——无条件结束当前过程,并可返回给调用者的一个状态值:Return[整数表达式]
◇Print语句
◇RaiseError语句
◇Waitfor语句
三、存储过程
存储过程是存储在服务器端的一类数据库对象,它实质上是一段用SQL语言编写的程序,它在服务器端预先经过编译,并确定出执行计划,因此与同样功能的批处理语句相比,它的执行速度较快。
基本语法:
Create Procedure[owner.]过程名
[@参数名 数据类型[=默认值][Output]]
[,@参数名 数据类型[=默认值][Output]]
[……]
AS
Begin
SQL语句(块)
End
存储过程是数据库对象,和表、索引是一个级别的;是SQL语句和控制流语言的集合,存储过程在首次运行时被编译,并驻留在过程高速缓存的内存中,所以存储过程的招待非常快。存储过程可以带参数,可以调用其他过程,返回状态值,返回参数值,并且可以在远程SQL Server执行。可以在远程SQL Server执行对数据库设计有特别重要的意义。SQL Server提供的存储过程称为系统过程。
存储过程大大增强了SQL的能力、效率和灵活性,经过编译的存储过程极大地改善SQL语句和批处理的性能。
存储过程有很多优点:
●存储过程在第一次执行时编译,并存储在过程高速缓存的内存中。编译时系统对其进行优化,以选择最佳的路径来访问数据集中的数据,这种优化考虑了数据集的实际数据结构。因此存储过程大大提高了系统的性能。
●存储过程可以跨服务器运行。这一点是通过触发器来实现的,当然,首先存储过程要能登录到该远程服务器。
●应用程序也能执行存储过程,从而实现服务器和客户之间的协同作业。
●存储过程减少了网络的交通。这是因为存储过程的文本存储在数据库里,调用存储过程时通过网络的只是存储过程的过程名。
●利用存储过程可以提供一个附加的安全层。
如(该例子取自pubs2数据库):
Create proc titleid_proc(@title_id varchar(80))
As
Begin
Select @title_id=lower(@title_id)+”%”
Select title,title_id,price
Form titles
Where lower(title_id) like @title_id
Return @@rowcount
End
注意例子中的黑体部分,这实际上是一条赋值语句。该存储过程有返回值。
存储过程可以变得非常复杂。我们认为,创建存储过程还是要遵循“最简单就是最好”的原则。建议在创建存储过程时采用缩进风格,否则创建的存储过程三天之后连自己都看不懂。
需要对存储过程作些说明:
●Create procedure 语句不能和其他语句在同一个批命令里。
●Create procedure 语句不能包括下列语句:
use
Create View
Create default
Create rule
Create trigger
Create procedure
不能使用use语句好理解,存储过程是针对数据库的,不能在一个数据库里访问另外的数据库。如果在存储过程里访问另外的数据库,则数据库表的参照完整性难于得到保障。
从另外几条语句看,在存储过程里一般不能创建新的数据库对象。但可以创建表和索引,以及和表相关联的键,表是临时表,在存储过程结束后不能看见创建的临时表;否则的话每运行一次存储过程就创建一个表,结果可想而知。
存储过程里不能创建一个对象,删除它;然后又在同一存储过程里用相同的名字创建新的对象。实际上,SQL Server在存储过程运行时而不是在编译时创建对象的。
●如果存储过程调用另外的存储过程,则第二个存储过程可以调用在第一个存储过程里创建的对象。
●存储过程包含的最多参数为255个,对存储过程里的局部和全局变量没有限制。
最后讨论一下系统存储过程。系统存储过程以sp_开头,当然用户创建的存储过程也可以以sp_开头;系统过程保存在sybsystemprocs数据库里。系统过程的使用有权限,如果打入系统过程名但没有出现预期的结果,要么是命令名错,要么是使用者没有该过程的权限。一般可通过系统管理员或数据库所有者对系统过程的execute授权。
系统过程繁多,大致有几类:
a. 用户标志和授权。这一类的过程主要由于:增加、删除或报告在SQL Server上的登录,增加、删除或报告某数据库的用户、分组或别名等。这类过程有sp_addlogin,sp_adduser,sp_helpgroup,sp_dropuser等。
b. 远程过程的调用。这类过程用于:增加、删除或报告能存取本SQL Server的远程服务器;增加能从远程服务器上存取本SQL Server的用户名。这类过程有:sp_addremotelogin,sp_addserver,sp_dropserver等。
c. 数据定义和数据库对象。这类存储过程用于:连接和定义规则和缺省值,增加、删除或报告主码、外码和公共码;增加、删除或报告用户定义的数据类型。这类存储过程有:sp_bindfault, sp_bindrule, sp_help, sp_helpdb, sp_foreignkey, sp_helptext等。
d. 系统管理。这类存储过程用于:增加、删除或报告数据库及转储设备;报告锁;设置的数据库选择及用户正进行的进程;修改及报告配置变量;监控SQL Server的活动。这类过程有:sp_addumpdevice,sp_dropdevice, sp_helpdevice等。
四、触发器
触发器是一种用来保障参照完整性的特殊的存储过程,它维护不同表中数据间关系的有关规则。当对指定的表进行某种特定操作(如:Insert,Delete或Update)时,触发器产生作用。触发器可以调用存储过程。
创建触发器的语法:
Create Trigger[owner.]触发器名
On [owner.]表名
For {insert,update,delete}
As
Begin
SQL语句(块)
End
定义一个好的触发器对简化数据的管理,保证数据库的安全都有重要的影响。触发器是针对表一级的,这就意味着,只有表的所有者有权创建表的触发器。
举例:
插入一个新行,必须保证外键与主键相匹配,触发器应该首先检查被插入行与主键表的连接。
以下的触发器对inserted表和titles表的title_id进行比较,这里假设正在给外键输入数据,没有插入空值,若连接失败,事务被回退。insert,update,delete
Create trigger forinsertrigl
On salesdetail
For insert
As
If(select count(*)
From title,inserted
Where titles.title_id=inserted.title_id)!=@@rowcount
Begin
Rollback transaction
Print “No,some title_id does not exist in titles.”
End
Else
Print “Added! All the title_id is exist in titles.”
在本例中,@@rowcount代表添加到salesdetail表的行数,这也是添加到inserted表中的行数。通过连接表titles和表inserted来检测所有添加到salesdetail的title_id是否在titles中存在。若所连接的行数(count(*))与@@rowcount不同,由有一个或多个插入不正确,整个事务被取消。
触发器的限制:
●一个表最多只能有三个触发器,insert,update,delete
●每个触发器只能用于一个表
●不能对视图、临时表创建触发器
●Truncate table能删除表,但不能触发触发器
●不能将触发器用于系统表
合理地使用触发器对性能的影响是正面的。在设计和使用触发器时,经常地用sp_depends命令了解对象所关联的触发器是有好处的,该命令能列出触发器影响的所有对象、表和视等。
在定义几类数据库对象的时候,对存储过程、索引和触发器要给予特别的注意,尤其存储过程,它设计的好坏对数据库性能的影响很大。
说明:Sybase触发器使用的两个测试表:Deleted表和Inserted表,它们都是临时表,其结构与触发器的基表结构相同,用来存放与修改相关的数据行。
五、游标
1.游标的概念
游标是指向查询结果集的一个指针,它是一个通过定义语句与一条Select语句相关联的一组SQL语句。游标包含两方面的内容:
●游标结果集:执行其中的Select语句所得到的结果集;
●游标位置:一个指向游标结果集内的某一条记录的指针
利用游标可以单独操纵结果集中的每一行。游标在定义以后存在两种状态:关闭和打开。当游标关闭时,其查询结果集不存在;只有当游标打开时,才能按行读取或修改结果集中的数据。
2.使用游标
一个应用程序可以使用两种类型的游标:前端(客户)游标和后端(服务器)游标,它们是两个不同的概念。
无论使用哪一种游标,都需要经过如下几个步骤:

本文地址:http://com.8s8s.com/it/it23638.htm