函數、視圖及存儲過程的對比
函數
- 一個函數一般隻實作單一的某個功能的;
- 函數隻能傳回一個變量;
- 函數不能調用存儲過程,但是存儲過程可以調用函數。
建立函數的範例:
--#### 自定義字元串分割函數 #####delimiter $$DROP FUNCTION IF EXISTS statisSplit;CREATE FUNCTION statisSplit(x varchar(255), delim varchar(12), pos INT) RETURNS varchar(255)BEGINRETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos), LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1), delim, '');END$$
視圖
視圖(view)是一種有結構(有行有列)但是沒有結果(結構中不真實存放資料)的虛拟表,虛拟表的結構來源不是自己定義,而是從對應的基表中産生的(視圖的資料來源).
簡單的說,視圖就是将select語句提前存儲在資料庫中友善使用。視圖有以下特點:
- 視圖可以節省SQL語句,減少複雜SQL語句的解析時間;
- 視圖建立的時候不能傳入動态參數,但是視圖是一個虛拟表,調用的時候可以像查表一樣輸入參數;
- 視圖隻能使用select查詢,不能進行更新操作。
視圖建立範例:
create view my_search as (select t2.id as group_id,t2.title as group_title,t1.id as page_id,t1.title as page_title from tb_view_menu_page t1 left join tb_view_menu_group t2 on t1.group_id = t2.id);select * from my_search where page_id = 3;
存儲過程
存儲過程是三者當中最複雜的,
- 存儲過程可以有多個輸入輸出變量;
- 存儲過程可以進行select、insert、update以及create table等操作;
- 存儲過程内部可以調用函數;
- 存儲過程可以使用遊标進行周遊操作。
建立存儲過程的基本文法:
存儲過程的應用場景
依照我個人的了解,存儲過程适用于複雜的資料庫操作場景,當操作包含查詢以及多個更新操作的時候。如果你使用代碼方式來實作這些操作,由于需要建立多次資料庫連接配接,會導緻操作耗時過長,這個時候存儲過程就比較有用了,隻需建立一次資料庫連接配接就能完成操作。比如,像我使用mysql資料做統計彙總的需求就需要使用存儲過程來實作。