关联查询
- 存储关系: 1对1, 1对多, 多对多
- 建立关系表
- 外键:
create table scores( id int auto_increment primary key not null, score decimal(4, 1), stuid int, subid int, foreign key(stuid) references students(id), foreign key(subid) references subjects(id));
- 外键的级联操作
- 在删除students表的数据是, 如果这个id值在sources中已经存在, 则会抛异常
- 推荐使用逻辑删除, 还可以解决这个问题
- 可以创建表时指定级联操作, 也可以在创建表后再修改外键的级联操作
- 语法:
alter table sources add constraint stu_sco foreign key(stuid) references students(id) on update CASCADE
- 级联操作的类型包括 :
- restrict(限制) : 默认值, 抛出异常
- cascade(级联) : 如果主表的记录删除, 则从表中相关联的记录都将被删除
- set null : 将外键设置为空
- no action : 什么都不做
- 连接查询(多表查询)
- 当查询结果来源于多张表的时候, 这个时候需要连接查询 (on后面主要写join左边表和右边表的关系)
select student.name, subjects.title, scores.score form scores inner join students on scores.stuid=students.id inner join subjects on scores.subid=subjects.id
- 左连接(left join) : 以左表为主, 结果中显示出来的数据, 两个表中满足条件的 + 左表的数据
- left join, inner join, right join : 主要的表现就是结果集的不同
视图
- 对于复杂的查询, 在多次使用后, 维护是一件非常麻烦的事情, 定义视图来解决该问题
- 视图本质就是对查询的一个封装
- 定义视图 : (create 换成alter 就是修改视图)
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类型, 才可以对此表使用事务
- 查看表的创建语句:
show create table students
-> 可以查看当前引擎 - 修改表的类型:
alter table '表明' engine=innodb;
- 事务语句:
- 开启: begin;
- 回滚: rollback; (会解锁)
- 提交事务: commit;(会解锁)
- 示例:
select * from students; begin; update students set name = 'Jack' where id = 1; commit; // 内存级的临时表更新到表中 rollback; // begin之后所有的操作都将回滚
- 使用情况: 在自己编写的代码中, 链接数据库的时候, 操作失败的时候, 默认会回滚
索引
MySQL中如何实现索引
-
选择列的数据类型
- 越小的数据类型通常更好: 越小的数据类型通常在磁盘, 内存和CPU缓存中都需要更小的空间, 处理起来更快
- 简单的数据类型更好: 整形数据比起字符, 处理开销更小, 因为字符串的比较更复杂
- 尽量避免NULL: 应该指定列为NOT NULL, 除非你想存储NULL. 在MySQL中, 含有空值的列很难进行查询优化, 因为它们使得索引, 索引的统计信息以及比较运算更加复杂. 你应该用0, 一个特殊的值或者一个空串代替空值
-
操作:
- 索引分单列索引和组合索引
- 单列索引: 即一个索引只包含单个列, 一个表可以有多个单列索引, 但这不是组合索引
- 组合索引: 即一个索引包含多个列
- 查看索引:
SHOW INDEX FROM table_name;
- 创建索引: `` CREATE INDEX indexName ON table_name(username(length));
- 删除索引:
DROP INDEX [indexName] ON table_name;
- 索引分单列索引和组合索引
-
缺点:
- 虽然索引大大提高了查询速度, 同时却会降低更新表的速度, 如对表进行INSERT, UPDATE, DELETE. 因为更新表时, MySQL不仅要保存数据, 还要保存一下索引文件
- 建立索引会占用磁盘空间的索引文件
-
示例:
- 开启运行时间监测:
set profiling=1;
- 开启运行时间监测:
- 执行查询语句:
select * from areas where atitle='沈阳市';
- 执行查询语句:
- 查看执行时间:
show profiles;
- 查看执行时间:
- 为表areas的atitle列创建索引:
create index titleIndex on areas(atitle(20))
- 为表areas的atitle列创建索引:
- 执行查询语句:
select * from areas where atitle='沈阳;'
- 执行查询语句:
- 再次查看执行的时间:
show profiles;
- 再次查看执行的时间:
-
数据库优化:
- 优化where后面的语句
自关联
- 省市区表(查询时)