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. C++入门经典-例4.10-使用static变量实现累加

    1:静态变量static可以分为静态局部变量和静态全局变量,静态局部变量的值在函数调用结束后不消失,静态全局变量只能在本源文件中使用. 静态变量属于静态存储方式,它具有以下特点: (1)静态变量在函数 ...

  2. 布尔 kotlin(4)

    布尔布尔用 Boolean 类型表示,它有两个值: true 和 false .若需要可空引用布尔会被装箱.内置的布尔运算有:||       – 短路逻辑或&&     – 短路逻辑 ...

  3. jquery 登录判断遇到的小问题

    1.碰到的第一个问题是: 往body上加载check,用load不管用,可以用ready试试. 2.原来jquery里获取用的val(),我一直以为是value()... 尴尬 3.两个标志位是为了判 ...

  4. 浅谈2-SAT

    引入: 相信大家都了解过差分约束系统.差分约束系统的大体意思就是给出一些有某种关系的变量,问你是否有某种赋值使得这些关系全部成立 其实\(2-SAT\)的题目描述和这个很像(虽然解法不一样) 那么\( ...

  5. ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design

    1. 摘要 最近,神经网络的架构设计都是基于计算复杂度的间接度量,比如 FLOPs.然而,直接的度量比如运行速度,其实也会依赖于内存访问和平台特性等其它因素. 因此本文建议直接在目标平台上用直接度量进 ...

  6. U盘无法拷贝大于4G的文件解决办法汇总

    U盘主要有三种格式: FAT32: 缺点:单个文件不能超过4GB,不支持512MB以下容量的U盘 备注:如果U盘容量达8GB以上,发现4GB文件拷不进去的话,可以考虑换用NTFS或ExFAT格式了 ● ...

  7. Linux_ubuntu命令-用户、权限管理

    用户是Unix/Linux系统工作中重要的一环,用户管理包括用户与组账号的管理. 在Unix/Linux系统中,不论是由本机或是远程登录系统,每个系统都必须拥有一个账号,并且对于不同的系统资源拥有不同 ...

  8. CSS 解决 a标签去掉下划线 text-decoration: none无效 的解决方案

    经过查阅,如果想要去掉a标签的默认效果,就要用text-decoration: none;,但是经过试验发现并不好用,可能是因为你用a标签里的class或id定义的CSS样式,就像这样: <di ...

  9. 第六章 SpringCloud之Ribbon负载均衡

    ###################使用默认的负载均衡(轮询)############################# 1.pom.xml <?xml version="1.0&q ...

  10. ControlTemplate in WPF —— Window

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x ...