MySQL中常用的窗口函数有哪些 MySQL窗口函数详解与实战案例

兄弟你好,说到MySQL窗口函数,我了解得很深。
记得去年我在一家公司做数据分析师的时候,我刚刚升级到MySQL 8 .0。
当我第一次开始使用窗口函数时,它很麻烦。

当时我负责分析销售团队的绩效,要计算每个销售人员的薪资排名。
当时还没有窗口函数,所以只能使用子查询。
我写的SQL代码很长而且容易出错。
后来我使用了RANK()函数,直接写在主查询中。
结果集中的行数没有变化,但是效率提高了很多。

我记得曾经有一个销售人员,他的薪水是与第一名挂钩的。
按照以往惯例,排名将直接跃升至第三位。
这是不科学的。
使用DENSE_RANK(),关联的排名不会跳动,结果看起来会更顺眼。

我们再次想要分析每个销售代表薪资的增减情况。
您使用 LAG() 函数来计算当前工资与前一个记录之间的差异。
这样,性能趋势一目了然。

但说实话,当我第一次开始使用这些功能时,我并不太明白它们是如何工作的。
例如,我不知道 PERCENT_RANK() 是如何计算的。
后来查了资料才知道是根据评分计算出来的百分比,突然就想到了。

对于性能的提升,我当时主要注重建立索引,特别是PARTITION BY和ORDER BY列,这样查询速度会快很多。
另外,在编写SQL时,尽量简化表达式,不要使它们太复杂。

总的来说,窗口函数在正确使用的情况下可以大大提高数据分析的效率,但也要注意提高性能,不要让查询变得过于复杂。
这就像开车一样。
你必须懂得如何踩油门、如何换挡,才能快速稳定地行驶。
哈哈,就是这样。
您还有什么想知道的吗?

mysql中concat函数的用法

MySQL 的 CONCAT 函数用于将多个字符串连接成一个。
例如,在 2 02 2 年,您在一家公司担任开发人员,您可以编写 SQL 查询并使用此功能拼出用户的全名等。

默认情况下使用如下:CONCAT(str1 , str2 , ...)。
您是否看到必须至少有两个参数?越多越好。
如果传递NULL,结果肯定是NULL。

当我第一次开始使用它时,我很困惑。
检查用户表。
要将您的名字和姓氏拼写在一起,请编写: SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM user;如果这样出来的话,中间就会有一个空间来分隔空间。

此外,如果您想在手机号码前面添加前缀,例如“Phone:”,请使用: SELECT CONCAT('phone:', phone) FROM user;就是这样。

更复杂的项目,例如地址串联、州、城市、县、距离等,可能分布在多个列中,因此您可以将它们组合在一起。
SELECT CONCAT(省、市、区、地址) AS full_address FROM user;
但是!请注意这一点。
如果参数包含NULL,CONCAT直接将NULL返回给用户。
一旦踏上这个陷阱,你就永远不会忘记。
所以你必须处理它。
后来我使用 IFNULL 或 COALESCE 将 NULL 替换为空字符串。
示例: SELECT CONCAT(IFNULL(first_name, ''), ' ', IFNULL(last_name, '')) FROM user;这样,无论first_name还是last_name为NULL,对结果都没有影响,并被视为空字符串。

IFNULL(expr1 , expr2 ) 表示如果 expr1 为 NULL,则返回 expr2 对于 COALESCE,您可以传递多个参数并返回第一个非 NULL 参数。
这取决于。

还有一个单独的 CONCAT_WS 函数。
WS 有一个分隔符。
这种方法的优点是自动忽略NULL,不会因为某个参数为NULL而导致整体结果变成NULL。
示例: SELECT CONCAT_WS('-', '2 02 4 ', '04 ', '01 ') AS date_str;结果为“2 02 4 -04 -01 ”,分隔符为“-”。

使用CONCAT时,必须注意至少两个参数。
如果缺少任何一项,就会报错。
您还应该检查数据中的 NULL,尤其是在连接关键字段时。
另外,如果你有很多数据,使用CONCAT可能会对性能产生一些影响,所以这要看情况。