【MySQL 数据库】基本查询

MySQL 的CRUD(增删改查) 是数据库操作的核心基础,不管是日常开发、面试笔试还是刷题,都是必须牢牢掌握的内容。这篇文章把 MySQL 表的增、删、改、查,包括条件过滤、排序、分页、聚合、分组等高频用法一次性整理全,看完直接上手用!


一、先认识 CRUD

CRUD 对应数据库最核心的 4 种操作:

  • C:Create(创建 / 插入数据)
  • R:Retrieve(读取 / 查询数据)
  • U:Update(更新数据)
  • D:Delete(删除数据)

二、Create:数据插入(INSERT)

插入是往表里加数据,常用 4 种写法,覆盖绝大多数场景。

1. 单行全列插入

值的顺序、数量必须和表字段完全一致。

sql

复制代码
INSERT INTO students VALUES (100, 10000, '唐三藏', NULL);

2. 多行指定列插入

只插入需要的列,更安全、更常用。

sql

复制代码
INSERT INTO students (id, sn, name) 
VALUES 
(102, 20001, '曹孟德'),
(103, 20002, '孙仲谋');

3. 插入否则更新(ON DUPLICATE KEY UPDATE)

主键 / 唯一键冲突时不报错,直接更新

sql

复制代码
INSERT INTO students (id, sn, name) 
VALUES (100, 10010, '唐大师')
ON DUPLICATE KEY UPDATE sn = 10010, name = '唐大师';

4. 替换插入(REPLACE)

冲突就删除旧数据 + 插入新数据,不冲突直接插。

sql

复制代码
REPLACE INTO students (sn, name) VALUES (20001, '曹阿瞒');

三、Retrieve:数据查询(SELECT)------ 重点中的重点

查询是 SQL 里最复杂、用得最多的部分,语法结构:

sql

复制代码
SELECT 
[DISTINCT] 列名 | 表达式 | 别名
FROM 表名
[WHERE 条件]
[ORDER BY 排序]
[LIMIT 分页];

1. 基础查询

  • 全列查询(不推荐用*,数据量大、影响索引)

    sql

    复制代码
    SELECT * FROM exam_result;
  • 指定列查询 sql

    复制代码
    SELECT id, name, english FROM exam_result;

2. 表达式查询 & 别名

可以直接在查询里做计算,并用AS(可省略) 起别名。

sql

复制代码
-- 计算总分并起别名
SELECT name, chinese + math + english AS 总分 FROM exam_result;

3. 结果去重(DISTINCT)

sql

复制代码
-- 去掉重复的数学分数
SELECT DISTINCT math FROM exam_result;

四、WHERE:条件过滤(精准查数据)

用条件筛选想要的数据,支持比较、逻辑、模糊、范围判断。

常用运算符

  • 比较:> >= < <= = != <=> BETWEEN AND IN
  • 逻辑:AND OR NOT
  • 模糊:LIKE%任意多字符,_单个字符)
  • NULL 判断:IS NULL / IS NOT NULL=不能判断 NULL)

高频示例

sql

复制代码
-- 英语不及格
SELECT name, english FROM exam_result WHERE english < 60;

-- 语文80~90分
SELECT name, chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90;

-- 姓孙的同学
SELECT name FROM exam_result WHERE name LIKE '孙%';

-- qq号不为空
SELECT name FROM students WHERE qq IS NOT NULL;

五、ORDER BY:结果排序

  • ASC:升序(默认,从小到大)
  • DESC:降序(从大到小)
  • 支持多字段排序、表达式排序、别名排序

sql

复制代码
-- 按总分从高到低
SELECT name, chinese+math+english 总分 
FROM exam_result 
ORDER BY 总分 DESC;

-- 先按数学降序,再按英语升序
SELECT * FROM exam_result ORDER BY math DESC, english ASC;

六、LIMIT:分页查询

分页必备,防止一次性查全表卡死数据库。

注意:LIMIT 的两种常用写法

LIMIT 在 MySQL 里有两种等价写法,只是参数顺序不同,很多同学上课会遇到老师教的和教程不一样,这里帮你彻底分清:

写法 1:LIMIT 偏移量,条数(很多老师课堂上的常用写法)

语法:LIMIT offset, row_count含义:从第 offset 条(从 0 开始计数)开始,取 row_count 条数据。

sql

复制代码
-- 从第0条开始,取3条(第1页,和LIMIT 3 OFFSET 0 效果完全一样)
SELECT * FROM exam_result LIMIT 0, 3;

写法 2:LIMIT 条数 OFFSET 偏移量(语义更清晰的写法)

语法:LIMIT row_count OFFSET offset含义:取 row_count 条数据,从第 offset 条(从 0 开始计数)开始。

sql

复制代码
-- 取3条,从第0条开始(和LIMIT 0, 3 效果完全一样)
SELECT * FROM exam_result LIMIT 3 OFFSET 0;

两种写法对比与通用分页公式

表格

写法 参数顺序 优点 通用分页公式(第 page 页,每页 pageSize 条)
LIMIT offset, row_count 偏移量在前,条数在后 写法更短,很多老教材 / 老师习惯用 LIMIT (page-1)*pageSize, pageSize
LIMIT row_count OFFSET offset 条数在前,偏移量在后 语义更清晰,不容易搞混参数 LIMIT pageSize OFFSET (page-1)*pageSize

💡 小提示:两种写法在 MySQL 中效果完全一致,按你上课学的习惯用就好,核心是记住偏移量从 0 开始计数


七、Update:数据更新

一定要加 WHERE!否则全表更新!

sql

复制代码
-- 单字段更新
UPDATE exam_result SET math = 80 WHERE name = '孙悟空';

-- 多字段更新
UPDATE exam_result SET math = 60, chinese = 70 WHERE name = '曹孟德';

-- 在原值上修改
UPDATE exam_result SET math = math + 30 WHERE name = '宋公明';

八、Delete:数据删除

同样慎用!不加 WHERE 会清空全表!

sql

复制代码
-- 删除指定数据
DELETE FROM exam_result WHERE name = '孙悟空';

-- 清空表数据(自增ID继续增长)
DELETE FROM for_delete;

-- 截断表(更快、重置自增ID、无法回滚)
TRUNCATE TABLE for_truncate;

DELETE vs TRUNCATE 对比

表格

特点 DELETE TRUNCATE
操作范围 可删部分数据 只能清空全表
自增 ID 保持不变 重置从 1 开始
速度 较慢 极快
事务回滚 支持 不支持

九、高级用法:插入查询结果

把一张表的查询结果直接插入另一张表,常用于去重、数据迁移

sql

复制代码
-- 去重插入
INSERT INTO no_duplicate_table 
SELECT DISTINCT * FROM duplicate_table;

十、聚合函数:统计数据

对一列做统计计算,常用 5 个:

  • COUNT():计数
  • SUM():求和
  • AVG():平均值
  • MAX():最大值
  • MIN():最小值

sql

复制代码
-- 统计人数
SELECT COUNT(*) FROM students;

-- 数学总分
SELECT SUM(math) FROM exam_result;

-- 英语最高分
SELECT MAX(english) FROM exam_result;

十一、GROUP BY:分组统计 + HAVING 分组过滤

GROUP BY按某列分组,HAVING对分组结果过滤(不能用 WHERE)。

sql

复制代码
-- 每个部门平均工资
SELECT deptno, AVG(sal) FROM EMP GROUP BY deptno;

-- 平均工资低于2000的部门
SELECT deptno, AVG(sal) AS avg_sal 
FROM EMP 
GROUP BY deptno 
HAVING avg_sal < 2000;

十二、SQL 执行顺序(面试高频)

记住这个顺序,写复杂 SQL 再也不晕:

plaintext

复制代码
FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT

十三、总结

  1. :INSERT / INSERT ... ON DUPLICATE KEY UPDATE / REPLACE
  2. :SELECT + 表达式 + 别名 + DISTINCT
  3. :WHERE(比较、逻辑、模糊、NULL)
  4. :ORDER BY ASC/DESC
  5. :LIMIT ... OFFSET ...
  6. :UPDATE 必须加 WHERE
  7. :DELETE / TRUNCATE 慎用
  8. 统计:聚合函数 + GROUP BY + HAVING

这套 MySQL CRUD 基本查询用法,覆盖日常开发 90% 场景,刷题、面试、工作都够用,建议收藏反复看!

相关推荐
szccyw01 小时前
如何从SQL提取年或月数据_运用YEAR与MONTH提取函数
jvm·数据库·python
罗超驿1 小时前
4.MySQL数据表操作与CRUD详解:从建表、插入到查询的全流程
数据库·mysql
薛定猫AI1 小时前
【技术干货】用 AI + Expo 打通 iOS / Android / Web 跨端应用开发:从架构到代码生成实战
android·人工智能·ios
2601_954971131 小时前
没有SQL基础能学数据分析吗?先学什么更合适
数据库·sql·数据分析
陌路201 小时前
第一行代码--初步学习--Android四大组件-activity1
android·学习
page_qiu1 小时前
高并发&大数据量&毫秒级响应系统设计方案
java·前端·数据库·高并发·高响应
运气好好的1 小时前
如何处理死锁异常_ORA-00060捕获与重试机制设计
jvm·数据库·python
Promise微笑1 小时前
开关柜局放国产替代浪潮下:开关柜局放监测技术与实践深度解析
网络·数据库·人工智能
Filwaod1 小时前
Java面试现场:从Redis缓存到分布式事务,水货程序员李四的‘表演‘
java·jvm·spring boot·redis·mysql·面试·多线程