1. 程式人生 > >mysql筆記四之排序、聚合、分組

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