当前位置: 首页 > 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.dtcms.com/a/307472.html

相关文章:

  • Web3.0 和 Web2.0 生态系统比较分析:差异在哪里?
  • Web3:在 VSCode 中使用 Vue 前端与已部署的 Solidity 智能合约进行交互
  • Kotlin -> 普通Lambda vs 挂起Lambda
  • Astra主题WooCommerce如何添加可变产品Astra variation product
  • tplink er2260t配置vlan透传iptv
  • python学智能算法(二十九)|SVM-拉格朗日函数求解中-KKT条件理解
  • 数据结构: 双向列表
  • 银河麒麟桌面操作系统:自定义截图快捷键操作指南
  • NXP i.MX8MP GPU 与核心库全景解析
  • rapidocr_web v1.0.0发布了
  • 旧物重生,交易有温度——旧物回收二手交易小程序,让生活更美好
  • 从“碎片化”到“完美重组”:IP报文的分片艺术
  • 从遮挡难题到精准测量:激光频率梳技术如何实现深孔 3D 轮廓的 2um 级重复精度?
  • 《Java 程序设计》第 15 章 - 事件处理与常用控件
  • 【Python修仙编程】(二) Python3灵源初探(9)
  • 无人机飞控系统3D (C++)实践
  • Coze Studio概览(四)--Prompt 管理功能详细分析
  • React的基本语法和原理
  • 力扣 Pandas 挑战(6)---数据合并
  • 融媒体中心网络安全应急预案(通用技术框架)
  • 【Debian】4-‌2 Gitea搭建
  • 专业鼠标点击器,自定义间隔次数
  • 前端核心技术Node.js(五)——Mongodb、Mongoose和接口
  • [mind-elixir]Mind-Elixir 的交互增强:单击、双击与鼠标 Hover 功能实现
  • 解决宇道项目关于接收日期格式yyyy-MM-dd HH:mm:ss后端自动转为1970-01-01 00:00:00的问题
  • 思途JSP学习 0731
  • 红黑树×协程×内存序:2025 C++后端核心三体问题攻防手册
  • LeetCode Hot 100:42. 接雨水
  • MCU中的RTC(Real-Time Clock,实时时钟)是什么?
  • 聊聊接口测试依赖第三方数据测试策略