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()?"是":"否") );
}
 

 


 

 

 

 

知識改變命運
相關文章
相關標籤/搜索