MySQL变量,存储过程,函数,流程控制详解(小白都能懂哦)
1.系統變量
2.自定義變量
3.存儲過程
4.函數
5.流程控制結構
1.系統變量
1.1系統變量的分類
系統變量:分為全局變量和會話變量
1.2系統變量的介紹
系統變量由系統提供,不是用戶定義,屬于服務器層面
1.3系統變量的相關操作
(1).查看所有的系統變量
show global(session) variables
global表示查看全局變量
session表示會話變量
(2)查看滿足條件的部分系統變量
show global(session) variables like “...”
(3)查看指定某個系統變量的值
select @@global(@@session).變量名
(4)為某一個系統變量賦值
set global(session) 系統變量名=值
或者:
set @@global(session).系統變量=值
以上的各種指令可以不加global和session默認為session
2.自定義變量
2.1自定義變量的分類
用戶變量和局部變量
2.2自定義變量的介紹
變量是用戶自定義,不是由系統提供
用戶變量:針對當前會話游有效,能聲明初始化,賦值使用
局部變量:僅僅在定義它的begin end中有效,應用在begin,end中的第一句話
2.3自定義變量的相關操作
1.用戶變量的聲明并初始化的五種方式
set @用戶變量名=值;
set @用戶變量名:=值;
select @用戶變量名:=值;
select @用戶變量名:=值;
select 字段 into @變量名 from 表
2.用戶變量的賦值
set @變量名=值;
不需要指定類型在賦值的時候自動匹配類型
3.用戶變量求和案例
set @m=1;
set @n=2;
set @sum=@m+@n;
select @sum;
4.局部變量的聲明和聲明初始化
declare 變量名 類型;
declare 變量名 類型 default 值;
5.局部變量的賦值
set 局部變量名=值;
set 局部變量名:=值;
select @局部變量名:=值;
select 字段 into @局部變量名 from 表
6.局部變量的求和例子:
declare m int default 1;
declare n int default 2;
set sum=m+n;
select sum;
當然由于不在begin end中所以運行會報錯但是語法沒問題
2.4用戶變量和局部變量的區別
二者不同在于用戶變量作用域在當前會話,定義使用在會話中的任何一個位置,語法上必須加@符號,不用限定類型 局部變量作用域在begin,end中只能在這里邊使用并且為第一句話,有時候在定義時不需要加@,需要限定類型
3.存儲過程
3.1存儲過程概念
存儲過程是一個預編譯的SQL語句,優點是允許模塊化的設計,就是說只需要創建一次,以后在該程序中就可以調用多次。如果某次操作需要執行多次SQL,使用存儲過程比單純SQL語句執行要快。有點類似java里邊的方法
3.2存儲過程的好處:
1.提高代碼重用性
2.簡化操作
3.減少編譯次數并且減少和數據庫服務器的連接次數,提高效率
這里的減少編譯次數指當我們第一次調用時系統會進行編譯,第二次再調用的時候用第一遍編譯好的代碼 關于減少連接服務器次數。一般都是一條sql語句會和服務器有一次聯系,存儲過程中有多條sql語句在一起只與服務器建立一次聯系,存儲過程里邊的sql語句是不能修改的
3.3存儲過程使用流程
1.創建存儲過程
create + procedure + 存儲過程名(參數列表)
+ begin
+ end
2.存儲過程的參數列表;
每個參數包含三部分:參數模式 參數名 參數類型,存儲模式可以有多個參數
3.參數模式(等下例子詳講)
in:參數可以作為輸入
out:參數作為輸出
inout:既可以作為輸入又可以作為輸出
4.調用語法:
call+存儲過程名(實參列表)
5.設置存儲過程的結束標記語法:
delimiter+結束標記
6.使用存儲過程注意點
1.存儲過程必須設置結束標記
2.如果存儲過程只有一句話那么begin,end可以省略
3.存儲過程中每條獨立的sql語句都要有分號
7.例子詳解
博主之后的例子都會用到這個表
例子1(空參存儲過程):在student表中加入兩個新的同學
運行完畢后,表中數據如圖:
例子2(帶in模式的存儲過程):在student表中查找大白和小白兩個新同學的信息,并且修改小白同學的性別為人妖
delimiter $ create procedure my2(in name1 varchar(4),in name2 varchar(4)) begin select * from student where sname=name1 or sname=name2;update student set ssex="人妖" where sname=name1; end $call my2("小白","大白") ;例子3(帶out模式的存儲過程):我們查找小白同學的性別并且返回出來
delimiter $ create procedure my3(out sexx varchar(4)) begin select ssex into sexx from student where sname="小白"; end $ call my3(@ssex);ssex和sexx相當于值傳遞
ssex into sexx:相當于把查詢的結果賦值給這個可以輸出的局部變量
inout就是傳入和傳出都用這一個inout定義的參數
如果我們不在變量的前面添加參數的模式
3.3刪除和查看存儲過程
1.刪除存儲過程
drop procedure+存儲過程名
注意:這里只能單獨刪除
2.查看存儲過程
show create procedure +存儲過程名
3.3存儲過程的優缺點
優點
1)存儲過程是預編譯過的,執行效率高。
2)存儲過程的代碼直接存放于數據庫中,通過存儲過程名直接調用,減少網絡通訊。
3)安全性高,執行存儲過程需要有一定權限的用戶。
4)存儲過程可以重復使用,減少數據庫開發人員的工作量。
缺點
1)調試麻煩,但是用 PL/SQL Developer 調試很方便!彌補這個缺點。
2)移植問題,數據庫端代碼當然是與數據庫相關的。但是如果是做工程型項目,基本不存在移植問題。
3)重新編譯問題,因為后端代碼是運行前編譯的,如果帶有引用關系的對象發生改變時,受影響的存儲過程、包將需要重新編譯(不過也可以設置成運行時刻自動編譯)。
4)如果在一個程序系統中大量的使用存儲過程,到程序交付使用的時候隨著用戶需求的增加會導致數據結構的變化,接著就是系統的相關問題了,最后如果用戶想維護該系統可以說是很難很難、而且代價是空前的,維護起來更麻煩。
4.函數
4.1函數簡介
1.可以參照存儲過程,兩者概念一樣
2.函數在mysql中的好處和存儲過程類似
4.2函數的基礎語法(例子會和流程控制結構一起講):
1.創建函數:
create function 函數名(參數列表) returns 返回類型
begin
函數體
end
這里的每一個參數包含參數名和參數類型,函數體肯定有return語句
2.函數的調用
select 函數名(參數列表)
參數列表是先參數名再參數類型
3.查看函數
show create function +函數名
4.刪除函數
drop function+函數名
4.3函數和存儲過程的區別:
1.存儲過程可以有0或多個返回(就是out類型的數據),適合批量的插入和更新
2.有且僅有一個返回值,適合做處理數據后返回一個結果
5.流程控制結構
5.1流程控制結構分類
順序結構,分支結構,循環結構
5.2分支結構
1.if結構:
if 條件1 then 語句1 elseif 條件2 then 語句2 … else 語句n end if;應用范圍:begin end中
例子:
delimiter // CREATE FUNCTION a1(score int) RETURNS char BEGINIF score>=90 AND score<=100 THEN return 'A';ELSEIF score>=80 THEN return 'B';ELSEIF score>=60 THEN RETURN 'C';ELSE RETURN 'D';END IF; END // SELECT a1(88)if函數
if(表達式1,表達式2,表達式3) 執行順序:如果表達式1成立則返回表達式2的值,否則返回表達式3的值例子:
select if (1=2,1, 2)運行結果:
2.case結構:
語法:
case結構:作為獨立的語句
case結構:作為表達式
兩種case結構作為表達式使用,可以嵌套在其他語句種使用,可以放在任何地方,begin end里邊或外邊
作為獨立的語句使用只能放在begin end里
例子(作為獨立的語句):
5.3循環結構
1.while循環
【標簽】while+循環條件 do 循環體 end while+【標簽】想用循環控制就要用標簽
當然也可以不用標簽:
例子:
我們用標簽:
delimiter // CREATE PROCEDURE a8(in score int) BEGINDECLARE i int DEFAULT 40;a:WHILE i<=score DOIF i=50 or i=60 THEN INSERT into sanguo VALUES(i,"趙云","女");end if;SET i=i+1;END WHILE a; end // call a8(70) //2.loop循環
【標簽】loop 循環體 end loop 【標簽】3.repeat循環
【標簽】repeat 循環體 until 結束循環條件 end repeat 【標簽】總結
以上是生活随笔為你收集整理的MySQL变量,存储过程,函数,流程控制详解(小白都能懂哦)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL事物(详解并发问题和隔离级别)
- 下一篇: MySQL三大范式详解(小白也能懂哦)