杨超林 发表于 2021-11-26 19:24:06

索引,存储

索引:用index表示查看有哪些表:show tables;Select * from student;Desc student 普通索引 (先创建一个普通索引)Create index aa on student(math); 给单个字段创建普通索引Create index cc on stuednt(math,age);给两个字段创建普通索引 Show index from student; 查看创建哪些索引Alter table student drop index cc; 删除cc普通索引 注意:给某个字段创建普通索引,字段对应的值允许有重复的;给某个字段创建唯一索引,字段对应的值是唯一的(不允许有重复) 唯一索引Create unique index cc on student(age);创建失败,age字段对应的值有重复的Create unique index cc on student(math);给math字段创建唯一索引,math字段对应的值没有重复的 主键索引:在创建主键约束的时候,主键索引就已经存在了主键索引和主键约束其实是绑在一起的,如果有了主键索引,那么必会产生主键约束,或者说主键约束是主键索引的一个特征 Alter table student drop primary key(math);报错,因为已经存在id有主键索引了 第一步:先删除自增长Alter table student change id id int(4);第二步:删除主键Alter table student drop primary key;第三步:查看有哪些索引;Show index from student;第四步:给math 字段创建主键约束Alter table student add primary key(math);第五步:查看表结构Desc student 视图 select * from student;create view dcs as(select id,class,math from student);创建一个视图表dcs,把student表的id class math字段作为视图表字段show tables;查看所有表(包含视图表)show create view dcs;查看视图的结构select * from dcs2;查看视图表的数据 delete from dcs where id=10;删除视图表数据,视图表和基本表同步删除update dcs set math=99 where id=1;更新视图表数据,基本表同步被修改update student set math=100 where id=1更新基本表数据,视图表和基本同步表步更新 drop view dcs;删除视图表show create view dcs;删除之后查看视图表结构,提示不存在了 视图的作用对视图的操作与对基本表的操作都是一样的 包括(alter,create,insert,into,update,delete,select),且二者任意一方的字段值被修改,都会实时影响到对方(如修改view的字段值,会同步修改table相应的字段值);但是视图的创建是基于基本表的,它的作用可以对基本表的敏感信息进行保护;在实际工作中,出于安全考虑,将用户常用的信息创建成视图给用户调用,避免了直接操作基本表!DDL//数据库定义语言(对表结构和表字段进行操作)create alter table DROP DML//数据库操作语言(对表数据进行操作)insert intodeleteselectupdate外键约束外键用来干什么为了一张表记录的数据不要太过冗余。这和软件project的模块化思想差点儿相同类似,仅仅只是在数据库中是对表示关系进行解耦,尽量让表记录的数据单一化外键的主要作用是:保持数据的一致性,完整性实例讲解:1,现在我们创建两个表dcs1,dcs22,所以在设计的时候。就给表1加入一个外键,这个外键就是表2中的sid字段。那么这样表1就是主表,表2就是子表3.创建dcs1create table dcs1(id int(4)primary key,name varchar(10)) engine=innodb;4创建dcs2create table dcs2(sid int(4)primary key,sname varchar(10),constraint dcs foreign key(sid) references dcs1(id)) engine=innodb;show create table dcs1;show create table dcs2;往表中插入数据insert into dcs1 values(1,'xiaoyi'),(2,'xiaoer');insert into dcs2 values(1,'xiao1'),(3,'xiao3');插入失败,在子表中插入的数据必须在主表存在(只针对于有关联的两个字段)insert into dcs2 values(1,'xiaoyi'),(2,'xiaoer'); select * from dcs2;总结:主表中不存在的数据,在任何的子表当中无法插入与之相关的数据(只针对于有关联的两个字段);两个相关联的字段不能相同(比如主表是id,子表就不能为id);相关联的两个字段要主键约束,否则创建外键就会失败 删除表中的数据delete from dcs1 where id=1第一次删除主表数据删不掉,提示在子表里面有与之相关联的外键delete from dcs2 where sid=1;先删除子表的数据,再执行上面的sql就能删除主表的数据总结:插入数据的时候,往子表插入的数据必须在主表存在(关联的两个字段的数据),删除数据,先删除子表,再删除主表的数据 alter table dcs2 drop foreign key dcs;删除外键,使它们不存在约束show create table dcs2;查看表结构insert into dcs1 values(1,'xiaoyi');insert into dcs2 values(1,'xiaol');alter table dcs2 add constraint dcs foreign key(sid) references dcs1(id);创建外键约束,必须保证两个相关字段的值相同以及数据条数一致 MySQL数据库约束主键约束 primary key非空约束 not null自增长约束 auto_increment总结:主要是约束的字段constarint dcs;约束,外键约束名称叫dcsforeign key(sid):创建在dcs2表的sid字段上面references dcs1(id):引用和参考的是dcs1表的id字段engine=innodb:数据库存储引擎为innodb,myisam对外键不起作用 外键之数据增加场景: 在不设置外键的情况下。表2的sid字段和表1的id字段是没有关联的。仅仅是你自己觉得他们有关系而已。数据库并不觉得它俩有关系。也就是说,你在表2的sid字段插了一个值(比方3),可是这个值在表1中并没有,这个时候,数据库还是允许你插入的,它并不会对插入的数据做关系检查。然而在设置外键的情况下。你插入表2的sid字段的值必需要求在表1的id字段能找到,才能插入成功 drop procedure if exists dcs;create procedure dcs(n int)begin#存储过程的开始#存储过程的函数体,也可以理解为sql语句的集合            declare i int(20) default(select count(*) from mm);        declare j int(20) default(select max(score) from mm); /*drop table if exists mm;#当mm表已存在,先删除mm这个表 create table mm(id int(10) primary key auto_increment,score int(10)); insert into mm values(1,99),(2,78),(3,96),(4,88),(5,79),(6,82),(7,92),(8,57);*/ #select * from mm; #select * from mm where id=1;不带参数进行增删改查操作 #select * from mm where id=n;带参数进行查询操作 /*if n=0 then;if多分支   select count(*) from mm; elseselect max(score) from mm; else if;*//*if n=0 then条件判断语句select count(*) from mm;else if n>0 && n<8 then        select max(score) from mm;else if n>=8 then        select * from mm order by score desc;else        select * from mm;end if;end if;end if;*/if n=0 then        select count(*) from mm;else if n>0 && n<i then        select max(score) from mm;else        while n>i do                set j = j + 1;   j初始值为最高分数,在插入数据之前j+1                insert into mm(score)values(j);再把加入了1的这个j插入到表中                set i = i + 1;        end while;end if;end if;select * from mm; end存储过程的结束call dcs(122)调用dcs()这个存储过程存储过程实战演练存储过程题目:现在有一个user用户表需要往user表中插入1000个登录用户要求如下:1、在插入用户前先判断是否存在1000个登录用户,如果存在则统计表中实际的行数、如若不存在则自动补齐剩余的数据2、表名为user,存储过程名字随意取,表中字段有id user name user pwdverify格式如下(1,user1,123456,W4E38J),且id、用户名不能重复,verify验证码字段为随机生成6位数验证码CONCAT函数可以把2个字符串进行连接。
页: [1]
查看完整版本: 索引,存储