MySQL常用操作速记:从字符集到游标全解析

今天把几个容易混的 MySQL 点整理成一篇复习笔记,方便自己回看。

1. JDBC 和字符集

数据库里要想正常存 emoji,核心是统一使用 utf8mb4。

常见会话变量:

复制代码
SET character_set_client = utf8mb4;
SET character_set_results = utf8mb4;
SET collation_connection = utf8mb4_0900_ai_ci;

注意:

  • character_set_client:客户端发来的 SQL 按什么编码理解
  • character_set_results:查询结果按什么编码返回
  • collation_connection:连接使用的排序规则,必须是具体排序规则,不是字符集名
  • JDBC 驱动会影响连接会话字符集,最好和数据库侧保持一致

一句话:数据库、表、列、JDBC 连接都尽量统一成 utf8mb4。


2. GROUP BY、COUNT 和 GROUP_CONCAT

GROUP BY

按某一列分组。

复制代码
SELECT cust_name, COUNT(cust_address) AS addr_num
FROM Customers
GROUP BY cust_name;

含义:按 cust_name 分组,统计每组里 cust_address 非空的数量。

COUNT(*) 和 COUNT(column)

  • COUNT(*):统计行数
  • COUNT(column):统计非 NULL 的行数

GROUP_CONCAT()

把同一组里的值拼成一个字符串。

复制代码
SELECT cust_name, GROUP_CONCAT(cust_address) AS addresses
FROM Customers
GROUP BY cust_name;

结果类似:

cust_name addresses
张三 北京,上海

3. JOIN 和 UNION

JOIN

左右拼表,列横向合并。

  • INNER JOIN:只保留两边都匹配的行
  • LEFT JOIN:保留左表全部行,右表没有的补 NULL
  • FULL OUTER JOIN:左右都保留,MySQL 原生不支持

UNION

上下拼结果,行纵向合并。

复制代码
SELECT name FROM A
UNION
SELECT name FROM B;
  • UNION 默认去重
  • UNION ALL 不去重

一句话记忆:

  • JOIN:拼列
  • UNION:拼行

4. 视图 VIEW

复制代码
CREATE VIEW top_10_user_view AS
SELECT id, username
FROM user
WHERE id < 10;

AS 的意思是:把后面的查询定义成这个视图。

视图本质上是一个"虚拟表",方便复用查询逻辑。


5. 修改表结构

修改列类型

复制代码
ALTER TABLE user
MODIFY COLUMN age TINYINT;

修改列名

复制代码
ALTER TABLE user
CHANGE COLUMN age user_age TINYINT;

只改列名(MySQL 8+)

复制代码
ALTER TABLE user
RENAME COLUMN age TO user_age;

6. 权限控制

MySQL 里常用的是:

  • GRANT:授权
  • REVOKE:撤销权限

授权

复制代码
GRANT SELECT, INSERT ON shop.* TO 'myuser'@'%';

意思是:给 myuser 这个账号,授予 shop 库下所有表的查询和新增权限。

账号写法

复制代码
'myuser'@'%'

表示:

  • myuser:用户名
  • @:分隔用户名和来源主机
  • %:任意主机都能登录

常见权限

  • SELECT:查
  • INSERT:增
  • UPDATE:改
  • DELETE:删
  • CREATE:建
  • ALTER:改结构
  • DROP:删对象

7. DELETE、DROP 和 CRUD

CRUD

数据库最基本的四种操作:

  • C = Create = INSERT
  • R = Read = SELECT
  • U = Update = UPDATE
  • D = Delete = DELETE

DELETE

删的是表中的数据行。

复制代码
DELETE FROM user WHERE id = 1;

DROP

删的是整个对象。

复制代码
DROP TABLE user;

它会把表结构和数据一起删掉,不是删某一列。

删列

复制代码
ALTER TABLE user DROP COLUMN age;

8. 修改数据库账号名

图里的这种写法本质是在改 MySQL 账号,不是业务表:

复制代码
RENAME USER 'myuser'@'%' TO 'newuser'@'%';

更推荐这个写法,比直接改系统表安全。


9. 存储过程

存储过程可以理解成:数据库里的小函数。

例如加法过程:

复制代码
CREATE PROCEDURE proc_adder(IN a INT, IN b INT, OUT sum INT)
BEGIN
    IF a IS NULL THEN SET a = 0; END IF;
    IF b IS NULL THEN SET b = 0; END IF;
    SET sum = a + b;
END;

调用:

复制代码
CALL proc_adder(3, 5, @result);
SELECT @result;

结果是 8。

实际用途

  • 批量处理数据
  • 复杂统计
  • 统一封装业务逻辑

JDBC 调用

Java 里通常用 CallableStatement 调用存储过程。


10. 触发器

触发器可以理解成:表发生变化时自动执行的代码。

例如:

复制代码
CREATE TRIGGER trigger_insert_user
AFTER INSERT ON user
FOR EACH ROW
BEGIN
    INSERT INTO user_history(user_id, operate_type, operate_time)
    VALUES (NEW.id, 'add a user', NOW());
END;

意思是:user 表新增一条数据后,自动往日志表写一条记录。

触发器常见场景

  • 记录日志
  • 数据审计
  • 自动同步

关键字

  • NEW:新数据
  • OLD:旧数据
  • BEFORE / AFTER:操作前 / 操作后

11. 游标

游标可以理解成:一行一行处理查询结果的指针。

常用于存储过程里逐行遍历数据。

核心步骤

  1. 声明游标
  2. 打开游标
  3. FETCH 取一行
  4. 循环处理
  5. 关闭游标

结束标志

复制代码
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

意思是:当游标取不到下一行时,把 done 设为真,循环结束。


12. 一句话总复习

  • UNION:上下合并,去重
  • JOIN:左右拼接
  • GROUP BY:分组
  • GROUP_CONCAT:组内拼接
  • VIEW:虚拟表
  • GRANT/REVOKE:授权/撤权
  • DELETE:删数据
  • DROP:删对象
  • PROCEDURE:数据库方法
  • TRIGGER:自动触发
  • CURSOR:逐行遍历
相关推荐
海鸥-w10 小时前
什么是AOP
java
Cc.Y10 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
paopaokaka_luck10 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_9267870510 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev10 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
by2099910 小时前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态
笔墨登场说说10 小时前
flink bin/start-cluster.sh 帮我做成开机启动
开发语言·python
Sarvartha10 小时前
Lambda 表达式和函数式接口
java·开发语言
计算机毕业设计杰瑞10 小时前
【计算机毕设精品】基于SpringBoot的一体化教务与学业质量管理系统的设计与实现,附源码_增删改查_java项目_可完美运行部署_网站项目
java·spring boot·课程设计
小白学大数据11 小时前
拼多多反爬对抗实战:Scrapy 中间件化采集架构解析
开发语言·scrapy·中间件·架构