MySQL基础(二)

  一、视图

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

select * from (select student_id,num from score where course_id=3)as A 
where A.num > 60
临时表搜索

  1、创建视图

-- 语法:
--        create view 视图名称 sql语句

create view V1 AS select student_id,num from score where course_id=3
创建实例

  2、删除视图

-- 语法:
--        frop view 视图名称
drop view v1
删除视图v1

  3、修改视图

-- 语法:
--        alter view 视图名称 as sql语句

alter view v1 as select student_id,num from score 
where course_id=1
修改视图v1

  4、使用视图

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

select * from v1
使用视图v1

  二、触发器

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

  1、创建基本语法

--  插入前:

create trigger 触发器名称 before insert on 表名 for each row
begin
    ...
end

-- 插入后:

create trigger 触发器名称 after insert on 表名 for each row
begin
    ...
end

-- 删除前:

create trigger 触发器名称 before delete on 表名 for each row
begin
    ...
end

-- 删除后:
create trigger 触发器名称 after delete on 表名 for each row
begin
    ...
end

-- 更新前:
create trigger 触发器名称 before update on 表名 for each row
begin
    ...
end

-- 更新后:
create trigger 触发器名称 after update on 表名 for each row
begin
    ...
end
6个基本语法
delimiter //
create trigger tri_be_ins_t1 before insert on teacher for each row 
begin 
    insert into class(caption) values('三年一班');
end //
delimiter ;
插入前触发器
delimiter //
create trigger tri_be_ins_t2 after insert on teacher for each row 
begin 
    insert into class(caption) values('一年三班');
end //
delimiter ;
插入后触发器

  特别的:new表示即将插入的数据行,

      old表示即将删除的数据行。

--   new:

delimiter //
create trigger tri_be_ins_t3 after insert on student for each row 
begin 
    insert into teacher(tname) values(new.sname);
end //
delimiter ;

--  insert into student(gender,class_id,sname) values('女',3,'友友')
此时,new.sname = '友友'    new.列名 取即将插入的数据行对应的内容

--   old:

delimiter //
create trigger tri_be_del_t2 before delete on student for each row 
begin 
    insert into teacher(tname) values(old.sname);
end //
delimiter ;

--  delete from student where sid=19
此时,old.sname = '小三'    old.列名 取即将删除的数据行对应的内容
new 和 old

  2、删除触发器

--   语法:
--       drop trigger 触发器名

drop trigger tri_be_del_t2
删除触发器语法

  3、使用触发器

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

drop trigger tri_be_del_t2
触发触发器

  三、存储过程

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

  1、创建存储过程

-- 创建存储过程

delimiter //
create procedure p1()
begin 
    select * from teacher;
end //
delimiter ;


--  调用存储过程

call p1()
无参数存储过程

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

  • in          仅用于传入参数用;
  • out        仅用于返回值用(伪造的返回值);
  • inout     既可以传入参数又可以当作返回值(伪造的返回值)。
--  创建存储过程:

delimiter //
create procedure p2(
    in t1 int,
    out t2 int,
    inout t3 int 
)
begin 
    declare temp1 int;
    declare temp2 int default 2;
    
    set temp1=1;
    set t2=t1+t3+temp1+temp2;
    set t3 = t3 + 10;
end //
delimiter ;

--  调用存储过程:

set @s1=0;
set @s2=2;
call p2(1,@s1,@s2);
select @s1,@s2;
有参数存储过程
delimiter //
create procedure p3()
begin 
    select * from teacher;
end //
delimiter ;

--  执行存储过程,里面的SQL语句,有查询结果,返回对应的结果集
结果集
--  创建存储过程:

delimiter //
create procedure p4(
    in t1 int,
    out t2 int,
    inout t3 int 
)
begin 
    select * from teacher where tid < t1;
    set t2 = t3 + t1 ;
    set t3 = 99;
end //
delimiter ;

--  调用存储过程:

set @s1=0;
set @s2=3;
call p4(7,@s1,@s2);
select @s1,@s2;
结果集 + out值
原文地址:https://www.cnblogs.com/Michael--chen/p/6993705.html