SQL必知必会
陈旸
清华大学计算机博士
立即订阅
10179 人已学习
课程目录
已完结 49 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词丨SQL可能是你掌握的最有用的技能
免费
第一章:SQL语法基础篇 (19讲)
01丨了解SQL:一门半衰期很长的语言
02丨DBMS的前世今生
03丨学会用数据库的方式思考SQL是如何执行的
04丨使用DDL创建数据库&数据表时需要注意什么?
05丨检索数据:你还在SELECT * 么?
06丨数据过滤:SQL数据过滤都有哪些方法?
07丨什么是SQL函数?为什么使用SQL函数可能会带来问题?
08丨什么是SQL的聚集函数,如何利用它们汇总表的数据?
09丨子查询:子查询的种类都有哪些,如何提高子查询的性能?
10丨常用的SQL标准有哪些,在SQL92中是如何使用连接的?
11丨SQL99是如何使用连接的,与SQL92的区别是什么?
12丨视图在SQL中的作用是什么,它是怎样工作的?
13丨什么是存储过程,在实际项目中用得多么?
14丨什么是事务处理,如何使用COMMIT和ROLLBACK进行操作?
15丨初识事务隔离:隔离的级别有哪些,它们都解决了哪些异常问题?
16丨游标:当我们需要逐条处理数据时,该怎么做?
17丨如何使用Python操作MySQL?
18丨SQLAlchemy:如何使用Python ORM框架来操作MySQL?
19丨基础篇总结:如何理解查询优化、通配符以及存储过程?
第二章:SQL性能优化篇 (18讲)
20丨当我们思考数据库调优的时候,都有哪些维度可以选择?
21丨范式设计:数据表的范式有哪些,3NF指的是什么?
22丨反范式设计:3NF有什么不足,为什么有时候需要反范式设计?
23丨索引的概览:用还是不用索引,这是一个问题
24丨索引的原理:我们为什么用B+树来做索引?
25丨Hash索引的底层原理是什么?
26丨索引的使用原则:如何通过索引让SQL查询效率最大化?
27丨从数据页的角度理解B+树查询
28丨从磁盘I/O的角度理解SQL查询的成本
29丨为什么没有理想的索引?
30丨锁:悲观锁和乐观锁是什么?
31丨为什么大部分RDBMS都会支持MVCC?
32丨查询优化器是如何工作的?
33丨如何使用性能分析工具定位SQL执行慢的原因?
34丨答疑篇:关于索引以及缓冲池的一些解惑
35丨数据库主从同步的作用是什么,如何解决数据不一致问题?
36丨数据库没有备份,没有使用Binlog的情况下,如何恢复数据?
37丨SQL注入:你的SQL是如何被注入的?
第三章:认识DBMS (7讲)
38丨如何在Excel中使用SQL语言?
39丨WebSQL:如何在H5中存储一个本地数据库?
40丨SQLite:为什么微信用SQLite存储聊天记录?
41丨初识Redis:Redis为什么会这么快?
42丨如何使用Redis来实现多用户抢票问题
43丨如何使用Redis搭建玩家排行榜?
44丨DBMS篇总结和答疑:用SQLite做词云
第四章:SQL项目实战 (3讲)
45丨数据清洗:如何使用SQL对数据进行清洗?
46丨数据集成:如何对各种数据库进行集成和转换?
47丨如何利用SQL对零售数据进行分析?
结束语 (1讲)
结束语 | 互联网的下半场是数据驱动的时代
SQL必知必会
登录|注册

19丨基础篇总结:如何理解查询优化、通配符以及存储过程?

陈旸 2019-07-24
到这一篇的时候,意味着 SQL 专栏的基础部分正式更新完毕。在文章更新的时候,谢谢大家积极地评论和提问,让专栏增色不少。我总结了一些基础篇的常见问题,希望能对你有所帮助。答疑篇主要包括了 DBMS、查询优化、存储过程、事务处理等一些问题。

关于各种 DBMS 的介绍

答疑 1

文章中有句话不太理解,“列式数据库是将数据按照列存储到数据库中,这样做的好处是可以大量降低系统的 I/O”,可以解释一些“降低系统 I/O”是什么意思吗?

解答

行式存储是把一行的数据都串起来进行存储,然后再存储下一行。同样,列式存储是把一列的数据都串起来进行存储,然后再存储下一列。这样做的话,相邻数据的数据类型都是一样的,更容易压缩,压缩之后就自然降低了 I/O。
我们还需要从数据处理的需求出发,去理解行式存储和列式存储。数据处理可以分为 OLTP(联机事务处理)和 OLAP(联机分析处理)两大类。
OLTP 一般用于处理客户的事务和进行查询,需要随时对数据表中的记录进行增删改查,对实时性要求高。
OLAP 一般用于市场的数据分析,通常数据量大,需要进行复杂的分析操作,可以对大量历史数据进行汇总和分析,对实时性要求不高。
那么对于 OLTP 来说,由于随时需要对数据记录进行增删改查,更适合采用行式存储,因为一行数据的写入会同时修改多个列。传统的 RDBMS 都属于行式存储,比如 Oracle、SQL Server 和 MySQL 等。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《SQL必知必会》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(27)

  • Destroy、
    结果是:
    +------+
    | name |
    +------+
    | 关羽 |
    | 张飞 |
    +------+

    因为插入关羽这个是第一个事务,虽然没有commit,但是第二个begin数据库会隐式地 COMMIT 第一个事务,第二事务,插入张飞两次,第一次插入成功,第二次插入失败。强制commit,第一次插入的张飞会进行提交。所以结果是关羽和张飞。

    作者回复: 对的 这个解释也正确

    2019-07-24
    14
  • 许童童
    老师你好,能否说一下varchar和nvarchar有什么区别,分别用在什么场景?

    作者回复: 相同点:可变长度,字符类型数据
    不同点:varchar(n)是n个字节,非Unicode字符。(英文字母占1个字节,中文占2个字节)
    而nvarchar(n)是n个字符,Unicode字符。(英文字母或者中文都是占用2个字节)

    举个例子,varchar(10)代表10个字节,所以可以是10个英文字母,也可以是5个汉字。
    而nvarchar(10)代表10个字符,这10个字符可以是10个字母,也可以是10个汉字(英文字母或者中文 都是占用2个字节)

    2019-07-24
    2
    7
  • 挠头侠
    老师 你上述这个例子,第二个begin中,这里不加 commit 得到的结果仍然是 关羽和张飞啊。第二个事务如果要回滚的话不应该没有 “张飞“ 这个名字吗?commit是默认的吗?这点老师还是补充一下吧。

    作者回复: COMMIT这里会进行强制提交,也就是程序员来控制当存在错误的时候,是否进行强制提交。所以第一个张飞会提交成功,数据表的结果是:关羽、张飞。你也可以看下看下第一个留言的同学的解答

    2019-09-29
    2
  • ack
    思考题:
    自己想出来是只有关羽一条,因为name是主键,插入两条导致第二个事务回滚。但实际运行后结果是关羽、张飞。不知道是为什么,望老师解答。(mysql的autocommit=1,隔离级别是可重复读)
    2019-07-24
    2
    2
  • 另至
    答案是:“关羽”
    根据第十四篇-事务中原子性的描述:要不全部成功要不全部失败。

    第一个事务成功插入“关羽”
    第二个事务,第一条插入“张飞”成功,第二条插入“张飞”失败。
    所以第二个事务整体回滚,一条“张飞”都没插入。
    所以结果只有“关羽”

    作者回复: 对事务ACID的理解是这样的,不过在程序中是需要自己来控制的,如果遇到了错误,还继续执行COMMIT的话,也会让事务中正确的部分进行提交。所以你可以跑一遍代码,运行结果应该是 关羽,张飞。

    2019-07-25
    1
  • 另至
    根据第十四篇-事务,原子性:要不全部成功,要不全部失败。

    作者回复: 原子是这个特点,不过在代码操作的时候,如果在一个事务中遇到的错误,还是可以强制进行COMMIT的,这时会把这个事务中成功执行的部分进行提交。你可以运行下 文章中给到的代码

    2019-07-25
    1
  • 一叶知秋
    老师 我也想问个问题。。。
    之前提到过SQL执行的顺序是:FROM > WHERE > GROUP BY > HAVING > SELECT 的字段 > DISTINCT > ORDER BY > LIMIT
    1)既然limit是最后执行的那么为何limit可以避免全表扫描。
    2) 假如select的字段不包含order by字段那么是否在distinct产生的虚拟表上还要添加列?
    2019-07-25
    1
    1
  • Cue
    很详细的答疑,赞

    作者回复: 感谢

    2019-07-24
    1
  • 不似旧日
    如果你可以确定结果集只有一条,那么加上LIMIT 1的时候,当找到一条结果的时候就不会继续扫描了,这样会加快查询速度。 多一条少一条效率真真真可以忽略不计
    2019-11-22
  • 不似旧日
    好复杂哦

    作者回复: 慢慢来

    2019-11-22
  • 右耳朵猫咪
    请问如何防止很多left join?
    2019-10-23
  • 神码也不懂
    老师 我问个问题,SQL的执行顺序 1、from 2、join 3、on 4、where 5、group by 6、having 7、select;其中第一步是首先对from子句前连个表执行一个笛卡儿积,生成虚拟表vt1,第二部对vt1应用on筛选器;我的问题是:如果这样的话那是不是笛卡儿积是不是无论怎么优化,只要表连接一定会有笛卡儿积? 麻烦老师有时间的时候帮我解答一下,谢谢老师
    2019-08-07
  • Geek_7777
    OLAP可以详细讲一下么?
    2019-08-07
  • hxd
    MySQL 5.7 测试是只有一条关羽的数据插入成功,第二个begin隐式提交了第一条,然而第二个事务中途失败回滚了,相当于张飞的数据没有插入成功。
    2019-07-29
  • Geek_c76f38
    请教一个sql如何在一个表里间隔固定刚修改数据,如每间隔3行将一个字段设置成0?
    2019-07-25
  • 苏籍
    对于COUNT 这个有些困惑
    1、老师你说,聚簇索引比二级索引信息多?是指的什么信息多,它是怎么导致使用主键索引慢了呢
    2019-07-25
    1
  • 庞鑫华
    老师,请问join查询,on后面的条件、连接条件,where后面的条件,数据过滤顺序是怎样的呢?
    2019-07-25
  • 庞鑫华
    老师,能否举例说明一条复杂sql的查询解析过程,包括join操作的
    2019-07-25
  • 悟空
    太乙真人太太,真开心,哈哈哈。

    作者回复: 哈哈 这时专栏里的一个同学举的例子,我觉得不错,挺好的说明了通配符的使用

    2019-07-25
  • Ronnyz
    作业:关羽 张飞

    作者回复: 对的 答案正确,是关羽,张飞

    2019-07-24
收起评论
27
返回
顶部