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

SQL中的数据库对象

视图:VIEW

  1. 概念
    ① 虚拟表,本身不存储数据,可以看做是存储起来的SELECT语句
    ② 视图中SELECT语句中涉及到的表,称为基表
    ③ 针对视图做DML操作,对影响到基表中的数据,反之亦然
    ④ 创建、删除视图本身,不会影响到基表

  2. 创建视图

    CREATE VIEW view_emp_avg_salary(dept_id, avg_salary)
    AS
    SELECT department_id, AVG(salary)
    FROM employees
    WHERE department_id IS NOT NULL
    GROUP BY department_id;
    
  3. 查看视图:DESC 视图名;

  4. 修改视图

    # 方式一
    CREATE OR REPLACE VIEW 视图名
    AS
    SELECT ...#方式二
    ALTER VIEW 视图名
    AS
    SELECT ...
    
  5. 删除视图

    DROP VIEW 视图名;
    

索引:INDEX

用于提高查询性能

存储过程:PROCEDURE

用于完成一次完整的业务处理,没有返回值,但可以通过传出参数将多个值传给调用者

  1. 创建
    ① 无参数无返回值
    # 查询所有员工信息
    DELIMITER $
    CREATE PROCEDURE select_all_emp()
    BEGINSELECT * FROM employees;
    END $
    DELIMITER;
    # 调用
    CALL select_all_emp();
    
    ② 无参数有返回值:OUT
    # 查询员工中的最低工资,并将最低工资输出到ms
    DELIMITER $
    CREATE PROCEDURE select_min_sal(OUT ms DECIMAL)
    BEGINSELECT MIN(salary) INTO msFROM employees;
    END $
    DELIMITER;
    # 调用
    CALL select_min_sal(@ms);
    # 查看参数结果
    SELECT @ms;
    
    ③ 有参数无返回值:IN
    # 查询指定姓名的员工工资
    DELIMITER $
    CREATE PROCEDURE show_salary_by_lastname(IN lastName VARCHAR(50))
    BEGINSELECT salaryFROM employeesWHERE last_name = lastName;
    END $
    DEIMITER;
    # 调用
    CALL show_salary_by_lastname('Popp');
    
    ④ 有参数有返回值:INOUT
    # 查询指定姓名的员工工资和部门,并从参数中返回出来
    DELIMITER $
    CREATE PROCEDURE show_salary_by_lastname2(IN lastName VARCHAR(50), OUT sal DECIMAL, OUT dept_id INT)
    BEGINSELECT salary,department_id INTO sal, dept_idFROM employeesWHERE last_name = lastName;
    END $
    DELIMITER;
    # 调用
    CALL show_salary_by_lastname2('Popp', @sal, @deptId);
    # 查询结果
    SELECT @sal, @deptId;
    
    ⑤ 有参数有返回值:INOUT
    # 查询指定员工的领导姓名,并从参数中返回出来
    DELIMITER $
    CREATE PROCEDURE show_manager_by_lastname(INOUT lastName VARCHAR(50))
    BEGINSELECT m.last_name INTO lastNameFROM employees e JOIN employees mON e.manager_id = m.employee_idWHERE e.last_name = lastName;
    END $
    DELIMITER;
    # 调用
    SET @lastname = 'Popp';
    CALL show_manager_by_lastname(@lastname);
    # 查询结果
    SELECT @lastname;
  2. characteristics
    LANGUAGE SQL:表明存储过程执行体是由SQL语句构成的
    [NOT] DETERMINISTIC:存储过程的执行结果是否确定,默认为不确定
    CONTAINS SQL:存储过程的执行体包含SQL语句,但不包含读写数据的SQL语句,默认是这个
    NO SQL:存储过程的执行体不包含任何SQL语句
    READS SQL DATA:存储过程的执行体包含读数据的SQL语句
    MODIFIES SQL DATA:存储过程的执行体包含写数据的SQL语句
    SQL SECURITY {DEFINER | INVOKER}:执行权限
    COMMENT:备注信息
  3. 查看创建信息SHOW CREATE PRODECURE 存储过程名称;
  4. 查看状态信息SHOW PROCEDURE STATUS LIKE '存储过程名称';
  5. 修改特性
    ALTER PROCEDURE '存储过程名称'
    SQL SECURITY INVOKER
    COMMENT '备注信息...';
    
  6. 删除DROP PROCEDURE '存储过程名称';

存储函数:FUNCTION

用于完成一次特定的计算,有一个返回值

# 查询指定部门的员工人数
DELIMITER $
CREATE FUNCTION select_count_by_dept(dept_id INT)
RETURNS INT
DETERMINISTIC
CONTAINS SQL
READS SQL DATA
BEGINRETURN(SELECT COUNT(*) FROM employees WHERE department_id = dept_id);
END $
DELIMITER;
# 使用
SELECT select_count_by_dept(50);

触发器:TRIGGER

相当于事件监听器,当数据库发生特定事件时,触发器被触发,完成相应的处理

  1. 创建

    代码格式:
    CREATE TRIGGER 触发器名称
    {BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名
    FOR EACH ROW
    BEGIN
    代码块;
    END;

    ① 案例一:向一张表中添加数据之前,同时向另一张表添加数据

    DELIMITER //
    CREATE TRIGGER test_before_trigger
    BEFORE INSERT ON table1
    FOR EACH ROW
    BEGININSERT INTO table2(name)VALUES ('before_name...');
    END //
    DELIMITER;
    # 测试
    INSERT INTO table1(age)
    VALUES(18);
    

    ② 案例二:在向employees表中添加员工信息之前,检验此员工的工资是否大于领导的工资,大于的话报错,否则添加成功(NEW代表添加的数据信息,OLD代表删除的数据信息)

    DELIMITER //
    CREATE TRIGGER verify_trigger
    BEFORE INSERT ON employees
    FOR EACH ROW
    BEGINDECLARE manager_sal DECIMAL DEFAULT 0.0;SELECT salary INTO manager_sal FROM employees WHERE employee_id = NEW.manager_id;IF NEW.salary > manager_sal# 抛出错误THEN SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = '添加失败:薪资高于领导工资';END IF;
    END //
    DELIMITER;
    
  2. 查看
    ① 查看数据库中的所有触发器:SHOW TRIGGERS;
    ② 查看某个触发器的定义:SHOW CREATE TRIGGER 触发器名称;

  3. 删除DROP TRAGGER 触发器名称;

变量

  1. 系统变量:以@@开头
    ① 查看全局系统变量:SHOW GLOBAL VARIABLES;
    ② 查看会话系统变量
    SHOW SESSION VARIABLES;
    SHOW VARIABLES;
    
    ③ 查看指定系统变量
    SELECT @@global.max_connections; # 查看服务器最大连接数
    SELECT @@global.character_set_client; # 查看字符集
    SELECT @@session.character_set_client; # 查看字符集
    SELECT @@session.pseudo_thread_id; # 查看当前会话的MySQL连接ID
    SELECT @@character_set_client; # 先查看会话的字符集,若没有再查看全局的字符集
    
    ④ 修改系统变量的值
    SET @@global.max_connections = 166; # 修改全局变量,方式一
    SET GLOBAL max_connection = 167; # 修改全局变量,方式二SET @@session.character_set_client = 'gbk'; # 修改会话变量,方式一
    SET SESSION character_set_client = 'gbk'; # 修改会话变量,方式二
    
  2. 用户变量
    ① 会话用户变量:以@开头
    # 声明和初始化
    SET @a = 1;
    SET @b := 2;
    SELECT @avg_sal := AVG(salary) FROM employees; # 这种情况必须用:=
    SELECT COUNT(*) INTO @emp_total FROM employees;
    #使用
    SELECT @a, @b, @avg_sal, @emp_total;
    
    ② 局部变量
    说明:
    a、使用关键字:DECLARE
    b、只能在存储过程和存储函数中使用
    c、必须写在BEGIN...END的首行
    d、格式:DECLARE 变量名 类型 [DEFAULT 值] ,若不指明DEFAULT,则默认是NULL
    DELIMITER $
    CREATE PROCEDURE test()
    BEGIN# 声明局部变量DECLARE a INT DEFAULT 0;DECLARE b INT;DECLARE name VARCHAR(30);#赋值SET a = 5;SET b := 6;SELECT last_name INTO nameFROM employeesWHERE employee_id = 100;#使用SELECT a, b, name;
    END $
    DELIMITER;
    

定义条件与处理程序

  1. 定义条件
    ① 格式:DECLARE 错误名称 CONDITION FOR 错误码;
    ② 目的:给错误码命名
    ③ 错误码分类:MySQL_error_code、sqlstate_value
  2. 定义处理程序
    ① 格式:DECLARE 处理方式 HANDLER FOR 错误类型 处理语句;
    ② 处理方式分类:
    a、CONTINUE:遇到错误不处理,继续执行
    b、EXIT:遇到错误马上退出
    c、UNDO:遇到错误后撤回之前的操作
    ③ 错误类型分类
    a、SQLSTATE '字符串错误码':字符串类型错误码,长度为5
    b、MySQL_error_code:数值类型错误码
    c、错误名称:定义条件时声明的名称
    d、SQLWARNING:匹配所有以01开头的错误码
    e、NOT FOUND:匹配所有以02开头的错误码
    f、SQLEXCEPTION:匹配没有被d、e匹配到的错误码
  3. 案例
    DELIMITER $
    CREATE PROCEDURE UpdateTest()
    BEGIN# 因email是NOT NULL,所以执行第一个UPDATE会报错“1048 - Column 'email' cannot be null”# 在此声明错误处理DECLARE CONTINUE HANDLER FOR 1048 SET @message = 'aaa';SET @a = 1;UPDATE employees SET email = NULL WHERE employee_id = 100;SET @a = 2;UPDATE employees SET email = '123@qq.com' WHERE employee_id = 100;SET @a = 3;
    END $
    DELIMITER;# 调用
    CALL UpdateTest();
    # 查看变量
    SELECT @a, @message; // 3, aaa
    

流程控制

分支结构

  1. IF

    DELIMITER //
    CREATE PROCEDURE testIf()
    BEGINDECLARE score DECIMAL(10,2) DEFAULT 85;IF score >= 90 THEN SELECT 'A';ELSEIF score >= 80 AND score < 90 THEN SELECT 'B';ELSEIF score >= 60 AND score < 80 THEN SELECT 'C';ELSE SELECT 'D';END IF;
    END //
    DELIMITER;CALL testIf();
    
  2. CASE
    CASE ... WHEN ... THEN ... WHEN ... THEN ... ELSE ... END CASE;

    DELIMITER //
    CREATE PROCEDURE testCase()
    BEGINDECLARE n INT DEFAULT 2;CASE nWHEN 1 THEN SELECT 'n = 1';WHEN 2 THEN SELECT 'n = 2';ELSE SELECT 'n = 9';END CASE;
    END //
    DELIMITER;
    

    CASE WHEN ... THEN ... WHEN ... THEN ... ELSE ... END CASE;

    DELIMITER //
    CREATE PROCEDURE testCase()
    BEGINDECLARE n INT default 10;CASEWHEN n > 20 THEN SELECT 'n > 20';WHEN n >= 10 THEN SELECT 'n >= 10';ELSE SELECT 'n < 10';END CASE;
    END //
    DELIMITER;
    

循环结构

  1. LOOP

    DELIMITER //
    CREATE PROCEDURE testLoop()
    BEGINDECLARE n INT DEFAULT 1; # n = 1# 开始循环aaa: LOOPIF n >= 8THEN LEAVE aaa;END IF;SET n = n + 1;END LOOP aaa;SELECT n;
    END //
    DELIMITER;
    
  2. WHILE

    DELIMITER //
    CREATE PROCEDURE testWhile()
    BEGINDECLARE n INT DEFAULT 1;WHILE n < 10DOSET n = n + 1;END WHILE;SELECT n;
    END //
    DELIMITER;
    
  3. REPEAT

    DELIMITER //
    CREATE PROCEDURE testRepeat()
    BEGINDECLARE n INT DEFAULT 1;REPEATSET n = n + 1;UNTIL n > 10END REPEAT;SELECT n;
    END //
    DELIMITER;
    

跳转语句

  1. LEAVE
    ① 同BREAK,格式:LEAVE 循环名;
    ② 使用场景:循环体中、BEGIN...END

    DELIMITER //
    CREATE PROCEDURE testLeave(IN num INT)
    label_test: BEGINIF num = 0 THEN LEAVE label_test;ELSEIF num < 5 THEN SELECT num;ELSE SELECT 'num >= 5';END IF;SELECT 'is end';
    END //
    DELIMITER;
    
  2. ITERATE
    ① 同CONTINUE,格式:ITERATE 循环名;
    ② 使用场景:循环体中

    DELIMITER //
    CREATE PROCEDURE test_iterate()
    BEGINDECLARE num  INT DEFAULT 0;iterate_test: LOOPSET num = num + 1;IF num > 5 THEN LEAVE iterate_test;ELSEIF num > 2 THEN ITERATE iterate_test;ELSE SELECT 'is end';END IF;END LOOP;SELECT num;
    END //
    DELIMITER;
    

游标

随意的定位到某一条记录,可以逐条读取数据。在使用游标过程中,会对数据加锁,不适合高并发场景。

DELIMITER //
CREATE PROCEDURE test_cursor(IN limit_total_salary DECIMAL, OUT total_count INT)
BEGIN# 声明变量DECLARE sum_sal DECIMAL DEFAULT 0.0;DECLARE emp_count INT DEFAULT 0;DECLARE emp_sal DECIMAL;# 声明游标DECLARE cursor_test CURSOR FOR SELECT salary FROM employees ORDER BY salary DESC;# 打开游标OPEN cursor_test;# 使用游标WHILE sum_sal < limit_total_salaryDOFETCH cursor_test INTO emp_sal;SET sum_sal = sum_sal + emp_sal;SET emp_count = emp_count + 1;END WHILE;SET total_count = emp_count;# 关闭游标CLOSE cursor_test;
END //
DELIMITER;
# 调用
CALL test_cursor(100000, @count);
SELECT @count;

相关文章:

SQL中的数据库对象

视图&#xff1a;VIEW 概念 ① 虚拟表&#xff0c;本身不存储数据&#xff0c;可以看做是存储起来的SELECT语句 ② 视图中SELECT语句中涉及到的表&#xff0c;称为基表 ③ 针对视图做DML操作&#xff0c;对影响到基表中的数据&#xff0c;反之亦然 ④ 创建、删除视图本身&#…...

DeepSeek:性能强劲的开源模型

deepseek 全新系列模型 DeepSeek-V3 首个版本上线并同步开源。登录官网 chat.deepseek.com 即可与最新版 V3 模型对话。 性能对齐海外领军闭源模型​ DeepSeek-V3 为自研 MoE 模型&#xff0c;671B 参数&#xff0c;激活 37B&#xff0c;在 14.8T token 上进行了预训练。 论…...

医疗可视化大屏 UI 设计新风向

智能化交互 借助人工智能与机器学习技术&#xff0c;实现更智能的交互功能。如通过语音指令或手势控制来操作大屏&#xff0c;医护人员无需手动输入&#xff0c;可更便捷地获取和处理信息。同时&#xff0c;系统能根据用户的操作习惯和数据分析&#xff0c;自动推荐相关的医疗…...

从企业级 RAG 到 AI Assistant , Elasticsearch AI 搜索技术实践

文章目录 01 AI 搜索落地的挑战02 Elasticsearch 向量性能 5 倍提升03 Elasticsearch 企业版 AI 能力全面解读04 阿里云 Elasticsearch 将准确率提升至 95%05 AI Assistant 集成通义千问大模型实现 AI Ops01 AI 搜索落地的挑战 在过去一年中,基座大模型技术的快速迭代推动了 …...

TypeScript语言的并发编程

TypeScript语言的并发编程 引言 随着现代应用程序的复杂性不断增加&#xff0c;性能和用户体验的重要性显得尤为突出。在这种背景下&#xff0c;并发编程应运而生&#xff0c;成为提升应用程序效率的重要手段。在JavaScript及其超集TypeScript中&#xff0c;尽管语言本身是单…...

benchANT 性能榜单技术解读 Part 1:写入吞吐

近期&#xff0c;国际权威数据库性能测试榜单 benchANT 更新了 Time Series: Devops&#xff08;时序数据库&#xff09;场景排名&#xff0c;KaiwuDB 数据库在 xsmall 和 small 两类规格下的时序数据写入吞吐、查询吞吐、查询延迟、成本效益等多项指标刷新榜单原有数据纪录。在…...

虚拟机防火墙管理

虚拟机防火墙管理 在网络防护方面&#xff0c;PVE提供了相当良好的防火墙管理功能&#xff0c;并且可以适用于节点实体机、客体机、让客体机内不需要另外再安装软体防火墙&#xff0c;对于效能与统一管理大有助益&#xff0c;管理者可以方便一次管理所有的防火墙规则&#xff0…...

Nginx反向代理请求头有下划线_导致丢失问题处理

后端发来消息说前端已经发了但是后端没收到请求。 发现是下划线的都没收到&#xff0c;搜索之后发现nginx默认request的header中包含’_’时&#xff0c;会自动忽略掉。 解决方法是&#xff1a;在nginx里的nginx.conf配置文件中的http部分中添加如下配置&#xff1a; unders…...

【STM32+CubeMX】 新建一个工程(STM32F407)

相关文章&#xff1a; 【HAL库】 STM32CubeMX 教程 1 --- 下载、安装 目录 第一部分、新建工程 第二部分、工程文件解释 第三部分、编译验证工程 友情约定&#xff1a;本系列的前五篇&#xff0c;为了方便新手玩家熟悉CubeMX、Keil的使用&#xff0c;会详细地截图每一步Cu…...

机器人避障不再“智障”:HEIGHT——拥挤复杂环境下机器人导航的新架构

导读&#xff1a; 由于环境中静态障碍物和动态障碍物的约束&#xff0c;机器人在密集且交互复杂的人群中导航&#xff0c;往往面临碰撞与延迟等安全与效率问题。举个简单的例子&#xff0c;商城和车站中的送餐机器人往往在人流量较大时就会停在原地无法运作&#xff0c;因为它不…...

H2数据库在单元测试中的应用

H2数据库特征 用比较简洁的话来介绍h2数据库&#xff0c;就是一款轻量级的内存数据库&#xff0c;支持标准的SQL语法和JDBC API&#xff0c;工业领域中&#xff0c;一般会使用h2来进行单元测试。 这里贴一下h2数据库的主要特征 Very fast database engineOpen sourceWritten…...

部署HugeGraph

部署HugeGraph 这里以hugegraph1.2.0为例子&#xff0c;演示一下如何安装部署hugegraph 一、下载并安装JDK11 下载JDK11 https://www.oracle.com/java/technologies/downloads/#java11 使用scp命令将安装包上传到服务器 scp /path/to/local/file usernameserver_ip:/path/…...

2025年第三届“华数杯”国际赛A题解题思路与代码(Matlab版)

游泳竞技策略优化模型代码详解&#xff08;MATLAB版&#xff09; 第一题&#xff1a;速度优化模型 本部分使用MATLAB实现游泳运动员在不同距离比赛中的速度分配策略优化。 1. 模型概述 模型包含三个主要文件&#xff1a; speed_optimization.m: 核心优化类plot_speeds.m: …...

嵌入式基础 -- IMX8MP的 GPC 模块技术

General Power Controller (GPC) 模块技术文档 1. GPC 模块简介 1.1 模块功能 GPC&#xff08;General Power Controller&#xff09;模块是用于 i.MX8M Plus 应用处理器 的电源管理组件&#xff0c;支持以下功能&#xff1a; 管理 ARM Cortex-A53 和 Cortex-M7 平台的低功…...

选择器css

1.a标签选择 // 选中所具有herf 的元素 [herf] {color: skyblue; } // 选中所具有herfhttps://fanyi.youdao.com/ 的元素 [herf$"youdao.com"] {color:pink; } // 按此顺序书写 link visited hover active // 未访问状态 a:link {color:orange } // 访问状态 a…...

全方位解读消息队列:原理、优势、实例与实践要点

全方位解读消息队列&#xff1a;原理、优势、实例与实践要点 一、消息队列基础认知 在数字化转型浪潮下&#xff0c;分布式系统架构愈发复杂&#xff0c;消息队列成为其中关键一环。不妨把消息队列想象成一个超级“信息驿站”&#xff0c;在古代&#xff0c;各地的信件、物资运…...

JavaScript运算符与控制结构

JavaScript作为一门强大的前端语言&#xff0c;提供了丰富的运算符与控制结构&#xff0c;使程序逻辑更加灵活与高效。 1. JavaScript运算符 算术运算符 运算符描述示例结果加法5 38-减法7 - 43*乘法2 * 612/除法8 / 24%取模&#xff08;余数&#xff09;10 % 31**幂运算3 …...

2030年中国AI人才缺口或达400万,近屿智能助力AI人才储备增长

在当今数字化浪潮下&#xff0c;人工智能&#xff08;AI&#xff09;已成为推动各行业发展的关键力量。然而&#xff0c;吸引和留住 AI 人才正成为全球性难题&#xff0c;中国亦不例外。据麦肯锡 2022 年全球人工智能商业高管调查&#xff0c;75% 的中国受访者在招聘数据科学家…...

如何设计一个注册中心?以Zookeeper为例

这是小卷对分布式系统架构学习的第8篇文章&#xff0c;在写第2篇文章已经讲过服务发现了&#xff0c;现在就从组件工作原理入手&#xff0c;讲讲注册中心 以下是面试题&#xff1a; 某团面试官&#xff1a;你来说说怎么设计一个注册中心&#xff1f; 我&#xff1a;注册中心嘛&…...

ubuntu 20.04 安装docker--小白学习之路

更新包 sudo apt-get update # 安装需要的软件包以使apt能够通过HTTPS使用仓库 sudo apt-get install ca-certificates curl gnupg lsb-release 使用清华大学源 # 添加Docker官方的GPG密钥 curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

图解JavaScript原型:原型链及其分析 | JavaScript图解

​​ 忽略该图的细节&#xff08;如内存地址值没有用二进制&#xff09; 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么&#xff1a;保存在堆中一块区域&#xff0c;同时在栈中有一块区域保存其在堆中的地址&#xff08;也就是我们通常说的该变量指向谁&…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...

Tauri2学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多&#xff0c;我按照Tauri1的教程来学习&…...