美文网首页程序员
《SQL学习指南》读书笔记

《SQL学习指南》读书笔记

作者: GeorgeMR | 来源:发表于2018-01-21 13:48 被阅读0次

由于之前在学校使用的SQL语句都是简单的增删改查,但简单的增删改查很难完成工作需求,同时也要兼顾性能需求,所以因为工作需求,特意买了《SQL学习指南》加深对SQL的理解与掌握。本文并非简单的介绍SQL的增删改查,但也不会涉及到太多SQL的背后实现原理。如果简单的增删改查无法满足你的日常使用,相信本文会对你的SQL学习带来帮助。


  1. 用户输入的查询语句会传递给查询优化器,优化器会为查询找到最有效率的执行方式

  2. null值

    • 没有合适的值
    • 值未确定
    • 值未定义

    当使用不熟悉的数据库时,首先确定哪些列可以允许null值,在过滤的时候才去适当的措施确保不会漏掉所需要的数据。

    select * from tb where id != 6 or id is NULL
    
  3. 使用distinct关键字去除重复项

    select distinct id from tb where id > 10;
    
  4. 使用group by 子句请求数据库服务器对数据进行分组

    select id, count(*) from tb group by id;
    

    ​查询以id为分组条件,将id相同的行放入同一组并统计得到id相同的数量

    ​由于group by 子句在where子句被评估之后运行,所以分组无法在where子句中增加过滤条 件,必须在having子句中使用分组过滤条件

    /*筛选相同id超过四个*/
    select id from tb group by id having count(*) > 4;
    
  5. 多列分组:分别对多列进行组合

    /*id和name的各种组合,即id和name的笛卡尔积*/
    select * from tb group by id, name;
    
  6. 由于分组的group by子句是在where子句评估之后运行,所以要仔细查询的过滤条件是针对分组之前的原始数据(过滤条件放在where子句中),还是针对分组后的数据(过滤条件放在having子句中)

  7. 子查询:包含在另一个SQL语句内部的查询。任何子查询返回的数据在包含语句执行完成后都会被丢弃,子查询类似于一个具有作用域的临时表。

select * from tb where id = (select id from tb_join);
  1. 非关联子查询:子查询可以单独执行而不需要引用包含语句中的任何内容。(例如上面的例子,子查询可以作为一个单独的SQL语句执行,在包含语句执行之前一次执行完毕)

  2. 关联子查询:子查询依附于包含语句并引用其一列或多列。关联子查询不是在包含语句执行之前一次执行完毕,而是作为每一个候选行执行一次

    /*子查询的执行必须依赖包含查询提供的tb.id,先从tb表中检索出所有的记录,接着为每行记录执行一次子查询,每次执行包含查询都要向子查询传递id*/
    select * from tb where tb.name = (select name from tb_join where tb.id = tb_join.tb_id);
    
  3. 有时通过单表查询可能无法满足我们的需求,就需要通过多表查询实现。

  • 内连接:如果连接的两张表的条件,一张表满足条件,另一张不满足,结果集中将会排除包含该条件的行
  • 外连接:不考虑每行是否在另一个表中存在匹配,结果集会包含第一个表中的所有行,但仅仅包含第二个表中哪些匹配行的数据
    • 左外连接:left outer join。关键词left指出连接左边的表决定结果集的行数,而右边的只负责提供与之匹配的列值。与此相反的右外连接的right指右边的表决定行数。
  1. 两张表以上的连接:前两个表的连接作为一个结果集,之后的表与之前的结果集连接,随着表的不断连接,包含了越来越多的列。(通俗来讲就是前两张表连接得到“中间结果集”,“中间结果集”和后面紧跟着的表再进行连接得到新的“中间结果集”,一直到最后一张表。类似于滚雪球)

  2. 索引:用于定位表中行的列,描述这些行的物理位置的信息,并不包含实体中的所有数据。索引的作用就是便捷化检索表中行和列的子集,这样每次查询就不需要遍历表中的所有行。

    /*创建索引*/
    alter table tb add index tb_idx (name);
    

    当表被创建时,MySQL会自动为主键列生成索引。

    唯一索引:除了有常规索引的作用,还可以限制索引列出现重复值。服务器会为主键检查唯一性。

  3. 每个索引事实上是一个表(一种特殊类型的表),所以索引越多,服务器就需要做更多的工作来保持所有模式对象最新。所以创建索引要综合考虑:

    • 所有主键列被索引
    • 所有被外键约束引用的列创建索引
    • 被频繁检索的列创建索引
  4. 约束:一种简单地强加于表中一列或多列的限制。(主键约束、外键约束、唯一约束、检查约束)

相关文章

  • 2、SQL学习指南(第2版). 免费下载

    下载地址:2、SQL学习指南(第2版).pdf

  • 各种技术学习之路

    MySQL:《SQL学习指南》、《高性能MySQL》、《高可用MySQL》、《SQL反模式》 参考资料:[MySQ...

  • 《SQL学习指南》读书笔记

    由于之前在学校使用的SQL语句都是简单的增删改查,但简单的增删改查很难完成工作需求,同时也要兼顾性能需求,所以因为...

  • SQL学习指南

    这篇文章介绍一些SQL中常用的语句,主要介绍查询语句,以Mysql作为例子;在查询之前先插入数据, 括号中是插入的...

  • 《sql学习指南》读书笔记-day1

    一.建表 推荐使用Jetbrains->DataGrip ## 主要根据模拟一个微小银行的领域模型 向sql初学者...

  • 数据库进阶书籍清单

    传统数据库书籍清单(来源于知乎) 一.入门系列: 1.《MySQL必知必会》2.《SQL学习指南(第2版 修订版)...

  • 太傻天书读书笔记2学习指南

    太傻天书读书笔记2学习指南 “当然每本书虽然最终的目标是相同的,但是教导太傻道路的焦点和途径不同,例如你说的《当下...

  • iOS智能家居HomeKit学习指南

    iOS智能家居HomeKit学习指南 iOS智能家居HomeKit学习指南

  • 2016年1月读书记录

    2016年1月完成两本书,都是之前读了一半放下的书:「万历十五年」、「SQL学习指南」。 按照「如何阅读一本书」内...

  • React Natve之技能树点亮计划

    React Native 高质量学习资料汇总React Native学习指南React Native学习指南Git...

网友评论

    本文标题:《SQL学习指南》读书笔记

    本文链接:https://www.haomeiwen.com/subject/jgwfaxtx.html