【数据库基础|第3篇】SQL 增删改查基础语法

前言

前面两篇我们已经学习了数据库的基础概念和 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;

它也可以清空表数据。

但是 deletetruncate 不一样。

操作 说明
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;

genderid 是数字类型,可以不加引号。

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 增删改查时,建议养成下面几个习惯:

  1. 查询时尽量写具体字段,不要长期依赖 select *
  2. 新增数据时字段和值要一一对应
  3. 修改和删除时一定注意 where 条件
  4. 主键 id 一般由数据库自动生成
  5. 创建时间和更新时间可以用 now() 或在 Java 中设置
  6. SQL 字符串使用单引号
  7. 表名和字段名要和数据库保持一致
  8. 在项目中 SQL 一般放在 Mapper 层,不要写在 Controller 层

十二、总结

这一篇主要学习了 SQL 中最基础的增删改查语法。

新增数据使用 insert,查询数据使用 select,修改数据使用 update,删除数据使用 delete

在写 insert 时,要注意字段和值一一对应;在写 select 时,建议明确查询字段;在写 updatedelete 时,最重要的是不要忘记 where 条件。

这些 SQL 看起来基础,但它们是后面学习条件查询、分页查询、多表查询、动态 SQL 的基础。尤其是在 Spring Boot + MyBatis 项目中,Controller、Service、Mapper 最终都会落到这些 SQL 操作上。

下一篇我们继续学习条件查询,也就是 whereorder bylimit 的使用。