SQL Server 2005基础知识详细整理
SQL Server 2005中的基础知识。
1. ACID:指数据库事务正确执行的四个基本要素缩写:
1.原子性2.一致性3.隔离性4.持久性
2.数据库对象:表(table) 视图(view) 存储过程(stored procedure) 函数(function)索引(index)
3.SQL Server 2005中包含master、model、msdb、tempdb四个系统数据库。
4.使用T-SQL语句创建数据库:
CREATE DATABASE [ApressFinacial] ON PRIMARY( NAME = N'ApressFinacial', FILENAME = N'I:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\ApressFinacial.mdf' , SIZE = 3072KB , FILEGROWTH = 1024KB )LOG ON( NAME = N'ApressFinacial_log', FILENAME = N'I:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\ApressFinacial_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)
SELECT * FROM score --原始成绩DECLARE @labAvg intWHILE(1=1) BEGIN UPDATE score SET score= CASE WHEN score<60 THEN score+5 WHEN score between 60 AND 69 THEN score+3 WHEN score between 70 AND 79 THEN score+2 WHEN score between 80 AND 89 THEN score+1 ELSE score END SELECT @labAvg=AVG(score) FROM score IF @labAvg>=85 BREAK ENDSELECT * FROM score --加分后的成绩
Replace: select replace('莫勒可切.杨可','可',‘兰') 返回结果:莫勒兰切.杨兰 Upper: select upper('sql server 课程') 返回结果:SQL SERVER 课程 Getdate: select getdate()获取当前时间。 Dateadd: select dateadd(mm,4,'01/01/2009') 返回结果:05/01/2009 Datename: select datename(dw,'01/15/2000') 返回结果: Saturday
Select courseid,studentid,sum(score) as 总成绩 From score Group by courseid,studentid
select studentid as学员编号,avg(score)as 平均成绩 From score Group by studentid,couseid Having avg(score)>60
select titles.title_id,Titles.title,publishers.pub_name From titles Right outer join publishers On titles.pub_id=publishers.pub_id
intsert into account(account.Cardid,account.score) Select users.cardid,2 From users Left Join account ON(account.cardid=users.cardid) Where account.cardid is NULL
select * from students Where scode>(select scode from students where Sname='张扬') GO
select sname from students Inner Join score ON students.scode=score.studentid Where score=60 GO
Select student2.sno学号,student2.sname姓名,student2.ssex性别,student2.sspeciality专业,student2.savgrade平均成绩 From student,student2 Where student.sname='李好' and student.sspeciality=student2.sspeciality
Declare @no,char(8),@name char(8),@avgrade numeric(3,1) Set @no='457865' Select @name=sname,@avgrade=savgrade From student Where sno=@no; If @avgrade>60.0 Begin Print @name Print @avgrade End Go
Declare @no char(8),@name char(8),@avgrade numeric(3,1); Set @no='567'; Select @name=sname,@avgrade=savgrade From student Where sno=@no; If @avgrade<60.0 Begin Print @name Print @avgrade End Else Print @no Go
Declare @no char(8),@name char(8),@avgrade numeric(3,1); Set @no='567'; Select @name=sname,@avgrade=savgrade From student Where sno=@no; If @avgrade>=90.0 Print ‘优秀' Else if @avgrade>=80.0 ……………. Else print ‘不及格' Go
Select 学号=sno,姓名及爱好= Case sno When ‘123' then ‘李好,游泳' 。。。。。。。 Else ‘没有这人' End From student
Declare @avgrade numeric(3,1); Set @avgrade=(select avg(savgrade) from student) While @avgrade<85 Begin Update student Set savgrade=savgrade+savgrade*0.005 Set @avgrade=(select avg(savgrade) from student) If @avgrade>95 Break --退出循环 if@avgrade<80 continue --结束本次循环 print @avgrade End
Select sname from students Inner Join score ---内连接 ON students.scode=score.studentid Where score=60 Go
Creat procedure pro_stu As Declare @myAvg float Select @myAvg=AVG(score) From score Print '平均分:'+convert(varchar(5),@myAvg) If(@myAvg>70) Print '本班考试成绩:优秀' Else Print '本班考试成绩:较差' Print '-----------------------' Print '参加本次考试没有通过的学员:' Select name,scode,score From students inner Join score on Students.scode=score.studentid where score<60 GO
Create procedure proc_stuMn @scorePass int=60 ---及格线默认为60分 As Print '及格线:' +convert(varchar(5),@scorePass) Print '参加本次考试没有通过的学员:' Select name,scode,score From students Inner Join score On students.scode=score.studentid Where score<@scorePass Go
Create procedure proc_stuM @notpassSum int output, @scorePass int=60 As Print'及格线:'+convert(varchar(5),@scorePass) Print '参加本次考试没有通过的学员:' Select name,scode,score from students Inner Join score On students.scode=score.studentid Where score<@scorePass Select @notpassSum=count(studentid) From score where score<@scorePass GO
Declare @sum int EXEC proc_stuM @sum output,60 Print '--------------------------------------------------' If @sum>=3 Print '未通过人数:'+convert(varchar(5),@sum )+'人,超过60%,及格分数线还应下调' Else Print '未通过人数:'+convert(varchar(5),@sum )+'人,已控制在60%以下,及格分数线适中' GO
Create procedure pro_stuM @notpassSum int output, @scorePass int=60 As If(not @scorePass between 0 and 100) Begin Raiserror('及格线错误,请指定0—100之间的分数,统计中断退出',16,1) --------引发系统错误,指定错误的严重级别16,调用状态为1(默认),并影响@@ERROR 系统变量的值 Return --------立即返回,退出存储过程 End ...............其他语句同上例 Go
Declare @sum int,@t int EXEC proc_stum @sum output, 604 ----笔试及格线误输入604分 Set @t=@@error Print '错误号:'+convert(varchar(5),@t ) If @t<>o Return ------退出批处理,后续语句不再执行 Print '-----------------------------------' -----如果执行了raiseerror语句,系统全局@@error 将不等于0,表示出现了错误. If @sum>=3 Print '未通过人数:'+convert(varchar(5),@sum)+'人,超过了60%,及格分数线还应下调' Else print '未通过人数:'+convert(varchar(5),@sum)+'人,已控制在60%以下,及格分数线适中' GO62.调用存储过程: 例: Declare @s int Exec proc_stuinfo '张三' ,@s , 30 ———错误!应为(exec proc_stuinfo '张三',@s output,30) Exec proc_stuinfo '张三' ,@s ————错误!应为(exec proc_stuinfo '张三',@s output) Exec proc_stuinfo @sAge=22,@stuName='李四',@m=@s output(正确!)
Declare @sum int Exec proc_stuM @sum output,60 Print '-----------------------------------------' If @sum>=3 Print'未通过人数:'+convert(varchar(5),@sum )+'人,超过60%,及格分数线还应下调' Else Print'未通过人数:'+convert(varchar(5),@sum )+'人,已控制在60…60%以下,及格分数线适中' GO
Create trigger trigger_name On table_name [with encryption] --------表示加密触发器定义的SQL文本 For [delete,insert,update] -------指定触发器类型 As T_SQL语句 GO
Create trigger trig_transInfo On transInfo For insert As Declare @type char(4),@outMoney Money Declare @myCardID char(10),@balance Money Declare @currentMoney money Select @type=transType,@outMoney=transMoney,@myCardID=cardID from inserted If(@type='支取') Update bank set currentMoney=currentMoney-@outMoney Where cardID=@myCardID Else Update bank set currentMoney=currentMoney+@outMoney Where cardID=@myCardID
Insert into transInfo(transType,transMoney,cardID) Values ('支取',200,'10011001')67. Delete触发器示例: Create trigger tri_delete_transInfo On transInfo For delete As Print '开始备份数据,请稍候......' If not exists(select * from sysobjects where name='backupTable') Select * into backupTable from deleted ------------从deleted表中获取被删除的交易记录。 Else Insert into backupTable select * from deleted Print '备份数据成功,备份表中的数据为:' Select * from backupTable Select * from transInfo GO
Create trigger trig_update_bank On bank For update As Declare @beforeMoney Money,@afterMoney Money Select @beforeMoney=currentMoney from deleted -------(从deleted表中获取交易前的金额,从inserted表中获取交易后的余额) Select @afterMoney=currentMoney from inserted If ABS(@afterMoney-@beforeMoney)>20000 ------交易金额是否>2万 Begin Print '交易金额:'+convert(varchar(8), ABS(@afterMoney-@beforeMoney)) Raiserror ('每笔交易不能超过2万元,交易失败',16,1) Rollback transaction ------------回滚事务,撤销交易 End Go
Create trigger trig_update_transIfo ON transInfo For update As If update(transDate) Begin -------检查是否修改了交易日期列transDate Print '交易失败......' Raiserror('安全警告:交易日期不能修改,由系统自动产生',16,1) Rollback transaction ----------回滚事务,撤销交易 End GO
if exists (select * from sysobjects where name='Sum_wage')drop procedure Sum_wageGOcreate procedure Sum_wage@PWage int,@AWage int,@total intaswhile (1=1)beginif (select count(*) from ProWage)>2*(select count(*) from ProWage where Wage>=@PWage)update ProWage set @total=@total+@AWage,Wage=Wage+@AWageelsebreakendprint'一共加薪:'+convert(varchar,@total)+'元'print'加薪后的程序员工资列表:'select * from ProWage--调用存储过程1--exec Sum_wage @PWage=2000,@AWage=100,@total=0exec Sum_wage @PWage=2200,@AWage=100,@total=0exec Sum_wage @PWage=3000,@AWage=100,@total=0exec Sum_wage @PWage=4000,@AWage=100,@total=0exec Sum_wage @PWage=5000,@AWage=100,@total=0exec Sum_wage @PWage=6000,@AWage=100,@total=0
if exists (select * from sysobjects where name='Avg_wage')drop procedure Avg_wageGOcreate procedure Avg_wage@PWage int,@AWage int,@total intaswhile (1=1)beginif ((select Avg(Wage) from ProWage)<=@PWage)update ProWage set @total=@total+@AWage,Wage=Wage+@AWageelsebreakendprint'一共加薪:'+convert(varchar,@total)+'元'print'加薪后的程序员工资列表:'select * from ProWage--调用存储过程--exec Avg_wage @PWage=3000,@AWage=200,@total=0exec Avg_wage @PWage=4500,@AWage=200,@total=0
INSERT INTO studentinformation(S_name,S_no,S_grade,S_address)VALUES('花无影',25,'软件0802班','河北')select studentinformation.S_name,studentinformation.S_nointo information2from studentinformationselect S_no,S_grade,S_namefrom studentinformationwhere S_school='软件学院'order by S_noselect S_no,S_name,S_classfrom studentinformationwhere S_sex='男'and S_name<>'花无影'order by S_noSELECT top 20 percent sname as 姓名,sno as 学号,saddress as 地址FROM yuanWHERE sschool ='软件学院'ORDER BY sno asc,sname descselect charindex('data','my data is set',1) (data的索引位置)select len('java xuexibiji') (字符串长度)select lower('BAO DING DIANLI ZHI YE JI SHU XUE YUAN') (转换成小写)select replace('软件学院','软件学院','软件工程学院') (替换)select stuff('a b c d e f g h i j k l m n',3,6,'今天的学习内容') (从第三字符个开始替换,替换6个字符)select getdate() (当前日期)select dateadd(dd,250,'04/12/2009') (250天后的日期)select datediff(mm,'04/20/2005','08/05/2010') (相差的月数)select datename(dw,'04/12/2009') (返回星期几)select datepart(dd,'04/12/2009') (返回当天是几号)select abs(-10) 绝对值select ceiling(-32.8) 返回大于或等于该数的最小整数select power(102,3) 取数值表达式的幂值select round(3.141592653,4) (?)将数值表达式四舍五入成指定精度select sign(1000) 正数返回1,负数返回-1,0返回0.select sqrt(6.25) //返回该数据的平方根select convert(varchar(100),45678932) //转变数据类型 select current_user //返回当前用户的名字select datalength('软件学院') //返回字符长度select host_name() //返回用户登录的计算机名select system_user //返回登录的用户名select user_name(1) //从任意数据库中返回dbo(jizhu)create proc pro_stu@scorepass floatasprint '学号'+convert(varchar(5),@scorepass)select namefrom stuentwhere student.score=@scorepassgoexec pro_stu @scorepass=85
declare @objectId intset @objectId=object_id('sun')if @objectId is not nullbegin drop proc sunendgocreate proc sun (@tablename varchar(256))asbegin set nocount on declare @sqlstr varchar(4000) declare @sqlstr1 varchar(4000) declare @sqlstr2 varchar(4000) select @sqlstr='select ''insert '+@tablename select @sqlstr1='' select @sqlstr2='(' select @sqlstr1='values (''+' select @sqlstr1=@sqlstr1+col+'+'',''+' ,@sqlstr2=@sqlstr2+name +',' from (select case when a.xtype =173 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.length*2+2)+'),'+a.name +')'+' end' when a.xtype =104 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(1),'+a.name +')'+' end' when a.xtype =175 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end' when a.xtype =61 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'convert(varchar(23),'+a.name +',121)'+ '+'''''''''+' end' when a.xtype =106 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.xprec+2)+'),'+a.name +')'+' end' when a.xtype =62 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(23),'+a.name +',2)'+' end' when a.xtype =56 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(11),'+a.name +')'+' end' when a.xtype =60 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(22),'+a.name +')'+' end' when a.xtype =239 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end' when a.xtype =108 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.xprec+2)+'),'+a.name +')'+' end' when a.xtype =231 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end' when a.xtype =59 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(23),'+a.name +',2)'+' end' when a.xtype =58 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'convert(varchar(23),'+a.name +',121)'+ '+'''''''''+' end' when a.xtype =52 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(12),'+a.name +')'+' end' when a.xtype =122 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(22),'+a.name +')'+' end' when a.xtype =48 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar(6),'+a.name +')'+' end' when a.xtype =165 then 'case when '+a.name+' is null then ''NULL'' else '+'convert(varchar('+convert(varchar(4),a.length*2+2)+'),'+a.name +')'+' end' when a.xtype =167 then 'case when '+a.name+' is null then ''NULL'' else '+'''''''''+'+'replace('+a.name+','''''''','''''''''''')' + '+'''''''''+' end' else '''NULL''' end as col,a.colid,a.name from syscolumns a where a.id = object_id(@tablename) and a.xtype <>189 and a.xtype <>34 and a.xtype <>35 and a.xtype <>36 )t order by colid select @sqlstr=@sqlstr+left(@sqlstr2,len(@sqlstr2)-1)+') '+left(@sqlstr1,len(@sqlstr1)-3)+')'' from '+@tablename print @sqlstr exec( @sqlstr) set nocount offendgo