19丨基础篇总结:如何理解查询优化、通配符以及存储过程?
19丨基础篇总结:如何理解查询优化、通配符以及存储过程?
讲述:陈旸
时长11:24大小10.44M
关于各种 DBMS 的介绍
答疑 1
解答
关于查询优化
答疑 1
解答
答疑 2
解答
关于通配符的解释
答疑 4
解答
答疑 5
解答
答疑 6
解答
答疑 7
解答
关于存储过程
答疑 1
解答
答疑 2
解答
关于事务处理
答疑 1
解答
赞 17
提建议
精选留言(36)
- TKbook2019-07-24结果是: +------+ | name | +------+ | 关羽 | | 张飞 | +------+ 因为插入关羽这个是第一个事务,虽然没有commit,但是第二个begin数据库会隐式地 COMMIT 第一个事务,第二事务,插入张飞两次,第一次插入成功,第二次插入失败。强制commit,第一次插入的张飞会进行提交。所以结果是关羽和张飞。展开
作者回复: 对的 这个解释也正确
共 5 条评论31 - 许童童2019-07-24老师你好,能否说一下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个字节)
共 5 条评论24 - 挠头侠2019-09-29老师 你上述这个例子,第二个begin中,这里不加 commit 得到的结果仍然是 关羽和张飞啊。第二个事务如果要回滚的话不应该没有 “张飞“ 这个名字吗?commit是默认的吗?这点老师还是补充一下吧。
作者回复: COMMIT这里会进行强制提交,也就是程序员来控制当存在错误的时候,是否进行强制提交。所以第一个张飞会提交成功,数据表的结果是:关羽、张飞。你也可以看下看下第一个留言的同学的解答
共 2 条评论7 - 另至2019-07-25根据第十四篇-事务,原子性:要不全部成功,要不全部失败。
作者回复: 原子是这个特点,不过在代码操作的时候,如果在一个事务中遇到的错误,还是可以强制进行COMMIT的,这时会把这个事务中成功执行的部分进行提交。你可以运行下 文章中给到的代码
7 - 另至2019-07-25答案是:“关羽” 根据第十四篇-事务中原子性的描述:要不全部成功要不全部失败。 第一个事务成功插入“关羽” 第二个事务,第一条插入“张飞”成功,第二条插入“张飞”失败。 所以第二个事务整体回滚,一条“张飞”都没插入。 所以结果只有“关羽”展开
作者回复: 对事务ACID的理解是这样的,不过在程序中是需要自己来控制的,如果遇到了错误,还继续执行COMMIT的话,也会让事务中正确的部分进行提交。所以你可以跑一遍代码,运行结果应该是 关羽,张飞。
5 - ack2019-07-24思考题: 自己想出来是只有关羽一条,因为name是主键,插入两条导致第二个事务回滚。但实际运行后结果是关羽、张飞。不知道是为什么,望老师解答。(mysql的autocommit=1,隔离级别是可重复读)
作者回复: 如果出现异常,这时强制提交的话, 会将操作成功的进行提交
共 3 条评论4 - Cue2019-07-24很详细的答疑,赞
作者回复: 感谢
4 - Geek_77772019-08-07OLAP可以详细讲一下么?
作者回复: OLAP更偏数据分析,业务端,比如 Apache Kylin
3 - 一叶知秋2019-07-25老师 我也想问个问题。。。 之前提到过SQL执行的顺序是:FROM > WHERE > GROUP BY > HAVING > SELECT 的字段 > DISTINCT > ORDER BY > LIMIT 1)既然limit是最后执行的那么为何limit可以避免全表扫描。 2) 假如select的字段不包含order by字段那么是否在distinct产生的虚拟表上还要添加列?共 1 条评论3
- 庞鑫华2019-07-25老师,请问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
3 - mickey2019-07-24答案是 name 关羽 张飞
作者回复: 正确
3 - NO.92019-07-24在sql语句里 怎么指定使用哪个索引呢? 是像oracle里那样用hint么?
作者回复: 对的,可以使用hint,不同DBMS方法略有不同: Oracle:/*+ index(索引名称) */ SQL Serve:WITH (INDEX(索引名称)) MySQL:FORCE INDEX(索引名称) 比如我们查询player表的时候想要强制使用player_name进行索引,可以写成: Oracle: SELECT /*+ INDEX(player_name) */ FROM player SQL Server: SELECT player_id, team_id, player_name FROM player WITH(INDEX(player_name)) MySQL:SELECT player_id, team_id, player_name FROM player FORCE INDEX(player_name)
共 2 条评论2 - 上善若水2020-12-25查询结果是:关羽 张飞。 但数据库里其实是关羽,张飞是幻读了1
- Geek_b88c9a2020-10-26请问老师每次执行DROP TABLE IF EXISTS test 这句的时候都特别慢是什么原因呢?1
- 不似旧日2019-11-22好复杂哦
作者回复: 慢慢来
1 - 神码也不懂2019-08-07老师 我问个问题,SQL的执行顺序 1、from 2、join 3、on 4、where 5、group by 6、having 7、select;其中第一步是首先对from子句前连个表执行一个笛卡儿积,生成虚拟表vt1,第二部对vt1应用on筛选器;我的问题是:如果这样的话那是不是笛卡儿积是不是无论怎么优化,只要表连接一定会有笛卡儿积? 麻烦老师有时间的时候帮我解答一下,谢谢老师
作者回复: 对 但是多张表连接顺序不同,导致的计算量也是不同的,所以即使都会有笛卡尔积,也还是存在个优化问题
1 - Goal2019-07-25太乙真人太太,真开心,哈哈哈。
作者回复: 哈哈 这时专栏里的一个同学举的例子,我觉得不错,挺好的说明了通配符的使用
1 - Ronnyz2019-07-24作业:关羽 张飞
作者回复: 对的 答案正确,是关羽,张飞
1 - liuyyy2019-07-24老师我想问下索引,你文中多次提到了这个,还包括二级索引,添加索引等,我理解的索引就只有像python中的index等,为什么还有多个索引这个说法呢
作者回复: 多个索引,就是多种检索方式,比python的数据结构要复杂一些。因为你用SQL检索数据的时候,不同的SQL查询,可能采用的索引方式不同,所以你可以实现定义出来哪些字段可以被设置为索引,方便后续查询时使用
1 - 年少挽滑稽世无双2022-09-12 来自四川答案: name 关羽 张飞 不过,这里要注意commit要单独执行,强制提交。