【数据库设计和SQL基础语法】--查询数据--分组查询

一、分组查询概述

1.1 什么是分组查询

分组查询是一种 SQL 查询技术,通过使用 GROUP BY 子句,将具有相同值的数据行分组在一起,然后对每个组应用聚合函数(如 COUNT、SUM、AVG等)。这允许在数据集中执行汇总和统计操作,以便更清晰地理解和分析数据的特征。分组查询常用于对大量数据进行聚合和摘要,提供有关数据分布和特征的洞察。

1.2 分组查询的作用

以下是分组查询的一些主要作用:

  1. 数据汇总: 分组查询可以用于对数据进行汇总,计算每个分组的总和、平均值、最大值、最小值等统计信息。这对于了解数据的整体特征以及各个分组之间的差异非常有用。
  2. 数据分类: 当需要按照某个列对数据进行分类时,分组查询是很有帮助的。例如,你可以按照地区、部门、时间等将数据进行分组,以便更好地理解和分析。
  3. 统计分析: 分组查询支持对数据进行更深入的统计分析。通过结合分组查询和聚合函数,可以得到更详细的数据摘要,有助于发现数据中的模式和趋势。
  4. 筛选数据: 通过将数据分组并应用条件,可以轻松地筛选出符合特定条件的数据子集。这使得可以对关键数据进行更有针对性的分析。
  5. 提高查询性能: 在处理大量数据时,分组查询有时可以优化查询性能。通过将数据分组,数据库引擎可以更有效地执行聚合计算,减少处理的数据量,提高查询速度。

示例(使用SQL语句):

-- 以部门为单位,计算每个部门的员工数量和平均工资
SELECT department, COUNT(*) AS employee_count, AVG(salary) AS average_salary
FROM employees
GROUP BY department;

在上面的示例中,数据按照部门进行分组,然后分别计算每个部门的员工数量和平均工资。这样就能够以更清晰的方式了解不同部门的情况。

二、GROUP BY 子句

2.1 GROUP BY 的基本语法

在 SQL 中,GROUP BY 语句用于对结果集进行分组。其基本语法如下:

SELECT column1, column2, aggregate_function(column3)
FROM table
WHERE condition
GROUP BY column1, column2;
  • SELECT: 要检索的列或表达式。
  • FROM: 数据来源的表。
  • WHERE: (可选)筛选条件,用于过滤要分组的数据。
  • GROUP BY: 指定分组的列。查询结果将按照这些列中的值进行分组。
  • aggregate_function: 对每个分组执行的聚合函数,如 COUNT、SUM、AVG、MAX、MIN 等。

以下是一个具体的例子:

-- 以部门为单位,计算每个部门的员工数量和平均工资
SELECT department, COUNT(*) AS employee_count, AVG(salary) AS average_salary
FROM employees
GROUP BY department;

在这个例子中,employees 表按照 department 列进行分组,然后对每个部门计算员工数量和平均工资。

Tip:SELECT 中的列必须是 GROUP BY 子句中列的函数,或者是聚合函数。如果在 SELECT 中引用了未在 GROUP BY 中列出的列,那么该列的值将是该分组中第一个遇到的值,这在某些数据库系统中是允许的,但在其他系统中可能导致错误。

2.2 GROUP BY 的多列分组

在 GROUP BY 子句中,你可以指定多列进行分组,以更精细地组织数据。多列分组的基本语法如下:

SELECT column1, column2, aggregate_function(column3)
FROM table
WHERE condition
GROUP BY column1, column2;

这里 column1column2 是你希望用来进行分组的列。查询结果将按照这两列中的值进行分组。

举个例子,假设你有一个订单表(orders),包含了订单信息,包括订单日期(order_date)、客户ID(customer_id)和订单总额(total_amount)。你想要按照订单日期和客户ID对订单进行分组,并计算每个组的订单总额。

-- 按照订单日期和客户ID分组,计算每个组的订单总额
SELECT order_date, customer_id, SUM(total_amount) AS total_order_amount
FROM orders
GROUP BY order_date, customer_id;

在这个例子中,订单表按照订单日期和客户ID进行了分组,并计算了每个组的订单总额。通过 GROUP BY 子句,你可以看到每个特定日期和客户ID的订单总额。这种多列分组使你能够更详细地了解数据的组织结构。

2.3 GROUP BY 与聚合函数结合

GROUP BY 与聚合函数结合使用是非常常见的数据库查询模式。通过将 GROUP BY 与聚合函数一起使用,可以对分组的数据执行各种聚合计算。以下是一个示例,演示了如何使用 GROUP BY 与聚合函数:
假设有一个销售订单表(sales_orders),包含了订单的信息,如订单日期(order_date)、产品ID(product_id)和销售数量(quantity)。

-- 按照产品ID分组,计算每个产品的总销售数量和平均销售数量
SELECT product_id, SUM(quantity) AS total_sales, AVG(quantity) AS average_sales
FROM sales_orders
GROUP BY product_id;

在这个例子中,我们按照产品ID进行分组,并使用了两个聚合函数,SUM 和 AVG。SUM 计算了每个产品的总销售数量,而 AVG 计算了每个产品的平均销售数量。通过 GROUP BY,查询结果中的每一行表示一个产品ID,以及与之相关的总销售数量和平均销售数量。
其他常用的聚合函数还包括 COUNT、MAX、MIN 等,可以根据需要选择适当的聚合函数。GROUP BY 与聚合函数结合使用,可以提供对数据更详细的摘要信息,帮助分析和理解数据。

三、HAVING 子句

3.1 HAVING 的作用

HAVING 子句是在 SQL 查询中用于过滤分组后的结果集的一种方式。它通常与 GROUP BY 一起使用,用于对分组数据应用条件过滤。HAVING 子句允许你筛选基于聚合函数计算的值,而 WHERE 子句则用于筛选原始数据行。
基本语法如下:

SELECT column1, aggregate_function(column2)
FROM table
WHERE condition
GROUP BY column1
HAVING condition;

其中,HAVING 子句的作用是对分组进行条件筛选,而 WHERE 子句是对原始数据行进行条件筛选。
举个例子,假设你有一个订单表(orders),包含了订单信息,包括订单日期(order_date)、客户ID(customer_id)和订单总额(total_amount)。你想找到总订单额超过1000的客户,并计算其总订单额。

-- 按照客户ID分组,计算每个客户的总订单额,然后筛选总订单额超过1000的客户
SELECT customer_id, SUM(total_amount) AS total_order_amount
FROM orders
GROUP BY customer_id
HAVING SUM(total_amount) > 1000;

在这个例子中,首先按照客户ID进行分组,然后使用 HAVING 子句筛选出总订单额超过1000的客户。这种方式可以用来对分组后的结果进行更细粒度的筛选,以便只保留满足特定条件的分组。

3.2 HAVING 的语法

HAVING 子句的语法如下:

SELECT column1, aggregate_function(column2)
FROM table
WHERE condition
GROUP BY column1
HAVING condition;

在这个语法中:

  • SELECT: 指定要检索的列或表达式。
  • FROM: 指定数据来源的表。
  • WHERE: (可选)用于过滤原始数据行的条件。
  • GROUP BY: 指定分组的列。
  • HAVING: 用于对分组进行条件筛选的子句。

具体来说,HAVING 子句通常用于对分组后的结果应用条件。这些条件基于聚合函数计算的值,而不是原始数据行。这使得你可以过滤出满足特定聚合条件的分组结果。
以下是一个更具体的例子:

-- 按照部门分组,计算每个部门的平均工资,并只显示平均工资大于50000的部门
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;

在这个例子中,HAVING 子句筛选出平均工资大于50000的部门,从而仅显示符合条件的分组结果。

四、分组排序

4.1 使用 ORDER BY 对分组结果排序

ORDER BY 子句用于对查询结果进行排序。当与 GROUP BY 一起使用时,ORDER BY 可以用来对分组结果进行排序。以下是使用 ORDER BY 对分组结果排序的基本语法:

SELECT column1, aggregate_function(column2)
FROM table
WHERE condition
GROUP BY column1
HAVING condition
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;

在这个语法中:

  • ORDER BY: 用于指定排序的列。
  • ASC: 升序排序(默认)。
  • DESC: 降序排序。

举例说明,假设你有一个销售订单表(sales_orders),包含了订单的信息,如订单日期(order_date)、产品ID(product_id)和销售数量(quantity)。你想要按照产品ID分组,计算每个产品的总销售数量,并按照总销售数量降序排序。

-- 按照产品ID分组,计算每个产品的总销售数量,按照总销售数量降序排序
SELECT product_id, SUM(quantity) AS total_sales
FROM sales_orders
GROUP BY product_id
ORDER BY total_sales DESC;

在这个例子中,ORDER BY total_sales DESC 指定了按照总销售数量降序排序。你可以根据需要指定多个排序条件,以便更精细地控制结果的排序顺序。

总的来说,ORDER BY 子句允许你对查询结果进行排序,使结果更易读或更符合你的需求。

4.2 GROUP BY 与 ORDER BY 的区别

GROUP BYORDER BY 是 SQL 查询中两个不同的子句,它们有着不同的作用:

  1. GROUP BY:
    • 作用: GROUP BY 用于对查询结果进行分组,将相同的值放在一起,然后对每个组应用聚合函数,计算汇总值。
    • 使用场景: 当你想要对数据进行分组,并对每个组应用聚合函数(如 COUNT、SUM、AVG)以计算统计信息时,你会使用 GROUP BY
SELECT column1, COUNT(column2)
FROM table
GROUP BY column1;
  1. ORDER BY:
    • 作用: ORDER BY 用于对查询结果进行排序,可以按照一个或多个列的值进行升序或降序排序。
    • 使用场景: 当你想要对查询结果按照某一列或多列的值进行排序时,你会使用 ORDER BY
SELECT column1, column2
FROM table
ORDER BY column1 DESC, column2 ASC;

区别总结:

  • GROUP BY 用于分组和聚合数据,通常与聚合函数一起使用。
  • ORDER BY 用于对查询结果进行排序,以更好地组织展示结果,不涉及数据的分组和聚合。

Tip:如果在 SELECT 语句中使用了 GROUP BY 子句,那么 ORDER BY 子句通常放在 GROUP BY 子句之后。这是因为排序通常是在分组之后进行的。例如:

SELECT column1, COUNT(column2) AS count_column2
FROM table
GROUP BY column1
ORDER BY count_column2 DESC;

五、分组集

5.1 GROUPING SETS 的概念

GROUPING SETS 是 SQL 中用于同时对多个分组集合进行聚合查询的一种语法。它允许你在单个查询中同时指定多个不同的分组,从而获取多个层次上的聚合结果。这样,你可以一次性获取多个聚合级别的数据,而不必多次执行相似的查询。
基本语法如下:

SELECT column1, column2, aggregate_function(column3)
FROM table
GROUP BY GROUPING SETS ((column1, column2), (column1), (column2), ());

其中,GROUPING SETS 子句的参数是一个包含多个分组集合的括号列表。每个分组集合都由一个或多个列组成,代表一个要进行聚合的分组。空括号 () 表示全局总计。
举个例子,假设你有一个销售订单表(sales_orders),包含了订单的信息,如订单日期(order_date)、产品ID(product_id)、区域(region)和销售数量(quantity)。你想同时获取按照产品ID、区域和全局总计的销售数量。

SELECT product_id, region, SUM(quantity) AS total_sales
FROM sales_orders
GROUP BY GROUPING SETS ((product_id, region), (product_id), (region), ());

在这个例子中,GROUPING SETS 子句允许你一次性获取按照产品ID、区域和全局总计的销售数量。这样,你可以在单个查询中获取多个层次上的聚合结果,而不必分别执行多个查询。

5.2 使用 GROUPING SETS 进行多组分组

GROUPING SETS 允许你一次性对多个组进行分组,并在同一查询中获取多个层次上的聚合结果。以下是一个示例,演示如何使用 GROUPING SETS 进行多组分组:
假设有一个销售订单表(sales_orders),包含了订单的信息,如订单日期(order_date)、产品ID(product_id)、区域(region)和销售数量(quantity)。

-- 使用 GROUPING SETS 进行多组分组,计算销售数量的总和
SELECT product_id, region, SUM(quantity) AS total_sales
FROM sales_orders
GROUP BY GROUPING SETS ((product_id, region), (product_id), (region), ());

在这个例子中,GROUP BY GROUPING SETS 指定了三个不同的分组集合:

  1. (product_id, region): 按照产品ID和区域进行分组。
  2. (product_id): 按照产品ID进行分组。
  3. (region): 按照区域进行分组。
  4. ()(空括号): 表示全局总计。

这样,查询结果将包含按照产品ID和区域、按照产品ID、按照区域以及全局总计的销售数量。你可以在同一查询中获得这些不同层次的汇总信息。

六、ROLLUP 和 CUBE

6.1 ROLLUP 的使用

ROLLUP 是 SQL 中用于进行多层次聚合的操作符之一。它允许你在查询中指定多个层次的分组,并在同一查询中获取这些层次的汇总结果。ROLLUP 会生成包含从最精细到最总体的所有可能的组合的聚合结果。
基本的 ROLLUP 语法如下:

SELECT column1, column2, aggregate_function(column3)
FROM table
GROUP BY ROLLUP (column1, column2);

在这个语法中,ROLLUP 子句指定了要进行多层次分组的列,生成的结果将包含每个列组合的聚合值,以及每个列的总计值。
举个例子,假设你有一个销售订单表(sales_orders),包含了订单的信息,如订单日期(order_date)、产品ID(product_id)、区域(region)和销售数量(quantity)。

-- 使用 ROLLUP 进行多层次聚合,计算销售数量的总和
SELECT product_id, region, SUM(quantity) AS total_sales
FROM sales_orders
GROUP BY ROLLUP (product_id, region);

在这个例子中,ROLLUP (product_id, region) 将生成按照产品ID和区域、按照产品ID、按照区域和全局总计的销售数量的聚合结果。这样,你可以在同一查询中获得不同层次的汇总信息。
ROLLUP 提供了一种方便的方式,通过单一查询获取多个层次上的聚合结果,避免了多次执行类似的查询。需要注意的是,ROLLUP 生成的总计行会有 NULL 值,表示在该列上的总计。

6.2 CUBE 的使用

CUBE 是 SQL 中用于进行多维度聚合的操作符之一。它允许在同一查询中指定多个维度,并生成包含所有可能组合的聚合结果。CUBE 操作符生成的结果比 ROLLUP 更全面,因为它包含了所有可能的组合。
基本的 CUBE 语法如下:

SELECT column1, column2, aggregate_function(column3)
FROM table
GROUP BY CUBE (column1, column2);

在这个语法中,CUBE 子句指定了要进行多维度分组的列,生成的结果将包含每个列组合的聚合值,以及所有可能的列组合的总计值。
举个例子,假设你有一个销售订单表(sales_orders),包含了订单的信息,如订单日期(order_date)、产品ID(product_id)、区域(region)和销售数量(quantity)。

-- 使用 CUBE 进行多维度聚合,计算销售数量的总和
SELECT product_id, region, SUM(quantity) AS total_sales
FROM sales_orders
GROUP BY CUBE (product_id, region);

在这个例子中,CUBE (product_id, region) 将生成按照产品ID、按照区域、按照产品ID和区域、以及全局总计的销售数量的聚合结果。这样,你可以在同一查询中获得多个维度上的汇总信息。
CUBE 提供了一种方便的方式,通过单一查询获取多个维度上的聚合结果,避免了多次执行类似的查询。需要注意的是,CUBE 生成的总计行会有 NULL 值,表示在该列上的总计。

6.3 ROLLUP 与 CUBE 的区别

ROLLUPCUBE 都是 SQL 中用于进行多层次聚合的操作符,它们的主要区别在于生成的聚合结果的全面性和维度的不同。

  1. ROLLUP:
  • 语法: 使用 ROLLUP 时,你指定一个列列表,表示要进行多层次分组的列。ROLLUP 生成一个包含每个列组合的聚合值,以及每个列的总计值。
  • 示例:
    SELECT column1, column2, aggregate_function(column3)
    FROM table
    GROUP BY ROLLUP (column1, column2);
    
  • 生成结果: 生成的结果包含了每个列的每个组合的聚合值,以及每个列的总计值。
  1. CUBE:
  • 语法: 使用 CUBE 时,你同样指定一个列列表,表示要进行多维度分组的列。CUBE 生成一个包含每个列组合的聚合值,以及所有可能的列组合的总计值。
  • 示例:
    SELECT column1, column2, aggregate_function(column3)
    FROM table
    GROUP BY CUBE (column1, column2);
    
  • 生成结果: 生成的结果包含了每个列的每个组合的聚合值,以及所有可能的列组合的总计值,更全面。
  1. 区别总结:
  • 结果全面性:

    • ROLLUP 生成的结果包含每个列的每个组合的聚合值,以及每个列的总计值。
    • CUBE 生成的结果不仅包含每个列的每个组合的聚合值,还包含所有可能的列组合的总计值。
  • 维度数量:

    • ROLLUP 用于指定一组列进行分组。
    • CUBE 用于指定一组列进行多维度分组。
  • 语法:

    • ROLLUP 使用 ROLLUP 子句。
    • CUBE 使用 CUBE 子句。

选择使用 ROLLUP 还是 CUBE 取决于你需要的分组层次和全面性。如果你只需要在一组列上进行层次分组,可以使用 ROLLUP。如果你希望同时获取多个列的所有可能组合的总计值,可以使用 CUBE

七、 最佳实践和注意事项

在进行分组查询时,有一些最佳实践和注意事项可以帮助你编写更有效和可维护的 SQL 查询:

  1. 选择适当的聚合函数: 根据你的需求选择正确的聚合函数,如 COUNT、SUM、AVG、MAX、MIN 等。确保聚合函数与你关心的信息一致。

  2. 理解 GROUP BY 子句的含义: GROUP BY 子句指定了分组的条件,确保你理解每个分组的含义,以便正确计算聚合函数。

  3. 使用别名提高可读性: 为列和聚合函数使用有意义的别名,提高查询结果的可读性。

    SELECT department, COUNT(*) AS employee_count
    FROM employees
    GROUP BY department;
    
  4. *谨慎使用 SELECT 尽量避免使用 SELECT *,而是选择明确指定所需的列。这有助于提高查询的性能和可维护性。

  5. 合理使用 WHERE 子句: 在 GROUP BY 之前使用 WHERE 子句过滤数据,以减小分组的数据集,提高查询性能。

  6. 了解 HAVING 子句的使用场景: HAVING 子句用于在分组后对聚合结果进行筛选,要谨慎使用。通常,它用于过滤聚合值,而不是原始数据行。

  7. 避免在 GROUP BY 中使用过多列: 尽量保持 GROUP BY 中列的数量较少,以防止生成过多的组合,从而降低性能。

  8. 理解 ROLLUP 和 CUBE 的用途: ROLLUP 和 CUBE 允许你在一个查询中获得多个分组层次的聚合结果。选择使用它们时要确保理解它们的效果。

  9. 考虑索引的影响: 确保表中使用了适当的索引,以提高 GROUP BY 操作的性能。

  10. 测试和优化: 对于复杂的分组查询,进行测试和性能优化是重要的。使用数据库性能分析工具,确保查询在处理大量数据时仍然高效。

  11. 文档化查询: 对于复杂的查询,添加注释以解释查询的目的和分组策略,提高查询的可理解性。

通过遵循这些最佳实践,你可以更好地编写和优化分组查询,以满足业务需求并提高查询性能。

八、总结

分组查询是SQL中重要的功能,通过GROUP BY子句将数据按指定列分组,结合聚合函数计算统计信息。ROLLUP和CUBE提供了多层次聚合的方式。在实践中,选择适当的聚合函数和理解GROUP BY的含义至关重要。使用别名、谨慎使用SELECT *、合理利用WHERE子句,都有助于提高可读性和性能。注意避免过多列的GROUP BY,理解HAVING的用途,以及测试和优化查询。最终,文档化查询并遵循最佳实践可确保编写高效、清晰的分组查询。

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

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

相关文章

Python往事:ElementTree的单引号之谜

最近在针对某款设备的界面xml进行更新过程中,被告知回稿的字串放在了一个excel文件中,而我要上传到服务器的界面用语是用xml文件封装的。再经过详细求证了翻译组提供excel文件的原因后,我决定用python来完成界面用语xml的更新,但是…

OOD 异常GPT:使用大型视觉语言模型检测工业异常

paper link https://arxiv.org/abs/2308.15366video demo https://youtu.be/lcxBfy0YnNAgithub https://github.com/CASIA-IVA-Lab/AnomalyGPT在线使用 https://huggingface.co/spaces/FantasticGNU/AnomalyGPT 摘要 大型视觉语言模型(LVLM)如MiniGPT-4…

大数据CloudSim应用实践

CloudSimExampleA.java 1准备 1.1操作系统 本实验在Windows 7 或Windows 10系统运行均可。 1.2软件 cloudsim-3.0.3.zip; commons-math3-3.2-bin.zip; jdk-8u152-windows-x64.exe; eclipse-jee-neon-3-win32-x86_64 所需资料链接&#xff1…

W25Q64(模拟SPI)读写数据的简单应用

文章目录 一、W25Q64是什么?二、使用步骤1.硬件1.引脚说明2.硬件连接3.设备ID4.内部框架5.指令集指令集1指令集2 2.软件1.W25Q64引脚定义代码如下(示例):2.W25Q64初始化代码如下(示例):3.W25Q64…

【IC前端虚拟项目】MVU模块方案与背景熟悉

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 mvu这个模块是干嘛用的呢?从这个名字就可以看出来move_unit,应该是做数据搬运的。很多指令级中都会有数据搬运的指令,这类指令的作用一般是在片内片外缓存以及通用专用…

Skywalking告警规则示例

skywalking告警规则文件配置示例【包含自定义规则】: # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ow…

【C++多线程编程】(二)之详解锁(lock)和解锁(unlock)

在C多线程编程中,锁(lock)和解锁(unlock)通常用于管理共享资源的访问,以防止多个线程同时对资源进行修改,从而避免竞态条件(Race Condition)和数据不一致性问题。C标准库…

Java基础语法之抽象类和接口

抽象类 什么是抽象类 并不是所有的类都是用来描述对象的,这样的类就是抽象类 例如,矩形,三角形都是图形,但图形类无法去描述具体图形,所以它的draw方法无法具体实现,这个方法就可以没设计成抽象方法&…

常用模块之(time/datetime)

【 一 】时间模块(time/datetime) 【 二 】 表示时间的三种方式 *时间戳(Timestamp)是指1970年1月1日00:00:00开始计算的偏移量。可以使用time模块中的time()函数获取当前时间的时间戳,也可以使用datetime模块中的tim…

大创项目推荐 深度学习 python opencv 实现人脸年龄性别识别

文章目录 0 前言1 项目课题介绍2 关键技术2.1 卷积神经网络2.2 卷积层2.3 池化层2.4 激活函数:2.5 全连接层 3 使用tensorflow中keras模块实现卷积神经网络4 Keras介绍4.1 Keras深度学习模型4.2 Keras中重要的预定义对象4.3 Keras的网络层构造 5 数据集处理训练5.1 …

ElasticSearch学习篇8_Lucene之数据存储(Stored Field、DocValue、BKD Tree)

前言 Lucene全文检索主要分为索引、搜索两个过程,对于索引过程就是将文档磁盘存储然后按照指定格式构建索引文件,其中涉及数据存储一些压缩、数据结构设计还是很巧妙的,下面主要记录学习过程中的StoredField、DocValue以及磁盘BKD Tree的一些…

PyQt6 QScrollBar滚动条控件

锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计48条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版…

录制第一个jmeter性能测试脚本2(http协议)_图书管理系统

我们手工编写了一个测试计划,现在我们通过录制的方式来实现那个测试计划。也就是说‘’测试计划目标和上一节类似:让5个用户在2s内登录图书管理系统,然后进入 页面进行查看。 目录 欢迎访问我的免费课程 PPT、安装包、视频应有尽有&#xff…

什么是幂等操作?

在数学和计算机科学中,幂等操作是指无论应用操作一次还是多次,结果都相同的操作。 换句话说,重复多次相同的操作不会产生不同的效果。这个概念通常用于描述函数、操作或系统的性质。 在具体应用中,幂等性具有以下两个重要的特性&…

【微服务】Spring Aop原理深入解析

目录 一、前言 二、aop概述 2.1 什么是AOP 2.2 AOP中的一些概念 2.2.1 aop通知类型 2.3 AOP实现原理 2.3.1 aop中的代理实现 2.4 静态代理与动态代理 2.4.1 静态代理实现 三、 jdk动态代理与cglib代理 3.1 jdk动态代理 3.1.1 jdk代理示例 3.1.2 jdk动态代理模拟实现…

【OpenCV】 OpenCV 源码编译并实现 CUDA 加速 (Windows)

OpenCV 源码编译并实现 CUDA 加速 Windows 1. 环境准备1.1 软件环境1. 2 源码下载 2. CMake编译项目2.1 创建cmake项目2.2 设置编译配置2.3 解决异常2.3.1 文件下载异常2.3.2 解决CUDA版本异常 2.4 编译项目 3. Visual Studio 编译项目4. 项目测试5. 总结 OpenCV是一个基于Apac…

Ubuntu 常用命令之 ln 命令用法介绍

ln命令在Ubuntu系统中用于创建硬链接或符号链接。硬链接是指向文件的物理地址,而符号链接(也称为软链接)是指向文件路径的引用。 命令格式:ln [选项]... [-T] 目标(源文件) 链接(目标文件&…

管理类联考——逻辑——真题篇——按知识分类——形式逻辑

文章目录 2023真题(2023-26)-形式逻辑-假言-假言串联模型-题干假言有重复,通过重复做串联;题干假言无重复,选项直接做排除。;-形式逻辑-双A串联公式-已知:①A是B(A→B);②A是C(A→C)。① 可推出:有的A是B,等价于:有的B是A,可与②串联得:有的B→A→C。②可推出…

【FPGA】Verilog:编码器 | 实现 4 到 2 编码器

0x00 编码器(Encoder) 编码器与解码器相反。当多台设备向计算机提供输入时,编码器会为每一个输入生成一个与设备相对应的信号,因此有多少比特就有多少输出,以数字形式表示输入的数量。 例如,如果有四个输…

NAS搭建WebDAV服务同步Zotero科研文献

文章目录 一、Zotero安装教程二、群晖NAS WebDAV设置三、Zotero设置四、使用公网地址同步Zotero文献库五、使用永久固定公网地址同步Zotero文献库 Zotero 是一款全能型 文献管理器,可以 存储、管理和引用文献,不但免费,功能还很强大实用。 ​ Zotero 支…