MySQL视图view/存储过程和函数的使用

Posted sold_out

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL视图view/存储过程和函数的使用相关的知识,希望对你有一定的参考价值。

**************************************

MySql视图view的使用:创建、修改、删除

***************************************

1. MySql建视图

创建视图与创建表语法类似,不同的是创建视图是从一条查询语句创建的。视图创建后,可以像一张表一样使用,但只能用于数据查询,如:可以在一个查询中使用、可以在存储过程中、可以在另一个视图中使用。mysql创建视图语法如下:

CREATE VIEW 视图名 AS SELECT 查询语句;

 

2. MySql视图修改

已经创建的视图,有时会需要修改其查询字段或查询条件,MySql视图修改语法如下:

ALTER VIEW 视图名 AS SELECT 查询语句;

 

3. MySql视图删除

MySql视图删除语法与删除表DROP TABLE类型,语法如下:

DROP VIEW 视图名;

 

3. MySql视图使用

创建好视图之后,可以直接通过视图名使用视图,语法如下:

SELECT * FROM 视图名

 

***************************************

CREATE VIEW语句简介

***************************************

要在MySQL中创建新视图,请使用CREATE VIEW语句。MySQL中创建视图的语法如下:

 

让我们更详细地查看了解以上语法。

视图处理算法

算法属性允许您控制MySQL在创建视图时使用的机制。MySQL提供三种算法:MERGE,TEMP TABLE和UNDEFINED

  • 使用MERGE算法,MySQL首先将输入查询与定义视图的SELECT语句组合成单个查询。 然后MySQL执行组合查询以返回结果集。如果SELECT语句包含聚合函数,如:MIN, MAX, SUM, COUNT, AVG或DISTINCT, GROUP BY, HAVING, LIMIT, UNION, UNION ALL,子查询 等等则不允许MERGE算法。如果SELECT语句没有引用表,则也不允许MERGE算法。如果不允许MERGE算法,MySQL将算法更改为UNDEFINED。 注意,输入查询和视图定义中的查询到一个查询的组合被称为视图决议。
  • 使用TEMP TABLE算法,MySQL首先根据定义视图的SELECT语句创建一个临时表,然后对该临时表执行输入查询。因为MySQL必须创建一个临时表来存储结果集,并将数据从基表移动到临时表,TEMP TABLE算法的效率低于MERGE算法。此外,使用TEMP TABLE算法的视图不可更新
  • UNDEFINED是创建视图时未指定显式算法的默认算法。UNDEFINED算法让MySQL做出选择使用MERGE或TEMP TABLE算法。MySQL优先选择MERGE算法再到TEMP TABLE算法,因为MERGE算法更有效率。

视图名称

在数据库中,视图和表共享相同命名空间,因此,视图和表不能具有相同的名称。 此外,视图的名称必须遵循表命名规则。

SELECT语句

SELECT语句中,可以从数据库中存在的任何表或视图查询数据。SELECT语句必须遵循几个规则:

  • SELECT语句可以在WHERE子句中包含子查询,但不能在FROM子句中。
  • SELECT语句不能引用任何变量,包括局部变量,用户变量和会话变量。
  • SELECT语句不能引用预处理语句的参数。

注意,SELECT语句不需要引用任何表。

 

 

 

 

 

**********************************************

Mysql中创建存储过程和函数的语法

**********************************************

mysql中存储过程和函数的语法非常接近所以就放在一起,主要区别就是函数必须有返回值,并且函数的参数只有IN类型而存储过程有IN、OUT、INOUT这三种类型。

 

例子:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#创建数据库

DROP DATABASE IF EXISTS Dpro;

CREATE  DATABASE Dpro

CHARACTER SET utf8

;

 

USE Dpro;

 

#创建部门表

DROP TABLE IF EXISTS Employee;

CREATE TABLE Employee

(id INT NOT NULL PRIMARY KEY COMMENT ‘主键‘,

 name VARCHAR(20) NOT NULL COMMENT ‘人名‘,

 depid INT NOT NULL COMMENT ‘部门id‘

);

 

#插入测试数据

INSERT INTO Employee(id,name,depid) VALUES(1,‘陈‘,100),(2,‘王‘,101),(3,‘张‘,101),(4,‘李‘,102),(5,‘郭‘,103);

 

#创建存储过程

#改变默认的分隔符(;)为“$$”来作为存储过程结束的标识,随后再恢复默认值。

DELIMITER $$    

 

DROP PROCEDURE IF EXISTS Pro_Employee;

CREATE PROCEDURE Pro_Employee(IN pdepid VARCHAR(20),OUT pcount INT )

READS SQL DATA

SQL SECURITY INVOKER

BEGIN

SELECT COUNT(id) INTO pcount FROM Employee WHERE depid=pdepid;

# 多条sql语句

END$$

# $$代表存储过程的结束,再恢复默认的分隔符为(;)

DELIMITER ;

 

#执行存储过程, 变量名前面加上@,

CALL Pro_Employee(101,@pcount);

 

# 变量的查询也需要加上@

SELECT @pcount;

 

# 列出所有存储过程

SHOW PROCEDURE STATUS;

# 查看一个已存在的存储过程的信息

SHOW CREATE PROCEDURE <sp_name>;

 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

DELIMITER $$

 

create procedure 存储过程名字()   

(   

[in|out|inout] 参数 datatype   

)   

begin   

MySQL 语句;   

end$$

 

DELIMITER ;

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

注意??

  • MySQL 存储过程参数如果不显式指定“in”、“out”、“inout”,则默认为“in”。习惯上,对于是“in” 的参数,我们都不会显式指定。
  • MySQL 存储过程名字后面的“()”是必须的,即使没有一个参数,也需要“()”
  • MySQL 存储过程参数,不能在参数名称前加“@”,
  • MySQL 客户端用户变量要加个“@”
  • 提供了结构控制语句, 比如 IF, WHILE, CASE等等, 可以完成复杂的操作.另外, 定义存储过程,usp_前缀是区别系统存储过程和用户自定义存储过程的最佳实践.SET 对已声明的变量赋值或重新赋值,SELECT 显示变量; SELECT var into out_var 将变量值写入OUT参数。
    BEGIN
         DECLARE myvar INT;

       SET myvar = (SELECT id FROM users LIMIT 1);

           SELECT myvar into num;
       END $$

 

  • MySQL 存储过程的参数不能指定默认值
  • 如果 MySQL 存储过程中包含多条 MySQL 语句,则需要 begin end 关键字。
  • MySQL 存储过程中的注释。/* … */多行注释
  • 条件语句:declare c int; if a is null then  set c = 0;  end if 
  • 调用 MySQL 存储过程时候,需要在过程名字后面加“()”,即使没有一个参数,也需要“()”
  • 因为 MySQL 存储过程参数没有默认值,所以在调用 MySQL 存储过程时候,不能省略参数。可以用 null 来替代。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

 语法解释

 

创建存储过程的时候一般都会用

DELIMITER $$…BEGIN…END$$  DELIMITER ;放在开头和结束,目的就是避免mysql把存储过程内部的";"解释成结束符号,最后通过“DELIMITER ;”来告知存储过程结束。

 

存储过程的参数有三种类型:

  • IN: 输入参数. 在调用存储过程时指定, 默认未指定类型时则是此类型.
  • OUT: 输出参数. 在存储过程里可以被改变, 并且可返回.
  • INOUT: 输入输出参数. IN 和 OUT 结合

 

characteristic部分:

 

LANGUAGE SQL:用来说明语句部分是SQL语句,未来可能会支持其它类型的语句。

[NOT] DETERMINISTIC:如果程序或线程总是对同样的输入参数产生同样的结果,则被认为它是“确定的”,否则就是“非确定”的。如果既没有给定DETERMINISTIC也没有给定NOT DETERMINISTIC,默认的就是NOT DETERMINISTIC(非确定的)CONTAINS SQL:表示子程序不包含读或写数据的语句。

 

NO SQL:表示子程序不包含SQL语句

READS SQL DATA:表示子程序包含读数据的语句,但不包含写数据的语句。

MODIFIES SQL DATA:表示子程序包含写数据的语句。

SQL SECURITY DEFINER:表示执行存储过程中的程序是由创建该存储过程的用户的权限来执行。

SQL SECURITY INVOKER:表示执行存储过程中的程序是由调用该存储过程的用户的权限来执行。(例如上面的存储过程我写的是由调用该存储过程的用户的权限来执行,当前存储过程是用来查询Employee表,如果我当前执行存储过程的用户没有查询Employee表的权限那么就会返回权限不足的错误,如果换成DEFINER如果存储过程是由ROOT用户创建那么任何一个用户登入调用存储过程都可以执行,因为执行存储过程的权限变成了root)

 

COMMENT ‘string‘:备注,和创建表的字段备注一样。

 

注意:在编写存储过程和函数时建议明确指定上面characteristic部分的状态,特别是存在复制的环境中,如果创建函数不明确指定这些状态会报错,从一个非复制环境将带函数的数据库迁移到复制环境的机器上如果没有明确指定DETERMINISTIC, NO SQL, or READS SQL DATA该三个状态也会报错。

 

 

 

**********************************************

Mysql中事务处理块

**********************************************

http://gaunthan.leanote.com/post/MySQL-%E4%BA%8B%E5%8A%A1%E4%B8%8E%E4%BA%8B%E5%8A%A1%E5%A4%84%E7%90%86

 

https://github.com/MrLining/mysql/wiki/Mysql%E4%BA%8B%E5%8A%A1%E5%A4%84%E7%90%86#mysql%E4%BA%8B%E5%8A%A1%E5%A4%84%E7%90%86






以上是关于MySQL视图view/存储过程和函数的使用的主要内容,如果未能解决你的问题,请参考以下文章

MySQL之视图存储过程触发器函数事务动态执行SQL

MYSQL之视图触发器存储过程函数事物数据库锁和数据库备份

sql 视图 存储过程 的区别?

Mysql:在mysql视图中调用mysql存储过程函数

SQL中的存储过程,函数,视图有啥区别?

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