SQL存儲過程和視圖

?1 存儲過程

存儲過程是事先編寫好、存儲在數據庫中的一組SQL命令集合。用來完成對數據庫的指定操作。

1.1 優缺點

優點:

1)提高系統性能。創建時進行編譯,隨后存放在數據庫服務器的過程高速緩存中,之后不需要再次執行分析和編譯操作,節省了分析、解析和優化SQL代碼所需的時間。

2)可自動完成需要預先執行的任務。

缺點:

1)每個連接的內存使用量將增加。

2)開發和維護困難、可移植性差。

1.2 mysql變量

sql變量按范圍可劃分為三類:

1)全局變量(系統變量),對所有會話生效,需具備super權限才能設置。SET GLOBAL 變量名。

注意:全局變量不能被定義只能修改,只能設置已存在的系統變量,否則報錯

2)會話變量,對當前會話生效。SET @變量名或者SET @@變量名。

3)局部變量,作用返回在BEGIN與END之間。

DECLARE

1)設置局部變量。

2)不能以@開始

SET

1)可以以@開始

2)定義會話變量或設置全局變量。

表DECLARE 與 SET的區別

DROP VARIABLE 變量名,刪除變量。

1.2.1 變量賦值

1)使用set。 set @變量名 = 變量值 或 set @變量名 := 變量值;

SET @val1 = "123";

SET @val2 := "abc";

2)使用SELECT。必須使用 “:=”,不能使用 “=”(其此時代表比較是否相等)。 注意:SELECT賦值變量時,變量前面一定要是@

SELECT @變量名 := 變量值;

SELECT @val3 := "edf";

SELECT @變量名:= 字段名 FROM table_name WHERE ... LIMIT 0,1; (如果查詢結果不止一個,則取結果的最后一個)

SELECT @money := money FROM student WHERE money > 0 LIMIT 0,1;

1.3 定義

存儲過程有三種類型變量:1)IN,輸入參數;2)OUT,輸出參數;3)INOUT,輸入/輸出參數。

其基本語法如下;

1)語句必須在BEGIN與END之間。

2)DECLARE 來聲明變量,默認值在其后面加DEFAULT 值。

3)改變變量值,使用SET 變量=值。

4)調用使用CALL。

5)mysql 不支持 CREATE OR REPLACE PROCEDURE 語法,可以用DROP PROCEDURE IF EXISTS 存儲過程名;來刪除特定的存儲過程。

DROP PROCEDURE IF EXISTS demo;CREATE PROCEDURE demo(IN p_age INT,OUT p_count INT)BEGINSELECT @count := COUNT(*) FROM student WHERE age > p_age;SET p_count = @count;END;CALL demo(18,@count);SELECT @count;

1.3.1 條件控制 IF ELSE 與 CASE

只能在BEGIN 及 END 之間使用IF ELSE。需要以 END IF 結尾。

DROP PROCEDURE IF EXISTS demo;CREATE PROCEDURE demo(IN p_num INT)BEGINDECLARE tempChar CHAR(24);IF p_num = 1 THEN SET tempChar = '一';ELSEIF p_num = 2 THEN SET tempChar = '二';ELSE SET tempChar = "其他";END IF;SELECT tempChar;END;CALL demo(1);CALL demo(5);

注意:不能在SELECT 中直接使用IF ELSE,下面代碼是錯誤的:

SELECTIF p_num = 1 THEN '一';ELSE '其他';END IF;CASE WHEN使用范圍更廣,可在SELECT中直接使用,需要以END結尾。SELECTCASE ageWHEN 17 THEN '十七'WHEN 18 THEN '十八'ELSE '其他'END AS ageFROM student ??????

1.3.2 循環 LEAVE與ITERATE

循環需要有個標簽,LEVAE相當于Java的break,而ITERATE相當于continue。循環體位于 標簽名:LOOP 與 END LOOP 標簽名之間。

DROP PROCEDURE IF EXISTS demo;CREATE PROCEDURE demo(IN p_num INT)BEGINDECLARE p_count INT DEFAULT 0;DECLARE p_pos INT DEFAULT 0;myLabel: LOOPSET p_pos = p_pos + 1;IF p_pos > p_num THENLEAVE myLabel;END IF;IF MOD(p_pos,2) = 1 THENITERATE myLabel;END IF;SET p_count = p_count + 1;END LOOP myLabel;SELECT p_count;END;

1.4 與函數對比

存儲過程

函數

返回值

返回0個、一個或多個結果集

有且只有一個結果值。

調用方式

call調用

可以直接在SELECT中使用。

參數

有三種類型 IN、OUT、INOUT

只有類似IN類型參數

其他限制

可以用臨時表

不能用臨時表

表 存儲過程與函數的對比

2 視圖

視圖是一種虛擬表(邏輯表),本身并不包含數據,作為一個SELECT語句保存在數據字典中。由一個或多個表(報告視圖)查詢而動態生成的表。

2.1 優缺點

優點:

簡單、安全、數據獨立。

缺點:

1)性能較低。

2)維護復雜,每當修改與視圖相關的基表的表結構時,都必須進行視圖更改操作。

3)修改限制,當用戶試圖修改視圖信息時,數據庫必須把它轉化為對基表的某些信息的修改。對于比較復雜的試圖,可能就不能進行修改了。

2.2 定義

簡單創建視圖的語法為:

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

對于單表的視圖,我們可以像對待基表一樣對其進行增刪改操作(結果最終會作用于基表)。

2.2.1 創建語法

CREATE[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]?[DEFINER = { user | CURRENT_USER }]?[SQL SECURITY { DEFINER | INVOKER }]VIEW view_name [(column_list)]AS select_statement?[WITH [CASCADED | LOCAL] CHECK OPTION]

ALGORITHM:創建視圖使用的算法。UNDEFINED,默認值,不指定算法(沒指定時一般采用merge算法);MERGE,合并算法,在基于視圖創建新的視圖時,將創建舊視圖所使用的SELECT語句與將要創建新的視圖的SELECT語句進行合并處理,效率更高;TEMPTABLE,臨時表算法,在基于視圖創建新的視圖時,先執行舊視圖的SELECT語句,然后再執行新視圖的SELECT語句,效率較低。

DEFINER:視圖創建者。user 為指定創建的用戶;CURRENT_USER為當前登錄用戶。

SQL SECURITY:視圖的安全策略。DEFINER 默認值,驗證是否擁有對視圖本身的權限;INVOKER,驗證對視圖的權限及對視圖所涉及到的表的權限。

WITH:更改視圖數據時,對更改的數據進行檢查。基本檢查策略是,當更改視圖中的數據時,如更改之后的結果不符合創建該視圖的權限,則不允許。CASCADED和LOCAL都具備基礎檢查策略。LOCAL,如果該視圖關聯了其他視圖,對視圖進行數據操作時,只需滿足當前視圖的創建條件即可。CASCADED,既要符合當前視圖的條件,也要符合關聯視圖的條件。

CREATEALGORITHM=MERGEDEFINER=CURRENT_USERSQL SECURITY INVOKERVIEW student_viewAS SELECT * FROM studentWITH CASCADED CHECK OPTION;

通過GRANT <權限> ON <數據對象> TO <數據庫用戶> 來進行授權:

GRANT SELECT,UPDATE ON study.student_view TO 'root'@'localhost';

通過REVOKE <權限> ON <數據對象> FROM <數據庫用戶> 來移除授權:

REVOKE SELECT ON study.student_view FROM 'root'@'localhost';

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

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

相關文章

uniapp app將base64保存到相冊,uniapp app將文件流保存到相冊

如果是文件流可以先轉base64詳情見>uniapp 顯示文件流圖片-CSDN博客 onDown(){let base64 this.qrcodeUrl ; // base64地址const bitmap new plus.nativeObj.Bitmap("test");bitmap.loadBase64Data(base64, function() {const url "_doc/" new Dat…

Backend - Dbeaver

目錄 一、說明 二、下載并安裝 &#xff08;一&#xff09;官網下載 &#xff08;二&#xff09;安裝 三、使用 &#xff08;一&#xff09;操作步驟 &#xff08;二&#xff09;相關問題&#xff1a;無法加載驅動類oracle.jdbc.oracledriver 1. 新建驅動 2. 再重新連接數據庫 …

PyTorch2.0環境搭建

一、安裝python并配置環境變量 1、打開python官網&#xff0c;下載并安裝 Welcome to Python.org 下載 尋找版本&#xff1a;推薦使用3.9版本&#xff0c;或其他表中顯示為安全&#xff08;security&#xff09;的版本 安裝&#xff1a;&#xff08;略&#xff09; 2、配置環…

數據增強改進,實現檢測目標copypaste,增加目標數據量,提升精度

???YOLOv8實戰寶典--星級指南:從入門到精通,您不可錯過的技巧 ??-- 聚焦于YOLO的 最新版本, 對頸部網絡改進、添加局部注意力、增加檢測頭部,實測漲點 ?? 深入淺出YOLOv8:我的專業筆記與技術總結 ??-- YOLOv8輕松上手, 適用技術小白,文章代碼齊全,僅需 …

python圣誕樹代碼編程

以下是一個簡單的Python圣誕樹代碼&#xff1a; def draw_tree(height): for i in range(height): print( * (height - i - 1) * * (2 * i 1)) print( * (height - 1) |)draw_tree(10) 這個函數會繪制一個等腰三角形&#xff0c;其中每一行的星號數量從1開…

Java基礎知識

JVM&#xff0c;JRE&#xff0c;JDK JVM 運行Java字節碼的機器 JRE Java運行時環境&#xff0c;包括JVM&#xff0c;Java類庫&#xff0c;運行時類庫&#xff0c;國際化支持&#xff0c;安全管理器&#xff0c;啟動器等 比JVM多的內容 Java類庫&#xff1a;提供大量已經實…

【TiDB理論知識09】TiFlash

一 TiFlash架構 二 TiFlash 核心特性 TiFlash 主要有 異步復制、一致性、智能選擇、計算加速 等幾個核心特性。 1 異步復制 TiFlash 中的副本以特殊角色 (Raft Learner) 進行異步的數據復制&#xff0c;這表示當 TiFlash 節點宕機或者網絡高延遲等狀況發生時&#xff0c;Ti…

億勝盈科ATR2037 無限射頻前端低噪聲放大器

億勝盈科ATR2037 是一款應用于無線通信射頻前端&#xff0c;工作頻段為 0.7 到 6GHz 的超低噪聲放大器。 ATR2037 低噪聲放大器采用先進的 GaAs pHEMT 工藝設計和制作&#xff0c;ATR2037 低噪聲放大器在整個工作頻段內可以獲得非常好的射頻性能超低噪聲系數。 億勝盈科ATR203…

WGCLOUD v3.5.0 新增支持監測交換機的接口狀態UP DOWN

WGCLOUD v3.5.0開始 可以監測交換機或SNMP設備的接口狀態了&#xff0c;直接上圖

什么是ElasticSearch中的過濾器?

在Elasticsearch中&#xff0c;過濾器&#xff08;Filters&#xff09;是一種用于在查詢中篩選文檔的強大工具。過濾器可以根據特定條件來評估文檔是否符合搜索查詢。這些條件通常應用于字段數據&#xff0c;并根據匹配結果返回符合條件的文檔。 過濾器的主要優點包括&#xf…

如何給網頁和代碼做HTML加密?

? 本篇文章給大家談談html混淆加密在線&#xff0c;以及HTML在線加密對應的知識點&#xff0c;希望對各位有所幫助&#xff0c;不要忘了收藏本站喔。 如何給代碼加密? 1、源代碼加密軟件推薦使用德人合科技的加密軟件&#xff0c;是一套從源頭上保障數據安全和使用安全的軟…

vue2+datav可視化數據大屏(1)

開始 &#x1f4d3; 最近打算出一個前端可視化數據大屏的系列專欄&#xff0c;這次將很全面的教大家設計可視化大屏&#xff0c;從開始到打包結束&#xff0c;其中&#xff0c;包括如何設計框架&#xff0c;如何封裝axios&#xff0c;等等&#xff0c;本次使用的數據均為mock數…

linux C++監聽管道文件方式

方式一&#xff08;傳統讀取文件&#xff0c;一直監聽循環讀取文件&#xff09; 非阻塞打開文件&#xff0c;用read循環定時讀取&#xff0c;性能不好 代碼如下&#xff1a; #include <iostream> #include <fstream> #include <functional> #include <…

spring boot項目如何自定義參數校驗規則

spring boot項目對參數進行校驗時&#xff0c;比如非空校驗&#xff0c;可以直接用validation包里面自帶的注解。但是對于一些復雜的參數校驗&#xff0c;自帶的校驗規則無法滿足要求&#xff0c;此時需要我們自定義參數校驗規則。自定義校驗規則和自帶的規則實現方式一樣&…

時域頻域(學習記錄1)

1 小伙伴們&#xff0c;今天讓我們一起來聊聊Something about DATA 系列。我們先回顧一下本系列對NVH測試中的數據采集做的整體介紹&#xff1a; A 數據采集過程&#xff1b; B 硬件設備&#xff1b; C 數采軟件&#xff1b; D ATOM中的數據采集&#xff1b; 接下來的幾篇文章…

java如何編寫 Restful API

一、什么是RESTful API RESTful API是指符合REST&#xff08;Representational State Transfer&#xff09;架構風格的API。RESTful API是一種架構設計風格&#xff0c;它基于HTTP協議&#xff0c;使用常見的HTTP方法&#xff08;例如GET、POST、PUT、DELETE等&#xff09;對資…

cmake生成表達式

不積小流&#xff0c;無以成江海 <CONFIG:RELEASE> config這個關鍵字&#xff0c;主要是看CMAKE_BUILD_TYPE這個變量的值是不是和冒號后的一樣&#xff0c;一樣的話就返回true, 否則就是false. cmake_minimum_required(VERSION 3.10) project(Test) set(CMAKE_CXX_STA…

數據結構--二叉樹

目錄 1.二叉樹鏈式結構的實現 1.1 前置說明 1.2 二叉樹的遍歷 1.2.1 前序、中序以及后序遍歷 1.2.2 層序遍歷及判斷是否為完全二叉樹 1.3 節點個數&#xff0c;葉子節點個數&#xff0c;第k層節點個數以及高度等 1.4 二叉樹的創建和銷毀 1.二叉樹鏈式結構的實現 1.1 前置說…

Mysql啟動占用內存過高解決

Hi, I’m Shendi Mysql啟動占用內存過高解決 前言 最近服務器內存不夠用了&#xff0c;甚至還出現了內存溢出問題&#xff0c;導致程序宕機。但請求與用戶量并沒有多少&#xff0c;所以從各種啟動的程序中想方設法的盡可能的減少其占用的內存。 而在我的服務器中&#xff0c;…

幾何尺寸智能測量儀為您帶來經濟效益提升

線材、棒材、管材、板材等產品的品質檢測離不開一些基礎幾何尺寸的檢測&#xff0c;隨著產線自動化的提升&#xff0c;越來越多的產線開始使用智能測量儀&#xff0c;這不僅僅是因為其能帶來品質的提升&#xff0c;更是因為其能帶來的經濟效益。 幾何尺寸智能測量儀種類繁多&am…