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
//