CASE函数 sql server——分组查询(方法和思想) ref和out 通常处理程序结合反射技术统一执行客户端请求 遍历查询结果集,update数据 HBuilder设置APP状态栏

CASE函数

 

 

做用:css

  1. 能够将查询结果集的某一列的字段值进行替换
  2. 它能够生成一个新列
  3. 至关于switch...case和 if..else

 

使用语法:html

case 表达式/字段web

         when 值 then 自定义值面试

         elsesql

end as 别名json

 

when 值 then:能够理解为当某个字段为某个值的时候,而后就返回自定义值将结果集的字段值进行替换ide

else:若是上面的when都不知足就执行else结果函数

 

 


 

 

经常使用用法一(case后面有字段或者表达式)post

when关键字后面写固定值学习

 

case关键字后面若是有字段或者表达式,那么这种结构只能作等值判断,等值的意思是when关键字后面写了固定的值

示例图解:

 

注意:该方式不能用于判断null

 

 


 

 

经常使用方式二(case关键字后面没有字段或表达式)

when关键字后面写条件表达式

 

思考:

如今有个需求说,要求年龄字段这我的知足18岁或者年龄在某个范围,那么若是用上面说的等值判断,没法知足,由于字段要匹配的是一个范围

 

若是case关键字后面没有写字段或表达式,那么结构就至关于 if..elseif...else能够作范围判断,它可使用null值判断

 

 

实例图解:

 


注意:

then 后面的值的类型 要与当前case范围内的保持一致

 

 

 

sql server——分组查询(方法和思想)

 

思想

先排序在汇总

sql server里分组查询一般用于配合聚合函数,达到分类汇总统计的信息。而其分类汇总的本质实际上就是先将信息排序,排序后相同类别的信息会聚在一块儿,而后经过需求进行统计计算。

 


 

 

使用GROUP BY进行分组查询

 

实例演示

 

--查询男女生的人数

 

 在没有学习分组查询以前,咱们能够安装常规的思路解决查询需求:

 

select count(*) from student where sex='男'

 

select count(*) from student where sex='女'

 

那么如今又要个须要时,查询每一个班级的总人数

若是按照常规解决查询,那么咱们应该思考的是:

1.每一个班级,咱们并不知道在表里有哪些班级,那么咱们where 后的条件如何写?

2.若是该表里有1000个班级,那么我难道要写一千条where查询语句?

面对这样的问题 sql server为咱们准备了Group by 关键字实现分组查询

 

在使用介绍Group by关键字以前,咱们先来看看系统实现分组查询的原理和逻辑:

 

映射成SQL语句:

select sex ,count(*)  as 人数  from student group by sex

这个简短的语句,通过上图的原理,应该要知道,第一步是先from查询表的全部信息,而后group by根据字段进行分组后在统计汇总

 

上面的案例是经过Count()函数进行统计,固然分组汇总还可使用其余的聚合函数进行汇总。

 

 

使用GROUP BY 语句注意事项一:

 

图中使用查询语句,包含一个字段和一个聚合函数为何会报错呢?

缘由,咱们把两个字段分开来查询:

 

总结:为了保证完整性,系统约定俗成,在使用了聚合函数的查询语句中,除了聚合函数,能够在查询列表上,要出现其余字段,那么该字段就必须为分组字段,并且该字段必定要跟随在GROUP BY关键字后面。

    与聚合函数一块儿出如今select后面进行查询的列,只有两种可能性:被聚合 、被分组

 

 

 


 

 

多列分组查询

 

--实例需求,查询每个班级,男女生的人数

分析:显然需求是两组,每个班须要划分组,男女也须要分组

实现图解:

SQL语句:

select  GradeId,sex,COUNT(*)  from student group by GradeId,Sex order by GradeId

经验:搞清楚须要分几组,搞清楚分组的顺序,一轮一轮的分,系统是等分组以后才会进行汇总信息

 

 


 

 

使用HAVING子句

 

演示示例:--查询每个班级男女生的人数,同时只须要显示人数数量超过3人的记录

分析:此查询显然是对上一个示例的多列分组进行筛选。

 

试在这学的知识范围内来解决此查询需求。。。。

 

1、那么就按照咱们学的where来进行筛选

结果如图:

这个错误告诉了咱们:where里面不能出现聚合函数做为条件,失败!

 

 

 

2、既然不能使用聚合函数,那就给聚合函数取一个别名,让它当作一个列

结果如图:

错误缘由:缘由是where是对源数据进行筛选的,也就是对from 后面的表进行筛选,既然是源数据,那么where去源数据表里找一个别名字段,怎么可能会有!因此才会报错

 

 

让咱们来探讨一下,这里为何不能使用where

1.需求是对分组以后的数据集进行筛选,where只针对数据表原始数据筛选

2.where关键字显然只能出现一次,并且根据查询的顺序,是先执行where条件筛选后获得的结果集,在进行的group by分组

 

 

 

解决办法,使用HAVING关键字:

HAVING核心:是对分组统计以后的结果集,进行数据的筛选

SQL语句:

select  GradeId,sex,COUNT(*)  as renshu from student  group by GradeId,Sex  having count(*)>=3 order by GradeId

 

where和having的不一样:where是对原始数据进行筛选,having是对分组时候的数据进行筛选

 


 

 

查询语句的执行顺序

在这里引出查询机制里对查询语句里的关键字的执行顺序

 

查询关键字家族成员

select  top/distinct 字段列表 from 表列表 where 筛选条件 group by 分组字段列表 having  对分组以后获得的结果集筛选  order by 排序字段列表

 

 

执行顺序:

1.from

2.where

3.group by

4.having

5.根据select 关键以后的要显示的字段,进行结果集显示

6.order by 对最终结果集进行排序

7.top/dictinct

 

 

 

ref和out

 

 

Ref 把值传递变成引用传递

当调用一个方法时,传入的参数是一个值类型,那么须要方法将这个传入的值类型的变量值改变受到影响,咱们可使用ref 关键字进行处理实现。

 

观察一:

结论:

根据值类型和引用类型的特色,值类型是赋值,是复制传递的是栈上存储的具体值信息,如图实参变量"a"将100赋值给方法形参"num"变量。那么值类型的改变只会影响值的自己,形参的改变没有形象到变量"a"。

 

加上ref修饰形参:

 

结论:

经过ref关键字,此时传递变量a的时候,实参把引用传给了形参,那么说明了这两个变量将指向同一个引用地址,变量num在方法中的改变会影响到变量a

输出结果:101

 

使用ref关键字的时候须要注意:

1.用了ref关键的方法,必须在参数列表上加上ref关键字,在调用该方法的时候也要加上ref关键字。

2.做为传入修饰了ref的方法的实参变量,必须赋初始值

 

 

做用总结:若是想使一个值类型的变量,经过传入一个方法进行改变,可使用ref

 

 

 


 

 

OUT 让方法返回多个值

 

从语法规则上来说,一个方法只能有一个返回值,若是return多个值简直是天方夜谭,如图:

 

经过out的方式实现:

复制代码
  static void Main(string[] args)
        {

            int a ;
            changeNum(out a);
            Console.WriteLine(a); //结果为101
        }

        static stringchangeNum(out int num)
        {
            num = 100;
            num++;    
             return "ok";
        }
复制代码

 

 

 

使用out关键字须要注意:

1.在方法定义和方法调用时,都要加上out关键字

2.方法参数列表上修饰了out关键字的变量,必须在方法体赋初始值,对于方法调用提供的实参变量能够不须要赋值。

 

 


 

 

面试题

 

ref与out的区别是什么?

使用ref的时候要传入相应方法的实参变量,必须赋值。而out在调用的时候只用声明,可是在方法内部,修饰了out形参必须赋值。

ref和out有着殊途同归之妙,均可以实现相同的功能,ref侧重于将值类型的值传递改变为引用传递,out侧重于对于一个方法返回多个值

 

 

通常处理程序结合反射技术统一执行客户端请求

 

思考:

在开发中,若是使用了模板技术+通常处理程序开发,应用中用户的请求可能在程序中都存在一个共性的操做。

例如,每当执行请求时要检查用户是不是登录,请求时检查用户是否具备相应权限等等的共性的操做,咱们不可能每一个页面都写上对于操做,那样显然不符合面向对象的思想,存在大量冗余。

如何去解决呢?

 

解决思路:

  • 建立一个父类实现IHttpHandler接口,让处理请求的通常处理程序实现这个接口,当通常处理程序接收到请求时,去统一执行父类里的ProcessRequest()方法。
  • 客户端发出的请求,要约定俗成的带上一个action的参数,参数的值就是通常处理程序里要执行的方法。
  • 当执行父类的ProcessRequest()方法时,利用反射获取当前通常处理程序的Type,前面说了action的值表明了当前请求执行的操做是什么,那么利用反射找到指定的方法而后执行它。

这样而来,可让共性的操做在父类里完成,而具体的方法实如今子类里完成

 


 

 

范例代码:

子类

复制代码
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using Blog.Common;
 6 namespace Blog.UI.Article_category
 7 {
 8     /// <summary>
 9     /// Handler1 的摘要说明
10     /// </summary>
11     public class Article_category_Controller : BaseHandler
12     {
13 
14         //方法名都要约定:每一个请求名都为action,action的值,都是通常处理程序的方法
15         public void list(HttpContext context)
16         {
17          string output=   RazorHelper.RazorParsre("/Article_category/template/Blog_Category.cshtml");
18          context.Response.Write(output);
19         }
20             
21 
22      
23     }
24 }
复制代码

 

父类

复制代码
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Reflection;
 5 using System.Web;
 6 using System.Web.SessionState;
 7 namespace Blog.UI
 8 {
 9 
10 
11     public class BaseHandler:IHttpHandler,IRequiresSessionState
12     {
13 
14         //通常处理程序会第一个执行    ProcessRequest()方法,它本身没有,会找父类要,让父类统一来执行请求
15         public void ProcessRequest(HttpContext context)
16         {
17 
18             /*
19              在处理请求操做以前,这里能够处理应用程序要遵循的共性操做
20              
21              */
22 
23 
24 
25             
26             //客户端每一个请求约定俗成url带上一个参数叫action,action表明该请求执行什么操做
27             if (string.IsNullOrEmpty(context.Request["action"]))
28             {
29                 return;
30             }
31             string action = context.Request["action"];
32 
33             //调用父类的方法,会是子类handler,利用反射得到类型
34             Type ty = this.GetType();
35             //根据这个类型,找到和action同名对应的方法,也就是说用action找到当前请求要执行的方法
36             MethodInfo method = ty.GetMethod(action);
37             if (method!=null)
38             {
39                 method.Invoke(this, new object[] { context });  //context是参数
40                 return;
41             }
42 
43 
44         }
45 
46 
47 
48 
49         public bool IsReusable
50         {
51             get
52             {
53                 return false;
54             }
55         }
56 
57 
58 
59     }
60 
61 
62      
63 
64 }
复制代码

 

 

遍历查询结果集,update数据

 

 

复制代码
 1 set rowcount 0
 2 select NULL mykey, * into #mytemp from  dbo.DIM_DISTRIBUTOR
 3 
 4 set rowcount 1
 5 update #mytemp set mykey = 1
 6 
 7 declare @i int 
 8 set @i=1    
 9 while @@rowcount > 0
10 begin
11     set rowcount 0
12     select * from #mytemp where mykey = 1
13   
14     declare @zj varchar(222)
15         select @zj=DISTRIBUTORID from #mytemp where mykey = 1
16          print @i
17     
18      update DIM_DISTRIBUTOR set NAME='用户测试数据'+CAST(@i as varchar(222))    where DISTRIBUTORID=@zj
19     
20     set @i=@i+1 
21     delete #mytemp where mykey = 1
22     set rowcount 1
23     update #mytemp set mykey = 1
24 end
25 set rowcount 0
复制代码

 

 

 

HBuilder设置APP状态栏

 

1、 前言

  状态栏就是手机屏幕最顶部的区域,包括了:信号、运营商、电量等信息。一般APP都有属于本身的色调风格,为了达到总体视觉美观,一般会设置状态栏和标题栏的色调设置成一致。

  图例:

  

 


 

 

2、状态栏状态类型

  1. 默认
  2. 变色(设置颜色)
  3. 透明(沉浸式)
  4. 消失(全屏)

 


 

 

3、状态栏变色

  1.效果如图:

  2.根据色调设置状态栏文字颜色,文字颜色只提供两种值:light(白色)、dark(黑色)

  3.设置标题栏背景颜色

  4.设置状态栏背景颜色,颜色值为16进制

  示例代码:

 
1 <link href="css/mui.min.css" rel="stylesheet"/>
2 .mui-bar{ background-color: red;}
3 </link>
4 <script>        
5 mui.plusReady(function(){             
6 plus.navigator.setStatusBarStyle('light');  
7 plus.navigator.setStatusBarBackground('#FF0000');             
8 });    
9 </script>    
 

  注意事项:

  背景色终端支持仅:Android5及以上系统支持;iOS7.0及以上系统支持。

  文字色终端支持仅:Android5只有小米和魅族支持,Android6及以上全部安卓支持;iOS7及以上支持。

 


  

4、状态栏透明(沉浸式)

  1.效果如图:

  

          (将背景图片和状态栏、标题栏贯通了)

 

   

  2.运用实战(登陆界面)

  需求描述:将背景设置成图片,图片能够适应不一样设备的分配率(响应式),将状态栏的背景设置成透明,背景图片覆盖状态栏至屏幕顶部。  

 
 <style>       
    html,body{height: 100%;width: 100%;}  
    body{  
      background:url(image/background.png)no-repeat;   
      background-size:100% 100%;                  
        filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image/background.png',sizingMethod='scale');  
    }            
    </style>
 

 

mui.plusReady(function(){             
    plus.navigator.setStatusBarStyle('light');               
});

 

"plus": {
    "statusbar": {
        "immersed": true
    }
}

 

   3.沉浸式延伸的问题

   因为沉浸式模式是在manifest.json文件配置,做为了一个固定全局的设置,沉浸式的设置可能只是针对部分页面,那么对其余的页面都牵连了。

   致使的效果如图:

  

              (状态栏的高度被忽略)

  解决代码:

  mui.plusReady(function(){                      
    plus.webview.currentWebview().setStyle({
        statusbar:{background:'#ff0000'},top:0,bottom: 0
  });
 });

  background属性,设置状态栏的背景色。

 


 

 

5、 全屏显示(没有状态栏)

在应用中可调用5+ API动态改变应用是否全屏显示的状态:

 
function fullscreen(){
        // 设置应用全屏显示!
        plus.navigator.setFullscreen(true);
}
function unfullscreen(){
        // 设置应用非全屏显示!
        plus.navigator.setFullscreen(false);
}
function isfullscreen(){
        // 查询应用当前是否全屏显示!
        console.log( "是否全屏:"+(plus.navigator.isFullscreen()?"是":"否") );
}
 

 


 

 

 

 

知识改变命运
相关文章
相关标签/搜索