如何在SQL中高效使用聚合函数、日期函数和字符串函数:实用技巧与案例解析

news/2025/3/24 2:40:09/

文章目录

  • 聚合函数
  • group by子句的使用
  • 实战OJ
  • 日期函数
  • 字符串函数
  • 数学函数
  • 其它函数

聚合函数

函数说明
COUNT([DISTINCT] expr)返回查询到的数据的 数量
SUM([DISTINCT] expr)返回查询到的数据的 总和,不是数字没有意义
AVG([DISTINCT] expr)返回查询到的数据的 平均值,不是数字没有意义
MAX([DISTINCT] expr)返回查询到的数据的 最大值,不是数字没有意义
MIN([DISTINCT] expr)返回查询到的数据的 最小值,不是数字没有意义
  • 这个是查询的结果
    在这里插入图片描述
  1. COUNT
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
-- 使用 * 做统计,不受 NULL 影响 
count(*) from students;
+----------+
| count(*) |
+----------+
|        4 |
+----------+
1 row in set (0.00 sec)
-- 使用表达式做统计 
select count(1) from students;
+----------+
| count(1) |
+----------+
|        4 |
+----------+
1 row in set (0.00 sec)
统计班级收集的 qq 号有多少
-- NULL 不会计入结果 
select count(qq) from students;
+-----------+
| count(qq) |
+-----------+
|         1 |
+-----------+
1 row in set (0.00 sec)
统计本次考试的数学成绩分数个数
--COUNT(math) 统计的是全部成绩select count(math) from exam_result;
+-------------+
| count(math) |
+-------------+
|           7 |
+-------------+
1 row in set (0.00 sec)
  1. SUM
    统计数学成绩总分
    在这里插入图片描述
    在这里插入图片描述
select sum(math) from exam_result;
+-----------+
| sum(math) |
+-----------+
|       583 |
+-----------+
1 row in set (0.00 sec)
-- 不及格 < 60 的总分,没有结果,返回 NULL SELECT SUM(math) FROM exam_result WHERE math< 60;select sum(math) from exam_result where math < 60;
+-----------+
| sum(math) |
+-----------+
|      NULL |
+-----------+
1 row in set (0.00 sec)
  1. AVG
    统计平均总分
    在这里插入图片描述
select avg(chinese + math + english) 平均分 from exam_result;
+--------------------+
| 平均分             |
+--------------------+
| 221.42857142857142 |
+--------------------+
1 row in set (0.00 sec)
  1. MAX
    返回英语最高分
    在这里插入图片描述
select MAX(english) from exam_result;
+--------------+
| MAX(english) |
+--------------+
|           90 |
+--------------+
1 row in set (0.00 sec)

返回 > 70 分以上的数学最低分
在这里插入图片描述

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

group by子句的使用

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

语法:select column1, column2, .. from table group by column;
案例:

  • 准备工作,创建一个雇员信息表(来自oracle 9i的经典测试表)
    • EMP员工表
    • DEPT部门表
    • SALGRADE工资等级表
  • 如何显示每个部门的平均工资和最高工资
select deptno,avg(sal),max(sal) from EMP group by deptno; 
  • 显示每个部门的每种岗位的平均工资和最低工资
 select avg(sal),min(sal),job, deptno from EMP group by deptno, job; 
  • 显示平均工资低于2000的部门和它的平均工资
    • 统计各个部门的平均工资
select avg(sal) from EMP group by deptno
    • having和group by配合使用,对group by结果进行过滤
select avg(sal) as myavg from EMP group by deptno having myavg<2000; 
--having经常和group by搭配使用,作用是对分组进行筛选,作用有些像where。

实战OJ

牛客:批量插入数据
牛客:找出所有员工当前薪水salary情况
牛客:查找最晚入职员工的所有信息
牛客:查找入职员工时间排名倒数第三的员工所有信息
查找薪水记录超过15条的员工号emp_no以及其对应的记录次数t

日期函数

在这里插入图片描述

  • 获得年月日:
    在这里插入图片描述
select current_date();
+----------------+
| current_date() |
+----------------+
| 2025-03-21     |
+----------------+
1 row in set (0.00 sec)
  • 获得时分秒:
    在这里插入图片描述
select current_time();
+----------------+
| current_time() |
+----------------+
| 09:21:46       |
+----------------+
1 row in set (0.00 sec)
  • 获得时间戳:
    在这里插入图片描述
select current_timestamp();
+---------------------+
| current_timestamp() |
+---------------------+
| 2025-03-21 09:22:22 |
+---------------------+
1 row in set (0.00 sec)
  • 在日期的基础上加日期:
    在这里插入图片描述
select date_add('2017-10-28',interval 10 day);
+----------------------------------------+
| date_add('2017-10-28',interval 10 day) |
+----------------------------------------+
| 2017-11-07                             |
+----------------------------------------+
1 row in set (0.04 sec)
  • 在日期的基础上减去时间:
    在这里插入图片描述
select date_sub('2017-10-28',interval 10 day);
+----------------------------------------+
| date_sub('2017-10-28',interval 10 day) |
+----------------------------------------+
| 2017-10-18                             |
+----------------------------------------+
1 row in set (0.00 sec)
  • 计算两个日期之间相差多少天:
    在这里插入图片描述
mysql> select datediff('2017-10-10', '2016-9-1');
+------------------------------------+
| datediff('2017-10-10', '2016-9-1') |
+------------------------------------+
|                                404 |
+------------------------------------+
1 row in set (0.00 sec)

案例-1:

  • 创建一张表,记录生日
create table tmp(id int primary key auto_increment,birthday date
);
  • 添加当前日期:
mysql> insert into tmp(birthday) values(current_date()); 
Query OK, 1 row affected (0.01 sec)mysql> select * from tmp;
+----+------------+
| id | birthday   |
+----+------------+
|  1 | 2025-03-21 |
+----+------------+
1 row in set (0.00 sec)

在这里插入图片描述

案例-2:

  • 创建一个留言表
mysql> create table msg (id int primary key auto_increment,content varchar(30) not null,sendtime datetime);

插入数据

mysql>  insert into msg(content,sendtime) values('hello1', now());
Query OK, 1 row affected (0.01 sec)mysql>  insert into msg(content,sendtime) values('hello2', now());
Query OK, 1 row affected (0.00 sec)

在这里插入图片描述

  • 显示所有留言信息,发布日期只显示日期,不用显示时间
select content,date(sendtime) from msg;
  • 请查询在2分钟内发布的帖子
select * from msg where date_add(sendtime, interval 2 minute) > now();
理解:
------------------------------|-----------|-------------|------------------初始时间     now()       初始时间+2min           

字符串函数

在这里插入图片描述
案例:

  • 获取emp表的ename列的字符集
select charset(ename) from EMP;
  • 要求显示exam_result表中的信息,显示格式:“XXX的语文是XXX分,数学XXX分,英语XXX分”
select concat(name, '的语文是',chinese,'分,数学是',math,'分') as '分数' from student;
  • 求学生表中学生姓名占用的字节数
select length(name), name from student;

注意:length函数返回字符串长度,以字节为单位。如果是多字节字符则计算多个字节数;如果是单字节字符则算作一个字节。比如:字母,数字算作一个字节,中文表示多个字节数(与字符集编码有关)

  • 将EMP表中所有名字中有S的替换成’上海’
select replace(ename, 'S', '上海') ,ename from EMP;
  • 截取EMP表中ename字段的第二个到第三个字符
select substring(ename, 2, 2), ename from EMP;
  • 以首字母小写的方式显示所有员工的姓名
select concat(lcase(substring(ename, 1, 1)),substring(ename,2)) from EMP;

数学函数

在这里插入图片描述

  • 绝对值
    在这里插入图片描述
select abs(-100.2);
  • 向上取整
    在这里插入图片描述
select ceiling(23.04);
  • 向下取整
    在这里插入图片描述
select floor(23.7);
  • 保留2位小数位数(小数四舍五入)

在这里插入图片描述

select format(12.3456, 2);
  • 产生随机数
    在这里插入图片描述
select rand();

获取0 ~ 99的随机数
在这里插入图片描述

其它函数

  • user() 查询当前用户
select user();
  • md5(str)对一个字符串进行md5摘要,摘要后得到一个32位字符串
select md5('admin')
+----------------------------------+
| md5('admin')                     |
+----------------------------------+
| 21232f297a57a5a743894a0e4a801fc3 |
+----------------------------------+
  • database()显示当前正在使用的数据库
select database();
  • password()函数,MySQL数据库使用该函数对用户加密
select password('root');+-------------------------------------------+| password('root')                          |+-------------------------------------------+| *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |+-------------------------------------------+
  • ifnull(val1, val2) 如果val1为null,返回val2,否则返回val1的值
select ifnull('abc', '123');+----------------------+| ifnull('abc', '123') |+----------------------+| abc                 |+----------------------+1 row in set (0.01 sec)select ifnull(null, '123');+---------------------+| ifnull(null, '123') |+---------------------+| 123                 |+---------------------+1 row in set (0.00 sec)

http://www.ppmy.cn/news/1581270.html

相关文章

第J3周:DenseNet121算法实现01(Pytorch版)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: PyCharm 框 架: Pytorch &#xff08;二&#xff09;具体步骤…

Redis 实现分布式锁全解析:从原理到实践

在分布式系统开发的广袤领域中&#xff0c;资源竞争问题宛如隐藏在暗处的礁石&#xff0c;时刻威胁着系统的稳定性与数据一致性。当多个服务实例如同脱缰野马般同时冲向同一份共享数据&#xff0c;试图进行修改操作时&#xff0c;一场混乱的 “数据抢夺战” 便悄然上演。此时&a…

使用DeepSeek翻译英文科技论文,以MarkDown格式输出,使用Writage 3.3.1插件转换为Word文件

一、使用DeepSeek翻译英文科技论文&#xff0c;以MarkDown格式输出 以科技论文“Electrical Power System Sizing within the Numerical Propulsion System Simulation”为例。 关于Writage 3.3.1的进一步了解&#xff0c;可发送邮件至邮箱pyengine163.com. 首先&#xff0c;打…

StarRocks 升级注意事项

前段时间升级了生产环境的 StarRocks&#xff0c;从 3.3.3 升级到了 3.3.9&#xff0c;期间还是踩了不少坑所以在这里记录下。 因为我们的集群使用的是存算分离的版本&#xff0c;也是使用官方提供的 operator 部署在 kubernetes 里的&#xff0c;所以没法按照官方的流程进入虚…

Google C++编码规范指南(含pdf)

Google C 编码规范的核心内容 1. 核心目标&#xff1a;通过统一的代码风格和命名规则&#xff0c;确保代码易于阅读和维护。避免复杂结构&#xff08;如多重继承、复杂模板&#xff09;&#xff0c;优先使用简单、直观的实现方式。减少潜在的内存泄漏、悬空指针等问题&#xff…

在Windows和Linux系统上的Docker环境中使用的镜像是否相同

在Windows和Linux系统上的Docker环境中使用的镜像是否相同&#xff0c;取决于具体的运行模式和目标平台&#xff1a; 1. Linux容器模式&#xff08;默认/常见场景&#xff09; Windows系统&#xff1a; 当Windows上的Docker以Linux容器模式运行时&#xff08;默认方式&#xf…

前端开发:Vue以及Vue的路由

Vue是什么 警告&#xff1a;本文作者是底层程序员&#xff0c;对Vue只是偶尔用到&#xff0c;研究并不深入&#xff0c;对Vue的理解可能非常肤浅甚至存在错误&#xff0c;请多包含。以下文字只为外行记录分享&#xff0c;专业前端朋友可以略过。 作为一个底层老程序员&#x…

docker-存储卷-网络

前言 绑定卷bind mount -v 参数创建卷 功能&#xff1a; 完成卷映射 • 语法 docker run -v name:directory[:options] … • 参数 &#xffee; 第一个参数&#xff1a;宿主机目录&#xff0c;这个和管理卷是不一样的 &#xffee; 第二个参数&#xff1a;卷映射到容器的目…