MySQL - 高级知识1: 实体关系, 关联查询, 自关联, 视图, 事务, 索引

关联查询

  • 存储关系: 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不仅要保存数据, 还要保存一下索引文件
    • 建立索引会占用磁盘空间的索引文件
  • 示例:

      1. 开启运行时间监测: set profiling=1;
      1. 执行查询语句: select * from areas where atitle='沈阳市';
      1. 查看执行时间: show profiles;
      1. 为表areas的atitle列创建索引: create index titleIndex on areas(atitle(20))
      1. 执行查询语句: select * from areas where atitle='沈阳;'
      1. 再次查看执行的时间: show profiles;
  • 数据库优化:

    • 优化where后面的语句

自关联

  • 省市区表(查询时)

你可能感兴趣的:(MySQL - 高级知识1: 实体关系, 关联查询, 自关联, 视图, 事务, 索引)