关注

【MYSQL】MYSQL学习的一大重点:基本查询(上)


头像


🎬 个人主页艾莉丝努力练剑

专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录
Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平

🎬 艾莉丝的简介:

在这里插入图片描述



在这里插入图片描述


1 ~> 数据插入(Create)

1.1 基础 INSERT 插入

概念

INSERT 用于向表中插入新行数据,支持指定列插入、全列插入、多行批量插入;INTO关键字在 MySQL 中可省略(非标准 SQL 语法)。

代码示例

单行指定列插入

-- 仅向指定列插入数据,未指定的列取默认值或NULL
INSERT INTO students (id, sn, name) 
VALUES (10, 124, '关羽');

单行全列插入

-- 必须严格匹配表定义的列顺序,传入所有列的值
INSERT INTO students 
VALUES (1, 123, '张飞', '4567890');

多行批量插入

-- 单次提交多行数据,性能远高于多次单行插入
INSERT INTO students (id, sn, name, qq)
VALUES 
  (13, 127, '许攸', '10423456'),
  (14, 128, '许褚', '12333445'),
  (15, 129, '诸葛亮', '3213456');

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

概念

当插入数据触发主键或唯一键冲突时,不抛出报错,转而执行 UPDATE 更新指定字段。

  • 正常插入:row_count()返回 1
  • 发生字段更新:row_count()返回 2
  • 更新值与原值完全一致:row_count()返回 0

代码示例

-- id=18为主键,若已存在则更新sn、name、qq字段
INSERT INTO students (id, sn, name, qq)
VALUES (18, 134, '貂蝉', '1112222')
ON DUPLICATE KEY UPDATE 
  sn = 134,
  name = '貂蝉',
  qq = '11133333';

-- 查看上一次DML语句影响的行数
SELECT row_count();

1.3 REPLACE 替换插入

概念

REPLACE INTO执行逻辑:

  1. 尝试插入数据;
  2. 若无主键 / 唯一键冲突,直接插入(影响 1 行);
  3. 若发生冲突,先删除旧行,再插入新行(影响 2 行,自增 ID 会发生跳跃)。

核心区别:REPLACE 包含删除行为,会触发删除触发器、影响外键级联,不可与ON DUPLICATE KEY UPDATE随意混用。

代码示例

-- sn为唯一键,若140已存在则删除旧行后插入新行
REPLACE INTO students (sn, name, qq)
VALUES (140, '许攸', '321456213');

2 ~> SELECT 检索基础

2.1 基础查询形式

概念

  • 全列查询:使用*返回表中所有列,生产环境强烈不推荐,会增大数据传输量、可能导致索引失效。
  • 指定列查询:明确列出所需字段,性能更优、可读性更强。

代码示例

-- 全列查询(不推荐)
SELECT * FROM exam_result;

-- 指定列查询
SELECT id, name, math FROM exam_result;

2.2 表达式查询与别名

概念

SELECT 后支持字段、常量、运算表达式、函数;可通过AS关键字为列设置别名,AS可省略。

代码示例

-- 计算三科总分并设置别名total
SELECT 
  name,
  math,
  chinese + math + english AS total 
FROM exam_result;

-- 省略AS的别名写法
SELECT 
  name 姓名,
  math 数学,
  chinese + math + english 总分 
FROM exam_result;

2.3 结果去重

概念

DISTINCT对查询结果的指定列进行去重;多列时按多列组合值去重。

代码示例

-- 对数学成绩去重,相同分数仅保留一条
SELECT DISTINCT math FROM exam_result;

3 ~> WHERE 条件筛选

3.1 比较运算符

运算符说明注意事项
>, >=, <, <=大小比较支持数值、字符串、日期类型
=等于NULL 不安全,NULL = NULL结果为 NULL
<=>等于NULL 安全,NULL <=> NULL结果为 TRUE
!=, <>不等于NULL 不安全
BETWEEN a AND b范围匹配闭区间[a, b]
IN (v1, v2, ...)集合匹配任意一个匹配即返回真
IS NULL判断为 NULL专门用于 NULL 值判断
IS NOT NULL判断不为 NULL专门用于 NULL 值判断
LIKE模糊匹配%匹配任意多个字符,_匹配任意 1 个字符

3.2 逻辑运算符

运算符说明
AND逻辑与,所有条件同时满足才为真
OR逻辑或,任意一个条件满足即为真
NOT逻辑非,对条件结果取反

3.3 核心规则:WHERE 不可使用 SELECT 别名

原理

SQL 单表执行顺序中,WHERE 执行阶段早于 SELECT,执行 WHERE 时列的别名尚未生成,因此无法识别别名。

错误示例

-- 报错:Unknown column 'total' in 'where clause'
SELECT name, chinese + math + english total 
FROM exam_result 
WHERE total < 200;

正确写法

-- WHERE中直接书写完整表达式
SELECT name, chinese + math + english 总分 
FROM exam_result 
WHERE chinese + math + english < 200;

3.4 筛选案例

-- 英语成绩低于60分的同学
SELECT name, english FROM exam_result WHERE english < 60;

-- 语文成绩在[80,90]分(BETWEEN闭区间写法)
SELECT name, chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90;

-- 数学成绩是58/59/98/99(IN集合写法)
SELECT name, math FROM exam_result WHERE math IN (58, 59, 98, 99);

-- 姓孙的同学(%模糊匹配)
SELECT name FROM exam_result WHERE name LIKE '孙%';

-- 名字为两个字且姓孙(_单字符匹配)
SELECT name FROM exam_result WHERE name LIKE '孙_';

-- 语文成绩 > 80 且不姓孙
SELECT name, chinese FROM exam_result 
WHERE chinese > 80 AND name NOT LIKE '孙%';

-- 查询name为NULL的记录
SELECT * FROM test WHERE name IS NULL;

4 ~> ORDER BY 结果排序

4.1 排序基础

概念

对查询结果按指定字段排序,ASC为升序(默认值,可省略),DESC为降序。

  • NULL 值排序规则:MySQL 中 NULL 视为小于所有非 NULL 值,升序时排在最前,降序时排在最后。

代码示例

-- 数学成绩升序(默认ASC)
SELECT name, math FROM exam_result ORDER BY math ASC;

-- 数学成绩降序
SELECT name, math FROM exam_result ORDER BY math DESC;

4.2 多字段排序

概念

按多个字段排序,优先级从左到右:先按第一个字段排序,第一个字段值相同时,再按第二个字段排序,以此类推。

代码示例

-- 先按数学降序,数学同分则按英语升序,再同分按语文升序
SELECT name, math, english, chinese 
FROM exam_result 
ORDER BY math DESC, english ASC, chinese ASC;

4.3 排序与别名

原理

ORDER BY 执行阶段在 SELECT 之后,因此可以使用 SELECT 中定义的列别名。

代码示例

-- 使用总分别名进行降序排序
SELECT name, chinese + math + english total 
FROM exam_result 
ORDER BY total DESC;

5 ~> LIMIT 分页筛选

5.1 三种语法形式

概念

LIMIT 用于截取查询结果的前 N 条,或从指定位置开始截取 N 条,是实现分页的核心语法。

注意:MySQL 中行下标从 0 开始

代码示例

-- 1. 取前3条结果
SELECT * FROM exam_result LIMIT 3;

-- 2. 从下标1开始,取3条(对应第2~4行数据)
SELECT * FROM exam_result LIMIT 1, 3;

-- 3. 标准写法:取3条,偏移量为1(语义更清晰,推荐使用)
SELECT * FROM exam_result LIMIT 3 OFFSET 1;

5.2 分页业务实现

通用公式

n页(页码从 1 开始),每页展示size条: LIMIT size OFFSET (n - 1) * size

代码示例

-- 每页3条,查询第2页数据
SELECT id, name, math, english, chinese 
FROM exam_result
ORDER BY id 
LIMIT 3 OFFSET 3;

6 ~> 核心原理:单表 SQL 执行顺序

逻辑执行顺序(从先到后)

  1. FROM:确定数据来源表
  2. WHERE:按条件筛选符合要求的行
  3. SELECT:确定返回的列、计算表达式、生成列别名
  4. ORDER BY:对结果集进行排序
  5. LIMIT:截取最终返回的结果行数

该顺序是理解 “别名能否使用” 的核心依据:WHERE 在 SELECT 前,不能用别名;ORDER BY、LIMIT 在 SELECT 后,可以用别名。



结尾

uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!

艾莉丝努力练剑

C/C++ & Linux 底层探索者 | 一个正在努力练剑的技术博主


👀 【关注】 跟随我一起深耕技术领域,见证每一次成长。
❤️ 【点赞】 让优质内容被更多人看见,让知识传递更有力量。
【收藏】 把核心知识点存好,在需要时随时查、随时用。
💬 【评论】 分享你的经验或疑问,评论区一起交流避坑!

不要忘记给博主“一键四连”哦!

“今日练剑达成!”

“技术之路难免有困惑,但同行的人会让前进更有方向。”

结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主“一键四连”哦!

往期回顾

【MYSQL】MYSQL学习的一大重点:表的约束

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡
૮₍ ˶ ˊ ᴥ ˋ˶₎ა

在这里插入图片描述

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2401_89899187/article/details/163141581

文章来源crawl

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--