当前位置: 首页 > news >正文

数据库中使用SQL作分组处理01(简单分组)

1.简单分组

GroupBy什么就Select什么

SELECT Name,Score
From StudentScore
GROUP BY Name,Score

2.聚合函数(MAX SUM AVG COUNT)

(1)计算

1.表的全部字段都可以用聚合函数,但是筛选聚合函数的结果要用Having关键字

2.聚合函数默认排除Null值

IDNameScore
1小苏100
2小苏92
3小苏80
4小军50
5小军NULL
6小军62
7小红98
8小红85
9小红90
SELECTName,SUM(Score) AS AllScore,AVG(Score) AS AverageScore,MAX(Score) AS MaxScore,MIN(Score) AS MinScore,Count(Score) As ExamCount,COUNT(CASE WHEN Score >= 60 THEN 1 END) AS PassedCount
FROM StudentScore
GROUP BY Name;

 查询结果(结论:聚合函数默认排除Null值):

(2)条数查询

1.现代数据库中,COUNT(1) 和 COUNT(*) 查询结果一致,效率一致

2.Count(字段) 查的是 该分组 中这个字段 ≠  NULL 的条数

3.Count(非分组字段) 中,重复的非 NULL 值都会被算进去,COUNT(DISTINCT 非分组字段) 则计算的是非NULL非重复的条数,简而言之,COUNT里面加DISTINCT,结果会更少

SELECTName  -- 分组字段1,Score -- 分组字段2,Count(Name) As NameCount -- 该分组中 Name ≠ NULL 的条数,Count(Score) As ScoreCount-- 该分组中 Score ≠ NULL 的条数,COUNT(1) -- 该分组中的条数(不看字段的值),COUNT(*) -- 该分组中的条数(不看字段的值)
FROM StudentScore
GROUP BY Name,Score;

【不分组全查】

SELECT COUNT(1) FROM StudentScore; --不分组,查全表条数

3.非聚合字段查询

【错误的写法】根据标题一,Group字段 和 Select字段 不一致会报错(但是我想显示出Score)

SELECT Name, Age, ScoreFROM PERSONGROUP BY Name, Age;

【方法一】取分组的MAX值

SELECT Name, Age, MAX(SCORE) AS ScoreFROM PERSONGROUP BY Name, Age;

【方法二】子查询(不推荐,不一定是唯一的)

SELECT Name,Age,(SELECT SCORE FROM SCORETABLE WHERE NAME=NAME) AS ScoreFROM PERSONGROUP BY Name,Age

4.聚合结果字段、别名字段查询

【引入】

SELECT ID,NAME,MAX(SCORE),(SELECT Code FROM TABLE2 WHERE ID = ID) AS Code
FROM TABLE
WHERE Code=500 AND SCORE > 60
GROUP BYID,NAME

这个SQL是不对的,不能对聚合函数和别名字段直接筛选,且ID=ID有歧义,解决方案有两个:


(1)SQL外包一层

SELECT * FROM (你的SQL) AS SubQuery WHERE 你的SQL的条件

SELECT *
FROM (SELECT ID,NAME,MAX(SCORE) AS MaxScore,(SELECT Code FROM TABLE2 WHERE ID = T.ID) AS Code --注意这里ID = T.ID 的 T 指代表名很重要FROM TABLE TGROUP BY ID, NAME
) AS SubQuery
WHERE Code = 500 AND MaxScore > 60;
--【注】包完之后一定要 'AS SubQuery',否则报错

(2)Having关键字

对于 聚合函数的结果 用 Having 筛选,对于别名字段在 子查询SQL 中过滤

SELECT ID,NAME,MAX(SCORE) AS MaxScore,(SELECT Code FROM TABLE2 WHERE ID = T.ID AND Code = 500) AS Code --注意这里ID = T.ID 的 T 指代表名很重要
FROM TABLE T
GROUP BY ID, NAME
HAVING MAX(SCORE) > 60;
--【注】HAVING SCORE > 60 是不对的。

http://www.xdnf.cn/news/1218619.html

相关文章:

  • 【worklist】worklist的hl7、dicom是什么关系
  • 学以致用——用Docker搭建ThinkPHP开发环境
  • 深入探索Weaviate:构建高效AI应用的数据库解决方案
  • 《人工智能导论》(python版)第2章 python基础2.2编程基础
  • 大模型流式长链接场景下 k8s 优雅退出 JAVA
  • PHP 与 MySQL 详解实战入门(1)
  • 零基础构建MCP服务器:TypeScript/Python双语言实战指南
  • 在幸狐RV1106板子上用gcc14.2本地编译安装samba-4.22.3服务器,并且支持XP系统访问共享文件夹
  • 基于单片机胎压检测/锅炉蒸汽压力/气压检测系统
  • LCM中间件入门(2):LCM核心实现原理解析
  • InfluxDB 与 Python 框架结合:Django 应用案例(二)
  • kmp复习,需要多看多练
  • Kubernetes 应用部署实战:为什么需要 Kubernetes?
  • InfluxDB 与 Python 框架结合:Django 应用案例(三)
  • Java Matcher对象中find()与matches()的区别
  • QT6 Python UI文件转换PY文件的方法
  • HttpServletRequest 和 HttpServletResponse核心接口区别
  • 哈希的概念及其应用
  • linux线程封装和互斥
  • Flutter Chen Generator - yaml配置使用
  • 了解SQL
  • 从姑苏区人工智能大模型基础设施招标|学习服务器、AI处理器、GPU
  • 【车联网kafka】Kafka核心架构与实战经验(第二篇)
  • 防火墙安全实验
  • 《秋招在即!Redis数据类型面试题解析》
  • Vue3+Vite项目如何简单使用tsx
  • SpringBoot+SpringAI打造智能对话机器人
  • MySQL 8.0 OCP 1Z0-908 题目解析(38)
  • Kafka Streams窗口技术全解析:从理论到电商实时分析实战
  • TTS语音合成|GPT-SoVITS语音合成服务器部署,实现http访问