欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mysql中的存儲(chǔ)過(guò)程超詳細(xì)講解

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

1. 視圖

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

1.1 基本使用

創(chuàng)建視圖

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

CREATE VIEW 視圖名 AS SELECT 查詢(xún)語(yǔ)句;

示例:查看學(xué)生的學(xué)號(hào)、姓名、成績(jī)和課程號(hào):

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

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

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ù):假設(shè)我們希望修改馬小燕課程號(hào) 001 的成績(jī)?yōu)?100,若視圖支持更新操作,可以修改原表數(shù)據(jù):

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

刪除視圖

刪除視圖的語(yǔ)法如下:

DROP VIEW 視圖名;

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

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

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

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

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

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

語(yǔ)法示例:

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

創(chuàng)建表

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

語(yǔ)法示例:

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

1.4 視圖添加限制

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

視圖的修改限制

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

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

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

視圖查詢(xún)限制

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

權(quán)限控制與安全性

權(quán)限設(shè)置示例:

GRANT SELECT ON v_employee_view TO 'user1';

使用視圖時(shí),應(yīng)當(dāng)考慮權(quán)限控制,通過(guò)為不同用戶(hù)分配不同的視圖訪(fǎng)問(wèn)權(quán)限,可以確保數(shù)據(jù)安全。視圖可以提供一個(gè)中介層,使得用戶(hù)僅能訪(fǎng)問(wèn)特定數(shù)據(jù),而不暴露整個(gè)表的數(shù)據(jù)。

對(duì)于敏感數(shù)據(jù),視圖的設(shè)計(jì)應(yīng)遵循最小權(quán)限原則,避免直接暴露敏感信息。

2. 存儲(chǔ)過(guò)程的基本語(yǔ)法

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

2.1 創(chuàng)建存儲(chǔ)過(guò)程

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

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

存儲(chǔ)過(guò)程的參數(shù)包括:

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

不改變分隔符會(huì)出現(xiàn)報(bào)錯(cuò):

圖一

2.2 調(diào)用存儲(chǔ)過(guò)程

調(diào)用存儲(chǔ)過(guò)程的語(yǔ)法如下:

CALL procedure_name(parameters);

2.3 查看存儲(chǔ)過(guò)程信息

查看所有數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程:

SHOW PROCEDURE STATUS;

查看當(dāng)前數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程:

SHOW PROCEDURE STATUS WHERE db = 'db_name';

Db:存儲(chǔ)過(guò)程所在的數(shù)據(jù)庫(kù)

Name:存儲(chǔ)過(guò)程的名稱(chēng)

Type:存儲(chǔ)過(guò)程類(lèi)型(例如 PROCEDURE

Definer:存儲(chǔ)過(guò)程的定義者

Modified:最后修改時(shí)間

Created:創(chuàng)建時(shí)間

Security_type:安全類(lèi)型

Comment:存儲(chǔ)過(guò)程的注釋

2.4 查看存儲(chǔ)過(guò)程定義

查看存儲(chǔ)過(guò)程定義的語(yǔ)法:

SHOW CREATE PROCEDURE procedure_name;

2.5 刪除存儲(chǔ)過(guò)程

刪除存儲(chǔ)過(guò)程的語(yǔ)法如下:

DROP PROCEDURE procedure_name;

3. 變量

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

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

 查看當(dāng)前會(huì)話(huà)的系統(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;----查看當(dāng)前會(huì)話(huà)環(huán)境變量

3.2 設(shè)置全局變量與會(huì)話(huà)變量

Aspect

全局隔離權(quán)限

會(huì)話(huà)隔離權(quán)限

作用范圍

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

僅對(duì)當(dāng)前會(huì)話(huà)有效,獨(dú)立于全局權(quán)限

初始化與導(dǎo)入

在系統(tǒng)初始化時(shí)從全局設(shè)置導(dǎo)入

在新會(huì)話(huà)啟動(dòng)時(shí)從全局導(dǎo)入配置

修改的時(shí)效性

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

當(dāng)前會(huì)話(huà)的隔離級(jí)別修改不會(huì)影響其他會(huì)話(huà)

對(duì)系統(tǒng)設(shè)計(jì)的影響

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

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

3.2.1全局變量設(shè)置

SET GLOBAL transaction_isolation_level = 'READ COMMITTED';

 重新啟動(dòng)一個(gè)新的會(huì)話(huà):

3.2.2當(dāng)前會(huì)話(huà)變量設(shè)置

set session transaction isolation level read committed;

重新啟動(dòng)一個(gè)會(huì)話(huà):

3.3 用戶(hù)定義變量

用戶(hù)定義變量是會(huì)話(huà)級(jí)別的臨時(shí)變量,用戶(hù)可以在 SQL 語(yǔ)句中使用它們來(lái)存儲(chǔ)數(shù)據(jù)或進(jìn)行計(jì)算。變量名以 @ 開(kāi)頭。例如:

 使用 SET 語(yǔ)句定義變量:

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

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

SET @age = 25;

也可以直接在查詢(xún)語(yǔ)句中進(jìn)行賦值:

SELECT @variable_name := expression;

例如,將查詢(xún)結(jié)果賦值給變量:

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

3.4 局部變量

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

3.4.1 局部變量的聲明

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

局部變量的特點(diǎn):

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

3.4.2 局部變量的使用

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

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

 語(yǔ)法:

  • DECLARE variable_name data_type [DEFAULT value];

variable_name:變量的名稱(chēng)。

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

[DEFAULT value]:可選,設(shè)置默認(rèn)值。如果不指定,則默認(rèn)值為 NULL。

例子:

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

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

相關(guān)文章

  • Mysql中幾種插入效率的實(shí)例對(duì)比

    Mysql中幾種插入效率的實(shí)例對(duì)比

    這篇文章通過(guò)實(shí)例跟大家介紹了Mysql中幾種插入方法的效率對(duì)比,這其中包括逐條插入、基于事務(wù)的批量插入、單條語(yǔ)句一次插入多組數(shù)據(jù)以及導(dǎo)入數(shù)據(jù)文件等四種方法的對(duì)比,文中通過(guò)實(shí)例代碼介紹很詳細(xì),需要的朋友們下來(lái)來(lái)一起看看吧。
    2017-04-04
  • django2.2版本連接mysql數(shù)據(jù)庫(kù)的方法

    django2.2版本連接mysql數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了django2.2版本如何連接mysql數(shù)據(jù)庫(kù),本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 一文帶你了解Mysql主從同步原理

    一文帶你了解Mysql主從同步原理

    本文主要講解了Mysql主從同步原理,主從同步可以擴(kuò)展數(shù)據(jù)庫(kù)的負(fù)載能力、容錯(cuò)還可以數(shù)據(jù)備份等。想要了解相關(guān)內(nèi)容的朋友可以閱讀這篇文章
    2021-08-08
  • MySQL 主從復(fù)制原理與實(shí)踐詳解

    MySQL 主從復(fù)制原理與實(shí)踐詳解

    這篇文章主要介紹了MySQL 主從復(fù)制原理與實(shí)踐,結(jié)合實(shí)例形式分析了MySQL 主從復(fù)制基本概念、原理、實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • 詳解MySQL監(jiān)控工具 mysql-monitor

    詳解MySQL監(jiān)控工具 mysql-monitor

    這篇文章主要介紹了解MySQL監(jiān)控工具 mysql-monitor的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-07-07
  • MySQL InnoDB引擎ibdata文件損壞/刪除后使用frm和ibd文件恢復(fù)數(shù)據(jù)

    MySQL InnoDB引擎ibdata文件損壞/刪除后使用frm和ibd文件恢復(fù)數(shù)據(jù)

    mysql的ibdata文件被誤刪、被惡意修改,沒(méi)有從庫(kù)和備份數(shù)據(jù)的情況下的數(shù)據(jù)恢復(fù),不能保證數(shù)據(jù)庫(kù)所有表數(shù)據(jù)的100%恢復(fù),目的是盡可能多的恢復(fù),下面是具體的操作方法
    2025-03-03
  • Windows下通過(guò)MySQL Installer安裝MySQL服務(wù)的教程圖解

    Windows下通過(guò)MySQL Installer安裝MySQL服務(wù)的教程圖解

    MYSQL官方提供了Installer方式安裝MYSQL服務(wù)以及其他組件,使的Windows下安裝,卸載,配置MYSQL變得特別簡(jiǎn)單。接下來(lái)通過(guò)圖文并茂的形式給大家介紹Windows下通過(guò)MySQL Installer安裝MySQL服務(wù)的教程,一起看看吧
    2018-10-10
  • MySQL修改表結(jié)構(gòu)操作命令總結(jié)

    MySQL修改表結(jié)構(gòu)操作命令總結(jié)

    這篇文章主要介紹了MySQL修改表結(jié)構(gòu)操作命令總結(jié),包含如刪除列、添加列、修改列、添加主鍵、刪除主鍵、添加唯一索引、添加普通索引等內(nèi)容,需要的朋友可以參考下
    2014-12-12
  • CentOS7使用rpm包安裝mysql 5.7.18

    CentOS7使用rpm包安裝mysql 5.7.18

    這篇文章主要為大家詳細(xì)介紹了CentOS7使用rpm包安裝mysql 5.7.18的相關(guān)步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • MySQL中數(shù)據(jù)查詢(xún)語(yǔ)句整理大全

    MySQL中數(shù)據(jù)查詢(xún)語(yǔ)句整理大全

    查詢(xún)語(yǔ)句是以后在工作中使用最多也是最復(fù)雜的用法,如何精準(zhǔn)的查詢(xún)出想要的結(jié)果以及用最合理的邏輯去查詢(xún)尤為重要,下面這篇文章主要給大家介紹了關(guān)于MySQL中數(shù)據(jù)查詢(xún)語(yǔ)句的相關(guān)資料,需要的朋友可以參考下
    2023-04-04

最新評(píng)論