mysql的函数(第二期)

九、窗口函数(MySQL 8.0+)​​

适用于对结果集的子集(窗口)进行计算,常用于数据分析场景。

  1. ​​ROW_NUMBER()​​

    • ​作用​:为每一行生成唯一的序号。

    • ​示例​ :按分数降序排名

      复制代码
      SELECT name, score, 
        ROW_NUMBER() OVER (ORDER BY score DESC) AS rank 
      FROM students;
  2. ​​RANK() 与 DENSE_RANK()​​

    • ​区别​ :

      • RANK():允许并列排名,后续序号跳过重复值(如 1,2,2,4)。
      • DENSE_RANK():允许并列排名,但后续序号连续(如 1,2,2,3)。
    • ​示例​ :

      复制代码
      SELECT name, score,
        RANK() OVER (ORDER BY score DESC) AS rank,
        DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank
      FROM students;
  3. ​​LEAD() 与 LAG()​​

    • ​作用​ :访问当前行之后(LEAD)或之前(LAG)的行的数据。

    • ​示例​ :比较当前行与前一行的销售额

      复制代码
      SELECT order_date, amount,
        LAG(amount) OVER (ORDER BY order_date) AS prev_amount
      FROM sales;
  4. ​​聚合函数 + OVER()​​

    • ​作用​:在窗口内进行聚合计算。

    • ​示例​ :计算累计销售额

      复制代码
      SELECT order_date, amount,
        SUM(amount) OVER (ORDER BY order_date) AS running_total
      FROM sales;

​​十、JSON 函数(MySQL 5.7+)​​

处理 JSON 格式数据,支持解析、查询和修改。

  1. ​​JSON_EXTRACT(json_doc, path)​​

    • ​作用​:提取 JSON 文档中的值。

    • ​简写语法​ :->

    • ​示例​ :

      复制代码
      SELECT JSON_EXTRACT('{"name": "Alice", "age": 30}', '$.name') AS name;
      -- 等效简写
      SELECT info->'$.name' FROM users;
  2. ​​JSON_SET(json_doc, path, value)​​

    • ​作用​:修改或添加 JSON 字段。

    • ​示例​ :更新 JSON 字段

      复制代码
      UPDATE users 
      SET info = JSON_SET(info, '$.age', 31) 
      WHERE id = 1;
  3. ​​JSON_ARRAYAGG(col)​ ​ 与 ​​JSON_OBJECTAGG(key, value)​​

    • ​作用​:将多行数据聚合为 JSON 数组或对象。

    • ​示例​ :将用户角色聚合为 JSON 数组

      复制代码
      SELECT user_id, JSON_ARRAYAGG(role) AS roles
      FROM user_roles
      GROUP BY user_id;

​​十一、空间函数(GIS)​​

处理地理空间数据(需使用 GEOMETRY 数据类型)。

  1. ​​ST_Distance(geom1, geom2)​​

    • ​作用​:计算两个几何对象的距离(单位取决于坐标系)。

    • ​示例​ :计算两点距离

      复制代码
      SELECT ST_Distance(
        ST_GeomFromText('POINT(10 20)'),
        ST_GeomFromText('POINT(30 40)')
      ) AS distance;
  2. ​​ST_Contains(geom1, geom2)​​

    • ​作用​ :判断 geom1 是否完全包含 geom2。

    • ​示例​ :查询某区域内的所有坐标点

      复制代码
      SELECT * FROM locations 
      WHERE ST_Contains(area_polygon, point);

​​十二、高级字符串处理​​

  1. ​​REGEXP 正则表达式​​

    • ​作用​:使用正则匹配或替换字符串。

    • ​示例​ :

      复制代码
      -- 匹配邮箱格式
      SELECT email FROM users 
      WHERE email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$';
      
      -- 替换所有数字(需结合存储过程或程序代码)
      -- 注意:MySQL 8.0+ 支持 REGEXP_REPLACE
      SELECT REGEXP_REPLACE('abc123', '[0-9]', 'X'); → 'abcXXX'
  2. ​​FULLTEXT 全文搜索​​

    • ​作用​:对文本字段进行高效关键词搜索(需创建全文索引)。

    • ​示例​ :

      复制代码
      -- 创建全文索引
      ALTER TABLE articles ADD FULLTEXT(title, content);
      
      -- 使用 MATCH AGAINST 查询
      SELECT * FROM articles 
      WHERE MATCH(title, content) AGAINST('MySQL tutorial' IN NATURAL LANGUAGE MODE);

​​十三、系统信息函数​​

  1. ​​VERSION()​​

    • ​作用​:返回 MySQL 版本信息。
    • ​示例​ :SELECT VERSION(); → 8.0.30
  2. ​​LAST_INSERT_ID()​​

    • ​作用​:获取最后插入的自增 ID。

    • ​示例​ :

      复制代码
      INSERT INTO users (name) VALUES ('Bob');
      SELECT LAST_INSERT_ID(); → 1001
  3. ​​USER() 与 CURRENT_USER()​​

    • ​区别​ :
      • USER():返回客户端连接时使用的用户名和主机。
      • CURRENT_USER():返回权限验证时的用户名和主机。

​​十四、性能优化与陷阱​​

  1. ​​避免索引失效​​

    • ​错误示例​ :

      复制代码
      SELECT * FROM orders WHERE YEAR(order_date) = 2023; -- 索引失效
    • ​优化方案​ :

      复制代码
      SELECT * FROM orders 
      WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31'; -- 利用索引
  2. ​​谨慎使用 GROUP_CONCAT​​

    • ​默认长度限制​ :group_concat_max_len 系统变量(默认 1024 字节),需调整:

      复制代码
      SET SESSION group_concat_max_len = 1000000;
  3. ​​隐式类型转换​​

    • ​示例​ :字符串与数字比较可能导致全表扫描:

      复制代码
      SELECT * FROM products WHERE price = '100'; -- price 是数值类型

​​十五、实战案例​​

  1. ​​生成日期序列​​

    复制代码
    -- 生成最近 7 天的日期
    SELECT CURDATE() - INTERVAL n DAY AS date
    FROM (
      SELECT 0 AS n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 
      UNION SELECT 4 UNION SELECT 5 UNION SELECT 6
    ) AS numbers;
  2. ​​数据分桶统计​​

    复制代码
    -- 将分数按区间分桶统计人数
    SELECT 
      CASE 
        WHEN score >= 90 THEN 'A'
        WHEN score >= 80 THEN 'B'
        ELSE 'C'
      END AS bucket,
      COUNT(*) AS count
    FROM students
    GROUP BY bucket;
相关推荐
Decay__2 小时前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
代码山河5 小时前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
在世修行5 小时前
智学文枢:题目流水线
python·多线程·状态机·pyside
梯度下降者5 小时前
零基础入门Python 爬虫
爬虫·python·数据分析·入门指南·webcrawler
驰骋工作流5 小时前
流程时效考核的表结构:从待办时限到 WF_CH 考核结果驰骋BPM驰骋低代码低代码工作流引擎
android·低代码·rxjava
“AI国潮设计-小江”7 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
传奇开心果编程7 小时前
【Flutter踩坑排雷】第7课:巨型 build 函数坑|全部 UI 写在同一个 build,维护难、隐性异常
android·flutter·ios·移动开发·跨平台·dart·声明式ui
benchmark_cc8 小时前
用 Python 拉 A 股全市场实时快照:Notebook 请求、结果校验与易错点
python·数据分析·pandas·量化交易·股票数据·quantdash
伞伞悦读8 小时前
【第70期】Adam二阶矩不是方差:偏差校正、动量与AdamW完整实验
python
Decay__8 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构