DAY19.1 Java核心基础
MySQL
视图
数据库中的一张虚拟的表,允许不同用户和不同程序以不同的方式查询同一张表的数据
基于数据表,创建一个虚拟的表,然后可以选择需要展示的字段
为不同的用户创建不同的视图,一个视图包含薪资,另外一个不包含薪资
用法:
创建视图:
view_common视图:可以展示给员工看
view_all视图:可以展示给老板看
create view 视图名字 as select语句
-- 示例
create view view_common as select id,name from people;
create view view_all as select * from people;
使用视图(直接使用select语句):
SELECT * from view_common;
删除视图:
drop view 视图名字;
触发器:
触发器定义了一系列操作,可以在对指定表进行插入、更新或删除操作的同时自动执行这些操作
优点:
1、开发更快,因为触发器存储在数据库中,所以不必编写每个触发器在应用程序中执行的操作
2、更容易维护,定义触发器后,访问目标表,会自动调用触发器
3、业务全局实现,如果修改业务,只需要修改触发器即可,不需要修改业务代码
前置触发器
后置触发器
创建两张表:
现在需要执行一个操作,就是在更新tab1的时候同步更新tab2的数据
create TABLE tab1(
tab1_id int(11)
);
create TABLE tab2(
tab2_id int(11)
);
添加触发器:
CREATE TRIGGER t_afterinsert_on_tab1
AFTER INSERT ON tab1
FOR EACH ROW
BEGIN
INSERT INTO tab2(tab2_id) VALUES(new.tab1_id);
END;
现在给tab1添加数据:
INSERT INTO tab1(tab1_id) VALUES(1);
可以看见添加进去tab1中的数据添加进去了,而且tab2中的id也同步添加进去了
然后我们再来看同步删除
创建同步删除触发器
create trigger t_afterdelete_on_tab1
AFTER DELETE on tab1
for each row
begin
DELETE from tab2 WHERE tab2_id = old.tab1_id;
END;
删除tab1中的数据
可以看见删除tab1_id的时候同步删除了tab2_id
存储过程
是一组为了完成特定的功能的SQL语句的集合,经编译后存储在数据库中,用户通过call 存储过程名字来调用
一次编写,多次使用,避免重复查询的sql语句,存储过程是在数据库中存储和执行的,可以减少客户端和服务器之间的数据传输,提高效率
优点:
- 模块化设计,一次创建,多次调用
- 执行速度更快,如果某操作需要重复执行大量的SQL语句或者重复执行,存储过程比SQL语句执行更快
- 更加安全,对于没有权限执行存储过程的用户,可以授权他们的执行存储过程
存储过程基本形式:
create procedure 名称(参数)
方法体
参数为:出参和入参
in 参数名字 参数类型,out 参数名字 参数类型
入参的写法
传递num进去,如果num为1则插入users表中的数据为”java“,如果num为2则插入users表中的数据为”spring“
create procedure insert_str(in num int)
begin
declare name varchar(20);
if num = 1 then
set name = "java";
else
set name = "spring";
end if;
insert into users(name) values(name);
end;
调用方法call
call insert_str(1);
call insert_str(2);
可以看见数据库中添加进去一个java和spring
出参的写法:
需要写一个存储过程来查看users的数据数量
create procedure count_num(out count int)
begin
select count(*) into count from users;
end;
调用方法:
调用之后会将这个值付给@count_num,所以我们需要查询一下这个@count_num
call count_num(@count_num);
select @count_num;
删除存储过程
drop procedure 存储过程名字
流程控制语句
if
写一个存储过程来查询name或者score
create procedure select_users(in num int)
begin
if num = 1 then
select name from users;
elseif num = 2 then
select score from users;
end if;
end;
调用
call select_users(1)
call select_users(2)
可以看见传入的参数不一样查询的结果也不一样
case
将上面的示例改成case的语法,有点像java中的switch-case方法
create procedure example_case(in num int)
begin
case num
when 1 then
select name from users;
when 2 then
select score from users;
else
select * from users;
end case;
end;
调用:
call example_case(1)
call example_case(2)
call example_case(2)
while
累加1-100,用while实现累加
create procedure example_sum(out sum int)
begin
declare i int default 1;
declare s int default 0;
while i<=100 do
set s = s+i;
set i = i+1;
end while;
set sum = s;
end;
调用:
call example_sum(@sum);
select @sum;
结果是5050
删除该存储过程
drop procedure example_sum;