增删改查操作

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
相关推荐
Code_Geo2 小时前
在postgres数据库中Postgres FDW 全面详解
数据库·fdw
QT 小鲜肉2 小时前
【个人成长笔记】将Try Ubuntu里面配置好的文件系统克隆在U盘上(创建一个带有持久化功能的Ubuntu Live USB系统)
linux·开发语言·数据库·笔记·ubuntu
LWy6104262 小时前
数据库库、表的创建及处理
数据库
Jay_Franklin2 小时前
Python中使用sqlite3模块和panel完成SQLite数据库中PDF的写入和读取
数据库·笔记·python·pycharm·sqlite·pdf·py
小锅巴1233 小时前
百度测开面经(分类版)
数据库·分类·数据挖掘
芒果要切3 小时前
Redis 使用场景
数据库·redis·缓存
全栈工程师修炼指南3 小时前
DBA | Oracle RMAN 实战:物理备份与数据恢复全解析
数据库·oracle·dba
现在,此刻3 小时前
clickhouse和pgSql跨库查询方案对比
数据库·sql·clickhouse·性能优化
while(1){yan}3 小时前
数据库的基本操作
数据库·oracle