找回密码
 立即注册

推荐阅读

  • 便民服务
  • 关注我们
  • 社区新手

第11天.mysql 索引 视图 存储

[复制链接]
一.mysql索引:
1.作用:提高查询速度
索引就类似于目录,可以快速定位我想要找到的信息,每个表里都有很有多的数据,加快查询的速度。工作场景(一般都是开发进行创建索引)

2.如何建立索引
索引是给表里面的字段进行添加索引,增加数据的查询效率
   如何给表里面的字段添加索引?
创建一个索引 为emp表 sid字段创建一个索引  (表emp之前就存在)
普通索引:
create index sid_index on emp (sid);
select * from emp;
查看索引:


同时创建多个索引:
create index emp_index on emp(dept1,name);
show index from emp


唯一索引:
表字段的值是唯一的不重复,才可以进行创建唯一索引
select * from emp

create unique index emp_sid on emp(sid);
show index from emp;

主键索引:
在创建表的过程当中 如果给表添加了主键约束,那么会自动生成主键索引 primary key ;
create table cc(id  int(4)primary key ,name char(20));
show index from cc ;


给表添加主键也可以同时创建索引:
alter  table aa change id  id  int (4)primary key ;

删除约束同时也会自动删除主键索引
alter table aa drop primary key;


索引的创建并不是测试人员创建的,是由开发人员进行创建的
索引的优点:
  1. 增加查询速度---> 服务器对所针对的索引做扫描查询 ——> 如果没有创建索引 服务器会做全局的扫描查找数据,耗时会增加
  2. 通过创建唯一索引 可以保证我表当中的每一行数据不重复
  3. 增加多表链接的速度,表与表连接速度

索引的缺点:
  ● 创建和维护索引需要时间——> 随着数据的增加 ,耗时也增加
  ● 索引是占用物理内存,并不是索引越多越好
  ● 如果表当中的字段有很多重复的值,就没有创建索引的必要
  ● 针对非常小的表(几个字段),这种情况查询时做全局的扫描更加高效,没必要创建索引

试图——> 视图表——>虚拟表:——> view
根据原表创建一张虚拟表,虚拟表当中可以隐藏字段内容

创建一张视图表:
create view emp_view as(select sid,name,worktime_start,dept1 from emp);
select * from emp;
查询视图表
select * from emp_view;

视图表和原表有哪些关联:
1修改视图表的内容
update emp_view set name="牛牛1" where sid = 1789;
select * from emp;
查询视图表
select * from emp_view;

insert into emp values(1890,"周华",“1879-01-03”,18,18000,101);

视图:
使用视图,用户不需要关心表的结构,他可以直接针对视图表做操作
安全:操作视图表的用户只能查询到允许查看的结果集,可以对表的字段数据进行权限管理,他的列数据限制不了。
修改原表的数据同步视图表,修改视图表也会同步原表

面试当中问题?
什么是ddl 语句 ?  什么是dml 语句?
dml :数据库操作指令,使用户能够查询数据库以及操作已有数据库中的数据:——> select   insert  update  delete 属于dml语句
ddl :数据库定义语言——> create  show drop  truncate  属于ddl语句   常见的DDL语句例如:创建数据库:CREATE DATABASE;创建表:CREATE TABLE。


外键约束——>约束的是表与表
作用:保证表与表之间的数据一致性


外键约束:foreign key
主键约束:primary key
非空约束:not null
自增长约束:auto_crement
默认值约束:default

注意:
想要设置外键约束需要设置 mysql 引擎-->5.1.73版本
它默认的mysql引擎是 MYSIAM  换成innodb mysql,5.7版本以上都是默认引擎都是innodb 不需要手动更换
创建a_1主表:
create table a_1 (id int(4)primary key,name varchar(20))engine = innodb;
创建b_1的附表跟我a-1主表设置外键约束
create table b_1(sid int(4)primary key,age int(4),constraint A foreign key(sid) references a_1(id))engine = innodb;
select * from a_1;(主表)
select * from b_1;(附表)

constraint: 外键的约束名
foreign key(sid): 外键约束-->当前的表中那个字段设置
外键关联关系
references a_1(id): 跟那张表建立外键关联 表的字段


增加数据有限制
当主表没有数据时,附表无法添加对等的数据  (先要添加a-1数据才能添加b-1)
insert into b_1 values(1,19);
insert into a_1 values(1,"zhangsan");

删除有限制
删除数据——> (先删除附表b-1内容才能删除主表a-1内容)
delete from a_1 where id =1 ;
delete from b_1 where  sid =1 ;
外键的作用: 保证表与表之间的数据一致性


存储过程:大量sql语句的集合,是一个可编程的函数
函数起源于数学, 在IT行业,IT函数就是 函数function(方法),可以重复使用
存储的优点:
  ● 增加sql的灵活性   ,可以完成复杂的判断和逻辑运算
  ● 执行效率更快 (因为在创建存储的时候,数据库就已经解析了当前的存储过程,执行一次存储之后,数据库系统会默认保存一份这样的存储过程语句)
  ● 更强的适应力,根据存储过程针对场景进行改动也是可以的
  ● 防止sql注入——>sql 注入是一个安全性的问题,sql注入属于安全测试的范围 (即安全性更高)

存储过程的结构:
创建一个名为wuhan19的存储过程:
create procedure  wuhan19()     ( 创建存储过程 后面没有分号)

begin :存储过程的开始——>begin下面写的就是sql语句 以及逻辑判断语句

注意:在写存储过程体部内容的时候,空一个tab键位
insert into aa values(1,"root");     (存储过程体部中严格要求分号;)

end: 存储过程的结束




call wuhan19(); 添加武汉19的存储过程

删除存储过程:
drop procedure  wuhan19 ;
判断删除: if exists   可以针对存储和表进行操作
当我的存储过程存在时删除  ,不存在不执行删除。
drop procedure  if exists wuhan19;
drop table if exists aa;


call wuhan19(); 添加武汉19的存储过程
()  括号可以用来定义传参数据类型
n 变量名称
int 数据类型
存储过程中的形式参数;
call wuhan19( n   int );



drop procedure if exists wuhan19 ;
drop table if exists aa;
create table aa(id  int(4),name char(20));
create procedure wuhan19(n  int )
begin
if n>=10 then
insert into  aa values(1,"root");
else  if  n<=10 then
select * from aa ;

end if;
end if;
end

--------------------------------------------
select * from aa;
call wuhan19(11) ;



存储过程中的变量:declare 定义变量 a =1
create table aa(id  int(4),name char(20));
create procedure wuhan19(n  int )
begin
declare  i int(4) default 10;   (吧10赋予i,此时i的值就是10)
declare  w char(20) default "root";
if n>=10 then
insert into  aa values(i,"w");
else  if  n<=10 then
select * from aa ;

end if;
end if;
end

--------------------------------------------
select * from aa;
call wuhan19(9) ;




drop procedure if exists wuhan19 ;
drop table if exists aa;
create table aa(id  int(4),name char(20));
create procedure wuhan19(n  int )
begin
declare  i int(4) default (select  count(*) from aa );
declare  w char(20) default "root";
if n>=i then
insert into  aa values(i,"w");
else  if  n<=i then
select * from aa ;

end if;
end if;
end

--------------------------------------------
select * from aa;
call wuhan19(14) ;

while 循环语句  进入循环条件

drop procedure if exists wuhan19 ;
drop table if exists aa;
create table aa(id  int(4),name char(20));
create procedure wuhan19(n  int )
begin

while n < 100 do #进入循环的语句
insert into  aa values(1,"wuhan");
end while;
select * from aa ;


end

--------------------------------------------
select * from aa;
call wuhan19(11);




create table aa(id  int(4),name char(20));
create procedure wuhan19(n  int )
begin
declare i  int(4)default (select count(*) from aa);

while i < n do #进入循环的条件 同时也是退出的条件 当我的i不再小于n的时候就退出循环
insert into  aa values(1,"wuhan");
set i = i+1;

end while;
select * from aa ;


end

--------------------------------------------
select * from aa;
call wuhan19(100);







分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册