MySQL-day2
- (四)排序
- (五)聚合函數
- 一、count 總記錄數
- 二、max 最大值
- 三、min 最小值
- 四、sum 求和
- 五、avg 平均值
- (六)數據分組
- 一、分組
- 二、分組后的數據篩選
- (七)數據分頁顯示
- 一、獲取部分行
- 二、分頁
(四)排序
- 為了方便查看數據,可以對數據進行排序;
select * from 表名;
order by 字段1 asc|desc, 字段2 asc|desc, ...
- 將行數據按照字段1 進行排序,如果某些字段1 的值相同時,則按照字段2 排序,以此類推;
- 默認按照字段值從小到大排序;
- asc(默認值)從小到大排序,升序;
- desc 從大到小排序,降序;
例1:查詢所有學生記錄,按 age 從小到大排序
select * from students order by age;
例2:查詢所有學生記錄,按 age 從大到小排序,
年齡相同時,再按 studentNo 從小到大排序。
select * from students order by age desc, studentNo asc;
▲ where 結合 order by:
select * from 表名 where 條件 order by 字段1, 字段2;
(五)聚合函數
為了快速得到統計數據,經常會用到如下 5 個聚合函數。
🔺注意:聚合函數不能在 where 后面的條件中使用!!!
一、count 總記錄數
count(*)
表示計算總記錄數,括號中寫 * 與字段名,結果是相同的。
例1:查詢學生總數(學生總數就是 students 表中記錄的總數)
select count(*) from students;
select count(name) from students;
例2:查詢性別 sex 為 ‘女’ 的學生總數
select count(*) from students where sex='女';
二、max 最大值
max(字段)
表示求此字段的最大值。
例3:查詢最大 age
select max(age) from students;
例4:查詢性別sex 為’女’ 的最大年齡 age
select max(age) from students where sex='女';
🔺聚合函數不能在 where 后面的條件中使用。
🔺聚合函數不能與普通字段同時出現在查詢結果中。
三、min 最小值
min(字段)
表示求此字段的最小值。
例7:查詢學生最小年齡 age
select min(age) from students;
例8:查詢 class 班級為 ‘1班’ 的最小年齡 age
select min(age) from students where class='1班';
四、sum 求和
sum(字段)
表示求此字段的和。
例9:查詢學生 age 年齡總和
select sum(age) from students;
例10:查詢 hometown 為 ‘北京’ 的學生 age 總和
select sum(age) from students where hometown='北京';
五、avg 平均值
avg(字段)
表示求此字段的平均值。
例11:查詢學生平均年齡
select avg(age) from students;
例12:查詢 sex 為 ‘男’ 的平均年齡
select avg(age) from students where sex='男';
如果有null,忽略null。
比如三個年齡分別是:10,20,null
avg 計算結果是:(10+20)/2=15
(六)數據分組
一、分組
- 按照字段分組,表示此字段相同的數據會被放到一個組中。
- 分組的目的是配合聚合函數,聚合函數會對每一組的數據分布進行統計。
select 字段1, 字段2, 聚合函數... from 表名 group by 字段1, 字段2 ...
例1:查詢各種 sex 性別的人數
select sex, count(*) from students group by sex;
例2:查詢各年齡 age 的人數
SELECT age, count(*) from students group by age;
例3:分別查詢 ‘1班’ 不同性別學生數量
SELECT sex, count(*) from students where class='1班' group by sex;
例4:用數據分組方法,統計各個班級學生總數、平均年齡、最大年齡、最小年齡。
select class,count(*),avg(age),max(age),min(age) from students group by class;
例5:用數據分組方法,統計各個班級學生總數、平均年齡、最大年齡、最小年齡。
但不統計 ‘3班’,統計結果按班級名稱從大到小排序。
select class,count(*),avg(age),max(age),min(age) from students
where not class='3班' group by class order by class desc;
二、分組后的數據篩選
select 字段1, 字段2, 聚合... from 表名
group by 字段1, 字段2, 字段3...
having 字段1,...聚合...
▲ having 后面的條件運算符與 where 的相同。
例1:使用 where 子句,查詢男生總人數
select count(*) from students where sex='男';
例2:使用 having 子句,查詢男生總人數
select sex, count(*) from students group by sex having sex='男';
例3:求班級人數大于3人的班級名字
select class from students group by class having count(*)>3;
例4:用 having 子句,查詢除了 ‘1班’ 以外,其他各個班級學生的平均年齡、最大年齡、最小年齡;
select class, avg(age),max(age),min(age) from students
group by class having not class='1班';
★ where 和 having:
- where是對 from 后面指定的表進行數據篩選,屬于對原始數據的篩選;
- having是對 group by 的結果進行篩選;
- having 后面的條件中可以用聚合函數,where后面的條件不可以使用聚合函數。
練習1:查詢班級總人數大于2人的班級名稱以及班級對應的總人數。
SELECT class, count(*) from students group by class
having count(*)>2;
練習2:查詢平均年齡大于30歲id班級名稱和班級總人數。
select class,count(*),avg(age) from students
group by class having avg(age)>30;
(七)數據分頁顯示
一、獲取部分行
當數據量過大時,在一頁中查看數據是一件非常麻煩的事情。
語法:limit 開始行, 獲取行數;
select * from 表名 limit start, count
- 從 start 開始,獲取 count 條數據;
- start 索引從 0 開始,如省略 start 默認從 0 開始。
例1:查詢前 3 行學生記錄。
select * from students limit 0,3;
例2:省略 start ,查詢前 5 行學生記錄
select * from students limit 5;
例3:查詢從第 4 行開始的 3 條學生記錄
select * from students limit 3,3;
例4:查詢年齡最大的同學的name
select name from students order by age desc limit 1;
例5:查詢年齡最小的女同學信息
select * from students where sex='女' order by age limit 1;
二、分頁
當一張表記錄特別多的時候,就需要用到分頁顯示。
已知:每頁顯示 m 條數據,求:查詢第 n 頁的數據。
select * from students limit (n-1)*m,m
例1:每頁顯示 4 條記錄,查詢第 3 頁的數據。
m = 4,n = 3;
(n-1)*m = (3-1)*4 = 8;
select * from students limit 8,4;
例2:查詢 students 表,每頁顯示 5 條記錄,求總頁數。
- 查詢記錄總條數 a;
- 使用 a 除以每頁顯示條數 5,得到 b;
- 如果 b 為整數,則 b 為總頁數。
- 如果 b 不為整數,則 b+1 為總頁數。
操作 | 說明 | |
---|---|---|
第一步 | select count(*) from students | 得到 students 表的總條數,結果為:12 |
第二步 | 12 / 5 = 2.4 | 不能整除 |
第三步 | 2 + 1 = 3 | 總頁數為 3 頁 |