视图

视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集,并可以将其当作表来使用。


创建视图:

1
2
create  view  v1  as
select  from  student  where  id > 100;

今后可以直接通过:

1
select  from  v1;   #直接访问学生ID大于100的信息

删除视图:

1
drop  view  v1;

修改视图:

1
2
alter  view  v1  as
select  id, name  from  student  where  id<10  and  name =dandan;

注意:使用视图时,将其当作表进行操作即可,由于视图是虚拟表,所以使用其对真实表进行创建、更新和删除操作,仅能做查询用。


触发器

对某个表进行【增/删/改】操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行【增/删/改】前后的行为。


创建触发器:

1
2
3
4
5
6
7
delimiter //
create  trigger  tg_before_insert_student before  insert  on  student  for  each row
begin
     if new. name == 'alex'  then
     insert  into  student_back ( name values  ( 'alex_back' );
end  //
delimiter ;

也可以用 after insert 表示插入之后执行触发器中语句,还有其他操作:before update、after update、before delete 、after delete

注意:NEW表示即将插入的数据行,OLD表示即将删除的数据行


删除触发器:drop tgigger tg_before_insert_student


触发器无法由用户直接调用,而知由于对表的【增/删/改】操作被动引发的。


存储过程


存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 创建存储过程
 
delimiter //
create  procedure  p1()
BEGIN
     select  from  t1;
END //
delimiter ;
 
 
 
-- 执行存储过程
 
call p1()

对于存储过程,可以接受参数,其参数类型有三类:

    in 只用于传入参数

    out 用于返回值

    inout 即可以传入又可以当作返回值


有参数的存储过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-- 创建存储过程
delimiter \\
create  procedure  p1(
     in  i1  int ,
     in  i2  int ,
     inout i3  int ,
     out  r1  int
)
BEGIN
     DECLARE  temp1  int ;
     DECLARE  temp2  int  default  0;
     
     set  temp1 = 1;
 
     set  r1 = i1 + i2 + temp1 + temp2;
     
     set  i3 = i3 + 100;
 
end \\
delimiter ;
 
-- 执行存储过程
set  @t1 =4;
set  @t2 = 0;
CALL p1 (1, 2 ,@t1, @t2);
SELECT  @t1,@t2;

结果集加返回值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
delimiter //
                     create  procedure  p2(
                         in  n1  int ,
                         inout n3  int ,
                         out  n2  int ,
                     )
                     begin
                         declare  temp1  int  ;
                         declare  temp2  int  default  0;
 
                         select  from  v1;
                         set  n2 = n1 + 100;
                         set  n3 = n3 + n1 + 100;
                     end  //
                     delimiter ;

事务型存储过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
delimiter \\
                         create  PROCEDURE  p1(
                             OUT  p_return_code tinyint
                         )
                         BEGIN 
                           DECLARE  exit handler  for  sqlexception 
                           BEGIN 
                             -- ERROR 
                             set  p_return_code = 1; 
                             rollback
                           END
                          
                           DECLARE  exit handler  for  sqlwarning 
                           BEGIN 
                             -- WARNING 
                             set  p_return_code = 2; 
                             rollback
                           END
                          
                           START  TRANSACTION
                             DELETE  from  tb1;
                             insert  into  tb2( name ) values ( 'seven' );
                           COMMIT
                          
                           -- SUCCESS 
                           set  p_return_code = 0; 
                          
                           END \\
                     delimiter ;

游标:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
delimiter //
                     create  procedure  p3()
                     begin 
                         declare  ssid  int -- 自定义变量1  
                         declare  ssname  varchar (50);  -- 自定义变量2  
                         DECLARE  done  INT  DEFAULT  FALSE ;
 
 
                         DECLARE  my_cursor  CURSOR  FOR  select  sid,sname  from  student;
                         DECLARE  CONTINUE  HANDLER  FOR  NOT  FOUND  SET  done =  TRUE ;
                         
                         open  my_cursor;
                             xxoo: LOOP
                                 fetch  my_cursor  into  ssid,ssname;
                                 if done  then 
                                     leave xxoo;
                                 END  IF;
                                 insert  into  teacher(tname)  values (ssname);
                             end  loop xxoo;
                         close  my_cursor;
                     end   //
                     delimter ;

动态执行SQL:

1
2
3
4
5
6
7
8
9
10
delimiter \\
                     CREATE  PROCEDURE  p4 (
                         in  nid  int
                     )
                     BEGIN
                         PREPARE  prod  FROM  'select * from student where sid > ?' ;
                         EXECUTE  prod USING @nid;
                         DEALLOCATE  prepare  prod; 
                     END \\
                     delimiter ;

删除存储过程:drop procedure proc_name;

执行存储过程:

1
2
3
4
5
6
7
8
9
10
-- 无参数
call proc_name()
 
-- 有参数,全in
call proc_name(1,2)
 
-- 有参数,有in,out,inout
set  @t1=0;
set  @t2=3;
call proc_name(1,2,@t1,@t2)

函数

MySql中的函数分为:内置函数、自定义函数

内置函数参考:

http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/functions.html#encryption-functions

自定义函数:

1
2
3
4
5
6
7
8
9
10
11
delimiter \\
create  function  f1(
     i1  int ,
     i2  int )
returns  int
BEGIN
     declare  num  int ;
     set  num = i1 + i2;
     return (num);
END  \\
delimiter ;