概述
花时间总结一下MySQL的一些概念内容,包括存储过程、函数、视图、触发器等。
1.查看存储过程、函数、视图、触发器和表
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 参数,其中包含指定函数返回类型的单词,并且函数体必须包含 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
3. 创建存储过程
数据库中存储了一组完成特定功能的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); //
4. 查看
视图是一个虚拟表,其内容由查询定义。 与真实的表一样,视图包含一系列命名的数据列和行。 然而,视图并不作为数据库中存储的一组数据值而存在。来自自由定义视图的行和列数据
由查询引用的表,并在引用视图时动态生成。 视图的作用类似于它引用的基础表的过滤器。 定义视图的过滤器可以来自当前或其他数据库中的一个或多个表,或者来自其他视图。
通过视图查询没有任何限制,通过视图修改数据也几乎没有限制。 视图是存储在数据库中的查询 SQL 语句。 使用它主要有两个原因:安全原因。 该视图可以隐藏一些数据,例如社保基金表。 您可以使用该视图仅显示姓名和地址,而不显示社会保险。 号码和工资号码等。另一个原因是为了使复杂的查询易于理解和使用。 该视图就像一个“窗口”,从中您只能看到您想要查看的数据列。 这意味着您可以在此视图上使用 *,您看到的将是您在视图定义中给出的列。
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` )
5. 触发
与表事件相关的特殊存储过程。 它的执行不是由程序调用或手动启动,而是由事件触发。 例如,当操作一个表(,,)时,就会激活它的执行。
触发器通常用于强制执行数据完整性约束和业务规则。
1. 语法
创建: CREATE TRIGGER --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象. { BEFORE | AFTER } --触发器有执行的时间设置:可以设置为事件发生前或后。 { INSERT | UPDATE | DELETE } --同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。 ON --触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。 FOR EACH ROW --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。 --触发器包含所要触发的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
好了,今天的主题就讲到这里吧,不管如何,能帮到你我就很开心了,如果您觉得这篇文章写得不错,欢迎点赞和分享给身边的朋友。