马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
九、窗口函数(MySQL 8.0+)
实用于对效果集的子集(窗口)进行盘算,常用于数据分析场景。
- ROW_NUMBER()
- 作用:为每一行天生唯一的序号。
- 示例:按分数降序排名
- SELECT name, score,
- ROW_NUMBER() OVER (ORDER BY score DESC) AS rank
- FROM students;
复制代码
- 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;
复制代码
- LEAD() 与 LAG()
- 作用:访问当前行之后(LEAD)或之前(LAG)的行的数据。
- 示例:比力当前行与前一行的销售额
- SELECT order_date, amount,
- LAG(amount) OVER (ORDER BY order_date) AS prev_amount
- FROM sales;
复制代码
- 聚合函数 + OVER()
- 作用:在窗口内进行聚合盘算。
- 示例:盘算累计销售额
- SELECT order_date, amount,
- SUM(amount) OVER (ORDER BY order_date) AS running_total
- FROM sales;
复制代码
十、JSON 函数(MySQL 5.7+)
处理 JSON 格式数据,支持分析、查询和修改。
- JSON_EXTRACT(json_doc, path)
- 作用:提取 JSON 文档中的值。
- 简写语法:->
- 示例:
- SELECT JSON_EXTRACT('{"name": "Alice", "age": 30}', '$.name') AS name;
- -- 等效简写
- SELECT info->'$.name' FROM users;
复制代码
- JSON_SET(json_doc, path, value)
- 作用:修改或添加 JSON 字段。
- 示例:更新 JSON 字段
- UPDATE users
- SET info = JSON_SET(info, '$.age', 31)
- WHERE id = 1;
复制代码
- 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 数据类型)。
- ST_Distance(geom1, geom2)
- 作用:盘算两个多少对象的距离(单位取决于坐标系)。
- 示例:盘算两点距离
- SELECT ST_Distance(
- ST_GeomFromText('POINT(10 20)'),
- ST_GeomFromText('POINT(30 40)')
- ) AS distance;
复制代码
- ST_Contains(geom1, geom2)
- 作用:判断 geom1 是否完全包罗 geom2。
- 示例:查询某区域内的所有坐标点
- SELECT * FROM locations
- WHERE ST_Contains(area_polygon, point);
复制代码
十二、高级字符串处理
- 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'
复制代码
- FULLTEXT 全文搜索
- 作用:对文本字段进行高效关键词搜索(需创建全文索引)。
- 示例:
- -- 创建全文索引
- ALTER TABLE articles ADD FULLTEXT(title, content);
- -- 使用 MATCH AGAINST 查询
- SELECT * FROM articles
- WHERE MATCH(title, content) AGAINST('MySQL tutorial' IN NATURAL LANGUAGE MODE);
复制代码
十三、体系信息函数
- VERSION()
- 作用:返回 MySQL 版本信息。
- 示例:SELECT VERSION(); → 8.0.30
- LAST_INSERT_ID()
- 作用:获取最后插入的自增 ID。
- 示例:
- INSERT INTO users (name) VALUES ('Bob');
- SELECT LAST_INSERT_ID(); → 1001
复制代码
- USER() 与 CURRENT_USER()
- 区别:
- USER():返回客户端连接时使用的用户名和主机。
- CURRENT_USER():返回权限验证时的用户名和主机。
十四、性能优化与陷阱
- 制止索引失效
- 错误示例:
- SELECT * FROM orders WHERE YEAR(order_date) = 2023; -- 索引失效
复制代码 - 优化方案:
- SELECT * FROM orders
- WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31'; -- 利用索引
复制代码
- 谨慎使用 GROUP_CONCAT
- 默认长度限定:group_concat_max_len 体系变量(默认 1024 字节),需调整:
- SET SESSION group_concat_max_len = 1000000;
复制代码
- 隐式类型转换
- 示例:字符串与数字比力大概导致全表扫描:
- SELECT * FROM products WHERE price = '100'; -- price 是数值类型
复制代码
十五、实战案例
- 天生日期序列
- -- 生成最近 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;
复制代码 - 数据分桶统计
- -- 将分数按区间分桶统计人数
- 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;
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |