视图: 起到保护表的作用
show tables;
select * from student;
create view asd as(select id,name,math from student);
根据student表创建视图,dcs为视图名字,比如我只想把这三个字段暴露出去:
show tables; 查看视图
select * from dcs; 查看创建了视图的这个虚拟表,给这三个字段创建了视图
show create view dcs;查看视图的结构
delete from dcs where id=10;
删除视图里面的数据,然后分别查询视图表和原表的数据,同步被删除
update dcs set math=100 where id=1;
update student set math=99 where id=1;
分别改视图表和原表的数据,验证数据同步被修改
drop view dcs;
show create view dcs; 查看创建视图的结构,报不存在的视图表
外键约束:
1.主键约束 primary key
2.非空约束 not null
3.自增长约束 auto_increment
4.默认值约束 default
总结: 这里的4个约束,主要是约束表的字段
外键约束 foreign key 约束的是表与表之间的关系
create table duo1(id int(4) primary key,name varchar(10)) engine=innodb; 这是主表
create table duo2(sid int(4) primary key,sname varchar(10),constraint dcs foreign key
(sid) references duo1(id)) engine=innodb; 这是子表
给duo1创建一个名称为dcs的外键约束在duo2的sid字段
duo1 主表
duo2 子表
constraint dcs :约束 外键约束的名称叫dcs
foreign key (sid): 创建在duo2表的sid字段上
references duo1(id) :引用和参考的是duo1表的id字段
engine=innodb :数据库的存储引擎为innodb
如果不指定引擎,默认使用mysam,使用的这个默认引擎不起作用
show engines; 查看mysql 数据库所有引擎。
#插入数据
insert into duo1 values(1,'xiaoyi'),(2,'xiaoer');
插入数据只能插入相关的数据,没有关联的数据的插入不了
insert into duo2 values(1,'xiaosan'),(2,'xiaosi');
结论: 主表不存在的数据,在任何子表当中无法插入与子相关的数据
存储
drop procedure if exists dcs; #增强健壮性,如果dcs这个存储过程存在删除
create procedure dcs (n int) #创建一个存储过程,名字叫dcs,n就是形式参数,数据类型为int整形
begin #存储的开始
#存储过程的函数体,也可以理解为sql语句的集合
declare i int(20) default(select count(*) from qq); # declare 定义是一个变量,数据类型为int
/*drop table if exists qq; #当qq表已经存在,先删除qq这个表
create table qq(id int(20) primary key auto_increment,score int(20));
insert into qq values(1,88),(2,77),(3,56),(4,78),(5,35),(6,24),(7,27),(8,49);*/
#select * from qq;
#select * from qq where id=1;
#select * from qq where id=n;
-- -- if n=0 then
-- select count(*) from qq;
-- else
-- select max(score) from qq;
-- end if;
/*if n=0 then
select count(*) from qq;
else if n>0 && n<i then
select max(score) from qq;
else if n>=i then
select * from qq order by score desc;
else
select * from qq;
end if;
end if;
end if;*/
if n=0 then
select count(*) from qq;
else if n>0 && n<=i then
select max(score) from qq;
else
while n>i do
insert into qq(score)values(66);
set i = i+1;
end while;
end if;
end if;
select * from qq;
end
call dcs(101); #调用dcs()这个存储过程,注意,创建跟调用不能同时选中执行,先执行创建在执行调用,
# 在创建存储过程的时候设置了形参,调用时必须传实参,否则会保错。
drop table qq;
|
|