99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀mysql面試經(jīng)典50題:帶你從聚合和分組開始
mysql面試經(jīng)典50題:帶你從聚合和分組開始
2020-06-09
收藏

前面我們介紹了mysql數(shù)據(jù)庫中的建表導(dǎo)表的步驟以及基礎(chǔ)的SELECT語句,本篇再基于第一篇文章的數(shù)據(jù)基礎(chǔ)上我們梳理下聚合和分組。

對表進行聚合學習重點

  • 使用聚合函數(shù)對表中的列進行計算合計值或者平均值等的匯總操作。
  • 通常,聚合函數(shù)會對NULL以外的對象進行匯總。但是只有COUNT函數(shù)例外,使用COUNT(*)可以查出包含NULL在內(nèi)的全部數(shù)據(jù)行數(shù)。
  • 使用DISTINCT關(guān)鍵字刪除重復(fù)值。

通過SQL對數(shù)據(jù)進行某種操作或計算時需要使用某種函數(shù),如:計數(shù)count函數(shù),求和sum函數(shù)等。

以下是5個最常用的函數(shù):

  • count:計算表中的記錄數(shù)(行數(shù))
  • sum:計算表中數(shù)值列中數(shù)據(jù)的合計值
  • avg:計算表中數(shù)值列中數(shù)據(jù)的平均值
  • max:求出表中任意列中數(shù)據(jù)的最大值
  • min:求出表中任意列中數(shù)據(jù)的最小值

用于匯總的函數(shù)稱為聚合函數(shù),所謂聚合,就是將多行匯總為一行,實際上,所有的聚合函數(shù)都是這樣,輸入多行輸出一行。

例如我們將上面的第2題改一改

  1. 查詢1990年出生的學生人數(shù)
select 
		count(s_id)
from 
		student 
where 
		year(s_age)='1990';

運行結(jié)果如下:(這里由原來的5行記錄匯總聚合成了一行)

  1. 查詢"李"姓老師的數(shù)量
select 
		count(t_id) as "李"姓老師的數(shù)量
from 
		teacher
where 
		t_name like '李%'
group by
		t_id;

運行結(jié)果如下:(這里由原來的5行記錄匯總聚合成了一行)

select count(t_id) as ‘"李"姓老師的數(shù)量’ from teacher where t_name like ‘李%’ group by t_id;

對表進行分組學習重點

  • 使用GROUP BY子句可以像切蛋糕那樣將表分割。通過使用聚合函數(shù)和GROUP BY子句,可以根據(jù)某個分組依據(jù)將表分割后再進行匯總。
  • 聚合鍵中包含NULL時,在結(jié)果中會以“不確定”行(空行)的形式表現(xiàn)出來。
  • 使用聚合函數(shù)和GROUP BY子句時需要注意以下4點。1.只能寫在SELEC子句之中2.GROUP BY子句中不能使用SELECT子句中列的別名3.GROUP BY子句的聚合結(jié)果是無序的。4.WHERE子句中不能使用聚合函數(shù)。

如果只使用聚合函數(shù),則是針對表中的所有數(shù)據(jù)進行匯總處理,如果我們想把表中的數(shù)據(jù)按某種劃分方式劃分成幾組,再看每組的匯總結(jié)果,比如我們想看一下每門課程的學生人數(shù)該怎樣去處理呢?那就需要加入GROUP BY子句。

語法6. GROUP BY子句

SELECT <列名>,...
	FROM <表名>
 	GROUP BY <列名>,...;

下面我們來練習一下

  1. 查詢每門課程被選修的學生數(shù)
select 
		c_id,
		count(s_id) as '選修學生數(shù)' 
from 
		stu_sco 
group by 
		c_id;

運行結(jié)果如下:

可以看出在未使用GROUP BY子句時,結(jié)果只有一行,使用GROUP BY子句后,將表中的數(shù)據(jù)按照c_id進行了切分處理,然后返回每組的聚合結(jié)果。

  1. 查詢同名同姓學生名單,并統(tǒng)計同名人數(shù)
select 
		s_name,
    count(s_name)-1 as num 
from 
		student 
group by 
		s_name;

運行結(jié)果如下:

這里我們可以看數(shù)據(jù)中并沒有重名的人。

這里我們思考一個問題:

那么分組和聚合的關(guān)系是什么呢?是有聚合就一定有分組呢?還是有分組就一定有聚合呢?再或者是兩者必須同時出現(xiàn)缺一不可呢?

這里小編給出的答案是:這里并沒有什么絕對的情況。

  1. 當然一般情況下兩者是同時出現(xiàn)的。(我們既然進行了分組,是想看分組后返回的每組的聚合結(jié)果)
  2. 有聚合沒有分組的情況:例如我們題3中,只有count(*)并沒有g(shù)roup by ,是因為這里我們查的是where條件篩選后的全部行的計數(shù),只有一組的情況下,就不需要group by啦。
  3. 有分組沒有聚合的情況:當按照主鍵進行分組時,select子句中沒有聚合函數(shù)代碼也不會報錯,但這樣的分組也基本沒有意義,基本不會這樣去寫,這里只是舉個小栗子。

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }