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

day02

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

1.1 语法格式

```sql

SELECT 字段列表 FROM 表名;

```

1.2 实战示例

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

```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

# 查询姓名为“张三”的学生信息
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

#查询姓名中含“王”字的学生(如“王五”、“王小二”等)

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

#查询学生的最大年龄

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

#查询每个班级的平均年龄

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

#按年龄升序排序

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

# 第一页(索引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

# 隐式连接(不推荐,易产生笛卡尔积)
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 数据库的绝大多数数据查询需求。后续可深入学习子查询、视图、存储过程等进阶内容,进一步提升数据库操作能力。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值