mysql數據庫語法總結--存儲過程、函數、視圖、觸發器、表

概述

抽空總結一下mysql的一些概念性內容,涉及存儲過程、函數、視圖、觸發器等。


一、查看存儲過程、函數、視圖、觸發器、表

1、存儲過程

select * from mysql.proc where type='PROCEDURE';
show procedure status;
show create procedure proc_name; //存儲過程定義
mysql數據庫語法總結--存儲過程、函數、視圖、觸發器、表

mysql數據庫語法總結--存儲過程、函數、視圖、觸發器、表

mysql數據庫語法總結--存儲過程、函數、視圖、觸發器、表

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 視圖名
mysql數據庫語法總結--存儲過程、函數、視圖、觸發器、表

mysql數據庫語法總結--存儲過程、函數、視圖、觸發器、表

4、表

SELECT * from information_schema.TABLES 
show create table table_name;

5、觸發器

SELECT * FROM information_schema.triggers;
show create trigger trigger_name;
mysql數據庫語法總結--存儲過程、函數、視圖、觸發器、表

mysql數據庫語法總結--存儲過程、函數、視圖、觸發器、表


二、函數

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);
//
mysql數據庫語法總結--存儲過程、函數、視圖、觸發器、表


四、視圖

視圖是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖並不在數據庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖

的查詢所引用的表,並且在引用視圖時動態生成。對其中所引用的基礎表來說,視圖的作用類似於篩選。定義視圖的篩選可以來自當前或其它數據庫的一個或多個表,或者其它視圖。

通過視圖進行查詢沒有任何限制,通過它們進行數據修改時的限制也很少。視圖是存儲在數據庫中的查詢的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語句:這裡的語句可以是任何合法的語句, 包括複合語句,但是這裡的語句受的限制和函數的一樣。

刪除:
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

覺得有用的朋友多幫忙轉發哦!後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注下~

mysql數據庫語法總結--存儲過程、函數、視圖、觸發器、表

"


分享到:


相關文章: