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ǔ)上我們梳理下聚合和分組。

對(duì)表進(jìn)行聚合學(xué)習(xí)重點(diǎn)

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

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

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

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

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

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

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

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

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

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

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

對(duì)表進(jìn)行分組學(xué)習(xí)重點(diǎn)

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

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

語法6. GROUP BY子句

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

下面我們來練習(xí)一下

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

運(yùn)行結(jié)果如下:

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

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

運(yùn)行結(jié)果如下:

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

這里我們思考一個(gè)問題:

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

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

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

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

若不方便掃碼,搜微信號(hào):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(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".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 = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+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); }