最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql中的存儲過程超詳細講解

 更新時間:2025年04月25日 09:51:35   作者:貓咪-9527  
這篇文章主要介紹了Mysql中的存儲過程超詳細講解,包括存儲過程基本語法,感興趣的朋友一起看看吧

1. 視圖

視圖是一個虛擬表,其內(nèi)容由查詢定義。與實際的物理表類似,視圖也包含一系列具有名稱的列和行數(shù)據(jù)。視圖的數(shù)據(jù)變化會影響基表,反之,基表的數(shù)據(jù)變化也會影響視圖。

1.1 基本使用

創(chuàng)建視圖

創(chuàng)建視圖的基本語法如下:

CREATE VIEW 視圖名 AS SELECT 查詢語句;

示例:查看學生的學號、姓名、成績和課程號:

SELECT s1.sno, snme, sdept, grade, cno 
FROM student s1 
JOIN score s2 ON s1.sno = s2.sno;

創(chuàng)建視圖 v_s_s,該視圖包含學生學號、姓名、成績和課程號:

CREATE VIEW v_s_s AS 
SELECT s1.sno, snme, sdept, grade, cno 
FROM student s1 
JOIN score s2 ON s1.sno = s2.sno;

修改視圖中的數(shù)據(jù):假設我們希望修改馬小燕課程號 001 的成績?yōu)?100,若視圖支持更新操作,可以修改原表數(shù)據(jù):

UPDATE v_s_s 
SET grade = 100 
WHERE sno = '馬小燕' AND cno = '001';

刪除視圖

刪除視圖的語法如下:

DROP VIEW 視圖名;

1.2 視圖的規(guī)則與限制

視圖與基表之間存在緊密的關系,視圖數(shù)據(jù)的修改會影響基表的數(shù)據(jù),反之亦然。為了確保系統(tǒng)的穩(wěn)定性,使用視圖時需要特別注意以下限制:

  • 數(shù)據(jù)更新限制:并非所有視圖都支持數(shù)據(jù)更新操作。特別是當視圖涉及多個表的連接、聚合函數(shù)、分組(GROUP BY)等操作時,修改視圖中的數(shù)據(jù)可能會受到限制。例如,包含聚合函數(shù)或聯(lián)合查詢的視圖通常不支持更新。
  • 性能考慮:雖然視圖可以簡化查詢,但如果查詢的視圖非常復雜且涉及大量數(shù)據(jù),可能會導致性能問題。因此,在設計視圖時應避免過于復雜的查詢,特別是涉及大量數(shù)據(jù)的視圖。
  • 不支持索引:視圖本身不支持索引,因此在使用視圖時,查詢性能可能不如直接查詢基表。如果視圖查詢包含復雜的計算或連接操作,可能會對查詢性能產(chǎn)生影響。
  • 只讀視圖:一些視圖被設計為只讀的,無法修改其中的數(shù)據(jù)。這通常發(fā)生在視圖涉及多表連接、聚合操作或復雜計算時。對于這種只讀視圖,修改視圖中的數(shù)據(jù)將會失敗。

1.3 視圖與查找數(shù)據(jù)創(chuàng)建表的比較

視圖和基于查詢結果創(chuàng)建的表在以下方面有所不同:

視圖
視圖是動態(tài)的,它始終基于最新的查詢結果。當視圖中的數(shù)據(jù)發(fā)生變化時,實際的數(shù)據(jù)表也會發(fā)生變化。視圖不存儲數(shù)據(jù)本身,而是存儲查詢邏輯。當查詢視圖時,實際上是執(zhí)行視圖定義中的查詢語句。

語法示例:

CREATE VIEW t_name AS SELECT 查詢數(shù)據(jù);

創(chuàng)建表

使用 CREATE TABLE 可以將查詢結果保存為一個物理表。與視圖不同,創(chuàng)建的表會將數(shù)據(jù)永久存儲在數(shù)據(jù)庫中,數(shù)據(jù)修改不會影響原始數(shù)據(jù)表。創(chuàng)建的表可以具有索引等性能優(yōu)化。

語法示例:

CREATE TABLE t_name AS SELECT 查詢數(shù)據(jù);

1.4 視圖添加限制

在 MySQL 中,視圖雖然提供了極大的便利,但在某些情況下需要對其進行適當?shù)南拗?,以確保數(shù)據(jù)的一致性和完整性。以下是常見的視圖限制及其應用:

視圖的修改限制

  • 當視圖涉及多個表、聚合函數(shù)、分組等操作時,視圖通常為只讀,無法直接修改。只有在視圖基于單一表且沒有涉及復雜計算時,視圖才通常支持數(shù)據(jù)更新操作。
  • 若需要限制視圖中數(shù)據(jù)的修改,可以使用 WITH CHECK OPTION,該選項確保通過視圖進行的更新操作符合視圖中的條件,否則修改會被拒絕。

例如,創(chuàng)建一個只允許修改 grade >= 60 的視圖:

CREATE VIEW v_students AS 
SELECT sno, snme, grade 
FROM student 
WHERE grade >= 60
WITH CHECK OPTION;

視圖查詢限制

視圖能夠簡化復雜的查詢,但也需要根據(jù)實際需求進行適當限制。為了確保不暴露敏感數(shù)據(jù),可以設計只包含非敏感字段或經(jīng)過加密/脫敏處理的視圖。

權限控制與安全性

權限設置示例:

GRANT SELECT ON v_employee_view TO 'user1';

使用視圖時,應當考慮權限控制,通過為不同用戶分配不同的視圖訪問權限,可以確保數(shù)據(jù)安全。視圖可以提供一個中介層,使得用戶僅能訪問特定數(shù)據(jù),而不暴露整個表的數(shù)據(jù)。

對于敏感數(shù)據(jù),視圖的設計應遵循最小權限原則,避免直接暴露敏感信息。

2. 存儲過程的基本語法

存儲過程是一組 SQL 語句的集合,它被存儲在數(shù)據(jù)庫中,并可根據(jù)需要執(zhí)行,可以接收輸入?yún)?shù)并返回結果。

2.1 創(chuàng)建存儲過程

存儲過程的創(chuàng)建需要修改語句分隔符,以避免與 SQL 語句的結束符(;)發(fā)生沖突:

DELIMITER $$  -- 修改分隔符以避免與語句結束符沖突
CREATE PROCEDURE procedure_name (parameters)
BEGIN
   -- SQL 語句
END$$
DELIMITER ;  -- 恢復分隔符

存儲過程的參數(shù)包括:

  • IN:輸入?yún)?shù),用于向存儲過程傳遞值。
  • OUT:輸出參數(shù),用于存儲過程返回數(shù)據(jù)。
  • INOUT:輸入輸出參數(shù),既可以接收輸入數(shù)據(jù),又可以返回結果。

不改變分隔符會出現(xiàn)報錯:

圖一

2.2 調(diào)用存儲過程

調(diào)用存儲過程的語法如下:

CALL procedure_name(parameters);

2.3 查看存儲過程信息

查看所有數(shù)據(jù)庫的存儲過程:

SHOW PROCEDURE STATUS;

查看當前數(shù)據(jù)庫的存儲過程:

SHOW PROCEDURE STATUS WHERE db = 'db_name';

Db:存儲過程所在的數(shù)據(jù)庫

Name:存儲過程的名稱

Type:存儲過程類型(例如 PROCEDURE

Definer:存儲過程的定義者

Modified:最后修改時間

Created:創(chuàng)建時間

Security_type:安全類型

Comment:存儲過程的注釋

2.4 查看存儲過程定義

查看存儲過程定義的語法:

SHOW CREATE PROCEDURE procedure_name;

2.5 刪除存儲過程

刪除存儲過程的語法如下:

DROP PROCEDURE procedure_name;

3. 變量

3.1 查看系統(tǒng)變量

 3.1.1查看所有系統(tǒng)變量

 查看當前會話的系統(tǒng)變量:

SHOW SESSION VARIABLES;

 查看全局系統(tǒng)變量:

SHOW GLOBAL VARIABLES;

3.1.2系統(tǒng)變量的模糊匹配

show session variables like '...';
?show global variables like '...';

 3.1.3查看指定變量

select @@global.tname;----查看指定全局環(huán)境變量
select @@session.tname;----查看當前會話環(huán)境變量

3.2 設置全局變量與會話變量

Aspect

全局隔離權限

會話隔離權限

作用范圍

系統(tǒng)范圍,決定了系統(tǒng)的默認行為和限制

僅對當前會話有效,獨立于全局權限

初始化與導入

在系統(tǒng)初始化時從全局設置導入

在新會話啟動時從全局導入配置

修改的時效性

修改后不會立即影響現(xiàn)有會話,需重新啟動會話才會生效

當前會話的隔離級別修改不會影響其他會話

對系統(tǒng)設計的影響

確保系統(tǒng)權限的統(tǒng)一性,易于集中管理

確保每個會話可以根據(jù)需要調(diào)整權限,而不影響其他會話

3.2.1全局變量設置

SET GLOBAL transaction_isolation_level = 'READ COMMITTED';

 重新啟動一個新的會話:

3.2.2當前會話變量設置

set session transaction isolation level read committed;

重新啟動一個會話:

3.3 用戶定義變量

用戶定義變量是會話級別的臨時變量,用戶可以在 SQL 語句中使用它們來存儲數(shù)據(jù)或進行計算。變量名以 @ 開頭。例如:

 使用 SET 語句定義變量:

SET @variable_name = value;-----方法一
SET @variable_name := value;----方法二

例如,定義一個名為 @age 的變量并賦值為 25:

SET @age = 25;

也可以直接在查詢語句中進行賦值:

SELECT @variable_name := expression;

例如,將查詢結果賦值給變量:

SELECT @age := age FROM users WHERE name = 'John';-----方法一
SELECT age into @age FROM users WHERE name = 'John';---方法二

3.4 局部變量

局部變量是在存儲過程、函數(shù)或觸發(fā)器內(nèi)部定義的變量,作用范圍僅限于該存儲過程、函數(shù)或觸發(fā)器的執(zhí)行期間。它們通常用于臨時存儲數(shù)據(jù)、進行計算或傳遞信息。

3.4.1 局部變量的聲明

在 MySQL 中,局部變量通過 DECLARE 語句在存儲過程、函數(shù)或觸發(fā)器中聲明。局部變量的作用范圍僅限于聲明它們的存儲過程、函數(shù)或觸發(fā)器內(nèi)部,并且不能在 SQL 查詢的其他地方使用。

局部變量的特點:

  • 局部性:局部變量僅在存儲過程、函數(shù)或觸發(fā)器的執(zhí)行期間有效。當存儲過程或函數(shù)執(zhí)行完畢后,局部變量會被自動銷毀。
  • 無法在查詢外部使用:局部變量只能在其所在的存儲過程、函數(shù)或觸發(fā)器內(nèi)使用,不能在 SQL 查詢的其他部分引用。
  • 生命周期:當存儲過程或函數(shù)執(zhí)行結束時,局部變量的值會丟失。每次執(zhí)行存儲過程或函數(shù)時,局部變量會重新創(chuàng)建,并可以為其賦予初始值(如果指定了初始值)。

3.4.2 局部變量的使用

局部變量常用于存儲中間計算結果、執(zhí)行邏輯運算或在存儲過程/函數(shù)中臨時存儲查詢結果。它們的使用受到以下限制:

  • 聲明位置DECLARE 語句必須在存儲過程、函數(shù)或觸發(fā)器的開頭部分,也就是在 BEGIN 語句之前聲明。
  • 命名規(guī)則:局部變量不能使用以 @ 開頭的命名方式。@ 是用于用戶定義會話變量的前綴,局部變量不允許使用此命名規(guī)則。
  • 初始值:如果沒有為局部變量指定初始值,則其默認值為 NULL。因此,在使用局部變量時,開發(fā)者需要考慮 NULL 的處理,確保程序的邏輯正確。

 語法:

  • DECLARE variable_name data_type [DEFAULT value];

variable_name:變量的名稱。

data_type:變量的數(shù)據(jù)類型(如 INT, VARCHAR, DATE 等)。

[DEFAULT value]:可選,設置默認值。如果不指定,則默認值為 NULL。

例子:

DECLARE @user_id INT DEFAULT 100;
DECLARE @user_name VARCHAR(255) DEFAULT 'John';

到此這篇關于Mysql之存儲過程的文章就介紹到這了,更多相關mysql存儲過程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MySQL線上死鎖分析實戰(zhàn)

    MySQL線上死鎖分析實戰(zhàn)

    這篇文章主要介紹了MySQL線上死鎖分析實戰(zhàn),文章內(nèi)容分析的很清楚,有對于這方面不懂的同學可以研究下
    2021-02-02
  • MySQL中Union子句不支持order by的解決方法

    MySQL中Union子句不支持order by的解決方法

    這篇文章主要介紹了MySQL中Union子句不支持order by的解決方法,結合實例形式分析了在mysql的Union子句中使用order by的方法,需要的朋友可以參考下
    2016-06-06
  • MySQL高級查詢示例詳細介紹

    MySQL高級查詢示例詳細介紹

    這篇文章主要介紹了MySQL高級查詢示例,在面試過程中經(jīng)常會遇到sq查詢問題,今天小編通過本文給大家介紹下MySQL高級查詢語法分析,感興趣的朋友跟隨小編一起看看吧
    2023-02-02
  • MYSQL數(shù)據(jù)庫管理之權限管理解讀

    MYSQL數(shù)據(jù)庫管理之權限管理解讀

    這篇文章主要介紹了MYSQL數(shù)據(jù)庫管理之權限管理解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • MySQL中慢查詢分析與索引優(yōu)化實戰(zhàn)技巧

    MySQL中慢查詢分析與索引優(yōu)化實戰(zhàn)技巧

    這篇文章主要為大家詳細介紹了MySQL中慢查詢分析與索引優(yōu)化相關實戰(zhàn)技巧,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2026-02-02
  • MySQL下使用Inplace和Online方式創(chuàng)建索引的教程

    MySQL下使用Inplace和Online方式創(chuàng)建索引的教程

    這篇文章主要介紹了MySQL下使用Inplace和Online方式創(chuàng)建索引的教程,針對InnoDB為存儲引擎的情況,需要的朋友可以參考下
    2015-11-11
  • MySQL慢查詢優(yōu)化解決問題

    MySQL慢查詢優(yōu)化解決問題

    這篇文章主要介紹了MySQL慢查詢優(yōu)化解決問題,MySQL的慢查詢,全名是慢查詢?nèi)罩荆荕ySQL提供的一種日志記錄,用來記錄在MySQL中響應時間超過閥值的語句,下文詳細介紹慢查詢的調(diào)優(yōu)情況,需要的小伙伴可以參考一下
    2022-03-03
  • MySQL存儲毫秒數(shù)據(jù)的方法

    MySQL存儲毫秒數(shù)據(jù)的方法

    MySQL中沒有可以直接存儲毫秒數(shù)據(jù)的數(shù)據(jù)類型,但是不過MySQL卻能識別時間中的毫秒部分。這篇文章主要介紹了MySQL存儲毫秒數(shù)據(jù)的方法,需要的朋友可以參考下
    2014-06-06
  • MySQL單條插入與批量插入實現(xiàn)方法及對比分析

    MySQL單條插入與批量插入實現(xiàn)方法及對比分析

    在數(shù)據(jù)庫操作中,數(shù)據(jù)插入效率直接影響系統(tǒng)性能,本文深入解析MySQL單條插入與批量插入的實現(xiàn)方法、核心差異及選型策略,助你根據(jù)業(yè)務場景選擇最優(yōu)方案,提升10倍以上寫入性能,感興趣的小伙伴跟著小編一起來看看吧
    2025-06-06
  • mysql 5.7.23 安裝配置圖文教程

    mysql 5.7.23 安裝配置圖文教程

    這篇文章主要為大家詳細介紹了mysql 5.7.23 安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09

最新評論

昌黎县| 宣化县| 阳江市| 青龙| 青州市| 福贡县| 唐河县| 滦平县| 广东省| 达拉特旗| 宁化县| 板桥市| 靖边县| 抚远县| 通江县| 克山县| 东海县| 毕节市| 天镇县| 广昌县| 定西市| 项城市| 峡江县| 化州市| 体育| 澜沧| 乡宁县| 辉南县| 台东县| 永胜县| 靖安县| 乌兰察布市| 石景山区| 黎城县| 庆城县| 乳山市| 长子县| 元阳县| 娄烦县| 光泽县| 连山|