SQL基础随记2 视图 存储过程

 

View

  • CREATE/ALTER/DROP VIEW ViewName as SELECT(...)
  • 可以在视图的基础上继续创建视图,即,将之前创建的视图当做表名放在新视图的select语句中

  • 利用视图进行数据格式化(就是对字段进行重新组合与拼接)

    CREATE VIEW View_player_team AS
    SELECT CONCAT(player_name, '(' , team.team_name , ')') AS player_team
    FROM player JOIN team WHERE player.team_id = team.team_id
  • 视图具有安全性,因为视图是虚拟表,即使对视图做出了修改,也不会影响底层数据。

 

PROCEDURE

  • 存储过程就像“自定义函数”,它是SQL语句和流控制语句的集合,它可以接受参数,也可以返回参数。

  • 存储过程可以(不是一定)直接对底层数据表进行操作

  • CREATE PROCEDURE name(参数)
    BEGIN
    需要执行的过程
    END

    举例1,

    DELIMITER //
    
    CREATE PROCEDURE `存储过程名`(形参)
    BEGIN
    循环体
    END // DELIMITER;

    调用存储过程举例

    CALL `存储过程名`(实参);
    select @(out参数)
    • DELIMITER是将分隔符变为 // (也可以使用其他的),因为流控制语句中的语句需要;分割,此举是避免混淆

    • 开头和结尾的DELIMITER都是另起一行mysql shell

    • 存储过程名用的不是单引号,是反引号,也可以不加

    • 流控制语句

      DECLIARE --- 声明变量
      SET --- 初始化,赋值
      IF...THEN...;END IF; REPEAT...UNTIL...END REPEAT --- 满足UNTIL后面的表达式则退出循环
      WHILE...DO...END WHILE --- 先判断条件,满足则循环
      labelName:LOOP...(IF...THEN...LEAVE labelName;END IF;)...END LOOP labelName;
      CONTINUT;
      BREAK;
      RETURN;
      GOTO (label) WAITFOR TIME 'time' --- 在某个时刻执行
      WAITFOR DELAY 'time' --- 延迟某个时间执行
      SELECT...INTO... --- 将查询表中的结果放入变量中
  • 参数类型

    • IN --- 传入参数,无法返回,不写参数类型默认为IN
    • OUT --- 将存储过程的计算结果放入OUT参数中并用于返回
    • INOUT --- 既用于传入参数又可以将结果存入该参数中用于返回
  • PROCEDURE的优点

    • 安全性强,设定存储过程的时候可以设置对用户的使用权限
    • 执行效率快,在MySQL数据库服务器端执行
    • 通过封装,减少网络传输量
  • PROCEDURE的缺点 --- 阿里等公司不推荐使用的原因

    • 调试困难,仅少部分DBMS支持调试
    • 可移植性差
    • 版本管理困难
    • 不适合高并发场景 --- 高并发需要减小数据库压力,可能会采用分库分表的方式且对拓展性要求高。在这种情况下,存储过程变得难以维护且会增加数据库的压力

 

procedure 举例1 按某个字段对表进行查询

  • 查看已有测试表

    mysql> SELECT * FROM t;
    +----+------+
    | Id | nums |
    +----+------+
    | 1 | 2 |
    +----+------+
    1 row in set (0.00 sec)

    创建存储过程

    mysql> DELIMITER //
    mysql> CREATE PROCEDURE `findByNums`(IN n int)
    -> BEGIN
    -> SELECT * FROM t WHERE nums = n;
    -> END //
    Query OK, 0 rows affected (0.03 sec)

    检验

    mysql> DELIMITER ;
    mysql> CALL findByNums(2);
    +----+------+
    | Id | nums |
    +----+------+
    | 1 | 2 |
    +----+------+
    1 row in set (0.03 sec) Query OK, 0 rows affected (0.03 sec)

    (传入不同参数)

    mysql> CALL findByNums(1);
    Empty set (0.00 sec) Query OK, 0 rows affected (0.00 sec)

     

  • 查询存储过程

    mysql> SELECT * FROM mysql.proc WHERE db = 'test' AND type = 'procedure';

 

procedure 举例2 计算累和结果

  • 使用存储过程传入/传出参数查询输出

    mysql> delimiter //
    mysql> create procedure `add_sum`(in n int, out result int)
    -> begin
    -> declare i int;
    -> declare sum int;
    -> set i = 1;
    -> set sum = 0;
    -> while i < n do
    -> set sum = sum + i;
    -> set i = i + 1;
    -> end while;
    -> end //
    Query OK, 0 rows affected (0.00 sec) mysql> delimiter ;
    mysql> call add_sum(50,@result);
    Query OK, 0 rows affected (0.00 sec) mysql> select @result;
    +---------+
    | @result |
    +---------+
    | 1225 |
    +---------+
    1 row in set (0.00 sec)
  • 无法直接@存储过程中的变量

    mysql> create procedure `add_sum_procedure`(in n int)
    -> begin
    -> declare i int;
    -> declare sum int;
    -> set i = 1;
    -> set sum = 0;
    -> while i < n do
    -> set sum = sum + i;
    -> set i = i + 1;
    -> end while;
    -> end //
    Query OK, 0 rows affected (0.00 sec) mysql> delimiter ;
    mysql> call add_sum_procedure(10);
    Query OK, 0 rows affected (0.01 sec) mysql> select @sum;
    +------+
    | @sum |
    +------+
    | NULL |
    +------+
    1 row in set (0.01 sec)

查询所有存储过程/视图 等等

 

最新文章

  1. 结合ABP源码实现邮件发送功能
  2. iOS 相机
  3. 轮播插件unsilder 源码解析(二)
  4. 烂泥:php5.6源码安装及php-fpm配置
  5. coreData,sqlite3,fmdb对比
  6. ASPxGridView中批量提交及个别提交的写法
  7. 清除windows的EFS加密
  8. [Javascript] bukld &#39;SQL&#39; like object tree
  9. 移动app的一些心得
  10. Unity3d之协程自实现测试
  11. NYOJ--541--最强DE 战斗力(递推)
  12. Python冒号的解释
  13. Android官方技术文档翻译——迁移 Gradle 项目到1.0.0 版本
  14. python-边练边学
  15. 死磕nginx系列--nginx入门
  16. Java 公历转农历,然后农历减一年(或者几天或者任意天),再把这个日期转成公历
  17. Html单引号,双引号转义
  18. springboot取得resources下的文件
  19. 利用ImageOps调整图片的Aspect Ratio(给图片添加borders)
  20. BeanUtils.copyProperties不能copy复杂对象List的解决方式

热门文章

  1. vscode的个人配置
  2. FTM-100DR、FTM-400DR、FTM-400XDR和DR-1X 连接MMDVM中继板接线图BG7IYN
  3. css背景图片加载失败,页面部分图标无法显示
  4. https://www.cnblogs.com/mrchige/p/6409444.html
  5. 小师妹学JavaIO之:目录还是文件
  6. mysql基础-数据库初始化操作必要步骤和客户端工具使用-记录(二)
  7. 解决intellij idea卡顿的方法
  8. Java并发相关知识点梳理和研究
  9. 深入理解PHP原理之Opcodes
  10. Xor Sum(讲解异或)【字典树】