MySQL 中 SELECT 语句是数据查询的核心 ,用于从数据表或视图中获取所需数据。它的语法结构丰富,涵盖查哪些字段、从哪查、按什么条件查、分组、排序、限制条数等全流程操作。
本文结合图片知识点,从基本语法、核心子句、代码示例三个维度,带你彻底掌握 MySQL 基础查询。
一、核心语法格式
1. 完整语法结构
sql
SELECT
[DISTINCT] -- 可选:去重
{ * | <字段列表> } -- 必选:查询字段(* 代表所有字段)
FROM
<表1>, <表2>,... -- 必选:查询来源(表/视图)
[WHERE <表达式>] -- 可选:筛选条件
[GROUP BY <字段>] -- 可选:分组
[HAVING <条件>] -- 可选:过滤分组结果
[ORDER BY <字段> [ASC|DESC]] -- 可选:排序(升序/降序)
[LIMIT [<偏移量>,] <行数>]; -- 可选:限制查询条数
2. 最常用简化格式
日常开发中,80% 的场景使用简化格式即可:
sql
SELECT <字段1, 字段2,...>
FROM <表或视图>
WHERE <查询条件>;
二、各子句核心知识点(附说明)
1. SELECT:指定查询字段
*:查询所有字段 ,如SELECT * FROM student;- 字段列表 :查询指定字段,多个字段用逗号分隔,最后不加逗号 ,如
SELECT id,name,age FROM student; - 别名 :给字段起别名,方便阅读,如
SELECT name AS 姓名 FROM student;
2. FROM:指定数据来源
- 来源可以是单表、多表(逗号分隔)、视图
- 多表查询时会默认产生笛卡尔积 ,通常需配合
WHERE条件过滤
3. WHERE:筛选查询条件(必懂)
- 用于过滤行数据,只返回满足条件的记录
- 支持的运算符:
- 比较:
> < = >= <= != - 逻辑:
AND(且)、OR(或)、NOT(非) - 模糊:
LIKE(% 匹配任意字符,_匹配单个字符) - 范围:
BETWEEN...AND...
- 比较:
4. GROUP BY:分组查询
- 按指定字段分组,相同字段值的分为一组
- 常配合聚合函数使用:
COUNT()(计数)、SUM()(求和)、AVG()(平均值)、MAX()(最大值)、MIN()(最小值) - 注意 :分组后只能查询分组字段 或聚合函数结果
5. HAVING:过滤分组结果
- 用于过滤分组后 的数据(
WHERE过滤分组前,HAVING过滤分组后) - 必须配合
GROUP BY使用
6. ORDER BY:排序
- 按指定字段排序,默认升序(ASC),** 降序(DESC)** 需显式指定
- 可排序多个字段(先按字段 1 排序,再按字段 2 排序)
7. LIMIT:限制条数
- 格式 1:
LIMIT 行数→ 查询前 N 条数据 - 格式 2:
LIMIT 偏移量, 行数→ 跳过偏移量条,查询行数条(常用分页)
三、代码示例:覆盖所有核心知识点
准备数据:创建学生成绩表 score
sql
-- 创建表
CREATE TABLE score (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
subject VARCHAR(20) NOT NULL,
score INT NOT NULL,
class VARCHAR(10) NOT NULL
);
-- 插入测试数据
INSERT INTO score (name, subject, score, class) VALUES
("张三", "语文", 85, "一班"),
("张三", "数学", 92, "一班"),
("李四", "语文", 78, "二班"),
("李四", "数学", 88, "二班"),
("王五", "语文", 95, "一班"),
("赵六", "英语", 60, "三班"),
("孙七", "数学", 55, "三班");
示例 1:基础查询(查指定字段、所有字段)
sql
-- 1. 查询所有字段(* 的用法)
SELECT * FROM score;
-- 2. 查询指定字段(name + score)
SELECT name, score FROM score;
-- 3. 给字段起别名
SELECT name AS 姓名, score AS 分数 FROM score;
示例 2:带 WHERE 条件的查询(核心)
sql
-- 1. 查询一班的学生成绩(比较运算符)
SELECT name, score FROM score WHERE class = "一班";
-- 2. 查询分数大于80的学生(且排序)
SELECT name, score FROM score WHERE score > 80 ORDER BY score DESC;
-- 3. 模糊查询:查姓"张"的学生(LIKE 通配符)
SELECT name FROM score WHERE name LIKE "张%";
-- 4. 范围查询:查询分数在60-90之间的学生
SELECT name, score FROM score WHERE score BETWEEN 60 AND 90;
-- 5. 多条件查询:一班且分数大于80
SELECT name, score FROM score WHERE class = "一班" AND score > 80;
示例 3:GROUP BY 分组 + 聚合函数
sql
-- 1. 按班级分组,统计每个班的学生人数(COUNT)
SELECT class, COUNT(*) AS 学生人数 FROM score GROUP BY class;
-- 2. 按班级分组,计算每个班的平均分(AVG)
SELECT class, AVG(score) AS 平均分 FROM score GROUP BY class;
-- 3. 按姓名分组,统计每个学生的总分(SUM)
SELECT name, SUM(score) AS 总分 FROM score GROUP BY name;
示例 4:HAVING 过滤分组结果
sql
-- 需求:查询学生总分大于150的学生(先分组,再过滤)
SELECT name, SUM(score) AS 总分
FROM score
GROUP BY name
HAVING SUM(score) > 150;
示例 5:ORDER BY 排序 + LIMIT 限制条数
sql
-- 1. 查询所有成绩,按分数降序排序
SELECT * FROM score ORDER BY score DESC;
-- 2. 查询分数最高的前3条数据(LIMIT)
SELECT * FROM score ORDER BY score DESC LIMIT 3;
-- 3. 分页查询:跳过前2条,查询接下来3条(LIMIT 偏移量,行数)
SELECT * FROM score LIMIT 2, 3;
示例 6:多表查询(笛卡尔积 + 过滤)
sql
-- 模拟:创建另一张表 student_info(学生基本信息)
CREATE TABLE student_info (
name VARCHAR(20) PRIMARY KEY,
age INT,
gender VARCHAR(5)
);
INSERT INTO student_info VALUES ("张三", 18, "男"), ("李四", 19, "女");
-- 多表查询:从score和student_info中查数据,关联条件是name
SELECT s.name, s.score, si.age
FROM score s, student_info si
WHERE s.name = si.name;
四、运行结果说明
示例 1 结果
SELECT * FROM score;:返回表中所有 8 条数据的所有字段SELECT name, score FROM score;:只返回姓名和分数两列
示例 2 结果
- 一班学生:张三、王五的成绩
- 分数大于 80:按降序显示(95、92、88、85)
示例 3 结果
- 一班:3 人,平均分 86.67;二班:2 人,平均分 83;三班:2 人,平均分 57.5
示例 4 结果
- 仅返回总分大于 150 的学生(无,示例数据中无)
示例 5 结果
- 降序排序:40、35、30...
- 前 3 条:分数最高的 3 个学生
- 分页:跳过 2 条,查第 3-5 条
示例 6 结果
- 关联后显示:张三(85,18)、张三(92,18)、李四(78,19)、李四(88,19)
五、核心总结(口诀版)
- SELECT 查字段,FROM 找表源;
- WHERE 筛行,GROUP 分群;
- HAVING 滤组,ORDER 排序;
- LIMIT 限条,DISTINCT 去重;
- 聚合函数 COUNT/SUM/AVG,分组必用它。
关键注意事项
WHERE不能用聚合函数过滤(如WHERE COUNT(*) > 5报错),必须用HAVING- 分组查询中,只能查分组字段 + 聚合函数
LIMIT是 MySQL 特有语法,分页核心- 多表查询必须加关联条件(否则笛卡尔积,数据爆炸)