Mysql - 06

目录

1   数据库的备份和恢复

1.1     备份

1.2     恢复

1.3     热备份

2   数据库端编程(了解)

3   mysql 数据库编程语法

3.1     变量

3.1.1 mysql的环境变量

3.1.2 会话变量

3.1.3 局部变量

4   存储过程

4.1     创建存储过程

4.2     调用存储过程

4.3     查看存储过程

4.4     删除存储过程

4.5     存储过程的参数

5   流程控制

5.1     if

5.2     case

5.3     while

5.4     loop

5.5     repeat

6   函数

6.1     创建函数

6.2     查看函数

6.3     删除函数

7   触发器

7.1     创建触发器

7.2     查看触发器

 

7.3     删除触发器


1   数据库的备份和恢复

1.1     备份

l  mysqldump 命令

l  操作系统命令行执行

l  指定的字符编码是服务器数据表中存储的字符编码

l  hr>d:\hr.sql
数据库>文件

mysqldump -uroot -p --default-character-set=utf8 hr>d:\hr.sql

1.2     恢复

l  mysql 命令

l  在系统命令行执行

l  恢复时,要指定恢复到哪个数据库

l  要恢复到新库,首先要手动创建这个库

l  编码设置服务器存储什么编码

l  hr2 库<文件

mysql> create database hr2 charset utf8;

在系统命令行执行恢复:

mysql -uroot -p --default-character-set=utf8 hr2

1.3     热备份

双机热备,主从复制


2   数据库端编程(了解)

l  存储过程

l  函数

l  触发器


3   mysql 数据库编程语法

3.1     变量

l  mysql的环境变量

l  会话变量

l  局部变量

3.1.1 mysql的环境变量

用环境变量参数,控制mysql的执行方式和特性

 

l  查看变量

show variables;

show variables like 'tx%';

show variables like 'char%';

 

l  修改mysql环境变量

set character_set_client=utf8; 

   只在当前会话期间有效

 

set global character_set_client=utf8;

   全局设置,重启后仍有效,

   对当前会话不会立即生效

 

3.1.2 会话变量

在一次会话期间有效的变量

set @v1=25523;

select @v1;

select @v1+5;

 

3.1.3 局部变量

在一个局部的代码块中有效

begin

   declare v2 varchar(5);

   declare v3 int default 100;

   set v2=5;

   set v3=10000;

   set @v1=5;

end


4   存储过程

存储在数据库服务器上的一段过程代码

4.1     创建存储过程

l  存储过程内部代码,每一句必须用分号结束

l  创建存储过程的代码,需要更换一个新的结束符

l  用 delimiter 更换结束符:

delimiter //

delimiter ;

 

use db1;

delimiter //

create procedure p1()

begin

   declare v1 int default 10;

   select v1;

end//

delimiter ;

4.2     调用存储过程

call p1();

4.3     查看存储过程

查看全部存储过程

show procedure status\G

查看db1库中的存储过程

show procedure status where db='db1'\G

查看创建代码

show create procedure p1\G

4.4     删除存储过程

drop procedure p1;

drop procedure if exists p1;

4.5     存储过程的参数

l  in    输入参数

l  out   输出参数

l  inout 既能作为输入也能作为输出

 

 

存储过程练习

用存储过程同时插入学生数据和学生的联系方式数据

delimiter //

create procedure save_stu(

in name varchar(10),

in age int,

in tel varchar(20),

out xid int)

begin

    -- 定义变量,保存生成的学生id

    declare id int;

    -- 1.插入学生数据

    insert into xuesheng(name,age)

    values(name,age);

    -- 2.取出生成的id,存到局部变量id

    set id=last_insert_id();

    -- 3.插入联系方式表

    insert into lianxi(xs_id,tel)

    values(id,tel);

    -- 4.id放入输出参数

    set xid=id;

end//

 

delimiter ;

 

调用测试

call save_stu('aaa',19,'123123123',@stuid);

select @stuid;

select from xuesheng;

select from lianxi;


5   流程控制

l  if

l  case

l  while

l  loop

l  repeat

 

5.1     if

if 条件 then

   代码

end if;

 

if 条件 then

   代码1

else

   代码2

end if;

 

5.2     case

case

   when 条件1 then 代码1

   when 条件2 then 代码2

   else 代码3

end case;

case 变量或表达式

   when 值1 then 代码1

   when 值2 then 代码2

   else 代码3

end case;

 

5.3     while

while 执行条件 do

   代码

end while;

 

5.4     loop

lp: loop  -- 循环命名

   代码

   if 退出条件 then

       -- 退出循环

       leave lp;  -- 指定循环的名字

   end if;

   代码

end loop;

 

5.5     repeat

repeat

    代码

until 退出条件 end repeat;

 

 

流程控制测试

 

set names gbk;

 

drop procedure if exists p2;

 

delimiter //

 

create procedure p2(in a int)

begin

    if a>10 then

        select '比10大' c;

    else

        select '比10小或等于10' c;

    end if;

    

    case a

        when then select '一' c;

        when 10 then select '十' c;

        else select '不是一不是十' c;

    end case;

end//

 

delimiter ;

 

调用测试

call p2(1);

call p2(5);

call p2(10);

call p2(15);

 

 

 

循环插入5条数据

use db1;

 

drop table if exists tb1;

 

create table tb1(

a int

);

 

 

drop procedure if exists p3;

 

delimiter //

create procedure p3(in n int)

begin

    -- 定义控制循环次数的变量

    declare i int default 1;

 

    while i<=n do

        insert into tb1 values(i);

        set i=i+1;

    end while;

 

    set i=1; -- 重置变量i的值

    lp: loop

        insert into tb1 values(i);

        if i=n then

            leave lp;

        end if;

        set i=i+1;

    end loop;

 

    set i=1;

    repeat

        insert into tb1 values(i);

        set i=i+1;

    until i>n end repeat;

end //

delimiter ;

-- 调用测试

call p3(5);

select from tb1;


6   函数

函数和存储过程类似,

函数有返回的计算结果,返回值

6.1     创建函数

ab次方

delimiter //

create function fn_pow(a double, b int)

returns double -- 定义返回值类型

begin

    -- 控制循环次数的变量

    declare i int default 0;

    -- 用来保存结果的变量

    declare r double default a;

 

    while ido

        set r=r*a;

        set i=i+1;

    end while;

 

    return r; -- 返回计算结果

end//

delimiter ;

 

-- 调用测试

select fn_pow(5,3);

6.2     查看函数

所有函数

show function status\G

 

db1库的函数

show function status where db='db1'\G

 

函数创建代码

show create function fn_pow\G

 

6.3     删除函数

drop function if exists fn_pow;

存储过程和函数练习

*) 向表中插入大量随机字符串

*) 定义函数 fn_rand() 用来产生一个随机字符串

*) 定义存储过程 proc_gendata() 用来向表中添加大量数据

 

 

*) 定义函数fn_rand()产生长度是[a,b)范围的随机字符串

drop function if exists fn_rand;

delimiter //

create function fn_rand(a int, b int)

returns varchar(255)

begin

    -- 所有的可选字符

    declare s0 varchar(800)

default 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府称太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严龙飞';

    declare n int; -- 随机长度

    -- 保存结果

    declare r varchar(255) default '';

    -- 控制循环次数,执行n

    declare i int default 0;

    -- 随机定位位置

    declare j int;

 

-- 随机长度[a,b)

    set n=truncate(a+(b-a)*rand(),0);

    -- 循环n

    while ido

        -- j随机定位

-- [1,char_length(s0)+1)

set j=truncate(

1+char_length(s0)*rand(),0);

       

set r=concat(

r,substring(s0,j,1));

 

        set i=i+1;

    end while;

 

return r;

end//

delimiter ;

 

-- 调用测试

select fn_rand(3,6);

 

 

 

*) 准备两张表,一张内存表tm,一张磁盘表t

create table tm(

a varchar(20)

)engine=memory charset=utf8;

 

create table t(

id int primary key auto_increment,

a varchar(20)

)engine=innodb charset=utf8;

 

 

 

*) 存储过程 proc_gendata() 批量向 t 表存入n条数据

 

drop procedure if exists proc_gendata;

delimiter //

create procedure proc_gendata(in n int)

begin

    -- 控制次数的变量

    declare i int default 0;

    -- 循环向内存表tm插入n条数据

    while ido

        insert into tm

values(fn_rand(3,6));

        set i=i+1;

    end while;

    -- tm表所有数据批量导入t

    insert into t(a) select from tm;

    -- 清空内存表tm

    delete from tm;

end //

delimiter ;

 

-- 调用测试

call proc_gendata(10);

select from t;

 

 

select * from t where a like 'ab%';

explain select * from t where a like 'ab%';

创建索引

create index t_a_index on t(a);


7   触发器

执行增删改操作时,可以触发一段代码执行

 

l  执行时间

n  before insert

n  before update

n  before delete

n  after insert

n  after update

n  after delete

 

l  一张表,最多创建6个触发器

 

l  两个隐含的对象

n  old  -旧的数据行

u  insert  没有

u  update  有

u  delete  有

n  new  -新的数据行

u  insert  有

u  update  有

u  delete  没有

n  访问old或new中字段的值

u  old.a

u  new.c

 

7.1     创建触发器

user 表中添加字段 updated 最后修改时间

alter table user

add updated datetime;

 

添加触发器,修改一行数据时,自动在updated字段填入系统当前时间

delimiter //

create trigger user_before_update

before update

on user

for each row

begin

    set new.updated=now();

end//

delimiter ;

 

测试

update user set password='222';

select from user;

 

7.2     查看触发器

进入系统库 information_schema

use information_schema

 

查询 triggers 表

select * from triggers\G

 

查看指定库中指定表的触发器

select * from triggers

where TRIGGER_SCHEMA='db1'

and EVENT_OBJECT_TABLE='user'\G

 

7.3     删除触发器

drop trigger user_before_update;

 

你可能感兴趣的:(MYSQL)