MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】

前言

        做数仓开发离不开 SQL ,写了很多 HQL 回头再看 MySQL 才发现,很多东西并不是 HQL 所独创的,而是几乎都来自于关系型数据库通用的 SQL;想到以后需要每天和数仓打交道,那么不管是 MySQL 还是 Oracle ,都需要深入了解一下,不能只停留在之前的 CRUD 上了。

1、MySQL 函数

1.1、GROUP_CONCAT 聚合函数

1.1.1、语法

GROUP_CONCAT([DISTINCT] 字段名* [ORDER BY DESC|ASC] [SEPARATOR] )

 1.1.2、使用案例

把不同部门的员工合并到一行,按照 id 进行升序排序,并用 '-' 分割开来:

SELECT department,GROUP_CONCAT(DISTINCT emp_id,emp_name ORDER BY emp_id SEPARATOR '-') AS id_with_name
FROM emp
GROUP BY department;

运行结果:

1.2、数学函数

简单的函数没有必要啰嗦,这里只介绍一些常用的:

  • ABS:绝对值
  • CEIL:向上取整
  • FLOOR:向下取整
  • RAND:0~1随机数
  • ROUND(x):四舍五入取整
  • ROUND(x,y):四舍五入保留 y 位小数
  • TRUNCATE(x,y):不四舍五入保留 y 位小数

1.3、字符串函数

1.4、日期函数

1.5、if 函数

MySQL 的 IF 函数和 HQL 是一样的,这里不做介绍。

1.6、窗口函数

        窗口函数一般都是配合聚合函数使用的,毕竟使用窗口就是为了把一类时间或者其它属性有关系的数据联系在一起。这里同样只介绍一些我没用过的函数:

1.6.1、CUME_DIST

用途:分组内小于、等于当前rank值的行数 / 分组内总行数

公式:rank / rows

场景:查询小于等于当前行某个值的记录占总记录的比例

解释:其实就是用 rank 函数的结果 / 记录总数

-- 该员工的薪资超过了相同部门多少人
SELECT emp_id,
       emp_name,
       department,
       salary,
       ROUND(CUME_DIST() OVER (PARTITION BY department ORDER BY salary),2) AS rate
FROM emp;

1.6.2、FIRST_VALUE 和 LAST_VALUE

用途:分组内的第一条/最后一条记录的某个字段的值

应用场景:截止目前按照xx排序后的第一名/最后一名的值

注意:它是对每一条记录都进行一次计算(相当于 rows between unbounded preceding and current row),而不是全局进行计算(它不会把该行之后考虑进计算范围)

-- 查询出同部门内工资最低和最高的人的薪资
SELECT emp_name,
       salary,
       FIRST_VALUE(salary) OVER (PARTITION BY department ORDER BY salary) AS first,
       LAST_VALUE(salary) OVER (PARTITION BY department ORDER BY salary) AS last
FROM emp;

1.6.3、NTH_VALUE

用途:返回窗口内地 exper 个值。(expr 可以是表达式,也可以是数字)

SELECT emp_name,
       department,
       salary,
       NTH_VALUE(salary,2) over (PARTITION BY department ORDER BY salary) AS second
FROM emp;

1.6.4、NTILE

用途:将分区中的有序数据分为n个等级,记录等级数(等级规则取决于是否分区和排序字段)

应用场景:将员工按照薪资进行划分等级

SELECT emp_name,
       department,
       salary,
       NTILE(3) over (ORDER BY salary) AS grade
FROM emp;

2、视图

2.1、视图的概念

介绍

  • 视图(view)是一个虚拟表,非真实存在,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用视图名称即可获取结果集,并可以将其当作表来使用。
  • 数据库中只存放了视图的定义,而并没有存放视图中的数据。
  • 这些数据存放在原来的表中。 使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据是依赖于原来的表中的数据的。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。

作用

  • 简化代码,可以把重复使用的查询封装成视图重复使用,同时可以使复杂的查询易于理解和使用。
  • 安全原因,如果一张表中有很多数据,很多信息不希望让所有人看到,此时可以使用视图视,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,可以对不同的用户,设定不同的视图。

2.2、创建视图

这里只介绍常用的创建方法:

语法

CREATE [OR REPLACE]
VIEW 视图名称
AS SELECT语句

案例

CREATE OR REPLACE
VIEW salary_grade
AS SELECT *, NTILE(3) over (ORDER BY salary) AS grade FROM emp;

2.3、查看所有表和视图

SHOW FULL TABLES;

2.4、修改视图

-- 1.通过alter修改视图
ALTER VIEW 视图名 AS SELECT语句;
-- 2.通过 create or replace 覆盖视图
CREATE OR REPLACE
VIEW 视图名
AS SELECT语句;

某些视图是可更新的,比如基表。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。如果视图包含下述结构中的任何一种,那么它就是不可更新的:

  • 聚合函数(SUM(), MIN(), MAX(), COUNT()等)
  • DISTINCT
  • GROUP BY
  • HAVING
  • UNION或UNION ALL
  • 位于选择列表中的子查询
  • JOIN
  • FROM子句中的不可更新视图
  • WHERE子句中的子查询,引用FROM子句中的表。
  • 仅引用文字值(在该情况下,没有要更新的基本表)

注意:视图中虽然可以更新数据,也就是说,可以在UPDATE、DELETE或INSERT等语句中使用它们,以更新基表的内容。但是有很多的限制。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,就可能会造成数据更新失败。

-- 往视图中插入数据
INSERT INTO emp_order_by_salary(emp_id, emp_name, salary, department) VALUES (1001,'谢永强',3500,'人事部');
-- 修改视图数据
UPDATE emp_order_by_salary SET emp_name='狄仁杰' WHERE emp_id=1001;
-- 删除视图数据
DELETE FROM emp_order_by_salary WHERE emp_id=1001;

注意:

  • 视图永远只是一个虚拟表,不存储数据,修改视图就是修改基表!

3、存储过程

3.1、存储过程介绍

什么是存储过程

  • MySQL 5.0 版本开始支持存储过程。
  • 简单的说,存储过程就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;
  • 存储过就是数据库 SQL 语言层面的代码封装与重用。

特性

  • 有输入输出参数,可以声明变量,有if/else, case,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能;
  • 函数的普遍特性:模块化,封装,代码复用;
  • 速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤;

其实也就是把可以实现某一功能的一堆 SQL 封装起来,等到需要用的时候直接调用即可,大大提高了SQL 的复用。

3.2、入门案例

为了区分普通的 SQL ,我们需要自定义 SQL 的结束符。下面我们看看存储过程的基本语法:

delimiter 自定义结束符号
create procedure 储存名([ in ,out ,inout ] 参数名 数据类形...)
begin
  sql语句
end 自定义的结束符号
delimiter ; -- 恢复为原本的结束符 ';'

自定义存储过程:

-- 自定义存储过程
DELIMITER $$
CREATE PROCEDURE func01()
BEGIN
    SELECT * FROM emp;
END $$
DELIMITER ;

-- 调用存储过程
call func01();

3.3、存储过程的使用

3.3.1、局部变量的定义

  • 局部变量是用户自定义,在 begin/end 快中有效
1)使用 declare 声明局部变量
declare 变量名 变量类型 [default 默认值]

测试: 

DELIMITER $$
CREATE PROCEDURE func2()
BEGIN
    declare tmp int default 1;
    set tmp = 2;
    SELECT tmp;
end $$
DELIMITER ;

call func2();    -- 2
2)使用 select into 语句

注意:select into 只能给变量赋值,变量依然需要使用 declare 声明!

语法

-- 把查询结果赋值给变量
SELECT col1, col2 into var1, var2 from table where condition;

注意:返回结果只能是单行结果!

测试:

DELIMITER $$
CREATE PROCEDURE func03()
BEGIN
    declare eid int;
    declare ename varchar(20);
    declare esalary double;
    declare dname varchar(20);
    SELECT emp_id, emp_name, salary, department
    INTO eid,ename,esalary,dname
    FROM emp WHERE emp_id=1;
    SELECT eid,ename,esalary,dname;
END $$
DELIMITER ;

call func03();

注意:局部变量名不能和表字段相同,否则查询为 null (字段类型可以不同)。

3.3.2、用户变量的定义

语法

@@变量名

注意

  • 不需要像局部变量一样提前声明!(要声明也可以 直接 set @变量名 = xxx)
  • 生命周期是当前会话
DELIMITER $$
CREATE PROCEDURE func04()
BEGIN
    SET @result = 1;
end $$
delimiter ;

call func04();

SELECT @result; -- 必须调用之后才能被初始化赋值 否则为null

3.3.3、系统变量

  • 系统变量又分为全局变量会话变量
  • 全局变量在 MYSQL 启动的时候由服务器自动将它们初始化为默认值,这些默认值可以通过更改my.ini这个文件来更改。
  • 会话变量在每次建立一个新的连接的时候,由MYSQL来初始化。MYSQL会将当前所有全局变量的值复制一份。来做为会话变量。
  • 也就是说,如果在建立会话以后,没有手动更改过会话变量与全局变量的值,那所有这些变量的值都是一样的。
  • 全局变量与会话变量的区别就在于,对全局变量的修改会影响到整个服务器,但是对会话变量的修改,只会影响到当前的会话(也就是当前的数据库连接)。
  • 有些系统变量的值是可以利用语句来动态进行更改的,但是有些系统变量的值却是只读的,对于那些可以更改的系统变量,我们可以利用set语句进行更改。
1. 全局变量

注意:全局变量由系统提供,整个数据库有效。

语法

@@global.变量名

查看全局变量:

show global variables ;

查看某个全局变量的值:

SELECT @@global.binlog_format;

设置全局变量(两种方式):

set global sort_buffer_size = 40000;
set @@global.sort_buffer_size = 40000;
2. 会话变量

语法:

@@session.变量名

查看会话变量:

show session variables;

查看某个会话变量的值:

SELECT @@session.auto_increment_increment;

修改会话变变量的值(两种方法):

set session sort_buffer_size = 50000;
set @@session.sort_buffer_size = 50000;

3.3.4、存储过程传参 in

in 表示传入的参数, 可以传入数值或者变量,即使传入变量,并不会更改变量的值,可以内部更改,仅仅作用在函数范围内。

-- in 传参
delimiter $$
create procedure func05(in id int)
begin
    select * from emp where emp.emp_id = id;
end $$
delimiter ;

call func05(1); -- 查询 emp_id = 1 的员工信息

3.3.5、存储过程传参 out

out 表示从存储过程内部传值给调用者(内部值指的是用户变量),用户变量作用于整个会话,所以调用这个方法时,用户变量就会被初始化并赋值。

delimiter $$
create procedure func06(in id int,out ename varchar(20))
begin
    select emp_name into ename from emp where emp_id=id;
end $$
delimiter;

call func06(1,@ename); -- 这里的@name是用户变量所以并不需要声明

select @ename; -- 张晶晶

3.3.6、存储过程传参 inout

inout 表示从外部传入的参数经过修改后可以返回的变量,既可以使用传入变量的值也可以修改变量的值(即使函数执行完)。

说人话就是:这个参数既可以当做普通参数用,也可以当做用户变量对它进行赋值

delimiter $$
create procedure func07(inout id int,inout name varchar(20))
begin
    update emp set emp_name = name where emp_id = id;
end $$
delimiter ;

set @name = '李大喜';
set @id = 1;
call func07(@id,@name);

select * from emp where emp_id = 1; -- 张晶晶变成了李大喜

3.3.7、存储过程传参总结

  • in 输入参数,意思说你的参数要传到存过过程的过程里面去,在存储过程中修改该参数的值不能被返回
  • out 输出参数:该值可在存储过程内部被改变,并向外输出
  • inout 输入输出参数,既能输入一个值又能传出来一个值

3.3.8、存储过程流程控制 - if 语句

DELIMITER $$
CREATE PROCEDURE func08(in id int)
begin
    declare num int default 0;
    declare result varchar(50);
    select count(*) into num from emp;
    if id < 1 || id > num
        then set result = '超出范围';
    else
        set result = (select emp_name from emp where emp_id = id);
    end if;
    select result;
end $$
delimiter ;

call func08(1);

3.3.9、存储过程控制流程 - case 语句

需要注意的是 case 语句有两种语法:一种是匹配变量是否等于某个值,一种是匹配变量是否符合某种条件。

匹配条件

DELIMITER $$
CREATE PROCEDURE func09(in salary int)
BEGIN
    DECLARE grade VARCHAR(3);
    CASE
        WHEN salary > 5000 THEN SET grade = '高';
        WHEN salary > 3000 THEN SET grade = '中';
        ELSE SET grade = '低';
    END CASE;
    SELECT grade;
END $$
DELIMITER ;

CALL func09(8000); -- 高

匹配值: 

delimiter $$
create procedure func10(in grade varchar(1))
begin
    declare result varchar(20);
    case grade
        when 'A' then set result = '90~100';
        when 'B' then set result = '80~90';
        when 'C' then set result = '70~80';
        when 'D' then set result = '60~70';
        when 'E' then set result = '0~60';
        else set result = '参数错误';
    end case;
    select result;
end $$
delimiter ;

call func10('B');

3.3.10、循环语句和循环控制

先介绍循环控制:

  • leave:类似于 break
  • iterate:类似于 continue
1. while 循环

语法

[标签]: while 循环条件 do
    循环体
end while [标签];

测试:

delimiter $$
create procedure func11()
begin
    declare i int default 0;
    declare num int default (select count(*) from emp);
    while i<num do
        select i;
        set i = i+1;
    end while;
end $$
delimiter ;

call func11();

测试结果就是会创建 num 张表,表内就是 i 的值。

2. repeat 循环

语法

[标签:] repeat
    循环体;
until 条件表达式
end repeat 标签;

测试:

delimiter $$
create procedure func12()
begin
    declare i int default 0;
    label: repeat
        set i = i+1;
        until i > 10
    end repeat label;
    select '循环结束';
end $$
delimiter ;

call func12();
3. loop 循环

语法

[标签:] loop
    循环体
    if 条件表达式 then
        leave 标签;
    endif;
end loop;

测试:

delimiter $$
create procedure func13()
begin
    declare i int default 0;
    label: loop
        if i!=5 then
            set i = i+1;
        else leave label;
        end if;
    end loop;
end $$
delimiter ;

call func13();

3.3.11、存储过程之游标(Cursor)

        游标(cursor)是用来存储查询结果集的数据类型 , 在存储过程和函数中可以使用光标对结果集进行循环的处理。光标的使用包括光标的声明、OPEN、FETCH 和 CLOSE.

语法

-- 声明语法
declare cursor_name cursor for select_statement
-- 打开语法
open cursor_name
-- 取值语法
fetch cursor_name into var_name [, var_name] ...
-- 关闭语法
close cursor_name

测试:

-- 游标
delimiter $$
create procedure func14(in id int)
begin
    -- 声明局部变量
    declare eid int;
    declare ename char(20);
    declare esalary decimal(10,2);

    -- 声明游标
    declare my_cursor cursor for
        select emp_id,emp_name,salary
            from emp
            where emp_id=id;

    -- 打开游标
    open my_cursor;

    -- 通过游标获取每一行
    label: loop
        fetch my_cursor into eid,ename,esalary;
        select eid,ename,esalary;
        leave label;
    end loop;

    -- 关闭游标
    close my_cursor;
end $$
delimiter ;

drop procedure func14;


call func14(1);

注意循环体中必须有退出的条件,否则就是死循环!

3.3.12、句柄 handler

4、存储函数(自定义函数)

注意:自定义函数之前必须设置全局变量:

-- 信任函数的创建者
set global log_bin_trust_function_creators=TRUE;
-- 信任函数的创建者
set global log_bin_trust_function_creators=TRUE;

delimiter $$
create function oneToNum(n int) returns int
begin
    declare sum int default 0;
    while n!=0 do
        set sum = sum + n;
        set n = n-1;
    end while;
    return sum;
end $$
delimiter ;

select oneToNum(3); --6

注意:自定义函数不能包含递归,递归需要使用专门的语法。

5、触发器

5.1、介绍

  • 触发器,就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段,但是触发器无需调用,当对数据库表中的数据执行DML操作时自动触发这个SQL片段的执行,无需手动条用。
  • 在MySQL中,只有执行insert,delete,update操作时才能触发触发器的执行
  • 触发器的这种特性可以协助应用在数据库端确保数据的完整性 , 日志记录 , 数据校验等操作 。
  • 使用别名 OLD 和 NEW 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。

5.2、触发器的特性

  • 什么条件会触发:I、D、U
  • 什么时候触发:在增删改前或者后
  • 触发频率:针对每一行执行
  • 触发器定义在表上,附着在表上

5.3、触发器语法

5.3.1、创建只有一个执行语句方触发器

注意:这里的触发事件只能是 insert、update、delete。

create trigger 触发器名 before|after 触发事件
on 表名 for each row 
执行语句;

5.3.2、创建有多个执行语句的触发器

create trigger 触发器名 before|after  触发事件 
on 表名 for each row
begin
     执行语句列表
end;

5.4、触发器的使用

5.4.1.创建触发器

-- 触发器
drop trigger if exists trigger_emp;

-- 创建受触发器影响的表格
create table emp_log(
    id int primary key auto_increment,
    time timestamp,
    log_text varchar(255)
);

-- 创建触发器
create trigger trigger_emp
after insert on emp
for each row
insert into emp_log values (NULL,now(),'新的员工注册');

insert into emp values (NULL,'刘海柱',8999,'技术部');

当向 emp 表进行 insert 操作时,就会触发触发器向 emp_log 插入一条日志。

5.4.2、NEW 和 OLD

MySQL 中定义了 NEW 和 OLD,用来表示触发器的所在表中,触发了触发器的那一行数据,来引用触发器中发生变化的记录内容,具体地:

        这让我很自然的联想到了 MySQL 的 binlog 功能,我们数仓中使用 MaxWell 来监听 binlog 实现数据同步,但是 binlog 的底层并不是触发器。

语法

NEW.列名
OLD.列名

测试:

-- 不要影响到其它触发器对 emp_log 的操作,比如这里增加了两个字段,
-- 当对该表进行insert 操作时,因为给 emp_log 增加字段之后没有更新触发器的行为
-- 就会导致给 emp 和 emp_log 插入数据是全部失败

alter table emp_log add old varchar(50);
alter table emp_log add new varchar(50);

create trigger trigger_test
after update
on emp for each row
insert into emp_log values (
                            null,now(),
                            concat('更新数据'),
                            concat(OLD.emp_id,OLD.emp_name,OLD.salary,OLD.department),
                            concat(NEW.emp_id,NEW.emp_name,NEW.salary,NEW.department)
);
update emp set emp_name = '李元芳' where emp_id = 3;

select * from emp_log;

5.5、触发器使用的注意事项

  • MYSQL中触发器中不能对本表进行 insert ,update ,delete 操作,以免递归循环触发
  • 尽量少使用触发器,假设触发器触发每次执行1s,insert table 500条数据,那么就需要触发500次触发器,光是触发器执行的时间就花费了500s,而insert 500条数据一共是1s,那么这个insert的效率就非常低了。
  • 触发器是针对每一行的;对增删改非常频繁的表上切记不要使用触发器,因为它会非常消耗资源。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MS5173M-16bit、单通道、200kSPS、 SAR 型 ADC

MS5173M 是单通道、 16bit 、电荷再分配逐次 逼近型模数转换器&#xff0c;采用单电源供电。 MS5173M 包含一个低功耗、高速数据采样且 无失码的真 16 位 SAR ADC 和一个内部转换时钟。 MS5173M 使用通用的串口接口实现转换结果 的接收&#xff0c;还包含低噪声、宽…

AI助力内容创作:让效率与质量齐飞

简述&#xff1a; 本文介绍了AI如何帮助创作者在保持内容质量的同时&#xff0c;大幅度提升生产效率的一些方法&#xff0c;希想 对大家有帮助。 一、自动化内容生成 1. 文本内容生成 使用GPT等模型&#xff1a;利用如GPT-3或GPT-4等大型语言模型&#xff0c;可以直接输入关…

好烦啊,我真的不想写增删改查了!

大家好&#xff0c;我是程序员鱼皮。 很想吐槽&#xff1a;我真的不想写增删改查这种重复代码了&#xff01; 大学刚做项目的时候&#xff0c;就在写增删改查&#xff0c;万万没想到 7 年后&#xff0c;还在和增删改查打交道。因为增删改查是任何项目的基础功能&#xff0c;每…

创新指南 | 企业AI战略 实施方案探讨(上):如何构建基于AI的新商业模型和业务场景

2023年以ChatGPT为代表的生成式AI推出以来&#xff0c;从投资界到企业界都掀起了一股热潮。那么从企业角度来看&#xff0c;生成式AI到底能为业务带来哪些增量呢&#xff1f;企业如何构建基于AI的商业模式并进行落地实施呢&#xff1f; 企业AI战略 实施方案探讨分为上下两篇&am…

内网安全工具之ADExplorer的使用

ADExplorer是域内一款信息查询工具&#xff0c;它是独立的可执行文件&#xff0c;无需安装。它能够列出域组织架构、用户账号、计算机账号登&#xff0c;可以帮助寻找特权用户和数据库服务器等敏感目标。 下载地址&#xff1a;http://live.sysinternals.com/ 连接 下载了ADE…

Java项目:基于ssm框架实现的实验室耗材管理系统(B/S架构+源码+数据库+毕业论文+答辩PPT)

一、项目简介 本项目是一套基于ssm框架实现的实验室耗材管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 二、技术实现 jdk版本&#xff1a;1.8 …

vue+ts+vite+pinia+less+echarts 前端可视化 实战项目

1.初始化前端 输入 npm init vuelatest 命令 然后 选择需要的插件2.构建完成后 在终端切换到vue-project文件夹下 npm install 下载依赖 3.下载 less样式 npm install less less-loader -D 4.下载axios npm install axios 5.下载echarts npm install echarts -S 6.引入中国…

【Spring security】Note01-pig登录验证过程

&#x1f338;&#x1f338; pig 登录验证 &#x1f338;&#x1f338; 一、大概执行顺序&#xff0c;便于理解 pig spring-security 二、执行过程分析 请求拦截&#xff1a; 当客户端发送请求时&#xff0c;Spring Security 的过滤器链会首先拦截该请求。过滤器链中的每个…

Python-元组

元组()&#xff1a; 1、不可变序列&#xff0c;不能增加、修改、删除元组中的元素&#xff0c;但是是序列&#xff0c;可以有序列的相关操作 ttuple([10,20,30]) print("10在元组中是否存在&#xff1a;",(10 in t)) print("最大值:",max(t)) print(&quo…

熬了快两个月,终于拿到了淘天后端offer!

今年的暑期实习挺难找的&#xff0c;很多同学忙了几个月到现在还没有一个offer&#xff0c;真的很常见&#xff01;没找到暑期实习的同学千万不要太焦虑&#xff0c;可以留意留意日常实习&#xff0c;日常实习也找不到&#xff0c;那就去完善自己的项目经历&#xff0c;认真准备…

【上海大学计算机组成原理实验报告】五、机器语言程序实验

一、实验目的 理解计算机执行程序的实际过程。 学习编制机器语言简单程序的方法。 二、实验原理 根据实验指导书的相关内容&#xff0c;指令的形式化表示是指采用一种规范化的符号系统&#xff0c;以更清晰、精确地描述和表示指令的逻辑功能和操作步骤。 汇编是一种编程语言…

最新版rancher环境配置安装和集群搭建详细教程记录

&#x1f680; 作者 &#xff1a;“二当家-小D” &#x1f680; 博主简介&#xff1a;⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人&#xff0c;8年开发架构经验&#xff0c;精通java,擅长分布式高并发架构,自动化压力测试&#xff0c;微服务容器化k…

基础之音视频2

01 前言 02 mp 03 mp实例 简易音乐播放器 04 音频 sound-pool 1.作用 播放多个音频&#xff0c;短促音频 2.过程 加载load- 3.示例 模拟手机选铃声 步骤&#xff1a; 创建SoundPool对象&#xff0c;设置相关属性 音频流存入hashmap 播放音频 05 videoview 3gp 体积小 mp4 …

Redis简单使用

认识Redis redis&#xff1a;字典型数据库&#xff0c;存储的是键值对&#xff0c;是NoSql数据库 关系型数据库和NoSql之间的区别&#xff1a; 结构化&#xff1a;NoSql非结构化数据库&#xff0c;松散结构&#xff08;键值对key-value&#xff08;可以任意类型&#xff09;&…

计算机Java项目|Springboot高校心理教育辅导设计与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、Python项目、前端项目、人工智能与大数据、简…

计算机寄存器是如何实现的

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

##22 深入理解Transformer模型

文章目录 前言1. Transformer模型概述1.1 关键特性 2. Transformer 架构详解2.1 编码器和解码器结构2.1.1 多头自注意力机制2.1.2 前馈神经网络 2.2 自注意力2.3 位置编码 3. 在PyTorch中实现Transformer3.1 准备环境3.2 构建模型3.3 训练模型 4. 总结与展望 前言 在当今深度学…

MySQL基础指南:从入门到精通

MySQL基础指南&#xff1a;从入门到精通 MySQL是一个流行的开源关系型数据库管理系统&#xff0c;被广泛用于Web应用程序和服务器端开发。本文将从MySQL的基本概念开始&#xff0c;逐步介绍MySQL的安装、常用操作、数据类型、查询语句等内容&#xff0c;帮助你快速入门MySQL数…

Java码农的福音:再也不怕乱码了

即便是Java这样成熟的语言&#xff0c;开发者们也常常会遇到一个恼人的问题——乱码。 本文将深入探讨乱码的根本原因&#xff0c;并针对Java开发中的乱码场景提出有效的解决方案&#xff0c;辅以实战代码&#xff0c;让Java程序员从此告别乱码困扰。 一&#xff0c;字符集的…

网络安全 会飞的狗狗 网络安全狗是什么

1.概述 网站安全狗是一款集网站内容安全防护、网站资源保护及网站流量保护功能为一体的服务器工具。功能涵盖了网马/木马扫描、防SQL注入、防盗链、防CC攻击、网站流量实时监控、网站CPU监控、下载线程保护、IP黑白名单管理、网页防篡改功能等模块。能够为用户提供实时的网站安…