sql之分组

本文介绍了SQL中的分组概念,使用`GROUP BY`关键字按照特定字段进行数据分组,如单个字段和多个字段分组。结合聚合函数如`SUM`、`AVG`、`MAX`、`MIN`进行数据汇总,展示分组后的统计结果。同时,讲解了`HAVING`子句与`WHERE`子句的区别,`HAVING`用于对分组后的数据进行条件过滤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sql之分组

分组

  • 按照哪一类进行分组,关键词group by;

  • 通俗一点,就是把某一些满足设定条件的数据按某种规则进行合并

    • 创建表

      create table student
           (id  int not null,
            name1   varchar(30),
            grade  varchar(30),
            salary varchar(30))
      insert into student values(1,'zhangsan','A',1500);
      insert into student values(2,'lisi','B',3000);
      insert into student values(1,'zhangsan','A',1500);
      insert into student values(4,'qianwu','A',3500);
      insert into student values(3,'zhaoliu','C',2000);
      insert into student values(1,'huyifei','D',2500);
      
    • 单个字段分组:例如把成绩相同的分为一组

      select  name1,grade  from  student   group   by   grade
      

      在这里插入图片描述

    • 多个字段分组:比如按名字和成绩分组,如果名字和成绩同时相同可以分成一组,如果名字一样,grade不同,就不能分为一组。

      select  name1,grade  from  student   group   by   name1,salary;
      

      在这里插入图片描述

      select  name1,grade  from  student   group   by   name1,grade;
      

      在这里插入图片描述

    • 和聚合函数一起搭配

      • sum求和:把名字相同人归为一类,并求每一类工资的综合,每条目显示名字,和工资总数。

        select  name1 , sum(salary)   from   student   group  by   name1
        
      • avg求平均:把名字和成绩相同的归为一类,并求每一类工资的平均数,显示每一类名字和工资平均数

        select  name1 , avg(salary)   from  student   group  by  name1,grade
        
      • max函数:把成绩相同的归为一类,并求每一类中工资最高的,显示每一类成绩和最高工资那一项

        select   grade , max(salary)   from   student   group  by   grade 
        
      • min函数: 把成绩相同的归为一类,并求每一类中工资最低的,显示每一类成绩和最低工资那一项

        select   grade , min(salary)   from   student   group  by   grade
        
    • 和having搭配

      • having是对组进行限制,where对单个数据进行限制

      • 如果有where,group b,having时,顺序为where,group by,最后having句子

        create TABLE Table1
         (ID int primary key NOT NULL,   
          classid int, 
          sex varchar(10),
          age int) 
        Insert into Table1 (classid,sex,age) values(1,'男',20),(2,'女',22),(3,'男',23),(4,'男',22),(1,'男',24),(2,'女',19),(4,'男',26),(1,'男',24)
        ,(1,'男',20),(2,'女',22),(3,'男',23),(4,'男',22),(1,'男',24),(2,'女',19);
        
        • 查询每个班级中年龄大于20性别为男的人数:先筛选性别为男的人,然后将班级和年龄一样各自聚在一起,然后筛选出年龄大于20的那些组。

          select COUNT(*)as '>20岁人数',classid  from Table1 where sex='男' group by classid,age having age>20 
          

          在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值