MySQL【基本查询上 - 表的增删改查】

CRUD(创建 Create、读取 Retrieve、更新 Update、删除 Delete) 是最核心的基础操作,而其中的Retrieve(查询) 更是日常开发和数据分析中使用频率最高的操作。

一、Create

在进行查询操作前,我们需要先有数据表测试数据 ,因此首先掌握表的创建和数据插入的语法是基础。

  • 使用CREATE TABLE语句创建数据表,需指定字段名、数据类型、约束条件等,常用约束包括**PRIMARY KEY(主键)、AUTO_INCREMENT(自增)、NOT NULL(非空)、UNIQUE(唯一)等。**
  • 插入数据的语法: 插入数据的核心语法为INSERT [INTO] table_name [(列名)] VALUES (值列表),根据场景不同,有多种插入方式,需注意值列表的数量、顺序需与列名对应

1.1 单行数据 + 全列插入

  • 接插入所有列的数据,无需指定列名,适用于初始化少量数据。
  • 插入两条记录,value_list 数量必须和定义 表的列的数量及顺序一致
  • 注意,这里在插入的时候,也可以不用指定id(当然,那时候就需要明确插入数据到那些列了),那么mysql会使用默认 的值进行自增。

1.2 多行数据 + 指定列插入

  • value_list 数量必须和指定列数量及顺序一致
  • 批量插入数据并指定需要赋值的列,未指定的列将使用默认值(如 NULL),效率高于多次单行插入,是实际开发中常用方式。

1.3 插入否则更新

出现问题后 , 数据进行修正

  • 当插入数据的主键唯一键 与表中现有数据冲突时,直接插入会报错,使用INSERT ... ON DUPLICATE KEY UPDATE可实现 "冲突则更新,无冲突则插入"。
  • 执行结果说明:

    • 0 行受影响:冲突数据与更新值一致;
    • 1 行受影响:无冲突,数据成功插入;
    • 2 行受影响:有冲突,数据已更新。


ON DUPLICATE KEY 当发生重复key的时候

1.4 替换

使用REPLACE INTO ,主键 / 唯一键无冲突则直接插入,冲突则删除原有数据后重新插入,适用于需要完全替换冲突数据的场景。

二、Retrieve

查询是 MySQL 基础操作的核心,语法框架为:


案例:

复制代码
-- 创建表结构
CREATE TABLE exam_result (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT '同学姓名',
chinese float DEFAULT 0.0 COMMENT '语文成绩',
math float DEFAULT 0.0 COMMENT '数学成绩',
english float DEFAULT 0.0 COMMENT '英语成绩'
);
-- 插入测试数据

INSERT INTO exam_result (name, chinese, math, english) VALUES
('唐三藏', 67, 98, 56),
('孙悟空', 87, 78, 77),
('猪悟能', 88, 98, 90),
('曹孟德', 82, 84, 67),
('刘玄德', 55, 85, 45),
('孙权', 70, 73, 78),
('宋公明', 75, 65, 30);

2.1 SELECT列

2.1.1 全列查询

使用*表示查询所有列不建议在生产环境使用

  1. 查询列越多,数据传输量越大;
  2. 可能影响索引的使用,降低查询效率
  3. 不推荐使用全列查询,因为未来的数据库服务在远端的服务器中,存储的数据量特别大,如果采用全列查询,意味着消耗的网络传输资源大,在我们的屏幕上会疯狂的刷屏

2.1.2 指定列查询

指定列的顺序 不需要 按定义表的顺序来 ,灵活适配需求。

2.1.3 查询字段为表达式

可对查询的字段进行算术运算,表达式可包含单个字段、多个字段或无字段,实现数据的实时计算。

复制代码
-- 表达式无字段:查询时添加固定列
SELECT id,name,10 FROM exam_result;
-- 表达式单字段:英语成绩+10
SELECT id, name, english + 10 FROM exam_result;
-- 表达式多字段:计算总成绩
SELECT id, name, chinese + math + english FROM exam_result;

表达式不包含字段

表达式 包含一个字段

表达式 包含多个字段

2.1.4 为查询结果指定别名

使用**AS(可省略)为列或表达式指定别名** ,让查询结果更易读,别名可在ORDER BY中使用,但不能在WHERE 中使用

语法:

2.1.5 结果去重DISTINCT

使用**DISTINCT对查询结果去重**,适用于需要统计唯一值的场景(如统计有多少种数学成绩)。

2.2 WHERE条件

通过WHERE子句添加筛选条件,仅返回满足条件的数据行,核心是掌握比较运算符逻辑运算符 的使用**,同时支持模糊匹配、NULL 判断等特殊场景。**

比较运算符:

<=> 为 NULL 安全的等于,= 对 NULL 判断无效;

逻辑运算符:

复制代码
-- 1. 英语不及格(<60)的同学
SELECT name, english FROM exam_result WHERE english < 60;
-- 2. 语文成绩在80-90之间(闭区间)
SELECT name,chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90;
-- 3. 数学成绩是58/59/98/99的同学
SELECT name, math FROM exam_result WHERE math IN (58, 59, 98, 99);
-- 4. 姓孙的同学(%匹配任意后缀)
SELECT name FROM exam_result WHERE name LIKE '孙%';
-- 5. 姓名为"孙某"的同学(_匹配一个字符)
SELECT name FROM exam_result WHERE name LIKE '孙_';
-- 6. 语文成绩>英语成绩且不姓孙的同学
SELECT name, chinese FROM exam_result WHERE chinese>80 AND name NOT LIKE'孙%';
-- 7. 查询QQ号非空的学生
SELECT name, qq FROM students WHERE qq IS NOT NULL;

2.2.1 英语不及格的同学及英语成绩(<60)

2.2.2 语文成绩在[80,90]分的同学及语文成绩

2.2.3 数学成绩是58或者59或者98或者99分同学及数学成绩

2.2.4 姓孙的同学 及 孙某同学

2.2.5 语文成绩好于英语成绩的同学

WHERE 条件中比较运算符两侧都是字段

2.2.6 总分在200分以下的同学

WHERE 条件中使用表达式
别名不能用在 WHERE 条件中

2.2.7 语文成绩 > 80 并且不姓孙的同学

2.2.8 孙某同学,否则要求成绩>200 并且语文成绩 < 数学成绩 并且英语成绩>80

2.2.9 NULL查询

在MySQL中,NULL 表示未知或缺失的值, 因此任何使用普通比较运算符(如 =)与 NULL 进行的比较都不会返回 TRUEFALSE,而是返回 NULL,因为未知的结果无法确定。例如:

  • NULL = NULL 的结果是 NULL,因为两个未知值是否相等无法判断。

  • NULL = 1NULL = 0 的结果也都是 NULL

<=> 是 MySQL 提供的"安全等于"运算符,专门用于处理 NULL 的比较。它的规则是:

  • 如果两个操作数都是 NULL,则返回 1(真)。

  • 如果只有一个操作数是 NULL,则返回 0(假)。

  • 如果两个操作数都不为 NULL,则正常比较,相等返回 1,不等返回 0

2.3 结果排序

使用ORDER BY对查询结果排序,未指定排序时,返回顺序未定义,切勿依赖默认顺序

  • 升序:ASC(默认,可省略),从小到大;
  • 降序:DESC,从大到小;
  • NULL 值处理:视为比任何值都小,升序在最前,降序在最后。

2.3.1 同学及数学成绩,按数学成绩升序显示

复制代码
-- 数学成绩升序排列
SELECT name,math FROM exam_result ORDER BY math;
-- QQ号降序排列(NULL在最后)
SELECT name, qq FROM students ORDER BY qq DESC;

2.3.2 同学及qq号,按qq号排序显示

2.3.3 查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示

多个字段用逗号分隔,排序优先级随书写顺序而定前一个字段值相同时,才按后一个字段排序。

2.3.4 查询同学及总分,由高到低

ORDER BY 中可以使用表达式

复制代码
-- 按总成绩(表达式)降序
SELECT name, chinese + english + math FROM exam_result
ORDER BY chinese + english + math DESC;
-- 按总成绩(别名)降序
SELECT name, chinese + english + math 总分 FROM exam_result
ORDER BY 总分 DESC;

2.3.5 查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示

2.4 筛选分页结果

语法:

使用LIMIT子句实现分页,避免一次性查询大量数据导致数据库卡死MySQL 中起始下标从 0 开始,有两种常用语法(推荐第二种,语义更清晰):

  • 语法1:LIMIT 起始位置, 每页条数
  • 语法2:LIMIT 每页条数 OFFSET 起始位置(推荐)

需要有数据才能排序;只有数据准备好了,才需要显示,才需要使用到limit , limit的核心功能是显示 , 所以执行的顺序更加靠后~

复制代码
-- 第1页:起始位置0,取3条
SELECT id, name, math FROM exam_result ORDER BY id LIMIT 3 OFFSET 0;
-- 第2页:起始位置3,取3条
SELECT id, name, math FROM exam_result ORDER BY id LIMIT 3 OFFSET 3;
-- 第3页:起始位置6,取3条(结果不足3条时,返回剩余数据)
SELECT id, name, math FROM exam_result ORDER BY id LIMIT 3 OFFSET 6;
相关推荐
yashuk2 小时前
【MySQL】表的相关操作
android·mysql·adb
scofield_gyb2 小时前
Redis简介、常用命令及优化
数据库·redis·缓存
難釋懷2 小时前
Redis搭建分片集群
数据库·redis·缓存
happymaker06262 小时前
JDBC(MySQL)——DAY04(调用存储过程,存储函数)
java·数据库·mysql
微学AI3 小时前
时序数据库选型:聚焦时间序列数据库Apache IoTDB——为工业物联网与大数据而生
数据库·apache·时序数据库
jason_renyu3 小时前
Windows下MySQL多实例配置:添加多端口服务(独立配置文件法)
windows·mysql·mysql配置多端口服务
952363 小时前
MySQL - 集群架构与实践
数据库·学习·mysql·架构
原来是猿3 小时前
Linux-【文件系统下】
linux·运维·数据库
Java面试题总结3 小时前
2026最新Java八股文(完整版)
java·开发语言·jvm·数据库·java面试·java八股文