首页 > 数据库 >mysql数据库语法总结--存储过程、函数、视图、触发器、表

mysql数据库语法总结--存储过程、函数、视图、触发器、表

时间:2023-07-04 17:45:08浏览次数:43  
标签:触发器 函数 -- 视图 name sys mysql schema

概述

抽空总结一下mysql的一些概念性内容,涉及存储过程、函数、视图、触发器等。


一、查看存储过程、函数、视图、触发器、表

1、存储过程

select * from mysql.proc where type='PROCEDURE';
show procedure status; 
show create procedure proc_name; //存储过程定义

​编辑

 ​编辑

 ​编辑

 

 

 

2、函数

select * from mysql.proc where type='FUNCTION';
show function status;
show create function func_name; //函数定义

3、视图

SELECT * from information_schema.VIEWS 
SHOW CREATE VIEW 视图名

​编辑

 

 

​编辑

 

 

4、表

SELECT * from information_schema.TABLES 
show create table table_name;

5、触发器

SELECT * FROM information_schema.triggers;
show create trigger trigger_name;

 

​编辑

 ​编辑

 

 

 


二、函数

mysql自定义函数就是实现程序员需要sql逻辑处理,参数是IN参数,含有RETURNS字句用来指定函数的返回类型,而且函数体必须包含一个RETURN value语句。

1、语法:

创建:
 CREATE FUNCTION 函数名称(参数列表)
  RETURNS 返回值类型
  函数体
修改: 
 ALTER FUNCTION 函数名称 [characteristic ...]
删除:
 DROP FUNCTION [IF EXISTS] 函数名称
调用:
 SELECT 函数名称(参数列表)

2、实例

CREATE DEFINER=`root`@`%` FUNCTION `getUnitChildList`(employeeCode VARCHAR(30)) RETURNS text CHARSET utf8
BEGIN
 #最终返回的组织code字符串
 DECLARE codeResult TEXT DEFAULT "-1";
 #最终返回的组织id字符串
 DECLARE result TEXT DEFAULT "-1";
 #组织id的中间字符串
 DECLARE sTempChd VARCHAR(10000);
 #最上层组织的字符串
 DECLARE currentCode VARCHAR(10000) DEFAULT '-1';
 #游标是否结束标识
 DECLARE endFlag INT DEFAULT 0;
 #定义游标-unitCur,查询出当前员工拥有的所有岗位的组织code
 DECLARE unitCur CURSOR FOR
 SELECT DISTINCT
 pos.unit_code
 FROM
 hr_org_position_b pos
 LEFT JOIN hr_employee_assign ass ON pos.POSITION_CODE = ass.POSITION_CODE
 LEFT JOIN hr_employee HE ON he.EMPLOYEE_CODE = ass.EMPLOYEE_CODE
 WHERE
 he.EMPLOYEE_CODE = employeeCode
 AND ass.ENABLED_FLAG = 'Y'
 AND pos.ENABLED_FLAG = 'Y';
 #结束set为1
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET endFlag = 1;
#开始遍历游标
 OPEN unitCur;
 REPEAT
 FETCH unitCur INTO currentCode;
 SET sTempChd = currentCode;
 #当前组织也加上
 SET result=CONCAT(result,",",sTempChd);
 #循环,遍历出当前组织code下的组织code的list,存入字符串,逗号分隔
 WHILE sTempChd IS NOT NULL
 DO
 #拼接结果字符串到result
 SELECT GROUP_CONCAT(unit_code) FROM hr_org_unit_b
 WHERE FIND_IN_SET(parent_code,sTempChd)>0 INTO sTempChd;
 IF sTempChd IS NOT NULL THEN
 SET result=CONCAT(result,",",sTempChd);
 END IF;
 END WHILE;
 UNTIL endFlag = 1
 END REPEAT;
 #关闭游标
 CLOSE unitCur;
 RETURN result;
END

三、创建存储过程

一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,比一个个执行sql语句效率高,用户通过指定存储过程的名字并给出参数来执行它。参数可以为IN, OUT, 或INOUT

1、语法

创建:
 CREATE PROCEDURE 过程名 (参数列表) [characteristic ...] 
  函数体
修改: 
 ALTER PROCEDURE 过程名 [characteristic ...]
删除:
 DROP PROCEDURE [IF EXISTS] 过程名
调用:
 CALL 过程名(参数列表)

2、实例

--2.1、建表
create table user(
id mediumint(8) unsigned not null auto_increment,
name char(15) not null default "",
pass char(32) not null default "",
note text not null,
primary key (id)
)engine=Innodb charset=utf8;
 
insert into user(name, pass, note) values('sss','123', 'ok');
 
--2.2、存储过程
delimiter //
create procedure proc_name (in parameter integer)
begin
if parameter=0 then
select * from user order by id asc;
else
select * from user order by id desc;
end if;
end;
//
 
 
--2.3、执行:
call proc_name(0);
//
创建: CREATE FUNCTION 函数名称(参数列表)   
RETURNS 返回值类型   
函数体 修改: ALTER FUNCTION 函数名称 [characteristic ...] 
删除: DROP FUNCTION [IF EXISTS] 函数名称 调用: SELECT 函数名称(参数列表)

 


四、视图

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图

的查询所引用的表,并且在引用视图时动态生成。对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。

通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。视图是存储在数据库中的查询的SQL 语句,它主要出于两种原因:安全原因, 视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。这个视图就像一个“窗口”,从中只能看到你想看的数据列。这意味着你可以在这个视图上使用SELECT *,而你看到的将是你在视图定义里给出的那些数据列。

1、语法

创建:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(列名列表)]
AS 查询语句
[WITH [CASCADED | LOCAL] CHECK OPTION]
修改:
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
删除:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]
调用:
select v.pass from my_view v; 

2、实例

CREATE ALGORITHM = TEMPTABLE DEFINER = `mysql.sys` @`localhost` SQL SECURITY INVOKER VIEW `host_summary` AS SELECT
IF
 ( isnull( `performance_schema`.`accounts`.`HOST` ), 'background', `performance_schema`.`accounts`.`HOST` ) AS `host`,
 sum( `stmt`.`total` ) AS `statements`,
 `sys`.`format_time` ( sum( `stmt`.`total_latency` ) ) AS `statement_latency`,
 `sys`.`format_time` ( ifnull( ( sum( `stmt`.`total_latency` ) / nullif( sum( `stmt`.`total` ), 0 ) ), 0 ) ) AS `statement_avg_latency`,
 sum( `stmt`.`full_scans` ) AS `table_scans`,
 sum( `io`.`ios` ) AS `file_ios`,
 `sys`.`format_time` ( sum( `io`.`io_latency` ) ) AS `file_io_latency`,
 sum( `performance_schema`.`accounts`.`CURRENT_CONNECTIONS` ) AS `current_connections`,
 sum( `performance_schema`.`accounts`.`TOTAL_CONNECTIONS` ) AS `total_connections`,
 count( DISTINCT `performance_schema`.`accounts`.`USER` ) AS `unique_users`,
 `sys`.`format_bytes` ( sum( `mem`.`current_allocated` ) ) AS `current_memory`,
 `sys`.`format_bytes` ( sum( `mem`.`total_allocated` ) ) AS `total_memory_allocated` 
FROM
 (
 (
 ( `performance_schema`.`accounts` JOIN `sys`.`x$host_summary_by_statement_latency` `stmt` ON ( ( `performance_schema`.`accounts`.`HOST` = `stmt`.`host` ) ) )
 JOIN `sys`.`x$host_summary_by_file_io` `io` ON ( ( `performance_schema`.`accounts`.`HOST` = `io`.`host` ) ) 
 )
 JOIN `sys`.`x$memory_by_host_by_current_bytes` `mem` ON ( ( `performance_schema`.`accounts`.`HOST` = `mem`.`host` ) ) 
 ) 
GROUP BY
IF
 ( isnull( `performance_schema`.`accounts`.`HOST` ), 'background', `performance_schema`.`accounts`.`HOST` )

五、触发器

与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete, update)时就会激活它执行。

触发器经常用于加强数据的完整性约束和业务规则等。

1、语法

创建:
CREATE TRIGGER <触发器名称> --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.
{ BEFORE | AFTER } --触发器有执行的时间设置:可以设置为事件发生前或后。
{ INSERT | UPDATE | DELETE } --同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。
ON <表名称> --触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。
FOR EACH ROW --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。
<触发器SQL语句> --触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句, 包括复合语句,但是这里的语句受的限制和函数的一样。
删除:
DROP TRIGGER 方案名称.触发器名称

2、实例

CREATE DEFINER = `mysql.sys` @`localhost` TRIGGER sys_config_insert_set_user BEFORE INSERT ON sys_config FOR EACH ROW
BEGIN
 IF
 @sys.ignore_sys_config_triggers != TRUE 
 AND NEW.set_by IS NULL THEN
 SET NEW.set_by = USER ( );
 END IF;
END

 

标签:触发器,函数,--,视图,name,sys,mysql,schema
From: https://www.cnblogs.com/fcjedorfjoeij/p/17526377.html

相关文章

  • CDQ分治 学习笔记
    按@ouuan大佬所说,CDQ分治可以当作ex归并看待。它的思想和归并排序十分相似:假设要对区间\([l,r)\)处理先不管\([\text{mid},r)\),计算\([l,mid)\)同理计算\([mid,r)\)补回之前忽略的部分,即“归并”例:三维偏序给定\(n\)个点\((a,b,c)\),求\(a_1\lea_2\we......
  • 01-逻辑分析仪使用
    目录一.环境搭建二.软件配置一.环境搭建安装软件和硬件连接,板子的GND连接逻辑分析仪的GND,待测点连接逻辑分析仪上面的通道.二.软件配置相关选项含义......
  • Vue内置缓存组件keep-alive
    <el-tab-panelabel="周边配套":disabled=!gardenIdname="five"><keep-alive><Surrour:gardenId="gardenId"v-if="activeName==='five'"/></keep-alive>......
  • .Net下验证MongoDB 的 Linq 模式联合查询是否可用
    MongoDB.Driver类库提供了Linq查询的支持。然而,在使用Linq进行联合查询时,是否能够正确转换为MongoDB底层的查询语句还有待验证。今天,我将进行实验来验证一下。输出查询语句首先,通过订阅MongoClientSettings的功能,将查询语句输出。varsettings=MongoCli......
  • rabbitmq在springboot中实战技巧
    一.简介rabbitmq是基于AMQP(AdvancedMessageQueuingProtocol:高级消息队列协议),采用Erlang语言编写的消息队列。二、mq能用来做什么异步处理:将非核心业务(比如日志、邮件、监控等)从主流程剥离,提升主流程的响应时效。削峰:当并发大的情况下,可以将消息暂存在消息队列中,消费者按照......
  • 解放码农,飞算全自动软件工程平台的创新“套路”
    一个普通IT工程师凭借飞算全自动软件工程平台,毫不费力地仅用28分钟轻松挑战三个资深IT工程师近两个小时才能完成的开发工作成功。11月17日这样一个现场PK活动环节,引发了业内众多的讨论。不敲入任何一行代码,就可以输入流程图来实现后端开发。在这之前,码农们想都不敢想的事情,为什么飞......
  • 从IP数量和质量维度比较IPIDEA和smartproxy
    随着全球化和互联网的普及,使用海外代理服务的场景越来越多,它为用户轻松获取和分析全球范围内的公开数据资源提供了很大便利,逐渐成为企业和个人业务发展中的关键一环。很多刚刚接触代理的用户,常常不知道应该如何选择适合自己的代理服务商,今天我们简要挑选两个常见的维度来分析一下IP......
  • 应用构建工作流入门
    1首先创建一个应用2 创建一个业务对象,勾选同时生成实体;然后进行编辑实体,点击保存并发布;3进入页面建模,去新建页面;4新建流程双击活动,然后简单设置一个发起人为本人,即发起人是本人,审批也是本人;这样方便演示,点击保存并发布;这样就可以演示一个简单的提交和审批;然后进入页面建模,创建......
  • 2019年中国公有云厂商发展状况白皮书
     前 言     云发展白皮书做了三年的中国公有云厂商收入利润综合排名,到了这次想要继续推出来,在文章快要完成三分之二的时候,突然有了更强烈的想法,就是立足中国公有云厂商收入利润综合排名,直接升级为:2019年中国公有云厂商发展状况白皮书。一方面,让大家可以更全面了解公有云及......
  • 查看smime.p7m附件
    如果你的邮件客户端不支持S/MIME,那么别人发给你的邮件如果是被加密或者签名过的话,你是无法看到邮件正文的,相反,会有一个比如smime.p7m这样的附件。 查看smime.p7m附件的工具,出名的有p7mViewer(http://www.cryptigo.eu/smime.p7m/),该工具其实是一个类似OutlookExpress的邮件客户......