增删改查操作

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
相关推荐
TG:@yunlaoda360 云老大8 小时前
如何在华为云国际站代理商控制台进行基础状态核查的常见问题解答
数据库·华为云·php
CeshirenTester9 小时前
Cursor自动调试代码实战教程
数据库·oracle
老马95279 小时前
事务工具类
数据库·后端
小张是铁粉9 小时前
oracle 数据库学习之体系结构(1-4章)
数据库·学习
TH_19 小时前
22、oracle导入数据,sys_user表数据错误
数据库·oracle
严文文-Chris9 小时前
【向量数据库到底是什么?】
数据库
老马聊技术9 小时前
HBase单节点环境搭建详细教程
大数据·数据库·hbase
子夜江寒9 小时前
Python 操作 MySQL 数据库
数据库·python·mysql
梦帮科技9 小时前
第二十二篇:AI驱动的工作流优化:性能瓶颈自动检测
数据结构·数据库·人工智能·python·开源·极限编程
Alex Gram9 小时前
SQL Server实时同步到MySQL:构建高效跨数据库数据流通方案
数据库·mysql·sqlserver