下面通过实例来对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
本文关键:sybase基础知识(3)
本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)
| |