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 <> 20 或 age != 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 查询核心知识点
-
**基础查询**:`SELECT 字段 FROM 表;`,`*` 表示所有字段;
-
**条件查询**:`WHERE` 后接条件表达式,支持 `=`、`>`、`BETWEEN...AND...`、`IN`、`IS NULL` 等运算符,以及 `AND`、`OR` 逻辑组合;
-
**模糊查询**:`LIKE` 结合 `%`(任意多字符)、`_`(单个字符)实现关键词搜索;
-
**聚合查询**:`SUM`、`AVG`、`MAX`、`MIN`、`COUNT` 对数据进行统计;
-
**分组查询**:`GROUP BY` 按字段归类,结合聚合函数实现分组统计;
-
**排序查询**:`ORDER BY` 按字段升序(`ASC`)或降序(`DESC`);
-
**分页查询**:`LIMIT` 控制查询结果的起始位置和数量;
-
**多表关联**:通过 `JOIN`(内连接、左外连接、右外连接)实现多表数据关联,需通过 `ON` 避免笛卡尔积。
掌握这些 SQL 查询技巧,你已能应对 MySQL 数据库的绝大多数数据查询需求。后续可深入学习子查询、视图、存储过程等进阶内容,进一步提升数据库操作能力。