MySQL視圖、存儲過程、函數、觸發器、定時任務、流程式控制制總結

来源:https://www.cnblogs.com/beishanqingyun/archive/2023/02/10/17108907.html
-Advertisement-
Play Games

視圖的增刪改查 視圖相當於一張只能讀的表,不可以修改。當組成視圖的表發生數據變化的時候,視圖會相對應的進行改變。 存儲過程的練習 創建存儲過程: create [if not exists] procedure 名字 ([in | out | inout] 參數名稱 參數類型) begin # sq ...


視圖的增刪改查

視圖相當於一張只能讀的表,不可以修改。當組成視圖的表發生數據變化的時候,視圖會相對應的進行改變。

image-20230208194651646

存儲過程的練習

創建存儲過程:

create [if not exists] procedure 名字 ([in | out | inout] 參數名稱 參數類型)
begin
# sql語句
end;

查詢存儲過程:

存儲過程存放於infomation_schema資料庫,routines表e

image-20230209110759357

-- 使用sql查詢
SELECT * 
from information_schema.ROUTINES 
where information_schema.routines.routine_schema != 'sys'

運行結果:

image-20230209112309062

刪除存儲過程:

drop PROCEDURE pr_test;

運行結果:

image-20230209112438477

存儲過程的練習:

-- 存儲過程的練習 無參數
create PROCEDURE pr_test()
BEGIN
	select * from dept;
END;

-- 使用存儲過程
call pr_test();

-- 存儲過程 帶有輸入參數
-- 如果只有一個輸入參數 關鍵字in 可以省略
create PROCEDURE pr_test1(_deptno int)
BEGIN
	SELECT * from emp WHERE deptno = _deptno;
END;

call pr_test1(10);
call pr_test1(20);
call pr_test1(30);

-- 存儲過程  帶有輸出參數
-- 輸出參數的out關鍵字不可以省略 

create PROCEDURE pr_test2(out _ename VARCHAR(50))
BEGIN
	SELECT ename into _ename from emp;
END;

-- 測試
set @ename = '';

-- 測試 如果包含多條數據 是不能直接進行賦值的
call pr_test2(@ename) ;

SELECT @ename;

-- 測試存儲過程 單個輸出參數
CREATE PROCEDURE pr_test3(out _ename VARCHAR(50))
BEGIN
	SELECT ename INTO _ename from emp WHERE emp.deptno = 10;
END;

-- 輸出參數
set @deptno = '';

-- 執行存儲過程
call pr_test3(@deptno);

-- 輸出結果
SELECT @deptno;


-- 測試存儲過程 有輸入參數 也有輸出參數
-- 關鍵字in 可以省略 out 不可以省略
create PROCEDURE pr_test5(_id int,out _ename varchar(20))
BEGIN
	SELECT ename into _ename from emp WHERE deptno = _id;
END;

-- 測試數據
set @result = '';

-- 
call pr_test5(10,@result);

-- 查詢結果
SELECT @result;


-- 測試存儲過程 即使輸入參數 也是輸出參數
CREATE PROCEDURE pr_test6(INOUT res VARCHAR(20) )
BEGIN
	SELECT emp.deptno into res from emp where emp.empno = res;
END;

SELECT * from emp;

-- 
set @res = '7876';

-- 
call pr_test6(@res);

-- 
SELECT @res;

函數的使用、查看、刪除

image-20230209114524068

-- 函數的練習
-- 創建函數
create FUNCTION fun_show_detail() # 註意事項1: 這裡的括弧一定不能丟
returns varchar(30) # 註意事項2: 這裡是rerurns
BEGIN
	declare _res VARCHAR(50); # 註意事項3: Delare 需要搭配存儲過程和函數使用 不能單獨使用
	SELECT 1 INTO _res ;
	return _res;
END;

-- 使用函數
SELECT fun_show_detail()
-- 刪除函數
drop FUNCTION fun_show_detail;

觸發器

image-20230209135251057

查詢當前資料庫中所有的觸發器:

show TRIGGERS from emp;

image-20230209152728137

刪除觸發器:

drop TRIGGER tr_emp_update

觸發器練習:

-- 創建觸發器
create trigger tr_emp_insert 
BEFORE INSERT
on emp FOR EACH ROW
BEGIN
	insert into emp(empno,ename) values(1,'測試');
END;
-- 觸發觸發器
insert into emp(empno,ename) values(2,'外面測試');

執行結果:

image-20230209153210570

因為這樣會迴圈的觸發觸發器,所以不能直接這樣進行數據的插入。可以通過set的方式進行賦值。

create trigger tr_emp_insert 
BEFORE INSERT
on emp FOR EACH ROW
BEGIN
	-- insert into emp set empno = 1,ename ='測試';
	set new.empno = 2,new.ename ='測試';
END;

執行sql:

insert into emp(empno,ename) values(2,'外面測試');

image-20230209153802962

再次執行:

image-20230209153829413

所以如果是before xxx,不會直接進行增刪改,會執行觸發器裡面的代碼。

關於觸發器的new虛擬表格和old虛擬表格

當進行insert的時候,new表格可以獲取插入的數據。

當進行delete的時候,old表格可以獲取被刪除行的數據。

當進行update的時候,new表格中是修改後的數據,old表格中是被修改行的數據。

定時任務event

定時任務 執行一次

語法:

CREATE
[DEFINER = user]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE  AT timestamp [+ INTERVAL interval] ...
    
DO 
begin
 # 要執行的sql語句
end;

間隔任務 多次執行

語法:

CREATE
[DEFINER = user]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE  EVERY  quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
              WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
              DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
    
DO 
begin
 # 要執行的sql語句
end;

查詢定時任務

show EVENTS FROM emp;

刪除定時任務

drop event event_name

流程式控制制

case

給我整懵了,怎麼測試怎麼出錯。

出錯原因:

​ 1.case語句不能直接使用,需要搭配存儲過程或者函數使用,或者搭配select語句使用。

​ 2.搭配select語句,裡面每個語句結束後不能添加分號,結尾語句必須為end,不能為end case;

SELECT case 10
when 10 then  '10' -- 這裡不能加分號
when 9 then  '9' -- 這裡不能加分號
else  '8'
end; -- 這裡不能用end case;結尾

​ 3.搭配存儲過程或者函數使用,結尾必須為end case,中間的比較語句也必須加分號,then 後面必須跟著語句使用。

create PROCEDURE test1111()
begin
case 10
when 10 then SELECT '10'; -- 這裡必須為sql語句,而且要加分號
when 9 then SELECT '9'; -- 這裡必須為sql語句,而且要加分號
else SELECT '8'; -- 這裡必須為sql語句,而且要加分號
end case; -- 這裡必須以end case;結尾
end;

語法1:

CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE

語法2:

CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE

區別:

語法1:匹配的是值,所以when裡面不能是表達式。

語法2:匹配的是表達式,when裡面是表達式。

if

語法:

IF search_condition THEN statement_list
    [ELSEIF search_condition THEN statement_list] ...
    [ELSE statement_list]
END IF

突然發現這些流程式控制制語句好像大多數都得搭配函數/存儲過程使用。

create PROCEDURE test_if()
BEGIN
	IF 3>2 THEN
	SELECT '正確';
ELSE
	SELECT '錯誤';
END IF;

end;

call test_if();

while

語法:

[begin_label:] WHILE search_condition DO
    statement_list
END WHILE [end_label]

示例代碼:階乘

CREATE FUNCTION get_jc(num int)
RETURNS int
BEGIN
	DECLARE i int DEFAULT 1;
	DECLARE res int DEFAULT 1;
	
	WHILE i <= num DO
			set res = res * i;
			set i = i + 1;
	END WHILE;

RETURN res;
end;

SELECT get_jc(3);

運行結果:

image-20230210141348556

loop

語法:

[begin_label:] LOOP
    statement_list
END LOOP [end_label]

示例代碼:階乘

create FUNCTION test_jc(num int)
RETURNS int
BEGIN
	DECLARE i int DEFAULT 1;
	DECLARE res int DEFAULT 1;
	
	lab: LOOP

	IF i > num THEN
		LEAVE lab; 
	END IF; 
	
	set res = res * i;
	set i = i + 1;
	
	END LOOP;

	RETURN res;
END;

select test_jc(4);

運行結果:

image-20230210141854389

[CURSOR]游標

這個東西,有點意思。

https://dev.mysql.com/doc/refman/8.0/en/cursors.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 隨著技術的進步,跨平臺開發已經成為了標配,在此大背景下,ASP.NET Core也應運而生。本文主要基於ASP.NET Core+Element+Sql Server開發一個校園圖書管理系統為例,簡述基於MVC三層架構開發的常見知識點,本系列共五篇文章,前四篇文章介紹瞭如何搭建開發框架,登錄功能,主... ...
  • 接上篇 通過一個示例形象地理解C# async await 非並行非同步、並行非同步、並行非同步的併發量控制 前些天寫了兩篇關於C# async await非同步的博客, 第一篇博客看的人多,點贊評論也多,我想應該都看懂了,比較簡單。 第二篇博客看的人少,點贊的也少,沒有評論。 我很納悶,第二篇博客才是重點 ...
  • 設計原則系列文章 必知必會的設計原則——單一職責原則 必知必會的設計原則——開放封閉原則 必知必會的設計原則——依賴倒置原則 概述 如果S(子類)是T(父類)的子類型,則T(父類)類型的對象可以替換為S(子類)類型的對象。 所有引用父類對象的地方,都可以使用子類類型代替。子類可以替換父類。 里氏替換 ...
  • 概述 readelf用於查看elf文件的文件信息,關於elf文件及其格式的介紹在【ctf權威競賽指南筆記】(2)二進位文件中有比較詳細的介紹。 常用參數 在這裡使用一個elfDemo.rel作為示例,elfDemo.rel是elfDemo.c使用如下指令生成的。 gcc -c elfDemo.c - ...
  • 參考: Linux內核文檔:《如何讓你的改動進入內核》 - 廣漠飄羽 - 博客園 提交內核補丁到Linux社區的步驟 - 廣漠飄羽 - 博客園 建議: 內容具有時效性,需要閱讀最新版本的同學,可以點擊下麵kernel的官方翻譯網頁: https://www.kernel.org/doc/html/l ...
  • Vim 簡介{#vim-簡介} Vim 是 Linux 系統上的最著名的文本/ 代碼編輯器,也是早年的 Vi編輯器的加強版,而 gVim 則是其 Windows 版。它的最大特色是完全使用鍵盤命令進行編輯,脫離了滑鼠操作雖然使得入門變得困難,但上手之後鍵盤流的各種巧妙組合操作卻能帶來極為大幅的效率提 ...
  • 使用docker swarm搭建docker輕量集群服務 當前流行的k8s集群搭建無疑是很好的docker集群管理服務,但是對於像我這種僅自己學習的玩家有些過於重量,所以今天使用docker自帶的docker swarm搭建一個docker集權環境,本次實驗環境為一個管理節點和4個工作節點。 1、安 ...
  • 摘要:本文主要講解DWS函數出參帶出方式。 本文分享自華為雲社區《GaussDB(DWS)功能 -- 函數出參 #【玩轉PB級數倉GaussDB(DWS)】》,作者:譡里個檔 。 DWS的PL/pgSQL函數/存儲過程中有一個特殊的語法PERFORM語法,用於執行語句但是丟棄執行結果的場景,常用於一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...