下面通过实例来对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_开头;?/span> |
|