mysql 进阶到高级_mysql的高级进阶(一)
我們將我們的客戶端的編碼設置為utf8,客戶端和客戶端連接設為utf8,表設計為utf8,字段設置成utf8。
如果我們的客戶端是gbk的編碼,那我們就通知mysql服務器客戶端和客戶端連接是gbk的就行了。這樣也不會出現亂碼。
會話變量和全局變量
查看會話變量
show session variables [like ‘%關鍵字%‘]
查看字段的變量名稱select @@session.變量名稱。
指定會話變量的值 set @@session.變量名稱=值 也可以使用set 變量名稱=值
全局變量
全局變量一旦設置在所有的客戶端都有效。
查看全局變量
show global variables [like ‘%關鍵字%‘]
select @@global.變量名稱
指定全局變量的值 set global 變量名稱=值 set @@global.變量名稱=變量值。
用戶定義變量 set @變量名稱=值;比如set name=‘張三‘
存儲過程
存儲過程是為了完成特定功能的sql語句集,經過編譯后存儲在數據庫中,用戶通過指定存儲過程的名稱并給定參數來調用并執行他。有點類似于自定義函數。
優點:
1增強了sql語言的功能和流程性,我們可以完成復雜的判斷和運算
2存儲過程創建完成后,可以多次被調用。
3 存儲過程能實現較快的執行速度,如果一個操作包含大量的事務,那么存儲過程速度要快很多,因為存儲過程是預編譯的,首次運行mysql的優化器會對其進行優化,而批量處理事務每次都要進行編譯和優化,速度相對慢一些。
4 能減少網絡的流量,因為發送的數據少。
5 存儲過程相對來說安全。
存儲過程的存儲步驟
1 首先選中一個數據庫,存儲過程是放在某個數據庫下的。use 數據庫;
2 改變分割符,不要讓;作為執行結束的標記 使用:delimiter $$ 將$$作為sql語句執行的結束符。
3 創建一個存儲過程
create procedure 名稱()
begin
sql語句;
sql語句;
end
$$
4 恢復語句執行的分割符delimiter ;
5 執行存儲過程 call 名稱[(參數1,參數2,...)];
以上是存儲過程的基本用法,當然存儲過程是復雜的,接下來我們通過細節講解來學習存儲過程。
我們可以在存儲過程中定義局部變量,定義局部變量可以使用:
declare 變量名稱 類型(長度),比如:
create procedure 名稱()
begin
declare name varchar(20) default ‘‘;
select name;
end
$$
調用:call 名稱;
我們也能使用
create procedure 名稱()
begin
declare stu_no int;
set stu_no=10;
select stu_no;
end
$$;
調用: call 名稱;
我們在創建存儲過程時可以傳遞參數。
參數的類型:
IN:輸入參數,表示該參數的值必須在調用存儲過程之前指定,在存儲過程中修改的值不能被返回。
create procedure 名稱(IN number int)
begin
select number;
set number=number+1;
select number;
end
$$;
delimiter ;
set @number=3;
call 名稱(@number)
我們在重新查詢number的值
select @number 我們發現number的值還是3,并沒有發生什么改變,由此可見IN類型的參數在執行完存儲過程后他的值并不會發生任何變化,有點類似php的局部變量。
OUT:輸出參數,該值可以在存儲過程內部改變,并且可以返回,往往是用于獲取存儲過程里的參數值。
當我們傳進入一個變量值是存儲過程不認識,在重新賦值后就會有值了。
INOUT:輸入輸出參數,該值可以在調用時指定,并可修改和返回,是in和out的綜合使用。
mysql中流程控制語句之選擇語句
if分支
IF condition1 THEN
要執行的語句;
ELSEIF condition2 THEN
要執行的語句;
ELSE
要執行的語句;
ENDIF
和存儲過程結合
create procedure showage(in age int)
begin
if age>18 then
select "成年人";
else
select "未成年人";
end if;
end
$$
set @age=19;
call showage(@age);
case分支
CASE case_value
WHEN when_value THEN
要執行的語句;
[WHEN when_value THEN 要執行的語句]
[ELSE 要執行的語句]
END CASE
其中case_value參數表示條件判斷變量,when_value 表示變量取值。
create procedure addsalary(IN emno int)
begin
declare add int;
case emno
when 1001 then
set add=100;
when 1002 then
set add=200;
when 1003 then
set add=300;
else
set add=500;
end case;
update salary set money=money+add where emno=emno;
end;
$$
存儲過程的使用。
set @emno=1002;
call addsalary(emno);
我們也可以把控制流程寫到sql語句中
ifnull函數的使用,ifnull(exp1,exp2) 如果exp1為空值,那么返回的結果是exp2,如果exp1不為空,返回的結果就是exp1。
mysql中流程控制語句之循環語句
while語句
create procedure addnum()
begin
declare i int default 1;
declare sum int default 0;
while i < 100 do
set sum=sum+i;
set i=i+1;
end while
select sum;
end;
$$;
調用:call addnum
repeat .....until
create procedure updateGender()
begin
declare imin int default 1;
declare imax int default 1;
select min(emp_no) into imin from employees;
select max(emp_no) into imax from employees;
repeat
if imin % 2=0 then
update employees set gender=‘F‘ where emp_no=imin;
end if;
set imin=imin+1;
until imin >imax;
end repeat;
end;
$$
loop....end loop
create procedure updateHire()
begin
declare imin int default 1;
declare imax int default 1;
select min(emp_no) into imin from employees;
select max(emp_no) into imax from employees;
myloop:loop
if imin % 2=0 then
update employees set hire_date=‘1999-12-11‘ where emp_no=imin;
end if;
set imin=imin+1;
if imin > imax then
leave myloop;
end if;
end loop;
end;
$$
mysql中存儲過程中捕獲錯誤和處理
如果這樣寫存儲過程,會報錯。我們可以捕獲這個錯誤。
存儲過程的管理
show procedure status where db="庫名";顯示我們的數據庫下有那些存儲過程。
查看數據庫下存儲過程的列表
use 數據庫
select specific_name from mysql.proc;
查看存儲過程的創建過程
show create procedure 名稱
select specifie_name,body from mysql.proc where specific_name="名稱";
刪除存儲過程
drop procedure if exists 名稱
存儲函數
首先查看是否已經開啟了創建函數的功能
show variables like "%fun%";
如果值為off,那么需要開啟
set global log_bin_trust_function_creators=1;
創建函數的語法
create function 函數名稱(變量1,變量2)
returns 數據類型
begin
執行的程序的代碼
return 數據;
end;
求兩個數的和
可以通過show create function 函數名稱 可以看見創建的代碼。
可以通過drop function if exists 函數名稱;
下面的這個函數可以判斷用戶輸入用戶名稱和密碼是否登錄成功。
存儲函數和存儲過程的區別
我們的存儲函數必須要有返回值。
總結
以上是生活随笔為你收集整理的mysql 进阶到高级_mysql的高级进阶(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 递归查出子级_Mysql选择
- 下一篇: mysql ddl脚本_MySQL学习之