探索 Oracle Database 23ai 中的 SQL 功能

探索 Oracle Database 23ai 中的 SQL 功能

    • 介绍
      • 目标
      • 前提条件
    • 功能 1:使用 `FROM` 子句
    • 功能 2:使用 `BOOLEAN` 数据类型
    • 功能 3:使用 `IF NOT EXISTS` DDL 子句
    • 功能 4:使用 `INSERT` 插入多行
    • 功能 5:使用新的 `VALUE` 构造函数
    • 功能 6:在 `GROUP BY` 子句中使用别名
    • 功能 7:使用 `UPDATE` 和 `MERGE` 语句的 `RETURNING` 子句
    • 功能 8:在 `UPDATE` 和 `DELETE` 中使用连接
    • 功能 9:使用注释
    • 功能 10:使用 SQL 域
    • Oracle Database 23ai 功能的限制和限制

介绍

在这个教程中,我们将学习 10 个您需要知道的功能及其与现有对应功能的比较。这些功能包括:

  • FROM 子句(可选)。
  • SQL 中的 BOOLEAN
  • 数据定义语言(DDL)中的 IF NOT EXISTS 子句。
  • 多值 INSERT
  • 新表 VALUE 构造函数。
  • GROUP BY 子句中的别名。
  • UPDATEMERGE 语句的 RETURNING 子句。
  • UPDATEDELETE 中的连接。
  • 注释,数据库对象的新元数据。
  • 使用 SQL 域的轻量级对象类型。

目标

  • 不使用 FROM 子句的 SQL:通过删除在选择表达式或内置函数时使用 FROM 子句的要求,使查询更简单。

  • 在 SQL 中实现原生 BOOLEAN 数据类型:在 SQL 表、查询和条件中利用原生 BOOLEAN 数据类型,以便更直观地处理真/假逻辑。

  • 在 DDL 语句中使用 IF NOT EXISTS:通过有条件地执行 CREATEDROP 语句,简化对象创建和删除逻辑,无需额外的 PL/SQL 检查。

  • 执行多值 INSERT 操作:通过在单个 INSERT 语句中插入多行,提高代码可读性并减少与数据库的往返次数。

  • 使用表值构造函数创建内联数据集:使用 VALUES 构造函数直接在 SQL 中创建临时行集,支持 MERGESELECT 或比较等操作。

  • GROUP BY 子句中引用列别名:通过允许在 GROUP BY 中使用 SELECT 别名而非重复表达式,增强查询的可读性。

  • UPDATEMERGE 中利用 RETURNING 子句:直接从 UPDATEMERGE 语句中检索受影响的数据,无需后续查询。

  • UPDATEDELETE 语句中执行连接:直接在 UPDATEDELETE 操作中使用 JOIN 逻辑,根据相关表的条件修改或删除记录。

  • 使用元数据注释数据库对象:使用 ANNOTATION 文档化数据库对象,以存储描述性元数据(例如所有者、用途),便于维护和内省。

  • 使用 SQL 域定义轻量级对象类型:创建可重用的域类型和约束,以在多个表中强制执行一致性和强类型。

前提条件

  • 基础 SQL 知识。

    • 了解 SQL 语法:SELECTINSERTUPDATEDELETEJOINGROUP BY 等。

    • 熟悉关系数据库概念和数据类型。

  • 使用 Oracle Database 23ai 及其早期版本的经验。

    • 了解 Oracle Database 19c、Oracle Database 21c 及更早版本中 DDL、数据操作语言(DML)和 PL/SQL 的工作方式。

    • 了解 Oracle 特定功能,如 DUALMERGERETURNING INTO 等。

  • 访问 Oracle Database 23ai 环境。

    • 访问 Oracle Database 23ai(本地设置、云实例或 Oracle Live SQL)。

    • 某些功能(如 SQL 域或 BOOLEAN)仅在 Oracle Database 23ai 中可用。

  • SQL*Plus、SQLcl 或 GUI 工具(如 SQL Developer 或 DataGrip)。能够在兼容的界面中运行和测试 SQL 语句。

  • PL/SQL 基础(用于高级功能)。用于 RETURNING INTO、过程块和处理动态 SQL。

  • 约束和数据完整性规则的知识。需要了解 SQL 域和表约束。

  • 熟悉 Oracle 数据字典视图。用于查询注释或元数据。例如,USER_TABLESUSER_ANNOTATIONS

  • Oracle Database 中的角色和权限。创建/修改表、域和注释的能力需要适当的用户权限。

  • 版本意识。确保您的工具和客户端支持 Oracle Database 23ai 功能(较旧的驱动程序或工具可能会失败)。

  • (可选)接触其他现代 SQL 方言(PostgreSQL、MySQL 等)。这将帮助您理解新功能(如 VALUESBOOLEANIF EXISTS)的跨兼容性。

功能 1:使用 FROM 子句

Oracle Database 23ai 引入的一个有趣功能是 SELECT 语句中 FROM 子句的可选性。在此版本之前,FROM 子句是必需的。

以下是 Oracle Database 23ai 中不使用 FROM 子句功能的一些潜在好处。

  • 选择当前日期以便于数据操作。

    SELECT CURRENT_DATE;
    

在这里插入图片描述

  • 无需涉及表数据的数学运算或计算。

    SELECT 25.50*25.25;
    25.50*25.25
    -----------
    643.875
    耗时: 00:00:00.002
    1 行已选中。
    
  • 不使用 FROM 子句的 PL/SQL 块。

    CREATE SEQUENCE empno_seq INCREMENT BY 1 START WITH 1 MINVALUE 1 MAXVALUE 1000;
    序列 EMPNO_SEQ 已创建。
    耗时: 00:00:00.005
    declare v1 number;
    begin
    select empno_seq.nextval into v1;
    dbms_output.put_line ('v1= '||v1);
    end;
    /
    v1= 1
    PL/SQL 过程已成功完成。
    耗时: 00:00:00.009
    
  • 使用内置或用户定义的函数执行操作或检索值。

    SELECT DBMS_RANDOM.VALUE() as random_number;
    
  • 无需依赖表数据的字符串操作或转换。

    SELECT UPPER('oracle') AS uppercase_text;
    

在这里插入图片描述

  • 不使用表的条件或逻辑表达式。

    SELECT CASE WHEN 10 > 5 THEN 'True' ELSE 'False' END AS result;
    

功能 2:使用 BOOLEAN 数据类型

Oracle Database 23ai 引入了新的 BOOLEAN 数据类型。这使得可以使用真正的布尔列/变量,而不是用数值或 Varchar 模拟它们。能够编写布尔谓词简化了 SQL 语句的语法。

  1. 创建一个名为 TEST_BOOLEAN 的表。

    CREATE TABLE IF NOT EXISTS TEST_BOOLEAN (name VARCHAR2(100), IS_SLEEPING BOOLEAN);
    表 TEST_BOOLEAN 已创建。
    耗时: 00:00:00.004
    
  2. 向新表中输入数据。IS_SLEEPING 的值将是 NOT NULL 并默认为 FALSE

    ALTER TABLE TEST_BOOLEAN modify (IS_SLEEPING boolean NOT NULL);
    

    在这里插入图片描述

    ALTER TABLE TEST_BOOLEAN modify (IS_SLEEPING default FALSE);
    表 TEST_BOOLEAN 已修改。
    耗时: 00:00:00.014
    

    在这里,您可以看到 Mick、Keith 和 Ron 的不同布尔输入。所有输入都是有效的。对于 Mick,使用默认的 FALSE 值 - Mick 没有睡觉。

    INSERT INTO TEST_BOOLEAN (name, is_sleeping) values ('Mick', default);
    1 行已插入。
    耗时: 00:00:00.006
    

    对于 Keith,我们使用 NO 值 - Keith 没有睡觉。

    INSERT INTO TEST_BOOLEAN (name, is_sleeping) values ('Keith','NO');
    1 行已插入。
    耗时: 00:00:00.002
    

    对于 Ron,我们使用 1 值 - Ron 正在睡觉。

    INSERT INTO TEST_BOOLEAN (name, is_sleeping) values ('Ron',1);
    1 行已插入。
    耗时: 00:00:00.002
    
  3. 查看基于我们布尔值的结果。

    SELECT * FROM test_boolean;
    

    您不再需要记住您设置的布尔系统类型。如我们所示,使用 0/1、True/False、Yes/No 或任何其他常见输入将返回准确的表值。

功能 3:使用 IF NOT EXISTS DDL 子句

从 Oracle Database 23ai 开始,新的 IF NOT EXISTS DDL 子句允许决定如何处理 DDL 错误。这简化了 DDL 脚本编写,因为由于对象存在或不存在导致的潜在错误可以被脚本隐藏。

  1. 首先,测试不使用此新功能。运行以下语句。

    DROP TABLE DEPT;
    

    由于没有现有的 DEPT 表可删除,我们将看到错误:ORA-00942: 表或视图不存在

  2. 然而,在 Oracle Database 23ai 中,我们可以使用 DROP IF EXISTS 而不出现错误。这让我们在避免错误的同时心安理得。现在,运行相同的语句,但包含此新的 IF EXISTS 功能。

    DROP TABLE IF EXISTS DEPT;
    
  3. 类似地,我们可以使用此功能在表不存在时创建表。创建 DEPT 表。

    CREATE TABLE IF NOT EXISTS DEPT
    (DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
    DNAME VARCHAR2(14) ,
    LOC VARCHAR2(13) ) ;
    

    在这里插入图片描述

  4. 使用此功能在本教程中创建更多示例表。在这里,我们将创建一个名为 EMP 的员工表。

    CREATE TABLE IF NOT EXISTS EMP (EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT);
    表 EMP 已创建。
    耗时: 00:00:00.006
    

功能 4:使用 INSERT 插入多行

另一个确保与其他常用数据库管理系统更好共存和兼容性的有趣功能是多值 INSERT 语句。

  1. 在 Oracle 数据库的早期版本中,例如,插入多行需要为每一行单独插入语句。

    INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK');
    INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
    INSERT INTO DEPT VALUES (30,'SALES','CHICAGO');
    INSERT INTO DEPT VALUES (40,'OPERATIONS','BOSTON');
    INSERT INTO DEPT VALUES (50,'HR','LOS ANGELES');
    INSERT INTO DEPT VALUES (60,'IT','SAN FRANCISCO');
    INSERT INTO DEPT VALUES (70,'MANUFACTURING','DETROIT');
    

    Oracle Database 23ai 引入了新的语法,允许在单个 INSERT 语句中插入所有这些行,因此您可以在一个 DML 中插入几个元组。运行以下语句。

    INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK'), (20,'RESEARCH','DALLAS'), (30,'SALES','CHICAGO'), (40,'OPERATIONS','BOSTON'), (50,'HR','LOS ANGELES'), (60,'IT','SAN FRANCISCO'), (70,'MANUFACTURING','DETROIT');
    

    在这里插入图片描述

    除了与其他数据库更好的兼容性外,此语句还可以用于确保在自动提交模式下的一些插入操作的一致性。这对于使用此模式处理数据的 Oracle APEX 应用程序可能很重要。

  2. 运行以下语句以使用此功能为 EMP 表填充值。

    INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20), (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30), (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30), (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20), (7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30), (7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30), (7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10), (7788,'SCOTT','ANALYST',7566,to_date('13-JUL-87')-85,3000,NULL,20), (7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10), (7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30), (7876,'ADAMS','CLERK',7788,to_date('13-JUL-87')-51,1100,NULL,20), (7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30), (7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20), (7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
    

功能 5:使用新的 VALUE 构造函数

从 Oracle 数据库 23ai 开始,表值构造函数已扩展。现在可以在 INSERT 语句中使用,以便在单个命令中创建多行。它还可以在 SELECT 语句和视图因式分解语法中使用。在这种情况下,它简化了语句的语法,并避免使用 DUAL 表。

以下语句看起来像是一种即时的表函数。

SELECT * FROM (VALUES (50,'HR'), (60,'DEV'), (70,'AI')) virt_dept (deptno, dname);

在这里插入图片描述

功能 6:在 GROUP BY 子句中使用别名

Oracle Database 23ai 引入了在 SELECT 语句的 GROUP BY 子句中使用别名的能力。此功能简化了编写具有复杂表达式的查询,并确保与某些其他关系数据库(如 Teradata、MySQL 和 PostgreSQL)的更好兼容性。

例如:

SELECT to_char(hiredate,'YYYY') "Year", count(*) FROM emp GROUP BY to_char(hiredate,'YYYY');

在 Oracle Database 23ai 中,这可以以更简单的方式编写,如下图所示:

在这里插入图片描述

功能 7:使用 UPDATEMERGE 语句的 RETURNING 子句

此子句曾作为 EXECUTE IMMEDIATE 语句的一部分实现。然而,在 Oracle Database 23ai 中,我们可以在传统的、静态的 DML 语句中找到它。

  1. 在这种情况下,它允许从处理的行获取列的旧值和新值。首先,让我们看看 King 的当前薪水。

    SELECT ename, sal FROM emp WHERE ename = 'KING';
    
  2. 为了在 LiveSQL 中使用变量,我们将将我们的语句包装在 PL/SQL 中。运行此脚本。它首先为旧薪水和新薪水创建变量,然后使用 RETURNING 子句更新 King 的薪水以设置我们的变量。然后我们将查看结果。

    BEGIN
    DECLAREold_salary NUMBER;new_salary NUMBER;
    BEGINUPDATE empSET sal = sal + 1000WHERE ename = 'KING'RETURNING OLD sal, NEW sal INTO old_salary, new_salary;DBMS_OUTPUT.PUT_LINE('Old Salary: ' || old_salary);DBMS_OUTPUT.PUT_LINE('New Salary: ' || new_salary);
    END;
    END;
    

    在这里插入图片描述

    Old Salary: 6000
    New Salary: 7000
    

    此示例使用了 UPDATE 语句,但 RETURNING 子句可以类似地用于 MERGE 语句。

功能 8:在 UPDATEDELETE 中使用连接

您可以使用基于外部表条件的连接更新表数据。无需子查询或 IN 子句。

  1. 运行以下语句以查看研究部门的员工薪资信息。

    select e.sal, e.empno from emp e, dept d where e.deptno=d.deptno and d.dname='RESEARCH';
    
  2. 在 Oracle Database 23ai 之前,我们需要使用嵌套语句来更新薪资信息。

    UPDATE emp e set e.sal=e.sal*2 WHERE e.deptno in (SELECT d.deptno FROM dept d WHERE e.deptno=d.deptno and d.dname='RESEARCH');
    

    在 Oracle Database 23ai 中,您可以这样使用它:

    UPDATE emp e set e.sal=e.sal*2
    FROM dept d
    WHERE e.deptno=d.deptno
    and d.dname='RESEARCH';
    

    在这里插入图片描述

  3. 您可以看到薪资已成功更新。

    select e.sal, e.empno from emp e, dept d where e.deptno=d.deptno and d.dname='RESEARCH';
    

    在这里插入图片描述

功能 9:使用注释

注释是数据库对象的可选元数据。注释是名称-值对或仅名称。名称和可选值是自由格式的文本字段。注释表示为数据库对象的从属元素,该注释已添加。支持的模式对象包括表、视图、物化视图和索引。使用注释,您可以存储和检索有关数据库对象的元数据。您可以使用它来自定义业务逻辑、用户界面或将元数据提供给元数据存储库。它可以在表或列级别使用 CREATEALTER 语句添加。

使用注释,您可以存储和检索有关数据库对象的元数据。您可以使用它来自定义业务逻辑、用户界面或将元数据提供给元数据存储库。

  1. 创建带有列和表注释的注释表 EMP_ANNOTATED_NEW

    CREATE TABLE emp_annotated_new
    (empno number annotations(identity, display 'person_identity', details 'person_info'),
    ename varchar2(50),
    salary number annotations (display 'person_salary', col_hidden))
    annotations (display 'employee_table');
    

    在这里插入图片描述

  2. 数据字典视图,如 USER_ANNOTATIONSUSER_ANNOTATIONS_USAGE,可以帮助监控使用情况。

    SELECT object_name, object_type, column_name, annotation_name, annotation_value FROM user_annotations_usage;
    

    在这里插入图片描述

功能 10:使用 SQL 域

SQL 域是属于模式的字典对象,它封装了一组可选的属性和约束,并使用 CREATE DOMAIN 语句创建。域提供约束、显示、排序和注释属性。定义 SQL 域后,您可以定义表列与该域关联,从而将域的可选属性和约束显式应用于这些列。

SQL 域允许用户声明列的预期用途。它们是字典对象,因此可以轻松重用抽象的域特定知识。

  1. 创建名为 yearbirth 的域和名为 person 的表。

    CREATE DOMAIN yearbirth as number(4) constraint check ((trunc(yearbirth) = yearbirth) and (yearbirth >= 1900)) display (case when yearbirth < 2000 then '19-' ELSE '20-' end)||mod(yearbirth, 100) order (yearbirth -1900) annotations (title 'yearformat');
    

    在这里插入图片描述

    CREATE TABLE person (id number(5), name varchar2(50), salary number, person_birth number(4) DOMAIN yearbirth ) annotations (display 'person_table');
    

    在这里插入图片描述

    desc person;Name Null? Type* * *ID NUMBER(5)
    NAME VARCHAR2(50)
    SALARY NUMBER
    PERSON_BIRTH NUMBER(4) DOMAIN YEARBIRTHINSERT INTO person values (1,’MARTIN’,3000, 1988);
    
  2. 使用新函数 DOMAIN_DISPLAY 可以显示属性。

    SELECT DOMAIN_DISPLAY(person_birth) FROM person;
    
  3. 域的使用情况和注释可以通过数据字典视图监控。让我们查看 user_annotations_usage

    SELECT * FROM user_annotations_usage;
    
    定义可重用的域类型(轻量级对象)。
    CREATE DOMAIN EmailAddress AS VARCHAR2(100) CHECK (REGEXP_LIKE(VALUE,^\[^@\]+@\[^@\]+.\[^@\]+$’));
    CREATE TABLE users ( user_id NUMBER, email EmailAddress );
    

    在这里插入图片描述

Oracle Database 23ai 功能的限制和限制

  • FROM 子句

    • 仅适用于简单表达式,如函数、字面量或变量。

    • 不能用于涉及表、连接或子查询的查询。

    • 不支持在 PL/SQL 上下文中使用游标循环,这些循环期望 FROM 子句。

  • 原生 BOOLEAN 数据类型

    • 可以用于表列和表达式。

    • 不可索引,BOOLEAN 数据类型的列不能被索引。

    • 并非所有客户端工具或报表工具都直接支持(可能需要将其转换为 0/1 或 Y/N)。

    • 某些较旧的 API 或驱动程序不支持(JDBC/ODBC 客户端可能需要更新)。

  • DDL 中的 IF NOT EXISTS

    • 简化了幂等 DDL 脚本。

    • 仅适用于特定对象:TABLEINDEXSEQUENCEVIEW 等。

    • 并非所有对象类型都支持此功能(例如,TRIGGERSYNONYM 可能仍需要手动检查)。

    • 不支持较旧的 Oracle 版本。

  • 多值 INSERT

    • 批量插入的清晰语法。

    • 仅限于显式值集,不能在相同的 VALUES 子句中使用 SELECT 或子查询插入。

    • 不能与 RETURNING 子句结合使用,以便在一步中为所有插入的行返回值。

  • 表值构造函数(VALUES 子句)

    • 适用于小型、临时的行集。

    • 有行限制(通常为 999 行或更少,具体取决于上下文)。

    • 不适用于大规模加载,更好地使用临时表或暂存区域处理大型数据集。

  • GROUP BY 子句中的别名

    • 使查询更容易阅读和编写。

    • 不支持所有分析函数或涉及子查询列的复杂查询。

    • 可能在查询中引起混淆,其中别名被重复使用(例如,在内部查询中使用相同名称)。

  • UPDATE/MERGE 中的 RETURNING 子句

    • 减少了 DML 后的 SELECT 需要。

    • 仅能返回实际修改的行的值。

    • 不能用于批量更新,除非使用 FORALL,必须使用 PL/SQL 并显式 RETURNING BULK COLLECT

  • UPDATEDELETE 中的连接

    • 使多表逻辑更简单。

    • 仅支持某些上下文中的 INNER JOINLEFT JOIN 类型。

    • 如果使用较旧的工具或需要与较早的 Oracle 版本兼容,可能需要重写 MERGE 逻辑。

  • 注释

    • 非常适合文档化。

    • 注释仅是元数据,无法在运行时强制执行。

    • 需要使用 Oracle 数据字典视图(*_ANNOTATIONS)来检索。

    • 尚未集成到 Oracle Data Pump 导出/导入或复制工具中。

  • 使用 SQL 域的轻量级对象类型

    • 可重用,一致的类型强制。

    • 仍然不如完整的对象类型强大(没有方法、属性)。

    • 没有继承或组合,仅用于原始约束强制。

    • 无法在域本身中定义默认值(默认值仍在列级别指定)。

一般限制

  • 工具兼容性:许多 GUI 工具和较旧的 Oracle 客户端库可能尚未完全支持 Oracle Database 23ai 语法(特别是 VALUESBOOLEANDOMAIN)。

  • 导出/导入:某些功能(如注释或域)可能不会在较旧的 expdp/impdp 工作流中保留。

  • 实验性行为:由于这些功能是新的,某些功能可能会在次要版本中发展——请频繁查看补丁说明和文档。

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

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

相关文章

SQL(6)

! 会排除null数据 select name from Customer where referee_id ! 2 or referee_id is null; 交叉联结 交叉连接&#xff08;CROSS JOIN&#xff09;-CSDN博客 197. 上升的温度 select a.id from weather as a cross join weather as b on datediff(a.recordDate ,b.recordD…

【Java面试题】cookie、session、jwt/token的异同

以下是对Cookie、Session、Token与JWT的异同的完善分析&#xff0c;结合技术原理、安全性和应用场景进行系统性对比&#xff1a; &#x1f50d; 一、核心概念与工作流程 机制定义工作流程核心特点Cookie客户端存储的小型文本数据1. 服务器通过Set-Cookie响应头下发数据2. 浏览…

数字经济时代科技创业的巨大潜力

2025年3月&#xff0c;42岁的字节跳动创始人张一鸣以655亿美元身家成为中国新首富。这位"80后"企业家白手起家的故事&#xff0c;展现了数字经济时代科技创业的巨大潜力。本文将带您了解张一鸣的成功秘诀&#xff0c;分析网络安全行业的最新趋势&#xff0c;并为计算…

深入剖析Nginx架构及其不同使用场景下的配置

一、Nginx 整体架构概览 1. Nginx简介 Nginx 是采用 C 语言 编写的高性能 Web 服务器、反向代理服务器及邮件代理服务器&#xff0c;特点是&#xff1a;高并发、高可用、低内存占用、模块化设计。 架构核心理念&#xff1a; Master-Worker 多进程模型 事件驱动&#xff08;…

单元测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 对于软件测试&#xff0c;我们先按照开发阶段来进行划分&#xff0c;将软件测试分为单元测试、集成测试、系统测试、验收测试&#xff0c;下面我们来聊聊单元测试。…

四款好用的Windows虚拟打印机,文档转PDF

1&#xff0c;Microsoft Print To PDF 2&#xff0c;Foxit Reader PDF Printer 3&#xff0c;Adobe PDF 4&#xff0c;clawPDF 参考文档&#xff1a; https://mp.weixin.qq.com/s/_mt4J2RwhqQE36DRAvc-Rg

《map和set的使用介绍》

引言&#xff1a; 上次我们学习了第一个高阶数据结构—二叉搜索树&#xff0c;趁热打铁&#xff0c;今天我们就再来学习两个数据结构—map和set。 一&#xff1a;序列式容器和关联式容器 前面我们已经接触过STL中的部分容器如&#xff1a;string、vector、list、deque、arra…

PostgreSQL(二十六)分区表管理

目录 一、分区表特点 1、概念&#xff1a; 2、好处&#xff1a; 3、特点&#xff1a; 二、范围分区介绍 1、简介 2、范围分区实验&#xff1a; 三、list分区介绍 1、简介 2、list分区表实验 四、hash分区介绍 1、简介 2、hash分区表实验 五、混合分区介绍 1、简…

概率论中的生日问题,违背直觉?如何计算? 以及从人性金融的角度分析如何违背直觉的?

一、生日问题的概率计算&#xff1a;为何23人就有50%概率撞生日&#xff1f; 1. 问题背景与直觉矛盾 生日问题指&#xff1a;在n个人中&#xff0c;至少有两人生日相同的概率超过50%时&#xff0c;n的最小值是多少&#xff1f; 直觉判断&#xff1a;因一年有365天&#xff0c…

Qt for WebAssembly官方说明文档

链接 Qt for WebAssembly | Qt 5.15

前端自主实现将vue页面转为pdf文件下载

1.vue 转 PDF 在 Vue 项目中将 HTML 页面转换为 PDF 文件是一个常见需求&#xff0c;特别是在需要生成报告或打印页面时。本文将介绍如何使用 html2canvas 和 jspdf 库实现这一功能。 2.安装依赖 首先&#xff0c;我们需要安装两个库&#xff1a;html2canvas 和 jspdf 。可以…

TCP 坚持定时器详解:原理、配置与最佳实践​

一、TCP 坚持定时器基础原理 1.1 坚持定时器的设计目的 TCP 坚持定时器 (TCP Persist Timer) 是 TCP 协议中用于处理接收窗口为零情况的重要机制&#xff0c;其核心设计目的是防止 TCP 连接在窗口更新 ACK 丢失时陷入死锁状态。当 TCP 连接的接收方通告一个窗口大小为 0 的 A…

大厂测开实习和小厂开发实习怎么选

先说选择&#xff0c;这个可以百分百确定选大厂&#xff0c;title很重要。 要想弄清楚那个选择对自己最有利&#xff0c;可以思考下实习的意义是什么&#xff1f; 实习无非就是给简历加分&#xff0c;拿到好offer&#xff0c;高薪offer。 那这就需要思考&#xff0c;简历怎么让…

Unity中的urp和普通的标准渲染管线区别在哪

Unity中的URP&#xff08;Universal Render Pipeline&#xff09;与内置标准渲染管线&#xff08;Built-in Render Pipeline&#xff09;的区别深刻反映了Unity渲染技术的演进方向。以下从架构、性能、功能、工作流等多个维度进行深度分析&#xff1a; 1. 底层架构与设计哲学 标…

Vscode 编写Markdown支持 plantuml书写

1&#xff1a; 下载PlantUml 插件&#xff1a; 2&#xff1a; 安装java https://www.oracle.com/java/technologies/downloads/ 3&#xff1a; 安装Graphviz https://graphviz.org/download/ 4&#xff1a; 下载plantuml.jar https://plantuml.com/zh/download 5&…

设计模式(C++/Qt)-工厂模式

在软件开发中&#xff0c;对象创建是基础但关键的任务——工厂模式提供了一种优雅的解决方案&#xff0c;让您的代码摆脱硬编码的依赖关系 一、为什么需要工厂模式&#xff1f; 在C/Qt开发中&#xff0c;我们经常面临这样的困境&#xff1a; 对象创建逻辑分散在代码各处新增…

Pydantic 模型

本文将详细介绍 Pydantic 模型 和 BaseModel 的核心概念&#xff0c;并通过实际代码示例如何从零开始编写自己的 Pydantic 模型。 1. Pydantic 是什么&#xff1f; Pydantic 是一个 Python 库&#xff0c;主要用于&#xff1a; 数据验证&#xff1a;确保输入数据符合预期的类…

【Unity智能模型系列】MediaPipeUnityPlugin 实现人脸数据获取

目录 一、MediaPipeUnity 简介 二、MediaPipeUnity 的核心组成 1. Graph 构建系统 2. 解决方案类(Solution) 3. 解释注释Annotation 系统 三、MediaPipeUnity 的典型使用流程 四、典型示例解析 1、案例 Face Detection图形人脸检测 2、案例 Face Detection图形人脸检…

iOS App 上架步骤解析:适合资源有限团队的上架流程与注意事项

对于不少创业型或初创阶段的开发团队来说&#xff0c;人员配置紧凑、设备有限是常态。在这种背景下&#xff0c;完成一次合规、高效的iOS应用发布往往不是技术难点&#xff0c;而是流程协同与资源调配的问题。 我们是一支5人团队&#xff0c;开发一款社交类工具型App&#xff…

Redis雪崩、穿透、击穿原理及解决方案

以下是 Redis 缓存穿透、击穿与雪崩的原理及解决方案的深度解析&#xff0c;结合工业级实践整理&#xff1a; &#x1f50d; ‌一、问题原理与区别‌ ‌问题类型‌‌触发条件‌‌核心特征‌‌危害‌‌缓存穿透‌查询‌不存在的数据‌绕过缓存直击数据库&#xff0c;导致无效查…