MySQL 数据库进阶:SQL 数据操作与子查询

day03

一、子查询:嵌套在查询中的查询

子查询(Subquery)是指**嵌套在其他 SQL 语句中的查询语句**,通常用于复杂的条件筛选或多表关联场景。子查询的结果可以作为主查询的条件、数据源或计算字段。

1.1 子查询的基本语法

```sql

sql 复制代码
SELECT 字段列表

FROM (子查询语句) AS 别名

WHERE 条件;

```

1.2 子查询的实战示例

示例 1:简单子查询作为数据源

```sql

-- 从学生表中查询姓名、性别、年龄,再筛选出姓名为'张三'的记录

sql 复制代码
SELECT t1.name

FROM (SELECT name, sex, age FROM student) AS t1

WHERE t1.name = '张三';

```

示例 2:多表关联的子查询

假设存在三张表:

  • `student`(学生表):`sno`(学号)、`name`(姓名)等

  • `relationship`(学生-课程关系表):`sno`(学号)、`cno`(课程号)

  • `course`(课程表):`cno`(课程号)、`gradeName`(课程名)

需求:查询所有选择了"语文"课程的学生信息

```sql

sql 复制代码
SELECT t1.*, course.gradeName

FROM (

#子查询:关联学生表和关系表,获取学生信息及所选课程号

SELECT student.*, relationship.cno

FROM student

LEFT JOIN relationship

ON student.sno = relationship.sno

) AS t1

#主查询:关联子查询结果和课程表,筛选出语文课

LEFT JOIN course

ON t1.cno = course.cno

WHERE course.gradeName = '语文';

```

**说明**:子查询的结果被视为一张临时表(需指定别名,如 `t1`),主查询可像操作普通表一样使用这张临时表。

二、数据添加:INSERT 语句

INSERT 语句用于向表中添加新数据,支持单行添加和多行添加两种方式。

2.1 单行添加

语法

```sql

sql 复制代码
INSERT INTO 表名(列1, 列2, 列3, ...)

VALUES('值1', '值2', '值3', ...);

```

示例

```sql

-- 向student表添加一条学生记录

sql 复制代码
INSERT INTO student(name, sex, age, sno, class_num)

VALUES ('张三', '男', 18, '10001', '20201004');

```

2.2 多行添加

语法

```sql

sql 复制代码
INSERT INTO 表名(列1, 列2, 列3, ...)

VALUES

('值1', '值2', '值3', ...),

('值1', '值2', '值3', ...),

('值1', '值2', '值3', ...); #多个值列表用逗号分隔

```

示例

```sql

sql 复制代码
#向student表添加多条学生记录

INSERT INTO student(name, sex, age, sno, class_num)

VALUES

('张三', '男', 18, '10001', '20201004'),

('李四', '女', 19, '10002', '20201004'),

('王五', '男', 18, '10003', '20201005');

```

**注意**:

  • 列名顺序需与值列表顺序一致;

  • 若省略列名,则值列表需包含表中所有字段(按表结构顺序);

  • 字符串类型的值需用单引号 `'` 包裹;

  • 自增主键(如 `id`)通常无需手动指定值,数据库会自动生成。

三、数据修改:UPDATE 语句

UPDATE 语句用于修改表中已存在的数据,需通过 `WHERE` 子句指定修改范围(否则会修改表中所有记录)。

3.1 语法

```sql

sql 复制代码
UPDATE 表名

SET 列名1 = 新值1, 列名2 = 新值2, ...

WHERE 条件; #不写WHERE会修改所有记录,谨慎操作!

```

3.2 示例

```sql

sql 复制代码
# 将id=2的学生姓名改为'双手合十',年龄改为22,性别改为'女'

UPDATE student

SET name = '双手合十', age = 22, sex = '女'

WHERE id = 2;

#将20201004班所有学生的年龄增加1岁

UPDATE student

SET age = age + 1

WHERE class_num = '20201004';

```

**警告**:`UPDATE` 语句如果不带 `WHERE` 条件,会修改表中**所有记录**,执行前务必确认条件是否正确!

四、数据删除:DELETE、TRUNCATE 与 DROP

4.1 DELETE 语句:删除部分或全部记录

语法

```sql

sql 复制代码
DELETE FROM 表名

WHERE 条件; #不写WHERE会删除表中所有记录

```

示例

```sql

sql 复制代码
# 删除id=1的学生记录

DELETE FROM student

WHERE id = 1;

#删除20201005班的所有学生记录

DELETE FROM student

WHERE class_num = '20201005';

```

4.2 TRUNCATE 语句:清空表中所有记录

语法

```sql

TRUNCATE TABLE 表名;

```

示例

```sql

清空class表中所有记录(保留表结构)

TRUNCATE TABLE class;

```

4.3 DROP 语句:彻底删除表

语法

```sql

DROP TABLE 表名;

```

示例

```sql

-- 彻底删除relationship表(包括表结构和所有数据)

DROP TABLE relationship;

```

4.4 DELETE、TRUNCATE 与 DROP 的区别

操作 功能描述 是否保留表结构 效率 是否可回滚(事务中)
DELETE 逐行删除记录,可带条件 较低(逐行删除)
TRUNCATE 清空所有记录,相当于重建表结构 较高(直接重建)
DROP 彻底删除表,包括结构和数据 最高

**使用建议**:

  • 需删除部分记录:用 `DELETE` + `WHERE`;

  • 需清空全表(保留结构):用 `TRUNCATE`(效率更高);

  • 需彻底删除表:用 `DROP`(谨慎操作,不可恢复)。

五、SQL 操作的注意事项

  1. **子查询优化**:
  • 子查询结果集不宜过大,否则会影响性能;

  • 复杂子查询可考虑用 `JOIN` 改写,提升效率。

  1. **数据添加**:
  • 确保字段类型与值匹配(如数字类型不加引号);

  • 遵守表的约束(如非空字段必须赋值,唯一字段值不重复)。

  1. **数据修改与删除**:
  • 执行前先用 `SELECT` 语句验证条件是否正确(如 `SELECT * FROM student WHERE id=2`);

  • 生产环境中,删除/修改操作建议在事务中执行,便于回滚。

  1. **MySQL 语法特性**:
  • 语句末尾加分号 `;` 表示结束;

  • 关键字不区分大小写,但建议大写关键字(如 `SELECT`、`INSERT`),小写表名和字段名,增强可读性。

六、总结:SQL 核心操作要点

  1. **子查询**:嵌套在主查询中的查询,可作为数据源或条件,常用于复杂查询场景;

  2. **数据添加**:`INSERT INTO ... VALUES` 支持单行和多行添加,需注意字段与值的匹配;

  3. **数据修改**:`UPDATE ... SET ... WHERE` 用于修改记录,`WHERE` 条件必不可少;

  4. **数据删除**:

  • `DELETE` 逐行删除,可带条件,支持回滚;

  • `TRUNCATE` 清空全表,保留结构,效率高;

  • `DROP` 彻底删除表,包括结构,谨慎使用。

掌握这些操作后,你已能完成 MySQL 数据库的基本CRUD(创建、读取、更新、删除)操作,为后续学习事务、索引、存储过程等进阶知识奠定基础。实际开发中,需结合业务场景选择合适的操作方式,同时注意数据安全和操作效率。

相关推荐
百***81274 小时前
【HTML+CSS】使用HTML与后端技术连接数据库
css·数据库·html
6***3495 小时前
MySQL项目
数据库·mysql
木井巳5 小时前
【MySQL数据库】数据库基础
数据库·mysql
Wang's Blog5 小时前
MySQL: 查询全流程深度解析与性能优化实践指南
数据库·mysql·性能优化
一 乐5 小时前
宠物管理|宠物共享|基于Java+vue的宠物共享管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·springboot·宠物
Wang's Blog5 小时前
MongoDB小课堂: 高级查询操作符与游标管理综合指南之深度整合逻辑操作符、字段处理、数组查询与游标控制的最佳实践
数据库·mongodb
垂金烟柳5 小时前
MongoDB GridFS 历史数据自动化清理实践
数据库·mongodb·自动化
白露与泡影5 小时前
MySQL中的12个良好SQL编写习惯
java·数据库·面试
foundbug9995 小时前
配置Spring框架以连接SQL Server数据库
java·数据库·spring
q***31896 小时前
mysql 迁移达梦数据库出现的 sql 语法问题 以及迁移方案
数据库·sql·mysql