欢迎光临
我们一直在努力

【2026】MySQL 从入门到精通:DDL/DML/DQL 核心语法 + 实战案例全解析(附带综合练习)

前言

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 操作

需求:

  • 创建一张student学生表,包含字段:id(主键自增)、stu_no(学号,唯一非空)、stu_name(姓名,非空)、stu_age(年龄)、stu_gender(性别,默认 ' 男')、class_name(班级名称)、create_time(创建时间),并添加表注释 “学生信息表”;
  • 向student表插入 3 条数据:
    • 学号 2024001,姓名 “张三”,年龄 18,性别 “男”,班级 “高三 1 班”,创建时间为当前时间;
    • 学号 2024002,姓名 “李四”,年龄 17,性别 “女”,班级 “高三 2 班”,创建时间为当前时间;
    • 学号 2024003,姓名 “王五”,年龄 18,性别 “男”,班级 “高三 1 班”,创建时间为当前时间;
  • 将 “高三 2 班” 的所有学生年龄加 1;
  • 删除年龄大于 20 的学生(若有)。
  • 答案:

    — 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 班” 所有性别为男的学生,显示姓名、学号、年龄,按年龄降序排序;
  • 查询所有班级中年龄在 17~19 岁之间的学生,显示姓名、班级、年龄,去重后按年龄升序排序,查询第 2 页数据(每页 1 条)。
  • 答案:

    — 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表,完成以下统计:

  • 按班级分组,统计每个班级的学生总数、平均年龄、最大年龄、最小年龄;
  • 按性别分组,筛选出平均年龄≥18 岁的性别分组,显示性别、平均年龄、学生总数。
  • 答案:

    — 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员工表,完成以下查询:

  • 查询 2010 年及以后入职、职位是讲师(2)或教研主管(4)、薪资大于 5000 的员工,显示姓名、职位(用中文显示:讲师 / 教研主管)、薪资、入职日期,按薪资降序排序;
  • 统计每个职位的薪资总额,筛选出薪资总额大于 10000 的职位,按薪资总额升序排序。
  • 答案:

    — 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 核心语法,从表结构设计到数据操作,再到复杂查询,结合实战案例覆盖了开发中高频使用的场景。核心要点:

  • DDL 关注表结构,CREATE/MODIFY/DROP 是核心;
  • DML 操作数据,UPDATE/DELETE 务必加 WHERE 条件;
  • DQL 是重点,条件、分组、排序、分页组合使用能满足绝大多数查询需求;
  • 聚合函数不统计 NULL 值,分组后 SELECT 字段有限制。
  • 建议结合实际业务场景多练多写,比如设计电商表、订单表,并用 DQL 实现多条件查询、统计分析,才能真正掌握 MySQL。

    赞(0)
    未经允许不得转载:171主机测评 » 【2026】MySQL 从入门到精通:DDL/DML/DQL 核心语法 + 实战案例全解析(附带综合练习)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址