【数据库设计和SQL基础语法】--SQL语言概述--SQL的基本结构和语法规则(二)

一、数据控制语言(DCL)

1.1 授权(GRANT)

数据控制语言(DCL)是SQL的一个子集,用于控制数据库中的数据访问和权限。GRANT语句是DCL中的一种,用于向用户或角色授予特定的数据库操作权限。以下是GRANT语句的基本语法:

GRANT privileges
ON object
TO user_or_role [, user_or_role, ...];

其中:

  • privileges表示要授予的权限,如SELECTINSERTUPDATEDELETE等。
  • object表示授权的对象,可以是表、视图等数据库对象。
  • user_or_role表示要授予权限的用户或角色。

示例:

GRANT SELECT, INSERT ON employees
TO user1, user2;

上述示例将employees表的SELECTINSERT权限授予了user1user2两个用户。

GRANT语句的执行通常由数据库管理员(DBA)或具有管理员权限的用户完成。权限的授予使得用户或角色能够执行特定的数据库操作,增强了数据库的安全性和灵活性。在实际应用中,授权应该根据最小权限原则,仅授予用户或角色完成其工作所需的最小权限,以降低潜在的安全风险。

1.2 撤销权限(REVOKE)

REVOKE语句是数据控制语言(DCL)中的一种,用于撤销用户或角色对数据库对象的权限。基本语法如下:

REVOKE privileges
ON object
FROM user_or_role [, user_or_role, ...];

其中:

  • privileges表示要撤销的权限,如SELECTINSERTUPDATEDELETE等。
  • object表示权限作用的对象,可以是表、视图等数据库对象。
  • user_or_role表示要撤销权限的用户或角色。

示例:

REVOKE SELECT, INSERT ON employees
FROM user1, user2;

上述示例撤销了employees表上对user1user2用户的SELECTINSERT权限。

使用REVOKE语句可以有效地管理数据库中的权限,确保用户或角色仅具有其工作所需的最小权限。在执行REVOKE时,需要确保被撤销的权限确实已经存在,否则将产生错误。与GRANT相似,REVOKE的执行通常由数据库管理员(DBA)或具有管理员权限的用户完成。

二、事务控制语言(TCL)

2.1 提交(COMMIT)

COMMIT语句是事务控制语言(TCL)中的一种,用于将数据库事务的所有操作永久性地应用到数据库,并结束事务。在SQL中,COMMIT语句将所有之前使用BEGIN TRANSACTION开始的事务中的操作进行提交,使这些操作成为数据库的一部分。
基本语法如下:

COMMIT;

执行COMMIT后,事务所做的修改将变得永久,并对其他事务可见。这意味着对数据库的更改已成功应用,并且事务结束。
示例:

BEGIN TRANSACTION;
-- 一系列SQL操作
COMMIT;

上述示例中,BEGIN TRANSACTION标志着事务的开始,后续的一系列SQL操作将在事务中执行。最后,COMMIT语句将这些操作提交,使它们成为数据库的一部分。
值得注意的是,如果在事务执行过程中发生了错误,通常会使用ROLLBACK语句来回滚事务,撤销事务中的所有更改,而不是提交。这有助于确保在发生错误时数据库的一致性。在实际应用中,事务的使用对于确保数据库的完整性和一致性至关重要。

2.2 回滚(ROLLBACK)

ROLLBACK语句是事务控制语言(TCL)中的一种,用于撤销事务中的所有未提交的更改,并将数据库状态还原到事务开始之前的状态。如果在事务执行过程中发生错误或者需要取消事务的更改,可以使用ROLLBACK语句。
基本语法如下:

ROLLBACK;

执行ROLLBACK后,事务中的所有更改都将被撤销,数据库将恢复到事务开始之前的状态。这确保了在事务执行过程中发生错误时,数据库保持一致性和完整性。
示例:

BEGIN TRANSACTION;
-- 一系列SQL操作
-- 发生错误,需要回滚
ROLLBACK;

上述示例中,BEGIN TRANSACTION标志着事务的开始,后续的一系列SQL操作执行过程中发生错误,因此使用ROLLBACK将回滚事务,撤销所有更改。在实际应用中,ROLLBACK是确保在事务执行中发生错误时维护数据库的一致性和完整性的重要工具。

三、高级查询

3.1 聚合函数

聚合函数是SQL中的高级查询工具,用于对结果集执行计算,并返回单个值。这些函数通常用于执行诸如求和、计数、平均值等聚合操作。以下是一些常见的聚合函数:

  1. COUNT(): 用于计算结果集中行的数量。
    SELECT COUNT(column_name) FROM table_name;
    
  2. SUM(): 用于计算数值列的总和。
    SELECT SUM(column_name) FROM table_name;
    
  3. AVG(): 用于计算数值列的平均值。
    SELECT AVG(column_name) FROM table_name;
    
  4. MIN(): 用于找到数值列的最小值。
    SELECT MIN(column_name) FROM table_name;
    
  5. MAX(): 用于找到数值列的最大值。
    SELECT MAX(column_name) FROM table_name;
    

这些函数可以与GROUP BY子句结合使用,以便按组执行聚合操作。例如,如果要计算每个部门的员工数量:

SELECT department, COUNT(employee_id) as employee_count
FROM employees
GROUP BY department;

上述查询将返回每个部门的员工数量。
聚合函数在数据分析和报告生成中经常被使用,它们使得可以轻松地从大量数据中提取有用的摘要信息。

3.2 分组与Having子句

在SQL中,GROUP BY子句用于将结果集按一列或多列进行分组,而HAVING子句则用于在分组的基础上对分组进行过滤。这两者通常一起使用,允许在执行聚合函数后对分组应用条件。

  1. GROUP BY 子句
    GROUP BY子句的基本语法如下:
SELECT column1, column2, ..., aggregate_function(column)
FROM table_name
GROUP BY column1, column2, ...;

在这个语句中,column1, column2, ...是要分组的列,aggregate_function(column)是应用于每个组的聚合函数。
例如,如果要按部门分组并计算每个部门的平均工资:

SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department;
  1. HAVING 子句
    HAVING子句用于在分组的基础上进行条件过滤。它类似于WHERE子句,但WHERE用于过滤行,而HAVING用于过滤分组。
    基本语法如下:
SELECT column1, column2, ..., aggregate_function(column)
FROM table_name
GROUP BY column1, column2, ...
HAVING condition;

例如,如果只想选择平均工资大于50000的部门:

SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;

这将返回平均工资大于50000的部门及其对应的平均工资。
HAVING子句允许在聚合函数的基础上进行进一步的筛选,对于复杂的数据分析和报告生成非常有用。

3.3 连接查询

连接查询是在多个表中检索相关数据的一种常见查询操作。SQL提供了不同类型的连接,包括内连接(INNER JOIN)、左连接(LEFT JOIN或LEFT OUTER JOIN)、右连接(RIGHT JOIN或RIGHT OUTER JOIN)和全连接(FULL JOIN或FULL OUTER JOIN)。

  1. 内连接(INNER JOIN)
    内连接返回两个表中匹配行的交集。基本语法如下:
SELECT column1, column2, ...
FROM table1
INNER JOIN table2 ON table1.column = table2.column;

在这个语句中,table1table2是要连接的表,column是连接的条件。
例如,如果有一个employees表和一个departments表,它们通过department_id列关联,可以使用内连接找到员工和其对应部门的信息:

SELECT employees.employee_id, employees.first_name, employees.last_name, departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;
  1. 左连接(LEFT JOIN)
    左连接返回左表中所有行,以及右表中与左表中匹配行的交集。如果右表中没有匹配的行,结果集中右表的列将包含 NULL 值。
    基本语法如下:
SELECT column1, column2, ...
FROM table1
LEFT JOIN table2 ON table1.column = table2.column;

例如,要获取所有员工和其对应部门的信息,包括没有部门的员工:

SELECT employees.employee_id, employees.first_name, employees.last_name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;
  1. 右连接(RIGHT JOIN)
    右连接返回右表中所有行,以及左表中与右表中匹配行的交集。如果左表中没有匹配的行,结果集中左表的列将包含 NULL 值。
    基本语法如下:
SELECT column1, column2, ...
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;

右连接在某些数据库系统中可能不被支持,可以使用左连接的方式进行模拟。

  1. 全连接(FULL JOIN)
    全连接返回两个表中所有行的并集,如果没有匹配的行,将会在结果集中填充 NULL 值。
    基本语法如下:
SELECT column1, column2, ...
FROM table1
FULL JOIN table2 ON table1.column = table2.column;

全连接在某些数据库系统中可能不被支持,可以通过左连接和右连接的组合来实现。
连接查询是处理多表关联数据的重要工具,允许在一个查询中检索并组合来自不同表的信息。

3.4 子查询

子查询是指在查询中嵌套使用的查询语句。子查询通常嵌套在其他查询语句的 WHERE、FROM 或 SELECT 子句中,用于提供更复杂的条件、数据或计算。

  1. 单行子查询
    单行子查询返回一行一列的结果,并通常用于条件判断或计算中。以下是一个示例,使用子查询查找工资最高的员工:
SELECT first_name, last_name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);

在这个例子中,(SELECT MAX(salary) FROM employees) 是一个子查询,用于查找 employees 表中的最高工资,然后外部查询选择具有相同工资的员工记录。

  1. 多行子查询
    多行子查询返回多行多列的结果,并通常用于条件判断或计算中。以下是一个示例,使用子查询查找部门平均工资高于公司平均工资的部门:
SELECT department_id, AVG(salary) AS department_avg_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > (SELECT AVG(salary) FROM employees);

在这个例子中,(SELECT AVG(salary) FROM employees) 是一个子查询,用于计算整个公司的平均工资,然后外部查询选择部门平均工资高于公司平均工资的部门。

  1. 行子查询
    行子查询返回一行多列的结果,并通常用于条件判断或计算中。以下是一个示例,使用子查询检查某个员工是否在指定的部门中:
SELECT employee_id, first_name, last_name, department_id
FROM employees
WHERE (employee_id, department_id) IN (SELECT employee_id, department_id FROM employee_department_mapping);

在这个例子中,(SELECT employee_id, department_id FROM employee_department_mapping) 是一个子查询,用于提供一个包含员工ID和部门ID的结果集,然后外部查询选择符合这些条件的员工记录。
子查询是 SQL 查询中强大且灵活的工具,可以用于处理复杂的条件和数据分析。在编写子查询时,要确保子查询返回的结果集与外部查询的条件兼容。

四、视图

4.1 视图的创建

在SQL中,视图(View)是一种虚拟的表,它基于一个或多个表的查询结果。视图不包含实际的数据,而是根据定义的查询从一个或多个表中检索数据。创建视图可以简化复杂查询、提高查询的可维护性,并对用户隐藏底层表的结构。
以下是创建视图的基本语法:

CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table1
WHERE condition;

其中,view_name 是视图的名称,column1, column2, ... 是视图的列,table1 是从中检索数据的表,condition 是一个可选的筛选条件。
例如,假设有一个名为 employees 的表:

CREATE TABLE employees (employee_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),department VARCHAR(50),salary INT
);

如果要创建一个视图,显示员工ID、姓名和部门,可以使用以下语句:

CREATE VIEW employee_summary AS
SELECT employee_id, first_name, last_name, department
FROM employees;

现在,可以通过查询 employee_summary 视图来获取员工的摘要信息,就好像这个视图是一个实际的表一样:

SELECT * FROM employee_summary;

创建视图有助于简化复杂查询,提高查询的可读性,并且在视图的基础上执行的查询将自动反映底层表的变化。

Tip:视图并不存储实际的数据,而是基于查询结果生成虚拟表。在某些数据库管理系统中,视图也可以用于实现安全性控制,只允许用户访问特定列或行。

4.2 视图的使用

视图在SQL中的使用方式类似于普通的表,可以用于查询、过滤和连接数据,但视图并不存储实际的数据。以下是一些使用视图的常见情景:

  1. 查询数据: 视图可以像表一样用于查询数据。例如,如果有一个名为 employee_summary 的视图,显示员工的摘要信息:

    SELECT * FROM employee_summary;
    

    这将检索并显示 employee_summary 视图中的所有数据。

  2. 过滤数据: 视图可以包含筛选条件,以限制检索的数据。例如,如果 employee_summary 视图包含了部门为 ‘IT’ 的员工信息:

    SELECT * FROM employee_summary WHERE department = 'IT';
    

    这将只返回部门为 ‘IT’ 的员工的信息。

  3. 连接数据: 视图可以与其他表或视图进行连接,实现更复杂的查询。例如,如果有一个名为 department_summary 的视图,显示每个部门的摘要信息,可以通过连接 employee_summarydepartment_summary 来获取更全面的员工信息:

    SELECT es.*, ds.department_name
    FROM employee_summary es
    JOIN department_summary ds ON es.department = ds.department_id;
    

    这将返回每个员工的摘要信息以及其所属部门的名称。

  4. 简化复杂查询: 视图可以将复杂的查询逻辑封装在一个易于理解的接口中,使得查询变得更加简洁。例如,如果有一个视图 high_salary_employees 显示薪水高于某个阈值的员工信息:

    SELECT * FROM high_salary_employees;
    

    这将返回所有薪水高于阈值的员工信息,而不需要复杂的条件。

  5. 提高可维护性: 视图允许将查询逻辑集中在一个地方,当底层表的结构变化时,只需修改视图而不是所有使用该查询的地方。这有助于提高查询的可维护性和代码的重用性。

Tip:虽然视图提供了便利性和灵活性,但在设计和使用时需要注意性能方面的考虑。复杂的视图可能会导致性能问题,特别是在大型数据集上。在使用视图时,建议仔细评估查询的性能,并确保适当的索引和优化策略已经应用。

4.3 视图的更新与删除

在SQL中,视图的更新和删除操作的可行性取决于视图的定义。一般来说,可以更新和删除满足以下条件的视图:

  1. 单表视图(包含来自单个表的数据): 如果视图是从单个表派生的简单查询,通常是可以进行更新和删除操作的。例如:

    CREATE VIEW my_view AS
    SELECT column1, column2
    FROM my_table
    WHERE condition;
    

    对于这样的视图,你可以使用 UPDATEDELETE 语句,就像操作普通表一样:

    UPDATE my_view SET column1 = value1 WHERE condition;
    DELETE FROM my_view WHERE condition;
    
  2. 包含所有更新所需的信息: 视图的更新和删除操作需要包含所有更新所需的信息,包括在视图定义中涉及的列。如果视图的定义涉及多个表,更新和删除操作可能会受到限制。

    CREATE VIEW employee_info AS
    SELECT employees.employee_id, employees.first_name, departments.department_name
    FROM employees
    JOIN departments ON employees.department_id = departments.department_id;
    

    在上面的例子中,employee_info 视图显示了员工的一些信息以及他们所在部门的名称。你可以更新和删除 employee_info 视图中的数据,前提是提供了足够的信息,包括 employee_idfirst_namedepartment_name

    UPDATE employee_info SET first_name = 'NewName' WHERE employee_id = 123;
    DELETE FROM employee_info WHERE employee_id = 456;
    

    请注意,这些操作实际上会影响到 employees 表,因为 employee_info 视图是基于 employees 表的。

五、存储过程和触发器

5.1 存储过程的定义和调用

在SQL中,存储过程是一组预编译的SQL语句,它们可以被存储在数据库中并在需要时进行调用。存储过程通常用于执行特定的任务或操作,并可以接受输入参数和返回结果。

  1. 存储过程的定义
    以下是一个简单的存储过程定义的示例:
DELIMITER //CREATE PROCEDURE my_procedure (IN param1 INT, OUT result INT)
BEGIN-- 存储过程的SQL语句SELECT column1 INTO result FROM my_table WHERE another_column = param1;
END //DELIMITER ;

在上述示例中:

  • my_procedure 是存储过程的名称。
  • (IN param1 INT, OUT result INT) 定义了输入参数 param1 和输出参数 result 的类型。
  • 存储过程体以 BEGIN 开始,以 END 结束,其中包含了执行的SQL语句。
  1. 存储过程的调用
    调用存储过程的方法取决于所使用的数据库管理系统。以下是一般的调用方法:
CALL my_procedure(123, @output);

在这个调用中,123 是传递给 param1 的输入参数值,@output 是用于接收输出参数值的变量。
如果存储过程执行成功,可以通过查询 @output 变量来获取输出结果:

SELECT @output;

请注意,存储过程的调用方式可能因数据库管理系统而异,上述示例适用于MySQL。在其他系统中,请查阅相应的文档以了解正确的调用语法。
存储过程的优点包括:

  • 重用性: 存储过程可以在多个地方被调用,提高了代码的重用性。
  • 性能优化: 存储过程可以预编译并存储在数据库中,从而提高执行效率。
  • 安全性: 存储过程可以通过授权的方式限制对数据库的访问,提高安全性。

存储过程在不同的数据库系统中可能有一些差异,因此在具体使用时,请参考相应数据库的文档。

5.2 触发器的创建和触发条件

在SQL中,触发器(Trigger)是与表相关联的一段代码,当表上的特定事件发生时,触发器会自动执行。触发器通常用于实现在数据库层面的业务逻辑,例如在插入、更新或删除数据时执行某些操作。

  1. 触发器的创建
    以下是一个通用的创建触发器的示例:
DELIMITER //CREATE TRIGGER trigger_name
AFTER INSERT ON table_name
FOR EACH ROW
BEGIN-- 触发器的SQL语句-- 可以包含任何合法的SQL语句,用于在特定事件发生时执行操作INSERT INTO log_table (event_description, event_time)VALUES ('New row inserted', NOW());
END //DELIMITER ;

在上述示例中:

  • trigger_name 是触发器的名称。
  • AFTER INSERT ON table_name 指定触发器是在 table_name 表上执行插入操作之后触发的。
  • FOR EACH ROW 表示触发器会为每一行执行一次。
  • 触发器体以 BEGIN 开始,以 END 结束,其中包含在触发事件发生时执行的SQL语句。
  1. 触发条件
    触发器可以与不同的触发事件相关联,常见的触发事件包括:
  • AFTER INSERT: 在插入数据后触发。
  • AFTER UPDATE: 在更新数据后触发。
  • AFTER DELETE: 在删除数据后触发。
  • BEFORE INSERT: 在插入数据前触发。
  • BEFORE UPDATE: 在更新数据前触发。
  • BEFORE DELETE: 在删除数据前触发。

触发器可以根据需要选择性地使用这些触发事件,并在每个事件上执行不同的操作。
以下是一个具体的例子,创建一个在员工表插入记录后触发的触发器:

DELIMITER //CREATE TRIGGER after_employee_insert
AFTER INSERT ON employees
FOR EACH ROW
BEGIN-- 触发器的SQL语句INSERT INTO audit_log (event_description, event_time)VALUES ('New employee inserted', NOW());
END //DELIMITER ;

在上述示例中,after_employee_insert 触发器在 employees 表上执行插入操作后触发,每次插入新员工记录时,都会在 audit_log 表中插入相应的日志。这只是一个示例,实际使用时应根据具体业务需求和数据库系统的语法进行调整。

六、总结

今天学习了SQL的核心概念。深入探讨了数据控制语言、事务控制语言、高级查询、触发器、视图等高级主题,为深入理解数据库操作奠定了基础。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络 | 物理层下 传输媒介、信道复用技术,带宽接入技术

文章目录 3. 物理层下面的传输媒介3.1 导引型传输媒介3.2 非导引型传输媒介 4 信道复用技术5 数字传输系统5.1 旧的数字系统5.2 新数字系统 6 带宽接入技术6.1 DSL(数字用户线)6.2HFC 光纤同轴混合网6.2.1 接入 6.3 FTTx技术 3. 物理层下面的传输媒介 传…

层规范化(Layer Normalization)和正则化(Regularization)

层规范化(Layer Normalization)和正则化(Regularization)是两个不同的概念,尽管它们都在机器学习和深度学习中非常重要,但它们的目的和应用方式有所不同。 层规范化(Layer Normalization&#x…

KALI LINUX攻击与渗透测试

预计更新 第一章 入门 1.1 什么是Kali Linux? 1.2 安装Kali Linux 1.3 Kali Linux桌面环境介绍 1.4 基本命令和工具 第二章 信息收集 1.1 网络扫描 1.2 端口扫描 1.3 漏洞扫描 1.4 社交工程学 第三章 攻击和渗透测试 1.1 密码破解 1.2 暴力破解 1.3 漏洞利用 1.4 …

嵌入式软件开发常用的关键字和运算符

目录 1、volatile关键字 2、const关键字 3、static关键字 4、struct与union 5、预定义标识符 6、#与## 7、void 与 void*关键字 8、weak关键字 1、volatile关键字 volatile是一个特征修饰符,提醒编译器它后面所定义的变量随时都有可能改变,因此…

FL Studio 21.2.1.3859中文破解激活版2024免费下载安装图文教程

FL Studio 21.2.1.3859中文破解激活版是我见过更新迭代最快的宿主软件,没有之一。FL Studio12、FL Studio20、FL Studio21等等。有时甚至我刚刚下载好了最新版本,熟悉了新版本一些好用的操作,Fl Studio就又推出了更新的版本,而且F…

WebGL笔记:矩阵平移的数学原理和实现

矩阵平移的数学原理 让向量OA位移 x方向&#xff0c;txy方向&#xff0c;tyz方向&#xff0c;tz 最终得到向量OB 矩阵平移的应用 再比如我要让顶点的x移动0.1&#xff0c;y移动0.2&#xff0c;z移动0.3 1 &#xff09;顶点着色器核心代码 <script id"vertexShader&…

CentOS服务器网页版Rstudio-server及R包批量安装最佳实践

CentOS服务器安装网页版Rstudio-server及R包批量安装 以下为CentOS 7/8的Rstudio-server安装、配置和R包安装操作 1. 软件包安装 Centos 7安装 # 下载安装包,大小115.14 MB wget -c https://download2.rstudio.org/server/centos7/x86_64/rstudio-server-rhel-2023.09.1-…

聊聊logback的ThrowableProxyConverter

序 本文主要研究一下logback的ThrowableProxyConverter ThrowableHandlingConverter ch/qos/logback/classic/pattern/ThrowableHandlingConverter.java /*** Converter which handle throwables should be derived from this class.**/ public abstract class ThrowableHa…

面试官:说说Vue中Proxy与Object.defineProperty的用法与区别

前言 面试时&#xff0c;我们说完Vue响应式原理&#xff0c;或者Vue2和Vue3的区别时&#xff0c;通常会引出Vue3使用了Proxy来优化响应式&#xff0c;而面试官会继续深挖&#xff1a;说说Proxy与Object.defineProperty的区别。 我们不能只说Proxy直接代理一个对象&#xff0c…

带头双向循环链表:一种高效的数据结构

&#x1f493; 博客主页&#xff1a;江池俊的博客⏩ 收录专栏&#xff1a;数据结构探索&#x1f449;专栏推荐&#xff1a;✅cpolar ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f525;编译环境&#xff1a;Visual Studio 2022&#x1f389;欢迎大…

基于maobox-gl 纯前端绘制全球色斑图

基于maobox-gl.js、turf.js 绘制全球色斑图绘制 1、准备全球的某一类的点位数据&#xff0c;可以使用turf.js 随机生成点&#xff0c;并点数据赋properties属性 let points turf.randomPoint(30, { bbox: [-180, -90, 180, 90]}); let interpolateOptions {gridType: "…

Linux下Python调用C语言

一&#xff1a;Python调用C语言场景 1&#xff0c;已经写好的C语言代码&#xff0c;不容易用Python实现&#xff0c;想直接通过Python调用写好的C语言代码 2&#xff0c;C比Python快&#xff08;只是从语言层面&#xff0c;不能绝对说C程序就是比Python快&#xff09; 3&…

某音订单接口在电商行业中的重要性及实践应用

一、引言 随着移动互联网的快速发展&#xff0c;短视频平台抖音已经成为人们日常生活中不可或缺的一部分。越来越多的商家开始利用抖音平台推广和销售商品&#xff0c;从而实现商业变现。在这个过程中&#xff0c;抖音订单接口起到了至关重要的作用。本文将详细探讨抖音订单接…

希尔排序(Java)

目录 希尔排序的步骤&#xff1a; Java实现希尔排序&#xff1a; 希尔排序&#xff08;Shell Sort&#xff09;是一种插入排序的改进算法&#xff0c;它通过比较距离较远的元素交换位置&#xff0c;从而实现数据局部的较小规模排序&#xff0c;逐渐减小元素之间的间隔&#x…

遥感方向期刊总结

开眼看期刊~ 期刊分区信息搜索网址中国科学院文献情报中心期刊分区表升级版科研通期刊查询&#xff1a; 遥感领域常见期刊Nature CommunicationsRemote Sensing of EnvironmentProceedings of the National Academy of Sciences &#xff08;PNAS&#xff09;ISPRS Journal of …

C++ day50 买卖股票最佳时机

题目1&#xff1a;123 买卖股票的最佳时机Ⅲ 题目链接&#xff1a;买卖股票的最佳时机Ⅲ 对题目的理解 prices[i]表示股票在第i天的价格&#xff0c;最多可以完成两笔交易&#xff0c;不能同时进行多笔交易 可以买卖一次&#xff0c;两次&#xff0c;也可以不买卖 动态规划…

[字符串操作] 分割乘积

​ 分割乘积 题目描述 给定一个整数&#xff0c;求插入两个乘号将该整数分割成三个数之后&#xff0c;三个数的的最大乘积。 关于输入 只有一行&#xff0c;一个整数。 关于输出 所求出的最大乘积。 例子输入 4242例子输出 336提示信息 整数有正有负&#xff0c;注意&…

yolov5 7.0版本部署手机端。通过pnnx导出ncnn。

yolov5 7.0版本部署手机端。通过pnnx导出ncnn。 流程配置ncnn android yolov5导出自己模型的ncnn修改yolo.py文件导出TorchScript文件pnnx转torchscript为ncnn 安卓运行权重路径输入输出anchors 大小类别名generate_proposals方法修改 结果 流程 网络yolov5 的部署已经有很多了…

最新最全的Postman接口测试: postman实现参数化

什么时候会用到参数化 比如&#xff1a;一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块&#xff1a;正确的用户名&#xff0c;密码 成功&#xff1b;错误的用户名&#xff0c;正确的密码 失败 postman实现参数化 在实际的接口测试中&#xff0c;部分参数…

Redis Cluster

概念 Redis Cluster采用多主多从的方式&#xff0c;支持开启多个主节点&#xff0c;每个主节点可以挂载多个从节点。 Cluster会将数据进行分片&#xff0c;将数据分散到多个主节点上&#xff0c;而每个主节点都可以对外提供读写服务。这种做法使得Redis突破了单机内存大小的限制…