mysql视图管理和存储过程

视图
虚拟表
视图限制:
1.不能创建索引 不能使用子查询 包含聚合函数的视图是不可更新的

create view 视图名称 as sql查询
create view 视图名称(字段名列表) as sql查询
create view t1 as select user,uid,shell,homedir from user;
create view t2(vname,vuid,vshell,abc) as select user,uid,shell,homedir from user;

create view 视图名 as select 表别名.源字段名 as 字段别名 from 源表名 表别名 left join 源表名 表别名 on 条件
mysql> create view v3 as select t2.name as aname,t3.name as bname,t2.uid as auid,t3.uid as buid from t2 left join t3 on t2.uid=t3.uid;
mysql> create view v4 as select a.name as aname,b.name as bname,a.uid as auid,b.uid as buid from t2 a left join t3 b on a.uid=b.uid;
or replace 覆盖创建已存在的视图
create or replace view 视图名 as slect 查询
create or replace view v2 as select * from t1;

local cascaded(默认) 决定检查范围的选项

algorithn=undefined未定义|merge替换方式| temptable 具体方式

local 仅检查视图的创建条件
CASCADED 同时要满足基表的限制 (默认值)
mysql> create view v5 as select * from user2 where uid<=10 with check option;
uid将会受到检查限制不能大于10
视图的基表也可以是一个视图 ,也必须同时满足视图和基视图的check option限制条件

存储过程
mysql里的脚本

mysql> create procedure p1() begin select count(name) from db4.user;
-> end
-> //建立存储过程
mysql> select * from mysql.proc where name=”p1”\G 查看存储过程代码
call 存储过程名() 调用存储过程
drop 存储过程名 删除存储过程
系统环境:会话变量和全剧变量
全局变量
用户变量
局部变量 不加@
select name into 变量名 from
mysql> create procedure p2() begin declare x int default 10; declare y char(10); set y = “lee”; select x;select y;end//

变量参数类型 in 输入参数 给存储过程传值

mysql>delimiter //
-> create procedure p4(in shellname char(20)) begin select count(name) from user where shell=shellname;
-> end
-> //

create procedure p5(out number int(2)) begin set number = 10;
    -> select number;
    -> select count(id) into number from user;
    -> select number;
    -> end
    -> //

    .

流程控制
条件判断表示方式

if 条件;then

end if

mysql> create procedure showlines(in numbers int(2))
-> begin
-> select id name,password from db9.user limit numbers;
-> end
-> //

mysql> create procedure showlines2(in numbers int(2))into
-> begin
-> if numbers is null then
-> select id,name,password from db4.user limit 1;
-> else
-> select id,name,password from db4.user limit numbers;
-> end if;
-> end
-> //
ysql> set @x=null;
Query OK, 0 rows affected (0.00 sec)

mysql> call showlines2(@x);
+—-+——+———-+
| id | name | password |
+—-+——+———-+
| 1 | root | x |
+—-+——+———-+
1 row in set (0.00 sec)
如果变量numbers未赋值,会显示第一行
循环结构
while 条件 do
执行的命令
end while

mysql> delimiter //
mysql> create procedure showlines3(in numbers int(2))
-> begin
-> declare x int(2) default 1;
-> while x <= numbers do
-> select x;
-> set x = x + 1;
-> end while;
-> end
-> //
输入值时显示表user前20行的偶数行
create procedure show3(in numlines int(2))
-> begin
-> declare x int(2) default 1;
-> declare useruid int(2);
-> while x <= numlines do
-> select uid into useruid from user where id = x;
-> if useruid % 2 = 0 then
-> select name,uid from user where id=x;
-> end if;
-> set x = x + 1;
-> end while;
-> end
-> //

loop
循环体
....
end loop
create procedure loop2()
begin
declare x int(2) default 1;
loab1:loop
select x;
set x = x + 1;
if x = 50 then
 leave loab1;
 end if;
end loop;
end
//

repeat
执行的名;

until 条件
end repeat

mysql> delimiter //
mysql> create procedure repeat2()
-> begin
-> declare x int(2) default 1;
-> repeat
-> select x;
-> set x = x + 1;
-> until x = 10
-> end repeat;
-> end
-> //

leave  标签名;  结束循环
iterate  放弃本次循环 进入下一次循环
mysql> create procedure loop4()
-> begin
-> declare x int(2) default 1;
-> loab1:while x <= 100 do
-> if x % 5 = 0 or x regexp 5 then
-> select x;
-> else
-> set x = x + 1;
-> iterate loab1;
-> end if;
-> set x = x + 1;
-> end while;
-> end
-> //
delimiter //
create procedure loop7()
begin
declare x int(2) default 1;
loab1:repeat
if x % 5 = 0 or x regexp 5 then
select x;
else
iterate loab1;
set x = x + 1;
end  if;
set x = x + 1;
until x = 100
end repeat;
end
//

猜你喜欢

转载自blog.csdn.net/weixin_42825965/article/details/82528489
今日推荐