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 创建视图

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

1.4 删除视图

-- 格式:drop view 视图名称
drop view v1

1.5 修改视图

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

1.6 使用视图

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

2. 触发器

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

2.1 创建触发器

-- 插入前
  -- 格式:create trigger 触发器名 before insert on 表名 for each row
  -- begin
  -- insert 语句
  -- …………
  -- 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
delimiter //
create trigger tri_before_insert_tb1 before insert on tb1 for each row
begin
if new.name == '小周' then
insert into tb2(name) values('张三'),('李四')
end
end //
delimiter;
delimiter //
create trigger tri_after_insert_tb1 after insert on tb1 for each row
begin
if new.id = 555 then
insert into tb2(name) values ('张三')('李四')
elseif new.id = 666 then
insert into tb2(name) values ('张大麻子')('李二奎')
end
end//
delimiter;

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

2.2 删除触发器

drop trigger tri_after_insert_tb1;

2.3 使用触发器

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

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

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

3. 函数

3.1 内置函数

CHAR_LENGTH(str)
返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
对于一个包含五个二字节字符集, LENGTH()返回值为 10, 而CHAR_LENGTH()的返回值为5。 CONCAT(str1,str2,...)
字符串拼接
如有任何一个参数为NULL ,则返回值为 NULL。
CONCAT_WS(separator,str1,str2,...)
字符串拼接(自定义连接符)
CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。 CONV(N,from_base,to_base)
进制转换
例如:
SELECT CONV('a',16,2); 表示将 a 由16进制转换为2进制字符串表示 FORMAT(X,D)
将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若 D 为 0, 则返回结果不带有小数点,或不含小数部分。
例如:
SELECT FORMAT(12332.1,4); 结果为: '12,332.1000'
INSERT(str,pos,len,newstr)
在str的指定位置插入字符串
pos:要替换位置其实位置
len:替换的长度
newstr:新字符串
特别的:
如果pos超过原字符串长度,则返回原字符串
如果len超过原字符串长度,则由新字符串完全替换
INSTR(str,substr)
返回字符串 str 中子字符串的第一个出现位置。 LEFT(str,len)
返回字符串str 从开始的len位置的子序列字符。 LOWER(str)
变小写 UPPER(str)
变大写 LTRIM(str)
返回字符串 str ,其引导空格字符被删除。
RTRIM(str)
返回字符串 str ,结尾空格字符被删去。
SUBSTRING(str,pos,len)
获取字符串子序列 LOCATE(substr,str,pos)
获取子序列索引位置 REPEAT(str,count)
返回一个由重复的字符串str 组成的字符串,字符串str的数目等于count 。
若 count <= 0,则返回一个空字符串。
若str 或 count 为 NULL,则返回 NULL 。
REPLACE(str,from_str,to_str)
返回字符串str 以及所有被字符串to_str替代的字符串from_str 。
REVERSE(str)
返回字符串 str ,顺序和字符顺序相反。
RIGHT(str,len)
从字符串str 开始,返回从后边开始len个字符组成的子序列 SPACE(N)
返回一个由N空格组成的字符串。 SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
不带有len 参数的格式从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos。 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对pos 使用一个负值。 mysql> SELECT SUBSTRING('Quadratically',5);
-> 'ratically' mysql> SELECT SUBSTRING('foobarbar' FROM 4);
-> 'barbar' mysql> SELECT SUBSTRING('Quadratically',5,6);
-> 'ratica' mysql> SELECT SUBSTRING('Sakila', -3);
-> 'ila' mysql> SELECT SUBSTRING('Sakila', -5, 3);
-> 'aki' mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
-> 'ki' TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) TRIM(remstr FROM] str)
返回字符串 str , 其中所有remstr 前缀和/或后缀都已被删除。若分类符BOTH、LEADIN或TRAILING中没有一个是给定的,则假设为BOTH 。 remstr 为可选项,在未指定情况下,可删除空格。 mysql> SELECT TRIM(' bar ');
-> 'bar' mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
-> 'barxxx' mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
-> 'bar' mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
-> 'barx'

内置函数

3.2 自定义函数

-- 有返回值的函数
delimiter \\
create function foo1(
i1 int,
i2 int)
return int
begin
declare num int,
set num = i1 + i2;
return (num);
end \\
delimiter;

3.3 删除函数

drop function foo1;

3.4 使用函数

-- 获取返回值
declare @i varchar(32);
select upper('alex') into @i;
select @i; -- 在查询中使用
内容在更新………………

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

4. 存储过程

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

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

4.1 创建存储过程

  

-- 1.一般存储过程创建
create procedure p1()
begin
select * from student;
insert into teacher(tname) values('张三');
end
-- 调用过程
在MySQL终端的方法:call p1()
在python上的方法:cursor.callproc('p1') -- 2.传参数(in,out,inout)待参数的存储过程:
参数in的使用
delimiter //
create procedure p2(
in n1 int,
in n2 int)
begin
select * from student where sid>n1;
end //
delimiter;
-- 调用过程
在MySQL终端的方法:call p2()
在python上的方法:cursor.callproc('p2',(12,2)) -- 3.参数out(inout)的使用 delimiter //
create procedure p3(
in n1 int,
out n2 int,
inout i3 int)
begin
  declare temp int;
        set temp=1;
        set ret1 = n1 + n2 +temp;
        set ret2 = i3 + temp;
end //
delimiter;
-- 调用过程
在MySQL终端的方法:
      set @ret_o1 = 4;
      set @ret_o2 = 0;
      call p3(10,@ret_o1,@ret_o2);
      select @ret_o1,@ret_o2;
在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. Springboot 使用 webSocket

    介绍 WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进 ...

  2. Ajax学习--理解 Ajax 及其工作原理

    Ajax 是 Asynchronous JavaScript and XML(以及 DHTML 等)的缩写. 下面是 Ajax 应用程序所用到的基本技术:• HTML 用于建立 Web 表单并确定应用 ...

  3. C++面向对象实践

    实践如下: class Person{ private: int age; ]; int hight; public: Person(int age, int hight, char* name); ...

  4. defineProperty

    ### Object.defineProperty() https://segmentfault.com/a/1190000007434923方法会直接在一个对象上定义一个新属性,或者修改一个已经存在 ...

  5. slub

    1.前言 在Linux中,伙伴系统(buddy system)是以页为单位管理和分配内存.但是现实的需求却以字节为单位,假如我们需要申请20Bytes,总不能分配一页吧!那岂不是严重浪费内存.那么该如 ...

  6. 阶段3 2.Spring_08.面向切面编程 AOP_7 通用化切入点表达式

    下面配置了通用的表达式,,上面的四个就不用再配置那么长 索罗的切入点表达式了. 节省了每次都要写一长段表达式的过程 写在一个aop:aspect这个切面下面就只能当前切面用 写在切面里面 运行测试 挪 ...

  7. I/O检测介绍

    I/O性能监测可总结如下:* 任何时间出现CPU等待IO,说明磁盘超载.* 计算出你的磁盘可维持的IOPS值.* 判定你的应用是属于随机磁盘访问型还是有序型.* 通过对比等待时间和服务时间即可判断磁盘 ...

  8. python字符串判断

    s为字符串 s.isalnum() 所有字符都是数字或者字母 s.isalpha() 所有字符都是字母 s.isdigit() 所有字符都是数字 s.islower() 所有字符都是小写 s.isup ...

  9. Oracle 归档日志管理

    一.Oracle日志介绍 1.Oracle日志分类 分三大类: Alert log files--警报日志,Trace files--跟踪日志(用户和进程)和            redo log ...

  10. 7.接入类流程-PRACH优化

    PRACH优化 就是伪随机序列随机码(前导序列码).优化的目的就是减小码与码之间碰撞的 基站广播伪随机序列码(如64个),终端挑选一个发送.不同的用户使用同一个码就会产生碰撞.同频组网情况下,邻区的伪 ...