Mysql(2)DML

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


DML(数据操控语言)

添加

只写表名

值列表需与表结构对应。

insert into 表名 values(值列表),(值列表),(值列表); -- 值列表中的值的顺序、类型、个数必须与表结构一一对应

写表名和字段列表

值列表需与字段列表对应。

insert into 表名(字段列表) values(值列表),(值列表),(值列表); -- 值列表中的值的顺序、类型、个数必须与字段列表一一对应

示例

python 复制代码
create database if not exists atguigu;

use atguigu;

drop table if exists teacher;

create table teacher(
  id int,
  name varchar(20),
  gender enum('男','女'),
  birthday date,
  salary double,
  tel varchar(11)  
);


# 插入一条数据
insert into teacher values(1,'张三','男','1999-01-01',1000,'123456');

insert into teacher(id,name,gender) VALUES(2,'李四','男');

#insert into teacher(id=3,name='王五',gender='不男不女') # 这样写是不行的

SELECT * from teacher

# 插入多条数据
insert into teacher values
(3,'王五','男','1990-01-01',10000,'12345678901'),
(4,'赵六','男','1990-01-01',10000,'12345678901'),
(5,'孙七','男','1990-01-01',10000,'12345678901');

insert into teacher(id,name) VALUES
(6,'周八'),
(7,'吴九'),
(8,'郑十');
select* from teacher;

删除

删除多条数据

delete from 表名 where 条件;

删除表中所有数据

表结构会保留下来。

delete from 表名;

截断表

表结构会保留下来。

truncate 表名;

truncate表和delete表的区别:

delete是一条一条删除记录的。如果在事务中,事务提交之前支持回滚

truncate是把整个表drop,新建一张,效率更高。就算在事务中,也无法回滚

示例

python 复制代码
-- 删除姓名为郑十的记录
delete from teacher where name="郑十"; 
select * from teacher;
-- 删除所有记录
delete from teacher;
-- 截断表
truncate teacher;

修改

修改部分行数据

update 表名 set 字段名 = 值, 字段名 = 值 where 条件; -- 修改满足条件的行

修改所有行数据

update 表名 set 字段名 = 值, 字段名 = 值; -- 修改所有行

示例

python 复制代码
-- 修改周八的信息
update teacher set gender="男",birthday="1960-01-01",salary=100000,tel="12332132131" where name="周八";
-- 修改所有人的薪资
update teacher set salary=salary+10000;#所有有值的都增加,若是没值则不增加

查询

select 语句

select语句是用于查看计算结果,或者查看从数据表中筛选出的数据的

select语句的基本语法;

python 复制代码
select 常量
select 表达式
select 函数

例如:

select 1;

select 9/2;

select now();

如果想要从数据表中筛选数据,需要加from子句,from指定数据来源,字段列表筛选列

select 字段列表 from 表名;

如果要从数据表中根据条件筛选数据,需要加from和where子句。where筛选行。

select 字段列表 from 表名 where 条件;

使用别名

在当前select语句中给某个字段或表达式计算结果,或表等取个临时名称,便于当前select语句的编写和理解。这个临时名称称为别名。

select 字段名1 as "别名1", 字段名2 as "别名2" from 表名 as 表别名;

列的别名有空格时需要加双引号。列的别名中没有空格时双引号可以不加

表的别名不能加双引号,表的别名中间不能包含空格

as大小写都可以,as也完全可以省略

例如:

select id as 编号,name "姓 名" from teacher;

结果去重

mysql可以在查询结果中使用distinct关键字去重。

select distinct 字段列表 from 表名;

《DML(数据操纵语言)学习笔记》最终总结版


一、DML 概述

DML(Data Manipulation Language)即数据操纵语言 ,用于对数据库表中的数据进行增、删、改、查操作。

DML 包含四大核心操作:

操作 关键字 作用
增加 INSERT 向表中插入数据
修改 UPDATE 修改表中已有数据
删除 DELETE / TRUNCATE 删除表中数据
查询 SELECT 查询表中数据(最常用、最复杂)

二、INSERT(插入数据)

1. 两种常用写法

写法① 只写表名(不推荐新手使用)

sql 复制代码
INSERT INTO 表名 VALUES (值列表1), (值列表2), ...;

值列表的顺序、个数、类型必须与表结构完全一致

写法② 推荐写法(指定字段)

sql 复制代码
INSERT INTO 表名(字段列表) VALUES (值列表1), (值列表2), ...;

值列表只需与前面写的字段列表一一对应,未指定的字段会使用默认值或 NULL。

2. 示例
sql 复制代码
-- 推荐写法:指定字段插入
INSERT INTO teacher(id, name, gender, birthday, salary)
VALUES (1, '张三', '男', '1999-01-01', 12000.00);

-- 插入多条数据
INSERT INTO teacher(id, name) VALUES
(2, '李四'),
(3, '王五'),
(4, '赵六');

三、UPDATE(修改数据)

语法
sql 复制代码
UPDATE 表名 
SET 字段1 = 值1, 
    字段2 = 值2 
WHERE 条件;
示例
sql 复制代码
-- 修改特定记录
UPDATE teacher 
SET gender = '男',
    salary = 88888.88,
    birthday = '1995-06-15'
WHERE id = 3;

-- 修改所有记录(危险!慎用)
UPDATE teacher SET salary = salary * 1.2;

四、DELETE(删除数据)

两种删除方式
sql 复制代码
-- 方式1:DELETE(可回滚,逐行删除)
DELETE FROM 表名 WHERE 条件;

-- 方式2:TRUNCATE(效率高,不可回滚,相当于先DROP再CREATE)
TRUNCATE TABLE 表名;
区别对比(重点)
对比项 DELETE TRUNCATE
是否可回滚 可以(事务中) 不可以
删除方式 一行一行删除 先删除表,再重建表
执行速度 较慢 较快
是否保留自增计数 保留(自增会继续累加) 重置(自增从 1 开始)
是否保留表结构 保留 保留

推荐 :开发环境中尽量使用 DELETE + WHERE 条件,生产环境删除大量数据时才考虑 TRUNCATE


五、SELECT(查询数据)

基础语法
sql 复制代码
-- 查询常量、表达式、函数
SELECT 1;
SELECT 9*2;
SELECT NOW();

-- 从表中查询
SELECT 字段列表 FROM 表名;

-- 带条件查询
SELECT 字段列表 FROM 表名 WHERE 条件;
常用进阶写法
  • 别名(AS):提高可读性

    sql 复制代码
    SELECT 
        id AS 编号,
        name AS '姓名',
        salary AS '月薪'
    FROM teacher;
  • 去重(DISTINCT)

    sql 复制代码
    SELECT DISTINCT gender FROM teacher;

六、高频易错点总结(重点)

以下是这篇笔记中最容易出错的地方,按严重程度排序:

  1. UPDATE 忘记写 SET(最常见 1064 错误)

    • 错误:update teacher id=3,name='王五'...
    • 正确:必须写 UPDATE teacher SET ...
  2. INSERT 时字段与值不对应

    • 字段列表和值列表的顺序、个数、数据类型必须严格一致,否则报错或插入失败。
  3. ENUM 类型插入非法值

    • gender enum('男','女'),却插入 '不男不女',会插入失败或变成 ''(空字符串)。
  4. DELETE/TRUNCATE 不加 WHERE 条件

    • 误删整张表数据,属于高危操作。永远要先用 SELECT 验证 WHERE 条件再删除
  5. 使用 DOUBLE 类型存薪资

    • 虽然能运行,但有精度误差。强烈建议使用 DECIMAL(10,2)
  6. 别名使用不当

    • 别名中有空格必须加双引号:"姓 名"
    • 表别名不能加引号,也不能有空格。
  7. TRUNCATE 与 DELETE 混淆

    • 很多人在事务中使用 TRUNCATE,以为可以回滚,实际上无法回滚。
  8. 字符集与 ENUM 中文问题

    • 如果字符集不是 utf8mb4,ENUM 中的中文可能出现乱码。
  9. SELECT * 的滥用

    • 实际开发中不推荐总是 SELECT *,应明确写出需要的字段。

相关推荐
菜程序2 小时前
2026年MySQL安装教程(超详细)
数据库·mysql
Milu_Jingyu2 小时前
sqlite3_prepare_v2 与 sqlite3_exec 在 SQLite 中的核心区别
java·数据库·sqlite
神の愛2 小时前
针对“单个功能操作数据库”要不要加 @Transactional,
数据库
前端初见2 小时前
Android零基础入门
android
꯭爿꯭巎꯭2 小时前
比特彗星app安卓版 比特彗星安卓手机版
android·智能手机
summerkissyou19872 小时前
Android-Mediasession-播放状态监控
android·mediasession
fly spider2 小时前
MySQL执行流程详解
数据库·mysql
计算机学姐2 小时前
基于SpringBoot的充电桩预约管理系统【阶梯电费+个性化推荐+数据可视化】
java·vue.js·spring boot·后端·mysql·信息可视化·mybatis
Jermy Li2 小时前
HugeGraph 正式晋升 Apache 顶级项目:重塑「图 + AI」底座
数据库·人工智能·apache·知识图谱·database·hugegraph·knowledge graph