当前位置: 首页 > news >正文

SQL 查询秘籍:提升你数据库技能的实用指南

目录

一、常用表表达式(CTEs)

(一)快速了解

(二)上手演练

练习一:使用 CTE 来分解一般查询逻辑

练习二:使用 CTE 来分解复杂的查询逻辑

二、递归CTEs

(一)快速了解

(二)上手演练

三、利用临时函数简化查询逻辑

(一)快速了解

(二)上手演练

四、数据的枢转(Pivot)

(一)快速了解

(二)上手演练

五、了解 EXCEPT 和 NOT IN 操作符

(一)快速了解

(二)上手演练

六、自联结(Self-Join)

七、排名函数:ROW_NUMBER、RANK 和 DENSE_RANK

(一)快速了解

(二)上手演练

八、计算不同时期之间的差值(Delta 值)

(一)快速了解

(二)上手演练

九、计算运行总数

(一)快速了解

(二)上手演练

十、日期时间

十一、总结


干货分享,感谢您的阅读!

在当今数据驱动的世界中,SQL(结构化查询语言)已经成为每位数据分析师、开发者和数据科学家必备的工具。无论是从庞大的数据库中提取信息,还是进行复杂的数据分析,掌握 SQL 的技巧都能让你在职业生涯中脱颖而出。然而,许多用户在学习 SQL 时往往停留在基本的 SELECT 语句上,忽视了其深层次的潜力和灵活性。

本篇文章将带你深入探索 SQL 的世界,提供从基础查询到高级数据操作的实用技巧和示例。无论你是刚入门的初学者,还是希望提升技能的资深用户,这里都有适合你的内容。通过掌握排名、分组和数据转置等关键概念,你将能够更高效地处理和分析数据,为你的项目增添强大的数据支持。准备好提升你的 SQL 技能,开启数据分析的新篇章吗?

一、常用表表达式(CTEs)

(一)快速了解

常用表表达式(CTE)允许在查询中创建临时的命名结果集。CTE 通过使用 WITH 关键字定义,并在查询中重复引用,使得复杂的查询可以更清晰、更易读地表达。CTE 主要由两部分组成:WITH 子句和查询语句。

  • WITH 子句包含一个或多个以逗号分隔的命名子查询,每个子查询都有一个名称和一个查询。这些子查询可以在后续的查询语句中被引用。
  • CTE 的查询语句紧随其后,使用这些命名的子查询执行实际的数据检索、过滤、聚合等操作。

CTE 的主要优势在于它能够将复杂的查询逻辑分解为简单的部分,并且可以重用已定义的子查询,从而提高查询的可读性和可维护性。此外,CTE 还可以用于实现递归查询、数据转换、逻辑分割等高级操作,使得 SQL 查询更加灵活、强大。

(二)上手演练

练习一:使用 CTE 来分解一般查询逻辑

假设我们有三个表:employees(员工表)、departments(部门表)和 salaries(工资表)。employees 表包含了员工的基本信息,departments 表包含了部门的信息,salaries 表包含了员工的薪水信息。

我们的目标是找出在销售部门(Sales)工作的女性员工的平均薪水,并列出选择薪水高于平均薪水姓名和薪水。

当不使用 CTE 时,可以使用子查询来实现

我们首先在 employees 表中选择在销售部门工作且性别为女性的员工。然后,我们使用子查询来计算这些女性员工的平均薪水,并将其与每个员工的薪水进行比较。最终,我们仅列出薪水高于平均薪水的员工的姓名和薪水。

SELECT name, salary
FROM employees
WHERE department_id = (SELECT department_id FROM departments WHERE name = 'Sales')
AND gender = 'Female'
AND salary >= (SELECT AVG(salary)FROM employeesWHERE department_id = (SELECT department_id FROM departments WHERE name = 'Sales')AND gender = 'Female'
);

使用 CTE 来分解复杂的查询逻辑后

我们首先创建了一个 CTE sales_department选择销售部门的所有员工。然后,我们使用另一个 CTE female_sales_employees 来选择在销售部门工作的女性员工,并获取他们的姓名和薪水。接着,我们计算了这些女性员工的平均薪水,并将其存储在 avg_female_sales_salary CTE 中。最后,我们从 female_sales_employees 中选择薪水高于平均薪水的员工,并列出他们的姓名和薪水。

WITH sales_department AS (SELECT employee_idFROM employeesWHERE department_id = (SELECT department_id FROM departments WHERE name = 'Sales')
),
female_sales_employees AS (SELECT employee_id, name, salaryFROM employeesJOIN sales_department ON employees.employee_id = sales_department.employee_idWHERE gender = 'Female'
),
avg_female_sales_salary AS (SELECT AVG(salary) AS avg_salaryFROM female_sales_employees
)SELECT name, salary
FROM female_sales_employees
WHERE salary >= (SELECT avg_salary FROM avg_female_sales_salary);

练习二:使用 CTE 来分解复杂的查询逻辑

假设我们不仅想要找出在销售部门工作的薪水高于平均薪水的女性员工,还想要找出他们的平均工作年限,并列出那些工作年限超过平均工作年限的员工的姓名、薪水和工作年限。

当不使用 CTE 时,可以使用子查询来实现

首先在子查询中计算了销售部门中女性员工的平均薪水和平均工作年限,然后主查询选择了在销售部门工作且性别为女性的员工,并筛选出薪水高于平均薪水且工作年限大于平均工作年限的员工,并列出他们的姓名、薪水和工作年限。

SELECT name, salary, EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM hire_date) AS years_worked
FROM employees e
JOIN (SELECT AVG(salary) AS avg_salary,AVG(EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM hire_date)) AS avg_years_workedFROM employeesWHERE department_id = (SELECT department_id FROM departments WHERE name = 'Sales')AND gender = 'Female') AS avg_stats ON 1=1 -- 确保每行都能和avg_stats匹配上
WHERE department_id = (SELECT department_id FROM departments WHERE name = 'Sales')AND gender = 'Female'AND salary >= (SELECT avg_salary FROM avg_stats)AND EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM hire_date) > (SELECT avg_years_worked FROM avg_stats);

使用 CTE 来分解复杂的查询逻辑后

我们首先计算每位女性销售员工的平均工作年限和平均薪水,并将其存储在 avg_female_sales_stats CTE 中。然后,在主查询中,我们除了列出员工的姓名、薪水和工作年限外,还筛选出了工作年限超过平均工作年限的员工。

WITH sales_department AS (SELECT employee_idFROM employeesWHERE department_id = (SELECT department_id FROM departments WHERE name = 'Sales')
),
female_sales_employees AS (SELECT employee_id, name, salary, hire_dateFROM employeesJOIN sales_department ON employees.employee_id = sales_department.employee_idWHERE gender = 'Female'
),
avg_female_sales_stats AS (SELECT AVG(salary) AS avg_salary,AVG(EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM hire_date)) AS avg_years_workedFROM female_sales_employees
)SELECT name, salary, EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM hire_date) AS years_worked
FROM female_sales_employees
JOIN avg_female_sales_stats ON 1=1 -- 确保每行都能和avg_female_sales_stats匹配上
WHERE salary >= (SELECT avg_salary FROM avg_female_sales_stats)AND EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM hire_date) > (SELECT avg_years_worked FROM avg_female_sales_stats);

二、递归CTEs

(一)快速了解

递归CTE类似于Python中的递归函数,适用于处理组织结构图、文件系统、网页链接图等层次化数据。递归CTE通常包含三个部分:

  1. 锚定成员(Anchor Member):递归CTE的起始部分,返回CTE的基本结果的初始查询。

  2. 递归成员(Recursive Member):引用了CTE自身,是所有递归查询的联合体。

  3. 终止条件(Termination Condition):可选部分,用于指定递归查询何时停止。

(二)上手演练

假设我们有一个名为employees的表,其中包含了员工的ID、姓名和直接上级的ID。我们想要查询每个员工及其所有下属的层级结构:

WITH RECURSIVE EmployeeHierarchy AS (-- 锚定成员:查询根节点(没有直接上级的员工)SELECT employee_id,name,manager_id,1 AS levelFROM employeesWHERE manager_id IS NULL -- 根节点没有直接上级UNION ALL-- 递归成员:连接直接下属和它们的下属SELECT e.employee_id,e.name,e.manager_id,eh.level + 1 -- 层级加一FROM employees eJOIN EmployeeHierarchy eh ON e.manager_id = eh.employee_id
)
-- 查询结果:包含每个员工及其所有下属的层级结构
SELECT * 
FROM EmployeeHierarchy;

递归CTE EmployeeHierarchy 包含了两个部分:

  1. 锚定成员部分选择了根节点,即没有直接上级的员工。
  2. 递归成员部分连接了直接下属和它们的下属,并递归地获取了所有下属员工的层级关系。

递归查询会持续地向下遍历员工的层级结构,直到所有的下属都被检索到为止。

三、利用临时函数简化查询逻辑

(一)快速了解

在处理数据时,简洁而易读的查询语句是提高工作效率和代码可维护性的关键。然而,随着查询逻辑的复杂化,常常会导致查询语句变得冗长且难以理解。

临时函数的引入为解决这一问题提供了一种简洁而有效的方法:

  1. 简化查询语句:通过使用临时函数,可以将复杂的逻辑封装在函数内部,使查询语句更简单明了。
  2. 提高可读性:使用临时函数可以提高查询的可读性,使其更容易理解和维护。
  3. 重复使用性:一旦定义了临时函数,您可以在多个查询中重复使用它,从而提高了代码的重用性和可维护性。

通过将复杂的逻辑封装在临时函数中,我们可以使查询语句更加简洁明了,易于理解和维护,不仅提高了查询的可读性,还提高了代码的重用性和灵活性,使得数据处理工作更加高效和便捷。

(二)上手演练

假设我们有一个需求是将员工的薪水按照特定比例进行调整,这个比例是根据员工的职务级别来确定的。我们想要根据不同的职务级别调整员工的薪水,并且希望查询语句简洁明了,易于维护。

首先,让我们看一下不使用临时函数的情况下的查询语句:

SELECT name,CASE WHEN position = 'Manager' THEN salary * 1.1WHEN position = 'Supervisor' THEN salary * 1.05ELSE salaryEND AS adjusted_salary
FROM employees;

这种方法虽然可以实现功能,但是在查询语句中嵌入了逻辑,使得语句变得冗长且难以理解。而且,如果要添加新的职务级别或者调整现有的比例,就需要修改查询语句,增加了维护的难度。

接下来,我们使用临时函数来实现同样的功能:

CREATE TEMPORARY FUNCTION adjust_salary(position STRING, salary FLOAT64) AS (CASE WHEN position = 'Manager' THEN salary * 1.1WHEN position = 'Supervisor' THEN salary * 1.05ELSE salaryEND
);SELECT name,adjust_salary(position, salary) AS adjusted_salary
FROM employees;

使用临时函数,我们将调整薪水的逻辑封装在一个函数中。这样,查询语句变得简洁明了,易于理解和维护。如果需要修改调整逻辑,只需修改临时函数的定义,而不需要修改每个查询语句。此外,我们还可以在其他查询中重复使用这个临时函数,提高了代码的重用性。

四、数据的枢转(Pivot)

(一)快速了解

在SQL查询中,数据的枢转(Pivot)可以使数据从行形式转换为列形式,从而更加直观和易于分析。利用CASE WHEN语句方式来实现数据的枢转,我们根据特定的条件动态地将数据重新组织成新的列,为数据分析提供了更多的可能性。

(二)上手演练

假设我们有一个销售数据表格,记录了不同产品在不同月份的销售额。我们想要将这些数据进行枢转,以便每个月份都有一个单独的列来显示销售额。

首先,让我们看一下原始的销售数据表格:

ProductMonthSales
AJan100
BJan200
AFeb150
BFeb250
AMar120
BMar220

我们想要将上面的表格转换成以下形式,以便每个月份都有一个单独的列来显示销售额:

ProductJan_SalesFeb_SalesMar_Sales
A100150120
B200250220

现在让我们使用CASE WHEN语句进行数据的枢转:

SELECT Product,SUM(CASE WHEN Month = 'Jan' THEN Sales END) AS Jan_Sales,SUM(CASE WHEN Month = 'Feb' THEN Sales END) AS Feb_Sales,SUM(CASE WHEN Month = 'Mar' THEN Sales END) AS Mar_Sales
FROM SalesData
GROUP BY Product;

我们使用了CASE WHEN语句来根据月份条件对销售额进行分类,并将每个月份的销售额分别计算求和。最后,通过GROUP BY子句按产品进行分组,以得到每个产品在不同月份的销售额总和。

这样,我们就成功地利用CASE WHEN语句进行了数据的枢转,将原始表格中的行数据转换为了列数据,得到了更直观和易于分析的结果表格。

五、了解 EXCEPT 和 NOT IN 操作符

(一)快速了解

在SQL中,我们经常需要比较两个查询或表之间的数据,以找出它们之间的差异或相似之处。EXCEPT和NOT IN是两个常用的操作符,用于实现这样的比较。尽管它们的作用相似,但在使用时需要注意一些微妙的差别。

EXCEPT 操作符

  • 定义: EXCEPT操作符用于从第一个查询结果中过滤掉在第二个查询结果中也出现的行,并返回仅在第一个结果中出现的行。
  • 特点:
    • 自动删除重复行,因此只返回不同的行。
    • 不需要手动指定比较的列,会对两个查询结果的所有列进行比较。
  • 示例:
    SELECT column1, column2 FROM table1 
    EXCEPT 
    SELECT column1, column2 FROM table2;

NOT IN 操作符:

  • 定义: NOT IN操作符用于比较两个查询结果中的特定列,并返回在第一个查询结果中出现但在第二个查询结果中不存在的值。
  • 特点:
    • 需要手动指定要比较的列。
    • 不会自动删除重复行。
  • 示例:
    SELECT column1, column2 
    FROM table1 
    WHERE 
    column1 NOT IN (SELECT column1 FROM table2);

总结: 虽然EXCEPT和NOT IN都用于比较查询结果,但在使用时需要根据具体的需求选择合适的操作符。如果想要返回不同的行并自动删除重复行,可以使用EXCEPT操作符;如果想要比较特定列并手动指定条件,则应使用NOT IN操作符。

(二)上手演练

假设我们有两个表格:一个是所有员工的表格,另一个是所有经理的表格。我们想要找出所有不是经理的员工。我们可以使用EXCEPT和NOT IN操作符来实现这个任务。

员工表格(employees):

EmployeeIDName
1Alice
2Bob
3Charlie
4David

经理表格(managers):

ManagerIDName
3Charlie
4David

现在,我们想要找出所有不是经理的员工。我们可以使用EXCEPT操作符来实现:

SELECT Name
FROM employees
EXCEPT
SELECT Name
FROM managers;

这将返回以下结果:

Name
Alice
Bob

另一种方法是使用NOT IN操作符:

SELECT Name
FROM employees
WHERE EmployeeID NOT IN (SELECT ManagerID FROM managers);

这也将返回相同的结果:

Name
Alice
Bob

通常来说,NOT IN 操作符在处理大型数据集时可能会比 EXCEPT 操作符更有效率。这是因为 NOT IN 操作符可以利用索引来快速定位和过滤结果集中的匹配值,而 EXCEPT 操作符需要对两个结果集执行排序和去重操作,这可能会增加查询的执行时间,特别是当数据量较大时。

六、自联结(Self-Join)

自联结(Self-Join)是指在同一个表格中进行连接操作。虽然听起来有些奇怪,但在实际应用中它是非常常见的,特别是当所有相关数据都存储在同一个表格中时。

假设我们有一个名为 "employees" 的表,包含员工的姓名、工资和直接经理的ID。我们想要找出工资高于其直接经理的员工。以下是这个表的示例数据:

EmployeeIDNameSalaryManagerID
1Alice600003
2Bob700003
3Charlie800004
4David90000NULL

现在,我们需要编写一个 SQL 查询来找出工资高于其直接经理的员工。我们可以使用自联结来解决这个问题:

SELECT e1.Name AS EmployeeName, e1.Salary AS EmployeeSalary, e2.Name AS ManagerName, e2.Salary AS ManagerSalary
FROM employees e1
JOIN employees e2 ON e1.ManagerID = e2.EmployeeID
WHERE e1.Salary > e2.Salary;

我们首先将 "employees" 表自联结为两个不同的别名 "e1" 和 "e2",分别代表员工和其直接经理。然后,我们使用 JOIN 条件将员工表中的每个员工与其直接经理进行连接。最后,通过 WHERE 子句筛选出工资高于其直接经理的员工,并返回员工的姓名、工资以及直接经理的姓名和工资。

通过这样的自联结,我们可以清晰地找出工资高于其直接经理的员工,这在实际工作中是一个常见的需求。

七、排名函数:ROW_NUMBER、RANK 和 DENSE_RANK

(一)快速了解

当我们需要在 SQL 中对数据进行排名时,我们可以使用三种常见的排名函数:ROW_NUMBER、RANK 和 DENSE_RANK:

函数特点示例
ROW_NUMBER为每行分配唯一的数字,不考虑行之间的关系ROW_NUMBER() OVER (ORDER BY column_name)
RANK为每行分配唯一的数字,相同值会跳过排名RANK() OVER (ORDER BY column_name)
DENSE_RANK为每行分配唯一的数字,相同值不会跳过排名DENSE_RANK() OVER (ORDER BY column_name)
  • 如果你需要为每行分配唯一的排名,并且不在意相同值的排名,可以使用 ROW_NUMBER。

  • 如果你需要为每行分配排名,并且对于相同值的行希望跳过排名,可以使用 RANK。

  • 如果你需要为每行分配排名,并且希望保持连续的排名编号,可以使用 DENSE_RANK。

(二)上手演练

假设我们有一个学生成绩表格 student_grades,包含学生姓名 Name 和 GPA 成绩 GPA。我们想要为每个学生按照 GPA 成绩进行排名,并比较三种不同的排名函数的结果。

首先,我们使用 ROW_NUMBER()、RANK() 和 DENSE_RANK() 函数来为每个学生的 GPA 成绩进行排名:

SELECT Name, GPA, ROW_NUMBER() OVER (ORDER BY GPA DESC) AS RowNumber, RANK() OVER (ORDER BY GPA DESC) AS Rank, DENSE_RANK() OVER (ORDER BY GPA DESC) AS DenseRank 
FROM student_grades;

假设我们的 student_grades 表格如下所示:

NameGPA
Alice3.9
Bob3.8
Carol3.9
Dave3.7
Eve4.0

运行上述查询后,我们得到以下结果:

NameGPARowNumberRankDenseRank
Eve4.0111
Alice3.9222
Carol3.9322
Bob3.8443
Dave3.7554

通过以上结果可以看出:

  • ROW_NUMBER() 函数为每个学生分配了唯一的排名,无论 GPA 成绩是否相同。
  • RANK() 函数为相同 GPA 成绩的学生分配了相同的排名,并在下一行跳过相应数量的排名。
  • DENSE_RANK() 函数为相同 GPA 成绩的学生分配了相同的排名,但不会跳过排名编号,保持了连续的排名编号。

八、计算不同时期之间的差值(Delta 值)

(一)快速了解

LEAD() 和 LAG() 函数是 SQL 中用于比较相邻行数据的重要工具。

LEAD() 函数用于获取当前行之后的行的数据,而 LAG() 函数则用于获取当前行之前的行的数据。

通过这两个函数,我们可以轻松地比较不同时段的数据,计算增长率、变化趋势等。它们在数据分析领域有着广泛的应用,尤其适用于时间序列数据的分析和预测。

(二)上手演练

假设我们有一个名为 monthly_sales 的表,包含每月的销售数据,其中有月份(month)和销售额(sales)两个字段。我们想要比较每个月的销售额与上个月的销售额之间的差异,并计算增长率。

首先,我们可以使用 LAG() 函数获取上个月的销售额,并将其与当前月份的销售额相减,以得到销售额的变化量。然后,我们可以将变化量除以上个月的销售额,得到增长率。

SELECT month,sales,sales - LAG(sales, 1) OVER (ORDER BY month) AS sales_change,ROUND((sales - LAG(sales, 1) OVER (ORDER BY month)) / LAG(sales, 1) OVER (ORDER BY month) * 100, 2) AS growth_rate
FROM monthly_sales;

我们首先使用 LAG() 函数获取上个月的销售额,然后将当前月份的销售额与上个月的销售额相减,得到销售额的变化量。接着,我们计算增长率,将销售额的变化量除以上个月的销售额,并乘以 100,以得到百分比形式的增长率。这样,我们就可以方便地分析每个月销售额的变化情况,了解销售业绩的发展趋势。

九、计算运行总数

(一)快速了解

数据库中,计算运行总数是一项常见的任务,特别是在分析时间序列数据或者累积值的情况下。窗口函数中的 SUM() 函数为我们提供了一种简单而强大的方法来实现这一目标。

通过结合 ORDER BY 子句,我们可以按照特定的顺序计算累积值。

(二)上手演练

假设我们有一个名为 monthly_revenue 的表格,其中包含每个月的销售额数据。我们可以使用窗口函数来计算每个月销售额的累积总数,以便更好地了解销售情况的趋势和变化。

MonthRevenue
Jan10000
Feb15000
Mar12000
Apr18000

现在,我们想要计算每个月销售额的累积总数。我们可以使用如下的 SQL 查询:

SELECT Month,Revenue,SUM(Revenue) OVER (ORDER BY Month) AS Cumulative_Revenue
FROM monthly_revenue;

执行上述查询后,我们将得到以下结果:

MonthRevenueCumulative_Revenue
Jan1000010000
Feb1500025000
Mar1200037000
Apr1800055000

通过这个案例,我们可以清晰地看到每个月销售额的累积总数是如何随着时间的推移逐步增加的。

十、日期时间

在SQL中,日期时间数据的处理是非常常见和重要的。它涉及许多方面,包括日期的比较、计算日期之间的间隔、提取日期的部分等等。为了更好地理解日期时间数据的操纵,我们需要掌握一些常用的日期函数和技巧。

举例来说,假设我们有一个名为Weather的表格,其中包含每天的温度记录。现在,我们想找出哪些日期的温度比前一天更高。我们可以使用SQL中的日期函数和联结来实现这个目标。

首先,我们需要使用DATEDIFF函数计算每个日期与前一天日期之间的天数间隔。然后,我们可以将结果与温度进行比较,找出温度比前一天更高的日期。

SELECTa.Id
FROMWeather a,Weather b
WHEREa.Temperature > b.TemperatureAND DATEDIFF(a.RecordDate, b.RecordDate) = 1;

十一、总结

在本文中,我们深入探讨了 SQL 查询的多种技巧,从基础的 SELECT 语句到更复杂的排名、分组和数据转置操作。通过实例演示,我们揭示了 SQL 的强大能力以及其在数据分析中的关键作用。掌握这些技巧不仅能够帮助你高效提取和处理数据,还能使你在数据驱动的决策中游刃有余。

回顾文章中的关键点,首先我们了解了基本查询的结构,并逐步深入到如何利用窗口函数进行数据排名,如何运用 GROUP BY 和聚合函数进行数据分组,以及如何使用 PIVOT 操作实现数据的灵活转置。每一个技巧都为你的 SQL 技能增添了新的维度,让你在实际应用中能够得心应手。

随着数据量的不断增长和分析需求的日益复杂,SQL 技能的重要性愈发显著。我们鼓励你在实际项目中应用这些技巧,继续探索 SQL 的深度和广度。无论是在数据分析、商业智能还是数据科学的领域,掌握 SQL 都将为你的职业发展打开新的大门。希望你能将这些知识融入到实际工作中,创造出更具价值的数据洞察!

相关文章:

SQL 查询秘籍:提升你数据库技能的实用指南

目录 一、常用表表达式(CTEs) (一)快速了解 (二)上手演练 练习一:使用 CTE 来分解一般查询逻辑 练习二:使用 CTE 来分解复杂的查询逻辑 二、递归CTEs (一&#xf…...

Unity背包道具拖拽(极简版实现)

(感觉Csdn代码页面可以再大一点或者加个放大功能 不然得划着看不太舒服) 1.关键接口,三个拖拽相关的 2.关键参数,PointerEventData 一直没仔细看过,其实有包含鼠标相关的很多参数,鼠标点击次数&#xff…...

Vins_Fusion_gpu中source setup.bash

文章目录 source setup.bashsetup.bashsetup.sh脚本的主要功能脚本的详细解释1. **初始化和检查**2. **检测操作系统**3. **设置环境变量**4. **记住 shell 类型**5. **调用 Python 脚本生成环境变量**6. **加载环境钩子**7. **清理** 总结 _setup_util.py_setup_util.py 的完整…...

appium学习之二:adb命令

1、查看设备 adb devices 2、连接 adb connect IP:端口 3、安装 adb install xxx.apk 4、卸载 adb uninstall 【包名】 5、把对应目录下的1.txt文件传到手机sdcard下 adb push 1.txt /sdcard 6、进入对应的设备里 adb shell 7、切入sdcard目录 cd /sdcard 8、ls 查…...

Docker 安装 sentinel

Docker 安装系列 1、拉取 [rootTseng ~]# docker pull bladex/sentinel-dashboard Using default tag: latest latest: Pulling from bladex/sentinel-dashboard 4abcf2066143: Pull complete 1ec1e81da383: Pull complete 56bccb36a894: Pull complete 7cc80011dc6f: Pull…...

selinux

项目使用: neverallow 报错: 改法:typeattribute system_server system_writes_mnt_vendor_violators; selinux目录: Android/lagvm/LINUX/android/device/qcom/sepolicy_vndr Android/lagvm/LINUX/android/vendor/jidu/sepoli…...

C++11新特性之线程std::atomic

C std::atomic C 中 std::atomic 的定义及功能 std::atomic 是 C 标准库中提供的一种模板类,主要用于实现 原子操作,以保证多线程环境下对共享变量的安全操作。它提供了一种无需使用互斥锁即可安全访问共享数据的机制,避免了竞争条件。 特…...

MySQL中的通配符

1. 百分号 % 内部工作原理: 代表零个、一个或多个任意字符。LIKE A%:MySQL会从索引(如果存在)中查找所有以 "A" 开头的记录。如果没有索引,则需要扫描整个表。MySQL解析器将模式转换为可执行的形式&#x…...

【ETCD】【源码阅读】stepWithWaitOption方法解析

在分布式系统中,ETCD 作为一个强一致性、高可用的 key-value 存储系统,广泛应用于服务发现、配置管理等场景。ETCD 在内部采用了 Raft 协议来保证集群的一致性,而日志预提案(log proposal)是 Raft 协议中至关重要的一部…...

F12抓包01:启动、面板功能介绍、语言设置、前端样式调试

浏览器检查工具通常用来作为浏览器web服务测试过程中,辅助测试、排查问题、定位缺陷的工具。 本文以mac系统下,当前比较常用的Chrome浏览器为例,讲解“检查”工具的常用功能操作方法。 一、打开方式 **1、****鼠标操作:**浏览器…...

用前端html如何实现2024烟花效果

用HTML、CSS和JavaScript编写的网页&#xff0c;主要用于展示“2024新年快乐&#xff01;”的文字形式烟花效果。下面是对代码主要部分的分析&#xff1a; HTML结构 包含三个<canvas>元素&#xff0c;用于绘制动画。引入百度统计的脚本。 CSS样式 设置body的背景为黑…...

Maven学习(传统Jar包管理、Maven依赖管理(导入坐标)、快速下载指定jar包)

目录 一、传统Jar包管理。 &#xff08;1&#xff09;基本介绍。 &#xff08;2&#xff09;传统的Jar包导入方法。 1、手动寻找Jar包。并放置到指定目录下。 2、使用IDEA的库管理功能。 3、配置环境变量。 &#xff08;3&#xff09;传统的Jar包管理缺点。 二、Maven。 &#…...

mac电脑吧iso文件制作成u盘启动

1 查看u盘的具体路径 diskutil list 根据容量确认路径 /dev/disk2 2、卸载u盘 diskutil unmountDisk /dev/disk2 3、把iso文件写入u盘 sudo dd if/Users/dengjinshan/Downloads/Win11_24H2_Chinese_Simplified_x64.iso of/dev/disk2 bs1m 4、弹出u盘 diskutil eject /dev/dis…...

MySQL数据库的数据类型

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 MySQL数据库的数据类型 收录于专栏[MySQL] 本专栏旨在分享学习MySQL的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 数据类型分类 ​…...

【golang】匿名内部协程,值传递与参数传递

代码例子 下面代码的区别是直接调用循环变量&#xff0c;这里使用的就是这个变量的引用&#xff0c;而不是将参数的副本传递给协程执行 for task : range taskChan {wg.Add(1)go func() {defer wg.Done()task.Do() // 使用外部循环变量}() }func DistributeTasks(taskChan &…...

ByteByteGo-Top 9 HTTP Request Methods 9种HTTP请求方法

更详细准确的描述直接参考 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Methods/CONNECT ​​​​​本片文章出自 EP85: Top 9 HTTP Request Methods - ByteByteGo Newsletter http request methods 1&#xff0c;GET 从服务器获取资源。 具有幂等性&#xff08;idempo…...

vue3实际案例分析:展示Vue拖拽功能的实现和效果

在现代前端开发中&#xff0c;交互式的用户界面是提升用户体验的关键因素之一。Vue.js&#xff0c;作为一个渐进式JavaScript框架&#xff0c;提供了灵活的组件系统和响应式数据绑定&#xff0c;使得实现复杂的用户交互变得简单。拖拽功能是其中一个常见的交互模式&#xff0c;…...

EasyExcel使用管道流连接InputStream和OutputStream

前言 Java中的InputSteam 是程序从其中读取数据&#xff0c; OutputSteam是程序可以往里面写入数据。 如果我们有在项目中读取数据库的记录&#xff0c; 在转存成Excel文件, 再把文件转存到OSS中。 生成Excel使用的是阿里的EasyExcel 。 他支持Output的方式写出文件内容。 而…...

源码分析之Openlayers中的ZoomToExtent控件

概述 在 Openlayers 中&#xff0c;ZoomToExtent控件可能用的不是很多&#xff0c;它主要用于将地图视图缩放到指定范围&#xff0c;应用场景就是重置地图、恢复初始状态。但是一般情况下&#xff0c;重置地图可能还会有其它操作&#xff0c;比如清除地图上绘制的点线面或者显…...

Acwing 算法基础课 数学知识 线性筛

线性筛素数 也叫欧拉筛。 int pr[maxn]; bool flg[maxn]; int main() {for (int i 2; i < maxn; i) {if (!flg[i]) pr[pr[0]] i;for (int j 1; i * pr[j] < n && j < pr[0]; j) {flg[i * pr[j]] 1;if (i % pr[j] 0) break; // 重点}} }这样筛的话&…...

K8s驱逐阈值调整

要在 Kubernetes 中调整 kubelet 驱逐阈值&#xff0c;特别是针对 imagefs 和 nodefs 的大小阈值&#xff0c;你可以通过修改 kubelet 的启动参数来实现。这些参数定义了在触发 Pod 驱逐之前&#xff0c;节点上的资源使用情况必须满足的硬性条件。 根据你提供的文件内容&#…...

【密码学】BUUCTF Crypto 1 - 12 题 WriteUp

今天&#xff0c;我在 BUUCTF 网站的 crypto section 开启了一场充满挑战的密码学之旅。 这次我一口气完成了 12 个板块的任务&#xff0c;虽然耗时较长&#xff0c;但每一次解密成功的瞬间都让我无比满足&#xff0c;那种沉浸在密码世界里的感觉真的很棒。 接下来&#xff0…...

【文献阅读】使用深度语音后验改进独立于说话者的构音障碍可懂度分类

原文名称: IMPROVED SPEAKER INDEPENDENT DYSARTHRIA INTELLIGIBILITY CLASSIFICATION USING DEEPSPEECH POSTERIORS 本文探讨了利用DeepSpeech后验概率改进说话人无关的构音障碍可理解性分类方法。作者提出了一个基于DeepSpeech(一种端到端的语音转文本引擎)输出的新特征集…...

Image Stitching using OpenCV

文章目录 简介图像拼接管道特征检测和提取特征检测特征提取 特征匹配强力匹配FLANN&#xff08;近似最近邻快速库&#xff09;匹配 单应性估计扭曲和混合结论 使用opencv进行图像拼接 原为url: https://medium.com/paulsonpremsingh7/image-stitching-using-opencv-a-step-by-s…...

如何将CSDN的文章保存为PDF?

目录 1、打开CSDN文章2、按F12或者鼠标右键选择检查并进入控制台3、在控制台输入以下代码4、然后回车&#xff08;Enter&#xff09;如果纵向显示不全就横向 1、打开CSDN文章 2、按F12或者鼠标右键选择检查并进入控制台 3、在控制台输入以下代码 (function(){ $("#side&q…...

设计模式之工厂模式:从汽车工厂到代码工厂

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 工厂模式概述 想象一下你走进一家4S店准备买车。作为顾客&#xff0c;你不需要知道汽车是如何被制造出来的&#xff0c;你只需要告诉销售顾问&a…...

在 Ubuntu 20.04 上离线安装和配置 Redis

下面是从零开始配置 Redis 的完整步骤&#xff0c;包括从安装 Redis 到离线安装 Redis 包的步骤。本文将覆盖如何从下载 Redis 安装包、手动安装 Redis、创建所需目录、配置 Redis、以及如何配置 Redis 为系统服务&#xff0c;确保服务可以在启动时自动运行。 步骤 1: 准备环境…...

Redis的哨兵机制

目录 1. 文章前言2. 基本概念2.1 主从复制的问题2.2 人工恢复主节点故障2.3 哨兵机制自动恢复主节点故障 3. 安装部署哨兵&#xff08;基于docker&#xff09;3.1 安装docker3.2 编排redis主从节点3.3 编排redis-sentinel节点 4. 重新选举5. 选举原理6. 总结 1. 文章前言 &…...

服务器数据恢复—热备盘上线过程中硬盘离线导致raid5阵列崩溃的数据恢复案例

服务器数据恢复环境&#xff1a; 两组分别由4块SAS接口硬盘组建的raid5阵列&#xff0c;两组raid5阵列划分LUN并由LVM管理&#xff0c;格式化为EXT3文件系统。 服务器故障&#xff1a; RAID5阵列中一块硬盘未知原因离线&#xff0c;热备盘自动激活上线替换离线硬盘。在热备盘上…...

Android12 设置无home属性的apk为launcher

目标apk的包类名 QSSI.12/device/qcom/qssi/system.prop// add start target_app_package_name=com.mangechargespot.app target_app_class_name=com.mangechargespot.app.ui.activity.SplashActivity // add end...

STM32F407+LAN8720A +LWIP +FreeRTOS ping通

使用STM32CUBEIDE自带的 LWIP和FreeROTS 版本说明STM32CUBEIDE 操作如下1. 配置RCC/SYS2. 配置ETH/USART3. 配置EHT_RESET/LED4. 配置FreeRTOS5. 配置LWIP6. 配置时钟7. 生成单独的源文件和头文件,并生成代码8. printf重定义9. ethernetif.c添加lan8720a复位10. MY_LWIP_Init …...

构建虚幻引擎中的HUD与UI

在游戏开发中,用户界面(UI)和头部显示(HUD)是玩家体验的重要组成部分。它们提供了关键信息,并增强了游戏的互动性。虚幻引擎(Unreal Engine, UE)以其强大的可视化脚本系统Blueprint和C++ API支持,为开发者提供了一个灵活且功能丰富的环境来创建复杂的UI和HUD元素。 本…...

EXCEL数据清洗的几个功能总结备忘

目录 0 参考教材 1 用EXCEL进行数据清洗的几个功能 2 删除重复值&#xff1a; 3 找到缺失值等 4 大小写转换 5 类型转化 6 识别空格 0 参考教材 精通EXCEL数据统计与分析&#xff0c;中国&#xff0c;李宗璋用EXCEL学统计学&#xff0c;日EXCEL统计分析与决策&#x…...

【CSS in Depth 2 精译_076】12.4 @font-face 的工作原理

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 12.1.1 使用 em 还是 px12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 12.2 Web 字体12.3 谷歌字体12.4 font-fac…...

深入源码解析:Spring Boot 如何加载 Servlet 、Filter 与 Listener

我们知道&#xff0c;Spring Boot 是在 Spring MVC 的基础上进行了封装&#xff0c;以简化开发者的工作量。尽管如此&#xff0c;Spring Boot 的底层架构依然离不开 Spring MVC 的核心组件&#xff0c;如 Servlet、Filter、Listener&#xff0c;以及RequestMappingHandlerMappi…...

Vue 让视图区域滑到指定位置、回到顶部

滑倒指定位置&#xff1a;获取指定的dom&#xff0c;然后用scrollIntoView使dom出现在视图区域 回到顶部&#xff1a;操作父级dom的scrollTop 0&#xff0c;让该父级下的列表回到顶部 代码如下 <template><div class"testDemo"><div><el-bu…...

C# 属性(Property)

C# 属性(Property) C# 中的属性(Property)是一种用于访问和设置类或结构成员的值的特殊类型的方法。属性允许开发者以字段的形式访问方法,提供了更为安全和灵活的数据封装。在本文中,我们将深入探讨 C# 属性的概念、用途、以及如何有效地使用它们。 属性的定义 属性由…...

Ubuntu20.04调整swap分区大小笔记

Ubuntu20.04调整swap分区大小笔记 参考&#xff1a;https://blog.csdn.net/sunyuhua_keyboard/article/details/142485764 第一步 禁用swap $ cat /etc/fstab # /etc/fstab: static file system information. # # Use blkid to print the universally unique identifier fo…...

【 JAVA中常见的集合操作】

JAVA中常见的集合操作 Java 提供了丰富的集合框架&#xff08;Java Collections Framework&#xff09;&#xff0c;包括多种集合接口和实现类。集合操作可以分为基本操作和高级操作。下面介绍一些常见的集合操作&#xff0c;并给出相应的代码示例。 基本集合操作 创建集合 …...

Kudu 源码编译-aarch架构 1.17.1版本

跟着官方文档编译 第一个问题&#xff1a;在make阶段时会报的问题&#xff1a; kudu/src/kudu/util/block_bloom_filter.cc:210:3: error: ‘vst1q_u32_x2’ was not declared in this scope kudu/src/kudu/util/block_bloom_filter.cc:436:5: error: ‘vst1q_u8_x2’ was no…...

JavaEE多线程案例之阻塞队列

上文我们了解了多线程案例中的单例模式&#xff0c;此文我们来探讨多线程案例之阻塞队列吧 1. 阻塞队列是什么&#xff1f; 阻塞队列是⼀种特殊的队列.也遵守"先进先出"的原则. 阻塞队列是⼀种线程安全的数据结构,并且具有以下特性: 当队列满的时候,继续⼊队列就会…...

Java Web 开发学习中:过滤器与 Ajax 异步请求

一、过滤器 Filter&#xff1a; 过滤器的概念与用途 在一个庞大的 Web 应用中&#xff0c;有许多资源需要受到保护或进行特定的预处理。过滤器就像是一位智能的守卫&#xff0c;站在资源的入口处&#xff0c;根据预先设定的规则&#xff0c;决定哪些请求可以顺利访问资源&…...

git SSL certificate problem: unable to get local issuer certificate

Git 客户端将会验证服务器端提供的SSL证书是否由受信任的证书颁发机构&#xff08;Certification Authority&#xff0c;CA&#xff09;签发。如果Git客户端无法找到或验证本地签发者证书&#xff0c;就会出现 unable to get local issuer certificate 或类似的错误。 该问题一…...

Vue.js 响应接口

Vue.js 响应接口 Vue.js,作为一个流行的前端JavaScript框架,以其响应式数据绑定和组件化开发而闻名。响应式系统是Vue.js的核心特性之一,它允许开发者创建高度动态和交互式的用户界面。本文将深入探讨Vue.js的响应接口,包括其工作原理、使用方法和最佳实践。 响应式原理 …...

vue2-代理打包问题;CORS针对AJAX 请求,而不适用于资源请求

打包后请求被转发出现问题&#xff08;如返回 405 Method Not Allowed&#xff09;&#xff0c;通常是由以下原因导致的&#xff1a; 1. 代理配置未生效 原因分析 在开发环境中&#xff0c;Vue CLI 的 devServer.proxy 仅在本地开发服务器&#xff08;npm run serve&#xff…...

websocket 服务 pinia 全局配置

websocket 方法类 // stores/webSocketStore.ts import { defineStore } from "pinia";interface WebSocketStoreState {ws: WebSocket | null; // WebSocket 实例callbacks: ((message: string) > void)[]; // 消息回调函数列表connected: boolean; // 连接状态…...

YOLO系列正传(二)YOLOv3论文精解(上)——从FPN到darknet-53

系列文章 YOLO系列基础 YOLO系列基础合集——小白也看得懂的论文精解-CSDN博客 YOLO系列正传 YOLO系列正传系列&#xff08;一&#xff09;类别损失与MSE损失函数、交叉熵损失函数-CSDN博客 背景 随着YOLOv11版本的发布&#xff0c;YOLO算法在视觉检测领域独领风骚&#x…...

可视化建模与UML《部署图实验报告》

一、实验目的&#xff1a; 1、熟悉部署图的基本功能和使用方法。 2、掌握使用建模工具软件绘制部署图的方法 二、实验环境&#xff1a; window11 EA15 三、实验内容&#xff1a; 根据以下的描述&#xff0c;绘制部署图。 网上选课系统在服务器端使用了两台主机&#xff0c;一…...

详解RabbitMQ在Ubuntu上的安装

​​​​​​​ 目录 Ubuntu 环境安装 安装Erlang 查看Erlang版本 退出命令 ​编辑安装RabbitMQ 确认安装结果 安装RabbitMQ管理界面 启动服务 查看服务状态 通过IP:port访问 添加管理员用户 给用户添加权限 再次访问 Ubuntu 环境安装 安装Erlang RabbitMq需要…...

SQL 快速参考

SQL 快速参考 引言 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系数据库管理系统&#xff08;RDBMS&#xff09;的标准编程语言。它被广泛用于数据查询、数据更新、数据库维护以及访问控制。本快速参考指南旨在提供SQL的基本概念和常用命令的概览…...