SQL Server 2008 T-SQL语句总结_第1页
SQL Server 2008 T-SQL语句总结_第2页
SQL Server 2008 T-SQL语句总结_第3页
SQL Server 2008 T-SQL语句总结_第4页
SQL Server 2008 T-SQL语句总结_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、SQL Server 2008中T-SQL语句操作总结-【创建数据库】-(1)一个数据文件、一个日志文件create database db1on(name=RShDB_Data,    -数据库文件的逻辑名称filename='D:RShDB_Data.mdf', -数据库文件的物理名称(带路径)size=10MB,  -初始大小maxsize=30MB,   -最大大小filegrowth=5MB  -自增长大小)log on   (name=RShDB_Log,filena

2、me='D:RShDB_Log.ldf',size=3MB,maxsize=12MB,filegrowth=2MB)(2)多个数据文件、多个日志文件create database studentson primary(name=students_data1,filename='D:students_data1.mdf',size=5MB,maxsize=unlimited),(name=students_data2,filename='D:students_data2.ndf',size=5MB,maxsize=20MB,filegrowth=2

3、MB)log on(name=students_log1,filename='D:students_log1.ldf',size=2MB,maxsize=6MB,filegrowth=10%),(name=students_log2,filename='D:students_log2.ldf',size=3MB,maxsize=8MB,filegrowth=1MB)(3)创建具有文件组的数据库create database saleson primary(name=spri1_dat,filename='D:spri1_dat.mdf',size

4、=10,maxsize=50,filegrowth=10%),(name=spri2_dat,filename='D:spri2_dat.ndf',size=10,maxsize=50,filegrowth=15%),filegroup salesGroup1(name=SGrp1Fil_dat,filename='D:SGrp1Fil_dat.ndf',size=10,maxsize=50,filegrowth=5),(name=SGrp1Fi2_dat,filename='D:SGrp1Fi2_dat.ndf',size=10,maxsize

5、=50,filegrowth=5),filegroup salesGroup2(name=SGrp2Fi1_dat,filename='D:SGrp2Fi1_dat.ndf',size=10,maxsize=50,filegrowth=5),(name=SGrp2Fi2_dat,filename='D:SGrp2Fi2_dat.ndf',size=10,maxsize=50,filegrowth=5)log on(name=sales_log,filename='D:sales_log.ldf',size=5,maxsize=25,filegro

6、wth=5)总结:(i)先创建数据库文件,再创建日志文件,两者之间不需要逗号隔开,因为日志文件的创建是以log on开头,但是多个数据库文件(包括文件组)或在多个日志文件之间要用逗号隔开,(ii)create database语句中列出的第一个数据库文件将成为主要数据库文件,后缀名是mdf,其他的数据库文件均为次数据库文件,后缀名为ndf;日志文件的后缀名为ldf(iii)在指定涉及大小的参数时(如sizemaxsizefilegrowth)要注意的几点:单位:如果没有指定单位只是给出数字的话,那么默认单位就为MB,比较特殊的filegrowth还可以是百分数,表示增长按发生增长时文件大小的百

7、分比增长,总之大小不能超过maxsize就行;取值:(1)filegrowth=0说明不允许自增长;若没有指定filegrowth,那么对于数据文件来说默认都是1MB,而对于日志文件来说默认增长比例是10%,最小值为64KB;(2)maxsize不指定的话默认表示大小无限制,文件可以一直增大,直到磁盘空间满;maxsize=unlimited表示不限制增长,但这个是相对的,对于数据文件最大大小为16TB,对于日志文件最大大小为2TB;(3)size如果是在主数据库文件中未指定,那么默认使用model数据库中主数据库文件的大小,即使指定了那也不能小于model数据库中主数据库文件的大小,而在次数

8、据库文件和日志文件中默认为1MB(4)sizemaxsize都要是整数不能是小数 -【修改数据库】-(1)扩大数据库空间(之前创建数据库时没有设置自增长,那么时间久了会出现这样的情况)方法一:扩大已有的数据文件或日志文件alter database students modify file(name=students_data1,size=8MB   )实现了对数据库students下的主数据文件students_data1由原来的5MB增大到现在的8MB的过程方法二:为数据库添加新的数据文件或日志文件alter database studen

9、tsadd file(name=students_data3,filename='D:students_data3_ndf',size=6MB,filegrowth=0)alter database studentsadd log file(name=students_log3,filename='D:students_log3.ldf',size=3MB,maxsize=8MB,filegrowth=1MB)(2)收缩数据库空间(指的是释放数据库中未使用的空间)方法一:收缩整个数据库的大小DBCC shrinkdatabase(students,20)实现对数

10、据库students的收缩,是该数据库中所有文件都有20%的可用空间方法二:收缩指定文件的大小DBCC shrinkfile(students_data1,4)将students数据库中的students_data1文件收缩到4MB -【删除数据库文件或数据库】-(1)删除数据文件alter database students remove file students_data1(2)删除日志文件alter database students remove file students_Log1(3)删除整个数据库drop database students -【分离和附加数

11、据库】-实现数据库从一台数据库服务器转移到另一台数据库服务器,而不需要重新创建数据库的目的分离:是指将数据库从SQL Server实例中删除,但不删除数据库中的数据文件以及日志文件,这与删除数据库不同附加:与分离对应(1)分离students数据库,并跳过“更新统计信息”exec sp_detach_db 'students','true'(2)附加之前已经分离的students数据库create database students on(filename='F:students_data1.mdf') for attach(3)如果之前分离的数

12、据库中主数据库文件和次数据库文件以及日志文件不是在同一目录下create database students on(filename='F:students_data1.mdf'),(filename='F:students_data2.ndf'),(filename='F:students_Log1.ldf')for attach    use Test;-【Create】-创建一个学生表-create table student(sno char(9) primary key,sname ch

13、ar(20) unique,-(用户自定义完整性,还有not null、check)ssex char(2),sage smallint,sdept char(20),sxxx as (sage-2),-SQL Server支持”计算列“的创建check(ssex in('M','F') and sname not like 'Ms.%')-SQL中的字符、字符串都要用单引号;注意check约束的写法);注意:check约束只能实现同一个表中各列之间的取值约束,要实现更为复杂的check约束就要用到后面讲到的触发器了注意:在向含有计算列的表中执行

14、插入数据操作时候要注意如下insert into student values('10003','张网','F',20,'计科系');-插入成功(计算列不用管,因为它是系统自动计算出来的)insert into student(sno,sname,ssex,sage,sdept) values('10003','张网','F',20,'计科系');-效果同上insert into student(sno,sname,ssex,sage,sdept,sxxx) valu

15、es('10004','李丽','F',20,'计科系',12);-会报错,计算列不能认为指定值-创建”课程“表(参照表和被参照表可以是同一个表)-create table course(id int identity(1,1),-设置自增长,种子值为1,增量值为1即1、2、3、4.依此类推cno char(4) primary key,-(主码约束->实体完整性)cname char(40),cpno char(4),ccredit smallint not null check(ccredit>=0) defaul

16、t 0,-一个字段若有多个约束时要以“空格”隔开foreign key (cpno) references course(cno)-(外码约束->参照完整性)注意这里都要有括号,关键字是references而不是reference,而且后面没有from-);-建立选课表-create table sc(sno char(9),cno char(4),grade smallint,primary key (sno,cno),-主码由2个属性组成,所以要定义才表级完整性约束-foreign key (sno) references student(sno),-on delete cascad

17、e表示删除被参照表student表中的元组时,会级联删除该表中相应的元组(默认不写的情况下是no action即不级联操作)-on update cascade表示更新被参照表student表中的元组时,会级联更新该表中相应的元组(默认不写的情况下是no action即不级联操作)foreign key (cno) references course(cno)-on delete cascade同上-on update cascade同上);  -【Alter】-向student表中增加“入学时间列”,数据类型为日期-alter table student add s_en

18、trance date;-默认追加到末尾字段-将student表中“年龄”的数据类型修改为整数型(不管原来该字段的约束是什么,该句执行后产生的是覆盖的效果)-alter table student alter column sage int;-注意有2个alter-对course表中的“课程名”字段增加取值唯一的约束条件-alter table course add unique(cname);  -【Drop】-删除student表-drop table student;-如果同时删除多个表,中间用逗号隔开-执行该句会报错,因为该表正由一个 FOREIGN KEY 约束引

19、用(也就是说student表是主表,sc表是从表)。-所以要实现对该表的删除,有2中方法:(1)首先要删除该表上所有的约束依赖关系,然后再删除该表(2)先删除从表,然后再删除主表-测试例子-create table tt(id int primary key,name char(20) not null unique);create table aa(id int not null,name char(20),constraint c1 foreign key (id) references tt(id)on delete cascade );-DROP TABLE tt-报错失败-

20、(方法一)-DROP TABLE aa-成功(先删除从表)DROP TABLE tt-成功(后删除主表)以上2句等价于DROP TABLE aa,tt;-(方法二)将从表aa中对主表tt的外键约束删除,即可实现先对主表tt的删除,这种方法的前提是该外键约束是用"完整性约束子句"(constraint)来命名的才行,这样才能通过约束的名称来删除约束  Alter table aa DROP constraint c1;-删除外键约束DROP table tt;-成功  -测试例子结束-  -【Select】-1、单表

21、查询(略)2、查询经过计算的值(1)查询全体学生的姓名及出生年份select sname,(2012-sage) as birth_year from student;-含有算术表达式(2)查询姓名、出生年份、所在系名,并要求用小写字母表示所有系名select sname,'birth_year',2012-sage,LOWER(sdept);-含有字符串常量、函数3、消除取值重复的行select distinct sno from student;-注意关键字distinct的位置,一般都是紧跟select的4、含有where子句的条件查询(1)比较运算符(=、!=、>

22、、<、不大于!>、不小于!<、>=、<=)(这种情况,为避免扫描全表,可以考虑建立索引)select sname from student where sdept='CS'(2)范围相关(between.and.和not between.and.)select sname,sdept,sage from student where sage between 20 and 30;(3)集合相关(in和not in)select sname,ssex from student where sdept in ('CS','MA&#

23、39;);-注意用单引号,逗号隔开(4)字符匹配(like和not like;和通配符下划线_、百分号%、方括号一起使用)SQL通配符: SQL 通配符必须与like或者not like运算符一起使用。(a)% 替代一个或多个字符 (b)_ 仅替代一个字符 (c)charlist 字符列中的任何单一字符 (d)charlist 或者 !charlist 不在字符列中的任何(i)下划线代表单个字符;百分号代表任意长度的字符串(包括长度为0的);方括号是排列通配符,用于匹配其中的任意一个字符,如1-9匹配1-9的数字,xy用于匹配x或者yselect sname,sn

24、o,ssex from student where sname like '刘%'select sname,sno,ssex from student where sname like '刘_'-注意这里有2个下划线,因为一个汉字要占2个字符位置select sname,sno,ssex from student where sname like '_阳%'-查询名字中第二个字为“阳”的学生(ii)如果要查询的字符串本身就含有通配符%或者_,这个时候就要用到转义关键字escapeselect cno,ccredit from course whe

25、re cname like 'DB_Design'escape''-escape''表示为转义字符,那么紧跟在后面的通配符_就不再具有通配符的含义了 (5)空值查询(is和is not;但是这里的is不能用=代替)select sno,cno from sc where grade is null;-查询出所有选修了课程但没有参加考试即没有成绩的学生select sno,cno from sc where grade is not null;-查询出所有有成绩的学生(6)多重条件查询(and和or)select sname from s

26、tudent where sdept='CS' and sage<20;select sname from student where sdept='CS' or sdept='MA' or sdept='IS'-这种情况完全可以用集合in来解决 5、排序相关(order by;缺省默认ASC升序、DESC降序)-要注意的是对结果集的操作,而且用来排序的字段要是在查询字段中出现的select sno,grade from sc where cno='3' order by grade desc;-将

27、查询结果按照grade降序排序select * from student order by sdept,sage desc;-先按sdept默认升序排序,如果sdept相等再按sage降序排序注意如果排序字段出现空值的情况那么按ASC的话,含有空值的这个元组会最先显示,按DESC的话,就会最后显示(即空值最小) 6、聚集函数(常用的 countsumavgmaxmin;常常和group by分组一起搭配使用)(1)查询学生的总数select COUNT(*) from student;(2)查询选修了课程的学生人数select COUNT(distinct sno) from sc;

28、(3)计算1号课程学生的平均成绩select AVG(grade) from sc where cno='1'(4)查询1号课程学生的最高分数select MAX(grade) from sc where cno='1'(5)查询学生200215012选修课程的总学分数select SUM(ccredit) from sc,course where o=o and sno='200215012'注意聚集函数不能用在where子句中作为条件表达式注意聚集函数对空值NULL的处理(这里注意NULL和''的区别)select COUNT

29、(*) from tt;-不指定字段,则考虑空值计数为6select COUNT(name) from tt;-指定计数字段,则跳过空值计数为5除了count的上面的这种情况外,其他聚集函数都跳过空值而只处理非空值 7、分组相关(group by)-操作的也是结果集,按某一列或者多列分组,值相等的为一组;常常和聚集函数连用(1)各个课程号及相应的选课人数select cno,COUNT(sno) from sc group by cno;-此处的count是对结果集中的每一组的元组进行计数执行的顺序:group by子句进行分组聚集函数count对分组后的每一组计数(2)选修了3门以

30、上课程的学生学号select sno from sc group by sno having COUNT(*)>3;-having短语是对分组后的结果再进行近一步筛选,注意having后面没有(),直接接的筛选条件执行的顺序:group by子句进行分组聚集函数count对分组后的每一组计数having短语给出选择组的筛选条件注意:当既要分组又要排序时,应该先分组再排序8、连接查询(为避免扫描全表,可以考虑建立索引)(1)内连接(查询结果全都是满足连接条件的数据)(I)一般连接(就是没有连接条件,那么就会产生一个笛卡尔集)select * from student,sc;或者select

31、 * from student join sc;(II)等值连接select * from student,sc where student.sno=sc.sno;-会出现重复的列sno(III)自然连接(在等值连接中去掉重复的列)select student.sno,sname,ssex,sage,sdept,cno,grade from student,sc where student.sno=sc.sno;(IV)自身连接(有特定含义或结构的表会用到这种连接查询,如course表中cno和cpno的关系就决定了该表可以使用自身连接)select FIRST.cno,SECOND.cpno

32、 from course FIRST,course SECOND where FIRST.cpno=SECOND.cno;-关键点在于为一个表取2个别名,从而看做是2个表的连接查询内连接是一种常用的连接类型,因此可以转化成一种更标准的写法(写法上同下面的外连接统一起来):select * from student join sc on student.sno=sc.sno;select student.sno,sname,ssex,sage,sdept,cno,grade from student join sc on student.sno=sc.sno;select FIRST.cno,S

33、ECOND.cpno from course FIRST join course SECOND on FIRST.cpno=SECOND.cno;(2)外连接(显示所有的数据,对于不满足连接条件的元组相应的字段值就为NULL)(左外连接、右外连接)我们在做等值或者自然连接查询时,若存在这样的一种情况:关系R中某些元组可能在关系S中不存在公共属性值相等的元组(通俗的讲就是连接查询在做笛卡尔集的时候没有找到匹配项的那些元组)那么在查询结果中R和S这2个关系中的这些元组就会被舍弃,为了保留这些被舍弃的数据,就必须用到外连接select * from student a join sc b on a.

34、sno=b.sno; -这就是常见的内连接,不满足连接条件的元组就被舍弃了select * from student a left outer join sc b on a.sno=b.sno; -这就是外连接中的左外连接,对于不满足连接条件的元组,保留左边的元组信息,右边的对应为NULLselect * from student a right outer join sc b on a.sno=b.sno;-这就是外连接中的右外连接,由于sc和student存在主外键关系,即sc中学号都来自与student,所以这种情况下不存在不满足连接条件的元组,因此结果同内连接一致注意:outer可以省

35、略注意:在做连接查询时,经常会遇到一些很长很复杂的表名,给书写带来了不便,因此可以为这些表赋予别名,不过一旦为表指定了别名,则在查询语句中,其他所有用到表名的地方(包括指定表名的位置之前和之后)都只能使用别名,而不能再使用原表名。(6)复合条件连接(略)(指where子句中同时有多个连接条件)(7)多表连接(略)(2个以上的表的连接查询)9、嵌套查询(1)查询块:一个select-from-where语句就是一个查询块(2)嵌套查询:将一个查询块嵌套到另一个查询块的where子句或者Having短语的条件中去的查询称为嵌套查询(3)父查询:外层查询(4)子查询:内层查询(5)相关子查询:子查询

36、的查询条件依赖于父查询(6)不相关子查询:子查询的查询条件不依赖于父查询(I)带有in的子查询select sname from student where sno -父查询in (select sno from sc where cno='2'    -子查询);根据语义,这是一个不相关子查询(II)带有比较运算符的子查询select sno,sname,sdept from student where sdept=(select sdept from student where sname='刘晨');根据语义,这也是

37、一个不相关子查询select sno,cno from sc x where grade>=(select AVG(grade) from sc y where y.sno=x.sno  -这个子查询表示的是他自己所有选修课程平均成绩);根据语义,这就是一个相关子查询(III)带有any(some)/all的嵌套查询any(some)表示某个(意思就是只要存在)all表示所有(IV)带有exists/not exists的子查询(注意该子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”)select sname from student whereexis

38、ts(select * from sc where sno=student.sno and cno='1');说明1:用exists时,若子查询结果结果非空,子查询返回值为“true”,那么就采纳;       用not exists时,若子查询结果为空,子查询返回值为为“true”,那么采纳;      由exists引出的子查询,其目标表达式通常都用*,因为子查询返回的只是"true"或者"false",没有必要给出实际列名该

39、查询的执行过程:首先取父查询中student表的第一个元组,带入子查询,若条件满足,则取父查询中该元组的sname值放入最终的查询结果集中,然后再取student表的下一个元组,以此类推。10、集合运算(略)(并union、交intersect、差except)参加集合操作的各查询结果的字段数、字段名称都必须相同,数据类型也最好相同,即使不同也要能够隐式兼容,即可以隐式转换,如char(20)和varchar(40)。(1)并运算(返回两个或多个查询结果合并之后的结果集)select Name,Tel from Table_Customer where Name like '李%

40、9;unionselect Name,Tel from Table_Customer where Name like '王%'order by Tel ASC(2)交运算(返回同时在两个集合中都出现的记录)(语法要求同上)(3)差运算(返回在第一个集合中有但在第二个集合中没有的数据)(语法要求同上)  11、使用TOP限制结果集 语法格式:TOP n percent with ties  n:表示取前n行数据  n percent:表示取前n%行数据  with ties:表示包括最后一行取值并列的结果 (1

41、)查询出student表中年龄最大的前3个学生的信息 select top 3 * from student order by sage desc; 12、使用CASE函数(1)对商品进行分类显示:单价高于3000,显示为'高档商品',单价介于1000到3000之间,显示为'中档商品',单价低于1000,显示'低档商品'select GoodsName,SaleUnitPrice,type=casewhen SaleUnitPrice>3000 then '高档商品'when SaleUnitPrice

42、between 1000 and 3000 then '中档商品'when SaleUnitPrice<1000 then '低档商品'endfrom Table_Goods a join Table_GoodsClass b on a.GoodsClassID=b.GoodsClassID where GoodsClassName='家用电器'(2)查询每种商品的销售次数,超过10次的,显示为'热门商品',5-10次之间,显示为'一般商品',低于5次,显示为'难销商品',如果没有被销售过,显

43、示为'滞销商品'select a.GoodsID,商品销售类别=casewhen COUNT(b.GoodsID)>10 then '热门商品'when COUNT(b.GoodsID) between 5 and 10 then '一般商品'when COUNT(b.GoodsID) between 1 and 4 then '难销商品'else '滞销商品'endfrom Table_Goods a left join Table_SaleBillDetial b on a.GoodsID=b.Goods

44、IDgroup by a.GoodsID13、将查询结果保存到新表(1)语法格式:select 查询列表序列 into <新表名> from 数据源 .(其他行过滤、分组等句子)(2)该语句执行的过程:(I)根据查询语句列出的字段列以及其类型创建一个新表                       (II)执行查询语句    

45、                   (III)将查询的结果插入到新表 (3)用into子句创建的新表可以是永久表也可以是临时表(局部临时表用#来标识,全局临时表用#来标识)                   

46、0;                    select CustomerID,CName,Sex,CardID into #HD_Customer from Table_Customer;   -【Insert】-(1)不指定字段插入(就是默认要插入全部字段的值,那么此时后面值的顺序就要与表中字段的顺序一致,即使字段的值为空,也要插入NULL,不能因为某个字段为空值就省去不写

47、)insert into student values('200215128','陈东','男','IS',18);(2)指定所有字段插入(前面的列名和后面的值要一一对应,至于要不要和表中的列名顺序一样无所谓)insert into student(sno,sname,ssex,sdept,sage) values('200215128','陈东','男','IS',18);这里(1)等价于(2)因为插入的都是全部字段的信息(3)指定部分字段插入(未指定的字段系统自动

48、赋予空值NULL,不过前提是这些字段允许为空)insert into sc(sno,cno) values('200215128','1');等价于insert into sc values('200215128','1',NULL);(4)插入子查询的结果(子查询嵌套在Insert语句中,用以生成要插入的批量数据,以实现批量数据的一次性插入)create table Dept_age(sdept char(15),avg_age smallint);insert into Dept_age(sdept,avg_age) sele

49、ct sdept,AVG(sage) from student group by sdept; -【Update】-(1)修改某个元组的字段值update student set sage=22 where sno='200215121'-(如果要同时修改多个字段的值,set后面要以逗号隔开)(2)连续修改多个元组的字段值update student set sage=sage+1;(3)带子查询的修改语句update sc set grade=0 where 'CS'=(select sdept from student where student.

50、sno=sc.sno);执行过程和原理同带exists/not exists的子查询类似(首先取sc表中的第一个元组,带入子查询,若满足条件,那么就将该元组中grade字段的值置为0,以此类推) -【Delete】-(1)删除一个元组delete from student where sno='200215128'(2)删除多个元组delete from sc;-删除了sc表中的所有元组,使其成为了一个空表(3)带有子查询的删除语句delete from sc where 'CS'=(select sdept from student where st

51、udent.sno=sc.sno);执行过程和原理同带exists/not exists的子查询类似(首先取sc表中的第一个元组,带入子查询,若满足条件,那么就将该元组删除,以此类推)                         -【视图】-        (1)视图:是一个虚表,是一

52、个用查询语句定义、由基本表导出的虚表;因此数据库中只存放对视图的这种定义,而不存放视图包含的数据  通俗的讲,视图就是一个预先写好并保存在数据库中的SQL查询语句,我们只需要执行这个SQL语句,就能得到相应的查询结果    (2)视图的创建(注意虽然在视图创建语句中会有查询语句出现,但是执行视图创建语句只是完成对视图定义的保存,并不执行其中的查询语句,只有在对视图进行查询时才会执行视图定义中的查询语句)    (I)创建单源视图(视图数据只来自一个基本表)    create view HD_C

53、ustomer  as  select CardID,CName,Sex from Table_Customer where Address='北京市海淀区'    (II)创建多源视图(视图数据来自多个基本表)    create view JF_Customer  as   select a.CardID,CName,Score,Address from Table_Card a join Table_Customer b on a.CardID=b.CardID

54、where Score>10000  with check option    -这句的作用:强制针对视图执行的所有修改都必须符合在where后面的条件,也就是说修改后的Scre也应该在Score>10000这个范围内,否则修改是不会成功的    (III)在已有的视图上创建新的视图(这是作为数据源的视图必须是已经建立好的)    create view JF_HD  as   select CardID,CName,Score from JF_Cust

55、omer where Address='北京市海淀区'    (IV)创建带表达式的视图(因为在基本表中要避免数据的冗余,所以不会设置一些可以通过计算得出的派生属性列,因此我们可以将这些派生属性列设置在视图中)    create view Part_Cust(姓名,地址,年龄)  as  select CName,Address,year(datetime()-year(BirthDate) from Table_Customer    (V)创建含分组统计信息的视图

56、(也就是在查询语句部分中用到group by子句)(略)      (3)查询视图(方法同基本表的查询一样)  select CardID,CName,Score from JF_HD where Score>80  select 姓名,地址,年龄 from Part_Cust    (4)删除视图  Drop view JF_HD  -【索引】- -【存储过程】-(1)存储过程:存储在数据库中供所有用户程序调用的子程序(2)(Select查询数据)

57、存储过程的创建(I)仅仅只带有select语句的存储过程create procedure p1asselect a.sno,sname,ssex,sage,sdept,s_entrance,o,cname from student a join sc b on a.sno=b.sno join course c on o=oexec p1;-执行存储过程,返回一个select查询结果集(II)带有一个输入参数的存储过程create procedure p2xh char(9)as select * from student where sno=xh;exec p2;-会报错

58、,因为根据存储过程的定义,在没有设置默认值的情况下,需要指定输入参数的值exec p2 '1004'-执行存储过程并输入参数值,返回一个select条件查询结果集(III)带有多个输入参数并有默认值的存储过程create procedure p3cch char(40),age smallint=22    -这里和参数名之间没有空格,定义多个参数时要用逗号隔开asselect a.sno,sname,sdept from student a join sc on a.sno=sc.sno where sage=age and&

59、#160;cno=cch;exec p3 '002'-只写出了一个输入参数,那么会自动和存储过程定义的第一个输入参数匹配,返回非空的正确结果集exec p3 21;-也只是写出了一个输入参数,但得不到想要的结果,因为是在和存储过程定义中的第一个参数进行匹配(虽然执行起来不会报错)exec p3 cch='002'-指定为输入参数cch赋值,另外一个输入参数age取默认值exec p3 cch='002',age=22;-(注意多个参数之间逗号隔开)同时指定为2个输入参数赋值,此时赋值顺序可以和存储过程中定义的参数的顺序不一样exec p3 

60、9;001',21;-(注意多个参数之间逗号隔开)自动将'001'匹配cch,'21'匹配age,返回非空的正确结果集(IV)同时带输入和一个输出参数的存储过程create procedure p4var1 int,var2 int,var3 int outputasset var3=var1*var2;declare res int    -因为涉及到输出,所以要在执行存储过程之前先声明一个变量,用来存放要输出的值exec p4 7,8,res output  -执行存储过程,注意写法,不要漏写output了pr

61、int res  -打印出这个变量值create procedure p5class varchar(20),count int outputasselect count=COUNT(*) from Table_Goods a join Table_GoodsClass b on a.GoodsClassID=b.GoodsClassID where GoodsClassName=class;declare c intexec p5 '服装',c outputprint c(V)同时带有输入和多个输出参数的存储过程create procedure p6area varchar(20),sex char(2),count int output,avg_age int outputasselect count=COUNT(*),avg_age=AVG(YEAR(GETDATE()-YEAR(BIRTHDATE) from Table_Custom

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论