MySQL--group by--聚合函数--内置函数--0415 22

news2024/11/24 12:28:45

目录

1.聚合函数

1.1 count

1.2 sum

1.3 avg

1.4 max 和 min

2. group by

2.1 group by 的条件筛选——having

2.2 总结

3.日期函数

4.字符串函数

concat

 replace

 substring

以首字母大写,其余字母小写的方式显示员工的姓名

5.数学函数

format

rand()

6.其他函数

user()

md5


1.聚合函数

函数说明
count( [DISTINCT]  参数 )返回查询到的数据的数量
sum ( [DISTINCT] 参数)返回查询到的数据的总和,不是数字没有意义
avg ( [DISTINCT] 参数 )返回查询到的数据的平均值,不是数字没有意义
max ( [DISTINCT] 参数)返回查询到的数据的最大值,不是数字没有意义
min ( [DISTINCT] 参数)返回查询到的数据的最小值,不是数字没有意义

什么是聚合函数?

聚合统计一定是直接或者间接统计列方向的某些数据。列方向上一定是相同属性的。对于行方向上,可以直接使用select 表达式相加/相乘等进行统计。

1.1 count

 

 当想查看,当前筛选出来的结果有几条时,可以使用count函数

使用 * 做统计,NULL不纳入统计。也可以用 count(1)等表达式进行统计

mysql> select count(*) from exam_result;
+----------+
| count(*) |
+----------+
|        7 |
+----------+
mysql> select count(name) from exam_result;
+-------------+
| count(name) |
+-------------+
|           7 |
+-------------+
1 row in set (0.00 sec)

查看去重之后的统计个数

mysql> select count(distinct math) from exam_result;
+----------------------+
| count(distinct math) |
+----------------------+
|                    6 |
+----------------------+
1 row in set (0.00 sec)

mysql> select count(math) from exam_result;
+-------------+
| count(math) |
+-------------+
|           7 |
+-------------+

1.2 sum

统计英语成绩总分

mysql> select sum(english) from exam_result;
+--------------+
| sum(english) |
+--------------+
|          443 |
+--------------+
1 row in set (0.00 sec)

mysql> select sum(english) from exam_result where english<60;
+--------------+
| sum(english) |
+--------------+
|          131 |
+--------------+

1.3 avg

计算英语成绩的平均分

mysql> select sum(english)/count(*) from exam_result ;
+-----------------------+
| sum(english)/count(*) |
+-----------------------+
|    63.285714285714285 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select avg(english) from exam_result;
+--------------------+
| avg(english)       |
+--------------------+
| 63.285714285714285 |
+--------------------+
1 row in set (0.00 sec)

计算总分的平均分

mysql> select avg(english+math+chinese) from exam_result;
+---------------------------+
| avg(english+math+chinese) |
+---------------------------+
|                       222 |
+---------------------------+

1.4 max 和 min

返回英语最高分

mysql> select max(english) from exam_result;
+--------------+
| max(english) |
+--------------+
|           90 |
+--------------+
1 row in set (0.00 sec)

返回 > 70 分以上的数学最低分

mysql> select min(math) from exam_result where math>70;
+-----------+
| min(math) |
+-----------+
|        73 |
+-----------+
1 row in set (0.00 sec)

2. group by

在select中使用group by 子句可以对指定列进行分组查询。

表结构如下

显示每个部门的平均工资和最高工资

mysql> select deptno,avg(sal) avgsal,max(sal) maxasl from emp group by deptno;
+--------+-------------+---------+
| deptno | avgsal      | maxasl  |
+--------+-------------+---------+
|     10 | 2916.666667 | 5000.00 |
|     20 | 2175.000000 | 3000.00 |
|     30 | 1566.666667 | 2850.00 |
+--------+-------------+---------+
3 rows in set (0.00 sec)

显示每个部门的每种岗位的平均工资和最低工资

mysql> select deptno,job,avg(sal) avgsal,max(sal) maxasl from emp group by deptno,job;
+--------+-----------+-------------+---------+
| deptno | job       | avgsal      | maxasl  |
+--------+-----------+-------------+---------+
|     10 | CLERK     | 1300.000000 | 1300.00 |
|     10 | MANAGER   | 2450.000000 | 2450.00 |
|     10 | PRESIDENT | 5000.000000 | 5000.00 |
|     20 | ANALYST   | 3000.000000 | 3000.00 |
|     20 | CLERK     |  950.000000 | 1100.00 |
|     20 | MANAGER   | 2975.000000 | 2975.00 |
|     30 | CLERK     |  950.000000 |  950.00 |
|     30 | MANAGER   | 2850.000000 | 2850.00 |
|     30 | SALESMAN  | 1400.000000 | 1600.00 |
+--------+-----------+-------------+---------+
9 rows in set (0.00 sec)

2.1 group by 的条件筛选——having

having和group by配合使用,对group by结果进行过滤

mysql> select deptno,avg(sal) avgsal from emp group by deptno;
+--------+-------------+
| deptno | avgsal      |
+--------+-------------+
|     10 | 2916.666667 |
|     20 | 2175.000000 |
|     30 | 1566.666667 |
+--------+-------------+
3 rows in set (0.00 sec)

mysql> select deptno,avg(sal) avgsal from emp group by deptno having avgsal<2000;
+--------+-------------+
| deptno | avgsal      |
+--------+-------------+
|     30 | 1566.666667 |
+--------+-------------+
1 row in set (0.00 sec)

2.2 总结

  • group by将数据分开了,可以对特定组内进行某种操作。group by一定是配合聚合统计使用的。
  • group by后面跟的是分组的依据,只有这些依据可以出现在select 后面跟的参数中。
  • where和having并不冲突,where是在哪些条件下筛选出数据,而having是整个数据已经被全部筛选之后,挑选having条件满足的数据进行显示。
  • where是在表中数据初步被筛选的时候起效果的,而having是在完成整个分组聚合统计,然后进行筛选的

3.日期函数

  • 常用的日期函数
current_date()当前日期
current_time()当前时间
current_timestamp()当前时间戳
date(datetime)返回datetime参数的日期部分
date_add(date, interval value)

在date中添加日期或者时间

单位可以是year minute second

day

date_sub(date, interval value)

在date中减去日期或者时间

单位和date_add相同

datediff(date1,date2)

两个日期的差,注意是前减后

单位是填

now()当前时间
  • 获得当前时间/日期/时间戳
mysql> select current_date();
+----------------+
| current_date() |
+----------------+
| 2023-05-04     |
+----------------+
1 row in set (0.00 sec)

mysql> select current_time();
+----------------+
| current_time() |
+----------------+
| 20:37:49       |
+----------------+
1 row in set (0.00 sec)

mysql> select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2023-05-04 20:37:55 |
+---------------------+
1 row in set (0.00 sec)
  • 日期之间的加减和距离

日期函数之中可以嵌套日期函数,比如需要输入当前日期时可以嵌套使用now()函数

datediff(date1,date2) 是用date1减去date2 ,如果小于则会显示负数。

mysql> select date_add('2023-05-04',interval 5 day);
+---------------------------------------+
| date_add('2023-05-04',interval 5 day) |
+---------------------------------------+
| 2023-05-09                            |
+---------------------------------------+

mysql> select date_add(now(),interval 5 day);
+--------------------------------+
| date_add(now(),interval 5 day) |
+--------------------------------+
| 2023-05-09 20:40:53            |
+--------------------------------+

mysql> select date_sub('2023-05-09',interval 5 day);
+---------------------------------------+
| date_sub('2023-05-09',interval 5 day) |
+---------------------------------------+
| 2023-05-04                            |
+---------------------------------------+

mysql> select datediff('2023-05-04','2022-05-04');
+-------------------------------------+
| datediff('2023-05-04','2022-05-04') |
+-------------------------------------+
|                                 365 |
+-------------------------------------+
1 row in set (0.00 sec)

mysql> select datediff('2022-05-04','2023-05-04');
+-------------------------------------+
| datediff('2022-05-04','2023-05-04') |
+-------------------------------------+
|                                -365 |
+-------------------------------------+
1 row in set (0.00 sec)


  • 查询在两分钟内发布的留言
mysql> select * from 表名 where date_add(时间对应名称, interval 2 minute) > now();

4.字符串函数

charset(str)返回字符串字符集
concat(str1,str2,..)连接str1,str2...成为一个
instr(string,str)

返回str在string中出现的位置

没有返回0

ucase(str)转换成大写
lcase(str)转换成小写
left(str,length)从str的左边截取length个字符
length(str)str的长度
replace(str,search_str,replace_str)

在str中用replace_str

替换search_str

strcmp(str1,str2)逐字符比较两字符串的大小
substring(str,pos,[length] )从str的pos位置截取length个字符

ltrim(string)

rtrim(string)

trim(string)

去除左边的空格

去除右边的空格

去除左和右的空格

 接下来是函数的具体使用

concat

mysql> select concat (' 姓名:',ename,' 工作:',job) from emp;
+----------------------------------------------+
| concat (' 姓名:',ename,' 工作:',job)       |
+----------------------------------------------+
|  姓名:SMITH 工作:CLERK                     |
|  姓名:ALLEN 工作:SALESMAN                  |
|  姓名:WARD 工作:SALESMAN                   |
|  姓名:JONES 工作:MANAGER                   |
|  姓名:MARTIN 工作:SALESMAN                 |
|  姓名:BLAKE 工作:MANAGER                   |
|  姓名:CLARK 工作:MANAGER                   |
|  姓名:SCOTT 工作:ANALYST                   |
|  姓名:KING 工作:PRESIDENT                  |
|  姓名:TURNER 工作:SALESMAN                 |
|  姓名:ADAMS 工作:CLERK                     |
|  姓名:JAMES 工作:CLERK                     |
|  姓名:FORD 工作:ANALYST                    |
|  姓名:MILLER 工作:CLERK                    |
+----------------------------------------------+

 replace

注意replace只是修改了显示时的数据,并没有修改表内的数据。

mysql> select replace (job,'A','B') from emp;
+-----------------------+
| replace (job,'A','B') |
+-----------------------+
| CLERK                 |
| SBLESMBN              |
| SBLESMBN              |
| MBNBGER               |
| SBLESMBN              |
| MBNBGER               |
| MBNBGER               |
| BNBLYST               |
| PRESIDENT             |
| SBLESMBN              |
| CLERK                 |
| CLERK                 |
| BNBLYST               |
| CLERK                 |
+-----------------------+

 substring

mysql> select substring(ename,2),ename from emp;
+--------------------+--------+
| substring(ename,2) | ename  |
+--------------------+--------+
| MITH               | SMITH  |
| LLEN               | ALLEN  |
| ARD                | WARD   |
| ONES               | JONES  |
| ARTIN              | MARTIN |
| LAKE               | BLAKE  |
| LARK               | CLARK  |
| COTT               | SCOTT  |
| ING                | KING   |
| URNER              | TURNER |
| DAMS               | ADAMS  |
| AMES               | JAMES  |
| ORD                | FORD   |
| ILLER              | MILLER |
+--------------------+--------+
14 rows in set (0.00 sec)

mysql> select substring(ename,2,2),ename from emp;
+----------------------+--------+
| substring(ename,2,2) | ename  |
+----------------------+--------+
| MI                   | SMITH  |
| LL                   | ALLEN  |
| AR                   | WARD   |
| ON                   | JONES  |
| AR                   | MARTIN |
| LA                   | BLAKE  |
| LA                   | CLARK  |
| CO                   | SCOTT  |
| IN                   | KING   |
| UR                   | TURNER |
| DA                   | ADAMS  |
| AM                   | JAMES  |
| OR                   | FORD   |
| IL                   | MILLER |
+----------------------+--------+

以首字母大写,其余字母小写的方式显示员工的姓名

mysql> select concat(ucase(substring(ename,1,1)),lcase(substring(ename,2))) as name from emp;

mysql> select concat(ucase(substring(ename,1,1)),lcase(substring(ename,2))) as name from emp;
+--------+
| name   |
+--------+
| Smith  |
| Allen  |
| Ward   |
| Jones  |
| Martin |
| Blake  |
| Clark  |
| Scott  |
| King   |
| Turner |
| Adams  |
| James  |
| Ford   |
| Miller |
+--------+

5.数学函数

abs(number)绝对值函数
bin(number)十进制转二进制
hex(number)十进制转16进制
conv(number,from_base,to_base)进制转换
ceiling(number)向上取整
floor(number)向下取整
format(number,length)

number保留length位小数

四舍五入

rand()

返回一个浮点数

取值范围为[0.0,1.0)

mod(number,m)number%m

format

mysql> select format(12.345678,2);
+---------------------+
| format(12.345678,2) |
+---------------------+
| 12.35               |
+---------------------+

mysql> select format(12.345678,6);
+---------------------+
| format(12.345678,6) |
+---------------------+
| 12.345678           |
+---------------------+

rand()

mysql> select rand();
+---------------------+
| rand()              |
+---------------------+
| 0.15591199058658628 |
+---------------------+
1 row in set (0.01 sec)

mysql> select rand();
+--------------------+
| rand()             |
+--------------------+
| 0.1622132008543361 |

mysql> select format(rand(),2);
+------------------+
| format(rand(),2) |
+------------------+
| 0.34             |
+------------------+


mysql> select format(rand(),3);
+------------------+
| format(rand(),3) |
+------------------+
| 0.120            |
+------------------+

6.其他函数

user()查询当前用户
md5(str)

对一个字符串进行摘要,摘要后得到

一个32位的字符串

database()显示当前正在使用的数据库
password()mysql使用该函数对用户加密
ifnull(val1,val2)

相当于三目操作符

如果val1是null 返回val2

如果val1不是null 返回val1

user()

在mysql中可以设置用户,用户会存放在user表中,对用户的管理,本质上就是对user表的增删查改。

md5

在某些表中我们需要存入用户的密码等私人信息,如果不对这些信息做处理,那么任意一个可以访问数据库的人都可以拿走这些信息,不安全。

name ->varchar(20)  password->char(64)

mysql> insert into my_user (name,password) values('张三',md5('123456'));

这样在 select * from my_user表时,出现的就不是123456而是32位的字符串。

所以当我们查表的时候也需要使用md5

mysql> select * from my_user where md5('123456')=password;

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

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

相关文章

C plus plus ——【继承与派生】

系列文章目录 C plud plus ——【面向对象编程】 C plus plus ——【继承与派生】 文章目录 系列文章目录前言一、继承1.1 类的继承1.2 继承后可访问性1.3 构造函数访问顺序1.4 子类隐藏父类的成员函数 二、重载运算符2.1重载运算符的必要性2.2重载运算的形式与规则2.3 转换运…

数字信号处理学习1

基本上算是没怎么学过数字信号处理这门课&#xff0c;因为本科的时候&#xff0c;专业方向用不上&#xff0c;现在没法子了&#xff0c;专业使然&#xff0c;只能自己自学了&#xff0c;但是我又不知道该从何学起&#xff0c;就买了一本现代数字信号处理&#xff0c;结果发现人…

数据结构/队列实现栈

前言 在学习数据结构的过程当中&#xff0c;我们会学到栈和队列&#xff0c;在本篇文章中&#xff0c;重点讲解的是队列实现栈&#xff0c;在上篇文章中已经简单介绍过栈和队列的使用说明&#xff0c;以及栈实现队列。(2条消息) 数据结构/栈实现队列_Y君的进化史的博客-CSDN博客…

吴恩达ChatGPT网课笔记Prompt Engineering——训练ChatGPT前请先训练自己

吴恩达ChatGPT网课笔记Prompt Engineering——训练ChatGPT前请先训练自己 主要是吴恩达的网课&#xff0c;还有部分github的prompt-engineering-for-developers项目&#xff0c;以及部分自己的经验。 一、常用使用技巧 prompt最好是英文的&#xff0c;如果是中文的prompt&am…

Day961.老城区前端改造 -遗留系统现代化实战

老城区前端改造 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于老城区前端改造的内容。 什么是“改造老城区”。改造老城区模式 是指对遗留系统内部的模块进行治理&#xff0c;让模块内部结构合理、模块之间职责清晰的一系列模式。 也就是说&#xff0c;在遗留系统…

【Redis】聊一下Redis基础架构

我们知道学习一个技术&#xff0c;最好的方式就是从全局观出发&#xff0c;然后针对不同的点进行拆分&#xff0c;一个个破解。既可以将学到的和已有的知识联系起来&#xff0c;又可以有一定的深度和目的性。 Redis基础架构 对于一个中间件来说&#xff0c;一个是使用层面&…

GO数组切片-线性数据结构

数据结构 类型 什么是类型 &#xff1f; 内存中的二进制数据本身没有什么区别&#xff0c;就是一串0或1的组合。 内存中有一个字节内容是0x63&#xff0c;他究竟是深恶 字符串?字符&#xff1f;还是整数&#xff1f; 本来0x63表示数字 但是文字必须编码成为0和1的组合 才能记…

【C++】红黑树源码剖析

目录 概述 算法 调整策略 源码 RBTree.h test.cpp 概述 红黑树&#xff0c;是一种二叉搜索树&#xff0c;每一个节点上有一个存储位表示节点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个节点着色方式的限制&#xff0c;红黑树确保没有一…

ChatGPT、文心一言、New Bing到底哪个更AI?

Hello 各位小伙伴&#xff0c;要说今年最火爆的 IP 有哪些&#xff0c;那一定少不了人工智能&#xff08;AI&#xff09;&#xff0c;市面上已经相继出现了我们熟知的 ChatGPT&#xff08;OpenAI&#xff09;、ChatGPT 国外镜像网站、文心一言&#xff08;百度&#xff09;、Ne…

MySQL --- DDL图形化工具表结构操作

一. 图形化工具 1. 介绍 前面我们讲解了DDL中关于数据库操作的SQL语句&#xff0c;在我们编写这些SQL时&#xff0c;都是在命令行当中完成的。大家在练习的时候应该也感受到了&#xff0c;在命令行当中来敲这些SQL语句很不方便&#xff0c;主要的原因有以下 3 点&#xff1a;…

redis的介绍和安装

文章目录 一、redis的介绍和安装1.1 初识redis1.1.1 redis是什么&#xff1f;1.1.2 redis能做什么&#xff1f; 1.2 redis的安装配置 一、redis的介绍和安装 1.1 初识redis 1.1.1 redis是什么&#xff1f; Redis是一个开源的内存数据存储系统&#xff0c;也可以被用作数据库、…

阿里云服务器vCPU和CPU有区别吗?

阿里云服务器vCPU是什么&#xff1f;vCPU和CPU有什么区别&#xff1f;CPU是指云服务器的中央处理器&#xff0c;一个CPU可以包含若干个物理核&#xff0c;一台云服务器ECS实例的CPU选项由CPU物理核心数和每核线程数决定&#xff0c;通过超线程HT&#xff08;Hyper-Threading&am…

探索三维世界【3】:Three.js 的 Geometry 几何体 与 Material 材质

探索三维世界【3】&#xff1a;Three.js 的 Material 材质 1、Geometry几何体2、Material 材质3、创建平面与材质4、多平面渲染 1、Geometry几何体 Three.js中的几何体Geometry是构成3D模型的基本单元之一&#xff0c;它定义了一个物体的形状和大小。Geometry包含了物体的顶点…

RK3568平台开发系列讲解(网络篇)网络包的接收过程

🚀返回专栏总目录 文章目录 一、内核接收网络包过程二、用户态读取网络包过程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们一起来梳理下网络包的接收过程。 一、内核接收网络包过程 硬件网卡接收到网络包之后,通过 DMA 技术,将网络包放入 Ring Buffer;…

PyTorch数据加载工具:高效处理常见数据集的利器

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

HTTP 缓存新鲜度 max-age

新鲜度 理论上来讲&#xff0c;当一个资源被缓存存储后&#xff0c;该资源应该可以被永久存储在缓存中。由于缓存只有有限的空间用于存储资源副本&#xff0c;所以缓存会定期地将一些副本删除&#xff0c;这个过程叫做缓存驱逐。另一方面&#xff0c;当服务器上面的资源进行了更…

使用ControlNet控制Stable-Diffusion出图人物的姿势

概述 在Stable-Diffusion&#xff08;以下简称SD&#xff09;出图中&#xff0c;我们往往需要对出图人物的姿势进行控制&#xff0c;这里我使用一个比较简单上手的方法&#xff0c;通过ControlNet可以很方便地对画面风格&#xff0c;人物姿势进行控制&#xff0c;从而生成更加…

Python —— Windows10下训练Yolov5分割模型并测试

附:Python —— Windows10下配置Pytorch环境、进行训练模型并测试(完整流程,附有视频)   效果 手机拍摄一段工位视频,上传到win10训练了yolov5分割鼠标的样本后推理效果截图。 训练准备 1、查看自己下载的Yolov5源码是否存在"segment"文件夹,该文件夹下存在分…

【Python入门篇】——Python基础语法(字面量注释与变量)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; Python入门&#xff0c;本专栏主要内容为Python的基础语法&#xff0c;Python中的选择循环语句…

有限等待忙等、让权等待死等、互斥遵循的几大原则——参考《天勤操作系统》,柳婼的博客

参考柳婼的博客 一、 有限等待&&死等 有限等待: 对请求访问的临界资源的进程&#xff0c;应该保证有限的时间进入临界区&#xff0c;以免陷入死等状态。受惠的是进程自己 死等: 进程在有限时间内根本不能进入临界区&#xff0c;而一直尝试进入陷入一种无结果的等待状…