1.mysql语言
1.1 分类
1.2 变量
1) 用户变量
set @name = "小明" ---初始化并赋值
--在没有ser关键字下,不能使用“=”作为赋值 比如 @name2 = “王”这样是错误的,因为“=”会被解释为关系运算的相等。不带set想用赋值使用“:=”,它作为赋值运算符。
select @t2 := (@t2:=5)+2 as t2;
--显示结果是t2是7
--自己理解@符号的含义:取会话上用户变量的值,当在程序块中取局部变量,取值不同@
2) 系统变量
①一般取系统变量前要加两个@@,有些特定值省略了@@,如current_user、current_time、current_timestamp
②设置系统变量
SET 【GLOBAL | SESSION]】| 【@@ global. | @@ session.】 系统变量 = 新值
eg.
设置全局变量
set @@global.sort_buffer_size = 20000;
设置会话变量
set @@session.sql_select_limit = 20;
③ 查看变量
show variables = show session variables
show global variables
3)局部变量
①声明, 在begin end程序块中, 必须使用declare 声明,语法如下
declare 变量名【,变量名2....】 datatype 【default 值】
eg.
declare num int default 0;
declare str1,str2 varchar(6); ---一下声明两个varchar变量
② 赋值
两种赋值方法
1.set 变量名 = 表达式【,变量名 = 表达式…】
set num = 1,str = ‘ccc’;
2.利用select 赋值
select 列名 into 变量名 from 表 where 条件;
2 过程式存储对象
2.1 procedure 存储过程
上几个的例子
delimiter $$
create procedure delete_stu(int xh char(6))
begin
delete from xs where xuehao = xh;
end$$
delimiter ;
--- 根据不同参数返回 不同结果
delimiter $$
create procedure result1(in str varchar(4),out sex varchar(4))
begin
case str
when 'm' then set sex = '女';
when 'f' then set sex = '男';
else set sex = '无';
/* case 第二种写法
case when ste = 'm' the set sex = '女';
when ste = 'f' the set sex = '男';
else set sex = '无';
*/
end case;
end$$
delimiter;
---循环
delimiter $$
create procedure whiletest()
begin
declare i int default 5;
while i >0 do
select i;
set i = i -1;
end while;
end$$
delimiter;
--call 调用
call whiletest();
2.2 function 存储函数
(1)与存储过程区别:它没有输出参数,其本身就是输出参数。不同call 来调用。他有return 语句,而procedure不允许有return。
(2) 创建
create function function_name(参数[,参数2,..])
return type
存储函数主体begin end$$ 此主体中必须含有return
eg.
create function counts_xs()
return integer
begin
return (select count(*) from xs);
end $$
(3) 调用 使用select function_name(参数…);
select counts_xs();
(4)删除
drop function function_name;
查看: show function status;
2.3cursor 游标
它是保存select返回的多条语句,jdbc中ResultSet类似。
游标像局部变量一样,使用前要提前声明,而且它也只存在begin end 之中。
(1)声明游标(在所有局部变量声明之后)
declare cursor_name for cursor for select 语句
(2) 打开游标 open cursor_name
(3) 读取游标 fetch cursor_name into 变量【,变量1,…】
(4) 关闭游标 close cursor_name;
2.4 trigger 触发器
(1)创建语法
create trigger trigger_name 触发时刻 触发事件 on table_name
for each row 触发动作
触发时刻:决定触发器是在那个时刻触发,在语句之前还是之后,after、before
触发事件:insert、update、delete
each row:指触发事件的每一行都会触发触发器动作,即行级触发器
触发动作:trigger被激活后,要执行的动作
(2)例子
delimiter $$
create trigger xs_del After Delete on xs for Each Row
begin
delete from xs_ks where xuehao = xs.xuehao;
end $$
delimiter;
---调用
delete from xs where xuehao = '2021122';
---验证下xs_ks表是否也同一块删除
select * from xs_ks;
2.5 event 事件
(1) 事件是:在相应的时刻调用过程式数据库对象。它可以周期性调用也可只调用一次。事件也称 临时性触发器
(2)作用:关闭账号、打开或关闭数据库指示器、使数据在某个间隔后刷新、执行对数据库的检查工作
(3)创建语句
create event event_name on schedule 时间描述 Do sql语句;
时间描述:At 时间点【+ interval 时间间隔】
| every 时间间隔【starts 时间点【+interval 时间间隔】】
【ends 时间点【+interval 时间间隔】】
interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
(4)例子
---立即启动的事件
create event direct on schedule at now() do....
---30s 后启动
create event direct30 on schedule at now()+30 second do.....
--每月启动一次,并开始于下一个月,结束于2020-12-31
create event startmonth on schedule every 1 month
starts curdate + 1 month ends '2020-12-31'
(5)修改事件
alter event direcr rename to direct2;
drop event direct2;
3. Mysql备份与恢复
- 数据库备份:通过导出数据或复制表文件
1.1 SQL语句备份与恢复: 只能导入导出数据,表结构无法备份
1.1.1. 导出语句 select * from table_name outfile ‘d:/file/tb.txt’
select * from table_name outfile 'd:/file/tb.txt'
fields terminated by ','
optionally enclosed by '"'
lines terminated by '?';
---导出后的格式是列字段用','分割,字符类型数据用’”‘双引号包裹,行结束符是?
1.1.2 导入语句 load data infile ‘d:/file/tb.txt’ into table
load data infile 'd:/file/tb.txt' into table table_name
fields terminated by ','
optionally enclosed by '"'
lines terminated by '?';
1.2 客户端工具
1.2.1 mysqldump
导出表的结构和数据,导出文件是.sql
Usage: mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
备份多个表
>mysqldump -uroot -p123 databasename tb1 tb2 >twotb.sql
---(默认在用户目录下,win是C:\Users\Administrator 不用分号)
备份整个数据库
>mysqldump -uroot -p123 --databases mydatabase > D:/file/data.sql
备份所有数据库实例
mysqldump -uroot -p123 --all--databases >all.sql
恢复
mysqldump -uroot -p123 database_name<tb.sql
1.2.2 mysqlimport
mysqlimport是通体load data infile语句实现,大部分参数与它相似。
如恢复xscj库中xs表,
mysqlimport -uroot -p123 --low-priority --replace xscj d:/file/xs.txt
-
二进制日志文件:记录并保存了更新数据的所有语句
2.1 copy数据库中对应磁盘二进制文件
2.1.1 *.frm 表结构文件
2.1.2 *.myd 数据文件
2.1.3 *.myi 索引文件2.2 mysqlbinlog工具
2.2.1 启动日志在my.ini中【mysqld】下添加log-bin或也可指定日志文件目录log-bin=path/文件名,若文件目录没有给出,默认文件名 是主机名 . 【注】使用mysqlbinlog 时,日志必须在bin下,log-bin=c:/program/mysql5.7/bin/bin_log
2.2.2 恢复
mysqlbinlog bin_log002 | mysql -uroot =p123 -
数据库复制:主从服务器,从做备份