视图
- 什么是视图:数据库中存在多种对象,表和视图都是数据库中的对象,创建视图时名称不能和表名重名,视图实际上是代表了一段sql查询语句,可以理解成视图是一张虚拟的表,表中的数据会随着原表的改变而改变.
为什么使用视图:因为有些数据的查询需要书写大量的sql语句,每次书写比较麻烦,使用视图可以起到sql重用的作用,可以隐藏敏感信息
创建视图的格式:
create view 视图名 as 子查询;
-例如: (切换回db3数据库) create view vemp10 as (select * from emp where deptno=10);
- 隐藏员工表的工资字段 create view vempnosal as (select empno,ename,job,mgr,deptno from emp);
创建emp表部门是20并且工资小于3000的视图
create view v_emp_20 as (select * from emp where deptno=20 and sal<3000);
- 创建emp表每个部门工资的总和,平均工资,最大工资,最小工资的视图 create view v_emp as (select deptno,sum(sal),avg(sal),max(sal),min(sal) from emp group by deptno);
视图的分类
- 简单视图:创建视图的子查询中不包含:去重,函数,分组,关联查询的视图称为简单视图. 可以进行增删改操作
- 复杂视图: 和简单视图相反.
在简单视图中进行增删改操作
- 视图中插入数据 insert into vemp10 (empno,ename,deptno,sal) values (10001,'张三',10,300);
- 数据污染: 往视图中插入一条视图中不显示,但是原表会显示的数据称为数据污染 insert into vemp10 (empno,ename,deptno,sal) values (10002,'李四',20,400);
- 如果需要避免数据污染的出现,创建视图时需要使用 with check option的关键字 create view vemp20 as (select * from emp where deptno=20) with check option; insert into vemp20 (empno,ename,deptno,sal) values (10003,'王五',20,400);(成功) insert into vemp20 (empno,ename,deptno,sal) values (10004,'赵六',10,400);(失败)
- 测试在视图中修改和删除数据 修改和删除操作方式和table一样
- 修改vemp10视图中任意一条数据的工资为500; update vemp10 set sal=500 where empno=10001; update vemp10 set sal=500 where empno=10002;
- 删除vemp10中工资为500的员工 delete from vemp10 where sal=500; delete from vemp10 where empno=10002;
- 修改和删除只能操作视图中存在的数据
修改视图
格式: create or replace view 视图名 as 子查询
create or replace view vemp10 as (select * from emp where deptno=10 and sal<2000);
删除视图
drop view v_emp_20;
drop view if exists v_emp_20;(如果存在删除 不存在也不会报错)
视图别名
- 如果创建视图的时候使用了别名,则对视图操作的时候只能使用别名 create view vempname as (select ename name from emp); update vempname set name='abc' where name='李四';
视图总结:
- 视图是数据库中的对象,代表一段sql语句
- 作用:重用sql,隐藏敏感信息
- 分类:简单(不包含函数,去重,分组,关联查询)(可以进行增删改查操作)和复杂(和简单相反)(只能查)
- 工作中一般使用视图时只进行查询操作 如果需要增删改则直接对原表进行操作
约束
- 什么是约束:约束是给表字段添加的限制条件.
非空 not null
- 添加非空约束的字段 值不能为null create table t_null(id int,age int not null);
唯一 unique
- 添加唯一约束的字段 值不能重复 create table tunique(id int,age int unique); insert into tunique values (1,20);(成功) insert into t_unique values (2,20);(失败)
主键约束 primary key
- 添加了主键约束的字段,值不能为null也不能重复
- 创建表时添加主键约束 create table t_pri (id int primary key);
- 创建表后添加主键约束 create table tpri2 (id int); alter table tpri2 add primary key(id);
- 一个表只能有一个主键
- 删除主键约束 alter table t_pri2 drop primary key;
自增
- 当字段赋值为null,字段会自动增长
- 如果删除数据,自增数值不会减
- 如果指定插入比较大的值,下次插入数据时会从最大值的基础上+1
- 如果使用delete删除全表数据,自增值不变
- 使用truncate 关键字 自增数值清零
默认约束 default
给字段设置默认值,当字段不赋值的时候,默认值生效
create table t_def(id int,age int default 10);
检查约束 check
mysql不支持,但语法通过不会报错
create table t_check(id int,age int,check(age>10));
外键约束
- 什么是外键约束: 用来保证两张表之间数据一致性和完整性的约束
- 添加约束后:外键的值可以为null,可以重复,但不能是另外一张表不存在的数据
- 添加约束后,外键指向的表(dept)不能先删除,如果需要删除,要么删除外键约束,要么先删除存在外键的表(emp)
- 添加约束后,外键指向的数据不能先删除
- 外键的值通常指向另外一张表的主键
- 使用外键必须两张表使用相同的引擎(innodb),myisam不支持外键
- 工作中除非特殊情况,一般不使用外键约束,使用java代码通过逻辑对插入和删除的数据进行限制,因为加了外键约束后不方便测试
添加外键约束的格式:
create table emp(id int,age int,deptid int,constraint 约束名 foreign key(deptid)
references 关联表名(关联的字段名));
创建部门和员工的两张表,创建一个db6数据库并使用 create table dept(id int primary key auto_increment,name varchar(10));
create table emp(id int primary key auto_increment,name varchar(10),deptid int, constraint fk_dept foreign key(deptid) references dept(id)); insert into dept values(null,'神仙'),(null,'妖怪'); insert into emp values(null,'观音',3);(失败)
索引
导入数据
- 在终端中先登录mysql 在db6下面执行 source命令 source 文件的绝对路径
- 学生机路径: source /home/soft01/桌面/item_backup.sql
windows电脑路径:把文件放在d盘下 source d:/item_backup.sql
导入完之后 测试执行: select count(*) from item2;
什么是索引
索引是用来提高查询速度的技术,类似一个目录
- 为什么使用索引: 如果不使用索引,数据会零散的保存在磁盘块中,磁盘块大小(4-8kb),查询数据时需要挨个遍历每一个磁盘块,直到找到数据为止,使用索引之后会在磁盘中将数据以树状结构进行保存,查询数据时从树状结构中进行查询,可以大大降低磁盘块的访问数量,从而提高查询速度
- 索引内部原理图(了解)
索引是越多越好吗?
- 索引会占用磁盘空间,所以创建时需谨慎,根据查询需求来决定创建什么索引.
有索引就一定好吗?
- 索引需要建立在大量数据的表中,如果数据量不够大,有可能会降低查询效率
索引的分类(了解)
- 聚集索引(聚簇索引):数据保存在树状结构中,一张表只有一个聚集索引,数据库会自动为添加了主键的表创建聚集索引.
- 非聚集索引: 树状结构中没有数据,保存的是磁盘块的地址
如何创建索引(非聚集索引)
- 格式: create index 索引名 on 表名(字段名[(长度)]);
- 创建索引之前先查询看时间 1.06秒 select * from item2 where title='100';
- 创建title索引 create index index_title on item2(title);
- 再次查询 看时间 0.03 提高30多倍 select * from item2 where title='100';
查看索引
show index from item2;
删除索引
drop index index_title on item2;
复合索引
创建索引的时候添加多个字段,这种索引称为复合索引
- 什么时候使用:当频繁使用多个字段作为查询条件的时候使用复合索引
- 创建格式: create index indextitleprice on item2(title,price);
创建表时添加索引
create table t_index(id int,age int,index index_age(age));
索引总结
- 索引会占磁盘空间,不是越多越好
- 数据量小的表不要创建索引
- 主键会自动创建聚集索引
- 对经常出现在 where/order by/distinct后面的字段创建索引可以提高效率,效果更好
- 不要在修改太频繁的表中创建索引
事务
什么是事务
数据库执行sql语句的最小工作单元,不可拆分,同时成功或同时失败
事务的ACID特性 面试常考
- Atomicity:原子性,最小 不可再次拆分
- Consistency:一致性,同时成功,同时失败
- Isolation:隔离性, 多个事务之间互不影响
- Durability:持久性, 事务完成后数据持久保存到数据库
mysql中事务的指令
- 查看自动提交的状态 show variables like '%autocommit%';
- 设置自动提交的状态 set autocommit=0/1;
- 提交 commit
- 回滚 rollback
- 保存回滚点 savepoint s1
- 回滚到某个点 rollback to s1