MySQL——視圖、儲儲過程、觸發器

目錄

一、視圖

二、存儲過程

三、觸發器


一、視圖

視圖是一種虛擬存在的表。視圖中的數據并不在數據庫中真實存在,行和列數據來自定義視圖的查詢中使用的表,并且是在使用視圖時動態生成的。通俗的講,視圖只保存了查詢的SQL邏輯,不保存查詢結果。所以我們在建立視圖的時候,主要的工作就落在創建這條SQL查詢語句上

創建或修改視圖語句:

查看創建視圖的語句:

show create view 視圖名稱;

查看視圖:

select * from 視圖名稱;

刪除視圖:

drop view if exists 視圖名稱;

with check option:當使用with check option子句創建視圖時,MySQL會通過視圖檢查正在更改的每個行,例如插入,更新,刪除,以使其符合視圖定義。MySQL允許基另一個視圖創建視圖,它還會檢查依賴圖中的規則保持一致性。為了確定檢查的范圍,mysql提供了兩個選項:CASCADED和LOCAL,默認值為CASCADED。

CASCADED:v2視圖是基于v1視圖的,如果在v2視圖創建的時候指定了檢查選項為 cascaded,但是v1視圖創建時未指定檢查選項。 則在執行檢查時,不僅會檢查v2,還會級聯檢查v2的關聯視圖v1。

LOCAL:v2視圖是基于v1視圖的,如果在v2視圖創建的時候指定了檢查選項為 local ,但是v1視圖創 建時未指定檢查選項。 則在執行檢查時,知會檢查v2,不會檢查v2的關聯視圖v1。

無法更新的視圖:

作用:

1.視圖不僅可以簡化用戶對數據的理解,也可以簡化他們的操作。那些被經常使用的查詢可以被定義為視圖,從而使用戶不必以后操作每次指定全部條件

2.數據庫可以授權,但不能授權到數據庫特定行和特定的列上。通過視圖用戶只能查詢和修改他們所能見到的數據

3.視圖可幫助用戶屏蔽真實表結構變化帶來的影響

二、存儲過程

存儲過程是事先經過編譯并存儲在數據庫中的一段SQL語句的集合,調用存儲過程可以簡化應用開發人員的很多工作,減少數據在數據庫和應用服務器之間的傳輸,對于提高數據處理的效率是有好處的

創建存儲過程:

調用:

查詢指定數據庫的存儲過程及狀態信息:

select * from information_schema.ROUTINES where ROUTINE_SCHEMA=數據庫名稱;

查詢存儲過程定義:

show create procedure 存儲過程名稱;

刪除:

drop procedure if exists 存儲過程名稱;

注意:在命令行中,執行創建存儲過程的SQL時,需要通過關鍵字delimiter指定SQL語句的結束符

系統變量:是MySQL服務器提供,不是用戶定義的,屬于服務器層面。分為全局變量(GLOBAL)、會話變量(SESSION)

查看所有系統變量:

show global /session variables ;

通過like模糊匹配方式查找變量:

show global variables like 模糊匹配類型;

查看指定變量:

select @@global.autocommit;

設置系統變量:

set session autocommit=1;

注意:如果沒有指定SESSION/GLOBAL,默認是SESSION,會話變量。mysql服務重新啟動之后,所設置的全局參數會失效,想要不失效,可在/etc/my.cnf中配置

用戶定義變量:是用戶根據需要自己定義的變量,用戶變量不用提前聲明,在用的時候直接用“@ 變量名”使用就可以。其作用域為當前連接。

賦值:
?

set @name:='李天天';
select sn  into @sn_1 from tb_sku where id=1;

查找:

select @name;

注意:用戶定義的變量無需對其進行聲明或初始化,只不過獲取到地值未NULL

局部變量:是根據需要定義的在局部失效的變量,訪問之前,需要DECLARE聲明。可用作存儲過程內的局部變量和輸入參數,局部變量的范圍是在其內聲明的BEGIN...END塊

聲明:

 declare total int default 0;

注意:變量類型就是數據庫字段類型:INT、BIGINT、CHAR、VARCHAR、DATE、TIME等

賦值:

set total:=90;
 select sn  into total from tb_sku where id=1;

if:

create procedure p1()
begindeclare score int default 44;declare result char(10);if score>=80 thenset result:='優秀';elseif score>=60 thenset result:='良好';elseset result:='不及格';end if;select result;
end;

參數:

示例:

create procedure p2(in score int,out result char(10))
beginif score>=80 thenset result:='優秀';elseif score>=60 thenset result:='良好';elseset result:='不及格';end if;
end;

create procedure p3(inout score double)
beginset score:=score*0.5;
end;
set @result=89;
call p3(@result);
select @result;

case:

示例:

begindeclare season varchar(20);casewhen month >= 1 and month <= 3 then set season = '一季度';when month >= 4 and month <= 6 then set season = '二季度';when month >= 7 and month <= 9 then set season = '三季度';when month >= 10 and month <= 12 then set season = '四季度';else set season = '輸入錯誤';end case;select concat('當前月份為:', month, ';當前季度為:', season);end;

while:

示例:

create procedure p2(in n int)
begindeclare total int default 0;while n > 0doset total := total + n;set n = n - 1;end while;select concat('累加值為:',total);
end;

repeat:

create procedure p3(in n int)
begindeclare total int default 0;repeatset total := total + n;set n = n - 1;until n <= 0end repeat;select concat('累加值為:', total);end;

loop:

loop實現簡單的循環,如果不在SQL邏輯中增加退出循環條件,可以用其來實現簡單的死循環。loop可以配合一下兩個語句使用:

LEAVE:配合循環使用,退出循環

ITERATE:必須用在循環中,作用是跳過當前循環剩下的語句,直接進入下一次循環

create procedure p4(in n int)
begindeclare total int default 0;sum :loopif n <= 0 thenleave sum;end if;set total = total + n;set n = n - 1;end loop sum;select total;
end;
create procedure p6(in n int)
begindeclare total int default 0;sum :loopif n <= 0 thenleave sum;end if;if n % 2 = 1 thenset n = n - 1;iterate sum;elseset total = total + n;set n = n - 1;end if;end loop sum;select total;
end;

游標:

游標是用來存儲查詢結果集的數據類型,在存儲過程和函數中可以使用游標對結果集進行循環的處理。游標的使用包括游標的聲明、open、fetch和clode。

聲明游標:

打開游標:

獲取游標記錄:

關閉游標:

條件處理程序:可以用來定義在流程控制結構執行過程中遇到問題時相應的處理步驟

mysql異常狀態碼文檔

https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html

示例:

create procedure p7()
begindeclare new_name varchar(10) default null;declare new_no varchar(10) default null;declare student_name cursor for select no,name from student;declare exit  handler for SQLSTATE '02000' close student_name;open student_name;create table if not exists tb_sku_name_price_100(id   int primary key auto_increment,no  varchar(10),name varchar(10));while truedofetch student_name into new_no ,new_name ;insert into tb_sku_name_price_100 values (null,new_no,new_name);end while;close student_name;
end;

存儲函數:

存儲函數是有返回值的存儲過程,存儲函數的參數只能是IN類型

示例:

create function sun(n int)
returns int deterministic
begindeclare total int default 0;while n>0 doset total:=n+total;set n:=n-1;end while;return total;
end;

三、觸發器

觸發器是與表有關的數據庫對象,指在insert/update/delete之前或之后,觸發并執行觸發器中定義的SQL語句集合。觸發器的這種特性可以協同應用在數據庫端確保數據的完整性,日志記錄,數據校驗等操作。

使用別名OLD和NEW來引用觸發器中發生變化的記錄內容,這與其他數據庫是相似的。現在數據庫還只支持行級觸發,不支持語句觸發。

創建:

查看:

刪除:

insert:

create trigger tb_student_insert_triggerafter insert on student for each rowbegininsert into user_logs (operation, operate_time, operate_id, operate_params) values('insert',now(),new.id,concat('插入的數據內容為:','id為',new.id,'name為',new.name,'no為',NEW.no));end;

deleter:

create trigger tb_student_deleter_triggerafter delete on student for each row
begininsert into user_logs (operation, operate_time, operate_id, operate_params) values('deleter',now(),old.id,concat('刪除的數據內容為:','id為',old.id,'name為',old.name,'no為',old.no));
end;

update:

create trigger tb_student_update_triggerafter update on student for each row
begininsert into user_logs (operation, operate_time, operate_id, operate_params) values('update',now(),old.id,concat('更新前數據內容為:','id為',old.id,'name為',old.name,'no為',old.no,'|','更新后的數據內容為:','id為',new.id,'name為',new.name,'no為',new.no));
end;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/98053.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/98053.shtml
英文地址,請注明出處:http://en.pswp.cn/web/98053.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS App 卡頓與性能瓶頸排查實戰 如何定位CPU內存GPU幀率問題、優化耗電與網絡延遲(uni-app開發性能優化全流程指南)

在 iOS 應用開發中&#xff0c;卡頓 是用戶最直觀的負面體驗。 一個 App 如果在頁面切換、滾動、后臺運行時頻繁掉幀或發熱&#xff0c;用戶很快就會放棄使用。 對于 uni-app 跨平臺開發者 來說&#xff0c;卡頓問題更為復雜&#xff1a; JS 與原生層橋接增加了 CPU 負載&#…

騰訊開源多模態 RAG:復雜文檔秒變自建知識庫,支持 API 調用

上篇&#xff0c;分享了 小智AI MCP系列的第一篇&#xff1a; 小智 AI 鬧鐘提醒 定時任務&#xff0c;設備端MCP實現 有朋友問&#xff0c;能否接入知識庫 RAG&#xff1f; 讓小智可以根據企業知識庫&#xff0c;回答客戶的疑問~ 當然可以&#xff0c;接入方式同樣是 MC…

Node.js中的 http 模塊詳解

http 模塊是 Node.js 中的核心模塊之一&#xff0c;專門用于構建基于 HTTP 的網絡應用程序。它允許創建 HTTP 服務器和客戶端&#xff0c;處理網絡請求和響應。1. 核心 API 詳解1.1. http.createServer([options][, requestListener])用于創建 HTTP 服務器的核心方法&#xff0…

LAMP 環境部署

LAMP 環境部署 一、概述 1. 目的 基于 CentOS 7 系統部署 LAMP&#xff08;Linux Apache MySQL PHP&#xff09;環境的完整步驟&#xff0c;通過腳本化操作實現環境快速搭建&#xff0c;適用于運維人員進行測試環境或基礎生產環境的 LAMP 部署 2. 適用環境操作系統&#xff…

用html5仿造nes游戲敲玻璃寫一個敲玻璃游戲

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>敲玻璃游戲</title><style>body {ma…

996引擎-ItemTips特效框層級自定義

996引擎-ItemTips特效框層級自定義 需求場景 ItemTips 中相關方法 創建特效的位置 創建特效框 核心修改 調整視圖,自己加個背景,不用原來的 設置 tipsLayout_bg 的層級 結果預覽 參考資料 需求場景 策劃說我們的tips特效框,遮擋文字。如果按官方說的設為底層又跑到背景框后…

Java 注解與 APT(Annotation Processing Tool)

Java 注解與 APT&#xff08;Annotation Processing Tool&#xff09; 注解&#xff08;Annotation&#xff09;基礎 注解是 Java 語言的一種元數據形式&#xff0c;它可以在代碼中添加標記信息&#xff0c;用于描述代碼的額外信息&#xff0c;但不會直接影響代碼的執行邏輯。注…

Unity 檢測網絡-判斷當前(Android/Windows平臺)設備是否連接了指定WiFi

判斷設備是否連接了特定的網絡1.Unity 腳本2.Unity AndroidManifest.xml文件①改個設置②補充權限語句1.Unity 腳本 using UnityEngine; using System.Collections; using System.Diagnostics; using Debug UnityEngine.Debug; using UnityEngine.UI;#if UNITY_ANDROID &…

通過網絡強化增強混合IT環境的安全

網絡是企業運營的支柱&#xff0c;也是網絡犯罪分子和惡意威脅者的主要目標&#xff0c;他們會破壞IT運營的連續性。隨著混合云基礎設施、遠程辦公和物聯網&#xff08;IoT&#xff09;生態系統的出現&#xff0c;網絡邊界正在不斷擴大&#xff0c;新的漏洞不斷產生&#xff0c…

ACP(四):RAG工作流程及如何創建一個RAG應用

RAG的工作原理 你在考試的時候有可能會因為忘記某個概念或公式而失去分數&#xff0c;但考試如果是開卷形式&#xff0c;那么你只需要找到與考題最相關的知識點&#xff0c;并加上你的理解就可以進行回答了。 對于大模型來說也是如此&#xff0c;在訓練過程中由于沒有見過某個知…

宇視設備視頻平臺EasyCVR視頻設備軌跡回放平臺監控攝像頭故障根因剖析

監控攝像頭的類型繁多&#xff0c;市場上提供了廣泛的選擇。然而&#xff0c;在使用監控攝像頭的過程中&#xff0c;用戶可能會遇到云臺在很短的時間內出現運轉不靈或完全無法轉動的問題。這里&#xff0c;我們將對這一常見問題進行深入分析。一、具體的原因&#xff1a; 1、距…

【Uni-App+SSM 寵物項目實戰】Day15:購物車添加

大家好!今天是學習路線的第15天,我們正式進入訂單與購物車核心模塊。昨天完成了商家服務列表的分頁加載,今天聚焦“購物車添加”功能——這是連接“商品瀏覽”與“訂單提交”的關鍵環節,用戶可將寵物用品(如糧食、玩具)加入購物車,后續統一結算。 為什么學這個? 購物車…

Java 黑馬程序員學習筆記(進階篇6)

常用的 API1. 正則表達式(1) 題目&#xff1a;貪婪爬取和非貪婪爬取① 貪婪爬取&#xff1a;爬取數據的時候盡可能的多獲取數據 ② 非貪婪爬取&#xff1a;爬取數據的時候盡可能的少獲取數據 ③ Java中默認的是貪婪爬取 ④ 后面加上 ? 可以轉變為非貪婪爬取(2) 捕獲分組捕獲分…

計算機網絡---數據鏈路層上

文章目錄1. 數據鏈路層的功能2. 組幀2.1 字符填充法2.2 字節填充法2.3 零比特填充法2.4 違規編碼2.5 總結3. 差錯控制3.1 檢錯編碼3.1.1 奇偶校驗3.1.2 循環冗余校驗碼&#xff08;CRC&#xff09;3.1.3 總結3.2 糾錯編碼&#xff08;海明校驗碼&#xff09;3.3 總結4. 流量控制…

機器學習實戰項目中,回歸與分類模型中該如何科學定義目標變量Y?

前言 在機器學習項目里&#xff0c;目標變量 (Y) 的定義決定了你能解答什么問題&#xff0c;以及模型能給業務帶來什么價值。選擇不當不僅可能導致模型誤差大、偏差嚴重&#xff0c;還可能讓業務決策方向偏離。 本文分兩大場景&#xff1a; 供應鏈項目中的 銷量預測&#xff08…

【 C/C++ 算法】入門動態規劃-----一維動態規劃基礎(以練代學式)

每日激勵&#xff1a;“不設限和自我肯定的心態&#xff1a;I can do all things。 — Stephen Curry” 緒論?&#xff1a; 本章是動態規劃算法的基礎入門篇&#xff0c;我將通過三道簡單題 一道中等難度的一維動態規劃題來帶你對動態規劃有個初認識&#xff0c;并基本了解動…

深入對比Tomcat與Netty:HTTP請求從網卡到Controller的全鏈路追蹤

我們日常用Spring Boot寫的RestController&#xff0c;感覺上就是一個簡單的方法&#xff0c;但它背后其實有一套復雜的網絡服務在支撐。一個HTTP請求到底是怎么從用戶的瀏覽器&#xff0c;穿過層層網絡&#xff0c;最終抵達我們代碼里的Controller方法的&#xff1f;理解這個過…

GO學習記錄十——發包

記錄下不同平臺的發包操作和期間遇到的問題 1.命令&#xff1a; $env:GOOSlinux $env:GOARCHamd64 go build -o release/HTTPServices-linux第一行&#xff0c;配置平臺&#xff0c;linux、windows 第二行&#xff0c;配置部署服務器的處理器架構 第三行&#xff0c;輸出目標文…

貪心算法與動態規劃

1. 什么是貪心算法&#xff1f; 貪心算法是一種在每一步選擇中都采取在當前狀態下最好或最優&#xff08;即最有利&#xff09;的選擇&#xff0c;從而希望導致結果是全局最好或最優的算法。 核心思想&#xff1a;“每步都貪心地選擇眼前最好的&#xff0c;不去考慮整個未來的長…

學會“讀網頁”:生成式 AI 在足球賽事信息整理中的實戰

逐步教程&#xff08;Step-by-Step&#xff09; — 適合初學者與教學類文章 背景&#xff08;為什么要這樣做&#xff09; 對于足球迷、資訊編輯與數據分析師來說&#xff0c;最快、最準確把握一場比賽的核心信息至關重要&#xff1a;比分、關鍵事件&#xff08;進球、點球、紅…