MySQL分組查詢、排序查詢、分頁查詢以及執(zhí)行順序
前言
DQL(Data Query Language)是SQL中最重要的語言類型之一,用于查詢數(shù)據(jù)庫中表的記錄。在日常業(yè)務(wù)系統(tǒng)中,查詢操作頻率高于增刪改操作。本文將深入探討DQL的分組查詢、排序查詢和分頁查詢等常見操作,為讀者提供全面的DQL查詢知識。
一. 分組查詢
1.1 語法
SELECT 字段列表 FROM 表名 [ WHERE 條件 ] GROUP BY 分組字段名 [ HAVING 分組后過濾條件 ];
1.2 where與having區(qū)別
- 執(zhí)行時機不同:where是分組之前進行過濾,不滿足where條件,不參與分組;而having是分組之后對結(jié)果進行過濾。
- 判斷條件不同:where不能對聚合函數(shù)進行判斷,而having可以。
1.3 注意事項:
- 分組之后,查詢的字段一般為聚合函數(shù)和分組字段,查詢其他字段無任何意義。
- 執(zhí)行順序: where > 聚合函數(shù) > having 。
- 支持多字段分組, 具體語法為 : group by columnA,columnB
1.4 案例:
A. 根據(jù)性別分組 , 統(tǒng)計男性員工 和 女性員工的數(shù)量
select gender, count(*) from emp group by gender ;
B. 根據(jù)性別分組 , 統(tǒng)計男性員工 和 女性員工的平均年齡
select gender, avg(age) from emp group by gender ;
C. 查詢年齡小于45的員工 , 并根據(jù)工作地址分組 , 獲取員工數(shù)量大于等于3的工作地址
select workaddress, count(*) address_count from emp where age < 45 group byworkaddress having address_count >= 3;
D. 統(tǒng)計各個工作地址上班的男性及女性員工的數(shù)量
select workaddress, gender, count(*) '數(shù)量' from emp group by gender , workaddress;
二. 排序查詢
排序在日常開發(fā)中是非常常見的一個操作,有升序排序,也有降序排序。
2.1 語法
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ;
2.2 排序方式
- ASC : 升序(默認值)
- DESC: 降序
2.3 注意事項:
- 如果是升序, 可以不指定排序方式ASC ;
- 如果是多字段排序,當(dāng)?shù)谝粋€字段值相同時,才會根據(jù)第二個字段進行排序 ;
2.4 案例:
A. 根據(jù)年齡對公司的員工進行升序排序
select * from emp order by age asc; select * from emp order by age;
B. 根據(jù)入職時間, 對員工進行降序排序
select * from emp order by entrydate desc;
C. 根據(jù)年齡對公司的員工進行升序排序 , 年齡相同 , 再按照入職時間進行降序排序
select * from emp order by age asc , entrydate desc;
三. 分頁查詢
分頁操作在業(yè)務(wù)系統(tǒng)開發(fā)時,也是非常常見的一個功能,我們在網(wǎng)站中看到的各種各樣的分頁條,后臺都需要借助于數(shù)據(jù)庫的分頁操作。
3.1 語法
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查詢記錄數(shù) ;
3.2 注意事項:
- 起始索引從0開始,起始索引 = (查詢頁碼 - 1)* 每頁顯示記錄數(shù)。
- 分頁查詢是數(shù)據(jù)庫的方言,不同的數(shù)據(jù)庫有不同的實現(xiàn),MySQL中是LIMIT。
- 如果查詢的是第一頁數(shù)據(jù),起始索引可以省略,直接簡寫為 limit 10。
3.3 案例:
A. 查詢第1頁員工數(shù)據(jù), 每頁展示10條記錄
select * from emp limit 0,10; select * from emp limit 10;
B. 查詢第2頁員工數(shù)據(jù), 每頁展示10條記錄 --------> (頁碼-1)*頁展示記錄數(shù)
select * from emp limit 10,10;
四. 執(zhí)行順序
在講解DQL語句的具體語法之前,我們已經(jīng)講解了DQL語句的完整語法,及編寫順序,接下來,我們要來說明的是DQL語句在執(zhí)行時的執(zhí)行順序,也就是先執(zhí)行那一部分,后執(zhí)行那一部分。
4.1 驗證
查詢年齡大于15的員工姓名、年齡,并根據(jù)年齡進行升序排序。
select name , age from emp where age > 15 order by age asc;
在查詢時,我們給emp表起一個別名 e,然后在select 及 where中使用該別名。
select e.name , e.age from emp e where e.age > 15 order by age asc;
執(zhí)行上述SQL語句后,我們看到依然可以正常的查詢到結(jié)果,此時就說明: from 先執(zhí)行, 然后where 和 select 執(zhí)行。那 where 和 select 到底哪個先執(zhí)行呢?
此時,此時我們可以給select后面的字段起別名,然后在 where 中使用這個別名,然后看看是否可以執(zhí)行成功。
select e.name ename , e.age eage from emp e where eage > 15 order by age asc;
執(zhí)行上述SQL報錯了:
由此我們可以得出結(jié)論: from 先執(zhí)行,然后執(zhí)行 where , 再執(zhí)行select 。
接下來,我們再執(zhí)行如下SQL語句,查看執(zhí)行效果:
select e.name ename , e.age eage from emp e where e.age > 15 order by eage asc;
結(jié)果執(zhí)行成功。 那么也就驗證了: order by 是在select 語句之后執(zhí)行的。
綜上所述,我們可以看到DQL語句的執(zhí)行順序為: from … where … group by …having … select … order by … limit …
全篇總結(jié)
本文詳細介紹了DQL(Data Query Language)的分組查詢、排序查詢和分頁查詢等常見操作,包括語法、注意事項和實例演示。通過學(xué)習(xí)本文,讀者將掌握使用DQL進行數(shù)據(jù)庫查詢的基本技能,為日常數(shù)據(jù)庫操作提供了重要的指導(dǎo)和實際應(yīng)用知識。
相關(guān)文章
SQL 四種連接-左外連接、右外連接、內(nèi)連接、全連接詳解
這篇文章主要介紹了SQL 四種連接-左外連接、右外連接、內(nèi)連接、全連接詳解的相關(guān)資料,需要的朋友可以參考下2016-11-11mysql出現(xiàn)“Incorrect key file for table”處理方法
今天在恢復(fù)一個客戶數(shù)據(jù)的時候。發(fā)現(xiàn)了一貫問題。有多個表損壞了。因為都是直接把表復(fù)制進去的。然后就出現(xiàn)了這個問題問題2013-07-07Mysql如何在select查詢時追加(添加)一個字段并指定值
這篇文章主要介紹了Mysql如何在select查詢時追加(添加)一個字段并指定值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09詳解MySQL中DROP,TRUNCATE 和DELETE的區(qū)別實現(xiàn)mysql從零開始
注意:這里說的delete是指不帶where子句的delete語句 相同點: truncate和不帶where子句的delete, 以及drop都會刪除表內(nèi)的數(shù)據(jù)2008-04-04