当前位置: 首页 > java >正文

MySQL基本查询与数据操作全面解析

目录

1. CRUD操作概述

2. Create操作详解

2.1 表的创建

2.2 单行数据插入

2.3 多行数据插入

2.4 插入冲突处理

3. Retrieve操作详解

3.1 基础查询

全列查询(慎用)

指定列查询

表达式查询

结果去重

3.2 条件查询(WHERE子句)

比较运算符

逻辑运算符

NULL处理

3.3 结果排序(ORDER BY)

3.4 分页查询(LIMIT与OFFSET)

4. Update操作详解

4.1 单字段更新

4.2 多字段更新

4.3 基于表达式更新

5. Delete操作详解

5.1 删除指定数据

5.2 清空表数据

6. 高级查询技巧

6.1 聚合函数

6.2 GROUP BY与HAVING

7. 实战案例解析

案例1:去重插入

案例2:分页查询

8. 总结与最佳实践


1. CRUD操作概述

CRUD是数据库操作的四大核心功能:

  • Create(创建):插入数据

  • Retrieve(读取):查询数据

  • Update(更新):修改数据

  • Delete(删除):删除数据

本文将通过丰富的代码示例,详细解析MySQL中CRUD的实现方式及注意事项。


2. Create操作详解

2.1 表的创建

通过CREATE TABLE语句定义表结构。

CREATE TABLE students (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,sn INT NOT NULL UNIQUE COMMENT '学号',name VARCHAR(20) NOT NULL,qq VARCHAR(20)
);
  • 字段说明

    • id:主键,自增,无符号整数。

    • sn:唯一学号,不可为空。

    • name:姓名,长度限制为20字符。

    • qq:QQ号,可为空。

2.2 单行数据插入

全列插入时,需按表定义的列顺序提供所有值:

INSERT INTO students VALUES (100, 10000, '唐三藏', NULL);
  • 注意事项

    • 若省略自增主键(如id),MySQL会自动填充。

    • 必须保证值的顺序与表结构完全一致。

2.3 多行数据插入

指定列插入,适用于部分字段赋值:

INSERT INTO students (id, sn, name) VALUES(102, 20001, '曹孟德'),(103, 20002, '孙仲谋');
  • 优势:批量插入提升效率,减少数据库连接开销。

2.4 插入冲突处理

当主键或唯一键冲突时,使用ON DUPLICATE KEY UPDATE进行更新:

INSERT INTO students (id, sn, name) VALUES (100, 10010, '唐大师')ON DUPLICATE KEY UPDATE sn = 10010, name = '唐大师';
  • 返回值说明

    • 0 rows affected:冲突数据与更新值相同。

    • 1 row affected:插入新数据。

    • 2 rows affected:更新冲突数据。

或使用REPLACE直接替换冲突记录:

REPLACE INTO students (sn, name) VALUES (20001, '曹阿晴');
  • 注意REPLACE会删除原记录后插入新数据,可能导致自增ID不连续。


3. Retrieve操作详解

3.1 基础查询

全列查询(慎用)
SELECT * FROM exam_result;
  • 缺点:传输数据量大,可能影响索引性能。

指定列查询
SELECT id, name, english FROM exam_result;
表达式查询

计算总分并指定别名:

SELECT name, chinese + math + english AS 总分 FROM exam_result;
结果去重
SELECT DISTINCT math FROM exam_result;

3.2 条件查询(WHERE子句)

比较运算符
-- 英语不及格的同学
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 '孙%' AND name NOT LIKE '孙_';
NULL处理
-- 查询QQ号已知的同学
SELECT name, qq FROM students WHERE qq IS NOT NULL;

3.3 结果排序(ORDER BY)

-- 按数学成绩降序,英语成绩升序
SELECT name, math, english FROM exam_result 
ORDER BY math DESC, english ASC;

3.4 分页查询(LIMIT与OFFSET)

-- 每页3条数据,查询第2页
SELECT * FROM exam_result 
ORDER BY id LIMIT 3 OFFSET 3;
  • 注意OFFSET起始位置从0开始。


4. Update操作详解

4.1 单字段更新

UPDATE exam_result SET math = 80 WHERE name = '孙悟空';

4.2 多字段更新

UPDATE exam_result SET math = 60, chinese = 70 
WHERE name = '曹孟德';

4.3 基于表达式更新

-- 总成绩倒数前三的数学成绩加30分
UPDATE exam_result SET math = math + 30 
ORDER BY chinese + math + english LIMIT 3;

5. Delete操作详解

5.1 删除指定数据

DELETE FROM exam_result WHERE name = '孙悟空';

5.2 清空表数据

  • DELETE:逐行删除,可回滚,保留自增计数。

    DELETE FROM for_delete;

  • TRUNCATE:直接清空表,不可回滚,重置自增ID。

    TRUNCATE TABLE for_truncate;

6. 高级查询技巧

6.1 聚合函数

-- 统计数学成绩总分
SELECT SUM(math) FROM exam_result;-- 计算平均总分
SELECT AVG(chinese + math + english) AS 平均总分 FROM exam_result;

6.2 GROUP BY与HAVING

-- 按部门统计平均工资
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;

7. 实战案例解析

案例1:去重插入

-- 创建临时表并插入去重数据
CREATE TABLE no_duplicate_table LIKE duplicate_table;
INSERT INTO no_duplicate_table SELECT DISTINCT * FROM duplicate_table;
RENAME TABLE duplicate_table TO old_duplicate_table, no_duplicate_table TO duplicate_table;

案例2:分页查询

-- 按ID分页,每页3条
SELECT * FROM exam_result ORDER BY id LIMIT 3 OFFSET 6;

8. 总结与最佳实践

  1. 避免全列查询:减少数据传输量,提升性能。

  2. 谨慎使用UPDATE/DELETE:操作前备份数据,或添加LIMIT限制。

  3. 合理使用索引:WHERE和ORDER BY字段建立索引可加速查询。

  4. 事务管理:批量操作时开启事务,确保数据一致性。

通过本文的系统学习,读者可掌握MySQL核心操作,应对日常开发中的各类数据管理需求。

http://www.xdnf.cn/news/1289.html

相关文章:

  • ​​批发商商城小程序制作哪家强?开启高效批发新模式!
  • 大白话说MCP(Model Context Protocol)
  • Verilog 4:数组
  • pod 创建私有库指南
  • JavaScript 数组常用方法解析
  • 塔能风机节能方案:为工厂能耗精准“减负”
  • 《念无双》:仙侠世界中的传统文化交响
  • AT24C02芯片简介:小巧强大的串行EEPROM存储器
  • 力扣刷题Day 26:回文链表(234)
  • 配置spark
  • Gartner发布2025年全球IT支出最新预测:人工智能持续推动信息安全需求增加
  • 尾递归优化与函数柯里化
  • TCP三次握手与四次挥手面试回答版本
  • 自然语言处理 | 语言模型(LM) 浅析
  • spark-sql
  • 2023蓝帽杯初赛内存取证-5
  • springBoot_项目目录结构
  • 刀客doc:快手磁力引擎副总裁冯超离职,王志强接管渠道业务
  • 仅追加KV数据库
  • C# 跨进程 临界区 互斥 进程锁
  • 航电系统之自动控制系统篇
  • 词语关系图谱模型
  • Python中__init__方法的深度解析:构造对象的艺术
  • Milvus(3):数据库、Collections说明
  • 将Ubuntu系统中已有的Python环境迁移到Anaconda的虚拟环境中
  • 物联网赋能玻璃制造业:实现设备智能管理与生产协同
  • C++ 哈希表
  • WebGL名词解释——裁剪空间
  • N8N MACOS本地部署流程避坑指南
  • CAN总线接口卡有什么优势