揭秘Oracle数据库增删改查操作:语法、示例和最佳实践

发布时间: 2024-08-04 04:28:25 阅读量: 94 订阅数: 22
![揭秘Oracle数据库增删改查操作:语法、示例和最佳实践](https://img-blog.csdnimg.cn/20190507130403928.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA2NzU2Njk=,size_16,color_FFFFFF,t_70) # 1. Oracle数据库基础** Oracle数据库是一个关系型数据库管理系统(RDBMS),它使用结构化查询语言(SQL)来存储、管理和检索数据。Oracle数据库以其高性能、可靠性和可扩展性而闻名,广泛用于企业级应用程序和数据仓库。 Oracle数据库的基础架构由以下组件组成: - **数据库实例:**数据库实例是Oracle数据库的运行时环境,它包括内存结构、后台进程和数据文件。 - **数据文件:**数据文件存储实际的数据,它们通常存储在磁盘上。 - **重做日志文件:**重做日志文件记录数据库中发生的所有更改,以确保数据完整性和可恢复性。 - **控制文件:**控制文件存储数据库实例的元数据,例如数据文件和重做日志文件的位置。 # 2. Oracle数据库增删改查操作 ### 2.1 INSERT语句:语法和示例 #### 2.1.1 基本语法 ```sql INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); ``` **参数说明:** - `table_name`:要插入数据的表名。 - `column1, column2, ...`:要插入数据的列名。 - `value1, value2, ...`:要插入数据的具体值。 **代码逻辑分析:** 该语句用于向指定表中插入一条或多条新记录。`INSERT`关键字后跟表名,然后是圆括号内的列名列表,再跟`VALUES`关键字和圆括号内的值列表。 #### 2.1.2 高级用法 **批量插入:** ```sql INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...), (value3, value4, ...), ...; ``` **插入默认值:** ```sql INSERT INTO table_name (column1, column2, ...) VALUES (DEFAULT, 'value2', ...); ``` **插入表达式:** ```sql INSERT INTO table_name (column1, column2, ...) VALUES (column1 + 10, 'value2', ...); ``` ### 2.2 DELETE语句:语法和示例 #### 2.2.1 基本语法 ```sql DELETE FROM table_name WHERE condition; ``` **参数说明:** - `table_name`:要删除数据的表名。 - `condition`:删除数据的条件。 **代码逻辑分析:** 该语句用于从指定表中删除满足指定条件的记录。`DELETE`关键字后跟表名,然后是`WHERE`关键字和删除条件。 #### 2.2.2 高级用法 **批量删除:** ```sql DELETE FROM table_name WHERE column1 IN (value1, value2, ...); ``` **级联删除:** ```sql DELETE FROM table_name WHERE column1 IN (SELECT column1 FROM related_table); ``` **截断表:** ```sql TRUNCATE TABLE table_name; ``` ### 2.3 UPDATE语句:语法和示例 #### 2.3.1 基本语法 ```sql UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition; ``` **参数说明:** - `table_name`:要更新数据的表名。 - `column1, column2, ...`:要更新的列名。 - `value1, value2, ...`:要更新的具体值。 - `condition`:更新数据的条件。 **代码逻辑分析:** 该语句用于更新指定表中满足指定条件的记录。`UPDATE`关键字后跟表名,然后是`SET`关键字和要更新的列名和值,再跟`WHERE`关键字和更新条件。 #### 2.3.2 高级用法 **批量更新:** ```sql UPDATE table_name SET column1 = column1 + 10 WHERE column2 IN (value1, value2, ...); ``` **条件更新:** ```sql UPDATE table_name SET column1 = CASE WHEN condition1 THEN value1 WHEN condition2 THEN value2 ELSE value3 END WHERE condition; ``` **子查询更新:** ```sql UPDATE table_name SET column1 = (SELECT column1 FROM related_table WHERE condition); ``` ### 2.4 SELECT语句:语法和示例 #### 2.4.1 基本语法 ```sql SELECT column1, column2, ... FROM table_name WHERE condition; ``` **参数说明:** - `column1, column2, ...`:要查询的列名。 - `table_name`:要查询的表名。 - `condition`:查询数据的条件。 **代码逻辑分析:** 该语句用于从指定表中查询满足指定条件的数据。`SELECT`关键字后跟要查询的列名,然后是`FROM`关键字和表名,再跟`WHERE`关键字和查询条件。 #### 2.4.2 高级用法 **聚合函数:** ```sql SELECT COUNT(*), SUM(column1), AVG(column2) FROM table_name GROUP BY column3; ``` **连接查询:** ```sql SELECT column1, column2 FROM table1 INNER JOIN table2 ON table1.column1 = table2.column2; ``` **子查询:** ```sql SELECT column1 FROM table_name WHERE column2 IN (SELECT column2 FROM related_table); ``` # 3. Oracle数据库增删改查最佳实践 ### 3.1 性能优化技巧 **3.1.1 索引的使用** 索引是数据库中用于快速查找数据的结构。通过在表中的特定列上创建索引,可以显著提高查询性能,尤其是当表中数据量较大时。 **索引的类型:** - **B-Tree 索引:**最常用的索引类型,使用平衡树结构存储数据。 - **哈希索引:**使用哈希函数将数据映射到索引项,提供快速查找。 - **位图索引:**用于存储二进制值,可以快速查找具有特定值的记录。 **创建索引的步骤:** ```sql CREATE INDEX <索引名称> ON <表名> (<列名>) ``` **示例:** ```sql CREATE INDEX idx_employee_salary ON employees(salary) ``` **逻辑分析:** 此索引将创建在 `employees` 表的 `salary` 列上,用于快速查找员工的薪资信息。 **3.1.2 查询优化** 查询优化涉及修改查询以提高其性能。以下是一些优化查询的技巧: - **使用适当的索引:**确保在查询中涉及的列上创建了索引。 - **避免全表扫描:**使用 `WHERE` 子句来过滤结果集,避免扫描整个表。 - **使用连接提示:**使用 `JOIN` 提示(例如 `NESTED LOOPS` 或 `HASH JOIN`)来指定数据库应如何执行连接。 - **重写查询:**将复杂查询分解为更简单的查询,并使用子查询或视图来提高可读性和性能。 **示例:** ```sql -- 未优化查询 SELECT * FROM employees WHERE salary > 50000; -- 优化查询 SELECT * FROM employees WHERE salary > 50000 AND department_id = 10; ``` **逻辑分析:** 优化后的查询通过添加 `department_id` 过滤条件来缩小结果集,从而减少了扫描的数据量。 ### 3.2 安全性考虑 **3.2.1 权限管理** 权限管理涉及控制用户对数据库对象的访问。通过授予用户适当的权限,可以确保只有授权用户才能访问和修改数据。 **权限类型:** - **SELECT:**允许用户读取数据。 - **INSERT:**允许用户插入数据。 - **UPDATE:**允许用户更新数据。 - **DELETE:**允许用户删除数据。 **授予权限的步骤:** ```sql GRANT <权限> ON <对象> TO <用户> ``` **示例:** ```sql GRANT SELECT ON employees TO user1; ``` **逻辑分析:** 此语句授予 `user1` 对 `employees` 表的 `SELECT` 权限,允许其读取表中的数据。 **3.2.2 数据加密** 数据加密涉及将数据转换为无法识别的格式,以保护其免遭未经授权的访问。Oracle 提供了多种加密方法,包括: - **透明数据加密 (TDE):**对整个数据库或表空间进行加密。 - **列加密:**对特定表中的特定列进行加密。 - **应用程序级加密:**在应用程序中对数据进行加密。 **加密的好处:** - 保护敏感数据免遭未经授权的访问。 - 符合法规要求,例如 PCI DSS 和 HIPAA。 - 提高数据安全性和隐私性。 ### 3.3 事务处理 **3.3.1 事务的特性** 事务是一组原子操作,要么全部成功,要么全部失败。事务具有以下特性: - **原子性:**事务中的所有操作要么全部成功,要么全部失败。 - **一致性:**事务保持数据库的一致性,即满足所有业务规则。 - **隔离性:**一个事务中的操作与其他并发事务隔离。 - **持久性:**一旦事务提交,其更改将永久存储在数据库中。 **3.3.2 事务的管理** Oracle 提供了多种管理事务的方法,包括: - **显式事务:**使用 `BEGIN`、`COMMIT` 和 `ROLLBACK` 语句手动启动、提交和回滚事务。 - **隐式事务:**由数据库自动启动和提交事务,通常用于 DDL 语句。 - **保存点:**允许在事务中创建保存点,以便在发生错误时回滚到该点。 **示例:** ```sql BEGIN -- 事务开始 -- 执行操作 COMMIT; -- 事务提交 END; ``` **逻辑分析:** 此示例演示了一个显式事务,在事务中执行操作,然后提交事务以永久存储更改。 # 4. Oracle数据库增删改查高级应用 ### 4.1 PL/SQL编程 #### 4.1.1 PL/SQL概述 PL/SQL(Procedural Language/Structured Query Language)是一种Oracle数据库专有的编程语言,它集成了SQL和过程化语言的特性,允许开发者编写存储过程、函数、触发器和包等数据库对象。PL/SQL代码存储在数据库中,并由Oracle数据库引擎执行。 #### 4.1.2 PL/SQL存储过程和函数 **存储过程**是一组预编译的PL/SQL语句,用于执行特定任务或操作。它们通常用于封装复杂或经常执行的数据库操作,从而提高性能和代码重用性。 **函数**是返回单个值的PL/SQL代码块。它们可以用于计算值、验证数据或执行其他自定义操作。 **代码块:** ```sql CREATE PROCEDURE get_employee_details(employee_id IN NUMBER) AS BEGIN SELECT * FROM employees WHERE employee_id = employee_id; END; ``` **逻辑分析:** * `CREATE PROCEDURE`语句创建名为`get_employee_details`的存储过程。 * `employee_id IN NUMBER`参数指定存储过程接受一个名为`employee_id`的数字输入参数。 * `BEGIN`和`END`语句定义存储过程的主体。 * `SELECT`语句从`employees`表中检索具有指定`employee_id`的员工记录。 **函数示例:** ```sql CREATE FUNCTION get_employee_name(employee_id IN NUMBER) RETURN VARCHAR2 AS BEGIN RETURN (SELECT first_name || ' ' || last_name FROM employees WHERE employee_id = employee_id); END; ``` **逻辑分析:** * `CREATE FUNCTION`语句创建名为`get_employee_name`的函数。 * `employee_id IN NUMBER`参数指定函数接受一个名为`employee_id`的数字输入参数。 * `RETURN VARCHAR2`指定函数返回一个`VARCHAR2`数据类型的字符串值。 * `BEGIN`和`END`语句定义函数的主体。 * `SELECT`语句从`employees`表中检索具有指定`employee_id`的员工的姓名。 ### 4.2 数据库触发器 #### 4.2.1 触发器的类型 触发器是附加到表或视图上的数据库对象,当对表或视图执行特定操作(如插入、更新或删除)时,触发器会自动执行。Oracle数据库支持以下类型的触发器: * **BEFORE触发器:**在操作执行之前执行。 * **AFTER触发器:**在操作执行之后执行。 * **INSTEAD OF触发器:**代替操作执行。 #### 4.2.2 触发器的创建和使用 **触发器示例:** ```sql CREATE TRIGGER update_employee_salary BEFORE UPDATE OF salary ON employees FOR EACH ROW BEGIN IF NEW.salary > OLD.salary THEN -- 发送电子邮件通知管理员 DBMS_OUTPUT.PUT_LINE('Employee salary increased: ' || OLD.employee_id); END IF; END; ``` **逻辑分析:** * `CREATE TRIGGER`语句创建名为`update_employee_salary`的触发器。 * `BEFORE UPDATE OF salary ON employees`指定触发器在`employees`表上`salary`列更新之前执行。 * `FOR EACH ROW`指定触发器对受影响的每一行执行。 * `BEGIN`和`END`语句定义触发器的主体。 * `IF`语句检查新工资是否大于旧工资。 * 如果新工资大于旧工资,则`DBMS_OUTPUT.PUT_LINE`语句将一条消息输出到数据库日志。 ### 4.3 数据库视图 #### 4.3.1 视图的创建和使用 视图是基于表或其他视图的虚拟表,它提供了一种对底层数据进行自定义视图的方式。视图不存储实际数据,而是从底层表中动态生成数据。 **视图示例:** ```sql CREATE VIEW employee_summary AS SELECT employee_id, first_name, last_name, salary FROM employees; ``` **逻辑分析:** * `CREATE VIEW`语句创建名为`employee_summary`的视图。 * `SELECT`语句指定视图包含`employee_id`、`first_name`、`last_name`和`salary`列。 * `FROM employees`指定视图基于`employees`表。 #### 4.3.2 视图的性能考虑 视图通常用于提高性能,因为它们可以避免对底层表进行不必要的连接或其他昂贵的操作。但是,在某些情况下,视图可能会降低性能,例如: * **视图包含复杂查询:**如果视图包含复杂查询,则每次访问视图时都必须执行该查询,这可能会降低性能。 * **视图基于经常更新的表:**如果视图基于经常更新的表,则视图中的数据可能不会始终是最新的,这可能会导致不准确的结果。 # 5. Oracle数据库增删改查工具 ### 5.1 SQL Developer #### 5.1.1 SQL Developer概述 SQL Developer是Oracle公司开发的一款免费的、基于Java的图形化数据库管理工具,它提供了直观的界面和丰富的功能,可以帮助用户高效地管理和查询Oracle数据库。 #### 5.1.2 SQL Developer使用指南 **连接数据库** 1. 打开SQL Developer,点击“连接”按钮。 2. 在“连接”对话框中,输入数据库连接信息,包括主机名、端口号、用户名和密码。 3. 点击“连接”按钮,连接到数据库。 **执行SQL语句** 1. 在SQL编辑器中输入SQL语句。 2. 点击“执行”按钮,执行SQL语句。 3. 执行结果将显示在“结果”选项卡中。 **管理对象** 1. 在“对象浏览器”中,可以查看和管理数据库中的各种对象,如表、视图、存储过程等。 2. 右键单击对象,可以执行各种操作,如查看对象定义、编辑对象、删除对象等。 ### 5.2 Toad for Oracle #### 5.2.1 Toad for Oracle概述 Toad for Oracle是Quest Software公司开发的一款商业数据库管理工具,它提供了强大的功能和易于使用的界面,可以帮助用户高效地管理和查询Oracle数据库。 #### 5.2.2 Toad for Oracle使用指南 **连接数据库** 1. 打开Toad for Oracle,点击“文件”菜单,选择“新建连接”。 2. 在“连接”对话框中,输入数据库连接信息,包括主机名、端口号、用户名和密码。 3. 点击“连接”按钮,连接到数据库。 **执行SQL语句** 1. 在SQL编辑器中输入SQL语句。 2. 点击“执行”按钮,执行SQL语句。 3. 执行结果将显示在“结果”选项卡中。 **管理对象** 1. 在“对象浏览器”中,可以查看和管理数据库中的各种对象,如表、视图、存储过程等。 2. 右键单击对象,可以执行各种操作,如查看对象定义、编辑对象、删除对象等。 # 6. Oracle数据库增删改查常见问题解答 ### 6.1 性能优化问题 **问题:查询速度很慢,如何优化?** **解决方案:** - **使用索引:**为经常查询的列创建索引,可以显著提高查询速度。 - **优化查询语句:**避免使用不必要的连接和子查询,并使用适当的连接类型(如 INNER JOIN)。 - **调整服务器参数:**调整服务器参数(如 SGA 大小和缓冲区大小)可以改善整体性能。 ### 6.2 安全性问题 **问题:如何防止未经授权的数据库访问?** **解决方案:** - **使用强密码:**为数据库用户设置强密码并定期更改。 - **实施权限管理:**仅授予用户访问和修改他们需要的数据的权限。 - **启用审计:**启用审计跟踪用户活动,以检测可疑行为。 ### 6.3 事务处理问题 **问题:事务回滚失败,如何恢复?** **解决方案:** - **检查日志文件:**查看数据库日志文件以确定回滚失败的原因。 - **使用恢复工具:**使用 RMAN 或其他恢复工具恢复数据库到回滚之前的状态。 - **联系 Oracle 支持:**如果无法自行解决问题,请寻求 Oracle 支持的帮助。 ### 6.4 PL/SQL 问题 **问题:PL/SQL 存储过程出现错误,如何调试?** **解决方案:** - **使用 DBMS_OUTPUT 包:**使用 DBMS_OUTPUT 包打印调试信息。 - **使用调试器:**使用 SQL Developer 或 Toad 等工具的调试器来逐步执行存储过程并查找错误。 - **查看错误日志:**检查数据库错误日志以获取有关错误的详细信息。 ### 6.5 数据库触发器问题 **问题:触发器未被触发,如何解决?** **解决方案:** - **检查触发器定义:**确保触发器定义正确,并且事件和条件符合预期。 - **检查触发器状态:**使用 `SELECT * FROM USER_TRIGGERS` 查询触发器状态,确保触发器已启用。 - **检查对象权限:**确保用户具有触发器所在表的适当权限。
corwn 最低0.47元/天 解锁专栏
买1年送3月
点击查看下一篇
profit 百万级 高质量VIP文章无限畅学
profit 千万级 优质资源任意下载
profit C知道 免费提问 ( 生成式Al产品 )

LI_李波

资深数据库专家
北理工计算机硕士,曾在一家全球领先的互联网巨头公司担任数据库工程师,负责设计、优化和维护公司核心数据库系统,在大规模数据处理和数据库系统架构设计方面颇有造诣。
专栏简介
欢迎来到 Oracle 数据库增删改查操作指南专栏!本专栏旨在为新手和经验丰富的数据库专业人士提供全面的指南,涵盖 Oracle 数据库中增、删、改、查操作的各个方面。通过深入的文章和详细的示例,您将掌握这些操作的语法、最佳实践和故障排除技巧。此外,您还将了解高级技术,如存储过程、函数和锁机制,以优化性能和确保数据完整性。本专栏还探讨了并发性问题、审计功能、数据完整性约束、索引优化、表分区和物化视图等重要主题。无论您是刚开始使用 Oracle 数据库还是希望提高您的技能,本专栏都将为您提供所需的知识和见解,以高效、可靠地执行增删改查操作。

专栏目录

最低0.47元/天 解锁专栏
买1年送3月
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )

最新推荐

【台达PLC精通之路】:从新手到专家的7个秘诀

![【台达PLC精通之路】:从新手到专家的7个秘诀](https://img-blog.csdnimg.cn/e096248b2b6345659a5968e18d4d8a54.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1gwX0ltUGVSaWFs,size_16,color_FFFFFF,t_70) # 摘要 台达PLC(可编程逻辑控制器)作为自动化控制领域的重要设备,其在工业自动化及能源管理中的应用正变得日益广泛。本文首先介绍

【性能优化攻略】:LAN Portal软件性能调优的五大策略

![【性能优化攻略】:LAN Portal软件性能调优的五大策略](https://wcedeportal.co.za/sites/eresources/files/LAN_2.jpg) # 摘要 随着信息技术的快速发展,LAN Portal软件在企业网络中的应用日益广泛,其性能优化成为提升网络效率和质量的关键。本文全面概述了LAN Portal软件性能优化的各个方面,包括性能监控与评估的基础知识、网络层面的调优策略、系统资源的优化管理以及高级调优技巧。文章重点分析了性能监控工具的选择和应用,关键性能指标(KPIs)的定义,以及不同层次(网络架构、传输层、应用层)的性能优化方法。此外,还探讨

SV660N通讯中断速查手册:一分钟快速诊断与解决技巧

![SV660N系列伺服通讯手册-CN-C01.PDF](https://www.haascnc.com/content/dam/haascnc/service/guides/troubleshooting/sigma-1---axis-servo-motor-and-cables---troubleshooting-guide/servo_amplifier_electrical_schematic_Rev_B.png) # 摘要 SV660N通讯中断问题在工业自动化和控制系统中是一个常见且需要迅速解决的问题。本文全面概述了通讯中断的概念、产生原因、类型识别、快速诊断技巧、解决方法和案例分

电磁兼容性不再困扰:电力电子应用中的6大解决策略

![电磁兼容性不再困扰:电力电子应用中的6大解决策略](https://www.prometec.net/wp-content/uploads/2018/06/FiltroLC.jpg) # 摘要 电磁兼容性是电力电子系统稳定运行的关键因素之一,其涉及电磁干扰的源起、传播及其对系统性能的影响。本文系统地探讨了电磁干扰的基础理论、电磁兼容性的概念和设计原则,以及电磁干扰的测量与评估方法。进一步地,本文分析了在电路设计阶段实施的预防措施,包括布局优化、屏蔽技术、滤波器设计、接地策略以及隔离与转换技术。在控制技术实践章节中,本文强调了电磁屏蔽技术的应用、信号完整性和电源管理、以及频谱管理与定制化滤

深度解析Origin9.0图形数据处理:7步骤彻底移除流程

![深度解析Origin9.0图形数据处理:7步骤彻底移除流程](https://opengraph.githubassets.com/b6600b7e1ea627b8166f2d03a24e85589436b2beb77da0d9543e8f4bd2282a11/Rmillansol/Import-OriginPro-File-To-Matlab) # 摘要 Origin9.0是一款广泛应用于科研领域的图形数据处理软件,本文旨在详细介绍其在数据导入、图形处理、高级数据分析以及个性化定制与自动化方面的功能和应用。首先概述Origin9.0的基本操作,包括数据导入和初步处理的方法,然后深入探讨

【小车运动学仿真新手入门】:跟随专家逐步搭建模拟环境

![【小车运动学仿真新手入门】:跟随专家逐步搭建模拟环境](https://www.mathworks.com/company/technical-articles/using-sensitivity-analysis-to-optimize-powertrain-design-for-fuel-economy/_jcr_content/mainParsys/image_1876206129.adapt.full.medium.jpg/1487569919249.jpg) # 摘要 本文综合分析了小车运动学仿真技术,从运动学基础理论出发构建了二维和三维运动模型。详细探讨了仿真环境的选择和搭建

【PyTorch手势识别入门篇】:搭建基础环境及项目框架搭建

# 摘要 本文旨在介绍PyTorch框架在手势识别领域的应用。文章首先概述了手势识别技术的重要性及其在人机交互和虚拟现实中的应用前景。接着,文章详细介绍了PyTorch的基础知识,包括其核心组件如张量(Tensor)、自动微分机制和计算图,以及安装配置的细节,包括版本选择、环境搭建及验证。第三部分阐述了构建手势识别项目框架的步骤,涵盖了数据准备、模型基础结构设计及代码组织。第四章讲述了模型训练与评估的策略和方法。最后,本文分析了手势识别技术的实战应用案例,并对其未来的发展趋势进行了展望,探讨了技术创新和新兴领域中的应用潜力。 # 关键字 PyTorch;手势识别;神经网络;数据增强;模型训练

【速度提升】:安川机器人IO响应优化,操作更快更稳定

![【速度提升】:安川机器人IO响应优化,操作更快更稳定](https://opengraph.githubassets.com/44dfd4b7cd8a030ad4e104e259c03b98eafcb8a608435fe6a5c420669958c6ab/yudarw/YASKAWA-Robot-Teleoperation) # 摘要 安川机器人的IO响应性能对于确保其运行效率和精确度至关重要。本文旨在探讨IO响应优化的理论与实践操作,并评估优化的实际效果。首先,我们介绍了IO响应的基本原理及影响其时间的关键因素。随后,构建了IO响应优化的理论框架,包括理论模型分析和优化策略。在实践操作

ZXV10 T800数据保护黄金法则:系统备份与恢复的最佳实践

![ZXV10 T800数据保护黄金法则:系统备份与恢复的最佳实践](https://www.ubackup.com/screenshot/en/others/windows-server-2019-incremental-backup/incremental-backup-image.png) # 摘要 本文对ZXV10 T800数据保护方案进行了全面的概述、分析与实践案例探讨。首先,从理论基础出发,阐述了系统备份的重要性、备份策略与技术原理,并详细介绍了系统恢复的策略、技术细节以及在实施过程中遇到的挑战和解决方案。通过实战案例,本文展示了备份与恢复任务的部署和流程优化,以及在实践中取得的

专栏目录

最低0.47元/天 解锁专栏
买1年送3月
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )