MySQL 数据库进阶:SQL 查询语句全解析

day02

一、基础查询:从表中获取数据

1.1 语法格式

```sql

SELECT 字段列表 FROM 表名;

```

1.2 实战示例

假设存在 `student` 表,包含字段 `id`、`name`、`sex`、`age`、`class_num`,演示基础查询:

```sql

sql 复制代码
#查询所有字段(* 表示所有字段)

SELECT * FROM student;

#查询指定字段(姓名、性别)

SELECT name, sex FROM student;

#查询指定字段(姓名、性别、年龄)

SELECT name, sex, age FROM student;

```

**说明**:MySQL 不区分大小写,`SELECT`、`From` 等关键字大写小写均可,但建议统一风格(如关键字大写,表名字段小写)。

二、条件查询:筛选符合条件的数据

2.1 语法格式

```sql

SELECT 字段列表 FROM 表名 WHERE 条件表达式;

```

2.2 常用条件运算符

运算符 含义 示例
= 等于 name = '张三'
> 大于 age > 20
< 小于 age < 20
>= 大于等于 age >= 20
<= 小于等于 age <= 20
<>!= 不等于 age <> 20age != 20
BETWEEN...AND... 区间(闭区间) age BETWEEN 20 AND 22
IN(值列表) 匹配多个值 id IN (1,2,3,4)name IN ('张三','李四')
IS NULL 字段为空 class_num IS NULL
IS NOT NULL 字段不为空 class_num IS NOT NULL
AND 逻辑与(多个条件同时满足) class_num = '20201001' AND sex = '男'
OR 逻辑或(多个条件满足其一) sex = '女' OR class_num = '20201001'

2.3 实战示例

```sql

sql 复制代码
# 查询姓名为"张三"的学生信息
SELECT * FROM student WHERE name = '张三';
# 查询年龄大于20岁的学生信息
SELECT * FROM student WHERE age > 20;
# 查询年龄不等于20岁的学生信息
SELECT * FROM student WHERE age <> 20; # 或 age != 20
# 查询年龄在20到22岁之间的学生信息
SELECT * FROM student WHERE age BETWEEN 20 AND 22;
# 查询id为1、2、3、4的学生信息
SELECT * FROM student WHERE id IN (1,2,3,4);
# 查询姓名为"张三"、"李四"、"王五"的学生信息
SELECT * FROM student WHERE name IN ('张三','李四','王五');
# 查询class_num字段为空的学生信息
SELECT * FROM student WHERE class_num IS NULL;
# 查询20201001班的男同学信息
SELECT * FROM student WHERE class_num = '20201001' AND sex = '男';
# 查询20201001班的男同学或其他班的女同学信息
SELECT * FROM student WHERE (sex = '女' AND class_num != '20201001') OR (class_num = '20201001' AND sex = '男');

```

三、模糊查询:按关键词搜索

3.1 语法格式

```sql

SELECT 字段列表 FROM 表名 WHERE 字段 LIKE '通配符表达式';

```

3.2 通配符说明

  • `%`:匹配**任意多个字符**(包括0个);

  • `_`:匹配**单个字符**。

3.3 实战示例

```sql

sql 复制代码
#查询姓名中含"王"字的学生(如"王五"、"王小二"等)

SELECT * FROM student WHERE name LIKE '王%';

#查询姓名为两个字且姓"王"的学生(如"王五")

SELECT * FROM student WHERE name LIKE '王_';

#查询姓名中第二个字为"小"的学生(如"王小二")

SELECT * FROM student WHERE name LIKE '_小%';

```

四、聚合查询:对数据进行统计

4.1 常用聚合函数

函数 含义 示例
SUM(字段) 求和 SUM(score)(假设存在 score 字段)
AVG(字段) 求平均值 AVG(age)
MAX(字段) 求最大值 MAX(age)
MIN(字段) 求最小值 MIN(age)
COUNT(字段)COUNT(*) 统计记录数 COUNT(*)(统计所有记录)、COUNT(class_num)(统计 class_num 非 NULL 的记录)

4.2 实战示例

```sql

sql 复制代码
#查询学生的最大年龄

SELECT MAX(age) FROM student;

#查询学生的平均年龄

SELECT AVG(age) FROM student;

#查询学生表的总记录数(含NULL字段)

SELECT COUNT(*) FROM student;

#查询class_num字段非NULL的记录数

SELECT COUNT(class_num) FROM student;

```

五、分组查询:按字段归类统计

5.1 语法格式

```sql

SELECT 聚合字段/分组字段 FROM 表名 GROUP BY 分组字段;

```

5.2 实战示例

```sql

sql 复制代码
#查询每个班级的平均年龄

SELECT AVG(age) AS avg_age, class_num

FROM student

GROUP BY class_num;

#查询每个班级、每个性别的学生数量

SELECT COUNT(*) AS sex_count, sex, class_num

FROM student

GROUP BY class_num, sex;

```

六、排序查询:控制数据展示顺序

6.1 语法格式

```sql

SELECT 字段列表 FROM 表名 ORDER BY 排序字段 [ASC|DESC];

```

  • `ASC`:升序(默认,可省略);

  • `DESC`:降序。

6.2 实战示例

```sql

sql 复制代码
#按年龄升序排序

SELECT * FROM student ORDER BY age;

#按年龄降序排序

SELECT * FROM student ORDER BY age DESC;

#多字段排序:先按班级升序,再按年龄降序

SELECT * FROM student ORDER BY class_num ASC, age DESC;

```

七、分页查询:限制查询结果数量

7.1 语法格式

```sql

SELECT 字段列表 FROM 表名 LIMIT 起始索引, 每页条数;

```

  • 起始索引从 `0` 开始;

  • 若仅写一个参数,表示"每页条数",起始索引默认 `0`。

7.2 实战示例(假设每页显示5条数据)

```sql

sql 复制代码
# 第一页(索引0,取5条)
SELECT * FROM student LIMIT 0,5;
# 第二页(索引5,取5条)
SELECT * FROM student LIMIT 5,5;
# 第三页(索引10,取5条)
SELECT * FROM student LIMIT 10,5;
# 简化写法(效果同上)
SELECT * FROM student LIMIT 5 OFFSET 0; # 第一页
SELECT * FROM student LIMIT 5 OFFSET 5; # 第二页
SELECT * FROM student LIMIT 5 OFFSET 10; # 第三页

```

**前端对接逻辑**:若前端传递 `pageIndex`(页码,从1开始)和 `pageSize`(每页条数),则 SQL 可写为:

```sql

SELECT * FROM student LIMIT pageSize OFFSET (pageIndex-1)*pageSize;

```

八、多表关联查询:连接多张表的数据

8.1 笛卡尔积现象

若多表连接时无连接条件,结果会是"表1记录数 × 表2记录数"的乘积,称为**笛卡尔积**,需通过连接条件避免。

8.2 连接方式

(1)内连接(`INNER JOIN` 或 `JOIN`)

  • 只查询**两张表相交部分**的数据。

  • 语法:`SELECT 字段 FROM 表1 INNER JOIN 表2 ON 连接条件;`

(2)左外连接(`LEFT JOIN` 或 `LEFT OUTER JOIN`)

  • 查询**左表所有记录**,右表匹配不到的字段为 `NULL`。

  • 语法:`SELECT 字段 FROM 表1 LEFT JOIN 表2 ON 连接条件;`

(3)右外连接(`RIGHT JOIN` 或 `RIGHT OUTER JOIN`)

  • 查询**右表所有记录**,左表匹配不到的字段为 `NULL`。

  • 语法:`SELECT 字段 FROM 表1 RIGHT JOIN 表2 ON 连接条件;`

8.3 实战示例(假设存在 `student` 表和 `class` 表,`student.class_num` 关联 `class.class_num`)

```sql

sql 复制代码
# 隐式连接(不推荐,易产生笛卡尔积)
SELECT s.name, c.class_name
FROM student s, class c
WHERE s.class_num = c.class_num AND s.name = '张三';
# 显式内连接(推荐)
SELECT s.name, c.class_name
FROM student s
INNER JOIN class c
ON s.class_num = c.class_num
WHERE s.name = '张三';
# 左外连接:查询所有学生(含无班级的学生)及对应的班级名称
SELECT s.*, c.class_name
FROM student s
LEFT JOIN class c
ON s.class_num = c.class_num;
# 右外连接:查询所有班级(含无学生的班级)及对应的学生
SELECT c.*, s.name
FROM student s
RIGHT JOIN class c
ON s.class_num = c.class_num;

```

九、总结:SQL 查询核心知识点

  1. **基础查询**:`SELECT 字段 FROM 表;`,`*` 表示所有字段;

  2. **条件查询**:`WHERE` 后接条件表达式,支持 `=`、`>`、`BETWEEN...AND...`、`IN`、`IS NULL` 等运算符,以及 `AND`、`OR` 逻辑组合;

  3. **模糊查询**:`LIKE` 结合 `%`(任意多字符)、`_`(单个字符)实现关键词搜索;

  4. **聚合查询**:`SUM`、`AVG`、`MAX`、`MIN`、`COUNT` 对数据进行统计;

  5. **分组查询**:`GROUP BY` 按字段归类,结合聚合函数实现分组统计;

  6. **排序查询**:`ORDER BY` 按字段升序(`ASC`)或降序(`DESC`);

  7. **分页查询**:`LIMIT` 控制查询结果的起始位置和数量;

  8. **多表关联**:通过 `JOIN`(内连接、左外连接、右外连接)实现多表数据关联,需通过 `ON` 避免笛卡尔积。

掌握这些 SQL 查询技巧,你已能应对 MySQL 数据库的绝大多数数据查询需求。后续可深入学习子查询、视图、存储过程等进阶内容,进一步提升数据库操作能力。

相关推荐
光泽雨3 小时前
python学习基础
开发语言·数据库·python
让学习成为一种生活方式3 小时前
Pfam 数据库详解--生信工具60
数据库
q***49864 小时前
数据库操作与数据管理——Rust 与 SQLite 的集成
数据库·rust·sqlite
川西胖墩墩4 小时前
流程图在算法设计中的实战应用
数据库·论文阅读·人工智能·职场和发展·流程图
clownAdam5 小时前
MongoDB-cdc原理
数据库·mongodb
玄妙之门6 小时前
项目实战中redis和数据库结合提升缓存效率
数据库·redis·缓存
The best are water6 小时前
MySQL FEDERATED引擎跨服务器数据同步完整方案
android·服务器·mysql
q***4646 小时前
maven导入spring框架
数据库·spring·maven
得物技术6 小时前
一文解析得物自建 Redis 最新技术演进
数据库·redis·云计算
沐浴露z6 小时前
一张思维导图理清 【MySQL】
数据库·mysql