圖解面試題:SQL儲存過程有什麼用?
面試中有時候會問:儲存過程有什麼用?看了今天的知識,你就知道如何回答了。
1.儲存過程是什麼?
假如你每天要開車完成一些列重複的操作:車鑰匙啟動車,倒車。現在出現了一款新車,可以自動的完成這些重複的工作。每次你上車以後,車就自動幫助你倒出來了。
同樣的,在工作裡也會經常遇到重複性的工作,這時候就可以把常用的SQL寫好儲存起來,這就是儲存過程。
這樣下次遇到同樣的問題,直接使用儲存過程就可以了,就不需要再重新寫一遍SQL了,這就極大的提高了工作效率。
2.如何使用儲存過程?
使用儲存過程需要:1)先定義儲存過程 2)使用已經定義好的儲存過程。
(1)無引數的儲存過程
定義儲存過程的語法形式:
create procedure 儲存過程名稱() begin <sql語句> ; end;
語法裡的begin...end用於表示sql語句的開始和結束。語法裡面的<sql語句>就是重複使用的sql語句。下面通過一個例子看下如何使用。例如查出“學生表”裡的學生姓名。
sql語句是:
select 姓名 from 學生表;
把這個sql語句放入儲存過程的語法裡,並給這個儲存過程起個名字叫做就a_stuent1:
create procedure a_stuent1() begin select 姓名 from 學生表; end;
在navicat裡允許以後,建立的儲存過程就會在下圖的地方:
下次使用儲存過程的用下面sql語句就可以,就不需要重新寫一遍sql了。
call 儲存過程名稱();
(2)有引數的儲存過程
前面的儲存過程名稱後面是(),括號裡面沒有引數。當括號裡面有引數時,就是下面的語法:
create procedure 儲存過程名稱(引數1,引數2,...) begin <sql語句> ; end;
通過一個案例看下,現在要在“學生表”裡查找出指定學號的學生姓名。如果指定學號是0001,那麼sql語句是:
select 姓名 from 學生表 where 學號='0001';
現在問題來了,一開始不知道指定學號是哪一個,只有使用的時候才知道業務需求。比如今天要查詢學號0001,明天要查詢學號002。這時候就需要用到引數,來靈活應對這種情況。把sql語句放入儲存過程語法裡就是:
create procedure getNum(num varchar(100)) begin select 姓名 from 學生表 where 學號=num; end;
其中getNum是儲存過程的名稱,後面括號裡面的num varchar(100)是引數,引數由2部分組成:引數名稱是num;引數型別是是varchar(100),這裡表示是字串型別。
儲存過程裡面的sql語句(where 學號=num)使用了這個引數num。這樣在使用儲存過程的時候,給定引數的值就可以靈活的按業務需求來查詢了。
比如現在要查詢學號=0001的學生姓名,那麼就在使用儲存過程的引數中給出學號的值,也就是下面括號裡的0001:
call getNum(0001);
3)預設引數的儲存過程
前面的儲存過程名稱後面是(引數1,引數2),括號裡面只包含引數的型別和名字,方便呼叫。
儲存過程還一種情況是有預設引數,是下面的語法。
in 輸入引數:引數初始值在儲存過程前被指定為預設值,在儲存過程中修改該引數的值不能被返回。
out輸出引數:引數初始值為空,該值可在儲存過程內部被改變,並可返回
inout輸入輸出引數:引數初始值在儲存過程前被指定為預設值,並且可在儲存過程中被改變和在呼叫完畢後可被返回
3.有哪些注意事項
1)定義儲存過程語法裡的SQL語句程式碼塊必須是完整的sql語句,必須用“;”結尾
create procedure 儲存過程名稱(引數1,引數2,...) begin <sql語句> ; end;
2)定義不同的儲存過程,要使用不同的儲存過程名稱,相同的儲存過程的名字會引起系統報錯。
4.儲存過程有什麼用?
如果業務比較複雜、重複性工作比較多,儲存過程會比較實用。
把重複要做的事情整理成一步一步的業務步驟,然後把業務步驟寫成sql語句,然後再把sql語句寫到儲存過程的語法裡。就像自動駕駛一樣,把可能遇到的狀況提前規劃好,就不需要自己操縱方向盤,車子就按照我們寫的步驟向前開了。
推薦:如何從零學會sql?