SQL 必知必会
陈旸
清华大学计算机博士
73338 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
第一章:SQL语法基础篇 (19讲)
SQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

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

事务的ACID
ROLLBACK的作用
IN参数必须在调用存储过程时指定
存储过程声明变量的数据类型
LIMIT关键词
MySQL中统计数据表的行数
OLAP
OLTP
列式存储
行式存储
事务处理
存储过程
EXISTS与IN的选择标准
SELECT语句内部的执行步骤
ORDER BY的作用对象
ORDER BY字段上的索引
通配符的解释
关于查询优化
关于各种DBMS的介绍
SELECT
COMMIT
INSERT INTO
BEGIN
CREATE TABLE
DROP TABLE
基础篇总结&答疑
思考题
参考文章

该思维导图由 AI 生成,仅供参考

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

关于各种 DBMS 的介绍

答疑 1

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

解答

行式存储是把一行的数据都串起来进行存储,然后再存储下一行。同样,列式存储是把一列的数据都串起来进行存储,然后再存储下一列。这样做的话,相邻数据的数据类型都是一样的,更容易压缩,压缩之后就自然降低了 I/O。
我们还需要从数据处理的需求出发,去理解行式存储和列式存储。数据处理可以分为 OLTP(联机事务处理)和 OLAP(联机分析处理)两大类。
OLTP 一般用于处理客户的事务和进行查询,需要随时对数据表中的记录进行增删改查,对实时性要求高。
OLAP 一般用于市场的数据分析,通常数据量大,需要进行复杂的分析操作,可以对大量历史数据进行汇总和分析,对实时性要求不高。
那么对于 OLTP 来说,由于随时需要对数据记录进行增删改查,更适合采用行式存储,因为一行数据的写入会同时修改多个列。传统的 RDBMS 都属于行式存储,比如 Oracle、SQL Server 和 MySQL 等。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了SQL专栏基础篇的内容,包括对各种DBMS的介绍、查询优化、存储过程、事务处理等常见问题的答疑。文章详细解释了行式存储和列式存储的特点,以及它们在OLTP和OLAP中的应用场景。此外,还介绍了在MySQL中统计数据表行数的三种方式的效率比较,以及对LIMIT关键词和ORDER BY字段的索引使用进行了解释。在存储过程部分,文章解释了不同DBMS对数据类型的定义以及IN参数的使用。在事务处理方面,文章解释了连续BEGIN的情况以及COMMIT和ROLLBACK的使用。总的来说,本文通过答疑的形式,深入浅出地解释了SQL基础知识和优化技巧,为读者提供了全面的SQL基础知识概览。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《SQL 必知必会》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(37)

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

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

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

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

    2019-09-29
    2
    7
  • 另至
    根据第十四篇-事务,原子性:要不全部成功,要不全部失败。

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

    2019-07-25
    7
  • 另至
    答案是:“关羽” 根据第十四篇-事务中原子性的描述:要不全部成功要不全部失败。 第一个事务成功插入“关羽” 第二个事务,第一条插入“张飞”成功,第二条插入“张飞”失败。 所以第二个事务整体回滚,一条“张飞”都没插入。 所以结果只有“关羽”

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

    2019-07-25
    5
  • ack
    思考题: 自己想出来是只有关羽一条,因为name是主键,插入两条导致第二个事务回滚。但实际运行后结果是关羽、张飞。不知道是为什么,望老师解答。(mysql的autocommit=1,隔离级别是可重复读)

    作者回复: 如果出现异常,这时强制提交的话, 会将操作成功的进行提交

    2019-07-24
    3
    4
  • Cue
    很详细的答疑,赞

    作者回复: 感谢

    2019-07-24
    4
  • Geek_7777
    OLAP可以详细讲一下么?

    作者回复: OLAP更偏数据分析,业务端,比如 Apache Kylin

    2019-08-07
    3
  • 庞鑫华
    老师,请问join查询,on后面的条件、连接条件,where后面的条件,数据过滤顺序是怎样的呢?

    作者回复: SELECT DISTINCT player_id, player_name, count(*) as num #顺序5 FROM player JOIN team ON player.team_id = team.team_id #顺序1 WHERE height > 1.80 #顺序2 GROUP BY player.team_id #顺序3 HAVING num > 2 #顺序4 ORDER BY num DESC #顺序6 LIMIT 2 #顺序7

    2019-07-25
    3
  • mickey
    答案是 name 关羽 张飞

    作者回复: 正确

    2019-07-24
    3
收起评论
大纲
固定大纲
关于各种 DBMS 的介绍
答疑 1
解答
显示
设置
留言
37
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部