Mysql 01:基础查询(SELECT)全解——从单表到多字段的完整语法

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)

五、核心总结(口诀版)

  1. SELECT 查字段,FROM 找表源;
  2. WHERE 筛行,GROUP 分群;
  3. HAVING 滤组,ORDER 排序;
  4. LIMIT 限条,DISTINCT 去重;
  5. 聚合函数 COUNT/SUM/AVG,分组必用它。

关键注意事项

  1. WHERE 不能用聚合函数过滤(如 WHERE COUNT(*) > 5 报错),必须用 HAVING
  2. 分组查询中,只能查分组字段 + 聚合函数
  3. LIMIT 是 MySQL 特有语法,分页核心
  4. 多表查询必须加关联条件(否则笛卡尔积,数据爆炸)
相关推荐
猿小喵2 小时前
记录一次从库并行回放出现死锁的问题
数据库·mysql·tdsql
随风,奔跑2 小时前
Redis
数据库·redis·缓存
IvorySQL2 小时前
2MB 的 PostgreSQL work_mem,如何吃掉 2TB 内存?
数据库·postgresql·开源
桑榆肖物2 小时前
有字幕,没配音?用浏览器自带语音能力,让网页视频直接“开口说话”
数据库·edge·音视频·tts
熬夜的咕噜猫3 小时前
MySQL主从复制与读写分离
网络·数据库·mysql
道清茗3 小时前
【MySQL知识点问答题】 备份技术、Invisible Indexes 和直方图的应用
数据库·mysql
芒果披萨3 小时前
sql存储过程
java·开发语言·数据库
J超会运3 小时前
OpenEuler MySQL主从复制+MyCat读写分离实战
mysql·读写分离·主从复制
jnrjian3 小时前
RAC 去除node的建议 dbca 和手动方法
数据库·oracle