增删改查操作

CRUD简介

  • create(创建)
  • retrieve(读取)
  • update(更新)
  • delete(删除)

create新增

"增"指的是向数据库表中插入新记录,使用INSERT

INSERT [INTO] table_name

(column1, column2, column3, ...)

VALUES (value1, value2, value3, ...);

  • (column1, column2, ...):指定要插入数据的列名
  • VALUES 后面跟对应列的值

插入一条数据

sql 复制代码
CREATE DATABASE usersbase;
use usersbase;
CREATE TABLE users(
id INT,name VARCHAR(30),age INT);
desc users;
DELETE FROM users WHERE id IS NULL;
-- 然后重新插入
INSERT INTO users (name, age) VALUES ('杰西', 20);
SELECT * FROM users;

插入多条数据,提高效率

SELECT查询

全列查询

  • ❌ 不推荐:

SELECT * FROM 表名;

--*通配符,通配符可以代表各种信息

  • ✅ 推荐:

SELECT name, age FROM users;

原因

  • 减少网络传输开销
  • 避免读取大量的硬盘访问与网络访问
  • 提高缓存效率
  • 防止因表结构变更导致程序出错

指定列查询

SELECT 列名,列名......FROM 表名;

查询时带有表达式

SELECT 表达式 FROM 表名;

查询带有别名的

SElECT 表达式 AS 别名 FROM 表名;

total 是一个别名(alias),在 WHERE 子句中不能直接使用

WHERE 子句在 SELECT 之前执行,所以,你在 SELECT 中定义的别名 total,在 WHERE 子句中还不存在

MySQL 在执行查询时的处理顺序:

  • FROM
  • WHERE
  • SELECT(包括别名)
  • ORDER BY

去重查询

去重:多个相同的值,合并为一个

SELECT DISTINCT 列名 FROM 表名;

WHERE 条件

注意 NULL 值的处理:不能用 = NULL,要用 IS NULLIS NOT NULL

-- 错误 ❌

SELECT * FROM users WHERE age = NULL;

-- 正确 ✅

SELECT * FROM users WHERE age IS NULL;

⽐较运算符

运算符 含义
=,<=> =,对于NULL比较不安全,NULL=NULL结果NULL, <=>,对于NULL比较安全,NULL<=>NULL结果TRUE(1)
<>!= 不等于
<,<=,>,>= 小于,小于等于,大于,大于等于
IS NULL / IS NOT NULL 判断是否为 NULL
BETWEEN ... AND ... 判断值是否在某个闭区间范围内 ✅包含边界值(闭区间)
LIKE / NOT LIKE 用于字符串模糊匹配 %匹配任意数量字符(包括零个) _匹配单个字符
IN / NOT IN 判断值是否在给定的列表中

逻辑运算符

运算符 含义
AND&& 只有当所有条件都为 TRUE 时,结果才为 TRUE
OR 或 ` 只要有一个条件为 TRUE,结果就为 TRUE
NOT! 逻辑非(取反)

MySQL 会按照以下优先级顺序执行逻辑运算:

  • NOT(或 !
  • AND(或 &&
  • OR(或 ||

NULL 值的逻辑运算

表达式 结果 说明
TRUE AND NULL NULL 未知
FALSE AND NULL FALSE 因为 FALSE 与任何值 AND 都为 FALSE
TRUE OR NULL TRUE 因为 TRUE 与任何值 OR 都为 TRUE
FALSE OR NULL NULL 未知
NOT NULL NULL 取反仍为未知

注意:

  • WHERE条件可以使用表达式,但不能使用别名
  • AND的优先级高于OR,同时使用,建议使用小括号()包裹优先执行的部分
  • 过滤NULL时不要使用=与!=,<>
  • NULL与任何值运算结果为NULL

Order by排序

SELECT column1, column2, ...

FROM table_name

WHERE condition\] ORDER BY column1 \[ASC \| DESC\], column2 \[ASC \| DESC\], ...;

单列排序

  • ASC:升序排序(默认),从小到大
  • DESC:降序排序,从大到小

多列排序

score 相同时,按 age 升序排列

Order by默认升序排序

含有NULL的排序

• NULL进⾏排序时,视为⽐任何值都⼩,升序出现在最上⾯,降序出现在最下⾯

Order by别名排序

• ORDERBY⼦句中可以使⽤列的别名进行排序

分页查询

SELECT column1, column2, ...

FROM table_name

WHERE condition

ORDER BY column \[ASC \| DESC\]

LIMIT row_count OFFSET offset;
LIMIT offset, row_count

  • row_count:每页显示的记录数(页大小)
  • offset:跳过的记录数(从 0 开始)

每页显示 3 条,查询第 1 页

查询第 2 页(跳过前3条)

总查询

Update修改

UPDATE table_name

SET column1 = value1, column2 = value2, ...

WHERE condition\] \[ORDER BY ...\] \[LIMIT row_count\];

  • SET:指定要更新的列及其新值更新单列

更新多列

使用表达式更新

复制代码

Delete删除

DELETE FROM table_name [WHERE condition] [ORDER BY ...] [LIMIT row_count];

初始表

删除满足条件的特定行

删除所有数据(清空表)

DELETE FROM table_name;

⚠️ 警告 :如果没有 WHERE 子句,DELETE 会删除表中所有数据!务必谨慎操作!

执⾏Delete时不加条件会删除整张表的数据,谨慎操作

截断表

"截断表"指的是使用 TRUNCATE TABLE 命令来快速清空一个表中的所有数据

TRUNCATE TABLE table_name;

初始表

截断后的表结构

插入查询结果

INSERT INTO 目标表名 (列1, 列2, ...) SELECT 列A, 列B, ... FROM 源表名 WHERE 条件;

部分 说明
INSERT INTO 目标表名 (列列表) 指定要插入数据的目标表和对应的列
SELECT ... FROM 源表名 查询要插入的数据来源
WHERE 条件 可选,用于筛选需要插入的数据

聚合函数

函数 说明 示例
COUNT() 统计行数(非 NULL 值的数量) COUNT(*)COUNT(column)
SUM() 求和 SUM(salary)
AVG() 计算平均值 AVG(score)
MAX() 返回最大值 MAX(price)
MIN() 返回最小值 MIN(age)
GROUP_CONCAT() 将分组中的值连接成字符串 GROUP_CONCAT(name)

COUNT():统计数量

💡 COUNT(*) 包括 NULL;COUNT(column) 只统计非 NULL 值

SUM:求和

AVG:计算平均值

Max与Min:最大值与最小值

Group by分组查询

GROUP BY 是一个非常重要的子句,用于将结果集按一个或多个列进行分组 ,通常与聚合函数 (如 COUNTSUMAVG 等)一起使用,以便对每个分组进行统计分析

SELECT column1, 聚合函数(column2) FROM table_name WHERE 条件(可选) GROUP BY column1;

WHERE与HAVING的区别

  1. 作用对象不同

WHERE

  • 用于过滤行(记录)
  • 分组前对原始数据进行筛选
  • 不能使用聚合函数(如 COUNT, SUM, AVG 等)作为条件

HAVING

  • 用于过滤分组(Groups)
  • 分组后对分组结果进行筛选
  • 可以使用聚合函数作为条件

2.执行顺序不同

  1. FROM → 2. WHERE → 3. GROUP BY → 4. HAVING → 5. SELECT → 6. ORDER BY
  • WHEREGROUP BY 之前执行,先筛选出符合条件的行
  • HAVINGGROUP BY 之后执行,对分组后的结果进行再筛选

初始employees表

WHERE条件的使用

HAVING条件的使用

特性 WHERE HAVING
作用对象 行(记录) 分组(Group)
执行时机 分组前 分组后
能否用聚合函数 ❌ 不能 ✅ 能
是否必需 否(常与 GROUP BY 一起使用)
典型用途 筛选特定条件的原始数据 筛选满足聚合条件的分组

内置函数

字符串函数

函数 说明 示例
UPPER(str) 转大写 UPPER('hello')'HELLO'
LOWER(str) 转小写 LOWER('HELLO')'hello'
TRIM(str) 去除首尾空格 TRIM(' abc ')'abc'
SUBSTRING(str, start, len) 截取子串 SUBSTRING('hello', 2, 3)'ell'
CONCAT(str1, str2) 拼接字符串 CONCAT('a', 'b')'ab'
LENGTH(str) 字符串长度 LENGTH('abc')3

数值函数

函数 说明 示例
ROUND(num, d) 四舍五入 ROUND(3.14159, 2)3.14
CEIL(num) 向上取整 CEIL(3.1)4
FLOOR(num) 向下取整 FLOOR(3.9)3
ABS(num) 绝对值 ABS(-5)5
MOD(a, b) 取余 MOD(10, 3)1

日期和时间函数

函数 说明 示例
NOW() 当前日期时间 NOW()'2025-10-05 18:30:00'
CURDATE() 当前日期 CURDATE()'2025-10-05'
CURTIME() 当前时间 CURTIME()'18:30:00'
DATE(date) 提取日期部分 DATE('2025-10-05 18:30')'2025-10-05'
YEAR(date) 提取年份 YEAR(NOW())2025
DATEDIFF(date1, date2) 两个日期相差天数 DATEDIFF('2025-10-10', '2025-10-05')5
DATE_ADD(date, INTERVAL n DAY/MONTH/YEAR) 日期加减 DATE_ADD(NOW(), INTERVAL 7 DAY)

其他常⽤函数

函数 说明
version() 显示当前数据库版本
database() 显示当前正在使用的数据库
user() 显示当前用户
md5(str) 对一个字符串进行 MD5 摘要,摘要后得到一个 32 位字符串
ifnull(val1, val2) 如果 val1NULL,返回 val2;否则返回 val1
相关推荐
液态不合群2 分钟前
[特殊字符] MySQL 覆盖索引详解
数据库·mysql
计算机毕设VX:Fegn089531 分钟前
计算机毕业设计|基于springboot + vue蛋糕店管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
瀚高PG实验室36 分钟前
PostgreSQL到HighgoDB数据迁移
数据库·postgresql·瀚高数据库
打码人的日常分享1 小时前
智能制造数字化工厂解决方案
数据库·安全·web安全·云计算·制造
三水不滴1 小时前
Redis 过期删除与内存淘汰机制
数据库·经验分享·redis·笔记·后端·缓存
-孤存-2 小时前
MyBatis数据库配置与SQL操作全解析
数据库·mybatis
2301_822366353 小时前
使用Scikit-learn构建你的第一个机器学习模型
jvm·数据库·python
万邦科技Lafite4 小时前
一键获取京东商品评论信息,item_reviewAPI接口指南
java·服务器·数据库·开放api·淘宝开放平台·京东开放平台
自可乐5 小时前
Milvus向量数据库/RAG基础设施学习教程
数据库·人工智能·python·milvus
weixin_307779135 小时前
C#实现两个DocumentDB实例之间同步数据
开发语言·数据库·c#·云计算