MySQL中MAX()和MIN()函数的高效使用及技巧

 更新时间:2024年06月04日 09:39:49   作者:音乐学家方大刚  
在SQL数据库中,最大/最小值函数—MAX()/MIN()是经常要用到的,下面这篇文章主要给大家介绍了关于MySQL中MAX()和MIN()函数的高效使用及技巧的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

MySQL数据库是世界上最流行的关系型数据库管理系统之一,它不仅提供了存储数据的功能,还支持复杂的查询和数据操作。在数据分析中,我们经常需要找到一个数据集中的最大值和最小值。MySQL为此提供了两个非常有用的函数:MAX() 和 MIN()。接下来,我们将探讨这两个函数的使用方法以及一些高级技巧。

MAX() 函数

MAX() 函数返回一组值中的最大值。这个函数常用于数字字段,但也可以用于文本字段来找出按字典顺序最后的元素。

基本用法

SELECT MAX(column_name) FROM table_name;

这会返回 table_name 表中 column_name 列的最大值。

在条件语句中的应用

MAX() 也可以与 CASE WHEN 语句结合使用,来找出满足特定条件的最大值。

SELECT MAX(CASE WHEN condition THEN value ELSE alternative END) FROM table_name;

例如,如果我们想要找出不等于某个值的最大值,可以这样写:

SELECT MAX(CASE WHEN acct_item != 'ALL' THEN 1 ELSE 0 END) AS df_flag FROM table_name;

MIN() 函数

与 MAX() 函数相对的是 MIN() 函数,它返回一组值中的最小值。

基本用法

SELECT MIN(column_name) FROM table_name;

这会返回 table_name 表中 column_name 列的最小值。

在条件语句中的应用

和 MAX() 函数一样,MIN() 也可以与 CASE WHEN 结合使用。

SELECT MIN(CASE WHEN condition THEN value ELSE alternative END) FROM table_name;

如果要检查一个字段的所有值是否都满足某个条件,可以使用 MIN() 来实现:

SELECT MIN(CASE WHEN acct_item = 'ALL' THEN 1 ELSE 0 END) AS tf_flag FROM table_name;

这会返回一个标志,如果所有 acct_item 值都是 ‘ALL’,则 tf_flag 为 1,否则为 0。

高级技巧

使用 MAX() 和 MIN() 时,一个高级的应用是在聚合数据时识别记录。比如,在用户行为分析中,我们可能想要标记那些满足特定活动条件的用户。

以下是一个实际的例子:

SELECT 
    a.user_id,
    MIN(CASE WHEN acct_item = 'ALL' THEN 1 ELSE 0 END) AS tf_flag,
    MAX(CASE WHEN acct_item != 'ALL' THEN 1 ELSE 0 END) AS df_flag
FROM 
    activity_table AS a
GROUP BY 
    a.user_id;

在这个查询中,tf_flag 和 df_flag 将分别告诉我们每个 user_id 是否有 'ALL' 项或非 ‘ALL’` 项。这种方式极大地提高了我们对数据集中特定条件分布情况的理解。

总的来说,·MAX()· 和 ·MIN() ·是MySQL中功能强大的工具,能帮助我们简化对数据的处理和分析。通过结合条件语句和聚合函数,我们可以有效地从数据中提取深度的见解。

附:解决mysql语句MAX()函数中出现的问题

在数据库中,当我们一些数据尚不明确具体类型时,用varchar类型表示这个字段类型是不会有问题的,(这是个好习惯!)因为varchar类型数据不管是存放数值类型或者字符串类型都能搞定,在后端代码中想进行切换计算也是比较的简单,稍作处理即可。

而在项目mysql语句中MAX()函数出现过的问题,虽说问题虽小,但是如果不知道这个问题所在之处的话,还是挺让人头疼的,毕竟本人就之前就无比纠结过。

如下所示,在设计表结构时的current_data类型为varchar:

按照我们mysql语句中的惯用写法,MAX()及MIN()函数应该是以下写法:

SELECT
MAX(current_data) AS maxCurrentData,
MIN(current_data) AS minCurrentData
FROM tunnel_detect_data
WHERE create_time >= '2022-06-01'
AND '2022-06-02' >= create_time

查询结果如下所示:

查询结果跟下表中实际数据对比一看就发现结果是不正确的,在对比中有好几个数据是大于993.07这个数值的,为啥会造成这样的现象呢?

原因:数据为varchar类型,那么MAX函数获取的最大值会从头开始比较,也就是说MAX函数获取的最大值都是以9开头的数值,认为开头数9多的数为最大值,导致我们所查询的结果出现了偏差。

解决办法:如果表中数据类型不是varchar类型而是具体的数值类型的话,上述的sql语句的写法是没有问题的,但是如果是varchar类型的数据,所查询的字段数据要做“+0”处理才行,否则与实际结果不相符合,如下所示:

SELECT
MAX(current_data + 0) AS maxCurrentData,
MIN(current_data + 0) AS minCurrentData
FROM tunnel_detect_data
WHERE create_time >= '2022-06-01'
AND '2022-06-02' >= create_time

查询结果如下所示:

根据与下表数据的实际对比可发现,通过“+0”操作过后的查询结果为正确结果。

总结一下:根据数据类型判断mysql语句MAX()函数中是否需要做“+0”处理,具体问题具体分析,bug解决

总结

到此这篇关于MySQL中MAX()和MIN()函数的高效使用及技巧的文章就介绍到这了,更多相关MySQL MAX()和MIN()函数使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql 5.7.18 绿色版下载安装教程

    mysql 5.7.18 绿色版下载安装教程

    这篇文章主要为大家详细介绍了mysql 5.7.18 绿色版下载安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • MySQL一些常用高级SQL语句

    MySQL一些常用高级SQL语句

    对 MySQL 数据库的查询,除了基本的查询外,有时候需要对查询的结果集进行处理。例如只取 10 条数据、对查询结果进行排序或分组等等,今天就给大家分享MySQL一些常用高级SQL语句,感兴趣的朋友一起看看吧
    2021-07-07
  • MySQL内存使用之线程独享介绍

    MySQL内存使用之线程独享介绍

    这篇文章主要介绍了MySQL内存使用之线程独享介绍,线程独享内存主要用于各客户端连接线程存储各种操作的独享数据,如线程栈信息,分组排序操作,数据读写缓冲,结果集暂存等等,而且大多数可以通过相关参数来控制内存的使用量,需要的朋友可以参考下
    2014-12-12
  • MySQL实现JDBC详细步骤

    MySQL实现JDBC详细步骤

    JDBC 是 Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动,本文给大家介绍MySQL实现JDBC详细讲解,感兴趣的朋友一起看看吧
    2022-02-02
  • MySQL定期分析检查与优化表的方法小结

    MySQL定期分析检查与优化表的方法小结

    听DBA的人说,相比oracle,MySQL就是一个玩具级别的数据库,在网易门户中,DBA基本很少去管理到MySQL的东西,所以我们产品使用到的MySQL的一些配置和优化还是需要我们开发人员自己动手,下面就简单介绍一下实用的定期优化方法
    2014-06-06
  • mysql 子查询与连接表详情

    mysql 子查询与连接表详情

    这篇文章主要介绍了mysql 子查询与连接表,格式化SQL 包含子查询的SELECT语句难以阅读和调试,特别是它们较为复杂时更是如此,对于能嵌套的子查询的数目没有限制,不过在实际使用时由于性能的限制,不能嵌套太多的子查询,下面请跟雄安边一起来看看详细内容吧
    2021-10-10
  • SQL Group By分组后如何选取每组最新的一条数据

    SQL Group By分组后如何选取每组最新的一条数据

    经常在分组查询之后,需要的是分组的某行数据,例如更新时间最新的一条数据,下面这篇文章主要给大家介绍了关于SQL Group By分组后如何选取每组最新的一条数据的相关资料,需要的朋友可以参考下
    2022-10-10
  • mysql快速添加百万条记录的语句

    mysql快速添加百万条记录的语句

    本文介绍一下关于MySQL使用INSERT SELECT批量插入数据的方法
    2013-11-11
  • MySQL慢查询的坑

    MySQL慢查询的坑

    这篇文章主要介绍了MySQL慢查询的坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • MySQL8.0新特性之不可见主键的使用

    MySQL8.0新特性之不可见主键的使用

    MySQL8.0.30版本引入不可见主键,它可以自动为没有显式指定主键的 InnoDB 表创建一个不可见的主键,本文主要介绍了MySQL8.0新特性之不可见主键的使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04

最新评论