mysql筆記四之排序、聚合、分組
1.-- 排序
-- order by 欄位 預設就是升序排序(小的在前 大的在後)
-- asc從小到大排列,即升序
-- 查詢年齡在18到34歲之間的男性,按照年齡從小到大排序
select * from students where age between 18 and 34 and gender = 1 order by age;
select * from students where age between 18 and 34 and gender = 1 order by age asc;
-- 降序 desc
-- desc從大到小排序,即降序
-- 查詢年齡在18到34歲之間的女性,身高從高到矮排序 --> 降序
select * from students where age between 18 and 34 and gender = 2 order by height desc;
-- order by 多個欄位
-- 查詢年齡在18到34歲之間的女性,身高從高到矮排序, 如果身高相同的情況下按照年齡從小到大排序
select * from students where age between 18 and 34 and gender = 2 order by height desc,age asc;
-- 查詢年齡在18到34歲之間的女性,身高從高到矮排序, 如果身高相同的情況下按照年齡從小到大排序, 如果年齡也相同那麼按照id從大到小排序
select * from students where age between 18 and 34 and gender = 2 order by height desc,age asc, id desc;
-- 按照年齡從小到大、身高從高到矮的排序
select * from students order by age asc, height desc;
2.-- 聚合函式 為了統計而生
-- 總數
-- count()
-- 統計班級有多少人
-- 以行為單位 有一行算一行
-- count(*)的效率是最高
select * from students;
select count(*) from students;
select count(id) from students;
-- 查詢男性有多少人,女性有多少人 目前辦不到
select count(*) from students where gender = 1;
select count(*) from students where gender = 2;
-- 最大值
-- max()
-- 查詢最大的年齡
select max(age) from students;
-- 查詢女性的最高 身高
select max(height) from students where gender = 2;
-- 查詢最高身高對應的名字
-- 目前也辦不到 需要學習子查詢
# 錯誤的: select name, max(height) from students;
-- 小月月 180
-- 最小值
-- min()
select min(age) from students;
-- 求和
-- sum()
-- 計算所有人的年齡總和
select sum(height) from students;
# 錯誤select sum(height) / count(*) from students;
select sum(height) / count(height) from students;
-- 平均值
-- avg()
-- 計算平均年齡
select avg(age) from students;
-- 計算平均身高
select avg(height) from students;
-- 四捨五入
-- 計算所有人的平均年齡,保留2位小數
-- sql中內建的函式可以四捨五入 round()
-- 可以通過 ? 獲取幫助 比如檢視函式: ? functions
select round(avg(age),2) from students;
-- 計算男性的平均身高 保留2位小數
3.-- 分組
-- group by 欄位
-- 檢視班級上有哪些存在性別
select distinct gender from students;
select gender from students group by gender;
---- 查詢所有的性別
select gender from students;
-- 按照性別分組
select gender from students group by gender;
-- 計算每種性別中的人數
select gender, count(*) from students group by gender;
-- 計算每種性別中的最大年齡
select gender, max(age) from students group by gender;
-- 先根據性別把資料分為二組
select gender, name from students group by gender;
-- group_concat(...)
# 錯誤的 select gender,name from students group by gender;
-- concat: 拼接
-- 檢視每個性別下有哪些人
select gender, group_concat(name) from students group by gender;
-- 檢視每個性別下有哪些人和對應的年齡
select gender, group_concat(name,"-",age) from students group by gender;
-- 查詢同種性別中的姓名和身高
select gender,group_concat(name,"-",height) from students group by gender;
-- 計算男性的人數
select count(*) from students where gender = 1;
select gender,count(*) from students group by gender;
select gender,count(*) from students group by gender having gender = 1;
-- 對於分組之後的資料做進一步的篩選操作
-- 使用having
-- 可以使用having 表示對於已經分組的資料做進一步的篩選
-- 除了男生以外的分組的人數
select gender,count(*) from students group by gender having gender != 1;
select gender,count(*) from students group by gender having not gender = 1;
-- having 對於分組之後的資料 做進一步的篩選
-- 查詢每種性別中的平均年齡avg(age)
select gender, avg(age) from students group by gender;
-- 查詢每種性別中的平均年齡avg(age), 最大年齡,平均身高,最高身高
select gender, avg(age) ,max(age), avg(height),max(height) from students group by gender;
-- 查詢平均年齡超過30歲的性別,以及姓名
-- 1. 先根據性別分組 2. 對應的性別的平均年齡是否大於30歲 需要查詢的是性別和對應的姓名
select gender,group_concat(name) from students group by gender having avg(age) > 30;
-- having 和 where 的區別
where 對於源資料的篩選操作
having 表示對於已經分組的資料做進一步的篩選, 如果有having 就一定有group by , 有group by 不一定就有having