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. 多表查询必须加关联条件(否则笛卡尔积,数据爆炸)
相关推荐
Mahir0813 小时前
Redis 与 MySQL 数据同步:一致性保证的完整解决方案
数据库·redis·mysql·缓存·面试·数据一致性
2301_7693406714 小时前
如何在 Vuetify 中可靠捕获 Chip 关闭事件(包括键盘触发).txt
jvm·数据库·python
AC赳赳老秦14 小时前
供应链专员提效:OpenClaw自动跟踪物流信息、更新库存数据,异常自动提醒
java·大数据·服务器·数据库·人工智能·自动化·openclaw
·醉挽清风·14 小时前
学习笔记—MySQL—库表操作
笔记·学习·mysql
灵犀学长14 小时前
基于 Spring ThreadPoolTaskScheduler + CronTrigger 实现的动态定时任务调度系统
java·数据库·spring
北秋,15 小时前
PostgreSQL(Postgres)数据库基础用法 + 数字型 + 字符型 完整联合注入实战
数据库·postgresql·开源
m0_5967490915 小时前
JavaScript中手动实现一个new操作符的底层逻辑
jvm·数据库·python
多加点辣也没关系15 小时前
Redis 的安装(详细教程)
数据库·redis·缓存
数据库小学妹16 小时前
数据库连接池避坑指南:告别“连接超时”与“资源耗尽”,让系统跑得更快!
数据库·redis·sql·mysql·缓存·dba
dishugj16 小时前
HANA 数据库备份与恢复
数据库·oracle