MySQL查询核心知识点总结(从常见用法到避坑指南)
前言
MySQL 查询是数据库操作的核心,也是日常开发、面试高频考点,无论是单表的基础筛选统计,还是多表的关联查询、子查询,都是必须吃透的核心技能。本文整合了 MySQL 单表查询 + 多表查询的所有核心知识点,从基础语法到高阶用法,从语法规则到执行原理,从常见用法到避坑指南,层层递进、干货满满,零基础也能轻松看懂,适合新手入门巩固,也适合开发人员查漏补缺,建议收藏备查!
一、单表查询(基础核心,重中之重)
单表查询是 MySQL 查询的基础,所有复杂的多表查询都是单表查询的组合与延伸,核心是对一张数据表完成筛选、统计、排序、分页等操作,掌握单表查询的所有语法,是学好 MySQL 查询的前提。
1.1 简单查询:基础数据检索
核心作用:查询表中指定列 / 所有列数据,支持字段别名、数据去重,是最基础的查询语法。
- 查询所有列:
SELECT * FROM 表名;(快捷写法,开发中尽量少用,性能较差) - 查询指定列:
SELECT 列1, 列2, 列3 FROM 表名;(推荐写法,按需查询,减少数据传输) - 字段 / 表起别名:
SELECT 列名 AS 别名 FROM 表名 AS 表别名;,别名简化 SQL 书写,若别名与 MySQL 关键字冲突,用反引号 `` 包裹即可,例:SELECT id ASdescFROM products; - 数据去重:
SELECT DISTINCT 列名 FROM 表名;,注意:DISTINCT 仅对指定列去重,需写在字段前;多列去重时,只有所有列的值完全相同才会去重。
1.2 条件查询:精准筛选目标数据
核心作用:根据指定条件筛选表中符合要求的数据行,是查询中使用频率最高的语法,没有之一。基础语法:SELECT 字段 FROM 表名 WHERE 筛选条件;条件查询的核心是掌握各类运算符的使用,所有运算符可直接组合使用,满足多条件筛选需求,分类整理如下:
- 比较运算符:
=、>、<、>=、<=、!=、<>(后两者均表示不等于) - 逻辑运算符:
AND(并且,多条件同时满足)、OR(或者,任一条件满足)、NOT(取反,排除指定条件) - 范围查询:
BETWEEN 最小值 AND 最大值(连续范围,包含边界值)、IN(值1,值2,值3)(非连续指定值范围) - 模糊查询:
LIKE搭配通配符使用,适配模糊匹配场景%匹配任意多个任意字符,例:name LIKE '华为%'匹配所有华为开头的商品名_匹配任意一个字符,例:name LIKE '__14'匹配名称为两个字符 + 14 的内容
- 空值判断:
IS NULL(查询空值)、IS NOT NULL(查询非空值)
✅ 核心避坑:空值判断绝对不能使用
=或!=,MySQL 中 NULL 代表无数据,不是一个具体值,用等号判断永远返回 false。
1.3 排序查询:对结果按需排序
核心作用:将查询结果按指定列进行升序 / 降序排列,支持多列排序,让数据展示更有规律。基础语法:SELECT 字段 FROM 表名 ORDER BY 列1 [ASC/DESC], 列2 [ASC/DESC];
- 排序规则:
ASC为升序(默认值,可省略),DESC为降序,必须写在排序字段后 - 多列排序规则:先按第一列排序,当第一列的值相同时,再按第二列排序,以此类推
- 注意事项:当 SELECT 指定查询列时,排序字段必须存在于查询结果中,否则会报错。
1.4 聚合函数:对数据做统计计算
核心作用:对表中一列的数据进行批量统计计算,返回唯一的统计结果,是数据统计的核心工具,也叫分组函数。MySQL 的 5 个常用聚合函数,必背必掌握,无例外:
COUNT(列名):统计指定列的非 NULL 值行数;COUNT(*)统计表中所有行数(包含 NULL 值,最常用)MAX(列名):计算指定列的最大值MIN(列名):计算指定列的最小值SUM(列名):计算指定列的数值总和(仅对数值型字段生效)AVG(列名):计算指定列的平均值(仅对数值型字段生效)
✅ 核心特性:所有聚合函数都会自动忽略 NULL 值,只对有效数据进行计算,无需手动过滤空值。
1.5 分组查询:分组统计,按类聚合
核心作用:将表中数据按指定列进行分组,对每个分组分别使用聚合函数做统计,是「分类统计」的核心语法,比如:按商品分类统计商品数量、按部门统计平均薪资。基础语法:SELECT 分组列, 聚合函数(列名) FROM 表名 GROUP BY 分组列;
- 多列分组:支持按多个字段组合分组,例:
GROUP BY 列1, 列2,表示只有当列 1 和列 2 的值都相同时,才归为同一组 - 分组后过滤:
HAVING 筛选条件,专门用于过滤分组后的统计结果,语法:SELECT 分组列,聚合函数 FROM 表名 GROUP BY 分组列 HAVING 聚合函数条件;
✅ 重中之重:
WHERE和HAVING的区别(面试高频考点)
- 执行时机不同:
WHERE是分组前过滤,过滤的是原始数据行;HAVING是分组后过滤,过滤的是分组的统计结果 - 功能限制不同:
WHERE后不能使用聚合函数,只能用普通字段做条件;HAVING后支持聚合函数,也是唯一能过滤聚合结果的方式 - 语法规则:分组查询中,SELECT 后只能写「分组列」和「聚合函数的统计结果」,不能写其他无关字段,否则会报数据歧义错误。
1.6 LIMIT 查询:分页 + 截取结果,万能分页语法
核心作用:限制查询结果的返回行数,实现分页查询、获取 TopN 数据(比如:查询价格最高的 3 个商品),是开发中分页功能的核心实现方式,MySQL 专属语法。基础语法:SELECT 字段 FROM 表名 LIMIT M, N;
- 参数说明:
M是起始行索引(从 0 开始,代表第 M+1 行),N是需要查询的条数 - 核心用法:
- 分页公式:
M = (页码 - 1) * 每页条数,例:第 2 页、每页展示 3 条数据 →LIMIT 3,3 - 获取 TopN 数据:搭配排序使用,例:查询价格最高的 1 个商品 →
SELECT * FROM products ORDER BY price DESC LIMIT 0,1
- 分页公式:
- 注意:当查询范围超出表中数据行数时,不会报错,仅返回空结果集。
1.7 SQL 执行顺序(核心重点,封神知识点)
这是单表查询的灵魂知识点,也是解决复杂查询问题、排查 SQL 错误的核心依据,语法书写顺序 ≠ 实际执行顺序,牢记这个执行流程,所有单表查询的逻辑都会豁然开朗,面试必考,开发必用!
官方标准执行顺序(优先级从高到低)
FROM → WHERE → GROUP BY → 聚合函数 → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT简单理解执行逻辑:先找到要查询的表 → 筛选符合条件的原始数据 → 分组 → 统计计算 → 过滤分组结果 → 选择要展示的字段 → 去重 → 排序 → 最后截取指定行数。
二、多表查询(进阶核心,开发必备)
实际开发中,业务数据不可能只存在于一张表中,比如:商品数据在商品表、分类数据在分类表、用户数据在用户表,想要查询关联数据,就必须使用多表查询。多表查询是 MySQL 查询的进阶内容,也是面试的重点难点,核心围绕「表关系」和「关联方式」展开,吃透表关系,多表查询就成功了一半。
2.1 表与表之间的三大核心关系(基础中的基础)
数据库中表与表的所有关联逻辑,都基于以下 3 种关系,理解关系,才能选对关联方式,无例外!所有业务场景均可套入这 3 种关系:
一对多(One To Many)【最常见】
- 定义:A 表的一行数据,对应 B 表的多行数据;B 表的一行数据,仅对应 A 表的一行数据
- 示例:分类表 → 商品表(一个分类对应多个商品,一个商品仅属于一个分类)、部门表 → 员工表
- 关联规则:在「多」的一方的表中添加外键字段,关联「一」的一方的主键。
多对多(Many To Many)
- 定义:A 表的一行数据,对应 B 表的多行数据;B 表的一行数据,也对应 A 表的多行数据
- 示例:学生表 → 课程表(一个学生选多门课,一门课被多个学生选)、用户表 → 商品表(收藏关系)
- 关联规则:必须创建中间关系表,中间表中至少包含两个外键,分别关联两张表的主键,通过中间表实现两张表的关联查询。
一对一(One To One)
- 定义:A 表的一行数据,仅对应 B 表的一行数据;B 表的一行数据,也仅对应 A 表的一行数据
- 示例:员工基础信息表 → 员工详细信息表、用户表 → 身份证信息表
- 关联规则:将一张表的主键,作为另一张表的外键,且该外键字段设置为唯一约束。
2.2 外键与外键约束
2.2.1 外键定义
若表 A(主表)的主键,被表 B(从表)的某个字段引用,则表 B 的这个字段就是「外键」,外键的核心作用是建立两张表的关联关系。
2.2.2 外键约束的作用
外键约束是数据库层面的一种规则,目的是保证数据的完整性和准确性:
- 插入数据时:从表的外键值,必须是主表主键中已存在的值,否则无法插入(比如:不能给商品添加一个不存在的分类 ID)
- 删除数据时:主表中被引用的主键值,无法直接删除,必须先删除从表中关联的外键数据,否则无法删除。
2.2.3 外键的实际开发建议
- 语法支持:只有 InnoDB 存储引擎支持外键约束,MyISAM 不支持
- 约束缺点:外键约束会增加开发难度,同时降低数据的增删改性能(数据库需要校验关联关系)
- 行业规范:实际开发中,极少使用物理外键约束,而是通过「业务代码逻辑」保证表之间的数据一致性,既保证性能,又灵活可控。
2.3 关联查询:多表查询的核心实现方式
关联查询是多表查询的主流写法,核心是通过指定的「关联条件」,将多张表拼接成一张临时的大表,再进行筛选、统计等操作,所有关联查询的核心语法都是:SELECT 字段 FROM 左表 [关联类型] 右表 ON 关联条件;
2.3.1 笛卡尔积(交叉连接)- 了解即可
无条件的多表关联,左表的每一行数据都会和右表的每一行数据拼接,结果行数 = 左表行数 × 右表行数,数据冗余极大,几乎不会直接使用,仅需了解概念即可。语法:SELECT * FROM 表1,表2; 或 SELECT * FROM 表1 CROSS JOIN 表2;
2.3.2 四种核心关联方式(必背必掌握,开发高频)
这是多表查询的重中之重,四种关联方式的区别,是面试和开发的核心考点,必须吃透定义 + 使用场景,精准区分!所有关联查询的关联条件,都用ON关键字指定,WHERE仅用于过滤关联后的结果。
内连接(INNER JOIN,可简写为 JOIN)- 交集查询
- 定义:只返回两张表中满足关联条件的交集数据,无匹配的数据全部舍弃
- 使用场景:查询「有对应关系」的数据,比如:查询有分类的商品、有部门的员工
- 核心特征:只展示匹配成功的数据,最常用的关联方式。
左连接(LEFT JOIN / LEFT OUTER JOIN)- 左表全量展示
- 定义:返回左表的所有数据 + 两张表满足关联条件的交集数据;右表无匹配数据时,对应字段填充 NULL
- 使用场景:查询「左表的全部数据」,无论是否有右表的关联数据,比如:查询所有分类,以及分类下的商品(无商品的分类也展示)
右连接(RIGHT JOIN / RIGHT OUTER JOIN)- 右表全量展示
- 定义:返回右表的所有数据 + 两张表满足关联条件的交集数据;左表无匹配数据时,对应字段填充 NULL
- 使用场景:与左连接相反,查询「右表的全部数据」,比如:查询所有商品,以及商品对应的分类(无分类的商品也展示)
全连接(FULL JOIN)- 全量数据展示
- 定义:返回左表的所有数据 + 右表的所有数据,无匹配的字段填充 NULL
- 注意:MySQL 原生不支持 FULL JOIN,需通过「左连接 UNION 右连接」实现该效果。
✅ 核心技巧:左连接和右连接可以互相转换,只需调整两张表的位置即可,实际开发中左连接使用频率更高。
2.3.3 自关联查询 - 特殊的关联查询
定义:将同一张表,当作两张不同的表进行关联查询,必须给表起不同的别名区分,本质还是上述的关联方式。核心场景:处理层级数据,最典型的就是「省 - 市 - 区县」三级地区查询,地区表中包含id(地区 ID)、title(地区名称)、pid(父级地区 ID),通过pid关联本表的id,实现层级查询。语法特征:SELECT 字段 FROM 表名 a JOIN 表名 b ON a.id = b.pid; (a、b 为表的别名,必须设置)
2.4 子查询:嵌套查询,化繁为简
2.4.1 子查询定义
在一个 SELECT 语句中,嵌套了另一个 SELECT 语句,被嵌套的查询称为「子查询」,外层的查询称为「主查询」;子查询必须用括号 () 包裹,执行顺序永远是:先执行子查询,再执行主查询。
2.4.2 子查询的三大核心作用(开发全覆盖)
子查询的核心是「辅助主查询」,为主查询提供数据支撑,所有复杂的查询需求,都可以通过子查询拆解为简单的小查询,三种作用全覆盖所有使用场景,无遗漏:
- 子查询充当主查询的筛选条件【最常用】:子查询返回一个值 / 一组值,主查询通过比较运算符 / IN 等使用该结果,例:查询价格高于所有商品平均价的商品 →
SELECT * FROM products WHERE price > (SELECT AVG(price) FROM products); - 子查询充当主查询的数据源:子查询返回的结果集,当作一张「临时表」供主查询使用,需给临时表起别名,例:查询指定分类的商品,再关联分类表获取分类名称。
- 子查询充当主查询的查询字段:子查询返回一个值,作为主查询的一个字段展示,例:查询每个商品的名称,以及对应的分类名称。
✅ 子查询与关联查询的关系:两者可以互相转换,简单需求用子查询更简洁,复杂多表关联用关联查询性能更高,开发中按需选择即可。
三、MySQL 查询核心注意事项 + 避坑指南 + 性能优化(加分项,必看)
掌握了语法和规则,还要避开常见错误、优化查询性能,这部分内容是区分「新手」和「老手」的关键,也是面试中加分的核心知识点,所有注意事项均为高频踩坑点,建议熟记!
3.1 语法规范:规范书写,避免低级错误
- MySQL 的关键字(SELECT、FROM、WHERE 等)不区分大小写,但建议统一大写,字段名和表名小写,SQL 可读性更高。
- 字段名、表名若与 MySQL 关键字(如 desc、order)冲突,必须用反引号 `` 包裹,否则会报错。
- 所有聚合函数、分组、排序的语法,都严格遵循执行顺序,切勿颠倒书写。
3.2 常见高频错误(90% 的新手都会踩坑)
- 分组查询时,SELECT 后写了非分组列、也未用聚合函数包裹 → 数据歧义,直接报错。
- WHERE 条件中使用聚合函数 → 语法错误,聚合函数只能用在 SELECT、HAVING 中,如需用聚合结果做条件,改用子查询。
- 空值判断用
= NULL或!= NULL→ 永远查询不到结果,必须用IS NULL/IS NOT NULL。 - 多表关联时,忘记写 ON 关联条件 → 产生笛卡尔积,数据量爆炸,性能极差。
- 自关联查询时,不给表起别名 → 数据库无法区分表,直接报错。
3.3 性能优化:开发必用的查询优化技巧
- ** 杜绝使用 SELECT ***:按需查询指定字段,减少数据库的数据传输量,提升查询速度,这是最基础也是最有效的优化方式。
- 大表查询,先过滤再处理:对数据量较大的表,优先用 WHERE 过滤掉无用数据,再进行分组、关联、排序,减少后续处理的数据量。
- 慎用外键约束:如前文所述,用业务代码代替物理外键,提升数据的增删改性能。
- 分页查询必搭配排序:LIMIT 本身不会排序,分页时不加 ORDER BY,返回的结果顺序可能混乱,建议固定排序字段。
3.4 高频工具类技巧
- 分页公式:
LIMIT (页码-1)*每页条数, 每页条数,开发中分页功能的万能公式,无例外。 - DISTINCT 去重规则:多列去重时,只有所有列的值完全相同,才会被判定为重复数据。
- 聚合函数 COUNT 的选择:统计行数时,用
COUNT(*)比COUNT(列名)更高效,且不会受 NULL 值影响。
四、总结
MySQL 查询的核心逻辑,其实可以总结为一句话:单表查数据,多表查关联,统计用聚合,筛选用条件,排序分页定结果。
到此这篇关于MySQL查询核心知识点总结)的文章就介绍到这了,更多相关MySQL查询核心知识点内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
mysqld_exporter+Prometheus+Grafana 配置小结
本文主要介绍了mysqld_exporter+Prometheus+Grafana 配置,实现了对MySQL数据库的监控和可视化展示,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2025-05-05


最新评论