做用:css
- 能夠將查詢結果集的某一列的字段值進行替換
- 它能夠生成一個新列
- 至關於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、狀態欄狀態類型
- 默認
- 變色(設置顏色)
- 透明(沉浸式)
- 消失(全屏)
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()?"是":"否") ); }