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; 临时调整阈值(需重启连接生效)。
开窗函数子句 rows、range
关键字
- 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