MySQL创建字段+数据处理函数+汇总数据(聚集函数)+分组数据
生活随笔
收集整理的這篇文章主要介紹了
MySQL创建字段+数据处理函数+汇总数据(聚集函数)+分组数据
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【0】README 0.1)本文部分文字描述轉(zhuǎn)自“MySQL 必知必會(huì)”,旨在review“MySQL創(chuàng)建字段+數(shù)據(jù)處理函數(shù)+匯總數(shù)據(jù)(聚集函數(shù))+分組數(shù)據(jù)” 的基礎(chǔ)知識(shí);
【1】創(chuàng)建計(jì)算字段 1)problem+solution 1.1)problem:存儲(chǔ)在表中的數(shù)據(jù)都不是應(yīng)用程序所需要的。我們需要直接從數(shù)據(jù)庫中檢索出轉(zhuǎn)換,計(jì)算或格式化過的數(shù)據(jù); 1.2)solution:這就是計(jì)算字段發(fā)揮作用所在了, 計(jì)算字段是運(yùn)行時(shí)在 select語句內(nèi)創(chuàng)建的; 2)字段定義:基本上與列的意思相同,經(jīng)常互換使用,不過數(shù)據(jù)庫列一般稱為列,而術(shù)語字段常用在計(jì)算字段的連接上; Attention)建議在數(shù)據(jù)庫服務(wù)器上完成對(duì)數(shù)據(jù)的轉(zhuǎn)換和格式化工作,因?yàn)橄啾扔诳蛻魴C(jī),數(shù)據(jù)庫服務(wù)器完成這些操作要快得多;
3)拼接字段 3.1)拼接:將值聯(lián)結(jié)到一起構(gòu)成單個(gè)值(使用 concat() 函數(shù)來拼接兩個(gè)列);
3.2)刪除數(shù)據(jù)右側(cè)多余空格來整理數(shù)據(jù): 這可以通過RTrim()函數(shù)來實(shí)現(xiàn),(不區(qū)分大小寫,即rtrim()函數(shù)),當(dāng)然也有l(wèi)trim() 函數(shù) 和 trim() 函數(shù);
4)執(zhí)行算術(shù)能力
Attention)MySQL中的now() 函數(shù),返回當(dāng)前日期和時(shí)間;
【2】使用數(shù)據(jù)處理函數(shù) 1)上一章中的 rtrim() + ltrim() + trim() 就是一個(gè)利用函數(shù)的荔枝; Attention)能運(yùn)行在多個(gè)系統(tǒng)上的代碼稱為可移植性;相對(duì)來說,多數(shù)SQL語句是可移植的,但函數(shù)的移植性卻不強(qiáng),幾乎每種DBMS 的實(shí)現(xiàn)都支持其他實(shí)現(xiàn)不支持的函數(shù);為了代碼的可移植性,許多SQL 程序員不贊成使用特殊實(shí)現(xiàn)的功能;如果你決定使用函數(shù),應(yīng)該保證做好代碼注釋;(干貨——不建議在MySQL中使用函數(shù),因?yàn)槠浜瘮?shù)的可移植性不高); 2)文本處理函數(shù)
3)日期和時(shí)間處理函數(shù)
Attention)首先需要注意的是MySQL 使用的日期格式。無論你什么時(shí)候指定一個(gè)日期,不管是插入還是更新表值還是用where子句進(jìn)行過濾,日期必須為格式 yyyy-mm-dd, 這是首選的日期格式,因?yàn)樗懦硕嗔x性(如 04/05/06 是 2006年5月4日還是2006年4月5日或2004年 5月6日呢?) problem+solution)
problem)如上圖所示,對(duì)于datetime 類型的 deal_time ,where deal_time='2016-05-10' 檢索失敗; solution)指示MySQL 僅將給出的日期與列中的日期部分進(jìn)行比較,而不是將給出的日期和整個(gè)列值進(jìn)行比較。為此,必須使用Date()函數(shù);
Attention)date() 函數(shù) 和 time()函數(shù)都是在 MySQL4.1.1引入的;
4)還有一種日期需要比較。如,想要檢索出 2005年9月下的所有訂單,怎么辦?(between ... and ... 語句)
5)數(shù)值處理函數(shù)
【3】匯總數(shù)據(jù) 1)聚集函數(shù):如確定表中行數(shù);獲得表中行組的和;找出表列的最大值,最小值和平均值; 1.1)聚集函數(shù)定義:運(yùn)行在行組上, 計(jì)算和返回單個(gè)值的函數(shù);
1.2)avg()函數(shù)
Attention)NULL值:avg() 函數(shù)忽略列值為null 的行; 1.3)count() 函數(shù) 的兩種用法 func1)使用count(*)對(duì)表中行的數(shù)目進(jìn)行計(jì)數(shù),不管表列中包含的是空值(NULL)還是非空值; func2)使用count(column)對(duì)特定列中具有值的進(jìn)行計(jì)數(shù),忽略NULL 值;
1.4)max() 函數(shù) 和 min() 函數(shù) + sum()函數(shù)
2)聚集不同值:以上5個(gè)聚集函數(shù)都可以如下使用: 2.1)對(duì)所有的行執(zhí)行計(jì)算,指定all 參數(shù)或不給參數(shù)(因?yàn)閍ll 是默認(rèn)行為); 2.2)只包含不同的值,指定distinct 參數(shù); 看個(gè)荔枝)考慮各個(gè)不同的price(distinct==不同的)
3)組合聚集函數(shù)
【4】分組數(shù)據(jù)(group by ?和 having 子句) 1)數(shù)據(jù)分組:統(tǒng)計(jì)每個(gè)供應(yīng)商提供的產(chǎn)生數(shù)量; 2)創(chuàng)建分組:分組是在select 語句中通過 group by 子句創(chuàng)建的;
3)在具體使用 group by 子句前,需要知道一些重要的規(guī)定(rules) r1)group by 子句可以包含任意數(shù)目的列,這使得對(duì)分組可以嵌套,為數(shù)據(jù)分組提供更細(xì)致的控制(也即?group by column1, column2==先按照column1進(jìn)行分組,再按照column2進(jìn)行分組); r2)如果在group by 子句中嵌套了分組,數(shù)據(jù)將在最后規(guī)定的分組上進(jìn)行匯總。換句話說,在建立分組時(shí),指定的所有列都一起計(jì)算; r3)group by子句中列出的每個(gè)列都必須是檢索列或有效的表達(dá)式。如果在select中使用表達(dá)式,則必須在group by子句中指定相同的表達(dá)式,不能使用別名; r4)初開聚集計(jì)算語句外,select語句中的每個(gè)列都必須在?group by 子句中給出;(干貨規(guī)定) r5)如果分組列中具有null 值, 則null 值將作為一個(gè)分組返回。 如果列中有多行NULL 值,它們將分為一組; r6)group by 子句必須出現(xiàn)在 where 子句之后,order by 子句之前;(干貨——group by 子句在 where子句和order by 子句的位置) Attention)使用rollup:使用with rollup 關(guān)鍵字,可以得到每個(gè)分組以及每個(gè)分組匯總級(jí)別(針對(duì)每個(gè)分組)的值;
4)過濾分組 4.1)過濾分組使用 having子句進(jìn)行處理; 4.2)where子句和having子句的區(qū)別(Difference): D1)where過濾行,而having 過濾列; D2)where 在數(shù)據(jù)分組前進(jìn)行過濾,而having在數(shù)據(jù)分組后進(jìn)行過濾;(干貨——這是where 和having一個(gè)重要的區(qū)別)
Attention)having子句的位置:having子句過濾是基于group by的,它在group by子句的后面 ; 看個(gè)荔枝)證明where 在數(shù)據(jù)分組前進(jìn)行過濾,而having在數(shù)據(jù)分組后進(jìn)行過濾;(干貨——這是where 和having一個(gè)重要的區(qū)別)
5)分組和排序(group by 和 order by) 5.1)group by 和 order by的不同
5.2)不要忘記group by:一般在使用 group by 子句時(shí),應(yīng)該也給出order by子句。這是保證數(shù)據(jù)正確排序的唯一方法;
6)select 子句的順序
【1】創(chuàng)建計(jì)算字段 1)problem+solution 1.1)problem:存儲(chǔ)在表中的數(shù)據(jù)都不是應(yīng)用程序所需要的。我們需要直接從數(shù)據(jù)庫中檢索出轉(zhuǎn)換,計(jì)算或格式化過的數(shù)據(jù); 1.2)solution:這就是計(jì)算字段發(fā)揮作用所在了, 計(jì)算字段是運(yùn)行時(shí)在 select語句內(nèi)創(chuàng)建的; 2)字段定義:基本上與列的意思相同,經(jīng)常互換使用,不過數(shù)據(jù)庫列一般稱為列,而術(shù)語字段常用在計(jì)算字段的連接上; Attention)建議在數(shù)據(jù)庫服務(wù)器上完成對(duì)數(shù)據(jù)的轉(zhuǎn)換和格式化工作,因?yàn)橄啾扔诳蛻魴C(jī),數(shù)據(jù)庫服務(wù)器完成這些操作要快得多;
3)拼接字段 3.1)拼接:將值聯(lián)結(jié)到一起構(gòu)成單個(gè)值(使用 concat() 函數(shù)來拼接兩個(gè)列);
3.2)刪除數(shù)據(jù)右側(cè)多余空格來整理數(shù)據(jù): 這可以通過RTrim()函數(shù)來實(shí)現(xiàn),(不區(qū)分大小寫,即rtrim()函數(shù)),當(dāng)然也有l(wèi)trim() 函數(shù) 和 trim() 函數(shù);
4)執(zhí)行算術(shù)能力
Attention)MySQL中的now() 函數(shù),返回當(dāng)前日期和時(shí)間;
【2】使用數(shù)據(jù)處理函數(shù) 1)上一章中的 rtrim() + ltrim() + trim() 就是一個(gè)利用函數(shù)的荔枝; Attention)能運(yùn)行在多個(gè)系統(tǒng)上的代碼稱為可移植性;相對(duì)來說,多數(shù)SQL語句是可移植的,但函數(shù)的移植性卻不強(qiáng),幾乎每種DBMS 的實(shí)現(xiàn)都支持其他實(shí)現(xiàn)不支持的函數(shù);為了代碼的可移植性,許多SQL 程序員不贊成使用特殊實(shí)現(xiàn)的功能;如果你決定使用函數(shù),應(yīng)該保證做好代碼注釋;(干貨——不建議在MySQL中使用函數(shù),因?yàn)槠浜瘮?shù)的可移植性不高); 2)文本處理函數(shù)
3)日期和時(shí)間處理函數(shù)
Attention)首先需要注意的是MySQL 使用的日期格式。無論你什么時(shí)候指定一個(gè)日期,不管是插入還是更新表值還是用where子句進(jìn)行過濾,日期必須為格式 yyyy-mm-dd, 這是首選的日期格式,因?yàn)樗懦硕嗔x性(如 04/05/06 是 2006年5月4日還是2006年4月5日或2004年 5月6日呢?) problem+solution)
problem)如上圖所示,對(duì)于datetime 類型的 deal_time ,where deal_time='2016-05-10' 檢索失敗; solution)指示MySQL 僅將給出的日期與列中的日期部分進(jìn)行比較,而不是將給出的日期和整個(gè)列值進(jìn)行比較。為此,必須使用Date()函數(shù);
Attention)date() 函數(shù) 和 time()函數(shù)都是在 MySQL4.1.1引入的;
4)還有一種日期需要比較。如,想要檢索出 2005年9月下的所有訂單,怎么辦?(between ... and ... 語句)
5)數(shù)值處理函數(shù)
【3】匯總數(shù)據(jù) 1)聚集函數(shù):如確定表中行數(shù);獲得表中行組的和;找出表列的最大值,最小值和平均值; 1.1)聚集函數(shù)定義:運(yùn)行在行組上, 計(jì)算和返回單個(gè)值的函數(shù);
1.2)avg()函數(shù)
Attention)NULL值:avg() 函數(shù)忽略列值為null 的行; 1.3)count() 函數(shù) 的兩種用法 func1)使用count(*)對(duì)表中行的數(shù)目進(jìn)行計(jì)數(shù),不管表列中包含的是空值(NULL)還是非空值; func2)使用count(column)對(duì)特定列中具有值的進(jìn)行計(jì)數(shù),忽略NULL 值;
1.4)max() 函數(shù) 和 min() 函數(shù) + sum()函數(shù)
2)聚集不同值:以上5個(gè)聚集函數(shù)都可以如下使用: 2.1)對(duì)所有的行執(zhí)行計(jì)算,指定all 參數(shù)或不給參數(shù)(因?yàn)閍ll 是默認(rèn)行為); 2.2)只包含不同的值,指定distinct 參數(shù); 看個(gè)荔枝)考慮各個(gè)不同的price(distinct==不同的)
3)組合聚集函數(shù)
【4】分組數(shù)據(jù)(group by ?和 having 子句) 1)數(shù)據(jù)分組:統(tǒng)計(jì)每個(gè)供應(yīng)商提供的產(chǎn)生數(shù)量; 2)創(chuàng)建分組:分組是在select 語句中通過 group by 子句創(chuàng)建的;
3)在具體使用 group by 子句前,需要知道一些重要的規(guī)定(rules) r1)group by 子句可以包含任意數(shù)目的列,這使得對(duì)分組可以嵌套,為數(shù)據(jù)分組提供更細(xì)致的控制(也即?group by column1, column2==先按照column1進(jìn)行分組,再按照column2進(jìn)行分組); r2)如果在group by 子句中嵌套了分組,數(shù)據(jù)將在最后規(guī)定的分組上進(jìn)行匯總。換句話說,在建立分組時(shí),指定的所有列都一起計(jì)算; r3)group by子句中列出的每個(gè)列都必須是檢索列或有效的表達(dá)式。如果在select中使用表達(dá)式,則必須在group by子句中指定相同的表達(dá)式,不能使用別名; r4)初開聚集計(jì)算語句外,select語句中的每個(gè)列都必須在?group by 子句中給出;(干貨規(guī)定) r5)如果分組列中具有null 值, 則null 值將作為一個(gè)分組返回。 如果列中有多行NULL 值,它們將分為一組; r6)group by 子句必須出現(xiàn)在 where 子句之后,order by 子句之前;(干貨——group by 子句在 where子句和order by 子句的位置) Attention)使用rollup:使用with rollup 關(guān)鍵字,可以得到每個(gè)分組以及每個(gè)分組匯總級(jí)別(針對(duì)每個(gè)分組)的值;
4)過濾分組 4.1)過濾分組使用 having子句進(jìn)行處理; 4.2)where子句和having子句的區(qū)別(Difference): D1)where過濾行,而having 過濾列; D2)where 在數(shù)據(jù)分組前進(jìn)行過濾,而having在數(shù)據(jù)分組后進(jìn)行過濾;(干貨——這是where 和having一個(gè)重要的區(qū)別)
Attention)having子句的位置:having子句過濾是基于group by的,它在group by子句的后面 ; 看個(gè)荔枝)證明where 在數(shù)據(jù)分組前進(jìn)行過濾,而having在數(shù)據(jù)分組后進(jìn)行過濾;(干貨——這是where 和having一個(gè)重要的區(qū)別)
5)分組和排序(group by 和 order by) 5.1)group by 和 order by的不同
5.2)不要忘記group by:一般在使用 group by 子句時(shí),應(yīng)該也給出order by子句。這是保證數(shù)據(jù)正確排序的唯一方法;
6)select 子句的順序
總結(jié)
以上是生活随笔為你收集整理的MySQL创建字段+数据处理函数+汇总数据(聚集函数)+分组数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑版秘密潜入3修改器(秘密潜入怎么调中
- 下一篇: MySQL数据检索+查询+全文本搜索