数据库专辑--SQL分类汇总(group by...with rollup),增加“总计”字段

news2024/11/18 22:22:41

系列文章

C#底层库–数据库访问帮助类(MySQL版)

数据库专辑–WITH CHECK OPTION的用法

文章目录

  • 系列文章
  • 前言
  • 一、概念介绍
  • 二、测试用例
    • 2.1 创建表
    • 2.2 初始化数据
    • 2.3 数据查询
    • 2.4 分析问题
    • 2.5 解决问题
    • 2.6 推荐另一种写法,使用COALESCE
  • 三、用法总结


前言

本专辑主要介绍SQL的功能与特点、SQL数据定义语言(表、视图、索引、约束)、SQL数据操作语言(数据检索、数据插入、数据删除、数据更新)、创建与删除触发器、SQL数据控制语言(安全性和授权、事务处理)以及嵌入式SQL。
如果你对本专辑感兴趣,持续关注吧。大家有任何问题,也可以评论区反馈,私信我。

一、概念介绍

数据库select查询语句格式:

SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]…
FROM <表名或视图名>[,<表名或视图名>]
[WHERE <条件表达式>]
[GROUP BY <列名 1> [HAVING<条件表达式>] ]
[ORDER BY <列名 2> [ASC|DESC]…]

group by作用:

主要用来对查询的结果进行分组,相同组合的分组条件在结果集中只显示一行记录。使用group by从句时,通过添加聚合函数(主要有COUNT()、SUM、MAX()、MIN()等)可以使数据聚合。

with rollup:

rollup 是根据维度在数据结果集中进行的聚合操作。

OALESCE作用:

OALESCE是一个函数, (expression_1, expression_2, …,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值。如果所有的表达式都是空值,最终将返回一个空值。使用COALESCE在于大部分包含空值的表达式最终将返回空值。

二、测试用例

2.1 创建表

创建学生信息表student

CREATE TABLE student(
sid VARCHAR(10) PRIMARY KEY NOT NULL COMMENT '学生学号',
class VARCHAR(10) NOT NULL COMMENT '班级',
profession VARCHAR(10) NOT NULL COMMENT '专业',
NAME VARCHAR(20) NOT NULL COMMENT '学生姓名',
phone VARCHAR(15) NULL COMMENT '手机',
sex TINYINT(1) NULL COMMENT '性别',
cityid VARCHAR(20) NULL COMMENT '城市编号'
)

创建城市表city

CREATE TABLE city(
cityid VARCHAR(32) PRIMARY KEY NOT NULL COMMENT '城市编号',
cityname VARCHAR(32) NOT NULL COMMENT '城市名称'
)

2.2 初始化数据

插入的学生数据

-- 插入的学生数据
INSERT INTO student(sid, class, profession,NAME,phone,sex,cityid) VALUES('140513001','3','jsj','张超','18652820000',1,'zj');
INSERT INTO student(sid, class, profession,NAME,phone,sex,cityid) VALUES('140513002','4','jsj','王凯','18652820001',0,'zj');
INSERT INTO student(sid, class, profession,NAME,phone,sex,cityid) VALUES('140513003','5','jsj','艾军','18652820002',0,'zj');
INSERT INTO student(sid, class, profession,NAME,phone,sex,cityid) VALUES('140513004','3','jsj','赵晨欣','18652820003',0,'nt');
INSERT INTO student(sid, class, profession,NAME,phone,sex,cityid) VALUES('140513005','3','chinese','陈苏娜','18652820004',0,'xz');
INSERT INTO student(sid, class, profession,NAME,phone,sex,cityid) VALUES('140513006','3','chinese','李艳','18652820005',0,'zj');
INSERT INTO student(sid, class, profession,NAME,phone,sex,cityid) VALUES('140513007','3','math','葛帅','18652820006',0,'yz');
INSERT INTO student(sid, class, profession,NAME,phone,sex,cityid) VALUES('140513008','3','english','王梦雅','18652820007',1,'yc');
INSERT INTO student(sid, class, profession,NAME,phone,sex,cityid) VALUES('140513009','3','jsj','张婷婷','18652820008',1,'xz');
INSERT INTO student(sid, class, profession,NAME,phone,sex,cityid) VALUES('140513010','4','jsj','杨燕','18652820009',1,'zj');
INSERT INTO student(sid, class, profession,NAME,phone,sex,cityid) VALUES('140513011','4','jsj','张灵敏','18652820010',0,'jy');
INSERT INTO student(sid, class, profession,NAME,phone,sex,cityid) VALUES('140513012','5','jsj','王婷','18652820011',1,'yz');
INSERT INTO student(sid, class, profession,NAME,phone,sex,cityid) VALUES('140513013','5','english','王爱岚','18652820012',1,'zj');
INSERT INTO student(sid, class, profession,NAME,phone,sex,cityid) VALUES('140513014','5','english','张雪婷','18652820013',1,'nt');
INSERT INTO student(sid, class, profession,NAME,phone,sex,cityid) VALUES('140513015','5','chinese','朴月亮','18652820014',0,'nj');
INSERT INTO student(sid, class, profession,NAME,phone,sex,cityid) VALUES('140513016','5','chinese','陈思佳','18652820015',0,'ha');
INSERT INTO student(sid, class, profession,NAME,phone,sex,cityid) VALUES('140513017','5','english','刘欣','18652820016',0,'yc');

运行结果:
在这里插入图片描述

插入城市数据

-- 插入的数据
INSERT INTO city(cityid,cityname) VALUES('nj','南京');
INSERT INTO city(cityid,cityname) VALUES('yc','盐城');
INSERT INTO city(cityid,cityname) VALUES('nt','南通');
INSERT INTO city(cityid,cityname) VALUES('xz','徐州');
INSERT INTO city(cityid,cityname) VALUES('zj','镇江');
INSERT INTO city(cityid,cityname) VALUES('yz','扬州');
INSERT INTO city(cityid,cityname) VALUES('ha','淮安');

运行结果:
在这里插入图片描述

2.3 数据查询

查询学生在各个城市人数分布情况,并在最后一行数据显示人数总计。

--查询人数分布情况
SELECT ci.cityname AS '城市',
COUNT(st.name) AS '人数'
FROM student AS st
JOIN city AS ci ON st.cityid=ci.cityid
GROUP BY ci.cityname WITH ROLLUP;

运行结果:
在这里插入图片描述
发现问题:我们在使用group by...with rollup语句时,最后一行的字段显示为null,显得特别别扭,如上图所示。

2.4 分析问题

我们在使用group by…with rollup时,最后一行的字段显示为null,并不是“总计”字段,显得和别扭也给界面绑定数据源带来的麻烦。
现在要求将null字段列显示为“总计”,查阅了资料也没找到相应的解决方案,不过就在我一筹莫展之际有一条博客引起我的注意,其内容如下:
在这里插入图片描述

2.5 解决问题

使用grouping这个函数发现一直报错提示无法识别,仔细观察一下原来这是sql的语法,难道MySQL就实现不了了吗?后又查询了一些资料,发现网上很多人关于group by会总结果都是使用sum计算的。没办法只得自己想办法了,我首先想到的方法是使用带条件的子查询,输出到最后一条数据时显示“总计”字段,但又嫌太复杂没有写。后来按上文研究了一下case语句,觉得这个视乎可行,也行可以使用case判断为null是替换数据,于是写出了如下的代码:
查询语句:

SELECT CASE
WHEN ci.cityname IS NULL THEN '总计'
ELSE ci.cityname
END AS '城市',
COUNT(st.name) AS '人数'
FROM student AS st
JOIN city AS ci ON st.cityid=ci.cityid
GROUP BY ci.cityname WITH ROLLUP;

或者这样

SELECT CASE
WHEN ci.cityname IS NULL THEN '总计'
ELSE ci.cityname
END AS '城市',
COUNT(ci.cityname) AS '人数'
FROM student AS st
JOIN city AS ci ON st.`cityid`=ci.`cityid`
GROUP BY ci.cityname WITH ROLLUP;

运行结果:
在这里插入图片描述

2.6 推荐另一种写法,使用COALESCE

本方法是由网友【愤怒的塔塔】推荐,使用COALESCE函数。
查询语句

SELECT
COALESCE(ci.cityname, '总计') AS '城市',
COUNT(ci.cityname) AS '人数'
FROM student AS st
JOIN city AS ci ON st.cityid=ci.cityid
GROUP BY ci.cityname WITH ROLLUP

运行结果:
在这里插入图片描述

三、用法总结

本文章于2018年6月发表过,由于一些原因无法显示,原文链接https://blog.csdn.net/youcheng_ge/article/details/77728290。
原MySQL数据库版本比较旧,使用grouping,判断NULL值(is null、not null)有异常问题,无法筛选数据,现在的数据库版本已修复该问题,不存在了。
如果您在使用2.4节的SQL语句,无法正确显示结果,可以使用 <=>或者IFNULL()函数,语句如下。
查询语句

--查询语句1
SELECT CASE
WHEN ci.cityname <=> NULL THEN '总计'
ELSE ci.cityname
END AS '城市',
COUNT(ci.cityname) AS '人数'
FROM student AS st
JOIN city AS ci ON st.cityid=ci.cityid
GROUP BY ci.cityname WITH ROLLUP
--查询语句2
SELECT IFNULL(ci.cityname,'合计') AS '城市',
COUNT(ci.cityname) AS '人数'
FROM student AS st
JOIN city AS ci ON st.cityid=ci.cityid
GROUP BY ci.cityname WITH ROLLUP

运行结果均是:
在这里插入图片描述
综上所述,我个人而言推荐使用SQL中自带的总计函数 COALESCE(a,b),毕竟使用自带的函数不容易出错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/69914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何撰写品牌故事?品牌故事软文撰写技巧分享

你听过哪些有温度的品牌故事&#xff1f;我首先想到的是香奈儿&#xff1a; 我的生活不曾取悦于我&#xff0c;所以我创造了自己的生活。 这是香奈儿的创始人可可香奈儿给世人留下的一句话&#xff0c;也是她一生的真实写照。 她被后人看作女性解放和独立的一个象征&#xf…

查询网站有没有被搜狗收录复杂吗?查询搜狗收录简单的方法

对于网站收录的概念&#xff0c;互联网中或者搜索引擎中已经有大量的相关定义。网站收录&#xff0c;指的是爬虫爬取了网页&#xff0c;并将页面内容数据放入搜索引擎数据库中这一结果。 查询网站有没有被搜狗收录复杂吗&#xff1f; 用网站批量查询工具呀&#xff01;操作超简…

React高级备忘录(生命周期)class component

须知 什么是生命周期?就像人有生老病死,component也有类似这样的概念,了解生命周期可以让我们知道如何在「对」的时间做「对」的事。 — Lieutenant 过! 常用生命周期 可以分为三大部分 创建component (componentDidMount)更新component(componentDidUpdate)销毁compone…

照一次CT,对人体的伤害有多大?终于有医生肯站出来说实话

CT是一种检查身体的方式&#xff0c;对于这项检查项目&#xff0c;一直有都有不好的传言&#xff0c;有的人听说CT有辐射&#xff0c;而且辐射比较大&#xff0c;所以比较排斥。 也有的人听说频繁做CT会致癌&#xff0c;所以不愿意做&#xff0c;还有的人把CT当作筛查癌症的神器…

Spring从入门到精通(二)

文章目录1.动态代理1.1 概念1.2 jdk动态代理&#xff08;重点&#xff09;1.3 基于子类的动态代理&#xff08;了解&#xff09;2.AOP2.1 概念2.2 springAop — 基于AspectJ技术2.2.1 AspectJ使用&#xff08;XML&#xff09;2.2.2 AspectJ使用&#xff08;注解开发&#xff09…

【数据结构】二叉树的实现OJ练习

文章目录前言(一) 二叉树的接口实现构建二叉树前序遍历中序遍历后序遍历层序遍历二叉树的节点个数二叉树叶子节点个数二叉树第K层节点个数二叉树的高度查找指定节点判断完全二叉树销毁二叉树(二) 二叉树基础OJ练习单值二叉树相同的树另一棵树的子树二叉树的前序遍历二叉树的最大…

[oeasy]python0026_刷新时间_延迟时间_time_sleep_死循环_while_True

刷新时间 回忆上次内容 time 是一个 ​​module​ import 他可以做和时间相关的事情time.time() 得到当前时间戳 time.localtime() 得到本地时间元组local为本地 time.asctime() 得到时间日期字符串asc为ascii 简略的写法为 asc_time time.asctime() 在​​time.asctime()​…

python -- PyQt5(designer)中文详细教程(六)控件1

控件1 控件就像是应⽤这座房⼦的⼀块块砖。PyQt5有很多的控件&#xff0c;⽐如按钮&#xff0c;单选框&#xff0c;滑动条&#xff0c;复选框等 等。在本章&#xff0c;我们将介绍⼀些很有⽤的控 件&#xff1a; QCheckBox &#xff0c; ToggleButton &#xff0c; QSlider &a…

关于JavaScript运算符的学习

关于博主每篇博文的浪漫主义 【“仅此105秒&#xff0c;无法超越的绝美画面!&#xff01;”】 https://www.bilibili.com/video/BV1nW4y1x78x/?share_sourcecopy_web&vd_source385ba0043075be7c24c4aeb4aaa73352 “仅此105秒&#xff0c;无法超越的绝美画面!&#xff01;…

应用案例:有源无源电路协同仿真

01 有源无源电路协同仿真 随着电路系统集成度和信号速率的提高&#xff0c;电路中的电磁场效应越来越明显&#xff0c;单纯使用电路分析方法已不能满足仿真评估精度要求&#xff0c;这种情况下必须对问题进行分解&#xff0c;采用三维电磁场全波方法对信号传播路径上的封装与…

[附源码]计算机毕业设计JAVA在线文献查阅系统

[附源码]计算机毕业设计JAVA在线文献查阅系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

C# 拖放操作

一 拖放操作 拖放操作Drag and Drop是两个窗口之间传递数据的一种手段。 1 拖放操作两部分&#xff1a;拖Drag、放Drop 几个术语&#xff1a; ① 源窗口&#xff1a;发起拖拽StartDrag; ② 目标窗口&#xff1a;接受拖放AcceptDraop; ③ 拖拽物&#xff1a;即传输的数据Dat…

ChatGPT有多厉害,影响到谷歌地位?

AI神器ChatGPT 火了。 能直接生成代码、会自动修复bug、在线问诊、模仿莎士比亚风格写作……各种话题都能hold住&#xff0c;它就是OpenAI刚刚推出的——ChatGPT。 有脑洞大开的网友甚至用它来设计游戏&#xff1a;先用ChatGPT生成游戏设定&#xff0c;再用Midjourney出图&…

外贸小白,一直不出单怎么办?

米贸搜今天&#xff0c;试着给新人一些方法和技巧&#xff0c;让你尽快在公司立足&#xff01; 事实上&#xff0c;规定几个月内下单的公司&#xff0c;往往都是平台有投资&#xff0c;去展会了&#xff0c;有大量营销费用的公司。当然&#xff0c;老板急着收回成本。对于有足…

网络基本概念

文章目录前言网络分层原因网络分层模型各层大致用途主机网络层网际层传输层应用层总结前言 在日常开发中&#xff0c;大家总是会或多或少的遇到一些网络通信的相关代码&#xff0c;如http请求调用。但是我们却不知道&#xff0c;数据是怎么从一台计算机到另一台计算机的&#…

opcj-如何通过一个项目征服Java

Java早已经不是高大山的稀世珍品了&#xff0c;程序员也不再是高科技工作者&#xff0c;而被称为码农 &#xff0c;为什么呢&#xff1f;因为Java后台的很多基础技术都已经固定了&#xff0c;也就是说主要你从头到尾学一遍就能会 &#xff0c;淘宝双十一搞不定&#xff0c;但是…

2022-12-07 小米pro路由(R3G) 刷固件 openwrt

环境准备&#xff1a;路由开启SSH 1.先登录小米开发者平台&#xff0c;解开小米路由的SSH http://www.miwifi.com/miwifi_open.html 2.路由连接电脑&#xff0c;通过SSH可直接登录到小米路由 本教程以R3G 为例 第一步: 刷入 BREED 如何刷入breed 不同设备方法不同,可以直接U…

通俗地讲讲数据降维的原理

什么是数据降维&#xff1f;关于这个问题&#xff0c;很多专家的说法都非常学术&#xff0c;估计很多普通人听不懂。所以&#xff0c;这里用通俗的语言解释一下&#xff0c;希望有助于更多的入门新人理解。 举一个简单的例子&#xff1a;假设一个小学的班级有5个学生&#xff…

Spring Boot 入门到精通(一)

文章目录一、Spring Boot 介绍1. 概念2.maven构建Spring Boot项目3. 自定义banner4. Spring Boot的全局配置文件5. Spring Boot项目的发布方式二、Spring Boot注入方式1. Value方式2. ConfigurationProperties方式3. SpringBoot默认注入方式4. SpringBoot中的默认配置三、Sprin…

Element组件库的用法步骤

Element地址&#xff1a;适用于pc端后台开发 Element - The worlds most popular Vue UI frameworkElement&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库https://element.eleme.io/#/zh-CN/ 下载 点击 “组件”在安装部分有下载命令&#xf…