mysql基本视图与存储过程、循环

mysql>create table db9.user(

->name varchar(100),

->password varchar(100),

->uid int,

->gid int,

->comment varchar(100),

->homedir varchar(100),

->shell varchar(100));

QueryOK, 0 rows affected (0.45 sec)


mysql>system cp /etc/passwd /var/lib/mysql-files/

mysql>system ls /var/lib/mysql-files/

passwd

mysql>load data infile "/var/lib/mysql-files/passwd" into tabledb9.user fields terminated by ":" lines terminated by "\n";



mysql>Alter table db9.user add id int primary key auto_increment first;



cascadede

Showcreate view v3;

Uid=35

V3uid >=20


V1uid <=30 --->user2 --->35



Nameuid shell user2


视图的作用可以限制


Grantall on db9.v1 to auser@”%” identified by “123456”;


Mysql存储过程

什么是存储过程

数据库中保存的一系列命令的集合

编写存储过程时,可以使用变量、条件判断、流程控制等

存储过程,就是Mysql中的脚本

存储过程的优点

提高性能

可减轻网络负担

可以防止对表的直接访问

避免重复的sql操作

修改提示符

Delimiter//

创建存储过程

Createprocedure 名称()

Begin

Select* from studydb.user where name=”root”;

End

//

Delimiter;

Createdatabase db10;


Delimiter//

Createprocedure say1()

Begin

Select* from db9.user;

Select* from mysql.user where user=”root”;

End

//

Delimiter;


Callsay1();

Callsay1;

Showprocedure status \G;

mysql>desc mysql.proc \G;


mysql>select db,name ,type from mysql.proc;

mysql>select db,name ,type from mysql.proc where name=”say1”;



mysql>select * from mysql.proc where name="say1" \G;

***************************1. row ***************************

db: db9

name: say1

type: PROCEDURE

specific_name: say1

language: SQL

sql_data_access:CONTAINS_SQL

is_deterministic: NO

security_type: DEFINER

param_list:

returns:

body: Begin

Select* from db9.user;

Select* from mysql.user where user=”root”;

End

definer:root@localhost

created:2018-06-30 10:23:22

modified:2018-06-30 10:23:22

sql_mode:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

comment:

character_set_client:utf8

collation_connection:utf8_general_ci

db_collation:latin1_swedish_ci

body_utf8: Begin

Select* from db9.user;

Select* from mysql.user where user=”root”;

End

1row in set (0.00 sec)


ERROR:

Noquery specified


mysql>

mysql>select body from mysql.proc where name="say1" \G;

***************************1. row ***************************

body:Begin

Select* from db9.user;

Select* from mysql.user where user=”root”;

End

1row in set (0.00 sec)


ERROR:

Noquery specified


mysql>


Dropprocedure say1; //name=say1; 调用时加括号


编写功能体代码时可以使用变量,条件判断,流程控制(if循环) 算数计算 sql命令

mysql>delimiter //

mysql>create procedure p1()

->begin

->select count(name) from db9.user where shell="/bin/bash";

->end

->//

QueryOK, 0 rows affected (0.00 sec)


mysql>delimiter ;

mysql>call p1();

+-------------+

|count(name) |

+-------------+

| 2 |

+-------------+

1row in set (0.00 sec)


QueryOK, 0 rows affected (0.00 sec)


mysql>


变量类型:会话变量全局变量 用户变量(set@x=9set@name=”yaya” select @x 用户退出时消失)局部变量(在begin/end有效 declare定义declare y=9 不用加@


存储过程要在库里

Usedb10;

delimiter//

createprocedure p2()

begin

Declare x int default77;

Declare y char(10);

Set y=”yaya”;

Select x;

Select y;

end

//

Delimiter ;

Select @x;

Call p2();


Show global variables; //查看全局变量

Show sessionvariables; //查看会话变量

Set sessionsort_buffer_size=40000; //修改当前的会话变量缓存

Show global variables;

Show global variablesLIKE "%version%";

Show global variablesLIKE "%sort_buffer%";

Select@@hostname;//系统环境变量输出


自定义变量符值

Set @y=3;

Select max(uid) into@y from db9.user;

Select @y;


Delimiter //

Create procedure p3()

Begin

Declare x int default77;

Select x;

Select max(uid) into xfrom db9.user;

Select x;

End

//

Delimiter ;

Call p3;


算数运算

+ - * /(有小数)div 求平均数只是整数


Set @i=1;

Set @j=2;

Set @z=@i*@j;

Select @z;


mysql> delimiter//

mysql> createprocedure p4()

-> begin

-> declare xint;

-> declare yint;

-> declare zint;

-> selectcount(shell) into x from db9.user where shell="/bin/bash";

-> selectcount(shell) into y from db9.user where shell="/sbin/nologin";

-> set z=x+y;

-> select z;

-> end

-> //

Query OK, 0 rowsaffected (0.00 sec)


mysql> delimiter ;

mysql> call p4();


存储过程参数类型

Create procedurep5(参数1,参数2...)

Begin

End

In 输入类型的参数(默认)

Out 输出类型的参数

Inout 输入输出类型参数

指定存储过程参数的格式:类型 参数名 类型(宽度)


Delimiter //

Create procedure p5(inusername char(20))

Begin

Select name fromdb9.user where name=username;

End

//

Delimiter ;

Call p5(“tom”);

Call p5(“bob”);


参数变量局部变量不加@

In类型参数不能被改变,传值,参数可以是常量

Set @name=”test”

Call p5(@name);



Delimiter //

Create procedure p6(inusername char(20),in uid int(2))

Begin

Select name fromdb9.user where name=username and uid=uid;

End

//

Delimiter ;


mysql> set@name="mysql";

Query OK, 0 rowsaffected (0.00 sec)


mysql> set @uid=27;

Query OK, 0 rowsaffected (0.00 sec)


mysql> callp6(@name,@uid);


Out 输出类型的参数该参数可以修改并返回

Delimiter //

Create procedurep7(out num int(2))

Begin

Select num;

Set num=7;

Select num;

Select count(name)into num from db9.user where shell !=”/bin/bash”;

Select num;

End

//

Delimiter ;

Call p7();

mysql> call p7(88);

ERROR 1414 (42000):OUT or INOUT argument 1 for routine db9.p7 is not a variable or NEWpseudo-variable in BEFORE trigger

mysql>


Set @x=88;

Call p7(@x); //必须是变量符值


Drop procedure p7;




mysql> delimiter //

mysql> createprocedure p71(out num int(2))

-> begin

-> select num;

-> set num=7;

-> select num;

-> selectcount(name) into num from db9.user where shell !="/bin/bash";

-> select num;

-> end

-> //

Query OK, 0 rowsaffected (0.00 sec)


mysql> delimiter ;

mysql> call p71();

ERROR 1318 (42000):Incorrect number of arguments for PROCEDURE db9.p71; expected 1, got0

mysql> call p71(7);

ERROR 1414 (42000):OUT or INOUT argument 1 for routine db9.p71 is not a variable or NEWpseudo-variable in BEFORE trigger

mysql> callp71(@x);

+------+

| num |

+------+

| NULL |

+------+

1 row in set (0.00sec)


+------+

| num |

+------+

| 7 |

+------+

1 row in set (0.00sec)


+------+

| num |

+------+

| 39 |

+------+

1 row in set (0.00sec)


Query OK, 0 rowsaffected (0.00 sec)


mysql>


Out类型不会接受参数,只能在里面接受参数传给外部,参数只作为占位


Inout类型






mysql> delimiter //

mysql> createprocedure p711(inout num int(2))

-> begin

-> select num;

-> set num=7;

-> select num;

-> selectcount(name) into num from db9.user where shell !="/bin/bash";

-> select num;

-> end

-> //


mysql> delimiter ;


mysql> set @x=9;

Query OK, 0 rowsaffected (0.00 sec)


mysql> callp711(@x);

+------+

| num |

+------+

| 9 |

+------+

1 row in set (0.00sec)


+------+

| num |

+------+

| 7 |

+------+

1 row in set (0.00sec)


+------+

| num |

+------+

| 39 |

+------+

1 row in set (0.00sec)


Query OK, 0 rowsaffected (0.00 sec)


mysql>


条件判断 与查询命令select相同


流程控制

If 条件测试then

代码

End if;


If 条件测试then

代码

Else

代码

End if;

Drop procedure ifexists say;

Delimiter //

Create procedure p8(innum int(2))

Begin

If num <= 10 then

Select * from db9.userwhere id <=num;

End if;

End

//

Delimiter ;

Call p8(3);

Set @x=7;

Call p8(@x);


Select @w;

Call p8(@w);


Delimiter //

Create procedure p9(in num int(2) )

Begin

If num is null then

Select * from db9.userwhere id =2;

Else

Select * from db9.userwhere id <= num;

End if;

End

//

Delimiter ;

mysql> Select @w;

+------+

| @w |

+------+

| NULL |

+------+

1 row in set (0.00sec)


mysql> Call p9(@w);

+----+------+----------+------+------+---------+---------+---------------+

| id | name | password| uid | gid | comment | homedir | shell |

+----+------+----------+------+------+---------+---------+---------------+

| 2 | bin | x | 1 | 1 | bin | /bin | /sbin/nologin |

+----+------+----------+------+------+---------+---------+---------------+

1 row in set (0.00sec)


Query OK, 0 rowsaffected (0.00 sec)


mysql> set @x=7;

Query OK, 0 rowsaffected (0.00 sec)


mysql> Call p9(@x);

+----+----------+----------+------+------+----------+----------------+----------------+

| id | name |password | uid | gid | comment | homedir | shell |

+----+----------+----------+------+------+----------+----------------+----------------+

| 1 | root | x | 0 | 0 | root | /root | /bin/bash |

| 2 | bin | x | 1 | 1 | bin | /bin | /sbin/nologin |

| 3 | daemon | x | 2 | 2 | daemon | /sbin | /sbin/nologin |

| 4 | adm | x | 3 | 4 | adm | /var/adm | /sbin/nologin |

| 5 | lp | x | 4 | 7 | lp | /var/spool/lpd | /sbin/nologin |

| 6 | sync | x | 5 | 0 | sync | /sbin | /bin/sync |

| 7 | shutdown | x | 6 | 0 | shutdown | /sbin | /sbin/shutdown |

+----+----------+----------+------+------+----------+----------------+----------------+

7 rows in set (0.00sec)


Query OK, 0 rowsaffected (0.00 sec)


mysql>


Select count(id) fromdb9.user;

Select name,uid fromdb9.user;


Delimiter //

Create procedure p10()

Begin

Declare i int(2);

Set i=1;

While i <=5 do //set i=10 while i <= 20 // end while select i //6

Set i=i+1;

Select * from db9.userwhere uid=i;

End while;

Select i;


End

//

Delimiter ;

Call p10();


mysql> createprocedure p11()

Begin

declare i int(2);

declare j int(2);

select count(id) intoi from db9.user; set j=1;

while j <= i do ifj % 2 = 0 then select * from db9.user where id = j;

end if;

set j=j+1;

end while;

End

//

Call11();


Delimiter //

Create procedure p12()

Begin

Declare j int(2);

Set j=1;

Loop

Select j;

Set j=j+1;

End loop;

End

//

Delimiter ;


Call p12();


Delimiter //

Create procedure p13()

Begin

Declare j int(2);

Set j=1;

Repeat

Select j;

Set j=j+1;

Until j=6

End repeat;

End

//

Delimiter ;

mysql> call p13();



Delimiter //

Create procedure p14()

Begin

Declare j int(2);

Set j=1;

Repeat

Select j;

Set j=j+1;

Until j=1

End repeat;

End

//

Delimiter ;

mysql> call p14();



Delimiter //

Create procedurep141()

Begin

Declare j int(2);

Set j=1;

Repeat

Select j;

Set j=j+1;

Until j=2

End repeat;

End

//

Delimiter ;

mysql> call p141();

LEAVE 标签名 结束循环的执行

ITERATE 标签名结束当前循环,并执行下一次循环。

Shell break contunue


Delimiter //

Create procedure p15()

Begin

Declare i int(2);

Set i = 1;

While i <= 10 do

Select i;

Set i = i + 1;

End while;

End

//

Delimiter ;



Delimiter //

Create procedure p16()

Begin

Declare i int(2);

Set i = 1;

loop

Select i;

Set i = i + 1;

End loop;

End

//

Delimiter ;


ITERATE while


LEAVE loop repeat


Delimiter //

Create procedure p15()

Begin

Declare i int(2);

Set i = 0;

Loab1:while i < 10do

Set i = i + 1;

If i =7 then

ITERATE loab1;

End if;

Select i;

End while;

End

//

Call p15();




猜你喜欢

转载自blog.csdn.net/weixin_40018205/article/details/80944727