SQL语句 (MySQL)

登录操作

  • 参数 -u:user 用户
  • 参数 -p:password 密码
mysql -u Jack -p
  • 退出登录
exit;

控制与管理

展示用户列表

select user, host from mysql.user;

创建用户

  • UserName :填新用户的名称
  • HostName :允许该用户用什么主机登录数据库,填写 localhost127.0.0.1 就只能本地登录,一般填写其他的 IP 地址,或者填写 % 表示所有的主机
  • UserPassword:设置新用户的登录密码
create user 'UserName'@'HostName' identified by 'UserPassword';

删除用户

drop user 'UserName'@'HostName';

修改用户

  • 修改用户密码
alter user 'UserName'@'HostName' identified by 'NewPassword';
  • 修改用户的名称和主机名
rename user 'Old_UserName'@'Old_HostName' to 'New_UserName'@'New_HostName';

查看用户权限

show grants for 'UserName'@'HostName';

授予权限

  • 授予所有权限
grant all privileges on *.* to 'UserName'@'HostName';
  • 授予特定数据库的所有权限
grant all privileges on `数据库的名称`.* to 'UserName'@'HostName';
  • 授予特定数据库的某些权限
grant select, insert, update, delete on `数据库的名称`.* to 'UserName'@'HostName';
  • 授予特定表的某些权限
grant select on `数据库的名称`.`表的名称` to 'UserName'@'HostName';
  • 授予列级权限
grant update(`列的名称`) on `数据库的名称`.`表的名称` to 'UserName'@'HostName';
  • 授予创建和删除数据库的权限
grant create, drop on *.* to 'UserName'@'HostName';
  • 授予创建和删除用户的权限(通常只授予管理员)
grant create user, drop user on *.* 'UserName'@'HostName';
  • 授予远程登录权限(对于非本地主机)
grant usage on *.* to 'UserName'@'HostName' identified by 'password';

收回权限

  • 收回所有权限
revoke all privileges on *.* from 'UserName'@'HostName';
  • 收回特定数据库的所有权限
revoke all privileges on `数据库的名称`.* from 'UserName'@'HostName';
  • 收回特定表的权限
revoke delete on `数据库的名称`.`表的名称` from 'UserName'@'HostName';
revoke all privileges on `数据库的名称`.`表的名称` from 'UserName'@'HostName';
  • 收回创建数据库的权限
revoke create on *.* from 'UserName'@'HostName';
  • 收回创建表的权限
revoke create table on `数据库的名称`.* from 'UserName'@'HostName';
  • 收回更新、插入、删除、查询数据的权限
revoke update, insert, delete, select on `数据库的名称`.`表的名称` from 'UserName'@'HostName';

刷新权限

flush privileges;

数据库操作

展示数据库

  • 展示所有的数据库
show databases;

创建数据库

create database `数据库的名称`;
create database if not exists `数据库的名称`;
create database if not exists `数据库的名称` default charset `utf8` collate `utf8_general_ci`;

删除数据库

drop database `数据库的名称`;
drop database if exists `数据库的名称`;

使用数据库

use `数据库的名称`;

更改数据库名称的流程

-- 创建新数据库
create database `新数据库的名称`;-- 将旧数据库的表复制到新数据库中
-- 假设我们有一个名为 abc 的表
create table `新数据库的名称`.`abc` like `旧数据库的名称`.`abc`;
insert into `新数据库的名称`.`abc` select * from `旧数据库的名称`.`abc`;-- 删除旧数据库
drop database `旧数据库的名称`;

数据类型

数值类

数据类型范围(有符号)范围(无符号)用途
tinyint-128 到 1270 到 255小整数值
smallint-32768 到 327670 到 65535较小的整数值
mediumint-8388608 到 83886070 到 16777215中等大小的整数值
int (integer)-2147483648 到 21474836470 到 4294967295标准整数值
bigint-2^63 到 2^63-10 到 2^64-1大整数值
float-3.402823466E+38 到 -1.175494351E-380 到 3.402823466E+38单精度浮点数值
double-1.7976931348623157E+308 到 -2.2250738585072014E-3080 到 1.7976931348623157E+308双精度浮点数值
decimal (numeric)依赖于定义的位数依赖于定义的位数精确的小数值

时间日期类

数据类型范围格式用途
date‘1000-01-01’ 到 ‘9999-12-31’YYYY-MM-DD日期值
time‘-838:59:59’ 到 ‘838:59:59’HH:MM:SS时间值或持续时间
datetime‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’YYYY-MM-DD HH:MM:SS混合日期和时间值
timestamp‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-19 03:14:07’ UTCYYYY-MM-DD HH:MM:SS时间戳
year1901 到 2155YYYY年份值

字符串类

数据类型最大长度用途
char255 字符固定长度的字符串
varchar65535 字符可变长度的字符串
tinytext255 字符短文本字符串
text65,535 字符长文本数据
mediumtext16,777,215 字符中等长度的文本数据
longtext4,294,967,295 字符极长文本数据

二进制数据类

数据类型最大长度用途
binary255 字节固定长度的二进制数据
varbinary65,535 字节可变长度的二进制数据
tinyblob255 字节小型二进制对象
blob65,535 字节二进制大对象
mediumblob16,777,215 字节中型二进制大对象
longblob4,294,967,295 字节大型二进制大对象

其他特殊类型

数据类型用途
bit单个二进制位值
enum枚举,一个最多包含 65,535 个不同值的列表
set集合,一个最多包含 64 个不同值的集合

表操作

展示表

  • 展示所有的表
show tables;
  • 查找以 user 开头的表
show tables like 'user%';
  • 检查表结构
desc `数据库的名称`.`表的名称`;

创建表

create table `表的名称` (`id` int,`name` varchar
);
create table `表的名称` (`id` int auto_increment primary key,`name` varchar(3) null
);
create table `数据库的名称`.`表的名称` (`id` int auto_increment,			-- 设置为自增`sid` int,`cid` int not null unique,			-- 设置为非空且唯一`name` varchar(20) null,			-- 设置为空`gender` char(1) default 'M',		-- 设置默认为字符Mprimary key (`id`, `sid`),			-- 设置主键constraint `给外键起名` foreign key (`cid`) references `数据库的名称`.`表的名称` (`字段的名称`)
);

删除表

drop table `表的名称`;
drop table if exists `表的名称`;

修改表

重命名表

rename table `旧的表名` to `新的表名`;

更新表结构

  • 添加列
alter table `表的名称` 
add `列的名称` `数据类型;`
  • 删除列
alter table `表的名称`
drop column `列的名称`;
  • 修改列
alter table `表的名称`
modify column `列的名称` `数据类型`;
  • 修改列名
alter table `表的名称`
change `旧的列名` `新的列名` `数据类型`;
  • 添加主键
alter table `表的名称`
add primary key (`列的名称`);
  • 删除主键
alter table `表的名称`
drop primary key;
  • 添加索引
create index `索引名称`
on `表的名称` (`1`, `2`, ...);
  • 删除索引
drop index `索引名称` on `表的名称`;
  • 添加外键
alter table `表的名称`
add constraint `设置外键名称`
foreign key (`列的名称`) references `某数据库`.`某表` (`列的名称`);
  • 删除外键
alter table `表的名称`
drop foreign key `外键的名称`;
  • 更新表的字符集和排序规则
alter table `表的名称`
convert to character set utf8mb4 collate utf8mb4_unicode_ci;

清空表数据

truncate table `表的名称`;

复制表结构

create table `新表的名称` like `旧表的名称`;

复制表数据和结构

create table `新表的名称` as
select * from `旧表的名称`;

数据操作

插入数据

  • 插入单行数据
insert into `表的名称` (`列名1`, `列名2`, ...)
values ('值1', '值2', ...);
  • 插入多行数据
insert into `表的名称` (`列名1`, `列名2`, ...)
values ('值a1', '值a2', ...),('值b1', '值b2', ...),('值c1', '值c2', ...);
  • 如果提供了所有列的值,则可以省略列名
insert into `表的名称`
values ('值1', '值2', ...);

更新数据

update `表的名称`
set `列的名称` = '值1',`列的名称` = '值2',...
where 条件;

删除数据

  • 删除某一行
delete from `表的名称`
where 条件;
  • 删除所有数据(可以回滚)
delete from `表的名称`;
  • 清空表(删除速度更快,但不记录删除操作,无法回滚)
truncate table `表的名称`;

数据查询

基本查询

  • 普通查询,select 后面跟着你想要查询的列名
select `name`, `age`, `gender` from `UserTable`;
  • 可以使用 * 来代表所有的列
select * from `UserTable`;
  • distinct 关键字用于去除查询结果中的重复行
select distinct `name` from `UserTable`;

条件查询

  • where 子句用于指定查询条件
select * from `UserTable` where `name` = 'Tom';
  • andor 用于在 where 子句中组合多个条件
select * from `UserTable` where `name` = 'Tom' and `age` > 18;
  • 一般的比较运算符,包括 =、>、<、>=、<=、!= 等
  • 是否在集合中:in、not in
  • 字符模糊匹配:like,not like
  • 多重条件连接查询:and、or、not

排序查询

  • order by 子句用于对查询结果进行排序
select * from `UserTable` order by `age`;
  • asc 为升序排序,desc 为降序排序
select * from `UserTable` order by `age` desc;

聚合函数

  • 聚合函数用于对一列数据进行计算,count/sum/avg/min/max(...)
select count(*) from `UserTable`;
  • distinct 表示去重再统计
select sum(distinct `age`) from `UserTable`;

分组查询

  • group by 子句通常与聚合函数一起使用,用于对结果进行分组
select `name` , count(`*`) from `UserTable` group up `gender`;
  • having 子句用于对分组后的结果进行进一步的条件过滤
select `name`, count(`*`)
from `UserTable` group up `gender` having count(`*`) > 6;

分页查询

  • 可以通过 limit 来限制查询的数量,只取前n个结果
select * from `表的名称` limit 数量
select * from `表的名称` limit 起始位置, 数量

连接查询

  • join...on 用于将行从两个或多个表基于某个相关列合并起来
select UserTable.name ClassTable.name
from UserTable join ClassTable
on UserTable.id = ClassTable.id;
/* SQL解释从 UserTable 和 ClassTable 两个表中选取数据只选择那些在 UserTable 和 ClassTable 中具有相同 id 值的行对于每一行匹配的记录,它将返回 UserTable 中的 name 和 ClassTable 中的 id
*/
  • 内连接:inner join
  • 左连接:left join
  • 右连接:right join
  • 全连接:full join
select UserTable.name ClassTable.name
from UserTable left join ClassTable
on UserTable.id = ClassTable.id;
/* SQL解释从 UserTable 表中选取所有行对于 UserTable 中的每一行,尝试在 ClassTable 中找到具有相同 id 值的行如果找到匹配的行,则返回 UserTable 的 name 和 ClassTabl e的 name如果没有找到匹配的行,则仍然返回 UserTable 的 name,但 ClassTable 的 name 将为NULL
*/

子查询

子查询是嵌套在 selectinsertupdatedelete 语句中的查询

  • UserTable表中选择所有列的数据,但只选择那些其 id 值与 ClassTable 表中性别为男性的行相对应的记录
select * from `UserTable`
where `id` in (select `id` from `ClassTable`where `gender` = 'M'
);
/*首先,子查询从 ClassTable 表中找出所有性别为男性的记录的 id然后,外层查询使用这些 id 值来过滤 UserTable 表,只选择那些 id 存在于子查询结果集中的记录最终,返回的是 UserTable 表中所有 id 与 ClassTable 表中性别为男性的记录相对应的完整记录
*/

视图

基本概念

视图的本质

  • 视图的行为与表类似,但是它不存储数据,只存储定义

  • 通过这个定义,它会查数据库并实时渲染成我们想要的查询结果

  • 所以,你可以理解为视图本质就是一个查询的结果,而且这个结果是通过定义"现场制作"给我们看,按照我们想要的样子去查看数据

  • 所以,这就是为什么视图它本身就是一个虚表,并不是真实存在的,数据实际上还是存放在原来的表中

视图的限制

  • 视图可以简化复杂的SQL操作,但不会提升性能,因为视图在查询时是动态生成的
  • 视图可能会不支持某些类型的更新操作,尤其是如果视图包含 聚合函数、distinct、group by、having、union
  • 视图定义中不能包含 order by 子句,除非有 limit 子句与之配合

视图的优点

  • 安全性:限制用户只能访问他们需要的数据
  • 简化复杂查询:可以将复杂的查询逻辑封装在视图中,使其他查询更简单
  • 数据独立性:视图可以隐藏底层表结构的变化,使得应用程序不必修改

具体操作

创建视图

  • 创建一个只有男性的姓名和年龄的视图
create view `视图的名称` as
select `name`, `age` from `表的名称`
where `gender` = 'M';

查看视图

  • 查看数据库中所有的视图
show full tables in `数据库的名称`
where table_type like 'view';
  • 查看特定视图的详细信息
show create view `视图的名称`;

使用视图

  • 使用视图与使用表类似,你可以对视图进行查询
select * from `视图的名称`;
  • 或者使用条件查询
select * from `视图的名称` where 条件;

更新视图

  • 更新视图通常是指修改视图的定义
create or replace view `视图的名称` as
select `name`, `age` from `表的名称`
where `gender` = 'M';

删除视图

drop view if exists `视图的名称`;

索引

基本概念

索引的用途

  • 索引是用于提高查询性能的数据结构,它们可以帮助快速定位表中的数据行
  • 通过创建索引,提高我们的查询效率

索引的优缺点

优点

  • 提高查询性能,尤其是在大数据集上
  • 加速排序和分组操作
  • 唯一索引可以确保数据的唯一性

缺点

  • 索引会占用额外的磁盘空间
  • 在插入、删除和更新操作时可能会降低性能,因为索引也需要维护

建议

  • 我们应该根据实际的应用场景和数据模式,来决定是否创建索引,以及创建何种类型的索引
  • 过多的索引可能会导致不必要的性能开销

具体操作

创建索引

  • 索引包含 列1列2
create index `索引的名称` on `UserTable` (`name`, `age`, `gender`);

查看索引

  • 列出 UserTable 表上所有的索引以及相关信息,如索引类型、是否唯一、列等
show index from `UserTable`;

删除索引

drop index `索引的名称` on `UserTable`;

常见索引类型

主键索引

  • 当你在创建表时定义主键时,MySQL 会自动为主键列创建一个主键索引
create table `UserTable` (`id` int auto_increment primary key,...
);

唯一索引

create unique index `索引的名称` on `UserTable` (`name`, `age`);

全文索引

create fulltext index `索引的名称` on `UserTable` (`name`, `age`);

事务

基础认识

事务是数据库管理系统执行过程中的一个逻辑单位,由一系列操作组成,这些操作要么全部执行,要么全部不执行,保证了数据库的一致性和完整性

启动事务

start transaction;

提交事务

  • 确定事务中的所有操作,并将这些操作作为永久更改保存到数据库中
commit;

回滚事务

  • 用于撤销当前事务中所有的操作,即取消事务中的所有更改,并将数据库状态恢复到事务开始之前
rollback;

具体示范

-- 开启事务
start transaction;-- 插入新用户的记录
insert into UserTable (name, age, gender, money) values ('Alice', 35, 'M', 0);-- 获取新插入的用户的ID
-- @last_user_id 是自定义的变量,last_insert_id()是MySQL中的函数
set @last_user_id = last_insert_id();-- 初始化用户的资金
update UserTable set money = 100 where user_id = @last_user_id;-- 假设这里发生了一个错误,我们需要进行回滚操作
-- rollback;-- 如果没有错误,则提交事务,保存更改
commit;

事务的隔离级别

  • read uncommitted:允许读取尚未提交的数据变更,可能会导致脏读、不可重复读和幻读
set transaction isolation level read uncommitted;
  • read committed:只允许读取已经提交的数据变更,可以防止脏读,但不可重复读和幻读仍可能发生
set transaction isolation level read committed;
  • repeatable read:确保在事务内可以多次读取同样的数据结果,可以防止脏读和不可重复读,但幻读仍可能发生
set transaction isolation level repeatable read;
  • serializable:确保事务可以从数据库中检索到的数据,就好像其他事务不存在一样,是最严格的事务隔离级别,可以防止脏读、不可重复读和幻读
set transaction isolation level serializable;

触发器

  • 触发器就像其名字一样,在某种条件下会自动触发

  • 触发器可以用于数据验证、日志记录以及复杂的业务逻辑等场景

查看触发器

show triggers;

创建触发器

  • 执行时间:beforeafter
  • 事件类型:insertupdatedelete
在数据库管理系统中,`DELIMITER` 是一个命令,用于改变MySQL中语句分隔符的符号。默认情况下,MySQL命令行工具使用分号(`;`)作为语句结束的标志。然而,在某些情况下,比如在创建存储过程或触发器时,需要在语句内部使用分号,而不希望它被解释为语句的结束。这时,就可以使用 `DELIMITER` 命令来临时更改语句分隔符。
-- 修改分隔符为 $ 符号
delimiter $create trigger `触发器的名称`
执行时间 事件类型 on `表的名称`
for each row
begin-- 这里写触发器要执行的SQL语句if new.status != old.status theninsert into UserTable (name, age, gender)values ('Jack', 35, 'M');end if;
end;-- 使用分隔符
$-- 修改分隔符为原来的 ; 符号
delimiter ;

删除触发器

drop trigger if exists `触发器的名称`;

函数

函数的分类

  • 聚合函数:对一组值进行计算,返回单个值。例如:SUM(), AVG(), COUNT(), MAX(), MIN()
  • 标量函数:对单个值进行操作,返回一个单一的值。例如:ABS(), CEIL(), FLOOR(), ROUND()
  • 日期和时间函数:用于处理日期和时间值。例如:NOW(), CURDATE(), CURTIME(), DATE_ADD(), DATEDIFF()
  • 字符串函数:用于处理字符串。例如:CONCAT(), LENGTH(), LOWER(), UPPER(), SUBSTRING()
  • 控制流函数:如 CASE 表达式
  • 加密函数:例如 MD5(), SHA1()
  • 系统信息函数:如 VERSION(), USER()

函数的使用

聚合函数

select count(*) from employees;		-- 计算表中的行数
select sum(salary) from employees;	-- 计算工资总和
select avg(salary) from employees;	-- 计算平均工资
select max(salary) from employees;	-- 找到最高工资
select min(salary) from employees;	-- 找到最低工资

标量函数

select abs (-1);		-- 返回绝对值,结果为 1
select ceil(5.5);		-- 向上取整,结果为 6
select floor(5.5);		-- 向下取整,结果为 5
select round(5.567, 2);	-- 四舍五入到小数点后两位,结果为 5.57

日期和时间函数

select now();			-- 返回当前的日期和时间
select curdate();		-- 返回当前的日期
select curtime();		-- 返回当前的时间-- 在当前日期上加一天
select date_add(now(), interval 1 day);-- 计算两个日期之间的差值
select datediff('2024-10-4', now());

字符串函数

-- 连接字符串,结果为 Hello World
select concat('Hello', ' ', 'World');-- 返回字符串的长度,结果为 5
select length('MySQL');-- 将字符串转换为小写,结果为 mysql
select lower('MySQL');-- 将字符串转换为大写,结果为 MYSQL
select upper('MySQL');-- 从第二个字符开始提取三个字符,结果为 ySQL
select substring('MySQL', 2, 3);

自定义函数

  • 创建一个"返回两个数相加结果的"自定义函数
-- 修改分隔符为 $ 符号
delimiter $;create function AddTwoNumbers(a int, b int)
returns int
begindeclare sum int;set sum = a + b;return sum;
end;-- 使用分隔符 $
$-- 修改分隔符为原来的 ; 符号
delimiter ;
  • 使用该函数
select AddTwoNumbers(10, 20);

存储过程

基本认识

概念

  • 如果在实现用户的某些需求时,需要编写一组复杂的 SQL 语句才能实现的时候,那么我们就可以将这组复杂的 SQL 语句集提前编写在数据库中,由 JDBC 调用来执行这组SQL语句。
  • 把编写在数据库中的 SQL 语句集称为存储过程,调用存储过程可简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是很有好处的。
  • 这就是数据库 SQL 语言层面的代码封装与重用。

优点

  • 有助于减少应用程序和数据库服务器之间的流量。因为应运程序不必发送多个冗长的SQL语句,只用发送存储过程中的名称和参数即可

  • 存储过程将数据库接口暴露给所有的应用程序,以方便开发人员不必开发存储过程中已支持的功能

  • 存储的程序是安全的。数据库管理员可以向访问数据库中存储过程的应用程序授予适当的权限,而不是向基础数据库表提供任何权限。

缺点

  • 如果使用大量的存储过程,那么使用这些存储过程的每个连接的内存使用量将大大增加
  • 如果在存储过程中过度使用大量的逻辑操作,那么 CPU 的使用率也在增加,因为 MySQL 数据库最初的设计就侧重于高效的查询,而不是逻辑运算
  • 很难调试存储过程,而且 MySQL 不提供调试存储过程的功能
  • 对数据库依赖程度较高,移值性差

组成部分

声明变量

declare 变量名 类型;
declare 变量名 类型 default 默认值;

变量赋值

set 变量名 =;

条件语句

if age < 18 then-- SQL语句
elseif age < 35 then-- SQL语句
else-- SQL语句
end if;

循环语句

while money > 100 do-- SQL语句set money = money - 10;
end while;

游标

  • 游标就像是你在数据库里的一只手,它可以帮你一排一排地翻看查询出来的数据
  • 并且可以针对每一排数据进行想要的操作,比如读取信息、修改内容或者删除记录
declare `游标的名称` cursor for-- 用于定义游标的select语句
open `游标的名称`;
fetch `游标的名称` into 用于存储从游标中提取的行数据的变量;
close `游标的名称`;

创建存储过程

  • in表示输入参数
create procedure `存储过程的名称` (in 参数 类型, ...)
begin-- SQL语句
end;

调用存储过程

call `存储过程的名称` (传值);

修改存储过程

  • characteristic:可以指定存储过程的一些特性,如contains sqlno sqlreads sql datamodifies sql data
alter procedure `存储过程的名称` characteristic;

删除存储过程

drop procedure if exists `存储过程的名称`;

使用演示

案例背景

  • 假设我们有一个数据库表叫做员工信息表,里面记录了员工的姓名、部门和工资

  • 现在我们需要给工资低于某个标准的员工涨工资

  • 遍历所有员工,如果发现某个员工的工资低于5000元,那么就给他涨500元工资

存储过程

-- 修改分隔符为 $ 符号
delimiter $create procedure AdjustSalary()
begin-- 声明变量declare done int default false;declare empName varchar(100);declare empSalary decimal(10, 2);-- 声明游标(它将遍历工资低于5000元的员工)declare empCursor cursor forselect 姓名, 工资 from 员工信息表 where 工资 < 5000;-- 声明循环结束的处理器(当游标遍历完所有数据时会触发:设置done为true)declare continue handler for not found set done = true;-- 打开游标open empCursor;-- 打开循环read_loop: loop-- 检查是否已经处理完所有数据if done thenleave read_loop;end if;-- 从游标中获取数据fetch empCursor into empName, empSalary;-- 如果工资低于5000,则进行调整if empSalary < 5000 then-- 更新工资update 员工信息表 set 工资 = empSalary + 500 where 姓名 = empName;-- 可以在这里添加输出语句,比如打印调整后的工资select concat('员工', empName, '的工资已调整为', empSalary + 500);end if;end loop;-- 关闭游标close empCursor;end;-- 使用分隔符 $ 符号
$-- 修改分隔符为原来的 ; 符号
delimiter ;

代码分析

  • delimiter $delimiter ; 用于改变MySQL的语句结束符,因为我们想在存储过程中使用分号
  • create procedure AdjustSalary() 开始定义一个名为AdjustSalary的存储过程
  • 在存储过程中,我们声明了必要的变量和游标
  • declare empCursor cursor for ... 定义了一个游标,它将遍历工资低于5000元的员工
  • declare continue handler for not found set done = true; 是一个处理器,当游标遍历完所有数据时会触发,设置doneTRUE
  • open empCursor; 打开游标,准备开始遍历
  • read_loop: loop ... end loop; 是一个循环,它会一直执行,直到所有的员工都被处理完毕
  • fetch empCursor into empName, empSalary; 从游标中获取当前行的数据
  • if done then ... end if; 是一个条件语句,用来检查是否已经到达游标的末尾
  • if empSalary < 5000 then ... end if; 是另一个条件语句,用来判断是否需要调整工资
  • update 员工信息表 set 工资 = empSalay + 500 where 姓名 = empName; 是一个更新语句,用来调整员工的工资
  • close empCursor; 关闭游标

执行存储过程

call AdjustSalary();

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

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

相关文章

(Django)初步使用

前言 Django 是一个功能强大、架构良好、安全可靠的 Python Web 框架&#xff0c;适用于各种规模的项目开发。它的高效开发、数据库支持、安全性、良好的架构设计以及活跃的社区和丰富的文档&#xff0c;使得它成为众多开发者的首选框架。 目录 安装 应用场景 良好的架构设计…

Leetcode—763. 划分字母区间【中等】

2024每日刷题&#xff08;175&#xff09; Leetcode—763. 划分字母区间 C实现代码 class Solution { public:vector<int> partitionLabels(string s) {int rightmost[26];int l 0;int r 0;for(int i 0; i < s.length(); i) {rightmost[s[i] - a] i;}vector<…

[C语言]第十一节 函数递归一基础知识到高级技巧的全景探索

目录 11.1. 递归是什么&#xff1f; 11.1.1 递归的思想&#xff1a; 11.2 递归的限制条件 举例1&#xff1a;求n的阶乘 画图推演 举例2&#xff1a;顺序打印⼀个整数的每⼀位 画图推演 11.3. 递归与迭代 举例3&#xff1a;求第n个斐波那契数 11.1. 递归是什么&#xff…

一款基于 Java 的可视化 HTTP API 接口快速开发框架,干掉 CRUD,效率爆炸(带私活源码)

平常我们经常需要编写 API&#xff0c;但其实常常只是一些简单的增删改查&#xff0c;写这些代码非常枯燥无趣。 今天给大家带来的是一款基于 Java 的可视化 HTTP API 接口快速开发框架&#xff0c;通过 UI 界面编写接口&#xff0c;无需定义 Controller、Service、Dao 等 Jav…

【Java数据结构】栈 (Stack)

【本节目标】 1. 栈的概念及使用 2. 相关 OJ 题 一、概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last…

【2024】前端学习笔记11-网页布局-弹性布局flex

学习笔记 网页布局弹性布局&#xff1a;flex案例&#xff1a;flex布局案例 网页布局 在页面布局中&#xff0c;display属性用于设置一个元素的显示方式。它可以指定元素是作为块级元素、内联元素还是充当表格元素显示。 display的常见属性值&#xff1a; block&#xff1a;将…

k8s 中微服务之 MetailLB 搭配 ingress-nginx 实现七层负载

目录 1 MetailLB 搭建 1.1 MetalLB 的作用和原理 1.2 MetalLB功能 1.3 部署 MetalLB 1.3.1 创建deployment控制器和创建一个服务 1.3.2 下载MealLB清单文件 1.3.3 使用 docker 对镜像进行拉取 1.3.4 将镜像上传至私人仓库 1.3.5 将官方仓库地址修改为本地私人地址 1.3.6 运行清…

ensp回顾--聚合链路技术简介与详细案例(构建基于交换机到交换机的聚合链路)

文章目录 什么是聚合链路&#xff1f;聚合链路的工作原理聚合链路的优势使用场景 案例ensp版本图例pc的ip地址具体步骤连通性测试 在现代网络中&#xff0c;聚合链路&#xff08;Link Aggregation&#xff09;是一种常见的技术&#xff0c;用于提高网络连接的带宽和可靠性。本文…

RNN经典案例——构建人名分类器

RNN经典案例——人名分类器 一、数据处理1.1 去掉语言中的重音标记1.2 读取数据1.3 构建人名类别与人名对应关系字典1.4 将人名转换为对应的onehot张量 二、构建RNN模型2.1 构建传统RNN模型2.2 构建LSTM模型2.3 构建GRU模型 三、构建训练函数并进行训练3.1 从输出结果中获得指定…

【可答疑】基于51单片机的智能台灯(含仿真、代码、报告、演示视频等)

✨哈喽大家好&#xff0c;这里是每天一杯冰美式oh&#xff0c;985电子本硕&#xff0c;大厂嵌入式在职0.3年&#xff0c;业余时间做做单片机小项目&#xff0c;有需要也可以提供就业指导&#xff08;免费&#xff09;~ &#x1f431;‍&#x1f409;这是51单片机毕业设计100篇…

数据分析-28-交互式数据分析EDA工具和低代码数据科学工具

文章目录 1 数据分析的七步指南1.1 第一步:问题定义和数据采集1.2 第二步:数据清洗和预处理1.3 第三步:数据探索和分析1.4 第四步:模型建立和分析1.5 第五步:数据可视化1.6 第六步:结果解释和报告1.7 第七步:部署和维护1.8 基础的数据分析库1.9 低代码数据科学工具2 EDA…

STM32 通用定时器

一、概述 STM32内部集成了多个定时/计数器&#xff0c;根据型号不同&#xff0c;STM32系列芯片最多包含8个定时/计数器。其中&#xff0c;TIM6、TIM7为基本定时器&#xff0c;TIM2~TIM5为通用定时器&#xff0c;TIM1、TIM8为高级控制定时器。 1.定时器的类型 基本定时器通用定…

实战案例:结合大模型与爬虫技术实现12306智能查票系统

大语言模型&#xff0c;例如 GPT-4&#xff0c;拥有强大的知识储备和语言理解能力&#xff0c;能够进行流畅的对话、创作精彩的故事&#xff0c;甚至编写代码。然而&#xff0c;它们也面临着一些难以克服的困境&#xff0c;就像一个空有知识却无法行动的巨人 信息滞后&#xf…

Linux 之 安装软件、GCC编译器、Linux 操作系统基础

安装软件、GCC编译器、Linux 操作系统基础 学习任务&#xff1a; 安装 Vmware虚拟机、掌握Ubuntu 系统的使用认识 Ubuntu 操作系统的终端和 Shell掌握软件安装、文件系统、掌握磁盘管理与解压缩掌握 VIM 编辑器、Makefile 基本语法熟悉 Linux 常见指令操作 安装好开发软件&…

[Go语言快速上手]初识Go语言

目录 一、什么是Go语言 二、第一段Go程序 1、Go语言结构 注意 2、Go基础语法 关键字 运算符优先级 三、Go语言数据类型 示例 小结 一、什么是Go语言 Go语言&#xff0c;通常被称为Golang&#xff0c;是一种静态类型、编译型的计算机编程语言。它由Google的Robert Gr…

用HTML5+CSS+JavaScript庆祝国庆

用HTML5CSSJavaScript庆祝国庆 中华人民共和国的国庆日是每年的10月1日。 1949年10月1日&#xff0c;中华人民共和国中央人民政府成立&#xff0c;在首都北京天安门广场举行了开国大典&#xff0c;中央人民政府主席毛泽东庄严宣告中华人民共和国成立&#xff0c;并亲手升起了…

Vue3 中Ref的最佳实践

在vue3中如果我们需要获取一个响应式的变量&#xff0c;可以使用ref来定义一个变量。 const name ref( "" );name.value "test" 定义好后&#xff0c;就可以实现修改状态&#xff0c;更新UI的效果了。 在这个基础上&#xff0c;本文主要讨论跨组件时如何…

Discord:报错:A fatal Javascript error occured(解决办法)

按 Windows 键 R 并输入 %appdata% 选择 discord 文件夹并将其删除。 再次按 Windows 键 R 并输入 %LocalAppData% 选择 discord 文件夹并再次将其删除。 附加&#xff1a; 如果还不行&#xff0c;就通过官网下载吧&#xff0c;这个问题通过epic下载可能会有

Python并发编程挑战与解决方案

Python并发编程挑战与解决方案 并发编程是现代软件开发中的一项核心能力&#xff0c;它允许多个任务同时运行&#xff0c;提高程序的性能和响应速度。Python因其易用性和灵活性而广受欢迎&#xff0c;但其全局解释器锁&#xff08;GIL&#xff09;以及其他特性给并发编程带来了…

Docker面试-24年

1、Docker 是什么&#xff1f; Docker一个开源的应用容器引擎&#xff0c;是实现容器技术的一种工具&#xff0c;让开发者可以打包他们的应用以及环境到一个镜像中&#xff0c;可以快速的发布到任何流行的操作系统上。 2、Docker的三大核心是什么? 镜像&#xff1a;Docker的…