Java 后端必学:MySQL 零基础入门与实战详解
一、前言
如今绝大多数软件、网站、小程序、管理系统都离不开数据存储,用户账号、商品信息、订单记录、学习数据等,都需要专门的容器来存放和管理。
MySQL 是目前全球使用最广泛的开源关系型数据库,免费、稳定、上手简单,是后端开发、软件开发、计算机专业学习的必备技能。不管是日常课程学习、期末考核,还是求职面试、项目实战,MySQL 都是核心考点与刚需技术。
很多新手入门时会被专业术语、安装报错、连接问题难住,本文结合实际踩坑经历,从零讲解 MySQL 全套基础,兼顾理论与实操,帮大家避开常见问题,快速上手使用。
二、数据库全套基础概念
数据库(DB):按照一定的数据结构来组织、存储和管理数据的仓库
数据库管理系统(DBMS):一种操纵和管理数据库的大型软件,用于创建、使用和维护数据库
关系型数据库(RDBMS):由多张相互连接的二维表组成的数据库
非关系型数据库:泛指非关系型数据库,是对关系型数据库的补充
结构化查询语言(SQL):一种操作关系型数据库的编程语言,定义了一套操作关系型数据库统一SQL标准
三、MySQL 整体结构
MySQL 整体分为服务端、客户端、存储引擎、数据文件、日志五大模块,不用死记复杂架构,结合生活例子理解即可:
服务端
类似餐厅后厨系统,负责接收订单(SQL请求)、协调厨师(存储引擎)工作。包含连接器(接待员)、查询缓存(菜单备忘录)、分析器(订单审核员)、优化器(成本计算员)、执行器(调度员)。
客户端
如同顾客使用的点餐APP,通过命令行工具、Navicat等界面发送请求。例如手机下单后,后厨(服务端)开始处理。
存储引擎
类比不同厨师团队:
- InnoDB:全能主厨,支持热菜(事务)和冷盘(非事务),默认选择。
- MyISAM:快餐厨师,只做固定套餐(非事务),速度快但故障恢复差。
数据文件
相当于厨房的冰箱和货架:
- .frm文件:记录菜品配方(表结构)。
- .ibd文件(InnoDB):新鲜食材柜(数据+索引),独立管理。
- .MYD/.MYI文件(MyISAM):预制菜仓库(数据与索引分开存放)。
日志模块
如同餐厅的监控和账本:
- binlog(归档日志):收银机流水,记录所有订单(数据变更),用于回放。
- redo log(重做日志):厨师手写便签,记录未上菜的急单(崩溃恢复)。
- undo log(回滚日志):顾客退菜记录,用于撤销操作。
四、SQL 四大分类 + CRUD
1.SQL 语句根据功能分为四类,覆盖数据库所有操作:
DDL(数据定义语言)
作用:定义 / 修改 / 删除 数据库、数据表结构。常用指令:CREATE(创建)、ALTER(修改)、DROP(删除)。
CREATE 用于创建数据库或表结构
模板:
CREATE TABLE 表名 (列名1 数据类型1, 列名2 数据类型2,...);
示例:创建学生表CREATE TABLE student (id INT PRIMARY KEY, name VARCHAR(50), age INT);
ALTER 用于修改表结构
模板:
ALTER TABLE 表名 ADD/MODIFY/DROP COLUMN 列名 数据类型;
示例:给学生表添加性别字段ALTER TABLE student ADD COLUMN gender CHAR(1);
DROP 用于删除数据库或表
模板:
DROP TABLE 表名;
示例:删除学生表DROP TABLE student;
DML(数据操纵语言)
作用:对表里面的数据进行增、删、改。常用指令:INSERT、UPDATE、DELETE。
INSERT 用于插入数据
模板:
给指定字段添加数据
INSERT INTO 表名 (列1,列2,...) VALUES (值1,值2,...);
给全部字段添加数据
INSERT INTO 表名 VALUES (值1,值2,...);
批量添加数据
INSERT INTO 表名 (字段名1,字段名2,...) VALUES (值1,值2,...),(值1,值2,...),...,(值1,值2,...);
INSERT INTO 表名 VALUES (值1,值2,...),(值1,值2,...),...,(值1,值2,...);
插入数据时,指定的字段顺序需要与值的顺序是一一对应的
字符串和日期型数据应该包含在单引号中
插入的数据大小,应该在字段的规定范围内
示例:插入学生记录insert into student (id, name, age) values(1, '张三', 20);
UPDATE 用于更新数据
模板:
UPDATE 表名 SET 字段1=值1,字段2=值2,...[WHERE 条件];
示例:修改学生年龄UPDATE student SET age=21 WHERE id=1;
DELETE 用于删除数据
模板:
DELETE FROM 表名 [WHERE 条件];
示例:删除特定学生DELETE FROM student WHERE id=1;
DQL(数据查询语言)
作用:查询数据表中的数据,是使用频率最高的语句。常用指令:SELECT。
执行顺序
SELECT 查询的列
FROM 表名
JOIN 关联表(多表查询)
ON 关联条件 WHERE 过滤行(条件筛选)
GROUP BY 分组
HAVING 分组后过滤
ORDER BY 排序
LIMIT 分页;
模板
1.最基础查询:查全部 / 查指定列
-- 查询所有列(开发不推荐,效率低)
SELECT * FROM 表名;
-- 查询指定列(推荐)
SELECT id, name, age FROM 表名;
2.别名(给列 / 表起小名)
-- 列别名
SELECT name AS 姓名, age AS 年龄 FROM user;
-- 表别名(多表用)
SELECT u.name FROM user u;
3. 去重 DISTINCT
-- 查询不重复的年龄
SELECT DISTINCT age FROM user;
4.条件查询
用于过滤数据,只返回符合条件的行
常用运算符
= 等于
!= <> 不等于
> < >= <=
BETWEEN ... AND ... 在区间
IN(...) 在列表中
LIKE 模糊查询
IS NULL 为空
AND / OR / NOT 逻辑运算
例子:
-- 年龄等于18
SELECT * FROM user WHERE age=18;
-- 年龄在 18~30 之间
SELECT * FROM user WHERE age BETWEEN 18 AND 30;
-- 名字包含“张”
SELECT * FROM user WHERE name LIKE '%张%';
-- 多个条件
SELECT * FROM user WHERE age>18 AND sex='男';
5.排序 ORDER BY
对结果升序 / 降序排列
ASC 升序(默认)
DESC 降序
例子:
-- 按年龄从小到大
SELECT * FROM user ORDER BY age ASC;
-- 按年龄从大到小
SELECT * FROM user ORDER BY age DESC;
-- 多列排序
SELECT * FROM user ORDER BY age DESC, id ASC;
6.分页 LIMIT
用于只取前 N 条,或分页查询(前端页面必备)
-- 取前 10 条
SELECT * FROM user LIMIT 10;
-- 分页:从第0条开始,取10条
SELECT * FROM user LIMIT 0,10;
-- 第2页
SELECT * FROM user LIMIT 10,10;
公式:LIMIT (页码-1)*每页条数, 每页条数
7.聚合函数
DQL 强大之处:可以直接做统计、计算
常用聚合函数:
COUNT() 统计数量
SUM() 求和
AVG() 平均值
MAX() 最大值
MIN() 最小值
-- 总人数
SELECT COUNT(*) FROM user;
-- 平均年龄
SELECT AVG(age) FROM user;
-- 最大年龄
SELECT MAX(age) FROM user;
8.分组查询 GROUP BY + HAVING
按某个字段分组统计,比如:
每个班级多少人
每个性别多少人
每个部门工资总和
语法:
SELECT 分组字段, 聚合函数
FROM 表
GROUP BY 分组字段
HAVING 分组后条件;
例子:
-- 按性别分组,统计每组人数
SELECT sex, COUNT(*) FROM user GROUP BY sex;
WHERE和HAVING的区别
执行时机不同:WHERE是分组之前进行过滤,不满足WHERE条件,不参与分组;而HAVING是分组之后对结果进行过滤
判断条件不同:WHERE不能对聚合函数进行判断,而HAVING可以
执行顺序: where > 聚合函数 > having
9.多表查询
1. 内连接 inner join
只返回两张表都匹配的数据
SELECT *
FROM user
JOIN order ON user.id = order.user_id;
2. 左连接 LEFT JOIN
以左表为主,返回左表所有数据 + 右表匹配数据
SELECT *
FROM user
LEFT JOIN order ON user.id = order.user_id;
3. 右连接 RIGHT JOIN 以右表为主
4. 子查询(嵌套查询) 在查询里再套查询
SELECT * FROM user
WHERE id IN (SELECT user_id FROM order);
DCL(数据控制语言)
作用:管理账号权限、授权、撤销权限,一般由管理员使用。常用指令:GRANT(授权)、REVOKE(撤销权限)。
GRANT 用于授权
模板:GRANT 权限 ON 数据库.表 TO 用户名@主机;
示例:授予查询权限GRANT SELECT ON school.student TO admin@localhost;
REVOKE 用于撤销权限
模板:REVOKE 权限 ON 数据库.表 FROM 用户名@主机;
示例:撤销更新权限REVOKE UPDATE ON school.student FROM admin@localhost;
2. CRUD(核心操作统称)
就是日常对数据最基础的四个动作,和上面的 DML、DQL 对应:
C (Create) 新增 → INSERT
R (Read) 查询 → SELECT
U (Update) 修改 → UPDATE
D (Delete) 删除 → DELETE
五、数据类型
mysql中的数据类型可以分为整数类型、浮点数类型、定点数、布尔型、字符串、时间日期类型、列表和字典类型。以下是常用的小写数值类型及其说明:
整数类型
- tinyint:占用1字节,范围从-128到127(有符号)或0到255(无符号)。
- smallint:占用2字节,范围从-32768到32767(有符号)或0到65535(无符号)。
- mediumint:占用3字节,范围从-8388608到8388607(有符号)或0到16777215(无符号)。
- int:占用4字节,范围从-2147483648到2147483647(有符号)或0到4294967295(无符号)。
- bigint:占用8字节,范围从-9223372036854775808到9223372036854775807(有符号)或0到18446744073709551615(无符号)。
浮点数类型
- float:单精度浮点数,占用4字节,精度约为7位小数。
- double:双精度浮点数,占用8字节,精度约为15位小数。
定点数类型
- decimal(m,d):精确的定点数,m表示总位数,d表示小数位数。例如,decimal(10,2)可以存储最多10位数字,其中2位是小数。
注意事项:
- 整数类型可以指定是否有符号,默认是有符号的。如果需要无符号,可以使用
unsigned关键字。 - 浮点数类型和定点数类型适用于需要存储小数的场景,但定点数类型更精确,适合财务计算。
- 选择数值类型时,应根据实际需求选择最小够用的类型,以节省存储空间。
字符型
char (n):固定长度字符串,最多 255 个字符
varchar (n):可变长度字符串,最多 65,535 个字符
tinyblob:不超过 255 个字符的二进制数据
tinytext:短文本字符串,最多 255 个字符
blob:二进制形式的长文本数据,最多 65,535 个字符
text:长文本数据,最多 65,535 个字符
mediumblob:二进制形式的中等长度文本数据,最多 16,777,215 个字符
mediumtext:中等长度文本数据,最多 16,777,215 个字符
longblob:二进制形式的极大文本数据,最多 4,294,967,295 个字符
longtext:极大文本数据,最多 4,294,967,295 个字符
时间日期类型
date:日期值,3 字节,格式为 yyyy-mm-dd,范围是 1000-01-01 至 9999-12-31
time:时间值或持续时间,3 字节,格式为 hh:mm:ss,范围是 - 838:59:59 至 838:59:59
year:年份值,1 字节,格式为 yyyy,范围是 1901 至 2155
datetime:混合日期和时间值,8 字节,格式为 yyyy-mm-dd hh:mm:ss,范围是 1000-01-01 00:00:00 至 9999-12-31 23:59:59
timestamp:混合日期和时间值,时间戳,4 字节,格式为 yyyy-mm-dd hh:mm:ss,范围是 1970-01-01 00:00:01 至 2038-01-19 03:14:07
布尔类型
boolean 或 bool:底层会自动转换成 tinyint (1),赋值时可以用 false 和 true,也可以使用 0 和 1
枚举类型
enum:示例 enum ('value1', 'value2', ..., 'valuen') 只能存字符串,列的值只能是预定义列表中的一个 如果没有指定默认值,那么可以取空值 null,指定默认值后会默认取默认值,如果未指定默认值且不能为空,会默认取第一个值 索引会按照列表顺序从 1 开始,空字符串 '' 的索引为 0(如果允许空值)
更多推荐

所有评论(0)