涉及函數(shù)
count函數(shù)
mysql中count函數(shù)用于統(tǒng)計(jì)數(shù)據(jù)表中的行的總數(shù),或者根據(jù)查詢結(jié)果統(tǒng)計(jì)某一列包含的行數(shù),常見(jiàn)的用法如下 count(*) 計(jì)算表的總行數(shù),包括空值 count(字段名) 計(jì)算指定列下的總行數(shù),忽略空值(這點(diǎn)很重要,后面我們將利用這個(gè)特性)
if(expr, v1, v2)函數(shù)
if(expr, v1, v2) 函數(shù)的意思是,如果表達(dá)式expr為true(expr<>0 and expr <> NULL),則if()返回的是v1,否則返回v2
組合上述兩個(gè)函數(shù),可以在一條語(yǔ)句中統(tǒng)計(jì)出滿足不同條件的行數(shù)
業(yè)務(wù)場(chǎng)景:在一個(gè)表中記錄了不同出版社所擁有的所有的書,以及每本書對(duì)應(yīng)的類型。
表結(jié)構(gòu)如下:?
id? ? press? ? ? ? ? ? bookName? ? ? ? ? ? ? ? ? ? ? bookTyoe?
1? ? ? 新華出版社? 《Thinking in Java》? ? 計(jì)算機(jī)類
現(xiàn)需統(tǒng)計(jì)出不同出版社的里面不同類型的書籍的總量
例:統(tǒng)計(jì)不同出版社中文學(xué)類書籍?dāng)?shù)量
select count( if( bookTyoe = ‘文學(xué)類’, id, null ) ) from table group by press
分析:當(dāng)type=1時(shí),會(huì)返回對(duì)應(yīng)的id的值,否則放回null,對(duì)于指定列的count函數(shù),null是被忽略的,這樣就得到了我們想要的統(tǒng)計(jì)數(shù)量了。?
同理,統(tǒng)計(jì)不同出版社中科幻類+計(jì)算機(jī)書籍?dāng)?shù)量:
select count( if( bookTyoein (‘科幻類’, ‘計(jì)算機(jī)書籍’), id, null ) ) from table group by press
如果是聯(lián)表查詢,返回結(jié)果中的id不是唯一的話,想要去掉重復(fù)的id再統(tǒng)計(jì),還可以在if前面加上DISTINCT,即 count( DISTINCT if( type in (2, 3), id, null ) )
等效寫法 count( DISTINCT (type = 2? and? type = 3)? or null )?
也可以使用sum+if替代上述寫法
select sum( if( bookTyoeinin (‘科幻類’, ‘計(jì)算機(jī)書籍’), 1, 0 ) )from table group by press