SQL语句 (MySQL)

14、OpenClaw(龙虾助手)Skill 开发完整规范(2026最新版) OpenClaw Skill 开发指南摘要: Skill 是 OpenClaw AI 助手的核心扩展机制,支持声明式(SKILL.md)和原生代码(JS/TS/Python)两种开发模式。声明式 Skill 通过 Markdown 定义触发条件和执行流程,适合简单业务;原生代码 Skill 提供完整编程能力,适合复杂场景。开发需遵循标准化项目结构,包含 SKILL.md(元数据)、manifest.json(权限声明)等文件,并严格处理错误和多系统适配。新版要求原生 Skill 必须声明文件、网络等权限,确 阅读详情

登录操作

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

控制与管理

展示用户列表

select user, host from mysql.user;

创建用户

  • UserName :填新用户的名称
  • HostName :允许该用户用什么主机登录数据库,填写 localhost 或 127.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',		-- 设置默认为字符M
    
    primary 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';
  • and 和 or 用于在 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
*/

子查询

子查询是嵌套在 select、insert、update、delete 语句中的查询

  • 在 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;

创建触发器

  • 执行时间:before 或 after
  • 事件类型:insert 或 update 或 delete
在数据库管理系统中,`DELIMITER` 是一个命令,用于改变MySQL中语句分隔符的符号。

默认情况下,MySQL命令行工具使用分号(`;`)作为语句结束的标志。

然而,在某些情况下,比如在创建存储过程或触发器时,需要在语句内部使用分号,而不希望它被解释为语句的结束。

这时,就可以使用 `DELIMITER` 命令来临时更改语句分隔符。
-- 修改分隔符为 $ 符号
delimiter $

create trigger `触发器的名称`
执行时间 事件类型 on `表的名称`
for each row
begin
	-- 这里写触发器要执行的SQL语句
	if new.status != old.status then
		insert 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
begin
	declare 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 sql、no sql、reads sql data、modifies 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 for
		select 姓名, 工资 from 员工信息表 where 工资 < 5000;
	
	-- 声明循环结束的处理器(当游标遍历完所有数据时会触发:设置done为true)
	declare continue handler for not found set done = true;
	
	-- 打开游标
	open empCursor;
	
	-- 打开循环
	read_loop: loop
	
		-- 检查是否已经处理完所有数据
		if done then
			leave 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; 是一个处理器,当游标遍历完所有数据时会触发,设置done为TRUE
  • 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();
手把手教你学simulink(42.1)--储能系统场景示例:基于Simulink的电池+超级电容器混合储能系统 混合储能系统(HESS)结合了电池和超级电容器的优点,能够在满足高功率需求的同时提供较长的持续放电时间。这种组合特别适合用于电动汽车、可再生能源发电系统、电网频率调节等应用场景。本项目将详细介绍如何在MATLAB/Simulink中搭建一个完整的基于电池和超级电容器的混合储能系统,并提供具体的代码实现和设计步骤。如果你需要实现更复杂的控制逻辑,可以使用MATLAB Function模块。以下是一个简单的例子,展示了如何在该模块中实现一个条件逻辑,以分配电池和超级电容器的充放电任务。Matlab。 阅读详情

相关推荐

利用Docker Compose简化openGauss多节点容器化部署

本文详细介绍了如何利用Docker Compose简化openGauss多节点容器化部署,从环境准备到配置文件编写,再到集群部署与验证,提供了一套完整的解决方案。通过Docker Compose,原本复杂的手动部署流程被大幅简化,显著提升了部署效率和可靠性,特别适合企业级开源数据库的高可用架构需求。

weixin_30338481的博客 60

sql数据库身份验证登录

工具:SQL Server(我使用的是SQL Server) 步骤: 1、打开SQL Server,先选择Windows身份验证登录 2、定位到[服务器/安全性/登录名],可以选择其中有的登录来登录,也可以自己创建登录名来登录。 3、[自建登录名,如果要使用系统的登录名可以跳过3-7步] 选中登录名,右键选择新建登录名。 4、先输入你要取得登录名,然后选择SQL Server身份验证,然后输入密码,然后选择强制实施密码策略(这个一定要选,后面那两个可选可不选,看个...

qq_47583226的博客 1万+

YOLOv5s模型训练全流程解析:从数据准备到实战检测

本文详细解析了YOLOv5s模型训练的全流程,涵盖从环境搭建、数据准备与格式转换,到模型训练、参数调优及实战检测的完整步骤。文章提供了具体的代码示例和常见问题解决方案,旨在帮助开发者,特别是新手,高效掌握YOLOv5s模型训练的核心技术,并成功应用于实际检测任务中。

weixin_29041767的博客 332

连接SQL Server数据库(详细步骤+登录注册案例)

SQL Server使用sql server身份验证,方便与编写的程序连接 <1> 首先使用Windows登录进去,右键实例,点击属性,再选择安全性,将该选项卡中的服务器身份验证改为sql server和windows身份验证模式。点击确定 <2> 此时重新登录数据库,OK,又失败了。。。 失败的提示是: 已成功与服务器建立连接 但是在登录过程中发生错误。 provider 共享内存提供程序 error 0 管道的另一端上无任何进程。 <3> 不要慌,淡定,打开SQL S

weixin_43624549的博客 8万+

YOLOv11火焰识别:从环境搭建到GUI部署的完整工程实践

目标检测是计算机视觉的核心任务之一,它通过定位和分类图像中的物体,为机器赋予“看懂”世界的能力。其原理通常基于深度学习模型,如YOLO系列,通过卷积神经网络提取特征并预测边界框与类别。这项技术的价值在于将算法能力转化为实际生产力,广泛应用于安防监控、工业质检、自动驾驶等场景。在工程实践中,环境配置的稳定性与数据质量往往决定项目成败,而模型部署的易用性直接影响最终用户体验。本文以火焰识别这一具体应用为切入点,详细解析了如何利用YOLOv11完成从零到产品化的全链路流程,其中涉及Conda虚拟环境管理、PyTo

weixin_29483277的博客 234

Ubuntu配置Qt Creator树莓派交叉编译环境一步到位

本文详细指导在Ubuntu系统上配置Qt Creator树莓派交叉编译环境。从工具链安装、sysroot创建到Qt库编译,逐步讲解如何搭建完整的ARMv7交叉编译工具链,实现高效开发树莓派应用。

1274

二、SQL Server 2008 登录

安装SQL Server的必备条件 配置 计算机配置 处理器 1.4GHz处理器,建议使用2.0GHz或更快的处理器 内存 最小:512MB,建议使用1GB或更大的内存 磁盘容量 至少2.0G可用磁盘空间 操作系统 不同版本安装支持不同的操作系统 ...

好记性不如烂笔头,用文档记录技术,方便自己和他人。 6258

c++11 无锁队列

/************************************************************************* &gt; File Name: lockfreequeue.cpp &gt; Author: &gt; Mail: &gt; Created Time: Wed 08 Aug 2018 11:38:08 AM CST ********...

qq_35728402的博客 5021

MySQL基础语句

文章目录MYSQL基础语句1. 登录和退出数据库2. 数据库操作3. 表结构操作4. 表数据操作 MYSQL基础语句 1. 登录和退出数据库 登录数据库: mysql -uroot -p -u 是登录的用户名 -p 后面是登录密码, 如果不填写, 回车后会提示输入密码 select now(); 登出(退出)数据库: quit 或 exit 或 ctrl + d 2. 数据库操作 查看所有数据库 show databases; 创建数据库 create database 数据库名

行码棋 1256

[RK-Linux] 移植Linux-5.10到RK3399(十)| 配置AP6256模组使能WIFI、BT功能

[RK-Linux] 移植Linux-5.10到RK3399(十)| 配置AP6256模组使能WIFI、BT功能

Systemcall名屋 2978

最新Python爬虫实战(入门爬虫篇)——案例3:爬取二次元cos图片批量下载到本地(附上完整爬虫代码)

本次案例通过Python爬虫技术实现了二次元图片的批量下载。代码采用模块化设计,函数实现cookies的自动解析,简化了配置流程,涵盖“请求列表页→提取详情页URL→请求详情页→提取图片链接→保存图片”的完整流程,与豆瓣案例的核心逻辑和格式完全对齐。学习重点包括:抓包工具定位多层级数据源、正则表达式匹配复杂链接、模拟请求头绕过反爬机制、文件名安全处理及自动化文件管理。需要注意控制请求频率并遵守网站使用规范,适用于入门爬虫实践,帮助学习者掌握多层级页面爬取的核心逻辑。

努力让自己发光,对的人才能迎着光而来 14万+

MySQL登陆连接+基础SQL语句

MySQL的登陆步骤+SQL语句笔记

weixin_46363632的博客 1682

数字图像处理 基于OpenCV的景深融合算法

还有的思路是对图像序列中的每一张图像分别进行拉普拉斯金字塔拆分,提取出每一张图像的高频信息和低频信息,得到所述图像序列对应的高频信息集合和低频信息集合。然后根据所述高频信息集合得到合成后的高频信息,对所述低频信息集合进行导向滤波处理得到合成后的低频信息,根据所述合成后的高频信息和低频信息做拉普拉斯金字塔重构,得到一张超景深图像。这里声明了几个变量,ImMer是最终合成的图像,coll是中间处理的变量,Coll_Ori是保存原图像数据的变量,dstWidth目标图像宽度(一般都是与原始图像大小一致)。

学以致用 知行合一 3900

【SQL】Mysql中一条sql语句的执行过程

假设写完 redo log 后,机器挂了,binlog 日志没有被写入,那么机器重启后,这台机器会通过 redo log 恢复数据,但是这个时候 binlog 并没有记录该数据,后续进行机器备份的时候,就会丢失这一条数据,同时主从同步也会丢失这一条数据。然后拿到查询的语句,把 age 改为 19,然后调用引擎 API 接口,写入这一行数据,InnoDB 引擎把数据保存在内存中,同时记录 redo log,此时 redo log 进入 prepare 状态,然后告诉执行器,执行完成了,随时可以提交。

double222222的博客 3442

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

MySQL常用的sql语句

SQL语句核心功能与实用技巧摘要: SQL语句主要分为四类:数据查询(SELECT)、数据操作(INSERT/UPDATE/DELETE)、数据定义(CREATE/ALTER)和数据控制(GRANT/COMMIT)。基础查询包括条件筛选、排序分页和聚合分组,多表连接可实现复杂关联查询。DML语句完成增删改操作,DDL定义数据库结构,DCL管理权限事务。高级技巧包含子查询、CTE和窗口函数,优化建议着重索引创建和查询效率提升。掌握这些语句可高效完成数据检索、业务逻辑实现和性能优化,是数据库操作的核心技能。

simpler0808的博客 1669

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

MySQL如何跟踪sql语句

在项目开发中,难免会遇到在数据库服务器端跟踪sql执行语句的需求,通过跟踪sql执行语句,我们可以确定当上层应用在执行sql语句时,数据库端是否执行了sql语句,执行的sql语句是否有错误等等。总之,在数据库端跟踪sql执行语句极大的便利了数据库逻辑代码编写中的错误排查。 我们都知道在SQL SERVER下跟踪sql采用事件探查器,那么在mysql下如何跟踪执行的sql语句了?

andieguo的专栏 1万+

图解MySQL的SQL语句执行全流程,看看自己的SQL语句是如何执行的

MySQL作为一种广泛使用的开源关系型数据库管理系统,其SQL语句的执行流程对于理解数据库性能优化、错误排查以及数据库设计都至关重要。

小白的大数据之旅的博客 1417

Mysql是怎么运行SQL语句的

MySQL 由 Server 层与引擎层构成。Server 层涵盖连接器(负责客户端连接管理及权限验证)、查询缓存(MySQL 8.0 默认关闭,可缓存查询及结果)、分析器(进行词法、语法、语义分析)、优化器(依统计信息生成并选定最优执行计划)、执行器(按计划执行,二次校验权限并处理数据),还有供所有引擎共用、记录数据修改操作的 binlog 日志模块。

sosovo66的博客 947

MySQL SQL语句整理

在《MySQL 数据库技术》课程中,我们学习了多种多样的 SQL 语句,它们在数据库操作中发挥着关键作用。以下将对常见 SQL 语句进行详细梳理:基本查询:查询所有列:条件查询:排序查询:聚合查询:( 可为 、、、、 等聚合函数)分组查询:子查询:可在 、、 等子句中嵌套查询,如 查询指定列或所有列数据。根据条件筛选数据。对查询结果排序。进行数据聚合计算,如求和、求平均、计数等。按某一列或多列进行分组统计。通过子查询实现复杂查询逻辑,如查询订单表中金额大于平均金额的订单。条件表达式书写错误,如运算符使用不当

xyzcc1231的博客 1296

mysql批量执行语句_mysql批量执行sql语句

tablename Access 数据库:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename; Conn.Execute 说明 Execute 方法 该方法用于执行 SQL 语句......\\masql6.0\\bin>mysqldump -u root -proo t mysql>d:\\mysq...

weixin_35252979的博客 5941

MySQL的SQL语句分类

MySQL官方SQL大致可以分为下面的这些 第一种:Data Definition Statement,数据定义语句,主要有alter、create、drop、rename、truncate这些,具体看下图: 第二种:Data Manipulation Statement,数据操纵语句,主要有call、delete、do、handler、import、load、insert、replace、...

Program Man 682

MySQL 数据库 SQL 语句全面总结

使用规范:用于创建数据库、表、视图、索引等数据库对象。应用规则:创建表时需明确各列的数据类型,如INT(整数)、VARCHAR(可变长度字符串)、DATE(日期)等 ,并合理设置主键、外键等约束。易错点:数据类型选择不当可能导致存储异常;定义主键时若未确保唯一性和非空性,会引发错误。实例演示-- 创建名为test_db的数据库-- 在test_db数据库中创建students表age INT通过对各类 SQL 语句的整理,我们对 MySQL 数据库操作有了更系统的认识。

qbgtqb的博客 1273

mysql 批处理sql语句_MySQL批处理SQL语句

MySQL 支持批处理的模式执行一批SQL语句,下面的例子就是实验MySQL如何在windows下批处理执行SQL语句。create table test(id int,name varchar(20));insert into test values(1,'watson');batchfile.txt里包含下面的一些SQL 语句,此文件放在windows系统的c:/batchmysql/batc...

weixin_36098127的博客 424

MySQL —— SQL 语句总结

原文出自:https://www.pandashen.com 前言 这是关于 MySQL 系列文章的第二篇,在上一篇 《MySQL —— 数据库基础》 中,主要介绍了一些数据库的基础概念、创建表的方式以及使用 DDL 数据定义语言对表的操作,本篇的主要内容是在开发中使用 SQL 语句对数据库的增、删、改、查,函数、聚合函数的应用以及表连接,本篇大部分内容都贴近开发中的实际操作,不会像上一篇那...

github_38140984的博客 2305

如何使用MYSQL编写SQL语句

如何使用MYSQL编写SQL语句 首先启动MYSQL,因为MYSQL是非图形化界面,在桌面上是没有显示的,所以要在任务栏输入MYSQL然后ENTER键,就可以启动了。 启动之后,输入你下载MYSQL时所设置的密码,确定 输入show databases; 查看电脑之前所存在的数据 2、建立一个数据库,输入 Create database Defct; 使用数据库 Use Defct; 上面都是一些准备工作,接下来就可以输入一些SQL语句了建表和插入信息了,都是用SQL...

XGK8750的博客 4000

MySql常用的sql语句

MySql常用的sql语句 数据库 # 查看所有数据库 SHOW DATABASES; # 创建一个数据库 CREATE DATABASE 数据库名; # 删除一个数据库 DROP DATABASE 数据库名; # 使用这个数据库 USE 数据库; 表 # 查看所有的表 SHOW TABLES; # 创建一个表 CREATE TABLE 表名( 字段名 字段类型 约束, ......

偏偏爱吃梨的博客 1858

mysql简单sql语句总结_MySQL常用基本SQL语句总结

1. 常见命令连接本地数据库与远程数据库(172.16.xx.xx:3306):mysql -h localhost -u root -p123mysql -h 172.16.xx.xx -P 3306 -u root -p2. DDL数据定义语言(Data Definition Lanuage, DDL)定义了数据库模式,包括CREATE、ALTER、DROP、TRUNCATE、COMMENT与...

weixin_39559523的博客 199
上一篇: 搭建服务器并安装MySQL数据库(记录实现流程)
下一篇: 随笔——重温Java基础语法
code_stream
博客等级 码龄4年 1238粉丝 169原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值