SQL存储过程和函数区别(超级简单,人人都可以看懂)
什么是存儲過程
如果你接觸過其他的編程語言,那么就好理解了,存儲過程就像是方法一樣。
竟然他是方法那么他就有類似的方法名,方法要傳遞的變量和返回結果,所以存儲過程有存儲過程名有存儲過程參數也有返回值。
存儲過程的優點:
存儲過程的能力大大增強了SQL語言的功能和靈活性。
1.可保證數據的安全性和完整性。
2.通過存儲過程可以使沒有權限的用戶在控制之下間接地存取數據庫,從而保證數據的安全。
3.通過存儲過程可以使相關的動作在一起發生,從而可以維護數據庫的完整性。
4.在運行存儲過程前,數據庫已對其進行了語法和句法分析,并給出了優化執行方案。這種已經編譯好的過程。
5.可極大地改善SQL語句的性能。
6.可以降低網絡的通信量。
7.使體現企業規則的運算程序放入數據庫服務器中,以便 集中控制。
存儲過程可以分為系統存儲過程、擴展存儲過程和用戶自定義的存儲過程
系統存儲過程
我們先來看一下系統存儲過程,系統存儲過程由系統定義,主要存放在MASTER數據庫中,名稱以"SP"開頭或以"XP"開頭。盡管這些系統存儲過程在MASTER數據庫中
但我們在其他數據庫還是可以調用系統存儲過程。有一些系統存儲過程會在創建新的數據庫的時候被自動創建在當前數據庫中。
常用系統存儲過程有:
代碼如下:
exec sp_databases; --查看數據庫
exec sp_tables; --查看表
exec sp_columns student;–查看列
exec sp_helpIndex student;–查看索引
exec sp_helpConstraint student;–約束
exec sp_helptext ‘sp_stored_procedures’;–查看存儲過程創建定義的語句
exec sp_stored_procedures;
exec sp_rename student, stuInfo;–更改表名
exec sp_renamedb myTempDB, myDB;–更改數據庫名稱
exec sp_defaultdb ‘master’, ‘myDB’;–更改登錄名的默認數據庫
exec sp_helpdb;–數據庫幫助,查詢數據庫信息
exec sp_helpdb master;
exec sp_attach_db --附加數據庫
exec sp_detach_db --分離數據庫
存儲過程語法:
在創建一個存儲過程前,先來說一下存儲過程的命名,看到好幾篇講存儲過程的文章都喜歡在創建存儲過程的時候加一個前綴,養成在存儲過程名前加前綴的習慣很重要,雖然這只是一件很小的事情,但是往往小細節決定大成敗。看到有的人喜歡這樣加前綴,例如proc_名字。也看到這加樣前綴usp_名字。前一種proc是procedure的簡寫,后一種sup意思是user procedure。我比較喜歡第一種,那么下面所有的存儲過程名都以第一種來寫。至于名字的寫法采用駱駝命名法。
創建存儲過程的語法如下:
代碼如下:
CREATE PROC[EDURE] 存儲過程名@參數1 [數據類型]=[默認值] [OUTPUT]@參數2 [數據類型]=[默認值] [OUTPUT]ASSQL語句EXEC 過程名[參數]使用存儲過程實例:
1.不帶參數
代碼如下:
create procedure proc_select_officeinfo--(存儲過程名) as select Id,Name from Office_Info--(sql語句)exec proc_select_officeinfo--(調用存儲過程)2.帶輸入參數
代碼如下:
create procedure procedure_proc_GetoffinfoById --(存儲過程名) @Id int--(參數名 參數類型) as select Name from dbo.Office_Info where Id=@Id--(sql語句)exec procedure_proc_GetoffinfoById 2--(存儲過程名稱之后,空格加上參數,多個參數中間以逗號分隔)注:參數賦值是,第一個參數可以不寫參數名稱,后面傳入參數,需要明確傳入的是哪個參數名稱
DEMO1:
create proc proc_ta --不帶參數的存儲過程asbeginselect [Country],[IATACode] from [Test].[dbo].[Ta]endgoselect * from [Test].[dbo].[Ta]goexec proc_ta --查看存儲過程go
DEMO2:
函數
SQL Aggregate 函數
SQL Aggregate 函數計算從列中取得的值,返回一個單一的值。
有用的 Aggregate 函數:
AVG() - 返回平均值
SELECT AVG(column_name) FROM table_nameCOUNT() - 返回行數
SELECT COUNT(column_name) FROM table_name;FIRST() - 返回第一個記錄的值
SELECT FIRST(column_name) FROM table_name;LAST() - 返回最后一個記錄的值
SELECT LAST(column_name) FROM table_name;MAX() - 返回最大值
SELECT MAX(column_name) FROM table_name;MIN() - 返回最小值
SELECT MIN(column_name) FROM table_name;SUM() - 返回總和
SELECT SUM(column_name) FROM table_name;SQL Scalar 函數
SQL Scalar 函數基于輸入值,返回一個單一的值。
有用的 Scalar 函數:
UCASE() - 將某個字段轉換為大寫
SELECT UCASE(column_name) FROM table_name;LCASE() - 將某個字段轉換為小寫
SELECT LCASE(column_name) FROM table_name;MID() - 從某個文本字段提取字符,MySql 中使用
SELECT MID(column_name,start[,length]) FROM table_name;SubString(字段,1,end) - 從某個文本字段提取字符
SELECT SubString(column_name,1,end) FROM table_name;LEN() - 返回某個文本字段的長度
SELECT LEN(column_name) FROM table_name;ROUND() - 對某個數值字段進行指定小數位數的四舍五入
SELECT ROUND(column_name,decimals) FROM table_name;NOW() - 返回當前的系統日期和時間
SELECT NOW() FROM table_name;FORMAT() - 格式化某個字段的顯示方式
SELECT FORMAT(column_name,format) FROM table_name;區別
1.儲存過程可以有返回值也可以無返回值。函數必須有返回值。
2.存儲過程的實現比較復雜,而函數的實現比較有針對性。
3.儲存過程可以輸入輸出參數,而函數只可以輸入參數。
4.過程允許在其中選擇以及DML語句,而函數只可以在其中select語句。
5.可以在存儲過程中調用函數,不可以在函數中調用存儲過程。
總結
以上是生活随笔為你收集整理的SQL存储过程和函数区别(超级简单,人人都可以看懂)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 性能测试四十五:性能测试策略
- 下一篇: common lisp 学习第一天 初步