SQL语句在项目开发中的应用总结

SQL语句在项目开发中的应用总结

在软件开发项目中,SQL语句是与数据库交互的核心工具。本文将总结项目开发中常用的SQL语句,包括添加、修改、删除、分页、模糊查询以及使用WHERE语句的知识,并提供相应的代码示例。

一. 添加数据

在项目开发中,使用SQL添加数据语句是一项基础且关键的操作。以下是SQL添加数据语句的详细知识点:

1. 基本语法

SQL添加数据的基本语法是使用INSERT语句:

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
  • table_name:指定要插入数据的表名。
  • column1, column2, column3, ...:指定要插入数据的列名。
  • value1, value2, value3, ...:指定要插入的值,值的顺序和类型应与列名对应。

2. 插入完整行

如果不指定列名,则必须插入表中所有列的数据,并且值的顺序要与表中列的顺序一致:

INSERT INTO table_name
VALUES (value1, value2, value3, ...);

3. 插入默认值

如果表的某些列设置了默认值,那么在插入数据时可以省略这些列:

INSERT INTO table_name (column1, column2)
VALUES (value1, value2);

在这个例子中,column3及其后的列将使用默认值。

4. 插入多行

可以使用一条INSERT语句插入多行数据:

INSERT INTO table_name (column1, column2)
VALUES (value1, value2),(value3, value4),(value5, value6);

5. 插入查询结果

可以将查询结果直接插入到表中:

INSERT INTO table_name (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM another_table
WHERE condition;

6. 返回插入数据的ID

在插入数据后,有时需要获取自动生成的主键ID,可以使用LAST_INSERT_ID()函数:

INSERT INTO table_name (column1, column2)
VALUES (value1, value2);SELECT LAST_INSERT_ID();

7. 使用变量插入数据

可以使用变量来插入数据,这在存储过程和脚本中很有用:

SET @a = 'value1';
SET @b = 'value2';INSERT INTO table_name (column1, column2)
VALUES (@a, @b);

8. 插入NULL值

如果要插入NULL值,只需在VALUES子句中使用NULL关键字:

INSERT INTO table_name (column1, column2)
VALUES (NULL, 'value2');

注意点

  • 数据类型匹配:确保插入的数据类型与列的数据类型一致。
  • 约束遵守:插入的数据必须遵守表的所有约束,如主键、唯一性、非空和外键约束。
  • SQL注入:避免直接将用户输入拼接到SQL语句中,以防止SQL注入攻击。使用参数化查询或预处理语句。
  • 事务处理:在需要确保数据完整性的场景中,使用事务来包裹INSERT语句。
  • 性能优化:在批量插入大量数据时,考虑使用事务和批量插入技术来提高性能。
  • 索引影响:大量插入数据可能会影响索引性能,考虑在插入前禁用非唯一索引。
  • 触发器:考虑插入操作可能会触发的数据库触发器,并评估它们对性能和逻辑的影响。

通过掌握这些知识点,开发者可以更有效地使用SQL添加数据语句,并确保数据的一致性和安全性。

二. 修改数据

在项目开发中,SQL修改数据语句是实现数据更新的重要手段。以下是SQL修改数据语句的详细知识点:

1. 基本语法

SQL修改数据的基本语法是使用UPDATE语句:

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
  • table_name:指定要更新数据的表名。
  • column1, column2, ...:指定要更新的列名。
  • value1, value2, ...:指定要更新的新值。
  • condition:指定更新条件,只有满足条件的记录会被更新。

2. 更新特定列

可以更新一个或多个列的值:

UPDATE users
SET email = 'new_email@example.com', status = 'active'
WHERE id = 1;

3. 使用表达式更新

可以利用表达式来更新列的值,例如增加或减少数值:

UPDATE orders
SET quantity = quantity + 1
WHERE order_id = 10;

4. 使用函数更新

可以使用数据库函数来更新列的值:

UPDATE users
SET last_login = NOW()
WHERE user_id = 1;

5. 更新多行

UPDATE语句可以同时更新多行数据:

UPDATE users
SET status = 'inactive'
WHERE last_login < DATE_SUB(NOW(), INTERVAL 1 YEAR);

6. 条件复合

可以使用ANDOR等逻辑运算符组合多个条件:

UPDATE products
SET price = price * 1.1
WHERE category = 'Electronics' AND price < 100;

7. 使用子查询更新

可以使用子查询作为更新的条件或值:

UPDATE employees
SET salary = (SELECT AVG(salary) FROM employees WHERE department_id = 5)
WHERE department_id = 5;

8. 返回更新行数

在某些数据库系统中,可以返回更新的行数:

UPDATE users
SET status = 'active'
WHERE email_verified = 1;SELECT ROW_COUNT();

9. 使用变量更新

可以使用变量来更新数据:

SET @new_email = 'new_email@example.com';
UPDATE users
SET email = @new_email
WHERE user_id = 1;

注意点

  • 数据一致性:确保更新操作不会违反数据的一致性和完整性。
  • 事务处理:在需要确保一系列更新操作作为一个整体成功或失败时,使用事务。
  • 性能考虑:更新大量数据时,考虑性能影响,可能需要优化索引或使用批量更新。
  • 锁定机制:更新操作可能会锁定表或行,影响并发访问。了解并优化锁定机制可以提高性能。
  • 触发器:更新操作可能会触发数据库触发器,这可能会执行额外的逻辑或检查。
  • 备份策略:在执行大规模更新前,确保有有效的数据备份策略。
  • SQL注入:避免直接将用户输入拼接到SQL语句中,以防止SQL注入攻击。使用参数化查询或预处理语句。
  • 权限控制:确保执行更新操作的用户具有适当的权限。

通过掌握这些知识点,开发者可以更安全、更有效地使用SQL修改数据语句,以实现项目中的数据更新需求。

三. 删除数据

在项目开发中,SQL删除数据语句是用于从数据库中移除数据的一种操作。以下是SQL删除数据语句的详细知识点:

1. 基本语法

SQL删除数据的基本语法是使用DELETE语句:

DELETE FROM table_name WHERE condition;
  • table_name:指定要删除数据的表名。
  • condition:指定删除条件,只有满足条件的记录会被删除。

2. 删除特定行

可以指定条件来删除特定的行:

DELETE FROM users WHERE user_id = 1;

3. 删除多行

DELETE语句可以同时删除多行数据:

DELETE FROM users WHERE last_login < DATE_SUB(NOW(), INTERVAL 1 YEAR);

4. 删除所有行

如果不指定WHERE子句,则会删除表中的所有行:

DELETE FROM users;

注意:这将删除表中的所有数据,通常需要谨慎使用。

5. 使用TRUNCATE语句

TRUNCATE语句用于快速删除表中的所有行,并重置任何自增的标识符:

TRUNCATE TABLE users;

TRUNCATE通常比DELETE更快,因为它不记录每行的删除操作,但它不能触发删除触发器,也不能被回滚。

6. 条件复合

可以使用ANDOR等逻辑运算符组合多个条件:

DELETE FROM orders WHERE customer_id = 10 OR order_date < '2024-01-01';

7. 使用子查询删除

可以使用子查询作为删除的条件:

DELETE FROM orders WHERE order_id IN (SELECT id FROM order_details WHERE product_id = 5);

8. 返回删除行数

在某些数据库系统中,可以返回删除的行数:

DELETE FROM users WHERE email LIKE '%@example.com';SELECT ROW_COUNT();

9. 使用变量删除

可以使用变量来构建删除条件:

SET @user_id = 1;
DELETE FROM users WHERE user_id = @user_id;

注意点

  • 数据不可恢复:删除操作是不可逆的,一旦执行,被删除的数据将无法恢复,除非有备份。
  • 事务处理:在需要确保删除操作作为一个整体成功或失败时,使用事务。
  • 性能考虑:删除大量数据时,考虑性能影响,可能需要优化索引或使用TRUNCATE
  • 锁定机制:删除操作可能会锁定表或行,影响并发访问。了解并优化锁定机制可以提高性能。
  • 触发器:删除操作可能会触发数据库触发器,这可能会执行额外的逻辑或检查。
  • 外键约束:删除操作可能会违反外键约束,导致错误。需要确保删除操作不会破坏数据的引用完整性。
  • 备份策略:在执行大规模删除前,确保有有效的数据备份策略。
  • SQL注入:避免直接将用户输入拼接到SQL语句中,以防止SQL注入攻击。使用参数化查询或预处理语句。
  • 权限控制:确保执行删除操作的用户具有适当的权限。

通过掌握这些知识点,开发者可以更安全、更有效地使用SQL删除数据语句,以实现项目中的数据删除需求。

四. 分页查询

SQL分页查询是一种常见的数据库操作,用于在结果集中获取特定页面的数据。不同的数据库管理系统(DBMS)有不同的分页查询语法。以下是一些常见数据库的分页查询方法:

1. MySQL

在MySQL中,可以使用LIMITOFFSET子句来实现分页。例如,要获取第2页的数据,每页显示10条记录:

SELECT * FROM table_name
LIMIT 10 OFFSET 10;

这里,LIMIT 10表示每页显示10条记录,OFFSET 10表示跳过前10条记录,即从第11条记录开始获取。

2. SQL Server

SQL Server使用OFFSETFETCH NEXT子句来实现分页:

SELECT * FROM table_name
ORDER BY some_column
OFFSET 10 ROWS   -- 跳过前10条记录
FETCH NEXT 10 ROWS ONLY;  -- 获取接下来的10条记录

3. PostgreSQL

PostgreSQL也使用LIMITOFFSET子句:

SELECT * FROM table_name
ORDER BY some_column
LIMIT 10 OFFSET 10;

4. Oracle

Oracle可以使用ROWNUM伪列或者FETCH FIRSTOFFSET子句(从Oracle 12c开始支持):

-- 使用ROWNUM
SELECT * FROM (SELECT * FROM table_nameORDER BY some_column
)
WHERE ROWNUM > 10 AND ROWNUM <= 20;-- 使用FETCH FIRST和OFFSET(Oracle 12c及以上版本)
SELECT * FROM table_name
ORDER BY some_column
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

5. SQLite

SQLite使用LIMITOFFSET子句:

SELECT * FROM table_name
ORDER BY some_column
LIMIT 10 OFFSET 10;

通用知识点

  • 排序:分页查询通常需要根据某个列进行排序,以确保分页的一致性。
  • 性能:使用OFFSET可能会导致性能问题,尤其是在数据量大的情况下。这是因为数据库需要扫描到指定的OFFSET行,然后再开始返回结果。在某些情况下,使用索引可以提高性能。
  • 索引:确保用于排序和过滤的列上有索引,可以显著提高查询性能。
  • 缓存:对于静态数据或者变化不频繁的数据,可以考虑使用缓存来减少数据库的查询压力。
  • 游标:在某些情况下,使用游标进行分页查询可能更灵活,但通常性能不如使用LIMITOFFSET
  • 分页参数:通常需要传递当前页码和每页显示的记录数作为参数。

在实际使用中,需要根据具体的数据库系统选择合适的分页方法,并考虑性能和实际需求。

五. 模糊查询

在项目开发中,SQL模糊查询是一种常用的数据检索技术,它允许用户根据部分信息来查找数据库中的记录。以下是SQL模糊查询的详细知识点:

1. 使用LIKE操作符

LIKE操作符用于在WHERE子句中搜索列中的指定模式。

语法:
SELECT column_name
FROM table_name
WHERE column_name LIKE pattern;
模式匹配:
  • %:表示任意数量的字符(包括零个字符)。
  • _:表示单个字符。
示例:
  • 查找任意包含"abc"的记录:

    SELECT * FROM table_name WHERE column_name LIKE '%abc%';
    
  • 查找以"abc"开头的记录:

    SELECT * FROM table_name WHERE column_name LIKE 'abc%';
    
  • 查找以"abc"结尾的记录:

    SELECT * FROM table_name WHERE column_name LIKE '%abc';
    

2. 通配符的使用

  • %:在模式中的任意位置可以使用任意次数。
  • _:在模式中的任意位置可以使用,但只能匹配单个字符。

3. 特殊字符处理

当查询条件中包含通配符(如%_)时,可以使用ESCAPE关键字来转义这些特殊字符。

示例:
  • 查找字面上包含"%"的记录:

    SELECT * FROM table_name WHERE column_name LIKE '%\%%' ESCAPE '\';
    

4. 模糊查询的优化

  • 避免在搜索模式的开始处使用%通配符,因为这会导致全表扫描,从而降低查询效率。
  • 考虑使用全文索引(FULLTEXT)进行模糊查询,这通常比LIKE更高效。

5. 正则表达式

对于更复杂的模式匹配,可以使用REGEXPRLIKE操作符。

示例:
  • 使用正则表达式查找以"abc"开头的记录:

    SELECT * FROM table_name WHERE column_name REGEXP '^abc';
    

6. 内置函数

MySQL提供了一些内置函数,如LOCATEPOSITIONINSTR,它们可以用于模糊查询。

示例:
  • 使用LOCATE函数查找包含"abc"的记录:

    SELECT * FROM table_name WHERE LOCATE('abc', column_name) > 0;
    

注意点

  • LIKE默认是不区分大小写的,但可以使用BINARY关键字来使其区分大小写。
  • 模糊查询可能会导致查询性能下降,尤其是在大型数据集上。
  • 在使用通配符时,要注意不要过度使用,并且尽量将通配符放在模式的结尾。

通过以上知识点,开发者可以根据项目需求灵活地使用SQL模糊查询语句,以实现高效的数据检索。

六. WHERE语句

WHERE子句是SQL查询语句中非常重要的部分,它用于过滤结果集,只返回满足特定条件的记录。以下是WHERE子句的一些详细知识点:

1. 基本用法

SELECT column1, column2
FROM table_name
WHERE condition;
  • condition可以是一个或多个条件的组合。

2. 比较运算符

  • 等于:=
  • 不等于:<>!=
  • 小于:<
  • 小于等于:<=
  • 大于:>
  • 大于等于:>=

3. 逻辑运算符

  • 与(AND):用于组合多个条件,只有所有条件都满足时才返回结果。
  • 或(OR):用于组合多个条件,只要有一个条件满足就返回结果。
  • 非(NOT):用于反转条件的结果。

4. 范围查询

  • 使用BETWEEN运算符可以查询一个范围内的值:
SELECT * FROM table_name
WHERE column_name BETWEEN value1 AND value2;

5. 列表查询

  • 使用IN运算符可以查询列中的多个可能值:
SELECT * FROM table_name
WHERE column_name IN (value1, value2, ...);

6. 模式匹配

  • 使用LIKE运算符进行模式匹配:
SELECT * FROM table_name
WHERE column_name LIKE pattern;
  • %表示任意数量的字符。
  • _表示任意单个字符。

7. 空值检查

  • 使用IS NULL来检查列中的空值:
SELECT * FROM table_name
WHERE column_name IS NULL;

8. 正则表达式

  • 某些数据库系统支持正则表达式匹配,如MySQL的REGEXP
SELECT * FROM table_name
WHERE column_name REGEXP pattern;

9. 子查询

  • WHERE子句中可以使用子查询来定义更复杂的条件:
SELECT * FROM table_name AS t1
WHERE t1.column_name = (SELECT column_name FROM another_table AS t2 WHERE t2.id = t1.id);

10. 聚合函数

  • 可以在WHERE子句中使用聚合函数,但通常需要使用HAVING子句:
SELECT column_name, COUNT(*)
FROM table_name
GROUP BY column_name
HAVING COUNT(*) > 1;

11. 别名使用

  • WHERE子句中可以使用列的别名:
SELECT column_name AS alias_name
FROM table_name
WHERE alias_name > 10;

12. 索引优化

  • WHERE子句中使用索引列可以提高查询性能。

13. 强制类型转换

  • 在某些情况下,可能需要对列进行类型转换以确保比较的正确性:
SELECT * FROM table_name
WHERE CAST(column_name AS data_type) = 'value';

14. 位运算符

  • 某些数据库支持位运算符,如&(AND)、|(OR)、~(NOT)等。

15. 条件表达式

  • 使用CASE语句在WHERE子句中进行条件表达式:
SELECT * FROM table_name
WHERE (CASE WHEN column_name > 10 THEN 1 ELSE 0 END) = 1;

注意事项

  • 确保使用WHERE子句时,条件是必要的,以避免返回不必要的数据。
  • 在使用ANDOR组合条件时,要注意条件的优先级,必要时使用括号明确优先级。
  • 在使用LIKE进行模式匹配时,要注意通配符的位置,因为它会影响查询结果。
  • 在使用子查询时,要注意子查询的性能,因为它们可能会导致查询变慢。

WHERE子句是SQL查询中非常灵活和强大的工具,合理使用可以显著提高查询的效率和准确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1559294.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Win32 API 控制台鼠标操作、坐标获取与相关函数介绍

Win32 API 控制台鼠标操作、坐标获取与相关函数介绍 一、前置介绍读取控制台输入缓冲区数据 ReadConsoleInput 函数控制台输入缓冲区中的输入事件 INPUT_RECORD 结构鼠标输入事件 MOUSE_EVENT_RECORD 结构更改输入模式 SetConsoleMode 函数 二、鼠标坐标获取(以下代码环境为 VS…

PCL 3D-SIFT关键点检测(Z方向梯度约束

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 SIFT关键点检测 2.1.2 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#…

SQL优化 where谓词条件OR优化

1.测试表&#xff0c;及测试语句where条件中OR对应两个字段选择度很高 create table t618 as select * from dba_objects; select object_name from t618 where (object_id12043 or DATA_OBJECT_ID12043) and STATUSVALID; 2.没有索引情况下&#xff0c;全表扫描逻辑读…

C++核心编程和桌面应用开发 第九天(静态多态 动态多态 纯虚函数 抽象类 虚析构 纯虚析构 向上向下类型转换 重载重写重定义)

目录 1.1静态多态 1.2动态多态 1.2.1满足条件 1.2.2动态多态的使用条件 1.3纯虚函数和抽象类 1.3.1纯虚函数 1.3.2抽象类 1.4虚析构/纯虚析构 1.5向上向下类型转换 1.5.1向下类型转换 1.5.2向上类型转换 1.5.3多态中的类型转换 1.6重载重写重定义 1.6.1重载 1.6…

qwt实现码流柱状图多色柱体显示

qwt实现码流柱状图多色柱体显示 1. 前言2. qt实现柱状图3.qwt基础说明3.1 qwt安装与使用3.1.1 下载qwt源码3.1.2 编译3.1.3 安装3.1.4 使用3.2 QwtPlotBarChart类3.2.1画图步骤3.2.2 specialSymbol3.3.3 barTitle4 BsBarChart定制4.1 每个柱体可以显示不同的颜色4.2 每个柱体可…

MFC项目如何使用hiredis库连接redis

如何在windows平台使用c连接redis 1. 下载hiredis的vs工程文件2. 使用vs2022编译hiredis3.项目中调用4. 集群连接5. 简单的封装下 最近需要在windows PC终端读取redis数据。我这里使用hiredis连接redis. 工程是vs2022开发的。 1. 下载hiredis的vs工程文件 windows平台需要自己…

【C/C++】错题记录(七)

题目一 题目二 C在调用函数时&#xff0c;当实参和形参的数据类型不一致时&#xff0c;会发生数据类型转换&#xff01;将低精度转换为高精度时&#xff0c;由编译器隐式完成&#xff1b;将高精度转换为低精度时&#xff0c;必须用强制类型转换运算符&#xff1b; static_cast…

Redis:分布式 - 哨兵

Redis&#xff1a;分布式 - 哨兵 概念哨兵 Docker 搭建哨兵分布式选举流程 概念 Redis 的主从复制模式下&#xff0c;一旦主节点由于故障不能提供服务&#xff0c;需要人工进行主从切换&#xff0c;同时大量的客户端需要被通知切换到新的主节点上&#xff0c;对于上了一定规模…

浏览器动态移动的小球源码分享

浏览器动态移动的小球源码分享 <script>(function(a){var width100,height100,borderRadius100,circlefunction(){};circle.prototype{color:function(){let colour "#"Math.floor(Math.random()*255).toString(16)Math.floor(Math.random()*255).toString…

Linux块设备驱动实验

直接参考【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81 本文仅作为个人笔记使用&#xff0c;方便进一步记录自己的实践总结。 前面我们都是在学习字符设备驱动&#xff0c;本章我们来学习一下块设备驱动框架&#xff0c;块设备驱动是Linux 三大驱动类型之一。块设备驱动要远…

Fiddler配合wireshark解密ssl

环境&#xff1a; win11&#xff08;wireshark&#xff09;--虚拟机win7&#xff08;Fiddler&#xff09;---虚拟机win7&#xff08;HTTPS站点&#xff09; 软件安装问题&#xff1a; 需要.net环境&#xff0c;NDP461-KB3102436-x86-x64-AllOS-ENU.exe。 安装fiddler后安装下…

vite项目打包md5报‘default‘ is not exported错误的解决方法

报错如下&#xff1a; 某一个包中用es方式引入md5模块&#xff0c;导致打包报错&#xff0c;经过一番探究测试&#xff0c;发现我的项目中用了“vite-plugin-require-transform”这个插件&#xff0c;是这个插件在做转换的时候报错了&#xff0c;如果你也是这个原因可按我的方式…

代码随想录day24:贪心part2

121. 买卖股票的最佳时机 class Solution {public int maxProfit(int[] prices) {int ans 0;int minPrice prices[0];for(int p : prices){ans Math.max(ans, p - minPrice);minPrice Math.min(p, minPrice);}return ans;} } 运用前缀和思想&#xff0c; 从左到右枚举卖…

Spring Boot教学资源库:构建微服务的基石

2 相关技术简介 2.1Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;任…

dart-sass和node-sass的区别,使用dart-sass后可能会出现的问题

前言&#xff1a; 2020 年 10 月 27 日&#xff0c;Sass 官方团队正式宣布 Libsass 将弃用&#xff0c;以及基于它的 Node Sass 和 SassC&#xff0c;并且建议用户使用 Dart Sass。如果在 vue 脚手架搭建的项目中需要使用 sass&#xff0c;建议初始化时勾选 sass 配置&#xff…

前端优化之路:git commit 校验拦截

但是想要做到高效落地执行&#xff0c;就需要做些别的功课&#xff0c;先展示下成果图 需要了解git hooks&#xff0c;它是git的钩子&#xff0c;就像vue拥有自己的钩子一样。 官方文档&#xff1a;https://git-scm.com/docs/githooks 项目安装 husky&#xff0c;建议稳定版本…

patch函数前两个参数位

如我们多了解的&#xff0c;patch函数前两个参数位为 oldVnode 和 Vnode &#xff0c;分别代表旧节点和新节点&#xff0c;主要做了四个判断&#xff1a; patchVnode主要做了两个判断&#xff1a;

java中Math类和Random类的api

目录 Math 类 1&#xff09;abs(x) 2&#xff09;ceil(x) 3&#xff09;floor(x) 4&#xff09;round(x) 5&#xff09;max(x, y) 6&#xff09;min(x, y) 7&#xff09;sqrt(x) 8&#xff09;pow(x, y) 9&#xff09;random() 10&#xff09;sin(x), cos(x), tan(x) 11&#x…

购物网站毕业设计-电子电器商城管理系统SpringBootSSM框架开发

目录 1. 系统概述 1.1背景介绍 1.2 课题意义 1.3课题目标 2. 主要功能模块 2.1 前端用户模块 2.2 后端管理模块 2.3 功能图展示 3. 技术选型 3.1 VUE介绍 3.2 JAVA介绍 3.3 MySQL介绍 4. 系统设计 4‌.1数据库设计 5 详细设计 5.1 界面展示 设计一个电子电…

通过Keil5编译软件获取函数最深堆栈

文章目录 1.问题提出2.问题分析3.环境搭建4.解决方案5.经验总结6.疑问 1.问题提出 在编写新软件时&#xff0c;由于某功能需要使用RAM约24KB&#xff0c;而新模块的总RAM是96KB&#xff0c;该某功能一旦开启则需要占用四分之一的RAM空间。为了保证在开启某功能后&#xff0c;新…