變量
系統變量
變量由系統提供,不是用戶自定義的,屬于服務器層面
全局變量
會話變量
# 如果是全局級別,則需要加global,如果是會話級別,則需要加session,如果不寫,則默認是會話
# 查看全局變量
SHOW GLOBAL VARIABLES;
SHOW GLOBAL VARIABLESLIKE "%char%";
# 查看會話變量
SHOW SESSION VARIABLES; # 默認是會話變量
SHOW SESSION VARIABLESLIKE "%char%";
# 查看指定的某個系統變量的值SELECT @@系統變量名; # 默認查看的是會話變量SELECT @@GLOBAL.系統變量名;
# 為系統變量賦值SET global|[session] 系統變量名=值; # 默認是會話變量SET @@global|[session].系統變量名=值; # 默認是會話變量
自定義變量
用戶自定義的變量
用戶變量:針對于當前會話連接有效,同于會話變量的作用域
# 申明并初始化SET @用戶變量名=值;SET @用戶變量名:=值;SELECT @用戶變量名:=值;
# 賦值或更新用戶變量的值SET @用戶變量名=值;SET @用戶變量名:=值;SELECT @用戶變量名:=值;SELECT 字段 INTO 變量名 FROM表SELECT COUNT(*) INTO @count1 FROMstudent;
# 查看用戶變量名SELECT @用戶變量名;
局部變量:僅僅在begin end中有效,應用在begin end的第一句話
# 聲明DECLARE變量名 類型;DECLARE 變量名 類型 DEFAULT值;
# 賦值SET 局部變量名=值SET 局部變量名:=值SELECT @局部變量名:=值SELECT 字段 INTO @局部變量名 FROM表;
#查看SELECT 局部變量名
局部變量和用戶變量
用戶變量:? 當前會話? ? ? ? ? ? ? ?會話的任何地方定義和使用 ? ? ? ? ? ? ? ? 必須加@符號,不用限定類型
局部變量:? BEGIN? END中? ? ?只能在BEGIN END中,且為第一句話? ? ? ?一般不加@符號,需要限定類型
存儲過程
介紹
一組預先編譯好的SQL語句的集合,理解成批處理語句
提高代碼的重用性
簡化操作
減少了編譯次數,并且減少了和數據庫服務器的連接次數,提高了效率
創建
CREATE PROCEDURE存儲過程名(參數列表)BEGIN存儲過程體(一組合法的SQL語句)END
注意:
參數列表包含三個部分 參數模式? 參數名? 參數類型
如果存儲過程體僅僅只有一條語句,BEGIN END可以省略
存儲過程體中的每條SQL語句的結尾必須要加分號
存儲過程的結尾可以使用DELIMITER重新設置
參數模式:
IN: 該參數可以作為輸入,也就是該參數需要調用方法傳入值
OUT: 該參數可以作為輸出,也就是該參數可以作為返回值
INOUT: 既可以作為輸入也可以作為輸出,既要傳入值,也可以返回值
調用
CALL 存儲過程名(實參列表);
案例
/*1. 空參列表
案例1: 插入到admin表中五條記錄
DELIMITER $
CREATE PROCEDURE myp1()
BEGIN
INSERT INTO admin(name, `password`)
VALUES('jhon1', "000"),('jhon2',"001");
END $
CALL myp1()$
SELECT * FROM admin$
2. IN模式參數, 默認是IN
案例: 創建存儲過程實現 根據girl name 查詢對應的boy信息
CREATE PROCEDURE myp2(IN g_name VARCHAR(20) )
BEGIN
SELECT b.* FROM boys b RIGHT JOIN girls g ON b.id=g.boy_id WHERE g.name=g_name;
END $
CALL myp2('Mary')$
案例: 創建存儲過程實現,用戶是否登入成功
CREATE PROCEDURE myp3(IN name VARCHAR(20), in PASSWORD VARCHAR(20))
BEGIN
DECLARE res INT DEFAULT '';
select count(*) into res from admin where admin.name=name and admin.password=PASSWORD;
SELECT IF(res>0,'successfule','failed');
END $
CALL myp3('root','123')$
3. OUT模式的存儲過程
案例: 根據girl name ,返回boy name
CREATE PROCEDURE myp5(IN girl_nam VARCHAR(20), OUT boy_name VARCHAR(20), OUT age INT)
BEGIN
SELECT b.name,b.age INTO boy_name,age FROM boys b INNER JOIN girls g ON b.id=g.boy_id WHERE g.name=girl_name;
END $
CALL myp5('Mary', @bname, @age)$
SELECT @banme,@age$
4. INOUT 模式參數
案例: 傳入a和b兩個值。最終a和b都翻倍并返回
CREATE PROCEDURE myp6(INOUT a INT, INOUT b INT)
BEGIN
SET a=a*2;
SET b=b*2;
END $
SET @a=20$
SET @b=20$
CALL myp6(@a,@b)$
SELECT @a,@b$
*
刪除存儲過程
DROP PROCEDURE 存儲過程名
查看存儲過程
SHOW CREATE PROCEDURE 存儲過程名
函數
介紹
一組預先編譯好的SQL語句的集合,理解成批處理語句
提高代碼的重用性
簡化操作
減少了編譯次數,并且減少了和數據庫服務器的連接次數,提高了效率
對比存儲
存儲過程: 可以有0或多個返回, 適合做批量插入、批量更新
函數? ? ? ?:? 有且僅有一個返回,適合做處理數據后返回一個結果
創建
CREATE FUNCTION函數名(參數列表) RETURNS返回類型BEGIN函數體END
注意:
參數列表包含兩部分: 參數名? 參數類型
函數體必須有return語句:? return 值
函數體僅有一句話時,可以省略begin end
使用delimiter語句設置結束標記
調用
SELECT 函數名(參數列表)
案例
/*1. 無參數返回
案例: 返回員工個數
DELIMITER $
CREATE FUNCTION myf1 RETURNS INT
BEGIN
DECLARE c INT DEFAULT 0;
SELECT COUNT(*) INTO c FROM employees;
RETURN c;
END $
SELECT myf1()$
2. 有參數返回
案例: 根據員工名,返回他的工資
CREATE FUNCTION(name VARCHAR(20)) RETURNS DOUBLE
BEGIN
SET @sal=0;
SELECT salary INTO @sal FROM employees e WHERE e.name =name;
RETURN @sal;
END
SELECT myf2('jhon')$*/
查看函數
SHOW CREATE FUNCTION 函數名
刪除函數
DROP FUNCTION 函數名;