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必知必会
登录|注册

13丨什么是存储过程,在实际项目中用得多么?

陈旸 2019-07-10
上一节我介绍了视图,它是 SQL 中的一个重要应用,使用视图对 SQL 查询进行封装,可以让 SQL 的代码结构更清晰,让用户权限管理更安全。
今天我来讲一下 SQL 的存储过程,它是 SQL 中另一个重要应用,和视图一样,都是对 SQL 代码进行封装,可以反复利用。它和视图有着同样的优点,清晰、安全,还可以减少网络传输量。不过它和视图不同,视图是虚拟表,通常不对底层数据表直接操作,而存储过程是程序化的 SQL,可以直接操作底层数据表,相比于面向集合的操作方式,能够实现一些更复杂的数据处理。存储过程可以说是由 SQL 语句和流控制语句构成的语句集合,它和我们之前学到的函数一样,可以接收输入参数,也可以返回输出参数给调用者,返回计算结果。
今天有关存储过程的内容,你将重点掌握以下几个部分:
什么是存储过程,如何创建一个存储过程?
流控制语句都有哪些,如何使用它们?
各大公司是如何看待存储过程的?在实际工作中,我们该如何使用存储过程?

什么是存储过程,如何创建一个存储过程

存储过程的英文是 Stored Procedure。它的思想很简单,就是 SQL 语句的封装。一旦存储过程被创建出来,使用它就像使用函数一样简单,我们直接通过调用存储过程名即可。我在前面讲过,存储过程实际上由 SQL 语句和流控制语句共同组成。流控制语句都有哪些呢?这个我稍后讲解。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《SQL必知必会》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(48)

  • 捞鱼的搬砖奇
    DELIMITER //
    create procedure `get_sum_score`(IN roleMain VARCHAR(255),OUT total FLOAT)
    BEGIN
    select sum(hp_max) as sum_hp_max from heros where role_main=roleMain INTO total;
    END//
    DELIMITER ;

    call get_sum_score('坦克',@total);
    select @total
    2019-07-10
    12
  • 毛豆
    存储过程很重要,可不可以详细讲讲

    作者回复: 可以 考虑在进阶篇加一篇关于存储过程的使用。这个在工作中还比较常用

    2019-07-12
    6
  • Monday
    关于关于存储过程的版本控制请教以下两个问题,望老师回复,谢谢!
    1、版本控制指的是存储过程修改存储过程的定义,即修改存储过程的创建语句?
    2、请举例说明表索引发生了变化,会导致存储过程失效?
    2019-08-07
    3
  • 夜路破晓
    发现但凡字段一多,尤其是还带下划线的,比较容易出现创建表后,再from新建表会报错.比如第二例,即便是复写,因为未察觉的失误导致某个字段名写错,那么运行"战士"实例时会报错.但是我复制老师的代码运行无误.两相对照发现就是某个字段的某个字母或者下划线导致的.
    问题一:
    s varchar(255) 前面没有IN ,我能理解为参数类型默认是IN吗?
    问题二:
    运行CALL实例中,字段前加@是固定用法吗?
    2019-07-10
    1
    2
  • 高志强
    终于明白了啥是存储过程,谢谢老师~

    作者回复: 加油志强

    2019-11-01
    1
  • Monday
    老师的脑图总结得很到位,求共享啊。谢谢
    2019-08-07
    1
  • 柔软的胖
    存储过程用到了BEGIN关键字,是不是表示存储过程就是一个事务?
    2019-07-14
    1
    1
  • 林彦
    1. 课程里提到“IN 参数必须在调用存储过程时指定,而在存储过程中修改该参数的值不能被返回。”这里的IN 参数必须在调用存储过程时指定的含义是什么?我查询了MySQL的存储过程定义时可以不包含 IN 参数。这句话有表示当存储过程的定义语句里有 IN 参数时,存储过程的语句中必须用到这个 IN 参数吗?

    2. 提到存储过程的缺点时讲到高并发的场景下,数据库会采用分库分表的方式,对可扩展性要求高,这种情况下存储过程会增加数据库的压力。能简单对比讲解这种情况下存储过程是和普通的SQL语句比更增加数据库的压力吗?为什么?

    3. 一个课外话题。TeraData里的BTEQ感觉和存储过程一样能包含SQL语句(至少一部分,如DDL,DML),和流控制语句。另外还多了一些功能。作用上有点像存储过程的加强或延伸。另外能以文件方式(批处理)执行。不知道后面的课程会不会有更多类似这样的应用,或者通过存储过程实现自动化执行的内容。
    2019-07-13
    1
  • 我行我素
    CREATE PROCEDURE `get_sum_score`(
    OUT sum_hp_max FLOAT,
    s VARCHAR(255)
    )
    BEGIN
    SELECT sum(hp_max) FROM heros WHERE role_main = s INTO sum_hp_max;
    END

    CALL get_sum_score(@sum_hp_max, '法师');
    SELECT @sum_hp_max;
    2019-07-10
    1
  • 番茄
    请教下老师或者各位小伙伴,调用程序这里,直接call就出结果了,下面那句select为什么要加上呢

    CALL get_hero_scores(@max_max_hp, @min_max_mp, @avg_max_attack, '战士');
    SELECT @max_max_hp, @min_max_mp, @avg_max_attack;
    2019-11-26
  • 为啥存储过程对高并发支持不好呢?有一些同学也说不适合在oltp中跑,它不就也是发起一个简单的语句执行,具体执行的效率要看执行计划呀 ?
    2019-11-17
  • 丁丁历险记
    就是个毒瘤,慎用

    作者回复: 对 根据业务情况选择把,有些公司不用,也有一些公司在使用

    2019-11-14
    2
  • 扶幽
    小练习:
    DELIMITER //
    CREATE PROCEDURE get_sum_score(IN main_role1 VARCHAR(255), OUT sums INT)
    BEGIN
            SELECT SUM(hp_max) FROM heros WHERE main_role=main_role1;
    END //
    DELIMITER ;
    2019-10-28
  • whaleFall_
    注意:CREATE PROCEDURE `get_sum_score`这里不是单引号,是` `号哦~
    # 编写存储过程get_sum_score,用来得到某一类型英雄的最大生命值的总和

    CREATE PROCEDURE `get_sum_score`(
            OUT sum_max_hp FLOAT,
            IN s VARCHAR(255)
        )
    BEGIN
        SELECT
            sum(hp_max)
        FROM heros
        WHERE role_main = s
        INTO sum_max_hp;
    END

    # 调用存储过程
    CALL get_sum_score(@sum_max_hp,'战士')
    SELECT @sum_max_hp;
    2019-10-25
  • Coool
    CREATE PROCEDURE `get_sum_score`(out sum_max_hp float,in s varchar(255))
    BEGIN
        select sum(hp_max)
        from heros
        where role_main=s
        into sum_max_hp;
    END

    call get_sum_score(@sum_max_hp,'战士') ;
    select @sum_max_hp ;
    2019-10-22
  • 可以讲一下触发器吗?谢谢
    2019-10-17
  • Cola_
    delimiter //
    CREATE PROCEDURE `get_sum_scores`(
           OUT sum_max_hp FLOAT,
           s VARCHAR(255)
           )
    BEGIN
           SELECT SUM(hp_max) FROM heros WHERE role_main = s INTO sum_max_hp;
    END //
    delimiter ;

    call get_sum_scores(@sum_max_hp,’法师’);
    select @sum_max_hp;
    2019-10-17
  • fuzheng1998
    存储过程的调用具体是什么样的呢,如何传入参数呢
    2019-09-11
  • 未来的胡先森
    交作业了
    DELIMITER //
    CREATE PROCEDURE get_sum_score(
    OUT sum_max_hp FLOAT,
    t VARCHAR(255))
    BEGIN
    SELECT SUM(hp_max)
    FROM heros
    WHERE role_main=t
    INTO sum_max_hp;
    END //
    DELIMITER ;

    CALL get_sum_score(@sum_max_hp,'战士');
    SELECT @sum_max_hp;
    2019-08-08
  • Fargo
    mysql> CREATE PROCEDURE `get_sum_score`(
        -> OUT sum_max_score FLOAT,
        -> s VARCHAR(255))
        -> BEGIN
        -> SELECT SUM(hp_max) FROM heros WHERE role_main = s INTO sum_max_score; END;

    mysql> CALL get_sum_score(@sum_max_score, '射手');
    mysql> SELECT @sum_max_score;
    +----------------+
    | @sum_max_score |
    +----------------+
    | 57985 |
    +----------------+
    2019-07-24
收起评论
48
返回
顶部