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好久都没有用过了。很多地方都已经生疏了!补一下基础的知识!

posted @ 2018-04-20 17:52  Sir奔  阅读(389)  评论(0编辑  收藏  举报