MySQL按年/月/周/日/小時(shí)分組查詢、排序、limit及判空用法實(shí)例
一、按年/月/周/日/小時(shí)分組查詢(日期時(shí)間類型為date或者datetime)
在DATE_FORMAT(create_time,'%Y%m%d')中設(shè)置需要分組的類型和格式,如下:
'%Y%m%d'表示:20221122
'%Y-%m-%d'表示:2022-11-22
可根據(jù)自己的需要設(shè)置,年月日都是如此
如下圖user表
id | name | age | birthday | gender | create_time |
1 | 張三 | 20 | 2000-01-01 | 男 | 2022-11-22 11:11:11 |
2 | 李四 | 21 | 2001-02-02 | 男 | 2022-11-19 00:00:00 |
3 | 王五 | 23 | 1999-05-06 | 女 | 2022-11-20 23:59:59 |
按日分組查詢并排序
SELECT DATE_FORMAT(create_time,'%Y-%m-%d') days,COUNT(id) FROM user WHERE create_time > "2022-11-11 00:00:00" AND create_time < "2022-12-01 00:00:00" GROUP BY days ORDER BY days DESC;
按周分組查詢
SELECT DATE_FORMAT(create_time,'%Y-%u') weeks,COUNT(id) FROM user GROUP BY weeks;
按月分組查詢
SELECT DATE_FORMAT(create_time,'%Y-%m') months,COUNT(id) FROM user GROUP BY months
按年分組查詢
SELECT DATE_FORMAT(create_time,'%Y') months,COUNT(id) FROM user GROUP BY years
按小時(shí)分組查詢
SELECT DATE_FORMAT(create_time,'%Y-%m-%d %H') hours,COUNT(id) FROM user WHERE create_time > "2022-11-11 00:00:00" AND create_time < "2022-12-01 00:00:00" GROUP BY hours;
DATE_FORMAT()需要傳入一個(gè)特定的占位符,mysql常用的占位符可參考下表:
占位符 | 說明 |
---|---|
%Y | 年(4位) |
%y | 年(2位) |
%M | 月(英文名,如January) |
%m | 月(數(shù)字,如01) |
%D | 日(英文名,如1st) |
%d | 日(數(shù)字,如01) |
%e | 日(數(shù)字,如1) |
%U | 一年中的第幾周,從0開始 ,周日是第一天 |
%u | 一年中的第幾周,從0開始,周一是第一天 |
%H | 時(shí),24小時(shí)制,例如15 |
%h | 時(shí),12小時(shí)制,例如01 |
%i | 分 |
%s | 秒 |
二、MySQL排序
1.排序規(guī)則
使用ORDER BY 字句排序,在其后面加所需字段
- ASC(ascend): 升序
- DESC(descend): 降序
ORDER BY 字句在SELECT語句的結(jié)尾
注意:
數(shù)據(jù)庫中默認(rèn)按照先后添加順序存儲(chǔ)數(shù)據(jù),在查詢時(shí),也按照添加順序遍歷顯示結(jié)果.因此當(dāng)我們需要一些特定的數(shù)據(jù)排列時(shí)就要使用到排序
2.單列排序
根據(jù)上述用戶user表查詢:
#練習(xí)1:根據(jù)年齡降序(從大到?。┡判?/p>
SELECT * FROM user ORDER BY age DESC;
#練習(xí)2:根據(jù)出生日期升序(從小到大)排序
SELECT * FROM user ORDER BY birthday ASC;
注意:
如果在ORDER BY 后面沒有顯示指明排序方式的話,則默認(rèn)按照升序排列排序,有WHERE 和 ORDER BY 同時(shí)出現(xiàn)的地方,一定要把WHERE放在FRON語句后面,ORDER BY 往后放
SELECT * FROM user WHERE age > 20 ORDER BY age DESC;
三.limit 詳細(xì)用法
1、用于強(qiáng)制返回指定的記錄行數(shù)
在查詢中,經(jīng)常要返回前幾條或者中間某幾行數(shù)據(jù)時(shí),用到limit
語法如下:
select * from table_name limit [offset,] rows
參數(shù)說明:
- offset:指定第一個(gè)返回記錄行的偏移量(即從哪一行開始返回),注意:初始行的偏移量為0。
- rows:返回具體行數(shù)。
總結(jié):如果limit后面是一個(gè)參數(shù),就是檢索前多少行。如果limit后面是2個(gè)參數(shù),就是從offset+1行開始,檢索rows行記錄。
舉例:
select * from table_name limit 10;//檢索前10行記錄 select * from table_name limit 5 ,10;//從第6行開始,檢索10行記錄,即:檢索記錄行 6-15
2、分頁
客戶端通過傳遞page(頁碼),pageSize(每頁顯示的條數(shù))兩個(gè)參數(shù)去分頁查詢數(shù)據(jù)庫表中的數(shù)據(jù),那我們知道MySql數(shù)據(jù)庫提供了分頁的函數(shù)limit m,n,但是該函數(shù)的用法和我們的需求不一樣,所以就需要我們根據(jù)實(shí)際情況去改寫適合我們自己的分頁語句,具體的分析如下:
比如:
- 查詢第1條到第10條的數(shù)據(jù)的sql是:select * from table limit 0,10; ->對應(yīng)我們的需求就是查詢第一頁的數(shù)據(jù):select * from table limit (1-1)*10,10;
- 查詢第10條到第20條的數(shù)據(jù)的sql是:select * from table limit 10,10; ->對應(yīng)我們的需求就是查詢第二頁的數(shù)據(jù):select * from table limit (2-1)*10,10;
- 查詢第20條到第30條的數(shù)據(jù)的sql是:select * from table limit 20,10; ->對應(yīng)我們的需求就是查詢第三頁的數(shù)據(jù):select * from table limit (3-1)*10,10;
總結(jié):
通過上面的分析,可以得出符合我們需求的分頁sql格式是:
select * from table limit (page-1)*pageSize,pageSize;
四.ifnull()函數(shù)的使用
1、ifnull()的語法
ifnull(a,b)函數(shù)解釋:
- 如果value1不是空,結(jié)果返回a
- 如果value1是空,結(jié)果返回b
2、ifnull()的使用
如下表:分?jǐn)?shù)表score
id | Chinese | English | Physics |
1 | 99 | 98 | null |
2 | 88 | 99 | null |
1、 在統(tǒng)計(jì)數(shù)據(jù)時(shí)如果沒有值返回,給結(jié)果置為0
舉例:統(tǒng)計(jì)物理科目分?jǐn)?shù)總和時(shí),如果該列為null,返回0,如果不使用ifnull(),正常返回值為null
SELECT ifnull(SUM(Physics),0) FROM score;
2、在查詢數(shù)據(jù)需要計(jì)算遇到null值時(shí)
舉例:查詢id為1的學(xué)生的語文和物理的總分
錯(cuò)誤寫法(在數(shù)據(jù)庫沒有指定為空時(shí)的默認(rèn)值時(shí))
SELECT Chinese+Physics FROM score;
數(shù)據(jù)為null不能參與運(yùn)算,否則會(huì)直接報(bào)錯(cuò)。
正確寫法
SELECT ifnull(Chinese,0)+ifnull(Physics,0) FROM score;
還有就是使用SUM()等函數(shù),可以忽略計(jì)算中的空值。
SELECT SUM(Chinese,Physics) FROM score;
總結(jié)
到此這篇關(guān)于MySQL按年/月/周/日/小時(shí)分組查詢、排序、limit及判空用法的文章就介紹到這了,更多相關(guān)MySQL分組查詢、排序、limit及判空內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL如何使用正則表達(dá)式對數(shù)據(jù)進(jìn)行過濾
正則表達(dá)式的作用是匹配文本,將一個(gè)正則表達(dá)式與一個(gè)文本串進(jìn)行比較,下面這篇文章主要給大家介紹了關(guān)于SQL如何使用正則表達(dá)式對數(shù)據(jù)進(jìn)行過濾的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09CentOS 7 下使用yum安裝MySQL5.7.20 最簡單方法
這篇文章主要介紹了CentOS 7 下使用yum安裝MySQL5.7.20 最簡單 方法,需要的朋友可以參考下2018-11-11深入理解MySQL主從復(fù)制線程狀態(tài)轉(zhuǎn)變
這篇文章主要給大家介紹了關(guān)于MySQL主從復(fù)制線程狀態(tài)轉(zhuǎn)變的相關(guān)資料,文中介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02mysql數(shù)據(jù)損壞,如何通過ibd和frm文件批量恢復(fù)數(shù)據(jù)庫數(shù)據(jù)
這篇文章主要介紹了mysql數(shù)據(jù)損壞,如何通過ibd和frm文件批量恢復(fù)數(shù)據(jù)庫數(shù)據(jù)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08MySQL數(shù)據(jù)庫表修復(fù) MyISAM
這篇文章主要介紹了MySQL數(shù)據(jù)庫表修復(fù) MyISAM ,需要的朋友可以參考下2014-06-06Mysql錯(cuò)誤Every derived table must have its own alias解決方法
這篇文章主要介紹了Mysql錯(cuò)誤Every derived table must have its own alias解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08MySQL對數(shù)據(jù)庫和表進(jìn)行DDL命令的操作代碼
DDL(Data?Definition?Language),是數(shù)據(jù)定義語言的縮寫,它是SQL(Structured?Query?Language)語言的一個(gè)子集,用于定義或修改數(shù)據(jù)庫的結(jié)構(gòu),本文給大家介紹了MySQL對數(shù)據(jù)庫和表進(jìn)行DDL命令的操作,需要的朋友可以參考下2024-07-07