【MySQL】MySQL 增删改查(CRUD)

画师:竹取工坊

大佬们好!我是Mem0rin!现在正在准备自学转码。

如果我的文章对你有帮助的话,欢迎关注我的主页Mem0rin,一起进步!


文章目录

    • [1. 新增:INSERT](#1. 新增:INSERT)
    • [2. 查询:SELECT](#2. 查询:SELECT)
      • [2.1 基本查询](#2.1 基本查询)
      • [2.2 去重与排序](#2.2 去重与排序)
      • [2.3 条件查询](#2.3 条件查询)
        • [2.3.1 比较运算符](#2.3.1 比较运算符)
        • [2.3.2 范围、集合、空值和模糊匹配运算符表](#2.3.2 范围、集合、空值和模糊匹配运算符表)
        • [2.3.3 逻辑运算符表](#2.3.3 逻辑运算符表)
      • [2.4 分页查询](#2.4 分页查询)
    • [3. 修改:UPDATE](#3. 修改:UPDATE)
    • [4. 删除:DELETE](#4. 删除:DELETE)
    • [5. 总结](#5. 总结)

本文使用 ChatGPT 进行二次整理。

数据库基本层级:

服务器 → 数据库 → 数据表 → 数据行(记录)→ 列(字段)

CRUD 分为新增、查询、修改和删除四类操作。


1. 新增:INSERT

sql 复制代码
-- 插入一行数据
INSERT INTO student (id, name)
VALUES (1, '张三');

-- 按字段顺序插入全部数据
INSERT INTO student
VALUES (2, '李四', 80, 85, 90);

-- 插入多行数据
INSERT INTO student (id, name)
VALUES
    (3, '赵六'),
    (4, '王五');

字符串使用英文单引号,字段和值要一一对应。批量插入通常比逐条插入效率更高。(网络通信、SQL执行、事务等)


2. 查询:SELECT

2.1 基本查询

sql 复制代码
-- 查询全部字段,数据量很多 => 磁盘和网络资源负担
SELECT *
FROM exam; 

-- 查询指定字段,减少不必要的网络开销
SELECT id, name, chinese
FROM exam;

-- 使用表达式和别名,不修改表内的数据
SELECT id, name, chinese + math + english AS total
FROM exam;

2.2 去重与排序

sql 复制代码
-- 去除重复值
SELECT DISTINCT chinese
FROM exam;

-- 按总分降序排列
SELECT id, name, chinese + math + english AS total
FROM exam
ORDER BY total DESC;

-- 按多个字段排序
SELECT id, name, chinese, math
FROM exam
ORDER BY math DESC, chinese ASC;

ASC 为升序,DESC 为降序,默认使用升序。

2.3 条件查询

2.3.1 比较运算符
运算符 含义 示例说明
= 等于 判断两个值是否相等
> 大于 左侧值大于右侧值
>= 大于等于 左侧值大于或等于右侧值
< 小于 左侧值小于右侧值
<= 小于等于 左侧值小于或等于右侧值
!= 或 <> 不等于 判断两个值是否不相等
<=> NULL 安全等于 两边均为 NULL 时结果为真
sql 复制代码
-- 查询英语成绩等于 80 的记录
SELECT *
FROM exam
WHERE english = 80;

-- 使用 NULL 安全等于运算符查询英语成绩为 NULL 的记录
SELECT *
FROM exam
WHERE english <=> NULL;
2.3.2 范围、集合、空值和模糊匹配运算符表
运算符 含义 示例说明
BETWEEN ... AND ... 判断是否位于闭区间内 包含左右边界
NOT BETWEEN ... AND ... 判断是否不在指定区间内 BETWEEN 的否定形式
IN (...) 判断值是否属于指定集合 相当于多个等值条件的组合
NOT IN (...) 判断值是否不属于指定集合 IN 的否定形式
IS NULL 判断是否为空值 不能使用等号代替
IS NOT NULL 判断是否为非空值 排除 NULL
LIKE 模糊匹配 百分号匹配任意长度字符,下划线匹配一个字符
NOT LIKE 模糊匹配的否定形式 查询不满足指定模式的内容
sql 复制代码
-- 查询语文成绩在 60 到 80 之间的记录,包含 60 和 80
SELECT *
FROM exam
WHERE chinese BETWEEN 60 AND 80;

-- 查询学号属于指定集合的记录
SELECT *
FROM exam
WHERE id IN (1, 2, 3);

-- 判断数值 1 是否位于集合中,结果为真
SELECT 1 IN (1, 2, 3);

-- 查询姓名第二个字符为"明"的记录
SELECT *
FROM exam
WHERE name LIKE '_明%';

LIKE 中的通配符:

通配符 含义
% 匹配零个或多个任意字符
_ 匹配一个任意字符
2.3.3 逻辑运算符表
运算符 含义 说明
AND 逻辑与 所有条件都成立时结果为真
OR 逻辑或 至少一个条件成立时结果为真
NOT 逻辑非 对条件结果取反
sql 复制代码
select * from exam where chinese > 80 and english > 80;
select * from exam where chinese > 80 or math > 70 and english > 80;

逻辑运算符优先级为 NOT > AND > OR

2.4 分页查询

sql 复制代码
-- 查询前 n 条记录
SELECT *
FROM exam
LIMIT n;

-- 跳过 s 条,再查询 n 条
SELECT *
FROM exam
LIMIT n OFFSET s;

-- 查询第 3 页,每页 10 条
SELECT *
FROM exam
ORDER BY id
LIMIT 10 OFFSET 20;

3. 修改:UPDATE

sql 复制代码
-- 修改指定学生的数学成绩
UPDATE exam
SET math = 100
WHERE name = '张三';

-- 将语文成绩低于 50 分的记录乘以 2
UPDATE exam
SET chinese = chinese * 2
WHERE chinese < 50;

-- 修改总分最低的三条记录
UPDATE exam
SET math = math + 30
WHERE chinese IS NOT NULL
  AND math IS NOT NULL
  AND english IS NOT NULL
ORDER BY chinese + math + english ASC
LIMIT 3;

没有 WHERE 时会修改整张表。


4. 删除:DELETE

sql 复制代码
-- 删除指定学生的记录
DELETE FROM exam
WHERE name = '张三';

-- 删除英语成绩最低的三条记录
DELETE FROM exam
WHERE english IS NOT NULL
ORDER BY english ASC
LIMIT 3;

没有 WHERE 时会删除表中全部记录。实际项目中也常使用逻辑删除:

sql 复制代码
-- 将记录标记为已删除
UPDATE exam
SET delete_state = 1
WHERE id = 1;

5. 总结

sql 复制代码
-- 1.新增
insert into table_name (列名, 列名...) values (值, 值);
-- 2.查询
select * from table_name; -- 全部查询
select column_name, column_name... from table_name; -- 指定列查询
select column_name/expr as 别名 -- 使用别名
	where column_name/expr 比较|逻辑运算符 --排序查询
	order by colunm/expr/别名 asc/desc --条件查询
	limit n offset s; -- 分页查询(从 s 开始往后 n 个)
select distinct column_name, column_name... from table_name; --去重查询
select * from table_name where column_name like '%值_'; --模糊查询
-- 3.更新
update table_name set column_name = value where ... order by ... asc/desc limit n;
-- 4.删除
delete from table_name where ... order by ... asc|desc limit n;
 
相关推荐
不想纳尼的青春11 分钟前
where = 的作用?会影响性能吗?count(*) 和 count()哪个快?
数据库·oracle
倔强的石头_42 分钟前
Spring Boot 接入金仓数据库:配置分层、启动自检与常见错误
数据库
黑桃小柒71 小时前
Django模型关系:从一对多到多对多全解析
数据库·django·sqlite
上海安当技术1 小时前
统一身份认证平台怎么落地?11 个异构业务系统接入 ASP 的完整实施路径
数据库·servlet·架构·kubernetes·jenkins
全栈派森2 小时前
告别大表膨胀!MySQL 冷热分离落地全过程(含 CDC 与单行锁抢占实战)
大数据·mysql
篮框坏了2 小时前
大事务 DELETE 锁表排查:删 3344 万行,一个清理任务变成周期炸弹
mysql
在水一缸2 小时前
PGSimCity:当数据库内核变成一座可以漫步的城市
数据库·postgresql·可视化·开源项目·数据库内核·pgsimcity·技术科普
jnrjian2 小时前
psql 执行多个 sql 文件
数据库·sql
LinuxGeek10242 小时前
Kylin-Server-V11、openEuler-22.03和openEuler-24.03适配原生rpm的MySQL 8.4.11版本正式发布
大数据·mysql·kylin
@insist1235 小时前
信息系统管理工程师-运维人员管理与核心运维过程(上篇)
数据库·软考·软件水平考试·信息系统管理工程师·软考信管