文章編號:10759時間:2024-09-29人氣:
本質上沒區別。 只是函數有如:只能返回一個變量的限制。 而存儲過程可以返回多個。 而函數是可以嵌入在sql中使用的,可以在select中調用,而存儲過程不行。 執行的本質都一樣。 函數限制比較多,比如不能用臨時表,只能用表變量.還有一些函數都不可用等等.而存儲過程的限制相對就比較少由于我現在基本上是DBA的工作,因此平時也看一些數據庫方面的書籍。 但是我一直對存儲過程和函數之間的區別掌握不透。 我向來認為存儲過程可以實現的操作,函數也一樣可以實現。 最近,剛好大學的老師給我們上SQL-Server的課程,我對這個問題的疑惑終于慢慢解開。 今天晚上順便看了些網上的資料,覺得以下分析比較合理:1. 一般來說,存儲過程實現的功能要復雜一點,而函數的實現的功能針對性比較強。 2. 對于存儲過程來說可以返回參數,而函數只能返回值或者表對象。 3. 存儲過程一般是作為一個獨立的部分來執行,而函數可以作為查詢語句的一個部分來調用,由于函數可以返回一個表對象,因此它可以在查詢語句中位于FROM關鍵字的后面。 4. 當存儲過程和函數被執行的時候,SQL Manager會到procedure cache中去取相應的查詢語句,如果在procedure cache里沒有相應的查詢語句,SQL Manager就會對存儲過程和函數進行編譯。 Procedure cache中保存的是執行計劃 (execution plan) ,當編譯好之后就執行procedure cache中的execution plan,之后SQL SERVER會根據每個execution plan的實際情況來考慮是否要在cache中保存這個plan,評判的標準一個是這個execution plan可能被使用的頻率;其次是生成這個plan的代價,也就是編譯的耗時。 保存在cache中的plan在下次執行時就不用再編譯了。 存儲過程和用戶自定義函數具體的區別存儲過程存儲過程可以使得對數據庫的管理、以及顯示關于數據庫及其用戶信息的工作容易得多。 存儲過程是 SQL 語句和可選控制流語句的預編譯集合,以一個名稱存儲并作為一個單元處理。 存儲過程存儲在數據庫內,可由應用程序通過一個調用執行,而且允許用戶聲明變量、有條件執行以及其它強大的編程功能。 存儲過程可包含程序流、邏輯以及對數據庫的查詢。 它們可以接受參數、輸出參數、返回單個或多個結果集以及返回值。 可以出于任何使用 SQL 語句的目的來使用存儲過程,它具有以下優點:可以在單個存儲過程中執行一系列 SQL 語句。 可以從自己的存儲過程內引用其它存儲過程,這可以簡化一系列復雜語句。 存儲過程在創建時即在服務器上進行編譯,所以執行起來比單個 SQL 語句快。 用戶定義函數函數是由一個或多個 Transact-SQL 語句組成的子程序,可用于封裝代碼以便重新使用。 Microsoft? SQL Server? 2000 并不將用戶限制在定義為 Transact-SQL 語言一部分的內置函數上,而是允許用戶創建自己的用戶定義函數。 可使用 CREATE FUNCTION 語句創建、使用 ALTER FUNCTION 語句修改、以及使用 DROP FUNCTION 語句除去用戶定義函數。 每個完全合法的用戶定義函數名 (database___name) 必須唯一。 必須被授予 CREATE FUNCTION 權限才能創建、修改或除去用戶定義函數。 不是所有者的用戶在 Transact-SQL 語句中使用某個函數之前,必須先給此用戶授予該函數的適當權限。 若要創建或更改在 CHECK 約束、DEFAULT 子句或計算列定義中引用用戶定義函數的表,還必須具有函數的 REFERENCES 權限。 函數中的有效語句類型包括:DECLARE 語句,該語句可用于定義函數局部的數據變量和游標。 為函數局部對象賦值,如使用 SET 給標量和表局部變量賦值。 游標操作,該操作引用在函數中聲明、打開、關閉和釋放的局部游標。 不允許使用 FETCH 語句將數據返回到客戶端。 僅允許使用 FETCH 語句通過 INTO 子句給局部變量賦值。 控制流語句。 SELECT 語句,該語句包含帶有表達式的選擇列表,其中的表達式將值賦予函數的局部變量。 INSERT、UPDATE 和 DELETE 語句,這些語句修改函數的局部 table 變量。 EXECUTE 語句,該語句調用擴展存儲過程。 在查詢中指定的函數的實際執行次數在優化器生成的執行計劃間可能不同。 示例為 WHERE 子句中的子查詢喚醒調用的函數。 子查詢及其函數執行的次數會因優化器選擇的訪問路徑而異
子程序包括存儲過程、自定義函數、游標、觸發器。 可以被編譯和存儲在數據庫中,它具有模塊化、重用性、可維護性、可擴展性、安全性等特點。 其目的是完成特定的功能,能被程序和客戶端工具直接調用。 子程序也屬于數據庫對象,可以被授權能否執行。
存儲過程存儲過程是一種存儲復雜程序,方便外部程序調用的數據庫對象。 是為了完成某個特定功能的 SQL 語句集合,用戶可以通過存儲過程的名字和參數進行調用。 MySQL 從 5.0 版本開始支持存儲過程(Stored Procedure)。
創建和刪除存儲過程創建存儲過程,其關鍵語法如下:
CREATE PROCEDURE 存儲過程名([IN|OUT|INOUT] 參數名 數據類型)BEGIN……END對存儲過程進行參數定義時,多個參數用?,?分割,共有三種參數類型:IN,OUT,INOUT:
IN: 參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不會影響調用環境的數據值;
OUT: 該值可在存儲過程內部被改變,同時引起調用環境中數據值的改變;(有out需要 @變量 接收)
INOUT: 調用時指定,兼具?IN?和?OUT?類型參數的特點。
以?BEGIN?和?END?對過程體的開始和結束進行標識。
需要強調一點,MySQL 中存儲過程默認以?;?作為結束符,如果不改變結束符,編譯器會把存儲過程當成 SQL 語句進行處理,因此編譯過程會報錯。 所以要事先用?DELIMITER //?聲明當前的分隔符,其目的是讓編譯器把兩個?//?之間的內容當作一個存儲過程,使用?DELIMITER ;?則恢復結束符為?;?。
刪除存儲過程使用?DROP PROCEDURE?語句,其語法如下:
DROP PROCEDURE 存儲過程名;函數自定義函數是一種對 MySQL 的擴展,其用法和內置函數相同。 在前面文章,我們使用的函數是 MySQL 內置函數(已經寫好的),直接調用即可完成某個特定功能,下面將會介紹 MySQL 自定義函數。
創建和刪除自定義函數創建自定義函數使用?CREATE FUNCTION?語句,語法如下:
CREATE FUNCTION 函數名([變量名1 變量類型1, ……, 變量名n 變量類型n]) RETURNS 數據類型BEGINsql語句;RETURN 值;END;MySQL 安裝完成后默認不允許創建自定義函數,需要在??配置文件中增加?log-bin-trust-FUNCTION-creators=1,然后重啟數據庫,使其具有創建函數的權限。 也可以在 MySQL 命令行中輸入以下命令來解決。 ?SET GLOBAL log_bin_trust_function_creators = 1;。
刪除自定義函數使用?DROP FUNCTION?語句,其語法如下:
DROP FUNCTION 函數名;需要注意,刪除自定義函數時,函數名后面不能加括號
游標游標(CURSOR)是一個存儲在 MySQL 服務器上面的數據庫查詢機制,類似于數組的下標。 使用游標后,可以逐步提取查詢結果。
使用游標需要注意以下幾點:
聲明游標之后,必須先打開游標才能使用;
在游標結束之后,要關閉游標。
其使用的基本步驟如下:
聲明游標,其語法如下;
declare 游標名 cursor for select_statement打開游標
open 游標名從游標中取值,使用 fetch 進行取值,語法如下:
fetch 游標名 into var1,var2,……利用fetch將取到的一條記錄中的字段賦值給多個變量。
關閉游標
close 游標名觸發器(TRIGGER)是一種特殊的存儲過程,它在插入、修改或刪除表中的數據時觸發執行,擁有更精細、更復雜的數據控制能力。 MySQL 從 5.0 版本開始支持觸發器。
舉個例子,現有用戶表和日志表。 當一個用戶被創建時,我們用日志來記錄用戶的創建過程。 如果不使用觸發器,則需要手動編寫程序來實現;而一旦使用觸發器,我們可以在信息插入用戶表后,立刻觸發對日志表的操作,使其記錄創建用戶的信息。
創建和刪除觸發器創建觸發器的語法如下:
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW trigger_statement;參數解釋:
trigger_name:觸發器名稱,自己定義;
trigger_time:觸發時機,只有兩個值,before(某事件之前),after(某事件之后);
trigger_event:觸發事件,取值 INSERT(插入)、UPDATE(更新)、DELETE(刪除);
table_name:需要建立觸發器的表名;
trigger_statement:觸發器程序體,一條 SQL 語句或存儲過程等;
查看觸發器使用?SHOW TRIGGERS;?命令查看所有觸發器,因為觸發器有自己的保存機制,顯示出來的信息量比較大
刪除觸發器使用的語法如下:
DROP TRIGGER 觸發器名;視圖視圖是從一個或多個表中糅合出來的虛擬表。 一個視圖并不包含真實的數據,它提供了另一個視角去查看或改變表中的數據。
打個比喻:把視圖想象成一扇窗戶,通過窗戶往里看,我們只能看到一部分,而這部分就是數據庫系統允許你看到的數據。 而不允許你看到的內容會被遮擋住,讓你不可見。
使用視圖可以提高我們對數據的操作效率,同時增加安全性:
提高效率:將經常使用復雜查詢定義為視圖,由于對視圖的權限、語法解析都會被存儲,就避免了重復解析;
增加數據安全性:通過視圖,用戶只能查詢和更改指定的數據;
總之,使用視圖的主要作用就是保障數據的安全性,同時提高查詢效率。
創建視圖創建視圖使用的語句是?CREATE View,完整語法看上去比較復雜,大家可以到官網上去查看。
DROP PROCEDURE 存儲過程名;0查詢視圖視圖是一種虛擬的表,也符合 DQL 操作,視圖的查詢和表的查詢相同,查看 city_VIEW 視圖中的所有數據,其 SQL 語句如下:
DROP PROCEDURE 存儲過程名;1刪除視圖使用?DELETE FROM?子句可以刪除視圖,其語法如下:
DROP PROCEDURE 存儲過程名;2更新視圖數據把 id 為 2 的城市人口更新為 。其 SQL 語句如下:
DROP PROCEDURE 存儲過程名;3查看視圖和基表,結果如下:
DROP PROCEDURE 存儲過程名;4查看基表數據如下:
DROP PROCEDURE 存儲過程名;5插入視圖數據給視圖插入數據和表插入數據一樣,使用?INSERT INTO?語句,我們在視圖中插入一條 id 為 4080,名字為?test?,人口數量為 500 的記錄,其 SQL 語句如下:
DROP PROCEDURE 存儲過程名;6序列前面我們在介紹主鍵的時候知道,主鍵必須是唯一的。 為了方便管理主鍵同時滿足主鍵唯一性要求,我們把主鍵設置為自增長。 實現自增長需要用到序列。
序列就是一組有特定變化規律的整數,其最主要的用途就是創建主鍵,確保主鍵的唯一性。 序列是一個數據庫對象,獨立于表進行存儲,可以為多個表使用。
目前 MySQL 是不支持類似建表或視圖的方式來直接創建序列對象(Oracle 支持)。 雖然有?auto_increment?來實現自增長,但不能設置步長、起始值、是否循環等。 最重要的是,在 MySQL 中一張表只能有一個字段設置為自增長,如果我們需要兩個或以上的字段實現自增長該怎么辦呢? 需要做一些間接處理。
新建表時設置起始值下面我們在 demo 數據庫下新創建一個表 demo2:
DROP PROCEDURE 存儲過程名;7插入新的值:
DROP PROCEDURE 存儲過程名;8可以看到起始值為 1000。
創建表后設置起始值修改 demo2 表的起始值為 1500:
DROP PROCEDURE 存儲過程名;9這時如果再插入新值:
CREATE FUNCTION 函數名([變量名1 變量類型1, ……, 變量名n 變量類型n]) RETURNS 數據類型BEGINsql語句;RETURN 值;END;0可以看到新的 id 起始值已經變為 1500 了 使用?AUTO_INCREMENT?屬性時我們需要注意:
每一個表中只能有一個?AUTO_INCREMENT?列
同時該列必須要有?NOT NULL?屬性來進行約束,在 MySQL 中會自動將?NOT NULL?約束隱式添加到列中。
AUTO_INCREMENT?列必需建立索引,可以為?PRIMARY KEY?或?UNIQUE?索引。
AUTO_INCREMENT?列具有以下屬性:
默認起始值為 1,當在該列中插入?NULL?值或是在?INSERT?語句中忽略該值時,它的起始值將會自增 1。
如果使用?DELETE?語句刪除最后插入的行,則 MySQL 可能會也可能不會重復使用刪除的序列號,具體取決于表的存儲引擎。 如 MySQL 默認的?InnoDB?就不會重用序列號。
如果使用?UPDATE?語句將?AUTO_INCREMENT?列中的值更新為已經存在的值,且該列具有唯一索引,則 MySQL 將發出重復鍵錯誤。
獲得最后生成的序列號可以使用?LAST_INSERT_ID()?函數。
索引所有數據操作可簡單分為讀操作(獲取數據)和寫操作(插入數據、修改數據、刪除數據)。 一般情況下,讀寫比例在 10:1 左右,大量的讀操作給數據庫性能帶來不小的考驗。 因此,對查詢語句的優化是重中之重,優化的關鍵就是利用好索引。
索引在 MySQL 中又叫作?鍵?,英文名?key?,是存儲引擎用于快速找到記錄的一種數據結構。 索引對于性能的提升非常關鍵,尤其是當表中的數據量越來越龐大的時候。 我們前面介紹約束使用到的?primary key?,其實就是一種索引,叫做主鍵索引。
舉個簡單的例子:我們把數據庫比作漢語字典,那么索引就是這本字典的音序表,通過音序表可以快速查找到需要的漢字。 索引的目的就是為了提高查詢效率。 在 MySQL 中常用的索引可以分為三類,分別是:普通索引、唯一索引、聯合索引。
普通索引普通索引使用關鍵字 INDEX 定義,根據建立索引的時機不同,書寫方式有細微差別。分為以下 3 種情況:
創建表的時候創建索引;
創建表后創建索引;
修改表的時候添加索引。
唯一索引唯一索引不僅加速查找,還具有約束性。
主鍵索引?primary key
唯一鍵索引?unique
聯合索引聯合索引即為索引同時設置多個字段。
primary key(id,name),聯合主鍵索引
index(id,name),聯合普通索引 在建表的時候創建索引。其語法如下:
CREATE FUNCTION 函數名([變量名1 變量類型1, ……, 變量名n 變量類型n]) RETURNS 數據類型BEGINsql語句;RETURN 值;END;1給已經存在的表中某字段添加索引,其語法如下:
CREATE FUNCTION 函數名([變量名1 變量類型1, ……, 變量名n 變量類型n]) RETURNS 數據類型BEGINsql語句;RETURN 值;END;2修改表時創建索引,其語法如下:
ALTER TABLE 表名 ADD CREATE FUNCTION 函數名([變量名1 變量類型1, ……, 變量名n 變量類型n]) RETURNS 數據類型BEGINsql語句;RETURN 值;END;1查看索引,借助表信息查看表中是否存在索引,其語法如下:
CREATE FUNCTION 函數名([變量名1 變量類型1, ……, 變量名n 變量類型n]) RETURNS 數據類型BEGINsql語句;RETURN 值;END;4查看 teacher 表中的索引,其 SQL 語句如下:
CREATE FUNCTION 函數名([變量名1 變量類型1, ……, 變量名n 變量類型n]) RETURNS 數據類型BEGINsql語句;RETURN 值;END;5刪除索引,使用的關鍵字是DROP INDEX … on …,其語法如下:
CREATE FUNCTION 函數名([變量名1 變量類型1, ……, 變量名n 變量類型n]) RETURNS 數據類型BEGINsql語句;RETURN 值;END;6原文:內容聲明:
1、本站收錄的內容來源于大數據收集,版權歸原網站所有!
2、本站收錄的內容若侵害到您的利益,請聯系我們進行刪除處理!
3、本站不接受違法信息,如您發現違法內容,請聯系我們進行舉報處理!
4、本文地址:http://m.sycxjdsbhs.com/article/fd8cb9de11c600cf3fb7.html,復制請保留版權鏈接!
簡介異常處理是編程中處理和管理意外錯誤的關鍵,在JavaScript中,可以使用try,catch塊來捕獲和處理異常,Try,Catch塊try,catch塊是一個代碼塊,用于捕獲和處理異常,它的語法如下,javascripttry,要嘗試運行的代碼,catch,e,如果出現異常,則處理異常的代碼,try塊包含要嘗試運行的代...。
本站公告 2024-09-27 17:01:20
簡介Netlib,網絡庫,是一個在線資源,提供經過同行評審的數學軟件、文檔和數據集,它是由田納西大學在1980年代創建的,旨在為數學家和使用數學解決問題的研究人員提供一個協作平臺,目標Netlib的主要目標是,為數學家提供一個分享和訪問軟件的平臺為研究人員提供訪問和使用數學解決問題的工具促進數學研究與應用之間的協作內容Netlib提供...。
最新資訊 2024-09-26 18:36:17
Library.nu是一個免費電子書庫,提供廣泛的書籍選擇,包括小說、非小說、教科書等,Library.nu的優勢免費,所有書籍均可免費下載,廣泛的選擇,Library.nu擁有超過700萬本電子書,涵蓋多種類別,多種格式,書籍提供多種格式,包括EPUB、MOBI、PDF和其他格式,易于使用,Library.nu的界面簡單易用,方便您...。
本站公告 2024-09-26 15:50:38
簡介NumPy和Pandas是用于Python數據操作和分析的兩個強大的庫,NumPy擅長處理多維數組,而Pandas則擅長處理表格數據,數據框,結合使用,您可以高效地操縱和分析大型數據集,NumPyNumPy是一個用于科學計算的Python庫,它提供了高效的多維數組操作,線性代數和隨機數生成等功能,導入NumPy```python...。
技術教程 2024-09-24 21:59:37
歡迎來到免費資源寶庫!我們整理了以下網站,提供您各種領域的免費學習資源,助您邁向成功之路,線上課程Coursera,與頂尖大學合作,提供互動式線上課程,edX,由哈佛大學等名校創立,提供線上學位、學分課程和微課程,Udacity,專注於技術技能培訓,提供程式設計、資料科學等領域的課程,可汗學院,非營利組織,提供數學、科學、歷史等科目的...。
技術教程 2024-09-23 22:38:11
自定義報告生成工具為您提供了一個直觀的報告設計器,使您能夠輕松地定制報告布局、格式和內容,以滿足您的特定業務需求,自定義報告的好處提高報告準確性和相關性節省時間和精力,因為無需手動創建報告加強決策制定,因為報告提供定制的見解改善溝通和協作,因為報告可以輕松共享自定義報告設計器自定義報告設計器是一個用戶友好的界面,使您能夠毫不費力地創建...。
技術教程 2024-09-14 17:42:58
能需要幾分鐘到半小時,更新過程中我的數據會受到影響嗎,否,您的數據在更新期間不會受到影響,我可以在更新后取消更改嗎,通常情況下,在更新后無法取消更改,建議在提交更改之前仔細考慮,如果更新出現問題怎么辦,如果您在更新過程中遇到問題,請聯系您的設備制造商或技術支持團隊,結論提交更改以解鎖改進和更新的無縫體驗,通過提升性能、增強安全性和優化...。
最新資訊 2024-09-14 07:01:58
Java虛擬機,JVM,是Java應用程序運行時執行代碼的虛擬環境,它是Java編程語言的關鍵組件,允許Java代碼在不同的操作系統和硬件平臺上運行,下載JVM的步驟下載JVM的過程通常包括以下幾個步驟,1.確定您的操作系統和架構在下載JVM之前,您需要確定您的操作系統和架構,JVM有適用于不同操作系統和架構的版本,包括Windows...。
最新資訊 2024-09-12 03:43:02
Java的遞歸函數是一種強大的工具,可以通過不斷調用自身來解決復雜問題,如果設計不當,遞歸函數可能會導致堆棧溢出或效率低下,避免堆棧溢出堆棧溢出發生在函數調用的數量超過Java虛擬機,JVM,為每個線程分配的堆棧空間時,這通常是由無限遞歸或遞歸深度過大引起的,解決堆棧溢出的方法增加堆棧大小,可以通過使用,Xss命令行選項增加Java程...。
互聯網資訊 2024-09-12 02:59:57
PHP建站系統是一個用于創建和管理網站的強大工具,它提供了許多開箱即用的功能,可以幫助您提高開發效率,這些功能包括,內容管理,PHP建站系統提供了用于管理網站內容的強大工具,您可以輕松地添加、編輯和刪除頁面和帖子,用戶管理,PHP建站系統還提供了用于管理網站用戶的強大工具,您可以輕松地創建和管理用戶帳戶,并分配權限,模板引擎,PHP建...。
本站公告 2024-09-12 02:20:44
PHP是什么,PHP是一種廣泛使用的服務器端編程語言,用于開發動態網站和應用程序,它以其易用性、強大的功能和廣泛的社區支持而聞名,下載PHP官方網站從PHP官方網站下載PHP是最安全、最可靠的方法,訪問PHP官方網站,單擊,下載,菜單,選擇與您的操作系統和架構,32位或64位,相對應的版本,單擊,下載,按鈕,包管理器如果您的操作系統支...。
最新資訊 2024-09-07 22:23:31
JavaScript是當今網絡開發中最流行的編程語言之一,它是一種功能強大的語言,可用于為您的網站和應用程序創建交互式和響應式體驗,如果您有興趣提高您對JavaScript的技能,那么學習使用特效是一個很好的方法,特效可以幫助您創建直觀且引人入勝的界面,從而提升您的用戶體驗,有很多不同的JavaScript特效可供使用,一些最流行的包...。
最新資訊 2024-09-05 11:19:55