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. Java字符串的替换(replace()、replaceFirst()和replaceAll())

    在 Java 中,String 类提供了 3 种字符串替换方法,分别是 replace().replaceFirst() 和 replaceAll(),本文将详细介绍它们的使用方法. replace( ...

  2. 程序代码运行结果是(abdcbdcb)

    public class Test { public static boolean show(char ch) { System.out.print(ch); return true; } publi ...

  3. C++入门经典-例4.7-变量的作用域

    1:代码如下: // 4.7.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  4. [翻译]剖析C#中的异步方法

    翻译自一篇博文,原文:Dissecting the async methods in C# 有些括号里的是译注或我自己的理解. 异步系列 剖析C#中的异步方法 扩展C#中的异步方法 C#中异步方法的性 ...

  5. 【JVM】jstack和dump线程分析(2)

    一:jstack jstack命令的语法格式: jstack  <pid>.可以用jps查看java进程id.这里要注意的是:1. 不同的 JAVA虚机的线程 DUMP的创建方法和文件格式 ...

  6. spark 笔记 12: Executor,task最后的归宿

    spark的Executor是执行task的容器.和java的executor概念类似. ===================start executor runs task============ ...

  7. android 注入框架 DI

    android 主要注入框架以及github如下: (1)Roboguice https://github.com/roboguice/roboguice (2)Butterknife https:/ ...

  8. HttpURLConnection 和HttpClient 哪个好

    最近在研究Volley框架的源码,发现它在HTTP请求的使用上比较有意思,在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android 2.2及以下版本,使用的是 ...

  9. DeepWalk 安装指南

    DeepWalk 安装指南 创建 conda 虚拟环境 conda create -n deepwalk pip python=3.5 conda activate deepwalk 安装 deepw ...

  10. java的replace和replaceAll

    都是全部替换,只不过后者参数为正则 replaceFirst()是替换第一个