五种主流数据库:数据汇总

汇总分析是数据报表中的基本功能,例如产品销售金额的汇总、学生的平均身高和标准差统计等。SQL 定义了聚合函数,可以实现数据的汇总分析。

本文比较五种主流数据库支持的常见聚合函数,包括 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite。

聚合函数函数功能MySQLOracleSQL ServerPostgreSQLSQLite
COUNT()返回查询结果或者表中的行数✔️✔️✔️✔️✔️
AVG()计算一组数据的平均值✔️✔️✔️✔️✔️
SUM()计算一组数值的总和✔️✔️✔️✔️✔️
MAX()返回一组数据中的最大值✔️✔️✔️✔️✔️
MIN()返回一组数据中的最小值✔️✔️✔️✔️✔️
LISTAGG()将一组字符串合并成一个字符串GROUP_CONCAT()✔️STRING_AGG()STRING_AGG()GROUP_CONCAT()

除 LISTAGG 函数外,以上聚合函数在 5 种主流数据库中的实现一致。

我们在使用聚合函数时需要注意两点:

  • 聚合函数的参数支持 DISTINCT 关键字,表示在计算之前排除重复数据。
  • 聚合函数在计算时忽略数据中的 NULL 值,COUNT(*) 函数除外。

接下来我们详细介绍这些聚合函数的作用。

使用 COUNT 函数统计行数

COUNT(*) 函数用于统计查询结果或者表中的行数。例如,以下语句统计了员工的数量:

SELECT COUNT(*) AS "员工数量"
FROM employee;

查询返回的结果如下:

员工数量
------25

员工表中包含 25 条记录,也就是 25 名员工。

COUNT 函数也可以统计某个字段或者表达式不为空值的数量,例如:

SELECT COUNT(emp_id), COUNT(0)
FROM employee;

查询返回的结果如下:

COUNT(emp_id)|COUNT(0)
-------------|--------25| 25

两个 COUNT 函数分别统计了员工编号和常量 0 不为空的数量,两个结果都是 25,因为每个员工都有一个编号,而 COUNT(0) 和 COUNT(*) 的结果相同。

以下查询在 COUNT 函数中使用了 DISTINCT 关键字:

SELECT COUNT(sex) AS "所有性别", COUNT(DISTINCT sex) AS "不同性别"
FROM employee;

查询返回的结果如下:

所有性别|不同性别
-------|-------25| 2

员工表中的不同性别只有“男”和“女”,因此使用 DISTINCT 关键字之后的结果为 2。

提示:除了 DISTINCT 关键字之外,我们也可以使用 ALL 关键字,表示汇总时不排除重复数据。因为 ALL 是默认值,所以我们通常省略。

另外,如果参数中存在空值,COUNT 函数会忽略这些空值。以下查询统计了员工拥有奖金的情况:

SELECT COUNT(*) AS "员工数量",COUNT(bonus) AS "拥有奖金",COUNT(*) - COUNT(bonus) AS "没有奖金"
FROM employee;

查询返回的结果如下:

员工数量|拥有奖金|没有奖金
------|-------|-------25|      9| 16

查询结果显示 9 名员工拥有奖金,16 名员工没有奖金。

使用 AVG 函数计算平均值

AVG 函数用于计算一组数据的平均值。例如,以下查询统计了所有员工的平均月薪:

SELECT AVG(salary) AS "平均月薪"
FROM employee;

查询返回的结果如下:

平均月薪 
-----------
9832.000000

所有员工的平均月薪为 9832 元。

如果我们为 AVG 函数指定了 DISTINCT 关键字,则会在计算平均值之前排除重复数据。例如,1、1、2 的平均值为(1+2)/2,而不是(1+1+2)/3。例如,以下查询返回了所有不重复月薪的平均值:

SELECT AVG(DISTINCT salary) AS "平均月薪"
FROM employee;

查询返回的结果如下:

平均月薪 
-----------
9865.000000

去掉重复数据之后的平均月薪有所增加。

另外,如果参数中存在空值,AVG 函数会忽略这些空值。例如,1、2、NULL 的平均值为 (1+2)/2,而不是 (1+2+NULL)/3。以下查询返回了员工(不包括没有奖金的员工)的平均奖金:

SELECT AVG(bonus) AS "平均奖金"
FROM employee;

查询返回的结果如下:

平均奖金 
-----------
6388.888889

如果我们想要将没有奖金的员工当作奖金为零处理,可以使用 CASE 表达式:

SELECT AVG(CASE WHEN bonus IS NULL THEN 0 ELSE bonus END) AS "平均奖金"
FROM employee;

查询返回的结果如下:

平均奖金 
-----------
2300.000000

使用 SUM 函数计算总和

SUM 函数用于计算一组数值的总和。例如,以下语句返回了所有员工的月薪总和:

SELECT SUM(salary) AS "月薪总和"
FROM employee;

查询返回的结果如下:

月薪总和 
---------
245800.00

公司所有员工每个月的薪水总和为 245 800 元。

SUM 函数也可以利用 DISTINCT 关键字在计算总和之前排除重复数据,一般很少使用。另外,如果参数中存在空值,SUM 函数会忽略这些空值。以下查询返回了所有员工的平均奖金,没有奖金的员工被当作奖金为零处理:

SELECT SUM(bonus)/COUNT(*) AS "平均奖金"
FROM employee;

查询返回的结果和前面的 CASE 表达式示例相同。

使用 MAX 函数返回最大值

MAX 函数用于返回一组数据中的最大值。例如,以下查询返回了最晚入职的员工的入职时间:

SELECT MAX(hire_date) AS "入职时间"
FROM employee;

查询返回的结果如下:

入职时间 
----------
2019-05-11

最后一位员工的入职时间是 2019 年 5 月 11 日。

MAX 函数支持 DISTINCT 关键字,但是没有实际意义,因为它对结果没有影响。另外,如果参数中存在空值,MAX 函数会忽略这些空值。

使用 MIN 函数返回最小值

MIN 函数用于返回一组数据中的最小值。例如,以下查询返回了第一位员工的入职时间:

SELECT MIN(hire_date) AS "入职时间"
FROM employee;

查询返回的结果如下:

入职时间 
----------
2000-01-01

第一位员工的入职时间是 2000 年 1 月 1 日。

MIN 函数支持 DISTINCT 关键字,但是没有实际意义,因为它对结果没有影响。另外,如果参数中存在空值,MIN 函数会忽略这些空值。

使用 LISTAGG 函数连接字符串

LISTAGG 函数用于对字符串进行聚合,可以将多行字符串合并成单个字符串。例如,以下查询返回了行政管理部门中所有员工的电子邮箱:

-- Oracle
SELECT LISTAGG(email, ';') AS "收件人"
FROM employee
WHERE dept_id = 1;

目前只有 Oracle 实现了该函数,函数中的第二个参数用于指定连接字符串的分隔符,默认为空。查询返回的结果如下:

收件人 
-------------------------------------------------------
liubei@shuguo.com;guanyu@shuguo.com;zhangfei@shuguo.com

LISTAGG 函数支持 WITHIN GROUP 选项,可以在合并之前对数据进行排序。例如:

-- Oracle
SELECT LISTAGG(email, ';') WITHIN GROUP (ORDER BY email) AS "收件人"
FROM employee
WHERE dept_id = 1;

其中 ORDER BY 表示对邮箱地址进行排序,查询返回的结果如下:

收件人
-------------------------------------------------------
guanyu@shuguo.com;liubei@shuguo.com;zhangfei@shuguo.com

MySQL 提供了执行字符串聚合操作的 GROUP_CONCAT 函数,例如:

-- MySQL
SELECT GROUP_CONCAT(email ORDER BY email SEPARATOR ';') AS "收件人"
FROM employee
WHERE dept_id = 1;

其中,ORDER BY 表示对邮箱地址进行排序,SEPARATOR 指定了连接字符串的分隔符,默认为逗号。查询返回的结果和上面的示例相同。

SQLite 提供了和 MySQL 类似的 GROUP_CONCAT 函数,但是调用参数不同。例如:

-- SQLite
SELECT GROUP_CONCAT(email, ';') AS "收件人"
FROM employee
WHERE dept_id = 1;

第 2 个参数指定了连接字符串的分隔符,默认为逗号。SQLite 中的 GROUP_CONCAT 函数不支持数据排序,查询返回的结果和上面的第 1 个 Oracle 示例相同。

Microsoft SQL Server 提供了执行字符串聚合操作的 STRING_AGG 函数,例如:

-- Microsoft SQL Server
SELECT STRING_AGG(email, ';') WITHIN GROUP (ORDER BY email) AS "收件人"
FROM employee
WHERE dept_id = 1;

第 2 个参数指定了连接字符串的分隔符,WITHIN GROUP 选项用于在合并之前对数据进行排序。查询返回的结果和上面的第 2 个 Oracle 示例相同。

PostgreSQL 提供了和 Microsoft SQL Server 类似的 STRING_AGG 函数,但是调用参数不同。
例如:

-- PostgreSQL
SELECT STRING_AGG(email, ';' ORDER BY email) AS "收件人"
FROM employee
WHERE dept_id = 1;

第 2 个参数同时指定了连接字符串的分隔符和数据的排序。查询返回的结果和上面的第 2 个 Oracle 示例相同。

以上字符串聚合函数都可以使用 DISTINCT 关键字在合并之前排除重复数据,同时还会忽略数据中的 NULL 值。

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

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

相关文章

【C++PCL】点云处理RANSAC配准

目录 1.原理介绍 2.代码效果 3.源码展示 4.参数调试 5.注意事项

Unity WebGL服务器标头的问题

目录 现象: 报错文本: 原因: 解决方案: 现象: 打包前,ProjectSetting 压缩选项设置为Brotli, 将打包的WebGL部署到阿里云OSS环境后,运行弹框提示错误. 报错文本: Unable to parse Build/WebGL.framework.js.br! This canha…

二、Jooq整合SpringBoot

在当前微服务盛行的情况下,Spring Boot 或 Spring Cloud 为基础的微服务体系是主流, 也是目前业务场景中新的选型方向 数据库表 -- filesystem.user definitionCREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,username varchar(50) NOT NULL,…

三级等保技术建议书

1信息系统详细设计方案 1.1安全建设需求分析 1.1.1网络结构安全 1.1.2边界安全风险与需求分析 1.1.3运维风险需求分析 1.1.4关键服务器管理风险分析 1.1.5关键服务器用户操作管理风险分析 1.1.6数据库敏感数据运维风险分析 1.1.7“人机”运维操作行为风险综合分析 1.2…

QT----基于QT的人脸考勤系统

目录 1 编译opencv库1.1 下载源代码1.2 qt编译opencv1.3 执行Cmake一直卡着data: Download: face_landmark_model.dat 2 编译SeetaFace2代码2.1 遇到报错By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project has2.2遇到报错Model missing 3 测试…

洛谷 保龄球

保龄球 题目描述 DL 算缘分算得很烦闷,所以常常到体育馆去打保龄球解闷。因为他保龄球已经打了几十年了,所以技术上不成问题,于是他就想玩点新花招。 DL 的视力真的很不错,竟然能够数清楚在他前方十米左右每个位置的瓶子的数量…

sqllab通关笔记(汇总)

第一关: Sqllab第一关通关笔记-CSDN博客 第二关: sqllab第二关通关笔记-CSDN博客 第三关: sqllab第三关通关笔记-CSDN博客 第四关: sqllab第四关通关笔记-CSDN博客 第五关: sqllab第五关通关笔记-CSDN博客 第…

web高可用集群(nginx负载均衡+keepalived实现调度器HA)

web高可用集群(nginx负载均衡keepalived实现调度器HA) 主机IP地址代理服务器192.168.88.66代理服务器192.168.88.38Real server192.168.88.10Real server192.168.88.20 配置俩台Real server [rootweb1 ~]# vim /etc/yum.repos.d/nginx.repo [rootweb1 ~]# cat /e…

KT6368A蓝牙主从一体芯片_功能简要说明

一、功能简介 新增KT1328A芯片方案的蓝牙主从一体版本,实现的是主从一体相互切换,也就是说可以设置为主机【类似于手机的角色】,也可以设置为从机角色,通过AT指令 此版本的型号命名为:KT1328A-SOP8 。后续需要下单…

牛客NC125 和为K的连续子数组【中等 哈希+前缀和 Java,Go,PHP】

题目 题目链接: https://www.nowcoder.com/practice/704c8388a82e42e58b7f5751ec943a11 思考 滑动窗口,map,前缀和参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修…

奇舞周刊第522期:“Vite 又开始搞事情了!!!”

奇舞推荐 ■ ■ ■ Vite 又开始搞事情了!!! Vite 的最新版本将引入一种名为 Rolldown 的新型打包工具。 unocss 究竟比 tailwindcss 快多少? 我们知道 unocss 很快,也许是目前最快的原子化 CSS 引擎 (没有之一)。 巧用…

【小迪安全】学习cho1

介绍了一些名词: POC、EXP、Payload与Shellcode nc -lvvp 端口号 监听服务器端口 个人用机使用最多的是:windows10 服务器用机使用最多的是:Windows8,12,16 流量被防火墙拦截了,到这里进行给与权限 文件…

数据分析-Pandas的Andrews曲线可视化解读

数据分析-Pandas的Andrews曲线可视化解读 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律? 数据…

纳米阱可提高未来光学设备的光强度

一种配置光捕获器件的方法有望通过放大光和提高发光纳米材料的发射效率来获得更好的光学纳米器件,而无需复杂的技术升级。 强光束对于从医学到电子产品的无数应用至关重要,但使用日常光源生产它们具有挑战性。然而,它们可以由激光产生。激光…

J.砍树【蓝桥杯】树上差分+LCA

树上差分 多次对树上的一些路径做加法操作,然后询问某个点或某条边经过操作后的值,就要考虑树上差分了。 点差分 模拟这个过程 对x到y路径上的点权值均1,可以等价成对x和y的权值加1,对lca的权值-1,对fa[lca]的权值-…

十一、CountDownLatch

CountDownLatch 倒数的门栓 CountDownLatch latch new CountDownLatch(threads.length); 创建一个门栓,在门栓上面记个数每一个线程结束就countDown 开启线程latch.await(); 每一个线程结束后线程数减一,当 latch.await()为0的时候门栓就打开 package com.mas…

‘list‘ object has no attribute ‘encode‘

‘list’ object has no attribute ‘encode’ Connection unexpectedly closed 出错代码 import smtplib from email.mime.text import MIMETextclass SendEmial(object):封装发送邮件类def __init__(self,host:str,port:int,user:str,pwd:str):self.host hostself.port …

文件处理(一)

file文件操作_操作系统底层关系_写入文件 文件操作 一个完整的程序一般都包括数据的存储和读取;我们在前面写的程序数据都没有进行实际的存储,因此python解释器执行完数据就消失了。实际开发中,我们经常需要从外部存储介质(硬盘…

基于Linux使用C语言实现简单的目录管理

在Linux下&#xff0c;需要实现某个目录下文件的遍历的时候&#xff0c;可以使用opendir&#xff0c;readdir&#xff0c;closedir这些接口。这些接口使用说明如下所示&#xff1a; 1).opendir DIR* opendir(const char * name); #include <sys/types.h> #include …

Linux系统学习总结(上)

B站大学地址&#xff1a;第二章-04-ls命令的参数和选项_哔哩哔哩_bilibili 操作系统概述 1、计算机是由硬件和软件两部分组成的 2、操作系统是软件的一类&#xff0c;主要作用是协助用户调度硬件工作&#xff0c;充当用户和计算机硬件之间的桥梁 3、常见的操作系统分为两类…