前言
MySQL 是目前最流行的关系型数据库之一,掌握其核心操作语法是后端开发的必备技能。本文将从数据库表的创建、修改、删除(DDL),到数据的增删改(DML),再到复杂的数据查询(DQL),全方位拆解 MySQL 核心语法,结合实战案例让你快速掌握。
一、DDL:数据库定义语言(库 / 表的创建、修改、删除)
DDL 主要用于管理数据库和数据表的结构,核心操作包括库的创建、表的设计、结构修改等。
1.1 数据库表创建(CREATE)
基础语法
CREATE TABLE 表名(
字段名 数据类型 [约束条件] [COMMENT '字段注释'],
字段名 数据类型 [约束条件] [COMMENT '字段注释'],
…
) COMMENT '表注释';
实战案例 1:用户信息表
— 创建用户信息表(含主键、非空、唯一、默认约束)
CREATE TABLE USER(
id int PRIMARY KEY auto_increment COMMENT 'ID 唯一标识', — 主键约束+自增
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',– 非空+唯一约束
name varchar(10) NOT NULL COMMENT '姓名',– 非空约束
age int COMMENT '年龄',
gender char(1) DEFAULT '男' COMMENT '性别' — 默认约束
) COMMENT '用户信息表';
实战案例 2:员工表设计
— 员工表(含无符号、多字段约束、日期类型)
create table emp (
id int unsigned primary key auto_increment comment 'ID,主键',
username varchar(20) not null unique comment '用户名',
password varchar(32) default '123456' comment '密码',
name varchar(10) not null comment '姓名',
gender tinyint unsigned not null comment '性别,1 男;2 女',
phone char(11) not null unique comment '手机号',
job tinyint unsigned comment '职位,1 班主任;2 讲师;3 学工主管;4 教研主管;5 咨询师',
salary int unsigned comment '薪资',
entry_date date comment '入职日期',
image varchar(255) comment '图像',
create_time datetime comment '创建时间',
update_time datetime comment '修改时间'
) comment '员工表';
1.2 数据库表结构操作(查询 / 修改 / 删除)
1.2.1 表结构查询
— 查询指定数据库中所有表
SHOW TABLES;
— 查询指定表的结构
DESC 表名; — 简写
DESCRIBE 表名; — 完整写法
SHOW COLUMNS FROM 表名; — 另一种写法
1.2.2 表结构修改
— 添加字段
ALTER TABLE 表名 ADD 字段名 数据类型 [约束] [COMMENT '注释'];
— 示例:给emp表添加email字段
ALTER TABLE emp ADD email varchar(50) NOT NULL UNIQUE COMMENT '邮箱';
— 修改字段类型/约束
ALTER TABLE 表名 MODIFY 字段名 新数据类型 [新约束];
— 示例:修改emp表password字段长度为64
ALTER TABLE emp MODIFY password varchar(64) DEFAULT '123456' COMMENT '密码';
— 修改字段名
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 数据类型 [约束] [COMMENT '注释'];
— 示例:将emp表的job字段改为position
ALTER TABLE emp CHANGE job position tinyint unsigned COMMENT '职位';
— 删除字段
ALTER TABLE 表名 DROP 字段名;
— 示例:删除emp表的image字段
ALTER TABLE emp DROP image;
1.2.3 表删除
— 删除表(永久删除,谨慎操作)
DROP TABLE [IF EXISTS] 表名;
— 示例:删除user表(存在则删除)
DROP TABLE IF EXISTS USER;
二、DML:数据操作语言(数据的增 / 删 / 改)
DML 用于操作数据表中的数据,核心是 INSERT(新增)、UPDATE(更新)、DELETE(删除)。
2.1 数据插入(INSERT)
基础语法
— 插入指定字段
INSERT INTO 表名(字段1,字段2,…) VALUES (值1,值2,…);
— 插入所有字段(字段顺序需与表结构一致)
INSERT INTO 表名 VALUES (值1,值2,…);
— 批量插入
INSERT INTO 表名(字段1,字段2,…) VALUES
(值1,值2,…),
(值1,值2,…),
…;
实战案例
— 单条插入(指定字段)
insert into emp(username, password, name, gender, phone) values ('songjiang','12345678','宋江',1,'13300001111');
— 单条插入(所有字段)
insert into emp values(null, 'linchong','12345678','林冲',1,'13300001112',1,6000,'2020-01-01','1.jpg',now(),now());
— 批量插入
insert into emp(username, password, name, gender, phone) values
('ruanxiaoer','12345678','阮小二',1,'13300001114'),
('ruanxiaowu','12345678','阮小五',1,'13300001115');
2.2 数据更新(UPDATE)
基础语法
mysql
UPDATE 表名 SET 字段1=值1,字段2=值2,… [WHERE 条件];
注意:WHERE 条件不可省略,否则会更新表中所有数据!
实战案例
— 单条更新:修改ID为1的员工用户名和姓名
update emp set username = 'zhangsan' , name = '张三' where id = 1;
— 批量更新:修改所有员工的入职日期(谨慎使用)
update emp set entry_date = '2010-01-01';
2.3 数据删除(DELETE)
基础语法
DELETE FROM 表名 [WHERE 条件];
注意:无 WHERE 条件时会删除表中所有数据,且 DELETE 删除可回滚(TRUNCATE 不可回滚)。
实战案例
— 单条删除:删除ID为1的员工
delete from emp where id = 1;
— 批量删除:删除所有员工(谨慎使用)
delete from emp;
三、DQL:数据查询语言(数据的查询,核心重点)
DQL 是 MySQL 使用频率最高的语法,涵盖基本查询、条件查询、分组查询、排序查询、分页查询等,也是面试高频考点。
3.1 基本查询
核心语法
— 查询指定字段
SELECT 字段1,字段2,… FROM 表名;
— 查询所有字段(开发中不推荐,效率低)
SELECT * FROM 表名;
— 字段别名
SELECT 字段1 [AS] 别名1,字段2 [AS] 别名2 FROM 表名;
— 去重查询
SELECT DISTINCT 字段 FROM 表名;
实战案例
— 1. 查询指定字段
select name,entry_date from emp;
— 2. 查询所有字段(推荐显式指定字段)
select id, username, password, name, gender, phone, job, salary, entry_date, create_time, update_time from emp;
— 3. 字段起别名
select name as 姓名,entry_date as 入职日期 from emp;
— 简写(省略AS)
select name 姓名,entry_date 入职日期 from emp;
— 4. 去重查询:查询所有不重复的职位
select distinct job from emp;
3.2 条件查询
核心语法
SELECT 字段 FROM 表名 WHERE 条件;
常用条件运算符:
- 比较运算:=、<>/!=、<、<=、>、>=
- 范围运算:BETWEEN … AND …、IN(值1,值2,…)
- 空值判断:IS NULL、IS NOT NULL
- 逻辑运算:AND、OR、NOT
- 模糊查询:LIKE(%匹配任意字符,_匹配单个字符)
实战案例
— 1. 等值查询:查询姓名为柴进的员工
select *from emp where name='柴进';
— 2. 范围查询:薪资小于等于5000的员工
select *from emp where salary <= 5000;
— 3. 空值查询:没有分配职位的员工
select * from emp where job is NULL;
— 4. 逻辑查询:2000-01-01至2010-01-01入职且性别为女的员工
select * from emp where (entry_date between '2000-01-01' and '2010-01-01') and gender=2;
— 5. 枚举查询:职位是讲师、学工主管、教研主管的员工
select * from emp where job in (2,3,4);
— 6. 模糊查询:姓名为两个字的员工
select * from emp where name like '__';
— 7. 模糊查询:姓“李”的员工
select * from emp where name like '李%';
3.3 分组查询
核心语法
SELECT 分组字段, 聚合函数 FROM 表名 [WHERE 条件] GROUP BY 分组字段 [HAVING 分组后条件];
常用聚合函数:
- COUNT():统计数量
- AVG():平均值
- MIN():最小值
- MAX():最大值
- SUM():求和
注意:WHERE 过滤分组前数据,HAVING 过滤分组后数据;分组后 SELECT 只能写分组字段和聚合函数。
实战案例
— 1. 统计企业员工总数
select count(*) from emp; — 推荐使用*,不统计NULL
— 2. 统计平均薪资、最低薪资、最高薪资、薪资总和
select avg(salary) 平均薪资, min(salary) 最低薪资, max(salary) 最高薪资, sum(salary) 薪资总和 from emp;
— 3. 按性别分组,统计男女员工数量
select gender,count(*) 人数 from emp group by gender;
— 4. 2015-01-01前入职的员工,按职位分组,筛选员工数≥2的职位
select job,count(*) from emp where entry_date <= '2015-01-01' group by job having count(*) >= 2;
3.4 排序查询
核心语法
SELECT 字段 FROM 表名 ORDER BY 排序字段1 [ASC/DESC], 排序字段2 [ASC/DESC];
ASC:升序(默认),DESC:降序;支持多字段排序,先按第一个字段排,相同则按第二个字段排。
实战案例
— 1. 按入职时间升序排序
select * from emp order by entry_date;
— 2. 按入职时间降序排序
select * from emp order by entry_date DESC;
— 3. 按入职时间升序,入职时间相同则按更新时间降序
select * from emp order by entry_date , update_time desc;
3.5 分页查询
核心语法
SELECT 字段 FROM 表名 LIMIT 起始索引, 每页条数;
起始索引 = (页码 – 1) * 每页条数;若起始索引为 0,可简写为LIMIT 每页条数。
实战案例
— 第1页:每页5条
select * from emp limit 0,5;
— 简写
select * from emp limit 5;
— 第2页:每页5条
select * from emp limit 5,5;
— 第3页:每页5条
select * from emp limit 10,5;
四、综合实战练习(附答案)
练习 1:基础 DDL+DML 操作
需求:
- 学号 2024001,姓名 “张三”,年龄 18,性别 “男”,班级 “高三 1 班”,创建时间为当前时间;
- 学号 2024002,姓名 “李四”,年龄 17,性别 “女”,班级 “高三 2 班”,创建时间为当前时间;
- 学号 2024003,姓名 “王五”,年龄 18,性别 “男”,班级 “高三 1 班”,创建时间为当前时间;
答案:
— 1. 创建学生表
CREATE TABLE student (
id int PRIMARY KEY auto_increment COMMENT '主键ID',
stu_no varchar(20) NOT NULL UNIQUE COMMENT '学号',
stu_name varchar(10) NOT NULL COMMENT '姓名',
stu_age int COMMENT '年龄',
stu_gender char(1) DEFAULT '男' COMMENT '性别',
class_name varchar(20) COMMENT '班级名称',
create_time datetime COMMENT '创建时间'
) COMMENT '学生信息表';
— 2. 插入3条数据
INSERT INTO student(stu_no, stu_name, stu_age, stu_gender, class_name, create_time)
VALUES
('2024001', '张三', 18, '男', '高三1班', NOW()),
('2024002', '李四', 17, '女', '高三2班', NOW()),
('2024003', '王五', 18, '男', '高三1班', NOW());
— 3. 高三2班学生年龄加1
UPDATE student SET stu_age = stu_age + 1 WHERE class_name = '高三2班';
— 4. 删除年龄大于20的学生
DELETE FROM student WHERE stu_age > 20;
练习 2:条件 + 排序 + 分页查询
需求:基于上述student表,完成以下查询:
答案:
— 1. 查询高三1班男性学生,按年龄降序
SELECT stu_name 姓名, stu_no 学号, stu_age 年龄
FROM student
WHERE class_name = '高三1班' AND stu_gender = '男'
ORDER BY stu_age DESC;
— 2. 查询17-19岁学生,去重、升序、分页(第2页,每页1条)
SELECT DISTINCT stu_name 姓名, class_name 班级, stu_age 年龄
FROM student
WHERE stu_age BETWEEN 17 AND 19
ORDER BY stu_age ASC
LIMIT 1,1;
练习 3:分组 + 聚合函数查询
需求:基于上述student表,完成以下统计:
答案:
— 1. 按班级统计学生数、平均年龄、最大/最小年龄
SELECT
class_name 班级,
COUNT(*) 学生总数,
AVG(stu_age) 平均年龄,
MAX(stu_age) 最大年龄,
MIN(stu_age) 最小年龄
FROM student
GROUP BY class_name;
— 2. 按性别分组,筛选平均年龄≥18的分组
SELECT
stu_gender 性别,
AVG(stu_age) 平均年龄,
COUNT(*) 学生总数
FROM student
GROUP BY stu_gender
HAVING AVG(stu_age) >= 18;
练习 4:复杂组合查询(emp 表)
需求:基于前文的emp员工表,完成以下查询:
答案:
— 1. 复杂条件查询+字段别名+排序
SELECT
name 姓名,
CASE job
WHEN 2 THEN '讲师'
WHEN 4 THEN '教研主管'
END 职位,
salary 薪资,
entry_date 入职日期
FROM emp
WHERE entry_date >= '2010-01-01'
AND job IN (2,4)
AND salary > 5000
ORDER BY salary DESC;
— 2. 分组统计+筛选+排序
SELECT
job 职位编码,
SUM(salary) 薪资总额
FROM emp
GROUP BY job
HAVING SUM(salary) > 10000
ORDER BY SUM(salary) ASC;
五、总结
本文系统梳理了 MySQL 的 DDL、DML、DQL 核心语法,从表结构设计到数据操作,再到复杂查询,结合实战案例覆盖了开发中高频使用的场景。核心要点:
建议结合实际业务场景多练多写,比如设计电商表、订单表,并用 DQL 实现多条件查询、统计分析,才能真正掌握 MySQL。





