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. 多表查询必须加关联条件(否则笛卡尔积,数据爆炸)
相关推荐
广州灵眸科技有限公司4 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
Cloud云卷云舒7 小时前
云卷云舒:从Oracle/MySQL迁移到HaishanDB:迁移评估工具核心技术拆解
mysql·oracle·ai-native·haishandb·信创数据库替换
憧憬成为web高手7 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学7 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh9 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
用户713335851562410 小时前
MySQL - 事务、redo/undo 日志与 MVCC
mysql
z1234567898610 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD10 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo10 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程
用户713335851562411 小时前
MySQL - InnoDB 的 Buffer Pool
mysql