MySQL SELECT 查询(二):复杂查询的实现

news2024/11/30 8:50:02

MySQL SELECT 查询(二):复杂查询的实现

文章目录

  • MySQL SELECT 查询(二):复杂查询的实现
    • 1. 多表查询
      • 1.1 常见错误:笛卡尔积与属性归属
      • 1.2 连接条件与规范
      • 1.3 连接类型
      • 1.4 SQL99 连接特性
    • 2. SQL JOIN 操作详解
      • 2.1 联接的概念
      • 2.2 7种 JOIN 类型
      • 2.3 UNION 与 UNION ALL
    • 3. 流程控制与高级功能
      • 3.1 流程控制函数
        • **if() 函数**:
        • **ifnull() 函数**:
      • 3.2 case when 语句
      • 3.3 case ... when ... 语句
      • 3.4 加密与解密
    • 4. SQL 查询执行原理与子查询深入
      • 4.1 SQL 查询执行过程
      • 4.2 自连接与子查询
    • 5. 子查询的广泛应用与常见问题解析
      • 5.1 子查询在 HAVING 子句中的应用
      • 5.2 子查询在 CASE WHEN 语句中的应用
      • 5.3 常见问题解析
      • 5.4 多行子查询
      • 5.5 关联子查询
      • 5.6 子查询作为临时表
      • 5.7 使用 EXISTS 和 NOT EXISTS

1. 多表查询

1.1 常见错误:笛卡尔积与属性归属

在多表查询中,笛卡尔积是一个常见的错误,它发生在查询时没有明确指定连接条件,导致每行数据都与其他表中的每行数据进行匹配。这种错误会导致结果集过大,且难以理解。

原因分析

  • 缺少连接条件:在执行多表查询时,如果没有指定连接条件,MySQL 会默认执行笛卡尔积。

示例代码

-- 错误示例:缺少连接条件
SELECT employee_id, department_id 
FROM employees, departments;
-- 等价于
SELECT employee_id, department_id 
FROM employees CROSS JOIN departments;

为了防止这种情况,必须在 WHERE 子句中指定连接条件。

属性归属

在多表查询中,如果列名在多个表中都存在,必须明确指定该列属于哪个表,否则会导致查询错误。

示例代码

-- 错误示例:未指明属性所属表
SELECT employee_id, department_id  
FROM employees e, departments d
WHERE e.department_id = d.department_id ;

1.2 连接条件与规范

相同属性连接

当两个表中存在相同的属性时,可以通过比较这些属性来连接表。

示例代码

SELECT employee_id, department_name  
FROM employees e, departments d
WHERE e.department_id = d.department_id ;

表别名

使用别名可以简化查询语句,并避免列名冲突。

示例代码

SELECT e.employee_id, d.department_name  
FROM employees e, departments d
WHERE e.department_id = d.department_id ;

多个连接条件

当连接多个表时,至少需要 n-1 个连接条件,其中 n 是表的个数。

示例代码

SELECT employee_id, department_name, l.city, e.department_id, l.location_id 
FROM employees e, departments d, locations l 
WHERE e.department_id = d.department_id 
AND d.location_id = l.location_id ;

1.3 连接类型

等值连接与非等值连接

  • 等值连接:使用 = 操作符连接两个表,返回两个表中匹配的行。
  • 非等值连接:使用不等号(例如 <>><)连接两个表,返回不满足等值条件的行。

示例代码

-- 非等值连接
SELECT e.employee_id, e.last_name, jg.grade_level  
FROM employees e, job_grades jg 
WHERE e.salary BETWEEN jg.lowest_sal AND jg.highest_sal ;

自连接与非自连接

  • 自连接:一个表与自身进行连接,用于查找同一表中的相关记录。
  • 非自连接:多个表之间进行连接。

示例代码

-- 自连接
SELECT e.employee_id, e.last_name, e2.employee_id, e2.last_name 
FROM employees e, employees e2 
WHERE e.manager_id = e2.employee_id ;

内连接与外连接

  • 内连接:只返回两个表中匹配的行。
  • 外连接:包括内连接的结果,并添加外层表中不匹配的行。

示例代码

-- 左外连接
SELECT employee_id, department_name 
FROM employees e LEFT JOIN departments d 
ON e.department_id = d.department_id ;

-- 右外连接
SELECT employee_id, department_name 
FROM employees e RIGHT JOIN departments d 
ON e.department_id = d.department_id ;

1.4 SQL99 连接特性

自然连接

自然连接会自动连接所有具有相同列名和类型的列,简化了连接条件。

示例代码

SELECT e.employee_id, e.last_name, d.department_name 
FROM employees e NATURAL JOIN departments d ;

USING 连接

USING 连接指定连接时使用的列,简化了连接条件的书写。

示例代码

SELECT e.last_name, d.department_id 
FROM employees e JOIN departments d
USING(department_id);

2. SQL JOIN 操作详解

2.1 联接的概念

在关系型数据库中,JOIN 操作用于将两个或多个表中的行结合起来,基于它们之间的某种关联或关系。MySQL 支持多种 JOIN 类型,每种类型都有其特定的用途和语法。

2.2 7种 JOIN 类型

  1. INNER JOIN(内连接)

    • 选择两个或多个表中有匹配的记录的行。
    • 如果在任一表中没有匹配,结果集中就不会有对应的行。

    示例

    SELECT e.last_name, d.department_name
    FROM employees e
    INNER JOIN departments d ON e.department_id = d.department_id;
    
  2. LEFT JOIN(左连接)

    • 返回左表的所有记录,即使右表中没有匹配的记录。
    • 如果右表中没有匹配,结果集中右表的部分将显示为 NULL。

    示例

    SELECT e.last_name, d.department_name
    FROM employees e
    LEFT JOIN departments d ON e.department_id = d.department_id;
    
  3. RIGHT JOIN(右连接)

    • 返回右表的所有记录,即使左表中没有匹配的记录。
    • 如果左表中没有匹配,结果集中左表的部分将显示为 NULL。

    示例

    SELECT e.last_name, d.department_name
    FROM employees e
    RIGHT JOIN departments d ON e.department_id = d.department_id;
    
  4. FULL JOIN(全连接)

    • 返回左表和右表中的所有记录。
    • 如果任一表中没有匹配,则在结果集中相应的部分显示为 NULL。
    • MySQL 不直接支持 FULL JOIN,但可以通过 UNION 操作符结合 LEFT JOIN 和 RIGHT JOIN 来实现。

    示例

    SELECT e.last_name, d.department_name
    FROM employees e
    LEFT JOIN departments d ON e.department_id = d.department_id
    UNION
    SELECT e.last_name, d.department_name
    FROM employees e
    RIGHT JOIN departments d ON e.department_id = d.department_id;
    
  5. CROSS JOIN(交叉连接)

    • 返回两个表的笛卡尔积,即所有可能的组合。
    • 这种类型的 JOIN 不常用,因为它会产生大量的结果行。

    示例

    SELECT e.last_name, d.department_name
    FROM employees e
    CROSS JOIN departments d;
    
  6. NATURAL JOIN(自然连接)

    • 根据表中相同的列名自动连接两个或多个表。
    • 它类似于 INNER JOIN,但更加简洁。

    示例

    SELECT e.last_name, d.department_name
    FROM employees e
    NATURAL JOIN departments d;
    
  7. USING JOIN

    • 与 NATURAL JOIN 类似,但它指定连接时使用的列名。

    示例

    SELECT e.last_name, d.department_name
    FROM employees e
    JOIN departments d USING(department_id);
    

2.3 UNION 与 UNION ALL

  • UNION

    • 用于合并两个或多个 SELECT 语句的结果集。
    • 自动去除重复的行。
    • 如果任一 SELECT 语句返回 NULL,则结果集中也包含 NULL。

    示例

    SELECT last_name, department_id
    FROM employees
    UNION
    SELECT last_name, department_id
    FROM departments;
    
  • UNION ALL

    • 与 UNION 类似,但它不会去除重复的行。
    • 如果任一 SELECT 语句返回 NULL,则结果集中也包含 NULL。

    示例

    SELECT last_name, department_id
    FROM employees
    UNION ALL
    SELECT last_name, department_id
    FROM departments;
    

3. 流程控制与高级功能

3.1 流程控制函数

if() 函数

if() 函数用于根据条件返回不同的值。

语法

IF(val, val1, val2)
  • val:条件表达式,如果为 TRUE,则返回 val1
  • val1:当 val 为 TRUE 时返回的值。
  • val2:当 val 为 FALSE 时返回的值。

示例

SELECT last_name, salary, 
    IF(salary >= 15000, 'High Salary', 'Low Salary') AS salary_grade
FROM employees;
ifnull() 函数

ifnull() 函数用于检查表达式是否为 NULL,如果是,则返回指定的替代值。

语法

IFNULL(val1, val2)
  • val1:要检查的表达式。
  • val2:如果 val1 为 NULL,则返回的值。

示例

SELECT last_name, department_id, 
    IFNULL(department_name, 'No Department') AS department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;

3.2 case when 语句

case when 语句用于根据多个条件返回不同的值。

语法

CASE when condition1 then result1
     when condition2 then result2
     ...
     else resultN
END
  • condition1, condition2, ...:条件表达式,如果为 TRUE,则执行相应的 result
  • result1, result2, ...:当条件为 TRUE 时返回的值。
  • resultN:如果所有条件都为 FALSE,则返回的值。

示例

SELECT last_name, salary, 
    CASE
        WHEN salary >= 15000 THEN 'High Salary'
        WHEN salary >= 10000 THEN 'Medium Salary'
        ELSE 'Low Salary'
    END AS salary_grade
FROM employees;

3.3 case … when … 语句

case … when … 语句类似于 case when 语句,但可以用于更复杂的逻辑。

语法

SELECT column1, column2, ...
CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE resultN
END AS alias
FROM table_name;
  • column1, column2, ...:要选择的列。
  • condition1, condition2, ...:条件表达式,如果为 TRUE,则执行相应的 result
  • result1, result2, ...:当条件为 TRUE 时返回的值。
  • alias:结果的别名。

示例

SELECT last_name, department_id, salary, 
    CASE department_id
        WHEN 10 THEN salary * 1.1
        WHEN 20 THEN salary * 1.2
        WHEN 30 THEN salary * 1.3
        ELSE salary
    END AS new_salary
FROM employees;

3.4 加密与解密

MySQL 提供了几个函数用于加密和解密数据。
在这里插入图片描述
在这里插入图片描述

加密函数

  • ENCRYPT(value, key): 使用指定的密钥对值进行加密。
  • AES_ENCRYPT(value, key): 使用 AES 算法对值进行加密。

解密函数

  • DECRYPT(value, key): 使用指定的密钥对加密的值进行解密。
  • AES_DECRYPT(value, key): 使用 AES 算法对加密的值进行解密。

示例

-- 加密
SELECT ENCRYPT('my secret', 'my key');

-- 解密
SELECT DECRYPT(ENCRYPT('my secret', 'my key'), 'my key');

4. SQL 查询执行原理与子查询深入

4.1 SQL 查询执行过程

SQL 查询的执行过程是一个复杂的过程,涉及多个阶段,以下是 MySQL 执行 SQL 查询的基本步骤:

1. FROM 子句解析

  • MySQL 首先解析 FROM 子句,确定查询涉及的表。

2. JOIN 子句解析

  • 如果查询中包含 JOIN 操作,MySQL 会解析 JOIN 子句,确定连接类型(如 INNER JOIN、LEFT JOIN 等)和连接条件。

3. ON 子句解析

  • ON 子句定义了连接条件,MySQL 会根据这些条件将相关行进行匹配。

4. (LEFT|RIGHT) JOIN 解析

  • 对于 LEFT JOIN 或 RIGHT JOIN,MySQL 会确定哪些行应该包含在结果集中,即使它们在另一个表中没有匹配的行。

5. WHERE 子句解析

  • WHERE 子句用于过滤行,只保留满足条件的行。

6. GROUP BY 子句解析

  • GROUP BY 子句用于对结果集进行分组,通常与聚合函数一起使用。

7. HAVING 子句解析

  • HAVING 子句用于过滤分组后的结果,类似于 WHERE 子句,但它应用于分组后的数据。

8. SELECT 子句解析

  • SELECT 子句指定了要从表中选择的列。

9. DISTINCT 子句解析

  • DISTINCT 子句用于去除结果集中的重复行。

10. ORDER BY 子句解析

  • ORDER BY 子句用于对结果集进行排序。

11. LIMIT 子句解析

  • LIMIT 子句用于限制结果集的大小。

12. 执行查询

  • MySQL 根据上述解析步骤执行查询,生成最终的结果集。

4.2 自连接与子查询

自连接

自连接是指一个表与其自身进行连接,这在处理具有层次结构的数据时非常有用。

示例

-- 查询所有管理者的姓名和他们的直接下属的姓名
SELECT m.last_name AS Manager, e.last_name AS Employee
FROM employees m
JOIN employees e ON e.manager_id = m.employee_id;

子查询

子查询是一种嵌套查询,它可以在 SELECT、FROM 或 WHERE 子句中使用。

单行子查询

单行子查询返回单个值。

示例

-- 查询所有工资高于部门平均工资的员工
SELECT employee_id, last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

多行子查询

多行子查询返回多个值。

示例

-- 查询所有部门 ID 和部门名称,这些部门包含工资高于平均工资的员工
SELECT department_id, department_name
FROM departments
WHERE department_id IN (SELECT department_id FROM employees WHERE salary > (SELECT AVG(salary) FROM employees));

相关子查询

相关子查询是指子查询依赖于外层查询中的值。

示例

-- 查询所有部门的平均工资,但只显示那些平均工资高于公司平均工资的部门
SELECT department_id, department_name, AVG(salary) AS average_salary
FROM departments d
JOIN employees e ON d.department_id = e.department_id
GROUP BY department_id
HAVING AVG(salary) > (SELECT AVG(salary) FROM employees);

5. 子查询的广泛应用与常见问题解析

5.1 子查询在 HAVING 子句中的应用

HAVING 子句通常与 GROUP BY 子句结合使用,用于对分组后的结果进行过滤。子查询在 HAVING 子句中可以提供更复杂的过滤条件。

示例

-- 查询所有部门 ID 和部门名称,这些部门的最低工资高于部门 50 的最低工资
SELECT department_id, department_name
FROM departments
WHERE department_id IN (
    SELECT department_id
    FROM employees
    GROUP BY department_id
    HAVING MIN(salary) > (
        SELECT MIN(salary)
        FROM employees
        WHERE department_id = 50
    )
);

5.2 子查询在 CASE WHEN 语句中的应用

CASE WHEN 语句可以与子查询结合,用于根据不同的条件返回不同的值。

示例

-- 查询员工信息,并根据部门 ID 判断是否位于加拿大
SELECT employee_id, last_name, department_id,
    CASE
        WHEN department_id = (
            SELECT department_id
            FROM departments
            WHERE location_id = 1800
        ) THEN 'Canada'
        ELSE 'USA'
    END AS location
FROM employees;

5.3 常见问题解析

  • NULL 值

    NULL 值会导致 NOT IN 永远为真,因为 NOT IN 检查的是是否存在不等于的值,而 NULL 与任何值比较都为假。

    示例

    SELECT * FROM employees WHERE department_id NOT IN (NULL);
    -- 结果为空,因为 NULL 不等于任何值
    
  • 多行子查询与 = 的使用

    = 不能用于多行子查询,因为 = 要求子查询返回单个值,而多行子查询会返回多行。

    示例

    SELECT * FROM employees WHERE salary = (SELECT salary FROM employees WHERE employee_id = 100);
    -- 错误,因为子查询返回多行
    

5.4 多行子查询

多行子查询返回多行结果,可以使用以下操作符:

  • IN:用于检查值是否在子查询的结果集中。
  • ALL:用于检查外层查询的值是否小于子查询结果集中的所有值。
  • ANY(或 SOME):用于检查外层查询的值是否小于子查询结果集中的任意一个值。

示例

-- 查询所有部门的平均工资,但只显示那些平均工资低于所有部门的最低平均工资的部门
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) < ALL (
    SELECT AVG(salary)
    FROM employees
    GROUP BY department_id
);

5.5 关联子查询

关联子查询是指子查询的执行依赖于外层查询的结果。

示例

-- 查询所有工资高于其部门平均工资的员工
SELECT last_name, salary, department_id
FROM employees e
WHERE salary > (
    SELECT AVG(salary)
    FROM employees e2
    WHERE e2.department_id = e.department_id
);

5.6 子查询作为临时表

有时候,可以将子查询的结果视为一个临时表,这可以通过在子查询前加上括号来实现。

示例

-- 使用子查询作为临时表
SELECT last_name, salary
FROM employees e, (
    SELECT department_id, AVG(salary) AS avg_salary
    FROM employees
    GROUP BY department_id
) dept_avg
WHERE e.department_id = dept_avg.department_id
AND e.salary > dept_avg.avg_salary;

5.7 使用 EXISTS 和 NOT EXISTS

EXISTS 和 NOT EXISTS 是用来判断子查询是否返回至少一行结果的逻辑操作符。

  • EXISTS:如果子查询返回至少一行结果,则结果为真。
  • NOT EXISTS:如果子查询返回至少一行结果,则结果为假。

示例

-- 查询没有员工的部门
SELECT department_id, department_name
FROM departments d
WHERE NOT EXISTS (
    SELECT *
    FROM employees e
    WHERE e.department_id = d.department_id
);

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

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

相关文章

C++红黑树(简单易懂)

C红黑树 红黑树红黑树的概念 红黑树节点的定义红黑树的插入颜色变化红黑树的插入拷贝构造红黑树的验证全部代码实现红黑树与AVL树的比较红黑树的应用 &#x1f30f;个人博客主页&#xff1a;个人主页 红黑树 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在…

Java并发 - 线程池

文章目录 总体设计常见线程池FixedThreadPoolCachedThreadPoolSingleThreadPoolThreadPoolExecutor 核心参数工作原理生产者消费者模型创建线程池提交任务任务提交方式任务提交流程executeaddWorker Worker队列线程运行 runWoker获取任务销毁工作线程线程池关闭shutdown/shutdo…

维修数据屏:重塑热力公司运维管理新格局

在热力公司的运维管理中&#xff0c;高效的报修和维修流程是确保系统稳定运行的关键。随着科技的发展&#xff0c;维修数据屏的出现为热力公司的运维工作带来了重大变革。 一、传统热力运维面临的挑战 过去&#xff0c;热力公司在报修和维修方面存在诸多问题&#xff0c;给运维…

基于Java的超市管理系统(源码+定制+解答)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

创建包含可导入浏览器信任的SSL自签名证书

问题&#xff1a;现在的三大浏览器&#xff0c;chrome、edge、firefox 一般都默认启用https检查&#xff0c;这就要求我们自建的局域网内的网址和其他诸如nextcloud、photoprism、tiddlywiki等应用也必须要有证书。解决方法是使用openssl自己生成一个。由此则会再衍生出一个问题…

哪款宠物空净运行吸毛好、噪音小?希喂、霍尼韦尔、安德迈测评!

作为宠物领域目前最火热的产品&#xff0c;宠物空气净化器的讨论度一直很高。身为铲屎官的我在产品刚出的时候就购入了一台&#xff0c;结果让我非常失望&#xff01; 抛开产品效果不提&#xff0c;它运行起来的声音实在太大了&#xff01;我家猫根本不愿意靠近&#xff0c;每…

定焦镜头可以改变焦距吗?

1、问题背景 焦距是镜头的一个固有光学特性&#xff0c;和镜头设计相关&#xff0c;所谓定焦镜头&#xff0c;焦距肯定是固定不变的。 但有个问题一直有点疑惑&#xff0c;焦距是镜头中心到焦点的距离&#xff0c;当我们拧动镜头调焦的过程&#xff0c;就是为了使得焦点成像在传…

信息安全保障人员认证(CISAW)全攻略

由中国网络安全审查认证和市场监管大数据中心耗时六年&#xff0c;汇聚业界专家、企业翘楚、高校及研究机构学者共同精心打磨而成的针对信息安全保障的不同专业技术方向、应用领域和保障岗位&#xff0c;依循国际标准 ISO/IEC 17024《人员认证机构通用要求》所构建的、多层次的…

LabVIEW提高开发效率技巧----减少UI更新频率

在LabVIEW开发中&#xff0c;图形化用户界面&#xff08;UI&#xff09;的更新频率对程序的响应速度有着显著影响。频繁的UI更新会占用大量资源&#xff0c;导致系统性能下降。本文将详细介绍如何通过减少UI更新频率来提升LabVIEW程序的运行效率&#xff0c;从多个角度进行分析…

TCP/UDP通信协议

TCP通讯时序 下图是一次TCP通讯的时序图。TCP连接建立断开。包含大家熟知的三次握手和四次挥手。 在这个例子中&#xff0c;首先客户端主动发起连接&#xff08;connet&#xff09;、发送请求&#xff0c;然后服务器端响应请求&#xff0c;然后客户端主动关闭连接。两条竖线表…

多功能校准仪怎么进行计量校准?

多功能校准仪计量校准是计量行业常会进行的一种校准&#xff0c;因为其多功能校准仪的普遍适用性&#xff0c;以及其计量校准技术也是在行业内比较通用&#xff0c;那么具体多功能校准仪计量校准怎么进行呢&#xff1f; 校准方法 一、在多功能校准仪的输出范围内&#xff0c;布…

观察者模式的思考

观察者模式由来 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它的起源可以追溯到20世纪90年代初&#xff0c;由设计模式四人帮&#xff08;Erich Gamma, Richard Helm, Ralph Johnson 和 John Vlissides&#xff09;在其著作《设计模…

反走样算法(MSAA、TAA、FXAA、DLSS)

光栅化的采样过程会导致图形走样,走样有很多种形式: 锯齿 摩尔纹 走样的本质原因是采样速度跟不上信号变化的速度 采样频率低,使得我们将连续变化的信号离散化. 反走样方法 anti-alisaing MSAA 多重采样反走样 超采样 优点&#xff1a; 对几何反走样效果良好 缺点…

razor TagHelper 汇总、HtmlHelper 汇总

Tag Helper Tag Helpers 的范围由 addTagHelper 和 removeTagHelper 进行控制&#xff0c;并且 “!” 为退出字符。 addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers // 手动高亮 asp-for 》》 Label <label asp-for"userName"></label>》》生…

你的炼丹炉选对GPU卡了吗?

现在抢GPU卡搞智算、搞AI模型训练的都太火了。 无论你是一个游戏爱好者还是一个赛博炼丹师&#xff08;大模型训练&#xff09;&#xff0c;英伟达GPU卡选型都将是绕不过的一道命题。 那么重点来了&#xff0c;如何在琳琅满目的各种型号GPU卡中选取一款合适且性价比高的呢&…

zookeeper实现RMI服务,高可用,HA

这可不是目录 1.RMI原理与说明1.1含义1.2流程1.3rmi的简单实现1.4RMI的局限性 2.zookeeper实现RMI服务&#xff08;高可用、HA&#xff09;2.1实现原理2.2高可用分析2.3zookeeper实现2.3.1代码分析2.3.2公共部分2.3.3服务端2.3.4客户端2.3.5运行与部署2.3.6效果展示与说明 1.RM…

Spring Boot: 构建高效中小型医院网站

1 绪论 1.1研究背景 随着计算机技术的成熟、普及&#xff0c;现代信息技术革命的迅猛发展,正冲击并进而改变着经济和社会结构。信息化的程度已经成为一个国家&#xff0c;一个企业&#xff0c;一个组织仍至一个人发展的基础和竞争成败的关键。 在实际的生活中&#xff0c;用户都…

软件评测CNAS资质获取流程

软件评测实验室如有意向申请 CNAS 检验机构认可&#xff0c;首先需要依据 CNAS 的认可准则建立管理体系&#xff0c;正式运行6个月以上&#xff0c;自我评估满足 CNAS 认可条件后可向 CNAS 提交申请。软件评测实验室CNAS认可的整体流程如图所示&#xff0c;后面的内容针对每个环…

数据结构之单链表详解:从原理到C语言实现

一、 什么是单链表&#xff1f; 单链表&#xff08;Singly Linked List&#xff09;是一种线性数据结构&#xff0c;它的特点是每个节点通过指针链接到下一个节点。不同于顺序表&#xff08;数组&#xff09;&#xff0c;链表的每个元素&#xff08;节点&#xff09;并不存储在…

【简单版】通过 Window.performance 实现前端页面(性能)监控

1 背景 前端监控系统告警xx接口fetchError 问题&#xff1a;前端监控系统没有更多的错误信息&#xff0c;查询该fetch请求对应的接口日志返回200状态码、无请求异常记录&#xff0c;且后台能查到通过该fetch请求成功发送的数据。那是前端页面的错误还是前端监控系统的问题&…