自关联
- 设计省信息的表结构provinces
- id
- ptitle
- 设计市信息的表结构cityscitys表的proid表示城市所属的省,对应着provinces表的id值
- id
- ctitle
- proid
- citys表的proid表示城市所属的省,对应着provinces表的id值
- 问题:能不能将两个表合成一张表呢?
- 思考:观察两张表发现,citys表比provinces表多一个列proid,其它列的类型都是一样的
- 意义:存储的都是地区信息,而且每种信息的数据量有限,没必要增加一个新表,或者将来还要存储区、乡镇信息,都增加新表的开销太大
- 答案:定义表areas,结构如下因为省没有所属的省份,所以可以填写为null
- id
- atitle
- pid
- 因为省没有所属的省份,所以可以填写为null
- 城市所属的省份pid,填写省所对应的编号id
- 这就是自关联,表中的某一列,关联了这个表中的另外一列,但是它们的业务逻辑含义是不一样的,城市信息的pid引用的是省信息的id
- 在这个表中,结构不变,可以添加区县、乡镇街道、村社区等信息
- 创建areas表的语句如下:
create table areas(
id int primary key,
atitle varchar(20),
pid int,
foreign key(pid) references areas(id)
);
视图
- 对于复杂的查询,在多次使用后,维护是一件非常麻烦的事情
- 解决:定义视图
- 视图本质就是对查询的一个封装
- 定义视图
create view stuscore as select students.*,scores.score from scores inner join students on scores.stuid=students.id;
- 视图的用途就是查询
select * from stuscore;
- 当一个业务逻辑需要多个sql完成时,如果其中某条sql语句出错,则希望整个操作都退回
- 使用事务可以完成退回的功能,保证业务逻辑的正确性
- 事务四大特性(简称ACID)要求:表的类型必须是innodb或bdb类型,才可以对此表使用事务
- 原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行
- 一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致
- 隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的
- 持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障
- 要求:表的类型必须是innodb或bdb类型,才可以对此表使用事务
- 查看表的创建语句
show create table students;
- 修改表的类型
alter table '表名' engine=innodb;
- 事务语句
开启begin;
提交commit;
回滚rollback;
索引
能不用or尽量不用;=尽量放前,<或> 表示范围的尽量放后。
单列索引
多列索引
show index from students 查看索引
create index indexName on mytable(username(length)); 创建索引
drop index[indexName] on mytable; 删除索引
缺点:查询速度快,其他操作慢。
set profiling=1 表示启用检测
select *from areas where title='北京市'
show profiles;
show index from areas;
create index titleIndex on areas(title(20));
select *from areas where title='北京市'
show profiles;