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后面的语句

自关联

  • 省市区表(查询时)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容