MySql 常用语句和函数

创建用户 / 视图授权

-- 1. 创建用户设置密码
CREATE USER 'jx_work_user'@'%' IDENTIFIED BY 'jx_work_user@duGLkOXN';

-- 2. 授予视图权限(假设视图名为 `jinxiang_work_ticket_plan`,数据库为 `server`)
GRANT SELECT ON `hyzh-server`.`jinxiang_work_ticket_plan` TO 'jx_work_user'@'%';
GRANT SELECT ON `hyzh-server`.`jinxiang_work_ticket_receipt` TO 'jx_work_user'@'%';

-- 3. 刷新权限
FLUSH PRIVILEGES;

管理和监控相关语句

show processlist;

作用:查看当前 MySQL 服务器上所有活跃的连接进程信息(默认显示前 100 条)。
输出内容:包含进程 ID(Id)、用户(User)、主机(Host)、数据库(db)、命令类型(Command)、时间(Time,秒)、状态(State)、SQL 语句片段(Info)等。
用途:快速排查连接数、慢查询或阻塞进程。

show full processlist;

作用:与 show processlist; 功能相同,但会显示完整的 SQL 语句(而非截断的片段)。
适用场景:需要查看完整 SQL 内容以分析问题时使用(如长 SQL 导致的阻塞)。

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND = 'Query';

作用:从系统表 INFORMATION_SCHEMA.PROCESSLIST 中查询所有正在执行 Query 命令的进程(即正在运行 SQL 查询的连接)。
筛选逻辑:COMMAND = 'Query' 仅保留处于“查询中”状态的进程,排除 Sleep、Connect 等非活跃状态的连接。
优势:支持更复杂的条件筛选(如按用户、时间、数据库名过滤),灵活性高于 show processlist。

SHOW VARIABLES LIKE 'long_query_time';

作用:查看 MySQL 中定义“慢查询”的阈值时间(单位:秒)。
默认值:通常为 10 秒(即执行时间超过 10 秒的查询会被记录到慢查询日志)。
用途:配合慢查询日志(slow_query_log)定位性能瓶颈,可通过 SET GLOBAL long_query_time = N; 临时调整阈值(需重启连接生效)。


开窗函数子句 rowsrange

关键字

  • rows :指行,包含边界行
  • range :数值范围,包含边界值
  • Unbounded :是无边界
  • Preceding :向上,减去,提前
  • Following :向下,加上,延后
  • Current row :当前行

语法使用说明

unbound和current row

其中数值1和2可以替换成任意值,也可以直接使用unbounded和current row ,其中unbounded表示不做限制,current row 表示当前行

rows between unbounded preceding and unbounded following

含义:按照分组内全部行求和,不做任何限制

rows between unbounded preceding and current row

含义:从分组内排序的起始行到当前行

rows unbounded preceding

含义:(同上)从分组内排序的起始行到当前行

range between unbounded preceding and unbounded following

含义:按照分组内全部行求和,不做任何限制

range between unbounded preceding and unbounded following

含义:从分组内排序的起始行的值到当前行的值

用例:

| Id | Month | salary     |
| -- | ----- | ---------- |
| 1  | 8     | 90         |
| 1  | 7     | 90         |
| 1  | 4     | 60         |
| 1  | 3     | 40         |
| 1  | 2     | 30         |
| 1  | 1     | 20         |
| 2  | 2     | 30         |
| 2  | 1     | 20         |
| 3  | 4     | 70         |
| 3  | 3     | 60         |
| 3  | 2     | 40         |

计算出每个员工的 累计工资汇总, 每月统计当前月份最近的三个月薪资之和, 说明: 当8月份时, 统计8月,7月,6月 工资总和...每月以此类推, 不考虑跨年
# 用法一
SELECT 
    Id, Month
    , SUM(Salary) OVER (PARTITION BY Id ORDER BY Month range 2 PRECEDING) AS Salary
    , rank() OVER (PARTITION BY Id ORDER BY Month DESC) AS r
FROM Employee
ORDER BY Id, Month desc

# 用法二
SELECT 
    Id, Month
    , SUM(Salary) OVER (PARTITION BY Id ORDER BY Month desc range between  0 PRECEDING and 2 following ) AS Salary
    , rank() OVER (PARTITION BY Id ORDER BY Month DESC) AS r
FROM Employee
ORDER BY Id, Month desc
最后修改:2025 年 09 月 22 日
如果觉得我的文章对你有用,请点个赞吧!