SQL編程基礎
A.編程環境:
即存儲過程、觸發器和函數中進行SQL編程,所以有些語法並不能應用於普通的SQL應用場景,如命令行直接SQL查詢。
B.變量聲明:
(1)全局變量
聲明:set @變量名 = 值;
讀取:select @變量名
賦值:
- set @變量名=表達式;
- select @變量名:=表達式;-- 會輸出結果集
- select 表達式 into @變量名;–不輸出結果集
(2)普通變量
聲明:declare 變量名 類型 [default 默認值];
讀取、賦值:同上
C.語句塊
[lable_name:] BEGIN
// 代碼
END [lable_name]
D.邏輯語句
MySQL支持兩種判斷,第一個是if判斷,第二個 case判斷
if語法
單分支
if 條件 then
//代碼
end if;
雙分支
if 條件 then
代碼1
else
代碼2
end if;
多分支
if 條件 then
代碼1
elseif 條件 then
代碼2
else
代碼3
end if;
E.case語句
語法1:簡單case函數
case sex
when '1' then '男'
when '2' then '女’
else '其他' end
語法2:case搜索函數
case when sex = '1' then '男'
when sex = '2' then '女'
else '其他' end
F.循環語句
1.loop
語法:
lable_name:loop
...
leave lable_name --退出循環
...
end loop;
2.REPEAT
語法:
[lable_name:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [lable_name]
實例:
delimiter //
CREATE PROCEDURE ps_repeat ( p1 INT ) BEGIN
SET @x = 0;
REPEAT
SET @x = @x + 1;
UNTIL @x > p1
END REPEAT;
END //
3.while
語法:
while 條件 do
//代碼
end while;
實例:
delimiter //
CREATE PROCEDURE ps_while(p1 INT)
BEGIN
WHILE p1 > 0 DO
SET p1 = p1 - 1;
END WHILE;
END//
4.遊標
語法:
1.定義遊標:declare 遊標名 cursor for select語句;
2.打開遊標:open 遊標名;
3.獲取結果:fetch 遊標名 into 變量名[,變量名];
4.關閉遊標:close 遊標名;
實例:
delimiter //
create procedure p3()
begin
declare value1 int;
declare value2 int;
-- 聲明遊標
declare mc cursor for select id,name from old_tab;
-- 打開遊標
open mc;
-- 獲取結果
fetch mc into value1,value2;
-- 這裏是爲了顯示獲取結果
select value1,value2;
-- 關閉遊標
close mc;
end//
call p3
G.存儲過程
存儲過程(Stored Procedure)是一組爲了完成特定功能的SQL 語句集。存儲在數據庫中,經過第一次編譯後再次調用不需要再次編譯。可設定只有某些用戶才具有對指定存儲過程的使用權,這展現了其安全性。
(1)查看現有的存儲過程。
語法:
SHOW PROCEDURE STATUS [ LIKE ' pattern ' ] ;
實例:
show procedure status from mysql like '%p1%'
(2)創建存儲過程
語法:
注意:delimiter是聲明定界符,用以區分sql語句(;)和存儲過程(//)結尾定界符
參數說明:參數分爲 in 輸入函數(默認) out輸出函數 inout輸入輸出函數
delimiter //
CREATE PROCEDURE ps_name (參數1,參數2,參數3,...)
BEGIN
sql代碼
END//
實例:
delimiter //
CREATE PROCEDURE ps_while(p1 INT)
BEGIN
WHILE p1 > 0 DO
SET p1 = p1 - 1;
END WHILE;
END//
存儲過程的參數分爲輸入參數(in)、輸出參數(out)、輸入輸出參數(inout),默認是輸入參數。如果存儲過程中就一條語句,begin和end是可以省略的。
說明:
-
存儲過程中,可有各種編程元素:變量,流程控制,函數調用;
-
還可以有:增刪改查等各種mysql語句;
-
其中select(或show,或desc)會作爲存儲過程執行後的"結果集"返回;
-
形參可以設定數據的"進出方向":
(3)調用存儲過程
語法:call 存儲過程()
(4)刪除存儲過程
語法:drop procedure [if exists] 存儲過程名
(5)存儲過程典型案例
1.各種類型輸入輸出參數
實例:
結過說明:除了in,傳入的參數@a沒有改變以外,out和inout都改變了傳入的參數@b,@c
2.簡單查詢
實例:
3.插入數據
實例:
delimiter //
drop procedure if exists insert1;
create procedure insert1()
begin
DECLARE i int;
set i = 0;
WHILE i<100 do
insert into tab1(id,username) values(i,CONCAT('username',i));
set i = i+1;
end while;
end//
4.遊標遍歷插入
實例:
tip: declare continue handler for not found set flag = 1;
delimiter //
create procedure p3()
begin
declare value1 int;
declare value2 int;
declare value3 varchar(32);
declare flag int default 0;
-- 聲明遊標
declare mc cursor for select * from old_tab;
declare continue handler for not found set flag = 1;
-- 打開遊標
open mc;
l1:loop
fetch mc into value1,value2,value3;
if flag=1 then
leave l1;
end if;
insert into new_tab values(value2,value3,value1);
-- 這裏是爲了顯示獲取結果
-- 關閉遊標
end loop;
close mc;
end//
call p3
5.綜合實例:變量,select into 變量賦值,遊標,循環
實例:
delimiter //
create procedure selecttab1()
begin
DECLARE i int;
declare username VARCHAR(255);
-- 定義遊標
declare selecttab1_cursor CURSOR for select id, username from tab1 ;
-- 打開遊標
open selecttab1_cursor;
-- 首次填充數據到變量
FETCH next from selecttab1_cursor into i,username;
-- 循環遊標
read_loop: LOOP
select i,username;
-- 再次填充數據到變量
FETCH next from selecttab1_cursor into i,username;
END LOOP;
-- 關閉遊標
close selecttab1_cursor;
end//
6.存儲過程動態執行sql
delimiter //
create procedure dongtaisql()
begin
declare v_sql varchar(500); -- 需要執行的SQL語句
DECLARE i int;
set i = 0;
WHILE i<10 do
set v_sql= concat('insert into tab2(id,username) values(',i,', \'username',i,'\');');
set @v_sql=v_sql; -- 注意很重要,將連成的字符串賦值給一個變量(可以之前沒有定義,但要以@開頭)
prepare stmt from @v_sql; -- 預處理需要執行的動態SQL,其中stmt是一個變量
EXECUTE stmt; -- 執行SQL語句
deallocate prepare stmt; -- 釋放掉預處理段
set i = i+1;
end while;
end//
H.函數
(1)創建函數
語法:
create function 函數名(參數,參數的類型) returns 返回值類型
begin
//代碼
end
實例:
create function fun1() returns int
begin
declare c int;
select id from old_tab into c;
return c;
end;
(2)mysql內置函數
參考:mysql函數參考手冊
I觸發器
(1)簡介
-
觸發器是一個特殊的存儲過程,它是MySQL在insert、update、delete的時候自動執行的代碼塊。
-
觸發器必須定義在特定的表上。
-
自動執行,不能直接調用,
-
作用:監視某種情況並觸發某種操作。
(2)觸發器四要素
(4)創建觸發器
語法:
create trigger trigger_name
after/before insert /update/delete on 表名
for each row
begin
// 代碼
end
實例:
delimiter //
CREATE TRIGGER tr_new_tab_insert
after insert on new_tab
for Each row
begin
insert into old(id,name,valid) values(new.id,new.name,new.valid);
end //
提示:new.字段名 可以訪問新值,old.字段名可以訪問舊值。
(5)查看觸發器
語法: show triggers
(6)刪除觸發器
語法:drop trigger trigger_name