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(创建、读取、更新、删除)操作,为后续学习事务、索引、存储过程等进阶知识奠定基础。实际开发中,需结合业务场景选择合适的操作方式,同时注意数据安全和操作效率。

相关推荐
厦门辰迈智慧科技有限公司11 分钟前
城市地下管网全域监测与安全防控整体解决方案
数据库·安全·物联网解决方案·地下管网监测·城市地下管网监测
小肖爱笑不爱笑16 分钟前
JDBC Mybatis
数据库·mybatis
cookqq38 分钟前
MySQL 5.7 大表删除部分数据:.ibd 文件会变小吗?磁盘会释放吗?
数据结构·数据库·mysql
IT 行者42 分钟前
告别硬编码!Spring Boot 优雅实现 Controller 路径前缀统一管理
数据库·spring boot·python
曹牧1 小时前
Oracle 大表数据分区存储
数据库·oracle
win x1 小时前
Redis 持久化
数据库·redis·缓存
程序猿20231 小时前
MySQL的锁(行锁)
数据库·mysql
W001hhh1 小时前
数据库实训Day005下午
数据库
lechcat1 小时前
多角色协同巡检流程设计技术教程
大数据·数据库·数据挖掘
小沈同学呀1 小时前
基于时间片划分的提醒算法设计与实现
服务器·数据库·算法