zoukankan      html  css  js  c++  java
  • oracle数据库之分组查询

       本章内容和大家分享的是数据当中的分组查询。分组查询复杂一点的是建立在多张表的查询的基础之上,(我们在上一节课的学习中已经给大家分享了多表查询的使用技巧,大家可以自行访问:多表查询1  多表查询2)而在实际项目中的分组查询的使用也是比较多的,作为初学者来说,学好分组查询的姿势是十分有必要的!

    分组查询概念

    什么是分组查询:分组查询是按照一定的规则进行分组,分组以后数据会聚合,需要使用聚合函数,但是使用聚合函数不一定要分组,分组的关键字是group by。

    首先,我们先来思考一下下面的sql语句的正确性:

    ---1.select * from t_student group by sex;     
    ---按照性别分组 男或者女 但是实际显示的是所有性别,*是所有 所以会报错,因为这种方式不是group by 表达式

    查看结果:

    ---2.select sex from t_student;               
    ---这种方式最后显示的是所有的男女,也不是分组我们想要的 男 女  数据 

    查看结果:

    ---3.select t.studentid,t.sex from t_student t group by sex;  --6条id数据对应2条数据 不是group by表达式

    查询结果:

    ---4.select sex from t_student group by sex;
    ---按照性别分组,只显示性别没有任何毛病--成功

    查看结果:

    我们看一下聚合函数的使用,聚合函数有count()  sum()  max()  min()  avg()  round() 

    --聚合函数
    count() ---统计
    sum()   ---求和
    max()   ---最大值
    min()   ---最小值
    avg()   ---平均值
    round() ---四舍五入函数

     下面小编给大家演示一下关于这些聚合函数的基础操作,有助于我们后面的分组使用:

    select max(age) from t_student;
    --求年龄的最大值
    
    select count(studentid) from t_student;
    --求学生总数
    
    select sum(studentid) from t_student;
    --所有学生id的和
    
    select min(studentid) from t_student; 
    --求学生id中的最小值
    
    select avg(studentid) from t_student;
    --求学生id的平均值

    再议聚合函数:

    select sex,sum(age) from t_student group by sex;
    --以性别分组,显示性别中的男女年龄的之和

    查看结果:

    select sex,count(studentid) from t_student group by sex;
    --以学生性别分组,显示男生和女生分别有多少?

     查看结果:

    select sex,max(age) from t_student group by sex;
    --以性别分组,显示男生中年龄最大的和女生中年龄最大的。

     查看结果:

    ok,我们通过上面的例子来继续练习一下分组查询。 

     --统计706班男生,女生人数?

    select sex,count(t2.studentid) from t_class t1,t_student t2 where t1.classid=t2.classid and t1.classid=1
    group by sex;

    查询结果:

    --查询826班男生、女生年龄的总和

    select sex,sum(t2.age) from t_class t1,t_student t2 where t1.classid=t1.classid 
    and t1.classid=3 group by sex;

     查看结果:

    --查询每门课程的总分、最高分、最低分、平均分

    --查询每门课程的总分、最高分、最低分、平均分
    select t1.coursename 课程名字,max(t2.score)最高分,min(t2.score)最低分,avg(t2.score)平均分 from t_course t1,t_score t2 where t1.courseid=t2.courseid
    group by t1.coursename;

    查看结果:

    --查询826班每位学生每门课程的总分、平均分、最高分、最低分

    select t3.coursename 课程名字,t2.name 学生姓名,
           sum(t4.score) 总分,
           avg(t4.score) 平均分,
           max(t4.score) 最高分,
           min(t4.score) 最低分
      from t_class t1, t_student t2, t_course t3, t_score t4
     where t1.classid = t2.classid
       and t2.studentid = t4.studentid
       and t4.courseid = t3.courseid
       and t1.classid = 3
     group by t3.coursename,t2.name;

    查看结果:

    --查询每个学员的总分、平均分、最高分、最低分,只显示总分在250分以上的学员

    敲笔记了哈:

    1.where 使用在分组查询之前,where后面不能使用聚合函数

    2.having 分组之后的过滤,having 紧跟group by ,有having 一定有group by ,但是有group by 不一定有having  

    3.having 后面可以使用聚合函数 

    --显示姓名
    select
    t1.name 学生姓名, sum(t2.score) 总分, avg(t2.score) 平均分, max(t2.score) 最高分, min(t2.score) 最低分 from t_student t1, t_score t2 where t1.studentid = t2.studentid group by t1.name having sum(t2.score)>250;

    查看结果:

    另外的一种展示结果:

    --不显示性名
    select sum(t2.score) 总分,
           avg(t2.score) 平均分,
           max(t2.score) 最高分,
           min(t2.score) 最低分
      from t_student t1, t_score t2
     where t1.studentid = t2.studentid
     group by t1.studentid
    having sum(t2.score) > 250;

    查询结果:

     

    到此,分组查询我们就介绍到这里了。。。

     

  • 相关阅读:
    kvm虚拟化存储管理
    k8s集群部署
    docker版的zabbix部署
    docker进阶——数据管理与网络
    docker基础
    ceph对接openstack环境
    java命令--jmap命令使用
    JVM性能分析工具jstack介绍
    SkipList跳表基本原理
    NIO之Channel、Buffer
  • 原文地址:https://www.cnblogs.com/fighter007/p/8421980.html
Copyright © 2011-2022 走看看