分享
 
 
 

sybase基础知识(3)

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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.使用游标

一个应用程序可以使用两种类型的游标:前端(客户)游标和后端(服务器)游标,它们是两个不同的概念。

无论使用哪一种游标,都需要经过如下几个步骤:

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有