# Navicat功能总结
# 视图
支持通过外键连接显示虚拟表
# 函数与存储过程
# 函数
函数和存储过程的区别:存储过程是指用户在数据库中完成特定操作或者任务(插入、删除等等),函数用于返回特定数据。
适用场合:如果有返回值,用存储函数,否则,一般用存储过程。
要启用函数创建,首先更改my.ini配置文件,一般在路径C:\ProgramData\MySQL\MySQL Server 8.0
log_bin_trust_function_creators=1
# 创建函数
语法
create function 函数名([参数列表]) returns 数据类型
begin
sql语句;
return 值;
end;
例子
-- 创建一个返回 "Hello, World!" 的函数
DELIMITER // 替换为//
CREATE FUNCTION my_hello_world()
RETURNS VARCHAR(255)
BEGIN
DECLARE result VARCHAR(255);
SET result = 'Hello, World!';
RETURN result;
END //
DELIMITER ; // 替换为;
DELIMITER用来指定SQL语句的结束符号
# 查找使用删除
show function status like 'my_%'; # 自定义函数可以以my_开头
drop function my_function; # 删除函数
select my_hello_world() from table; # 使用函数
# 存储过程
# 创建存储过程
语法格式
# 这个地方其实是用来声明SQL语句的结束符号的
delimiter //
# 这个地方此时真正的用来创建一个存储过程的
create procedure 存储过程名称(参数列表)
begin
-- sql语句
end//
# 当创建完一个存储过程之后再将分隔符替换为分号,为了不影响其他的操作
delimiter ;
例子
delimiter //
create procedure my_test()
begin
select * from user; # 此时这个分号并不会结束这个语句,存储过程中的SQL语句还是用分隔符进行分隔
end // # 这里使用这个结束符号代表这个存储过程创建完成
delimiter;
# 查找使用删除
show procedure status where Db='db_name'; # 查找
drop procedure my_test; # 删除
call my_test(); # 使用
# 案例
删除表固定日期前的数据
DELIMITER //
CREATE PROCEDURE DeleteBeforeDate()
BEGIN
DECLARE cutoff_date DATE;
set cutoff_date = '2023-02-01';
DELETE FROM tidelevel
WHERE DATE < cutoff_date;
SELECT ROW_COUNT() AS deleted_rows;
END //
DELIMITER ;
删除表一个月前的数据
DELIMITER //
CREATE PROCEDURE DeleteOneMonthAgo()
BEGIN
DECLARE cutoff_date DATE;
set cutoff_date = DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH);
DELETE FROM tidelevel WHERE DATE < cutoff_date;
SELECT ROW_COUNT() AS deleted_rows;
END //
DELIMITER ;
# 事件
事件可用于定时执行某些特定任务,如:
- 定期数据清理
- 报表生成
- 备份数据库
- 数据库同步
- ...
使用之前要确保事件功能已经开启
-- 方法一
SELECT @@event_scheduler;
-- 方法二
SHOW VARIABLES LIKE 'event%';
显示ON说明已开启
持久化开启方式:将event_scheduler=1写入my.ini配置文件中
# 创建事件
创建语法
CREATE EVENT [IFNOT EXISTS] event_name
ON SCHEDULE schedule 调度时间设置
[ON COMPLETION [NOT] PRESERVE] 事件到期后是否删除
[ENABLE | DISABLE | DISABLE ON SLAVE] 开启|关闭|从机关闭
[COMMENT 'comment']
DO sql_statement; 事件启动要执行的代码
schedule 调度时间配置语法:AT或者EVERY
[+ INTERVAL interval]表示延迟触发时间
AT timestamp [+ INTERVAL interval] ...
| EVERY interval
[STARTS timestamp [+ INTERVAL interval] ...]
[ENDS timestamp [+ INTERVAL interval] ...]
-- interval中包含的时间单位如下:
{YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
# 单次定时事件
直接执行
CREATE EVENT my_event
ON SCHEDULE AT TIMESTAMP '2024-01-19 14:03:20'
DO INSERT INTO `users` (`id`, `userName`, `passWord`,`user_sex`) VALUES (null, 'stagworm', '123456','MAN')
延后30秒执行
CREATE EVENT my_event
ON SCHEDULE AT TIMESTAMP '2024-01-19 13:50:00'+ INTERVAL 30 SECOND
DO INSERT INTO `users` (`id`, `userName`, `passWord`,`user_sex`) VALUES (null, 'stagworm', '123456','MAN')
# 循环定时事件
CREATE EVENT my_event
ON SCHEDULE EVERY 10 SECOND
ON COMPLETION PRESERVE
DO INSERT INTO `users` (`id`, `userName`, `passWord`,`user_sex`) VALUES (null, 'stagworm', '123456','MAN')
# 查看修改删除
show events from test; # 查找
和创建语句一样, create改为alter
ALTER ... # 修改
drop event event_name # 删除
# 用户
# 身份验证插件
- mysql_native_password:基于本机密码哈希方法(4.1以前,现已启用)
- sha256_password:使用SHA-256密码哈希执行身份验证(5.7开始默认)
- caching_sha2_password:SHA-256,并在服务器端使用缓存(8.0开始默认)
MySQL5.7客户端可以使用caching_sha2_password插件来兼容8.0及更高版本客户端