系列文章

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),毕竟使用自带的函数不容易出错。

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

  1. MS SQL 分类汇总参数 grouping(**)=1 rollup cubt

    转:http://www.111cn.net/database/mssqlserver/43368.htm 本文章介绍了关于sql多级分类汇总实现方法及数据结构,有碰到问题的同学可参考一下. 据库结构 ...

  2. oracle 按某个字段分类汇总,[数据库]Oracle语句分类汇总

    [数据库]Oracle语句分类汇总 0 2016-08-11 00:00:33 1.Oracle语句之数据定义语言(DDL) 1) CREATE TABLE   新建表 2) ALTER TABLE  ...

  3. sql 分类汇总 列_分类汇总哪家强?R、Python、SAS、SQL?

    Excel数据透视表(Pivot Table)可以快速汇总大量数据,能够分类汇总和聚合数值数据,按类别和子类别汇总数据,功能十分强大,并且提供了展开.折叠.行列交换等交互式方法,对使用者来说十分的友好 ...

  4. 将span隐藏的函数_分类汇总函数Subtotal和Aggregate应用技巧解读

    在实际的数据统计分析中,经常会遇到很多复杂的因素,例如,对隐藏的行或计算结果返回错误类型的值不予统计等等--如果此时还用常规的Sum系列.Count系列.Average系列等函数去做数据统计分析,将会 ...

  5. azure云数据库_Azure SQL数据库中的高级数据安全性–数据发现和分类

    azure云数据库 Azure SQL supports in building and managing wide range of SQL databases, tools, frameworks ...

  6. sql查询语句_多字段分类汇总_多表合并

    一.最初(最简单的入门实例,单个分类汇总) 1,查询语句/*药品费用分科室汇总*/ select c.sksxx02,sum(nvl(b.nfyxx06,0))         from yygli6 ...

  7. 数据库常用的sql语句汇总

    数据库相关: 查所有数据库 show databases; 创建数据库 create database db1; 查看数据库 show create database db1; 创建数据库指定字符集 ...

  8. 数据库-SQL分类介绍及总结

    SQL分类 DDL (数据定义问题) 数据定义语言 - Data Definition Language  用来定义数据库的对象,如数据表.视图.索引等 创建数据库:create database t ...

  9. sql月度汇总_按月度分类汇总

    按月份分类汇总 ID    订单号      日期 1     cno001    2013-6-5 2     cno001    2013-6-10 3     cno002    2013-6- ...

  10. MySQL数据库sql分类_mysql数据库常用sql的分类整理

    **************************************************************************************************** ...

最新文章

  1. 今日头条适配方案_今日头条信息流广告创意优化方案!
  2. oracle去重保留一条_关于oracle数据库物理结构(文件)的一些总结
  3. darknet框架_【通知】有三AI发布150页深度学习开源框架指导手册与GitHub项目,欢迎加入我们的开源团队...
  4. iPhone 13及12推动,机构预计苹果今年将销售近2亿部5G iPhone
  5. 深入理解SSIM(两图像结构相似度指标)(附matlab代码)
  6. 小菜鸟的Python笔记002:如何识别Word文档中的复选框
  7. 小程序容器进一步强化国家政务服务平台功能
  8. Type-C PD充电简介
  9. 百度统计和谷歌统计文档
  10. 25 scala 进阶
  11. Android开发:如何实现收发短信
  12. linux历史版本内核下载方法。
  13. 通用数据保护条例GDPR今日起正式生效,不会影响机器学习
  14. 招标投标中各流程时间期限的规定
  15. 做seo为什么要了解网站
  16. 六足机器人的实现原理
  17. html四个图片成正方形排列,html单选按钮变成方形
  18. android汽车手机互联!阿里P8面试官都说太详细了,赶紧收藏备战金三银四!
  19. python外星人入侵游戏代码_python外星人入侵 游戏源码
  20. sql拼接同一字段中的数据_用SQL将Oracle中同一列的多行记录拼接成一个字符

热门文章

  1. win10系统设置选择电源键按钮功能设置步骤
  2. Java基础篇--异常机制
  3. 关于如何处理MyEclipse中struts2与Hiber 3中antlr-2.7.2.jar与antlr-2.7.6包冲突的问题
  4. android广播 拦截短信,短信接口防刷信息推荐「多图」
  5. cad断点快捷键_CAD打断和打断于点怎么使用?CAD打断快捷键命令及操作方法
  6. vb外部调用autocad_VB调用AutoCAD.ppt
  7. win10更改hosts文件
  8. php英语大全,php常用英语单词-音标版
  9. Focal损失函数学习笔记
  10. SQL语言-更新操作命令