2018-4-20 周报 (第六周) 天气:晴朗
毕业出来上班的第六周啦!
那就来总结一下来厦门这边的第一周都学会了什么吧!
周三来上的班,一直是在写SQL语句。50到SQL题,截至目前为止已经写了33道了。SQL语句还是挺复杂的,没有写过这么复杂的SQL语句。写的这么多的SQL语句一共学了以下的东西:
(1)CAST() 函数
用法 : CAST(AVG(sc.分数) as decimal(18,2)) 这个就相当于C#中的int.prase 这种转型,这种写法可以将计算出来的平均数后面的小数点只保留俩位小数。
(2)ROW_NUMBER() 函数 (这个以前做项目分页的时候就有用到,只是不熟拿到网上的代码。不理解,现在基本理解)
用法 :
select s.学生姓名, CAST(AVG(sc.分数) as decimal(18,2)) as 平均成绩 ,ROW_NUMBER() over(order by CAST(AVG(sc.分数) as decimal(18,2)) desc) as 名次 from Student s inner join 分数表 sc on s.Sid=sc.Sid group by s.学生姓名
这个主要是查询学生平均成绩及其名次 使用ROW_NUMBER()可以给查出来的数据每一行增加一个唯一的自增长的ID然后去排序
(3)case when then else end 这个方法相当于C#里面的if函数
用法 : CAST(count(case when sc.score>=70 and sc.score<80 then sc.score else null end) * 1.00 / count(sc.Cid) as decimal(18,2)) as 中等
查询出来的结果如下:
也就相当于IF和else条件判断!
(4)over() 这个函数也是一种排序,
1 select c.Cname as '科目',SC.score as '成绩',ROW_NUMBER() over(partition by c.Cname order by sc.score desc) as '各科排名' from SC 2 left join Course c on SC.Cid=c.Cid
partition by c.Cname 这个是你要以那个来进行排序比对,
order by sc.score desc 这个就不用说了吧!就是来排序了。
执行结果如下:
(5)时间类型的字符串的年份 以及日期的拿取
--这个是拿取这个datetime类型的年份
--year(s.Sage)=@year
--下面这个函数是可以获取到日期
--CONVERT(VARCHAR(10),QueueDate,23)
在写这些SQL语句的时候,强化了自己的SQL语句的编写。很多函数方法写法,以前学是学过不过用的很少。所以也就很生疏了,写了30到题加强了不少。
今天下午还了解了一下存过中的事务!
那就来说一下事务的概念:
事务是关于原子性的。原子性的概念是指可以把一些事情当做一个不可分割的单元来看待。从数据库的角度看,它是指应全部执行或全部不执行的一条或多条语句的最小组合。
为了理解事务的概念,需要能够定义非常明确的边界。事务要有非常明确的开始和结束点。SqlServer中的每一条select、insert、update、delete语句都是隐式事务的一部分。即使只发出一条语句,也会 把这条语句当做一个事务-或执行语句的所有内容或什么都不执行。但是如果需要的不只是一条,而是多条语句呢?在这种情况下,就需要有一种方法来标记事务的开始和结束,以及事务的成功或失败。 可以使用一些T-SQL语句在事务中“标记”这些点。
- begin tran:设置起点
- commit tran:使事务成为数据库中永久的、不可逆转的一部分
- rollback tran:本质上说想要忘记它曾经发生过
- save tran:创建一个特定标记,只允许部分回滚
下面这段代码讲解了事务的详细操作步骤以及意思:
1 ---开启事务 2 begin tran 3 --错误扑捉机制,看好啦,这里也有的。并且可以嵌套。 4 begin try 5 --语句正确 6 insert into lives (Eat,Play,Numb) values ('猪肉','足球',1) 7 --Numb为int类型,出错 8 insert into lives (Eat,Play,Numb) values ('猪肉','足球','abc') 9 --语句正确 10 insert into lives (Eat,Play,Numb) values ('狗肉','篮球',2) 11 end try 12 begin catch 13 select Error_number() as ErrorNumber, --错误代码 14 Error_severity() as ErrorSeverity, --错误严重级别,级别小于10 try catch 捕获不到 15 Error_state() as ErrorState , --错误状态码 16 Error_Procedure() as ErrorProcedure , --出现错误的存储过程或触发器的名称。 17 Error_line() as ErrorLine, --发生错误的行号 18 Error_message() as ErrorMessage --错误的具体信息 19 if(@@trancount>0) --全局变量@@trancount,事务开启此值+1,他用来判断是有开启事务 20 rollback tran ---由于出错,这里回滚到开始,第一条语句也没有插入成功。 21 end catch 22 if(@@trancount>0) 23 commit tran --如果成功Lives表中,将会有3条数据。 24 25 --表本身为空表,ID ,Numb为int 类型,其它为nvarchar类型 26 select * from lives
然后我又在网上看到了一种简单的写法,以后就可以使用下面这种写法去写存过。代码如下:
1 begin tran tran_AddUserInfo --开始事务 2 3 declare @tran_error int; 4 set @tran_error=0; 5 begin try 6 insert into dbo.UserInfo values(2016009,'aaa','2016-08-19 09:13:41.227','男') 7 insert into dbo.UserInfo values(2016009,'bbb','2016-08-19 09:13:41.227','哼哼哼') 8 insert into dbo.UserInfo values(2016009,'ccc','2016-08-19 09:13:41.227','哈哈哈') 9 end try 10 begin catch 11 set @tran_error=@tran_error+1; --加分号或不加都能正常执行 12 end catch 13 if(@tran_error>0) 14 begin 15 rollback tran tran_AddUserInfo; --执行出错,回滚事务(指定事务名称) 16 print @tran_error; 17 end 18 else 19 begin 20 commit tran tran_AddUserInfo; --没有异常,提交事务(指定事务名称) 21 print @tran_error; 22 end
这个相比于上一段代码就省掉了一些不必要的东西,看起来要显得简洁一点。
OK,这周基本上也就干了这些。学的也就是上面所写的东西!完美。。。 再接再厉,明天周天休息抽空看一下WebFrom。一直是在写MVC偶尔写下WinFrom,WebFrom好久都没有用过了。很多地方都已经生疏了!补一下基础的知识!