前言
前面两篇我们已经学习了数据库的基础概念和 MySQL 常用数据类型。
现在数据库、表、字段、主键、数据类型这些基础已经有了,接下来就要真正开始操作数据了。
在数据库中,最基础也是最常用的操作就是:
- 新增数据
- 查询数据
- 修改数据
- 删除数据
也就是我们经常说的 增删改查,英文简称 CRUD。
text
Create:新增
Read:查询
Update:修改
Delete:删除
这一篇我们就来学习 SQL 中最基础的增删改查语法。
一、准备一张员工表
为了方便演示,我们先准备一张员工表 emp。
sql
create table emp (
id int unsigned primary key auto_increment comment '员工ID',
username varchar(20) not null unique comment '用户名',
name varchar(10) not null comment '姓名',
gender tinyint unsigned comment '性别:1男,2女',
phone varchar(11) comment '手机号',
salary decimal(10, 2) comment '工资',
entry_date date comment '入职日期',
create_time datetime comment '创建时间',
update_time datetime comment '修改时间'
) comment '员工表';
这张表中包含了员工的基本信息。
| 字段 | 含义 |
|---|---|
id |
员工ID,主键,自增 |
username |
用户名,不能重复 |
name |
姓名 |
gender |
性别 |
phone |
手机号 |
salary |
工资 |
entry_date |
入职日期 |
create_time |
创建时间 |
update_time |
修改时间 |
后面的 SQL 都围绕这张表来写。
二、新增数据:insert
新增数据使用 insert 语句。
1. 指定字段新增
sql
insert into emp(username, name, gender, phone, salary, entry_date, create_time, update_time)
values('zhangsan', '张三', 1, '13800000000', 8000.00, '2024-03-01', now(), now());
文字说明
这条 SQL 的意思是:向 emp 表中新增一条员工数据。
sql
insert into emp(...)
表示要往 emp 表中插入数据。
sql
values(...)
表示具体插入的字段值。
这里没有写 id,因为 id 是自增主键:
sql
id int unsigned primary key auto_increment
数据库会自动生成 id,不需要我们手动传。
2. 新增多条数据
如果要一次插入多条数据,可以这样写:
sql
insert into emp(username, name, gender, phone, salary, entry_date, create_time, update_time)
values
('lisi', '李四', 1, '13900000000', 9000.00, '2024-04-01', now(), now()),
('wangwu', '王五', 2, '13700000000', 7500.00, '2024-05-01', now(), now()),
('zhaoliu', '赵六', 1, '13600000000', 10000.00, '2024-06-01', now(), now());
这样可以一次性新增多条员工记录。
在项目中,如果是批量导入数据,就经常会用到这种批量插入思想。
三、查询数据:select
查询数据使用 select 语句。
1. 查询所有字段
sql
select * from emp;
这条 SQL 表示查询 emp 表中的所有数据,并返回所有字段。
不过在实际项目中,不太推荐长期使用 select *。
原因是:
- 字段多时查询结果不够清晰
- 可能查出不需要的字段
- 表结构变化时影响不容易控制
- 在项目代码中不利于维护
2. 查询指定字段
更推荐写成:
sql
select id, username, name, gender, phone
from emp;
这样可以明确告诉数据库:我只需要这些字段。
查询结果也更加清楚。
3. 根据 id 查询
sql
select id, username, name, gender, phone, salary
from emp
where id = 1;
这里使用了 where 条件,表示只查询 id = 1 的员工。
这个 SQL 在 Java 项目中非常常见。
对应 MyBatis 代码大概是:
java
@Select("select id, username, name, gender, phone, salary from emp where id = #{id}")
Emp getById(Integer id);
前端请求:
text
GET /emps/1
Controller 接收 id 后,Mapper 就可以根据 id 查询数据库。
四、修改数据:update
修改数据使用 update 语句。
1. 根据 id 修改员工姓名
sql
update emp
set name = '张三丰',
update_time = now()
where id = 1;
这条 SQL 表示把 id 为 1 的员工姓名修改为 张三丰。
文字说明
sql
update emp
表示要修改 emp 表。
sql
set name = '张三丰'
表示要修改的字段和值。
sql
where id = 1
表示只修改 id 为 1 的这条记录。
这里一定要注意:update 语句通常必须带 where 条件。
如果不写 where:
sql
update emp
set name = '张三丰';
这会把整张表中所有员工的姓名都改成 张三丰。
这是非常危险的操作。
2. 一次修改多个字段
sql
update emp
set name = '李四',
phone = '13911112222',
salary = 9500.00,
update_time = now()
where id = 2;
这条 SQL 同时修改姓名、手机号、工资和更新时间。
在项目中,编辑员工信息时就会用到类似 SQL。
五、删除数据:delete
删除数据使用 delete 语句。
1. 根据 id 删除
sql
delete from emp
where id = 3;
这条 SQL 表示删除 id 为 3 的员工。
文字说明
sql
delete from emp
表示从 emp 表中删除数据。
sql
where id = 3
表示只删除 id 为 3 的这一条记录。
和 update 一样,delete 也必须特别注意 where 条件。
如果写成:
sql
delete from emp;
就会删除整张表中的所有数据。
所以初学阶段一定要养成习惯:写 delete 和 update 时,先写 where,再写具体操作。
六、删除和清空表的区别
有时候我们还会看到:
sql
truncate table emp;
它也可以清空表数据。
但是 delete 和 truncate 不一样。
| 操作 | 说明 |
|---|---|
delete from emp where id = 1 |
删除符合条件的数据 |
delete from emp |
删除表中所有数据 |
truncate table emp |
清空整张表,通常会重置自增 id |
学习阶段更常用的是 delete。
如果只是删除某一条数据,一定使用:
sql
delete from emp where id = ?;
不要随便使用 truncate。
七、SQL 中字符串、数字、日期怎么写?
1. 字符串要加单引号
sql
insert into emp(username, name)
values('zhangsan', '张三');
zhangsan 和 张三 都是字符串,所以要加单引号。
2. 数字不用加引号
sql
update emp
set gender = 1
where id = 1;
gender 和 id 是数字类型,可以不加引号。
3. 日期也要加引号
sql
update emp
set entry_date = '2024-03-01'
where id = 1;
日期值一般也要加单引号。
4. 当前时间可以用 now()
sql
update emp
set update_time = now()
where id = 1;
now() 是 MySQL 中的函数,表示当前日期和时间。
八、增删改查和 Java 项目的关系
在 Spring Boot + MyBatis 项目中,SQL 增删改查一般会写在 Mapper 层。
1. 新增员工
java
@Insert("insert into emp(username, name, gender, phone, salary, entry_date, create_time, update_time) " +
"values(#{username}, #{name}, #{gender}, #{phone}, #{salary}, #{entryDate}, #{createTime}, #{updateTime})")
void insert(Emp emp);
这里的 #{username} 会从 Emp 对象中取出 username 属性。
2. 根据 id 查询员工
java
@Select("select id, username, name, gender, phone, salary, entry_date from emp where id = #{id}")
Emp getById(Integer id);
这里的 #{id} 会接收方法参数中的 id。
3. 修改员工
java
@Update("update emp set name = #{name}, phone = #{phone}, salary = #{salary}, update_time = #{updateTime} where id = #{id}")
void update(Emp emp);
修改时一般会根据主键 id 定位到具体数据。
4. 删除员工
java
@Delete("delete from emp where id = #{id}")
void deleteById(Integer id);
删除时通常也是根据 id 删除。
九、CRUD 对应的接口设计
在后端项目中,增删改查通常会设计成 RESTful 风格接口。
| 功能 | 请求方式 | 请求路径 | SQL |
|---|---|---|---|
| 新增员工 | POST | /emps |
insert |
| 查询员工 | GET | /emps/{id} |
select |
| 修改员工 | PUT | /emps |
update |
| 删除员工 | DELETE | /emps/{id} |
delete |
比如新增员工:
java
@PostMapping
public Result save(@RequestBody Emp emp) {
empService.save(emp);
return Result.success();
}
根据 id 查询:
java
@GetMapping("/{id}")
public Result getById(@PathVariable Integer id) {
Emp emp = empService.getById(id);
return Result.success(emp);
}
删除员工:
java
@DeleteMapping("/{id}")
public Result delete(@PathVariable Integer id) {
empService.deleteById(id);
return Result.success();
}
可以看到,数据库中的 CRUD 和后端接口开发是直接对应的。
十、常见错误总结
1. 字符串忘记加引号
错误写法:
sql
insert into emp(username, name)
values(zhangsan, 张三);
正确写法:
sql
insert into emp(username, name)
values('zhangsan', '张三');
字符串必须加单引号。
2. update 忘记写 where
危险写法:
sql
update emp
set salary = 10000;
这会修改所有员工的工资。
正确写法:
sql
update emp
set salary = 10000
where id = 1;
3. delete 忘记写 where
危险写法:
sql
delete from emp;
这会删除整张表的数据。
正确写法:
sql
delete from emp
where id = 1;
4. 字段名写错
比如表中字段叫:
sql
entry_date
但是 SQL 写成:
sql
entryDate
就会报错。
数据库字段一般使用下划线命名,Java 属性一般使用驼峰命名。
比如:
| 数据库字段 | Java 属性 |
|---|---|
entry_date |
entryDate |
create_time |
createTime |
update_time |
updateTime |
MyBatis 可以帮助我们做字段和属性的映射,但 SQL 中字段名还是要写数据库里的真实字段。
十一、实际开发建议
写 SQL 增删改查时,建议养成下面几个习惯:
- 查询时尽量写具体字段,不要长期依赖
select * - 新增数据时字段和值要一一对应
- 修改和删除时一定注意
where条件 - 主键 id 一般由数据库自动生成
- 创建时间和更新时间可以用
now()或在 Java 中设置 - SQL 字符串使用单引号
- 表名和字段名要和数据库保持一致
- 在项目中 SQL 一般放在 Mapper 层,不要写在 Controller 层
十二、总结
这一篇主要学习了 SQL 中最基础的增删改查语法。
新增数据使用 insert,查询数据使用 select,修改数据使用 update,删除数据使用 delete。
在写 insert 时,要注意字段和值一一对应;在写 select 时,建议明确查询字段;在写 update 和 delete 时,最重要的是不要忘记 where 条件。
这些 SQL 看起来基础,但它们是后面学习条件查询、分页查询、多表查询、动态 SQL 的基础。尤其是在 Spring Boot + MyBatis 项目中,Controller、Service、Mapper 最终都会落到这些 SQL 操作上。
下一篇我们继续学习条件查询,也就是 where、order by、limit 的使用。