1. 视图

1.1 视图前戏

我们之前讲有,临时表的概念。

  现在我们创建一个临时表:select * from (select * from tb1 where id between 10 and 100) as B where B.name = '李四'';

  上面的重命名的表B就是一个临时表,可以看出临时表是一个动态的查询过程生成的表。所以,临时表就是经过一条查询语句运行之后生成的表。现在想想一下,我们有的时候,是有可能经常使用到同一张临时表,我们总不能每次用一次临时表,就写同样的代码吧。那多累呀,所以,我们将一些常用的到的临时表规定的存放到某个地方,并有属于它们自己的名字,那再次使用的时候,就简单多了。

好了,上面这段话,其实已经引入了视图概念了!请继续!!

1.2 视图的定义

视图是一个虚拟表,其本质就是根据SQL语句获取动态的数据集合,并为其命名(视图名),当用户需要使用这个数据集合的时候,只需要使用视图名就可以获得到改数据集合(表)。

1.3 创建视图

  1. -- 格式:create view 视图名称 as SQL语句
  2. create view v1 as select * from tb1 where id>10

1.4 删除视图

  1. -- 格式:drop view 视图名称
  2. drop view v1

1.5 修改视图

  1. -- 格式:alter view 视图名称 as SQL语句
  2. alter view v1 as select * from tb1 where id<10

1.6 使用视图

  1. 视图并不是真实的物理表,而是虚拟出来的虚拟表,里面的数据通过对物理表的查询而得到的,所以,视图不能“单独”插入数据和删除里面数据。但可以通过修改sql语句来修改视图
    视图都是做查询使用!
  1. select * from v1

2. 触发器

对某个表进行【增 / 删 / 改】操作的前后,如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行【增 / 删 / 改】前后的行为。通俗的说:就是通过事件(增 \ 删 \ 改)会触发自动触发某个语句的过程。

2.1 创建触发器

  1. -- 插入前
  2.   -- 格式:create trigger 触发器名 before insert on 表名 for each row
  3.   -- begin
  4.   -- insert 语句
  5.   -- …………
  6.   -- end
    -- 插入后
      -- 格式:create trigger 触发器名 after insert on 表名 for each row
      -- begin
      --   insert 语句
      --   ………………
      -- end
    -- 删除前
      -- 格式:create trigger 触发器名 before delete on 表名 for each row
      -- begin
      --   
      -- end
    -- 删除后
      -- 格式:create trigger 触发器名 after delete on 表名 for each row
      -- begin
      -- ………………
      -- end
    -- 更新前
      -- 格式:create trigger 触发器名 before update on 表名 for each row
      -- begin
      -- ………………
      -- end
    -- 更新后
      -- 格式:create trigger 触发器名 after update on 表名 for each row
      -- begin
      -- ………………
      -- end
  1. delimiter //
  2. create trigger tri_before_insert_tb1 before insert on tb1 for each row
  3. begin
  4. if new.name == '小周' then
  5. insert into tb2(name) values('张三'),('李四')
  6. end
  7. end //
  8. delimiter;
  1. delimiter //
  2. create trigger tri_after_insert_tb1 after insert on tb1 for each row
  3. begin
  4. if new.id = 555 then
  5. insert into tb2(name) values ('张三')('李四')
  6. elseif new.id = 666 then
  7. insert into tb2(name) values ('张大麻子')('李二奎')
  8. end
  9. end//
  10. delimiter;

特别的:NEW 代表新插入的数据,OLD代表即将删除的数据

2.2 删除触发器

  1. drop trigger tri_after_insert_tb1;

2.3 使用触发器

触发器,本身是不能直接使用的。触发器的使用,是在创建触发器的之后,由对已经创建触发器的表进行【增 \ 删 \ 改】的操作而引起的。

例如对于插入前触发器来说,当运行下面的SQL语句之后会触发到触发器:

  1. insert into tb1(name) values('小周');

3. 函数

3.1 内置函数

  1. CHAR_LENGTH(str)
  2. 返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
  3. 对于一个包含五个二字节字符集, LENGTH()返回值为 10, CHAR_LENGTH()的返回值为5
  4.  
  5. CONCAT(str1,str2,...)
  6. 字符串拼接
  7. 如有任何一个参数为NULL ,则返回值为 NULL
  8. CONCAT_WS(separator,str1,str2,...)
  9. 字符串拼接(自定义连接符)
  10. CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
  11.  
  12. CONV(N,from_base,to_base)
  13. 进制转换
  14. 例如:
  15. SELECT CONV('a',16,2); 表示将 a 16进制转换为2进制字符串表示
  16.  
  17. FORMAT(X,D)
  18. 将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若 D 0, 则返回结果不带有小数点,或不含小数部分。
  19. 例如:
  20. SELECT FORMAT(12332.1,4); 结果为: '12,332.1000'
  21. INSERT(str,pos,len,newstr)
  22. str的指定位置插入字符串
  23. pos:要替换位置其实位置
  24. len:替换的长度
  25. newstr:新字符串
  26. 特别的:
  27. 如果pos超过原字符串长度,则返回原字符串
  28. 如果len超过原字符串长度,则由新字符串完全替换
  29. INSTR(str,substr)
  30. 返回字符串 str 中子字符串的第一个出现位置。
  31.  
  32. LEFT(str,len)
  33. 返回字符串str 从开始的len位置的子序列字符。
  34.  
  35. LOWER(str)
  36. 变小写
  37.  
  38. UPPER(str)
  39. 变大写
  40.  
  41. LTRIM(str)
  42. 返回字符串 str ,其引导空格字符被删除。
  43. RTRIM(str)
  44. 返回字符串 str ,结尾空格字符被删去。
  45. SUBSTRING(str,pos,len)
  46. 获取字符串子序列
  47.  
  48. LOCATE(substr,str,pos)
  49. 获取子序列索引位置
  50.  
  51. REPEAT(str,count)
  52. 返回一个由重复的字符串str 组成的字符串,字符串str的数目等于count
  53. count <= 0,则返回一个空字符串。
  54. str count NULL,则返回 NULL
  55. REPLACE(str,from_str,to_str)
  56. 返回字符串str 以及所有被字符串to_str替代的字符串from_str
  57. REVERSE(str)
  58. 返回字符串 str ,顺序和字符顺序相反。
  59. RIGHT(str,len)
  60. 从字符串str 开始,返回从后边开始len个字符组成的子序列
  61.  
  62. SPACE(N)
  63. 返回一个由N空格组成的字符串。
  64.  
  65. SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
  66. 不带有len 参数的格式从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对pos 使用一个负值。
  67.  
  68. mysql> SELECT SUBSTRING('Quadratically',5);
  69. -> 'ratically'
  70.  
  71. mysql> SELECT SUBSTRING('foobarbar' FROM 4);
  72. -> 'barbar'
  73.  
  74. mysql> SELECT SUBSTRING('Quadratically',5,6);
  75. -> 'ratica'
  76.  
  77. mysql> SELECT SUBSTRING('Sakila', -3);
  78. -> 'ila'
  79.  
  80. mysql> SELECT SUBSTRING('Sakila', -5, 3);
  81. -> 'aki'
  82.  
  83. mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
  84. -> 'ki'
  85.  
  86. TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) TRIM(remstr FROM] str)
  87. 返回字符串 str 其中所有remstr 前缀和/或后缀都已被删除。若分类符BOTHLEADINTRAILING中没有一个是给定的,则假设为BOTH remstr 为可选项,在未指定情况下,可删除空格。
  88.  
  89. mysql> SELECT TRIM(' bar ');
  90. -> 'bar'
  91.  
  92. mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
  93. -> 'barxxx'
  94.  
  95. mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
  96. -> 'bar'
  97.  
  98. mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
  99. -> 'barx'

内置函数

3.2 自定义函数

  1. -- 有返回值的函数
    delimiter \\
  2. create function foo1(
  3. i1 int,
  4. i2 int)
  5. return int
  6. begin
  7. declare num int,
  8. set num = i1 + i2;
  9. return (num);
  10. end \\
  11. delimiter;

3.3 删除函数

  1. drop function foo1;

3.4 使用函数

  1. -- 获取返回值
  2. declare @i varchar(32);
  3. select upper('alex') into @i;
  4. select @i;
  5.  
  6. -- 在查询中使用
  7. 内容在更新………………

注意:函数体(begin………………end)里面不能写select SQL语句

4. 存储过程

存储过程:就是一段SQL语句,在MySQL软件起的一个别名。

注意:相对于函数的话,存储过程是没有返回值的,也就是没有return的

4.1 创建存储过程

  

  1. -- 1.一般存储过程创建
  2. create procedure p1()
  3. begin
  4. select * from student;
  5. insert into teacher(tname) values('张三');
  6. end
  7. -- 调用过程
  8. MySQL终端的方法:call p1()
  9. python上的方法:cursor.callproc('p1')
  10.  
  11. -- 2.传参数(inoutinout)待参数的存储过程:
  12. 参数in的使用
  13. delimiter //
  14. create procedure p2(
  15. in n1 int,
  16. in n2 int)
  17. begin
  18. select * from student where sid>n1;
  19. end //
  20. delimiter;
  21. -- 调用过程
  22. MySQL终端的方法:call p2()
  23. python上的方法:cursor.callproc('p2',(12,2))
  24.  
  25. -- 3.参数out(inout)的使用
  26.  
  27. delimiter //
  28. create procedure p3(
  29. in n1 int,
  30. out n2 int,
  31. inout i3 int)
  32. begin
  33.   declare temp int;
            set temp=1;
            set ret1 = n1 + n2 +temp;
            set ret2 = i3 + temp;
  34. end //
  35. delimiter;
  36. -- 调用过程
  37. MySQL终端的方法:
          set @ret_o1 = 4;
          set @ret_o2 = 0;
          call p3(10,@ret_o1,@ret_o2);
          select @ret_o1,@ret_o2;
  38. python上的方法:见下面!

4.2 删除存储过程

4.3 使用存储过程

MySQL第三讲 一一一一 视图、触发器、函数、存储过程的更多相关文章

  1. mysql 查询表,视图,触发器,函数,存储过程

    1. mysql查询所有表: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名' AND  TAB ...

  2. python 全栈开发,Day64(视图,触发器,函数,存储过程,事务)

    昨日内容回顾 pymysql:属于python的一个模块 pip3 install pymysql conn = pymysql.connect(...,charset = 'uft8') 创建游标 ...

  3. MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称

    MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称   INFORMATION_SCHEMA.TABLES INFORMATION_SCHEMA. ...

  4. MySQL——视图/触发器/事务/存储过程/函数/流程控制

    一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  5. MySQL 5.6 主从复制如何处理——触发器,函数,存储过程,调度事件

      截图来自MySQL5.6的pdf版文档. 说明: 1)基于语句的复制时,trigger会在slave上执行,所以slave上也需要有trigger的定义,不然会导致主从数据不一致的: 2)基于行的 ...

  6. mysql 视图 触发器 事物 存储过程 函数 流程控制

    1.视图 *** 视图是有一条sql语句的查询结果构成的虚拟表 其不是物理存在的 使用方式与普通表相同 视图的作用1.简化sql语句的编写 2.限制可以查看的数据 可以使用权限来完成 权限某一个库 的 ...

  7. MySQL 视图触发器事务存储过程函数

    事务  致命三问 什么是事务:开启了一个包含多条SQL语句的事务,这些SQL语句要么都执行成功,要么有别想成功:例如A向B转账,二人账户并不属于一家银行,在转账过程中由于网络问题,导致A显示转账 成功 ...

  8. MySQL拓展 视图,触发器,事务,存储过程,内置函数,流程控制,索引,慢查询优化,数据库三大设计范式

    视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view tea ...

  9. MySQL 视图 触发器 事务 存储过程 函数 流程控制 索引与慢查询优化

    视图 1.什么是视图? 视图就是通过查询得到的一张虚拟表,然后保存下来,下次可直接使用 2.为什么要使用视图? 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图? create view ...

  10. MySQL视图,触发器,事务,存储过程,函数

    create triggr triafterinsertcmdlog after insert on cmd_log FOR EACH ROW trigger_body .#NEW : 代表新的记录 ...

随机推荐

  1. 整理ing

    RT 要学习的 专克bzoj权限题 钟神p系列

  2. 浅谈Manacher算法

    Manacher manacher是一种\(O(n)\)求最长回文子串的算法,俗称马拉车(滑稽) 直接步入正题 首先可以知道的是:每一个回文串都有自己的对称中心,相应的也有自己的最大延伸长度(可以称之 ...

  3. cors 预请求

    1.CORS的其他限制 默认允许的方法只有:GET.HEAD.POST默认允许的Content-Type:text/plain.multipart/form-data.applicaton/x-www ...

  4. OpenCV学习笔记(3)——图像的基本操作

    获取图像的像素值并修改 获取图像的属性(信息) 图像的ROI() 图像通道的拆分及合并 1.获取并修改像素值 先读入图像装入一个图像实体,然后该实体相当于一个多维list,可以直接用数组操作提取像素信 ...

  5. inner join, left join, right join, full outer join的区别

    总的来说,四种join的区别可以描述为: left join 会从左表(shop)那里返回所有的记录,即使在右表(sale_detail)中没有匹配的行. right outer join 右连接,返 ...

  6. JAVA基础面试汇总

    一.基础知识:1.JVM.JRE和JDK的区别:    JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性.                  java ...

  7. KNN原理小结

    K近邻法(K-nearest neighbors,KNN)既可以分类,也可以回归. KNN做回归和分类的区别在于最后预测时的决策方式.KNN做分类时,一般用多数表决法:KNN做回归时,一般用平均法. ...

  8. Jmeter测试工具的下载使用

    Jmeter是一个非常好用的压力测试工具.  Jmeter用来做轻量级的压力测试,非常合适,只需要十几分钟,就能把压力测试需要的脚本写好.

  9. 第四章 SpringCloud之Eureka-Client实现服务(Jpa,H2)

    1.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  10. Selenium 2自动化测试实战11(键盘事件)

    一.键盘事件 1.Keys()类提供了键盘上几乎所有按键的方法,如下实例: #coding:utf-8 from selenium.webdriver.common.keys import Keys ...